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