Home | History | Annotate | Line # | Download | only in default
      1  1.1  riastrad 
      2  1.1  riastrad #define TEST_NAME "aead_xchacha20poly1305"
      3  1.1  riastrad #include "cmptest.h"
      4  1.1  riastrad 
      5  1.1  riastrad static int
      6  1.1  riastrad tv(void)
      7  1.1  riastrad {
      8  1.1  riastrad #undef  MLEN
      9  1.1  riastrad #define MLEN 114U
     10  1.1  riastrad #undef  ADLEN
     11  1.1  riastrad #define ADLEN 12U
     12  1.1  riastrad #undef  CLEN
     13  1.1  riastrad #define CLEN (MLEN + crypto_aead_xchacha20poly1305_ietf_ABYTES)
     14  1.1  riastrad     static const unsigned char firstkey[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]
     15  1.1  riastrad         = {
     16  1.1  riastrad             0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
     17  1.1  riastrad             0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
     18  1.1  riastrad             0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
     19  1.1  riastrad             0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
     20  1.1  riastrad         };
     21  1.1  riastrad #undef  MESSAGE
     22  1.1  riastrad #define MESSAGE "Ladies and Gentlemen of the class of '99: If I could offer you " \
     23  1.1  riastrad "only one tip for the future, sunscreen would be it."
     24  1.1  riastrad     unsigned char *m = (unsigned char *) sodium_malloc(MLEN);
     25  1.1  riastrad     static const unsigned char nonce[crypto_aead_xchacha20poly1305_ietf_NPUBBYTES]
     26  1.1  riastrad         = { 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
     27  1.1  riastrad             0x48, 0x49, 0x4a, 0x4b };
     28  1.1  riastrad     static const unsigned char ad[ADLEN]
     29  1.1  riastrad         = { 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 };
     30  1.1  riastrad     unsigned char *c = (unsigned char *) sodium_malloc(CLEN);
     31  1.1  riastrad     unsigned char *detached_c = (unsigned char *) sodium_malloc(MLEN);
     32  1.1  riastrad     unsigned char *key2 = (unsigned char *) sodium_malloc(crypto_aead_xchacha20poly1305_ietf_KEYBYTES);
     33  1.1  riastrad     unsigned char *mac = (unsigned char *) sodium_malloc(crypto_aead_xchacha20poly1305_ietf_ABYTES);
     34  1.1  riastrad     unsigned char *m2 = (unsigned char *) sodium_malloc(MLEN);
     35  1.1  riastrad     unsigned long long found_clen;
     36  1.1  riastrad     unsigned long long found_maclen;
     37  1.1  riastrad     unsigned long long m2len;
     38  1.1  riastrad     size_t i;
     39  1.1  riastrad 
     40  1.1  riastrad     assert(sizeof MESSAGE - 1U == MLEN);
     41  1.1  riastrad     memcpy(m, MESSAGE, MLEN);
     42  1.1  riastrad     crypto_aead_xchacha20poly1305_ietf_encrypt(c, &found_clen, m, MLEN,
     43  1.1  riastrad                                                ad, ADLEN,
     44  1.1  riastrad                                                NULL, nonce, firstkey);
     45  1.1  riastrad     if (found_clen != MLEN + crypto_aead_xchacha20poly1305_ietf_abytes()) {
     46  1.1  riastrad         printf("found_clen is not properly set\n");
     47  1.1  riastrad     }
     48  1.1  riastrad     for (i = 0U; i < CLEN; ++i) {
     49  1.1  riastrad         printf(",0x%02x", (unsigned int) c[i]);
     50  1.1  riastrad         if (i % 8 == 7) {
     51  1.1  riastrad             printf("\n");
     52  1.1  riastrad         }
     53  1.1  riastrad     }
     54  1.1  riastrad     printf("\n");
     55  1.1  riastrad     crypto_aead_xchacha20poly1305_ietf_encrypt_detached(detached_c,
     56  1.1  riastrad                                                         mac, &found_maclen,
     57  1.1  riastrad                                                         m, MLEN,
     58  1.1  riastrad                                                         ad, ADLEN,
     59  1.1  riastrad                                                         NULL, nonce, firstkey);
     60  1.1  riastrad     if (found_maclen != crypto_aead_xchacha20poly1305_ietf_abytes()) {
     61  1.1  riastrad         printf("found_maclen is not properly set\n");
     62  1.1  riastrad     }
     63  1.1  riastrad     if (memcmp(detached_c, c, MLEN) != 0) {
     64  1.1  riastrad         printf("detached ciphertext is bogus\n");
     65  1.1  riastrad     }
     66  1.1  riastrad 
     67  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(m2, &m2len, NULL, c, CLEN, ad,
     68  1.1  riastrad                                                    ADLEN, nonce, firstkey) != 0) {
     69  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() failed\n");
     70  1.1  riastrad     }
     71  1.1  riastrad     if (m2len != MLEN) {
     72  1.1  riastrad         printf("m2len is not properly set\n");
     73  1.1  riastrad     }
     74  1.1  riastrad     if (memcmp(m, m2, MLEN) != 0) {
     75  1.1  riastrad         printf("m != m2\n");
     76  1.1  riastrad     }
     77  1.1  riastrad     memset(m2, 0, m2len);
     78  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt_detached(m2, NULL,
     79  1.1  riastrad                                                             c, MLEN, mac,
     80  1.1  riastrad                                                             ad, ADLEN,
     81  1.1  riastrad                                                             nonce, firstkey) != 0) {
     82  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt_detached() failed\n");
     83  1.1  riastrad     }
     84  1.1  riastrad     if (memcmp(m, m2, MLEN) != 0) {
     85  1.1  riastrad         printf("detached m != m2\n");
     86  1.1  riastrad     }
     87  1.1  riastrad 
     88  1.1  riastrad     for (i = 0U; i < CLEN; i++) {
     89  1.1  riastrad         c[i] ^= (i + 1U);
     90  1.1  riastrad         if (crypto_aead_xchacha20poly1305_ietf_decrypt(m2, NULL, NULL, c, CLEN,
     91  1.1  riastrad                                                        ad, ADLEN, nonce, firstkey)
     92  1.1  riastrad             == 0 || memcmp(m, m2, MLEN) == 0) {
     93  1.1  riastrad             printf("message can be forged\n");
     94  1.1  riastrad         }
     95  1.1  riastrad         c[i] ^= (i + 1U);
     96  1.1  riastrad     }
     97  1.1  riastrad     crypto_aead_xchacha20poly1305_ietf_encrypt(c, &found_clen, m, MLEN,
     98  1.1  riastrad                                                NULL, 0U, NULL, nonce, firstkey);
     99  1.1  riastrad     if (found_clen != CLEN) {
    100  1.1  riastrad         printf("clen is not properly set (adlen=0)\n");
    101  1.1  riastrad     }
    102  1.1  riastrad     for (i = 0U; i < CLEN; ++i) {
    103  1.1  riastrad         printf(",0x%02x", (unsigned int) c[i]);
    104  1.1  riastrad         if (i % 8 == 7) {
    105  1.1  riastrad             printf("\n");
    106  1.1  riastrad         }
    107  1.1  riastrad     }
    108  1.1  riastrad     printf("\n");
    109  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(m2, &m2len, NULL, c, CLEN,
    110  1.1  riastrad                                                    NULL, 0U, nonce, firstkey) != 0) {
    111  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() failed (adlen=0)\n");
    112  1.1  riastrad     }
    113  1.1  riastrad     if (m2len != MLEN) {
    114  1.1  riastrad         printf("m2len is not properly set (adlen=0)\n");
    115  1.1  riastrad     }
    116  1.1  riastrad     if (memcmp(m, m2, MLEN) != 0) {
    117  1.1  riastrad         printf("m != m2 (adlen=0)\n");
    118  1.1  riastrad     }
    119  1.1  riastrad     m2len = 1;
    120  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(
    121  1.1  riastrad             m2, &m2len, NULL, NULL,
    122  1.1  riastrad             randombytes_uniform(crypto_aead_xchacha20poly1305_ietf_ABYTES),
    123  1.1  riastrad             NULL, 0U, nonce, firstkey) != -1) {
    124  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() worked with a short "
    125  1.1  riastrad                "ciphertext\n");
    126  1.1  riastrad     }
    127  1.1  riastrad     if (m2len != 0) {
    128  1.1  riastrad         printf("Message length should have been set to zero after a failure\n");
    129  1.1  riastrad     }
    130  1.1  riastrad     m2len = 1;
    131  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(m2, &m2len, NULL, c, 0U, NULL, 0U,
    132  1.1  riastrad                                                   nonce, firstkey) != -1) {
    133  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() worked with an empty "
    134  1.1  riastrad                "ciphertext\n");
    135  1.1  riastrad     }
    136  1.1  riastrad     if (m2len != 0) {
    137  1.1  riastrad         printf("Message length should have been set to zero after a failure\n");
    138  1.1  riastrad     }
    139  1.1  riastrad 
    140  1.1  riastrad     memcpy(c, m, MLEN);
    141  1.1  riastrad     crypto_aead_xchacha20poly1305_ietf_encrypt(c, &found_clen, c, MLEN,
    142  1.1  riastrad                                                NULL, 0U, NULL, nonce, firstkey);
    143  1.1  riastrad     if (found_clen != CLEN) {
    144  1.1  riastrad         printf("clen is not properly set (adlen=0)\n");
    145  1.1  riastrad     }
    146  1.1  riastrad     for (i = 0U; i < CLEN; ++i) {
    147  1.1  riastrad         printf(",0x%02x", (unsigned int) c[i]);
    148  1.1  riastrad         if (i % 8 == 7) {
    149  1.1  riastrad             printf("\n");
    150  1.1  riastrad         }
    151  1.1  riastrad     }
    152  1.1  riastrad     printf("\n");
    153  1.1  riastrad 
    154  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(c, &m2len, NULL, c, CLEN,
    155  1.1  riastrad                                                    NULL, 0U, nonce, firstkey) != 0) {
    156  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() failed (adlen=0)\n");
    157  1.1  riastrad     }
    158  1.1  riastrad     if (m2len != MLEN) {
    159  1.1  riastrad         printf("m2len is not properly set (adlen=0)\n");
    160  1.1  riastrad     }
    161  1.1  riastrad     if (memcmp(m, c, MLEN) != 0) {
    162  1.1  riastrad         printf("m != c (adlen=0)\n");
    163  1.1  riastrad     }
    164  1.1  riastrad 
    165  1.1  riastrad     crypto_aead_xchacha20poly1305_ietf_keygen(key2);
    166  1.1  riastrad     if (crypto_aead_xchacha20poly1305_ietf_decrypt(c, &m2len, NULL, c, CLEN,
    167  1.1  riastrad                                                    NULL, 0U, nonce, key2) == 0) {
    168  1.1  riastrad         printf("crypto_aead_xchacha20poly1305_ietf_decrypt() with a wrong key should have failed\n");
    169  1.1  riastrad     }
    170  1.1  riastrad 
    171  1.1  riastrad     sodium_free(c);
    172  1.1  riastrad     sodium_free(detached_c);
    173  1.1  riastrad     sodium_free(key2);
    174  1.1  riastrad     sodium_free(mac);
    175  1.1  riastrad     sodium_free(m2);
    176  1.1  riastrad     sodium_free(m);
    177  1.1  riastrad 
    178  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_ietf_keybytes() == crypto_aead_xchacha20poly1305_ietf_KEYBYTES);
    179  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_ietf_npubbytes() == crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);
    180  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_ietf_nsecbytes() == 0U);
    181  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_ietf_nsecbytes() == crypto_aead_xchacha20poly1305_ietf_NSECBYTES);
    182  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_ietf_messagebytes_max() == crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX);
    183  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_IETF_KEYBYTES  == crypto_aead_xchacha20poly1305_ietf_KEYBYTES);
    184  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_IETF_NSECBYTES == crypto_aead_xchacha20poly1305_ietf_NSECBYTES);
    185  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_IETF_NPUBBYTES == crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);
    186  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_IETF_ABYTES    == crypto_aead_xchacha20poly1305_ietf_ABYTES);
    187  1.1  riastrad     assert(crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX == crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX);
    188  1.1  riastrad 
    189  1.1  riastrad     return 0;
    190  1.1  riastrad }
    191  1.1  riastrad 
    192  1.1  riastrad int
    193  1.1  riastrad main(void)
    194  1.1  riastrad {
    195  1.1  riastrad     tv();
    196  1.1  riastrad 
    197  1.1  riastrad     return 0;
    198  1.1  riastrad }
    199