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