Home | History | Annotate | Line # | Download | only in default
      1  1.1  riastrad 
      2  1.1  riastrad #define TEST_NAME "xchacha20"
      3  1.1  riastrad #include "cmptest.h"
      4  1.1  riastrad 
      5  1.1  riastrad typedef struct HChaCha20TV_ {
      6  1.1  riastrad     const char key[crypto_core_hchacha20_KEYBYTES * 2 + 1];
      7  1.1  riastrad     const char in[crypto_core_hchacha20_INPUTBYTES * 2 + 1];
      8  1.1  riastrad     const char out[crypto_core_hchacha20_OUTPUTBYTES * 2 + 1];
      9  1.1  riastrad } HChaCha20TV;
     10  1.1  riastrad 
     11  1.1  riastrad static const unsigned char small_order_p[crypto_scalarmult_BYTES] = {
     12  1.1  riastrad     0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3,
     13  1.1  riastrad     0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32,
     14  1.1  riastrad     0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00
     15  1.1  riastrad };
     16  1.1  riastrad 
     17  1.1  riastrad static void
     18  1.1  riastrad tv_hchacha20(void)
     19  1.1  riastrad {
     20  1.1  riastrad     static const HChaCha20TV tvs[] = {
     21  1.1  riastrad         { "24f11cce8a1b3d61e441561a696c1c1b7e173d084fd4812425435a8896a013dc", "d9660c5900ae19ddad28d6e06e45fe5e", "5966b3eec3bff1189f831f06afe4d4e3be97fa9235ec8c20d08acfbbb4e851e3" },
     22  1.1  riastrad         { "80a5f6272031e18bb9bcd84f3385da65e7731b7039f13f5e3d475364cd4d42f7", "c0eccc384b44c88e92c57eb2d5ca4dfa", "6ed11741f724009a640a44fce7320954c46e18e0d7ae063bdbc8d7cf372709df" },
     23  1.1  riastrad         { "cb1fc686c0eec11a89438b6f4013bf110e7171dace3297f3a657a309b3199629", "fcd49b93e5f8f299227e64d40dc864a3", "84b7e96937a1a0a406bb7162eeaad34308d49de60fd2f7ec9dc6a79cbab2ca34" },
     24  1.1  riastrad         { "6640f4d80af5496ca1bc2cfff1fefbe99638dbceaabd7d0ade118999d45f053d", "31f59ceeeafdbfe8cae7914caeba90d6", "9af4697d2f5574a44834a2c2ae1a0505af9f5d869dbe381a994a18eb374c36a0" },
     25  1.1  riastrad         { "0693ff36d971225a44ac92c092c60b399e672e4cc5aafd5e31426f123787ac27", "3a6293da061da405db45be1731d5fc4d", "f87b38609142c01095bfc425573bb3c698f9ae866b7e4216840b9c4caf3b0865" },
     26  1.1  riastrad         { "809539bd2639a23bf83578700f055f313561c7785a4a19fc9114086915eee551", "780c65d6a3318e479c02141d3f0b3918", "902ea8ce4680c09395ce71874d242f84274243a156938aaa2dd37ac5be382b42" },
     27  1.1  riastrad         { "1a170ddf25a4fd69b648926e6d794e73408805835c64b2c70efddd8cd1c56ce0", "05dbee10de87eb0c5acb2b66ebbe67d3", "a4e20b634c77d7db908d387b48ec2b370059db916e8ea7716dc07238532d5981" },
     28  1.1  riastrad         { "3b354e4bb69b5b4a1126f509e84cad49f18c9f5f29f0be0c821316a6986e15a6", "d8a89af02f4b8b2901d8321796388b6c", "9816cb1a5b61993735a4b161b51ed2265b696e7ded5309c229a5a99f53534fbc" },
     29  1.1  riastrad         { "4b9a818892e15a530db50dd2832e95ee192e5ed6afffb408bd624a0c4e12a081", "a9079c551de70501be0286d1bc78b045", "ebc5224cf41ea97473683b6c2f38a084bf6e1feaaeff62676db59d5b719d999b" },
     30  1.1  riastrad         { "c49758f00003714c38f1d4972bde57ee8271f543b91e07ebce56b554eb7fa6a7", "31f0204e10cf4f2035f9e62bb5ba7303", "0dd8cc400f702d2c06ed920be52048a287076b86480ae273c6d568a2e9e7518c" }
     31  1.1  riastrad     };
     32  1.1  riastrad     const HChaCha20TV *tv;
     33  1.1  riastrad     unsigned char     *constant;
     34  1.1  riastrad     unsigned char     *key;
     35  1.1  riastrad     unsigned char     *in;
     36  1.1  riastrad     unsigned char     *out;
     37  1.1  riastrad     unsigned char     *out2;
     38  1.1  riastrad     size_t             i;
     39  1.1  riastrad 
     40  1.1  riastrad     constant = (unsigned char *) sodium_malloc(crypto_core_hchacha20_CONSTBYTES);
     41  1.1  riastrad     key = (unsigned char *) sodium_malloc(crypto_core_hchacha20_KEYBYTES);
     42  1.1  riastrad     in = (unsigned char *) sodium_malloc(crypto_core_hchacha20_INPUTBYTES);
     43  1.1  riastrad     out = (unsigned char *) sodium_malloc(crypto_core_hchacha20_OUTPUTBYTES);
     44  1.1  riastrad     out2 = (unsigned char *) sodium_malloc(crypto_core_hchacha20_OUTPUTBYTES);
     45  1.1  riastrad     for (i = 0; i < (sizeof tvs) / (sizeof tvs[0]); i++) {
     46  1.1  riastrad         tv = &tvs[i];
     47  1.1  riastrad         sodium_hex2bin(key, crypto_core_hchacha20_KEYBYTES,
     48  1.1  riastrad                        tv->key, strlen(tv->key), NULL, NULL, NULL);
     49  1.1  riastrad         sodium_hex2bin(in, crypto_core_hchacha20_INPUTBYTES,
     50  1.1  riastrad                        tv->in, strlen(tv->in), NULL, NULL, NULL);
     51  1.1  riastrad         sodium_hex2bin(out, crypto_core_hchacha20_OUTPUTBYTES,
     52  1.1  riastrad                        tv->out, strlen(tv->out), NULL, NULL, NULL);
     53  1.1  riastrad         crypto_core_hchacha20(out2, in, key, NULL);
     54  1.1  riastrad         assert(memcmp(out, out2, crypto_core_hchacha20_OUTPUTBYTES) == 0);
     55  1.1  riastrad     }
     56  1.1  riastrad 
     57  1.1  riastrad     sodium_hex2bin(constant, crypto_core_hchacha20_CONSTBYTES,
     58  1.1  riastrad                    "0d29b795c1ca70c1652e823364d32417",
     59  1.1  riastrad                    crypto_core_hchacha20_CONSTBYTES * 2 + 1, NULL, NULL, NULL);
     60  1.1  riastrad     sodium_hex2bin(out, crypto_core_hchacha20_OUTPUTBYTES,
     61  1.1  riastrad                    "934d941d78eb9bfc2f0376f7ccd4a11ecf0c6a44104618a9749ef47fe97037a2",
     62  1.1  riastrad                    crypto_core_hchacha20_OUTPUTBYTES * 2 + 1, NULL, NULL, NULL);
     63  1.1  riastrad 
     64  1.1  riastrad     crypto_core_hchacha20(out2, in, key, constant);
     65  1.1  riastrad     assert(memcmp(out, out2, crypto_core_hchacha20_OUTPUTBYTES) == 0);
     66  1.1  riastrad 
     67  1.1  riastrad     sodium_free(out2);
     68  1.1  riastrad     sodium_free(out);
     69  1.1  riastrad     sodium_free(in);
     70  1.1  riastrad     sodium_free(key);
     71  1.1  riastrad     sodium_free(constant);
     72  1.1  riastrad 
     73  1.1  riastrad     assert(crypto_core_hchacha20_outputbytes() == crypto_core_hchacha20_OUTPUTBYTES);
     74  1.1  riastrad     assert(crypto_core_hchacha20_inputbytes() == crypto_core_hchacha20_INPUTBYTES);
     75  1.1  riastrad     assert(crypto_core_hchacha20_keybytes() == crypto_core_hchacha20_KEYBYTES);
     76  1.1  riastrad     assert(crypto_core_hchacha20_constbytes() == crypto_core_hchacha20_CONSTBYTES);
     77  1.1  riastrad 
     78  1.1  riastrad     printf("tv_hchacha20: ok\n");
     79  1.1  riastrad }
     80  1.1  riastrad 
     81  1.1  riastrad #define XCHACHA20_OUT_MAX 100
     82  1.1  riastrad 
     83  1.1  riastrad typedef struct XChaCha20TV_ {
     84  1.1  riastrad     const char key[crypto_stream_xchacha20_KEYBYTES * 2 + 1];
     85  1.1  riastrad     const char nonce[crypto_stream_xchacha20_NONCEBYTES * 2 + 1];
     86  1.1  riastrad     const char out[XCHACHA20_OUT_MAX * 2 + 1];
     87  1.1  riastrad } XChaCha20TV;
     88  1.1  riastrad 
     89  1.1  riastrad static void
     90  1.1  riastrad tv_stream_xchacha20(void)
     91  1.1  riastrad {
     92  1.1  riastrad     static const XChaCha20TV tvs[] = {
     93  1.1  riastrad         { "79c99798ac67300bbb2704c95c341e3245f3dcb21761b98e52ff45b24f304fc4", "b33ffd3096479bcfbc9aee49417688a0a2554f8d95389419", "c6e9758160083ac604ef90e712ce6e75d7797590744e0cf060f013739c" },
     94  1.1  riastrad         { "ddf7784fee099612c40700862189d0397fcc4cc4b3cc02b5456b3a97d1186173", "a9a04491e7bf00c3ca91ac7c2d38a777d88993a7047dfcc4", "2f289d371f6f0abc3cb60d11d9b7b29adf6bc5ad843e8493e928448d" },
     95  1.1  riastrad         { "3d12800e7b014e88d68a73f0a95b04b435719936feba60473f02a9e61ae60682", "56bed2599eac99fb27ebf4ffcb770a64772dec4d5849ea2d", "a2c3c1406f33c054a92760a8e0666b84f84fa3a618f0" },
     96  1.1  riastrad         { "5f5763ff9a30c95da5c9f2a8dfd7cc6efd9dfb431812c075aa3e4f32e04f53e4", "a5fa890efa3b9a034d377926ce0e08ee6d7faccaee41b771", "8a1a5ba898bdbcff602b1036e469a18a5e45789d0e8d9837d81a2388a52b0b6a0f51891528f424c4a7f492a8dd7bce8bac19fbdbe1fb379ac0" },
     97  1.1  riastrad         { "eadc0e27f77113b5241f8ca9d6f9a5e7f09eee68d8a5cf30700563bf01060b4e", "a171a4ef3fde7c4794c5b86170dc5a099b478f1b852f7b64", "23839f61795c3cdbcee2c749a92543baeeea3cbb721402aa42e6cae140447575f2916c5d71108e3b13357eaf86f060cb" },
     98  1.1  riastrad         { "91319c9545c7c804ba6b712e22294c386fe31c4ff3d278827637b959d3dbaab2", "410e854b2a911f174aaf1a56540fc3855851f41c65967a4e", "cbe7d24177119b7fdfa8b06ee04dade4256ba7d35ffda6b89f014e479faef6" },
     99  1.1  riastrad         { "6a6d3f412fc86c4450fc31f89f64ed46baa3256ffcf8616e8c23a06c422842b6", "6b7773fce3c2546a5db4829f53a9165f41b08faae2fb72d5", "8b23e35b3cdd5f3f75525fc37960ec2b68918e8c046d8a832b9838f1546be662e54feb1203e2" },
    100  1.1  riastrad         { "d45e56368ebc7ba9be7c55cfd2da0feb633c1d86cab67cd5627514fd20c2b391", "fd37da2db31e0c738754463edadc7dafb0833bd45da497fc", "47950efa8217e3dec437454bd6b6a80a287e2570f0a48b3fa1ea3eb868be3d486f6516606d85e5643becc473b370871ab9ef8e2a728f73b92bd98e6e26ea7c8ff96ec5a9e8de95e1eee9300c" },
    101  1.1  riastrad         { "aface41a64a9a40cbc604d42bd363523bd762eb717f3e08fe2e0b4611eb4dcf3", "6906e0383b895ab9f1cf3803f42f27c79ad47b681c552c63", "a5fa7c0190792ee17675d52ad7570f1fb0892239c76d6e802c26b5b3544d13151e67513b8aaa1ac5af2d7fd0d5e4216964324838" },
    102  1.1  riastrad         { "9d23bd4149cb979ccf3c5c94dd217e9808cb0e50cd0f67812235eaaf601d6232", "c047548266b7c370d33566a2425cbf30d82d1eaf5294109e", "a21209096594de8c5667b1d13ad93f744106d054df210e4782cd396fec692d3515a20bf351eec011a92c367888bc464c32f0807acd6c203a247e0db854148468e9f96bee4cf718d68d5f637cbd5a376457788e6fae90fc31097cfc" },
    103  1.1  riastrad     };
    104  1.1  riastrad     const XChaCha20TV *tv;
    105  1.1  riastrad     char              *hex;
    106  1.1  riastrad     unsigned char     *key;
    107  1.1  riastrad     unsigned char     *nonce;
    108  1.1  riastrad     unsigned char     *out;
    109  1.1  riastrad     unsigned char     *out2;
    110  1.1  riastrad     size_t             out_len;
    111  1.1  riastrad     size_t             i;
    112  1.1  riastrad 
    113  1.1  riastrad     key = (unsigned char *) sodium_malloc(crypto_stream_xchacha20_KEYBYTES);
    114  1.1  riastrad     nonce = (unsigned char *) sodium_malloc(crypto_stream_xchacha20_NONCEBYTES);
    115  1.1  riastrad     out = (unsigned char *) sodium_malloc(XCHACHA20_OUT_MAX);
    116  1.1  riastrad     for (i = 0; i < (sizeof tvs) / (sizeof tvs[0]); i++) {
    117  1.1  riastrad         tv = &tvs[i];
    118  1.1  riastrad 
    119  1.1  riastrad         sodium_hex2bin(key, crypto_stream_xchacha20_KEYBYTES,
    120  1.1  riastrad                        tv->key, strlen(tv->key), NULL, NULL, NULL);
    121  1.1  riastrad         sodium_hex2bin(nonce, crypto_stream_xchacha20_NONCEBYTES,
    122  1.1  riastrad                        tv->nonce, strlen(tv->nonce), NULL, NULL, NULL);
    123  1.1  riastrad         sodium_hex2bin(out, XCHACHA20_OUT_MAX,
    124  1.1  riastrad                        tv->out, strlen(tv->out), NULL, &out_len, NULL);
    125  1.1  riastrad         out2 = (unsigned char *) sodium_malloc(out_len);
    126  1.1  riastrad         crypto_stream_xchacha20(out2, out_len, nonce, key);
    127  1.1  riastrad         assert(memcmp(out, out2, out_len) == 0);
    128  1.1  riastrad         crypto_stream_xchacha20_xor(out2, out, out_len, nonce, key);
    129  1.1  riastrad         assert(sodium_is_zero(out2, out_len));
    130  1.1  riastrad         crypto_stream_xchacha20_xor_ic(out2, out, out_len, nonce, 0, key);
    131  1.1  riastrad         assert(sodium_is_zero(out2, out_len));
    132  1.1  riastrad         crypto_stream_xchacha20_xor_ic(out2, out, out_len, nonce, 1, key);
    133  1.1  riastrad         assert(!sodium_is_zero(out2, out_len));
    134  1.1  riastrad         crypto_stream_xchacha20_xor(out, out, out_len, nonce, key);
    135  1.1  riastrad         assert(sodium_is_zero(out, out_len));
    136  1.1  riastrad         sodium_free(out2);
    137  1.1  riastrad     }
    138  1.1  riastrad 
    139  1.1  riastrad     out2 = (unsigned char *) sodium_malloc(0);
    140  1.1  riastrad     crypto_stream_xchacha20(out2, 0, nonce, key);
    141  1.1  riastrad     crypto_stream_xchacha20_xor(out2, out2, 0, nonce, key);
    142  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out2, out2, 0, nonce, 1, key);
    143  1.1  riastrad     sodium_free(out2);
    144  1.1  riastrad     sodium_free(out);
    145  1.1  riastrad 
    146  1.1  riastrad     out = (unsigned char *) sodium_malloc(64);
    147  1.1  riastrad     out2 = (unsigned char *) sodium_malloc(128);
    148  1.1  riastrad     randombytes_buf(out, 64);
    149  1.1  riastrad     randombytes_buf(out2, 64);
    150  1.1  riastrad     memcpy(out2 + 64, out, 64);
    151  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out, out, 64, nonce, 1, key);
    152  1.1  riastrad     crypto_stream_xchacha20_xor(out2, out2, 128, nonce, key);
    153  1.1  riastrad     assert(memcmp(out, out2 + 64, 64) == 0);
    154  1.1  riastrad     sodium_free(out);
    155  1.1  riastrad     sodium_free(out2);
    156  1.1  riastrad 
    157  1.1  riastrad     out = (unsigned char *) sodium_malloc(192);
    158  1.1  riastrad     out2 = (unsigned char *) sodium_malloc(192);
    159  1.1  riastrad     memset(out, 0, 192);
    160  1.1  riastrad     memset(out2, 0, 192);
    161  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out2, out2, 192, nonce,
    162  1.1  riastrad                                    (1ULL << 32) - 1ULL, key);
    163  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out, out, 64, nonce,
    164  1.1  riastrad                                    (1ULL << 32) - 1ULL, key);
    165  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out + 64, out + 64, 64, nonce,
    166  1.1  riastrad                                    (1ULL << 32), key);
    167  1.1  riastrad     crypto_stream_xchacha20_xor_ic(out + 128, out + 128, 64, nonce,
    168  1.1  riastrad                                    (1ULL << 32) + 1, key);
    169  1.1  riastrad     assert(memcmp(out, out2, 192) == 0);
    170  1.1  riastrad     hex = (char *) sodium_malloc(192 * 2 + 1);
    171  1.1  riastrad     sodium_bin2hex(hex, 192 * 2 + 1, out, 192);
    172  1.1  riastrad     printf("%s\n", hex);
    173  1.1  riastrad 
    174  1.1  riastrad     memset(key, 0, crypto_stream_xchacha20_KEYBYTES);
    175  1.1  riastrad     crypto_stream_xchacha20_keygen(key);
    176  1.1  riastrad     assert(sodium_is_zero(key, crypto_stream_xchacha20_KEYBYTES) == 0);
    177  1.1  riastrad 
    178  1.1  riastrad     sodium_free(hex);
    179  1.1  riastrad     sodium_free(out);
    180  1.1  riastrad     sodium_free(out2);
    181  1.1  riastrad 
    182  1.1  riastrad     sodium_free(nonce);
    183  1.1  riastrad     sodium_free(key);
    184  1.1  riastrad 
    185  1.1  riastrad     assert(crypto_stream_xchacha20_keybytes() == crypto_stream_xchacha20_KEYBYTES);
    186  1.1  riastrad     assert(crypto_stream_xchacha20_noncebytes() == crypto_stream_xchacha20_NONCEBYTES);
    187  1.1  riastrad     assert(crypto_stream_xchacha20_messagebytes_max() == crypto_stream_xchacha20_MESSAGEBYTES_MAX);
    188  1.1  riastrad 
    189  1.1  riastrad     printf("tv_stream_xchacha20: ok\n");
    190  1.1  riastrad }
    191  1.1  riastrad 
    192  1.1  riastrad typedef struct XChaCha20Poly1305TV_ {
    193  1.1  riastrad     const char  key[crypto_secretbox_xchacha20poly1305_KEYBYTES * 2 + 1];
    194  1.1  riastrad     const char  nonce[crypto_secretbox_xchacha20poly1305_NONCEBYTES * 2 + 1];
    195  1.1  riastrad     const char *m;
    196  1.1  riastrad     const char *out;
    197  1.1  riastrad } XChaCha20Poly1305TV;
    198  1.1  riastrad 
    199  1.1  riastrad static void
    200  1.1  riastrad tv_secretbox_xchacha20poly1305(void)
    201  1.1  riastrad {
    202  1.1  riastrad     static const XChaCha20Poly1305TV tvs[] = {
    203  1.1  riastrad         { "065ff46a9dddb1ab047ee5914d6d575a828b8cc1f454b24e8cd0f57efdc49a34", "f83262646ce01293b9923a65a073df78c54b2e799cd6c4e5", "", "4c72340416339dcdea01b760db5adaf7" },
    204  1.1  riastrad         { "d3c71d54e6b13506e07aa2e7b412a17a7a1f34df3d3148cd3f45b91ccaa5f4d9", "943b454a853aa514c63cf99b1e197bbb99da24b2e2d93e47", "76bd706e07741e713d90efdb34ad202067263f984942aae8bda159f30dfccc72200f8093520b85c5ad124ff7c8b2d920946e5cfff4b819abf84c7b35a6205ca72c9f8747c3044dd73fb4bebda1b476", "0384276f1cfa5c82c3e58f0f2acc1f821c6f526d2c19557cf8bd270fcde43fba1d88890663f7b2f5c6b1d7deccf5c91b4df5865dc55cc7e04d6793fc2db8f9e3b418f95cb796d67a7f3f7e097150cb607c435dacf82eac3d669866e5092ace" },
    205  1.1  riastrad         { "9498fdb922e0596e32af7f8108def2068f5a32a5ac70bd33ade371701f3d98d0", "a0056f24be0d20106fe750e2ee3684d4457cbdcb3a74e566", "b1bc9cfedb340fb06a37eba80439189e48aa0cfd37020eec0afa09165af12864671b3fbddbbb20ac18f586f2f66d13b3ca40c9a7e21c4513a5d87a95319f8ca3c2151e2a1b8b86a35653e77f90b9e63d2a84be9b9603876a89d60fd708edcd64b41be1064b8ad1046553aaeb51dc70b8112c9915d94f2a5dad1e14e7009db6c703c843a4f64b77d44b179b9579ac497dac2d33", "4918790d46893fa3dca74d8abc57eef7fca2c6393d1beef5efa845ac20475db38d1a068debf4c5dbd8614eb072877c565dc52bd40941f0b590d2079a5028e426bf50bcbaadcbebf278bddceedc578a5e31379523dee15026ec82d34e56f2871fdf13255db199ac48f163d5ee7e4f4e09a39451356959d9242a39aea33990ab960a4c25346e3d9397fc5e7cb6266c2476411cd331f2bcb4486750c746947ec6401865d5" },
    206  1.1  riastrad         { "fa2d915e044d0519248150e7c815b01f0f2a691c626f8d22c3ef61e7f16eea47", "c946065dc8befa9cc9f292ea2cf28f0256285565051792b7", "d5be1a24c7872115dc5c5b4234dbee35a6f89ae3a91b3e33d75249a0aecfed252341295f49296f7ee14d64de1ea6355cb8facd065052d869aeb1763cda7e418a7e33b6f7a81327181df6cd4de3a126d9df1b5e8b0b1a6b281e63f2", "6d32e3571afec58b0acabb54a287118b3ed6691f56cc8ead12d735352c9a050c2ca173c78b6092f9ad4b7c21c36fb0ce18560956395bab3099c54760a743051ac6a898a0b0034b5e953340c975cf7a873c56b27e66bca2bff1dd977addefc7935bb7550753dd13d1f1a43d" },
    207  1.1  riastrad         { "6f149c2ec27af45176030c8dd7ab0e1e488f5803f26f75045d7a56f59a587a85", "952aff2f39bc70016f04ac7fb8b55fd22764ba16b56e255d", "8fde598c4bde5786abdc6ab83fce66d59782b6ce36afe028c447ad4086a748764afa88a520e837a9d56d0b7693b0476649f24c2aa44b94615a1efc75", "9bccf07974836fa4609d32d9527d928d184d9c6c0823af2f703e0e257a162d26d3678fa15ab1c4db76ac42084d32cefca8efaf77814c199b310999e327a3e3daa2e235b175979504ede87b58" },
    208  1.1  riastrad         { "b964b7fdf442efbcc2cd3e4cd596035bdfb05ed7d44f7fd4dce2d5614af5c8c4", "2886fbfa4b35b68f28d31df6243a4fbc56475b69e24820a4", "", "b83fbdd112bf0f7d62eff96c9faa8850" },
    209  1.1  riastrad         { "10c0ad4054b48d7d1de1d9ab6f782ca883d886573e9d18c1d47b6ee6b5208189", "977edf57428d0e0247a3c88c9a9ec321bbaae1a4da8353b5", "518e4a27949812424b2a381c3efea6055ee5e75eff", "0c801a037c2ed0500d6ef68e8d195eceb05a15f8edb68b35773e81ac2aca18e9be53416f9a" },
    210  1.1  riastrad         { "7db0a81d01699c86f47a3ec76d46aa32660adad7f9ac72cf8396419f789f6bb1", "e7cb57132ce954e28f4470cca1dbda20b534cdf32fbe3658", "ee6511d403539e611ab312205f0c3b8f36a33d36f1dc44bb33d6836f0ab93b9f1747167bf0150f045fcd12a39479641d8bdde6fe01475196e8fe2c435e834e30a59f6aaa01ebcd", "ae8b1d4df4f982b2702626feca07590fedd0dfa7ae34e6a098372a1aa32f9fbf0ce2a88b5c16a571ef48f3c9fda689ce8ebb9947c9e2a28e01b1191efc81ad2ce0ed6e6fc7c164b1fc7f3d50b7f5e47a895db3c1fc46c0" },
    211  1.1  riastrad         { "7b043dd27476cf5a2baf2907541d8241ecd8b97d38d08911737e69b0846732fb", "74706a2855f946ed600e9b453c1ac372520b6a76a3c48a76", "dbf165bb8352d6823991b99f3981ba9c8153635e5695477cba54e96a2a8c4dc5f9dbe817887d7340e3f48a", "ce57261afba90a9598de15481c43f26f7b8c8cb2806c7c977752dba898dc51b92a3f1a62ebf696747bfccf72e0edda97f2ccd6d496f55aefbb3ec2" },
    212  1.1  riastrad         { "e588e418d658df1b2b1583122e26f74ca3506b425087bea895d81021168f8164", "4f4d0ffd699268cd841ce4f603fe0cd27b8069fcf8215fbb", "f91bcdcf4d08ba8598407ba8ef661e66c59ca9d89f3c0a3542e47246c777091e4864e63e1e3911dc01257255e551527a53a34481be", "22dc88de7cacd4d9ce73359f7d6e16e74caeaa7b0d1ef2bb10fda4e79c3d5a9aa04b8b03575fd27bc970c9ed0dc80346162469e0547030ddccb8cdc95981400907c87c9442" }
    213  1.1  riastrad     };
    214  1.1  riastrad     const XChaCha20Poly1305TV *tv;
    215  1.1  riastrad     unsigned char             *m;
    216  1.1  riastrad     unsigned char             *nonce;
    217  1.1  riastrad     unsigned char             *key;
    218  1.1  riastrad     unsigned char             *out;
    219  1.1  riastrad     unsigned char             *out2;
    220  1.1  riastrad     size_t                     m_len;
    221  1.1  riastrad     size_t                     n;
    222  1.1  riastrad     size_t                     i;
    223  1.1  riastrad 
    224  1.1  riastrad     key = (unsigned char *) sodium_malloc
    225  1.1  riastrad         (crypto_secretbox_xchacha20poly1305_KEYBYTES);
    226  1.1  riastrad     nonce = (unsigned char *) sodium_malloc
    227  1.1  riastrad         (crypto_secretbox_xchacha20poly1305_NONCEBYTES);
    228  1.1  riastrad     for (i = 0; i < (sizeof tvs) / (sizeof tvs[0]); i++) {
    229  1.1  riastrad         tv = &tvs[i];
    230  1.1  riastrad         m_len = strlen(tv->m) / 2;
    231  1.1  riastrad         m = (unsigned char *) sodium_malloc(m_len);
    232  1.1  riastrad         sodium_hex2bin(key, crypto_secretbox_xchacha20poly1305_KEYBYTES,
    233  1.1  riastrad                        tv->key, strlen(tv->key), NULL, NULL, NULL);
    234  1.1  riastrad         sodium_hex2bin(nonce, crypto_secretbox_xchacha20poly1305_NONCEBYTES,
    235  1.1  riastrad                        tv->nonce, strlen(tv->nonce), NULL, NULL, NULL);
    236  1.1  riastrad         sodium_hex2bin(m, m_len, tv->m, strlen(tv->m), NULL, NULL, NULL);
    237  1.1  riastrad         out = (unsigned char *) sodium_malloc
    238  1.1  riastrad             (crypto_secretbox_xchacha20poly1305_MACBYTES + m_len);
    239  1.1  riastrad         out2 = (unsigned char *) sodium_malloc
    240  1.1  riastrad             (crypto_secretbox_xchacha20poly1305_MACBYTES + m_len);
    241  1.1  riastrad         sodium_hex2bin(out, crypto_secretbox_xchacha20poly1305_MACBYTES + m_len,
    242  1.1  riastrad                        tv->out, strlen(tv->out), NULL, NULL, NULL);
    243  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_easy(out2, m, 0, nonce, key) == 0);
    244  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_easy(out2, m, m_len, nonce, key) == 0);
    245  1.1  riastrad         assert(memcmp(out, out2,
    246  1.1  riastrad                       crypto_secretbox_xchacha20poly1305_MACBYTES + m_len) == 0);
    247  1.1  riastrad         n = randombytes_uniform(crypto_secretbox_xchacha20poly1305_MACBYTES + (uint32_t) m_len);
    248  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    249  1.1  riastrad                (out2, out2, crypto_secretbox_xchacha20poly1305_MACBYTES - 1,
    250  1.1  riastrad                 nonce, key) == -1);
    251  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    252  1.1  riastrad                (out2, out2, 0,
    253  1.1  riastrad                 nonce, key) == -1);
    254  1.1  riastrad         out2[n]++;
    255  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    256  1.1  riastrad                (out2, out2, crypto_secretbox_xchacha20poly1305_MACBYTES + m_len,
    257  1.1  riastrad                 nonce, key) == -1);
    258  1.1  riastrad         out2[n]--;
    259  1.1  riastrad         nonce[0]++;
    260  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    261  1.1  riastrad                (out2, out2, crypto_secretbox_xchacha20poly1305_MACBYTES + m_len,
    262  1.1  riastrad                 nonce, key) == -1);
    263  1.1  riastrad         nonce[0]--;
    264  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    265  1.1  riastrad                (out2, out2, crypto_secretbox_xchacha20poly1305_MACBYTES + m_len,
    266  1.1  riastrad                 nonce, key) == 0);
    267  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    268  1.1  riastrad                (out2, out2, crypto_secretbox_xchacha20poly1305_MACBYTES - 1,
    269  1.1  riastrad                 nonce, key) == -1);
    270  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_easy
    271  1.1  riastrad                (out2, out2, 0, nonce, key) == -1);
    272  1.1  riastrad         assert(memcmp(m, out2, m_len) == 0);
    273  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_detached
    274  1.1  riastrad                (out2, out + crypto_secretbox_xchacha20poly1305_MACBYTES, out,
    275  1.1  riastrad                 m_len, nonce, key) == 0);
    276  1.1  riastrad         assert(crypto_secretbox_xchacha20poly1305_open_detached
    277  1.1  riastrad                (NULL, out + crypto_secretbox_xchacha20poly1305_MACBYTES, out,
    278  1.1  riastrad                 m_len, nonce, key) == 0);
    279  1.1  riastrad         crypto_secretbox_xchacha20poly1305_detached
    280  1.1  riastrad             (out2 + crypto_secretbox_xchacha20poly1305_MACBYTES, out2, m,
    281  1.1  riastrad              m_len, nonce, key);
    282  1.1  riastrad         assert(memcmp(out, out2,
    283  1.1  riastrad                       crypto_secretbox_xchacha20poly1305_MACBYTES + m_len) == 0);
    284  1.1  riastrad         sodium_free(out);
    285  1.1  riastrad         sodium_free(out2);
    286  1.1  riastrad         sodium_free(m);
    287  1.1  riastrad     }
    288  1.1  riastrad     sodium_free(nonce);
    289  1.1  riastrad     sodium_free(key);
    290  1.1  riastrad 
    291  1.1  riastrad     assert(crypto_secretbox_xchacha20poly1305_keybytes() == crypto_secretbox_xchacha20poly1305_KEYBYTES);
    292  1.1  riastrad     assert(crypto_secretbox_xchacha20poly1305_noncebytes() == crypto_secretbox_xchacha20poly1305_NONCEBYTES);
    293  1.1  riastrad     assert(crypto_secretbox_xchacha20poly1305_macbytes() == crypto_secretbox_xchacha20poly1305_MACBYTES);
    294  1.1  riastrad     assert(crypto_secretbox_xchacha20poly1305_messagebytes_max() == crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX);
    295  1.1  riastrad 
    296  1.1  riastrad     printf("tv_secretbox_xchacha20: ok\n");
    297  1.1  riastrad }
    298  1.1  riastrad 
    299  1.1  riastrad static void
    300  1.1  riastrad tv_box_xchacha20poly1305(void)
    301  1.1  riastrad {
    302  1.1  riastrad     char           hex[65];
    303  1.1  riastrad     unsigned char *pk;
    304  1.1  riastrad     unsigned char *sk;
    305  1.1  riastrad     unsigned char *m;
    306  1.1  riastrad     unsigned char *m2;
    307  1.1  riastrad     unsigned char *mac;
    308  1.1  riastrad     unsigned char *nonce;
    309  1.1  riastrad     unsigned char *out;
    310  1.1  riastrad     unsigned char *pc;
    311  1.1  riastrad     unsigned char *seed;
    312  1.1  riastrad     size_t         m_len;
    313  1.1  riastrad     int            i;
    314  1.1  riastrad 
    315  1.1  riastrad     pk = (unsigned char *) sodium_malloc(crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES);
    316  1.1  riastrad     sk = (unsigned char *) sodium_malloc(crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES);
    317  1.1  riastrad     nonce = (unsigned char *) sodium_malloc(crypto_box_curve25519xchacha20poly1305_NONCEBYTES);
    318  1.1  riastrad     mac = (unsigned char *) sodium_malloc(crypto_box_curve25519xchacha20poly1305_MACBYTES);
    319  1.1  riastrad     pc = (unsigned char *) sodium_malloc(crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES);
    320  1.1  riastrad     for (i = 0; i < 10; i++) {
    321  1.1  riastrad         m_len = (i == 0) ? 0 : randombytes_uniform(150);
    322  1.1  riastrad         m = (unsigned char *) sodium_malloc(m_len);
    323  1.1  riastrad         m2 = (unsigned char *) sodium_malloc(m_len);
    324  1.1  riastrad 
    325  1.1  riastrad         out = (unsigned char *) sodium_malloc
    326  1.1  riastrad             (crypto_box_curve25519xchacha20poly1305_MACBYTES + m_len);
    327  1.1  riastrad         randombytes_buf(nonce, crypto_box_curve25519xchacha20poly1305_NONCEBYTES);
    328  1.1  riastrad         randombytes_buf(m, m_len);
    329  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_keypair(pk, sk) == 0);
    330  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_easy(out, m, 0, nonce,
    331  1.1  riastrad                                                            pk, sk) == 0);
    332  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_easy(out, m, m_len, nonce,
    333  1.1  riastrad                                                            pk, sk) == 0);
    334  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy
    335  1.1  riastrad                (m2, out, crypto_box_curve25519xchacha20poly1305_MACBYTES + m_len,
    336  1.1  riastrad                 nonce, small_order_p, sk) == -1);
    337  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy
    338  1.1  riastrad                (m2, out, crypto_box_curve25519xchacha20poly1305_MACBYTES - 1,
    339  1.1  riastrad                 nonce, pk, sk) == -1);
    340  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy
    341  1.1  riastrad                (m2, out, 0, nonce, pk, sk) == -1);
    342  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy
    343  1.1  riastrad                (m2, out, crypto_box_curve25519xchacha20poly1305_MACBYTES + m_len,
    344  1.1  riastrad                 nonce, pk, sk) == 0);
    345  1.1  riastrad         assert(memcmp(m2, m, m_len) == 0);
    346  1.1  riastrad         sodium_free(out);
    347  1.1  riastrad 
    348  1.1  riastrad         out = (unsigned char *) sodium_malloc
    349  1.1  riastrad             (crypto_box_curve25519xchacha20poly1305_MACBYTES + m_len);
    350  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_beforenm(pc, small_order_p, sk) == -1);
    351  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_beforenm(pc, pk, sk) == 0);
    352  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_easy_afternm
    353  1.1  riastrad                (out, m, 0, nonce, pc) == 0);
    354  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_easy_afternm
    355  1.1  riastrad                (out, m, m_len, nonce, pc) == 0);
    356  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy_afternm
    357  1.1  riastrad                (m2, out, crypto_box_curve25519xchacha20poly1305_MACBYTES - 1,
    358  1.1  riastrad                 nonce, pc) == -1);
    359  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy_afternm
    360  1.1  riastrad                (m2, out, 0,
    361  1.1  riastrad                 nonce, pc) == -1);
    362  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_easy_afternm
    363  1.1  riastrad                (m2, out, crypto_box_curve25519xchacha20poly1305_MACBYTES + m_len,
    364  1.1  riastrad                 nonce, pc) == 0);
    365  1.1  riastrad         assert(memcmp(m2, m, m_len) == 0);
    366  1.1  riastrad         sodium_free(out);
    367  1.1  riastrad 
    368  1.1  riastrad         out = (unsigned char *) sodium_malloc(m_len);
    369  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_detached(out, mac, m, m_len,
    370  1.1  riastrad                                                                nonce, small_order_p, sk) == -1);
    371  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_detached(out, mac, m, m_len,
    372  1.1  riastrad                                                                nonce, pk, sk) == 0);
    373  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_detached
    374  1.1  riastrad                (m2, out, mac, m_len, nonce, small_order_p, sk) == -1);
    375  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_detached
    376  1.1  riastrad                (m2, out, mac, m_len, nonce, pk, sk) == 0);
    377  1.1  riastrad         sodium_free(out);
    378  1.1  riastrad 
    379  1.1  riastrad         out = (unsigned char *) sodium_malloc(m_len);
    380  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_detached_afternm
    381  1.1  riastrad                (out, mac, m, m_len, nonce, pc) == 0);
    382  1.1  riastrad         assert(crypto_box_curve25519xchacha20poly1305_open_detached_afternm
    383  1.1  riastrad                (m2, out, mac, m_len, nonce, pc) == 0);
    384  1.1  riastrad         sodium_free(out);
    385  1.1  riastrad 
    386  1.1  riastrad         sodium_free(m2);
    387  1.1  riastrad         sodium_free(m);
    388  1.1  riastrad     }
    389  1.1  riastrad     sodium_free(pc);
    390  1.1  riastrad     sodium_free(mac);
    391  1.1  riastrad     sodium_free(nonce);
    392  1.1  riastrad 
    393  1.1  riastrad     seed = (unsigned char *) sodium_malloc
    394  1.1  riastrad         (crypto_box_curve25519xchacha20poly1305_SEEDBYTES);
    395  1.1  riastrad     for (i = 0; i <(int)  crypto_box_curve25519xchacha20poly1305_SEEDBYTES; i++) {
    396  1.1  riastrad         seed[i] = (unsigned char) i;
    397  1.1  riastrad     }
    398  1.1  riastrad     crypto_box_curve25519xchacha20poly1305_seed_keypair(pk, sk, seed);
    399  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, pk, crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES);
    400  1.1  riastrad     assert(strcmp(hex, "4701d08488451f545a409fb58ae3e58581ca40ac3f7f114698cd71deac73ca01") == 0);
    401  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, sk, crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES);
    402  1.1  riastrad     assert(strcmp(hex, "3d94eea49c580aef816935762be049559d6d1440dede12e6a125f1841fff8e6f") == 0);
    403  1.1  riastrad     sodium_free(seed);
    404  1.1  riastrad 
    405  1.1  riastrad     sodium_free(sk);
    406  1.1  riastrad     sodium_free(pk);
    407  1.1  riastrad 
    408  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_seedbytes() == crypto_box_curve25519xchacha20poly1305_SEEDBYTES);
    409  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_publickeybytes() == crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES);
    410  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_secretkeybytes() == crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES);
    411  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_beforenmbytes() == crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES);
    412  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_noncebytes() == crypto_box_curve25519xchacha20poly1305_NONCEBYTES);
    413  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_macbytes() == crypto_box_curve25519xchacha20poly1305_MACBYTES);
    414  1.1  riastrad     assert(crypto_box_curve25519xchacha20poly1305_messagebytes_max() == crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX);
    415  1.1  riastrad 
    416  1.1  riastrad     printf("tv_box_xchacha20poly1305: ok\n");
    417  1.1  riastrad }
    418  1.1  riastrad 
    419  1.1  riastrad int
    420  1.1  riastrad main(void)
    421  1.1  riastrad {
    422  1.1  riastrad     tv_hchacha20();
    423  1.1  riastrad     tv_stream_xchacha20();
    424  1.1  riastrad     tv_secretbox_xchacha20poly1305();
    425  1.1  riastrad     tv_box_xchacha20poly1305();
    426  1.1  riastrad 
    427  1.1  riastrad     return 0;
    428  1.1  riastrad }
    429