|
4 | 4 |
|
5 | 5 | #include <crypto/aes.h>
|
6 | 6 | #include <crypto/chacha20.h>
|
| 7 | +#include <crypto/chacha20poly1305.h> |
7 | 8 | #include <crypto/hkdf_sha256_32.h>
|
8 | 9 | #include <crypto/hmac_sha256.h>
|
9 | 10 | #include <crypto/hmac_sha512.h>
|
@@ -207,6 +208,24 @@ static void TestPoly1305(const std::string &hexmessage, const std::string &hexke
|
207 | 208 | }
|
208 | 209 | }
|
209 | 210 |
|
| 211 | +static void TestChaCha20Poly1305(const std::string& plain_hex, const std::string& aad_hex, const std::string& key_hex, ChaCha20::Nonce96 nonce, const std::string& cipher_hex) |
| 212 | +{ |
| 213 | + auto plain = ParseHex<std::byte>(plain_hex); |
| 214 | + auto aad = ParseHex<std::byte>(aad_hex); |
| 215 | + auto key = ParseHex<std::byte>(key_hex); |
| 216 | + auto expected_cipher = ParseHex<std::byte>(cipher_hex); |
| 217 | + |
| 218 | + std::vector<std::byte> cipher(plain.size() + AEADChaCha20Poly1305::EXPANSION); |
| 219 | + AEADChaCha20Poly1305 aead{key}; |
| 220 | + aead.Encrypt(plain, aad, nonce, cipher); |
| 221 | + BOOST_CHECK(cipher == expected_cipher); |
| 222 | + |
| 223 | + std::vector<std::byte> decipher(cipher.size() - AEADChaCha20Poly1305::EXPANSION); |
| 224 | + bool ret = aead.Decrypt(cipher, aad, nonce, decipher); |
| 225 | + BOOST_CHECK(ret); |
| 226 | + BOOST_CHECK(decipher == plain); |
| 227 | +} |
| 228 | + |
210 | 229 | static void TestHKDF_SHA256_32(const std::string &ikm_hex, const std::string &salt_hex, const std::string &info_hex, const std::string &okm_check_hex) {
|
211 | 230 | std::vector<unsigned char> initial_key_material = ParseHex(ikm_hex);
|
212 | 231 | std::vector<unsigned char> salt = ParseHex(salt_hex);
|
@@ -818,6 +837,64 @@ BOOST_AUTO_TEST_CASE(poly1305_testvector)
|
818 | 837 | "0e410fa9d7a40ac582e77546be9a72bb");
|
819 | 838 | }
|
820 | 839 |
|
| 840 | +BOOST_AUTO_TEST_CASE(chacha20poly1305_testvectors) |
| 841 | +{ |
| 842 | + // Note that in our implementation, the authentication is suffixed to the ciphertext. |
| 843 | + // The RFC test vectors specify them separately. |
| 844 | + |
| 845 | + // RFC 8439 Example from section 2.8.2 |
| 846 | + TestChaCha20Poly1305("4c616469657320616e642047656e746c656d656e206f662074686520636c6173" |
| 847 | + "73206f66202739393a204966204920636f756c64206f6666657220796f75206f" |
| 848 | + "6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73" |
| 849 | + "637265656e20776f756c642062652069742e", |
| 850 | + "50515253c0c1c2c3c4c5c6c7", |
| 851 | + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", |
| 852 | + {7, 0x4746454443424140}, |
| 853 | + "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d6" |
| 854 | + "3dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b36" |
| 855 | + "92ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc" |
| 856 | + "3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd060" |
| 857 | + "0691"); |
| 858 | + |
| 859 | + // RFC 8439 Test vector A.5 |
| 860 | + TestChaCha20Poly1305("496e7465726e65742d4472616674732061726520647261667420646f63756d65" |
| 861 | + "6e74732076616c696420666f722061206d6178696d756d206f6620736978206d" |
| 862 | + "6f6e74687320616e64206d617920626520757064617465642c207265706c6163" |
| 863 | + "65642c206f72206f62736f6c65746564206279206f7468657220646f63756d65" |
| 864 | + "6e747320617420616e792074696d652e20497420697320696e617070726f7072" |
| 865 | + "6961746520746f2075736520496e7465726e65742d4472616674732061732072" |
| 866 | + "65666572656e6365206d6174657269616c206f7220746f206369746520746865" |
| 867 | + "6d206f74686572207468616e206173202fe2809c776f726b20696e2070726f67" |
| 868 | + "726573732e2fe2809d", |
| 869 | + "f33388860000000000004e91", |
| 870 | + "1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0", |
| 871 | + {0, 0x0807060504030201}, |
| 872 | + "64a0861575861af460f062c79be643bd5e805cfd345cf389f108670ac76c8cb2" |
| 873 | + "4c6cfc18755d43eea09ee94e382d26b0bdb7b73c321b0100d4f03b7f355894cf" |
| 874 | + "332f830e710b97ce98c8a84abd0b948114ad176e008d33bd60f982b1ff37c855" |
| 875 | + "9797a06ef4f0ef61c186324e2b3506383606907b6a7c02b0f9f6157b53c867e4" |
| 876 | + "b9166c767b804d46a59b5216cde7a4e99040c5a40433225ee282a1b0a06c523e" |
| 877 | + "af4534d7f83fa1155b0047718cbc546a0d072b04b3564eea1b422273f548271a" |
| 878 | + "0bb2316053fa76991955ebd63159434ecebb4e466dae5a1073a6727627097a10" |
| 879 | + "49e617d91d361094fa68f0ff77987130305beaba2eda04df997b714d6c6f2c29" |
| 880 | + "a6ad5cb4022b02709beead9d67890cbb22392336fea1851f38"); |
| 881 | + |
| 882 | + // Test vectors exercising aad and plaintext which are multiples of 16 bytes. |
| 883 | + TestChaCha20Poly1305("8d2d6a8befd9716fab35819eaac83b33269afb9f1a00fddf66095a6c0cd91951" |
| 884 | + "a6b7ad3db580be0674c3f0b55f618e34", |
| 885 | + "", |
| 886 | + "72ddc73f07101282bbbcf853b9012a9f9695fc5d36b303a97fd0845d0314e0c3", |
| 887 | + {0x3432b75f, 0xb3585537eb7f4024}, |
| 888 | + "f760b8224fb2a317b1b07875092606131232a5b86ae142df5df1c846a7f6341a" |
| 889 | + "f2564483dd77f836be45e6230808ffe402a6f0a3e8be074b3d1f4ea8a7b09451"); |
| 890 | + TestChaCha20Poly1305("", |
| 891 | + "36970d8a704c065de16250c18033de5a400520ac1b5842b24551e5823a3314f3" |
| 892 | + "946285171e04a81ebfbe3566e312e74ab80e94c7dd2ff4e10de0098a58d0f503", |
| 893 | + "77adda51d6730b9ad6c995658cbd49f581b2547e7c0c08fcc24ceec797461021", |
| 894 | + {0x1f90da88, 0x75dafa3ef84471a4}, |
| 895 | + "aaae5bb81e8407c94b2ae86ae0c7efbe"); |
| 896 | +} |
| 897 | + |
821 | 898 | BOOST_AUTO_TEST_CASE(hkdf_hmac_sha256_l32_tests)
|
822 | 899 | {
|
823 | 900 | // Use rfc5869 test vectors but truncated to 32 bytes (our implementation only support length 32)
|
|
0 commit comments