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
main(void)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