Home | History | Annotate | Line # | Download | only in default
      1  1.1  riastrad 
      2  1.1  riastrad #define TEST_NAME "box_easy2"
      3  1.1  riastrad #include "cmptest.h"
      4  1.1  riastrad 
      5  1.1  riastrad static const unsigned char small_order_p[crypto_box_PUBLICKEYBYTES] = {
      6  1.1  riastrad     0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3,
      7  1.1  riastrad     0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32,
      8  1.1  riastrad     0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00
      9  1.1  riastrad };
     10  1.1  riastrad 
     11  1.1  riastrad int
     12  1.1  riastrad main(void)
     13  1.1  riastrad {
     14  1.1  riastrad     unsigned char *alicepk;
     15  1.1  riastrad     unsigned char *alicesk;
     16  1.1  riastrad     unsigned char *bobpk;
     17  1.1  riastrad     unsigned char *bobsk;
     18  1.1  riastrad     unsigned char *mac;
     19  1.1  riastrad     unsigned char *nonce;
     20  1.1  riastrad     unsigned char *k1;
     21  1.1  riastrad     unsigned char *k2;
     22  1.1  riastrad     unsigned char *m;
     23  1.1  riastrad     unsigned char *m2;
     24  1.1  riastrad     unsigned char *c;
     25  1.1  riastrad     size_t         mlen;
     26  1.1  riastrad     size_t         i;
     27  1.1  riastrad     size_t         m_size;
     28  1.1  riastrad     size_t         m2_size;
     29  1.1  riastrad     size_t         c_size;
     30  1.1  riastrad     int            ret;
     31  1.1  riastrad 
     32  1.1  riastrad     m2_size = m_size = 7U + randombytes_uniform(1000);
     33  1.1  riastrad     c_size           = crypto_box_MACBYTES + m_size;
     34  1.1  riastrad     m                = (unsigned char *) sodium_malloc(m_size);
     35  1.1  riastrad     m2               = (unsigned char *) sodium_malloc(m2_size);
     36  1.1  riastrad     c                = (unsigned char *) sodium_malloc(c_size);
     37  1.1  riastrad     alicepk = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);
     38  1.1  riastrad     alicesk = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);
     39  1.1  riastrad     bobpk   = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);
     40  1.1  riastrad     bobsk   = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);
     41  1.1  riastrad     mac     = (unsigned char *) sodium_malloc(crypto_box_MACBYTES);
     42  1.1  riastrad     nonce   = (unsigned char *) sodium_malloc(crypto_box_NONCEBYTES);
     43  1.1  riastrad     k1      = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);
     44  1.1  riastrad     k2      = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);
     45  1.1  riastrad     crypto_box_keypair(alicepk, alicesk);
     46  1.1  riastrad     crypto_box_keypair(bobpk, bobsk);
     47  1.1  riastrad     mlen = (size_t) randombytes_uniform((uint32_t) m_size) + 1U;
     48  1.1  riastrad     randombytes_buf(m, mlen);
     49  1.1  riastrad     randombytes_buf(nonce, crypto_box_NONCEBYTES);
     50  1.1  riastrad     ret = crypto_box_easy(c, m, mlen, nonce, bobpk, alicesk);
     51  1.1  riastrad     assert(ret == 0);
     52  1.1  riastrad     if (crypto_box_open_easy(m2, c,
     53  1.1  riastrad                              (unsigned long long) mlen + crypto_box_MACBYTES,
     54  1.1  riastrad                              nonce, alicepk, bobsk) != 0) {
     55  1.1  riastrad         printf("open() failed");
     56  1.1  riastrad         return 1;
     57  1.1  riastrad     }
     58  1.1  riastrad     printf("%d\n", memcmp(m, m2, mlen));
     59  1.1  riastrad 
     60  1.1  riastrad     for (i = 0; i < mlen + crypto_box_MACBYTES - 1; i++) {
     61  1.1  riastrad         if (crypto_box_open_easy(m2, c, (unsigned long long) i, nonce, alicepk,
     62  1.1  riastrad                                  bobsk) == 0) {
     63  1.1  riastrad             printf("short open() should have failed");
     64  1.1  riastrad             return 1;
     65  1.1  riastrad         }
     66  1.1  riastrad     }
     67  1.1  riastrad     memcpy(c, m, mlen);
     68  1.1  riastrad     ret =
     69  1.1  riastrad         crypto_box_easy(c, c, (unsigned long long) mlen, nonce, bobpk, alicesk);
     70  1.1  riastrad     assert(ret == 0);
     71  1.1  riastrad     printf("%d\n", memcmp(m, c, mlen) == 0);
     72  1.1  riastrad     printf("%d\n", memcmp(m, c + crypto_box_MACBYTES, mlen) == 0);
     73  1.1  riastrad     if (crypto_box_open_easy(c, c,
     74  1.1  riastrad                              (unsigned long long) mlen + crypto_box_MACBYTES,
     75  1.1  riastrad                              nonce, alicepk, bobsk) != 0) {
     76  1.1  riastrad         printf("crypto_box_open_easy() failed\n");
     77  1.1  riastrad     }
     78  1.1  riastrad 
     79  1.1  riastrad     ret = crypto_box_beforenm(k1, small_order_p, bobsk);
     80  1.1  riastrad     assert(ret == -1);
     81  1.1  riastrad     ret = crypto_box_beforenm(k2, small_order_p, alicesk);
     82  1.1  riastrad     assert(ret == -1);
     83  1.1  riastrad 
     84  1.1  riastrad     ret = crypto_box_beforenm(k1, alicepk, bobsk);
     85  1.1  riastrad     assert(ret == 0);
     86  1.1  riastrad     ret = crypto_box_beforenm(k2, bobpk, alicesk);
     87  1.1  riastrad     assert(ret == 0);
     88  1.1  riastrad 
     89  1.1  riastrad     memset(m2, 0, m2_size);
     90  1.1  riastrad 
     91  1.1  riastrad     if (crypto_box_easy_afternm(c, m, 0, nonce, k1) != 0) {
     92  1.1  riastrad         printf(
     93  1.1  riastrad             "crypto_box_easy_afternm() with a null ciphertext should have "
     94  1.1  riastrad             "worked\n");
     95  1.1  riastrad     }
     96  1.1  riastrad     crypto_box_easy_afternm(c, m, (unsigned long long) mlen, nonce, k1);
     97  1.1  riastrad     if (crypto_box_open_easy_afternm(
     98  1.1  riastrad             m2, c, (unsigned long long) mlen + crypto_box_MACBYTES, nonce,
     99  1.1  riastrad             k2) != 0) {
    100  1.1  riastrad         printf("crypto_box_open_easy_afternm() failed\n");
    101  1.1  riastrad     }
    102  1.1  riastrad     printf("%d\n", memcmp(m, m2, mlen));
    103  1.1  riastrad     if (crypto_box_open_easy_afternm(m2, c, crypto_box_MACBYTES - 1U, nonce,
    104  1.1  riastrad                                      k2) == 0) {
    105  1.1  riastrad         printf(
    106  1.1  riastrad             "crypto_box_open_easy_afternm() with a huge ciphertext should have "
    107  1.1  riastrad             "failed\n");
    108  1.1  riastrad     }
    109  1.1  riastrad     memset(m2, 0, m2_size);
    110  1.1  riastrad     ret = crypto_box_detached(c, mac, m, (unsigned long long) mlen, nonce,
    111  1.1  riastrad                               small_order_p, bobsk);
    112  1.1  riastrad     assert(ret == -1);
    113  1.1  riastrad     ret = crypto_box_detached(c, mac, m, (unsigned long long) mlen, nonce,
    114  1.1  riastrad                               alicepk, bobsk);
    115  1.1  riastrad     assert(ret == 0);
    116  1.1  riastrad     if (crypto_box_open_detached(m2, c, mac, (unsigned long long) mlen, nonce,
    117  1.1  riastrad                                  small_order_p, alicesk) != -1) {
    118  1.1  riastrad         printf("crypto_box_open_detached() with a weak key passed\n");
    119  1.1  riastrad     }
    120  1.1  riastrad     if (crypto_box_open_detached(m2, c, mac, (unsigned long long) mlen, nonce,
    121  1.1  riastrad                                  bobpk, alicesk) != 0) {
    122  1.1  riastrad         printf("crypto_box_open_detached() failed\n");
    123  1.1  riastrad     }
    124  1.1  riastrad     printf("%d\n", memcmp(m, m2, mlen));
    125  1.1  riastrad 
    126  1.1  riastrad     memset(m2, 0, m2_size);
    127  1.1  riastrad     crypto_box_detached_afternm(c, mac, m, (unsigned long long) mlen, nonce,
    128  1.1  riastrad                                 k1);
    129  1.1  riastrad     if (crypto_box_open_detached_afternm(m2, c, mac, (unsigned long long) mlen,
    130  1.1  riastrad                                          nonce, k2) != 0) {
    131  1.1  riastrad         printf("crypto_box_open_detached_afternm() failed\n");
    132  1.1  riastrad     }
    133  1.1  riastrad     printf("%d\n", memcmp(m, m2, mlen));
    134  1.1  riastrad 
    135  1.1  riastrad     sodium_free(alicepk);
    136  1.1  riastrad     sodium_free(alicesk);
    137  1.1  riastrad     sodium_free(bobpk);
    138  1.1  riastrad     sodium_free(bobsk);
    139  1.1  riastrad     sodium_free(mac);
    140  1.1  riastrad     sodium_free(nonce);
    141  1.1  riastrad     sodium_free(k1);
    142  1.1  riastrad     sodium_free(k2);
    143  1.1  riastrad     sodium_free(m);
    144  1.1  riastrad     sodium_free(m2);
    145  1.1  riastrad     sodium_free(c);
    146  1.1  riastrad     printf("OK\n");
    147  1.1  riastrad 
    148  1.1  riastrad     return 0;
    149  1.1  riastrad }
    150