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