|
8 | 8 |
|
9 | 9 | from test.support import hashlib_helper |
10 | 10 |
|
| 11 | +from _operator import _compare_digest as operator_compare_digest |
| 12 | + |
11 | 13 | try: |
12 | 14 | from _hashlib import HMAC as C_HMAC |
13 | 15 | from _hashlib import hmac_new as c_hmac_new |
| 16 | + from _hashlib import compare_digest as openssl_compare_digest |
14 | 17 | except ImportError: |
15 | 18 | C_HMAC = None |
16 | 19 | c_hmac_new = None |
| 20 | + openssl_compare_digest = None |
17 | 21 |
|
18 | 22 |
|
19 | 23 | def ignore_warning(func): |
@@ -505,110 +509,124 @@ def test_equality_new(self): |
505 | 509 |
|
506 | 510 | class CompareDigestTestCase(unittest.TestCase): |
507 | 511 |
|
508 | | - def test_compare_digest(self): |
| 512 | + def test_hmac_compare_digest(self): |
| 513 | + self._test_compare_digest(hmac.compare_digest) |
| 514 | + if openssl_compare_digest is not None: |
| 515 | + self.assertIs(hmac.compare_digest, openssl_compare_digest) |
| 516 | + else: |
| 517 | + self.assertIs(hmac.compare_digest, operator_compare_digest) |
| 518 | + |
| 519 | + def test_operator_compare_digest(self): |
| 520 | + self._test_compare_digest(operator_compare_digest) |
| 521 | + |
| 522 | + @unittest.skipIf(openssl_compare_digest is None, "test requires _hashlib") |
| 523 | + def test_openssl_compare_digest(self): |
| 524 | + self._test_compare_digest(openssl_compare_digest) |
| 525 | + |
| 526 | + def _test_compare_digest(self, compare_digest): |
509 | 527 | # Testing input type exception handling |
510 | 528 | a, b = 100, 200 |
511 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 529 | + self.assertRaises(TypeError, compare_digest, a, b) |
512 | 530 | a, b = 100, b"foobar" |
513 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 531 | + self.assertRaises(TypeError, compare_digest, a, b) |
514 | 532 | a, b = b"foobar", 200 |
515 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 533 | + self.assertRaises(TypeError, compare_digest, a, b) |
516 | 534 | a, b = "foobar", b"foobar" |
517 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 535 | + self.assertRaises(TypeError, compare_digest, a, b) |
518 | 536 | a, b = b"foobar", "foobar" |
519 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 537 | + self.assertRaises(TypeError, compare_digest, a, b) |
520 | 538 |
|
521 | 539 | # Testing bytes of different lengths |
522 | 540 | a, b = b"foobar", b"foo" |
523 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 541 | + self.assertFalse(compare_digest(a, b)) |
524 | 542 | a, b = b"\xde\xad\xbe\xef", b"\xde\xad" |
525 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 543 | + self.assertFalse(compare_digest(a, b)) |
526 | 544 |
|
527 | 545 | # Testing bytes of same lengths, different values |
528 | 546 | a, b = b"foobar", b"foobaz" |
529 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 547 | + self.assertFalse(compare_digest(a, b)) |
530 | 548 | a, b = b"\xde\xad\xbe\xef", b"\xab\xad\x1d\xea" |
531 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 549 | + self.assertFalse(compare_digest(a, b)) |
532 | 550 |
|
533 | 551 | # Testing bytes of same lengths, same values |
534 | 552 | a, b = b"foobar", b"foobar" |
535 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 553 | + self.assertTrue(compare_digest(a, b)) |
536 | 554 | a, b = b"\xde\xad\xbe\xef", b"\xde\xad\xbe\xef" |
537 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 555 | + self.assertTrue(compare_digest(a, b)) |
538 | 556 |
|
539 | 557 | # Testing bytearrays of same lengths, same values |
540 | 558 | a, b = bytearray(b"foobar"), bytearray(b"foobar") |
541 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 559 | + self.assertTrue(compare_digest(a, b)) |
542 | 560 |
|
543 | 561 | # Testing bytearrays of different lengths |
544 | 562 | a, b = bytearray(b"foobar"), bytearray(b"foo") |
545 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 563 | + self.assertFalse(compare_digest(a, b)) |
546 | 564 |
|
547 | 565 | # Testing bytearrays of same lengths, different values |
548 | 566 | a, b = bytearray(b"foobar"), bytearray(b"foobaz") |
549 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 567 | + self.assertFalse(compare_digest(a, b)) |
550 | 568 |
|
551 | 569 | # Testing byte and bytearray of same lengths, same values |
552 | 570 | a, b = bytearray(b"foobar"), b"foobar" |
553 | | - self.assertTrue(hmac.compare_digest(a, b)) |
554 | | - self.assertTrue(hmac.compare_digest(b, a)) |
| 571 | + self.assertTrue(compare_digest(a, b)) |
| 572 | + self.assertTrue(compare_digest(b, a)) |
555 | 573 |
|
556 | 574 | # Testing byte bytearray of different lengths |
557 | 575 | a, b = bytearray(b"foobar"), b"foo" |
558 | | - self.assertFalse(hmac.compare_digest(a, b)) |
559 | | - self.assertFalse(hmac.compare_digest(b, a)) |
| 576 | + self.assertFalse(compare_digest(a, b)) |
| 577 | + self.assertFalse(compare_digest(b, a)) |
560 | 578 |
|
561 | 579 | # Testing byte and bytearray of same lengths, different values |
562 | 580 | a, b = bytearray(b"foobar"), b"foobaz" |
563 | | - self.assertFalse(hmac.compare_digest(a, b)) |
564 | | - self.assertFalse(hmac.compare_digest(b, a)) |
| 581 | + self.assertFalse(compare_digest(a, b)) |
| 582 | + self.assertFalse(compare_digest(b, a)) |
565 | 583 |
|
566 | 584 | # Testing str of same lengths |
567 | 585 | a, b = "foobar", "foobar" |
568 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 586 | + self.assertTrue(compare_digest(a, b)) |
569 | 587 |
|
570 | 588 | # Testing str of different lengths |
571 | 589 | a, b = "foo", "foobar" |
572 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 590 | + self.assertFalse(compare_digest(a, b)) |
573 | 591 |
|
574 | 592 | # Testing bytes of same lengths, different values |
575 | 593 | a, b = "foobar", "foobaz" |
576 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 594 | + self.assertFalse(compare_digest(a, b)) |
577 | 595 |
|
578 | 596 | # Testing error cases |
579 | 597 | a, b = "foobar", b"foobar" |
580 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 598 | + self.assertRaises(TypeError, compare_digest, a, b) |
581 | 599 | a, b = b"foobar", "foobar" |
582 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 600 | + self.assertRaises(TypeError, compare_digest, a, b) |
583 | 601 | a, b = b"foobar", 1 |
584 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 602 | + self.assertRaises(TypeError, compare_digest, a, b) |
585 | 603 | a, b = 100, 200 |
586 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 604 | + self.assertRaises(TypeError, compare_digest, a, b) |
587 | 605 | a, b = "fooä", "fooä" |
588 | | - self.assertRaises(TypeError, hmac.compare_digest, a, b) |
| 606 | + self.assertRaises(TypeError, compare_digest, a, b) |
589 | 607 |
|
590 | 608 | # subclasses are supported by ignore __eq__ |
591 | 609 | class mystr(str): |
592 | 610 | def __eq__(self, other): |
593 | 611 | return False |
594 | 612 |
|
595 | 613 | a, b = mystr("foobar"), mystr("foobar") |
596 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 614 | + self.assertTrue(compare_digest(a, b)) |
597 | 615 | a, b = mystr("foobar"), "foobar" |
598 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 616 | + self.assertTrue(compare_digest(a, b)) |
599 | 617 | a, b = mystr("foobar"), mystr("foobaz") |
600 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 618 | + self.assertFalse(compare_digest(a, b)) |
601 | 619 |
|
602 | 620 | class mybytes(bytes): |
603 | 621 | def __eq__(self, other): |
604 | 622 | return False |
605 | 623 |
|
606 | 624 | a, b = mybytes(b"foobar"), mybytes(b"foobar") |
607 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 625 | + self.assertTrue(compare_digest(a, b)) |
608 | 626 | a, b = mybytes(b"foobar"), b"foobar" |
609 | | - self.assertTrue(hmac.compare_digest(a, b)) |
| 627 | + self.assertTrue(compare_digest(a, b)) |
610 | 628 | a, b = mybytes(b"foobar"), mybytes(b"foobaz") |
611 | | - self.assertFalse(hmac.compare_digest(a, b)) |
| 629 | + self.assertFalse(compare_digest(a, b)) |
612 | 630 |
|
613 | 631 |
|
614 | 632 | if __name__ == "__main__": |
|
0 commit comments