| 780 | }; |
| 781 | |
| 782 | bool ValidatePoly1305() |
| 783 | { |
| 784 | cout << "\nPoly1305 validation suite running...\n\n"; |
| 785 | bool fail, pass = true; |
| 786 | |
| 787 | { |
| 788 | fail = (Poly1305<AES>::StaticAlgorithmName() != "Poly1305(AES)"); |
| 789 | cout << (fail ? "FAILED " : "passed ") << "algorithm name\n"; |
| 790 | pass = pass && !fail; |
| 791 | } |
| 792 | |
| 793 | // Test data from http://cr.yp.to/mac/poly1305-20050329.pdf |
| 794 | static const Poly1305_TestTuples tests[] = |
| 795 | { |
| 796 | // Appendix B, Test 1 |
| 797 | { |
| 798 | "\xec\x07\x4c\x83\x55\x80\x74\x17\x01\x42\x5b\x62\x32\x35\xad\xd6" // Key |
| 799 | "\x85\x1f\xc4\x0c\x34\x67\xac\x0b\xe0\x5c\xc2\x04\x04\xf3\xf7\x00", |
| 800 | "\xf3\xf6", // Message |
| 801 | "\xfb\x44\x73\x50\xc4\xe8\x68\xc5\x2a\xc3\x27\x5c\xf9\xd4\x32\x7e", // Nonce |
| 802 | "\xf4\xc6\x33\xc3\x04\x4f\xc1\x45\xf8\x4f\x33\x5c\xb8\x19\x53\xde", // Digest |
| 803 | 32, 2, 16, 16 |
| 804 | }, |
| 805 | // Appendix B, Test 2 |
| 806 | { |
| 807 | "\x75\xde\xaa\x25\xc0\x9f\x20\x8e\x1d\xc4\xce\x6b\x5c\xad\x3f\xbf" // Key |
| 808 | "\x61\xee\x09\x21\x8d\x29\xb0\xaa\xed\x7e\x15\x4a\x2c\x55\x09\xcc", |
| 809 | "", // Message |
| 810 | "\x61\xee\x09\x21\x8d\x29\xb0\xaa\xed\x7e\x15\x4a\x2c\x55\x09\xcc", // Nonce |
| 811 | "\xdd\x3f\xab\x22\x51\xf1\x1a\xc7\x59\xf0\x88\x71\x29\xcc\x2e\xe7", // Digest |
| 812 | 32, 0, 16, 16 |
| 813 | }, |
| 814 | // Appendix B, Test 3 |
| 815 | { |
| 816 | "\x6a\xcb\x5f\x61\xa7\x17\x6d\xd3\x20\xc5\xc1\xeb\x2e\xdc\xdc\x74" // Key |
| 817 | "\x48\x44\x3d\x0b\xb0\xd2\x11\x09\xc8\x9a\x10\x0b\x5c\xe2\xc2\x08", |
| 818 | "\x66\x3c\xea\x19\x0f\xfb\x83\xd8\x95\x93\xf3\xf4\x76\xb6\xbc\x24" // Message |
| 819 | "\xd7\xe6\x79\x10\x7e\xa2\x6a\xdb\x8c\xaf\x66\x52\xd0\x65\x61\x36", |
| 820 | "\xae\x21\x2a\x55\x39\x97\x29\x59\x5d\xea\x45\x8b\xc6\x21\xff\x0e", // Nonce |
| 821 | "\x0e\xe1\xc1\x6b\xb7\x3f\x0f\x4f\xd1\x98\x81\x75\x3c\x01\xcd\xbe", // Digest |
| 822 | 32, 32, 16, 16 |
| 823 | }, |
| 824 | // Appendix B, Test 4 |
| 825 | { |
| 826 | "\xe1\xa5\x66\x8a\x4d\x5b\x66\xa5\xf6\x8c\xc5\x42\x4e\xd5\x98\x2d" // Key |
| 827 | "\x12\x97\x6a\x08\xc4\x42\x6d\x0c\xe8\xa8\x24\x07\xc4\xf4\x82\x07", |
| 828 | "\xab\x08\x12\x72\x4a\x7f\x1e\x34\x27\x42\xcb\xed\x37\x4d\x94\xd1" // Message |
| 829 | "\x36\xc6\xb8\x79\x5d\x45\xb3\x81\x98\x30\xf2\xc0\x44\x91\xfa\xf0" |
| 830 | "\x99\x0c\x62\xe4\x8b\x80\x18\xb2\xc3\xe4\xa0\xfa\x31\x34\xcb\x67" |
| 831 | "\xfa\x83\xe1\x58\xc9\x94\xd9\x61\xc4\xcb\x21\x09\x5c\x1b\xf9", |
| 832 | "\x9a\xe8\x31\xe7\x43\x97\x8d\x3a\x23\x52\x7c\x71\x28\x14\x9e\x3a", // Nonce |
| 833 | "\x51\x54\xad\x0d\x2c\xb2\x6e\x01\x27\x4f\xc5\x11\x48\x49\x1f\x1b", // Digest |
| 834 | 32, 63, 16, 16 |
| 835 | } |
| 836 | }; |
| 837 | |
| 838 | unsigned int count = 0; |
| 839 | byte digest[Poly1305<AES>::DIGESTSIZE]; |