@@ -341,12 +341,15 @@ class HashFunctionsTrait:
341
341
ALGORITHMS = [
342
342
'md5' , 'sha1' ,
343
343
'sha224' , 'sha256' , 'sha384' , 'sha512' ,
344
+ 'sha3_224' , 'sha3_256' , 'sha3_384' , 'sha3_512' ,
344
345
]
345
346
346
347
# By default, a missing algorithm skips the test that uses it.
347
- md5 = sha1 = sha224 = sha256 = sha384 = sha512 = property (
348
- lambda self : self .skipTest ("missing hash function" )
349
- )
348
+ _ = property (lambda self : self .skipTest ("missing hash function" ))
349
+ md5 = sha1 = _
350
+ sha224 = sha256 = sha384 = sha512 = _
351
+ sha3_224 = sha3_256 = sha3_384 = sha3_512 = _
352
+ del _
350
353
351
354
352
355
class WithOpenSSLHashFunctions (HashFunctionsTrait ):
@@ -375,16 +378,23 @@ def setUpClass(cls):
375
378
setattr (cls , name , name )
376
379
377
380
378
- class RFCTestCaseMixin (HashFunctionsTrait ):
379
- """Test HMAC implementations against test vectors from the RFC."""
381
+ class RFCTestCaseMixin (AssertersMixin , HashFunctionsTrait ):
382
+ """Test HMAC implementations against RFC 2202/4231 and NIST test vectors.
380
383
381
- def test_md5 (self ):
384
+ - Test vectors for MD5 and SHA-1 are taken from RFC 2202.
385
+ - Test vectors for SHA-2 are taken from RFC 4231.
386
+ - Test vectors for SHA-3 are NIST's test vectors [1].
387
+
388
+ [1] https://csrc.nist.gov/projects/message-authentication-codes
389
+ """
390
+
391
+ def test_md5_rfc2202 (self ):
382
392
def md5test (key , msg , hexdigest ):
383
393
self .assert_hmac (key , msg , hexdigest , self .md5 , "md5" , 16 , 64 )
384
394
385
395
md5test (b"\x0b " * 16 ,
386
396
b"Hi There" ,
387
- "9294727A3638BB1C13F48EF8158BFC9D " )
397
+ "9294727a3638bb1c13f48ef8158bfc9d " )
388
398
389
399
md5test (b"Jefe" ,
390
400
b"what do ya want for nothing?" ,
@@ -411,7 +421,7 @@ def md5test(key, msg, hexdigest):
411
421
b"and Larger Than One Block-Size Data" ),
412
422
"6f630fad67cda0ee1fb1f562db3aa53e" )
413
423
414
- def test_sha1 (self ):
424
+ def test_sha1_rfc2202 (self ):
415
425
def shatest (key , msg , hexdigest ):
416
426
self .assert_hmac (key , msg , hexdigest , self .sha1 , "sha1" , 20 , 64 )
417
427
@@ -457,11 +467,11 @@ def test_sha2_512_rfc4231(self):
457
467
self ._test_sha2_rfc4231 (self .sha512 , 'sha512' , 64 , 128 )
458
468
459
469
def _test_sha2_rfc4231 (self , hashfunc , hashname , digest_size , block_size ):
460
- def hmactest (key , data , hexdigests ):
470
+ def hmactest (key , msg , hexdigests ):
461
471
hexdigest = hexdigests [hashname ]
462
472
463
473
self .assert_hmac (
464
- key , data , hexdigest ,
474
+ key , msg , hexdigest ,
465
475
hashfunc = hashfunc ,
466
476
hashname = hashname ,
467
477
digest_size = digest_size ,
@@ -470,7 +480,7 @@ def hmactest(key, data, hexdigests):
470
480
471
481
# 4.2. Test Case 1
472
482
hmactest (key = b'\x0b ' * 20 ,
473
- data = b'Hi There' ,
483
+ msg = b'Hi There' ,
474
484
hexdigests = {
475
485
'sha224' : '896fb1128abbdf196832107cd49df33f'
476
486
'47b4b1169912ba4f53684b22' ,
@@ -487,7 +497,7 @@ def hmactest(key, data, hexdigests):
487
497
488
498
# 4.3. Test Case 2
489
499
hmactest (key = b'Jefe' ,
490
- data = b'what do ya want for nothing?' ,
500
+ msg = b'what do ya want for nothing?' ,
491
501
hexdigests = {
492
502
'sha224' : 'a30e01098bc6dbbf45690f3a7e9e6d0f'
493
503
'8bbea2a39e6148008fd05e44' ,
@@ -504,7 +514,7 @@ def hmactest(key, data, hexdigests):
504
514
505
515
# 4.4. Test Case 3
506
516
hmactest (key = b'\xaa ' * 20 ,
507
- data = b'\xdd ' * 50 ,
517
+ msg = b'\xdd ' * 50 ,
508
518
hexdigests = {
509
519
'sha224' : '7fb3cb3588c6c1f6ffa9694d7d6ad264'
510
520
'9365b0c1f65d69d1ec8333ea' ,
@@ -521,7 +531,7 @@ def hmactest(key, data, hexdigests):
521
531
522
532
# 4.5. Test Case 4
523
533
hmactest (key = bytes (x for x in range (0x01 , 0x19 + 1 )),
524
- data = b'\xcd ' * 50 ,
534
+ msg = b'\xcd ' * 50 ,
525
535
hexdigests = {
526
536
'sha224' : '6c11506874013cac6a2abc1bb382627c'
527
537
'ec6a90d86efc012de7afec5a' ,
@@ -538,8 +548,8 @@ def hmactest(key, data, hexdigests):
538
548
539
549
# 4.7. Test Case 6
540
550
hmactest (key = b'\xaa ' * 131 ,
541
- data = b'Test Using Larger Than Block-Siz'
542
- b'e Key - Hash Key First' ,
551
+ msg = b'Test Using Larger Than Block-Siz'
552
+ b'e Key - Hash Key First' ,
543
553
hexdigests = {
544
554
'sha224' : '95e9a0db962095adaebe9b2d6f0dbce2'
545
555
'd499f112f2d2b7273fa6870e' ,
@@ -556,11 +566,11 @@ def hmactest(key, data, hexdigests):
556
566
557
567
# 4.8. Test Case 7
558
568
hmactest (key = b'\xaa ' * 131 ,
559
- data = b'This is a test using a larger th'
560
- b'an block-size key and a larger t'
561
- b'han block-size data. The key nee'
562
- b'ds to be hashed before being use'
563
- b'd by the HMAC algorithm.' ,
569
+ msg = b'This is a test using a larger th'
570
+ b'an block-size key and a larger t'
571
+ b'han block-size data. The key nee'
572
+ b'ds to be hashed before being use'
573
+ b'd by the HMAC algorithm.' ,
564
574
hexdigests = {
565
575
'sha224' : '3a854166ac5d9f023f54d517d0b39dbd'
566
576
'946770db9c2b95c9f6f565d1' ,
@@ -575,6 +585,112 @@ def hmactest(key, data, hexdigests):
575
585
'134676fb6de0446065c97440fa8c6a58' ,
576
586
})
577
587
588
+ def test_sha3_224_nist (self ):
589
+ for key , msg , hexdigest in [
590
+ (
591
+ bytes (range (28 )),
592
+ b'Sample message for keylen<blocklen' ,
593
+ '332cfd59347fdb8e576e77260be4aba2d6dc53117b3bfb52c6d18c04'
594
+ ), (
595
+ bytes (range (144 )),
596
+ b'Sample message for keylen=blocklen' ,
597
+ 'd8b733bcf66c644a12323d564e24dcf3fc75f231f3b67968359100c7'
598
+ ), (
599
+ bytes (range (172 )),
600
+ b'Sample message for keylen>blocklen' ,
601
+ '078695eecc227c636ad31d063a15dd05a7e819a66ec6d8de1e193e59'
602
+ )
603
+ ]:
604
+ self .assert_hmac (
605
+ key , msg , hexdigest ,
606
+ hashfunc = self .sha3_224 , hashname = 'sha3_224' ,
607
+ digest_size = 28 , block_size = 144
608
+ )
609
+
610
+ def test_sha3_256_nist (self ):
611
+ for key , msg , hexdigest in [
612
+ (
613
+ bytes (range (32 )),
614
+ b'Sample message for keylen<blocklen' ,
615
+ '4fe8e202c4f058e8dddc23d8c34e4673'
616
+ '43e23555e24fc2f025d598f558f67205'
617
+ ), (
618
+ bytes (range (136 )),
619
+ b'Sample message for keylen=blocklen' ,
620
+ '68b94e2e538a9be4103bebb5aa016d47'
621
+ '961d4d1aa906061313b557f8af2c3faa'
622
+ ), (
623
+ bytes (range (168 )),
624
+ b'Sample message for keylen>blocklen' ,
625
+ '9bcf2c238e235c3ce88404e813bd2f3a'
626
+ '97185ac6f238c63d6229a00b07974258'
627
+ )
628
+ ]:
629
+ self .assert_hmac (
630
+ key , msg , hexdigest ,
631
+ hashfunc = self .sha3_256 , hashname = 'sha3_256' ,
632
+ digest_size = 32 , block_size = 136
633
+ )
634
+
635
+ def test_sha3_384_nist (self ):
636
+ for key , msg , hexdigest in [
637
+ (
638
+ bytes (range (48 )),
639
+ b'Sample message for keylen<blocklen' ,
640
+ 'd588a3c51f3f2d906e8298c1199aa8ff'
641
+ '6296218127f6b38a90b6afe2c5617725'
642
+ 'bc99987f79b22a557b6520db710b7f42'
643
+ ), (
644
+ bytes (range (104 )),
645
+ b'Sample message for keylen=blocklen' ,
646
+ 'a27d24b592e8c8cbf6d4ce6fc5bf62d8'
647
+ 'fc98bf2d486640d9eb8099e24047837f'
648
+ '5f3bffbe92dcce90b4ed5b1e7e44fa90'
649
+ ), (
650
+ bytes (range (152 )),
651
+ b'Sample message for keylen>blocklen' ,
652
+ 'e5ae4c739f455279368ebf36d4f5354c'
653
+ '95aa184c899d3870e460ebc288ef1f94'
654
+ '70053f73f7c6da2a71bcaec38ce7d6ac'
655
+ )
656
+ ]:
657
+ self .assert_hmac (
658
+ key , msg , hexdigest ,
659
+ hashfunc = self .sha3_384 , hashname = 'sha3_384' ,
660
+ digest_size = 48 , block_size = 104
661
+ )
662
+
663
+ def test_sha3_512_nist (self ):
664
+ for key , msg , hexdigest in [
665
+ (
666
+ bytes (range (64 )),
667
+ b'Sample message for keylen<blocklen' ,
668
+ '4efd629d6c71bf86162658f29943b1c3'
669
+ '08ce27cdfa6db0d9c3ce81763f9cbce5'
670
+ 'f7ebe9868031db1a8f8eb7b6b95e5c5e'
671
+ '3f657a8996c86a2f6527e307f0213196'
672
+ ), (
673
+ bytes (range (72 )),
674
+ b'Sample message for keylen=blocklen' ,
675
+ '544e257ea2a3e5ea19a590e6a24b724c'
676
+ 'e6327757723fe2751b75bf007d80f6b3'
677
+ '60744bf1b7a88ea585f9765b47911976'
678
+ 'd3191cf83c039f5ffab0d29cc9d9b6da'
679
+ ), (
680
+ bytes (range (136 )),
681
+ b'Sample message for keylen>blocklen' ,
682
+ '5f464f5e5b7848e3885e49b2c385f069'
683
+ '4985d0e38966242dc4a5fe3fea4b37d4'
684
+ '6b65ceced5dcf59438dd840bab22269f'
685
+ '0ba7febdb9fcf74602a35666b2a32915'
686
+ )
687
+ ]:
688
+ self .assert_hmac (
689
+ key , msg , hexdigest ,
690
+ hashfunc = self .sha3_512 , hashname = 'sha3_512' ,
691
+ digest_size = 64 , block_size = 72
692
+ )
693
+
578
694
579
695
class PyRFCTestCase (ThroughObjectMixin , PyAssertersMixin ,
580
696
WithOpenSSLHashFunctions , RFCTestCaseMixin ,
0 commit comments