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