@@ -77,10 +77,10 @@ int chacha20poly1305_test(void)
77
77
78
78
/* chacha20poly1305_memory - decrypt */
79
79
len = sizeof (dmac );
80
+ XMEMCPY (dmac , tag , sizeof (tag ));
80
81
if ((err = chacha20poly1305_memory (k , sizeof (k ), i12 , sizeof (i12 ), aad , sizeof (aad ),
81
82
ct , mlen , pt , dmac , & len , CHACHA20POLY1305_DECRYPT )) != CRYPT_OK ) return err ;
82
83
if (compare_testvector (pt , mlen , m , mlen , "DEC-PT2" , 3 ) != 0 ) return CRYPT_FAIL_TESTVECTOR ;
83
- if (compare_testvector (dmac , len , tag , sizeof (tag ), "DEC-TAG2" , 4 ) != 0 ) return CRYPT_FAIL_TESTVECTOR ;
84
84
85
85
/* encrypt - rfc7905 */
86
86
if ((err = chacha20poly1305_init (& st1 , k , sizeof (k ))) != CRYPT_OK ) return err ;
@@ -123,6 +123,41 @@ int chacha20poly1305_test(void)
123
123
if (compare_testvector (pt , mlen , m , mlen , "DEC-PT4" , 1 ) != 0 ) return CRYPT_FAIL_TESTVECTOR ;
124
124
if (compare_testvector (dmac , len , emac , len , "DEC-TAG4" , 2 ) != 0 ) return CRYPT_FAIL_TESTVECTOR ;
125
125
126
+ /* wycheproof failing test - https://github.com/libtom/libtomcrypt/pull/451 */
127
+ {
128
+ unsigned char key [] = { 0x00 ,0x11 ,0x22 ,0x33 ,0x44 ,0x55 ,0x66 ,0x77 ,0x88 ,0x99 ,0xaa ,0xbb ,0xcc ,0xdd ,0xee ,0xff ,
129
+ 0x00 ,0x11 ,0x22 ,0x33 ,0x44 ,0x55 ,0x66 ,0x77 ,0x88 ,0x99 ,0xaa ,0xbb ,0xcc ,0xdd ,0xee ,0xff };
130
+ unsigned char iv [] = { 0x00 ,0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0x06 ,0x07 ,0x08 ,0x09 ,0x0a ,0x0b };
131
+ unsigned char valid_tag [] = { 0xa3 ,0xe3 ,0xfd ,0xf9 ,0xfb ,0xa6 ,0x86 ,0x1b ,0x5a ,0xd2 ,0x60 ,0x7f ,0x40 ,0xb7 ,0xf4 ,0x47 };
132
+ unsigned char invalid_tag [] = { 0xa2 ,0xe3 ,0xfd ,0xf9 ,0xfb ,0xa6 ,0x86 ,0x1b ,0x5a ,0xd2 ,0x60 ,0x7f ,0x40 ,0xb7 ,0xf4 ,0x47 };
133
+ unsigned char waad [] = { 0x61 ,0x61 ,0x64 };
134
+ unsigned char wct [] = { 0x00 };
135
+ unsigned char wpt [20 ] = { 0 };
136
+ unsigned char wtag [20 ] = { 0 };
137
+ unsigned long taglen ;
138
+
139
+ /* encrypt */
140
+ taglen = sizeof (wtag );
141
+ err = chacha20poly1305_memory (key , sizeof (key ), iv , sizeof (iv ), waad , sizeof (waad ),
142
+ wpt , 0 , wct , wtag , & taglen , CHACHA20POLY1305_ENCRYPT );
143
+ if (err != CRYPT_OK ) return CRYPT_FAIL_TESTVECTOR ;
144
+ if (compare_testvector (wtag , taglen , valid_tag , sizeof (valid_tag ), "WYCH" , 1 ) != 0 ) return CRYPT_FAIL_TESTVECTOR ;
145
+
146
+ /* VALID tag */
147
+ taglen = sizeof (valid_tag );
148
+ err = chacha20poly1305_memory (key , sizeof (key ), iv , sizeof (iv ), waad , sizeof (waad ),
149
+ wpt , 0 , wct , valid_tag , & taglen , CHACHA20POLY1305_DECRYPT );
150
+ if (err != CRYPT_OK ) return CRYPT_FAIL_TESTVECTOR ;
151
+
152
+ /* INVALID tag */
153
+ taglen = sizeof (invalid_tag );
154
+ err = chacha20poly1305_memory (key , sizeof (key ), iv , sizeof (iv ), waad , sizeof (waad ),
155
+ wpt , 0 , wct , invalid_tag , & taglen , CHACHA20POLY1305_DECRYPT );
156
+ if (err == CRYPT_OK ) {
157
+ return CRYPT_FAIL_TESTVECTOR ; /* should fail */
158
+ }
159
+ }
160
+
126
161
return CRYPT_OK ;
127
162
#endif
128
163
}
0 commit comments