@@ -267,6 +267,50 @@ int ccm_test(void)
267267 }
268268 }
269269
270+ /* invalid nonce lengths and nonce/L combinations must be rejected not silently adjusted */
271+ {
272+ unsigned char key [16 ] = { 0 };
273+ unsigned char nonce [16 ] = { 0 };
274+ unsigned char pt [16 ] = { 0 };
275+ unsigned char ct [16 ];
276+
277+ /* CCM nonce is 7..13 bytes */
278+ taglen = 8 ;
279+ if (ccm_memory (idx , key , sizeof (key ), NULL , nonce , 6 , NULL , 0 , pt , sizeof (pt ), ct , tag , & taglen , CCM_ENCRYPT ) != CRYPT_INVALID_ARG ) {
280+ return CRYPT_FAIL_TESTVECTOR ;
281+ }
282+ taglen = 8 ;
283+ if (ccm_memory (idx , key , sizeof (key ), NULL , nonce , 14 , NULL , 0 , pt , sizeof (pt ), ct , tag , & taglen , CCM_ENCRYPT ) != CRYPT_INVALID_ARG ) {
284+ return CRYPT_FAIL_TESTVECTOR ;
285+ }
286+ if ((err = ccm_init (& ccm , idx , key , sizeof (key ), sizeof (pt ), 8 , 0 )) != CRYPT_OK ) {
287+ return err ;
288+ }
289+ if (ccm_add_nonce (& ccm , nonce , 6 ) != CRYPT_INVALID_ARG ) {
290+ return CRYPT_FAIL_TESTVECTOR ;
291+ }
292+ if ((err = ccm_init (& ccm , idx , key , sizeof (key ), sizeof (pt ), 8 , 0 )) != CRYPT_OK ) {
293+ return err ;
294+ }
295+ if (ccm_add_nonce (& ccm , nonce , 14 ) != CRYPT_INVALID_ARG ) {
296+ return CRYPT_FAIL_TESTVECTOR ;
297+ }
298+ /* ptlen >= 2^16 forces L=3, so a 13-byte nonce no longer fits B_0 (13+3 > 15) */
299+ if ((err = ccm_init (& ccm , idx , key , sizeof (key ), 65536 , 8 , 0 )) != CRYPT_OK ) {
300+ return err ;
301+ }
302+ if (ccm_add_nonce (& ccm , nonce , 13 ) != CRYPT_INVALID_ARG ) {
303+ return CRYPT_FAIL_TESTVECTOR ;
304+ }
305+ /* 12-byte nonce still fits (12+3 == 15) */
306+ if ((err = ccm_init (& ccm , idx , key , sizeof (key ), 65536 , 8 , 0 )) != CRYPT_OK ) {
307+ return err ;
308+ }
309+ if ((err = ccm_add_nonce (& ccm , nonce , 12 )) != CRYPT_OK ) {
310+ return err ;
311+ }
312+ }
313+
270314 return CRYPT_OK ;
271315#endif
272316}
0 commit comments