1*33772c1eSriastradh 
2*33772c1eSriastradh #include <limits.h>
3*33772c1eSriastradh #include <stdint.h>
4*33772c1eSriastradh #include <stdlib.h>
5*33772c1eSriastradh 
6*33772c1eSriastradh #include "core.h"
7*33772c1eSriastradh #include "crypto_box.h"
8*33772c1eSriastradh #include "crypto_secretbox.h"
9*33772c1eSriastradh #include "private/common.h"
10*33772c1eSriastradh #include "utils.h"
11*33772c1eSriastradh 
12*33772c1eSriastradh int
crypto_box_detached_afternm(unsigned char * c,unsigned char * mac,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * k)13*33772c1eSriastradh crypto_box_detached_afternm(unsigned char *c, unsigned char *mac,
14*33772c1eSriastradh                             const unsigned char *m, unsigned long long mlen,
15*33772c1eSriastradh                             const unsigned char *n, const unsigned char *k)
16*33772c1eSriastradh {
17*33772c1eSriastradh     return crypto_secretbox_detached(c, mac, m, mlen, n, k);
18*33772c1eSriastradh }
19*33772c1eSriastradh 
20*33772c1eSriastradh int
crypto_box_detached(unsigned char * c,unsigned char * mac,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * pk,const unsigned char * sk)21*33772c1eSriastradh crypto_box_detached(unsigned char *c, unsigned char *mac,
22*33772c1eSriastradh                     const unsigned char *m, unsigned long long mlen,
23*33772c1eSriastradh                     const unsigned char *n, const unsigned char *pk,
24*33772c1eSriastradh                     const unsigned char *sk)
25*33772c1eSriastradh {
26*33772c1eSriastradh     unsigned char k[crypto_box_BEFORENMBYTES];
27*33772c1eSriastradh     int           ret;
28*33772c1eSriastradh 
29*33772c1eSriastradh     COMPILER_ASSERT(crypto_box_BEFORENMBYTES >= crypto_secretbox_KEYBYTES);
30*33772c1eSriastradh     if (crypto_box_beforenm(k, pk, sk) != 0) {
31*33772c1eSriastradh         return -1;
32*33772c1eSriastradh     }
33*33772c1eSriastradh     ret = crypto_box_detached_afternm(c, mac, m, mlen, n, k);
34*33772c1eSriastradh     sodium_memzero(k, sizeof k);
35*33772c1eSriastradh 
36*33772c1eSriastradh     return ret;
37*33772c1eSriastradh }
38*33772c1eSriastradh 
39*33772c1eSriastradh int
crypto_box_easy_afternm(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * k)40*33772c1eSriastradh crypto_box_easy_afternm(unsigned char *c, const unsigned char *m,
41*33772c1eSriastradh                         unsigned long long mlen, const unsigned char *n,
42*33772c1eSriastradh                         const unsigned char *k)
43*33772c1eSriastradh {
44*33772c1eSriastradh     if (mlen > crypto_box_MESSAGEBYTES_MAX) {
45*33772c1eSriastradh         sodium_misuse();
46*33772c1eSriastradh     }
47*33772c1eSriastradh     return crypto_box_detached_afternm(c + crypto_box_MACBYTES, c, m, mlen, n,
48*33772c1eSriastradh                                        k);
49*33772c1eSriastradh }
50*33772c1eSriastradh 
51*33772c1eSriastradh int
crypto_box_easy(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * pk,const unsigned char * sk)52*33772c1eSriastradh crypto_box_easy(unsigned char *c, const unsigned char *m,
53*33772c1eSriastradh                 unsigned long long mlen, const unsigned char *n,
54*33772c1eSriastradh                 const unsigned char *pk, const unsigned char *sk)
55*33772c1eSriastradh {
56*33772c1eSriastradh     if (mlen > crypto_box_MESSAGEBYTES_MAX) {
57*33772c1eSriastradh         sodium_misuse();
58*33772c1eSriastradh     }
59*33772c1eSriastradh     return crypto_box_detached(c + crypto_box_MACBYTES, c, m, mlen, n,
60*33772c1eSriastradh                                pk, sk);
61*33772c1eSriastradh }
62*33772c1eSriastradh 
63*33772c1eSriastradh int
crypto_box_open_detached_afternm(unsigned char * m,const unsigned char * c,const unsigned char * mac,unsigned long long clen,const unsigned char * n,const unsigned char * k)64*33772c1eSriastradh crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c,
65*33772c1eSriastradh                                  const unsigned char *mac,
66*33772c1eSriastradh                                  unsigned long long clen,
67*33772c1eSriastradh                                  const unsigned char *n,
68*33772c1eSriastradh                                  const unsigned char *k)
69*33772c1eSriastradh {
70*33772c1eSriastradh     return crypto_secretbox_open_detached(m, c, mac, clen, n, k);
71*33772c1eSriastradh }
72*33772c1eSriastradh 
73*33772c1eSriastradh int
crypto_box_open_detached(unsigned char * m,const unsigned char * c,const unsigned char * mac,unsigned long long clen,const unsigned char * n,const unsigned char * pk,const unsigned char * sk)74*33772c1eSriastradh crypto_box_open_detached(unsigned char *m, const unsigned char *c,
75*33772c1eSriastradh                          const unsigned char *mac,
76*33772c1eSriastradh                          unsigned long long clen, const unsigned char *n,
77*33772c1eSriastradh                          const unsigned char *pk, const unsigned char *sk)
78*33772c1eSriastradh {
79*33772c1eSriastradh     unsigned char k[crypto_box_BEFORENMBYTES];
80*33772c1eSriastradh     int           ret;
81*33772c1eSriastradh 
82*33772c1eSriastradh     if (crypto_box_beforenm(k, pk, sk) != 0) {
83*33772c1eSriastradh         return -1;
84*33772c1eSriastradh     }
85*33772c1eSriastradh     ret = crypto_box_open_detached_afternm(m, c, mac, clen, n, k);
86*33772c1eSriastradh     sodium_memzero(k, sizeof k);
87*33772c1eSriastradh 
88*33772c1eSriastradh     return ret;
89*33772c1eSriastradh }
90*33772c1eSriastradh 
91*33772c1eSriastradh int
crypto_box_open_easy_afternm(unsigned char * m,const unsigned char * c,unsigned long long clen,const unsigned char * n,const unsigned char * k)92*33772c1eSriastradh crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c,
93*33772c1eSriastradh                              unsigned long long clen, const unsigned char *n,
94*33772c1eSriastradh                              const unsigned char *k)
95*33772c1eSriastradh {
96*33772c1eSriastradh     if (clen < crypto_box_MACBYTES) {
97*33772c1eSriastradh         return -1;
98*33772c1eSriastradh     }
99*33772c1eSriastradh     return crypto_box_open_detached_afternm(m, c + crypto_box_MACBYTES, c,
100*33772c1eSriastradh                                             clen - crypto_box_MACBYTES,
101*33772c1eSriastradh                                             n, k);
102*33772c1eSriastradh }
103*33772c1eSriastradh 
104*33772c1eSriastradh int
crypto_box_open_easy(unsigned char * m,const unsigned char * c,unsigned long long clen,const unsigned char * n,const unsigned char * pk,const unsigned char * sk)105*33772c1eSriastradh crypto_box_open_easy(unsigned char *m, const unsigned char *c,
106*33772c1eSriastradh                      unsigned long long clen, const unsigned char *n,
107*33772c1eSriastradh                      const unsigned char *pk, const unsigned char *sk)
108*33772c1eSriastradh {
109*33772c1eSriastradh     if (clen < crypto_box_MACBYTES) {
110*33772c1eSriastradh         return -1;
111*33772c1eSriastradh     }
112*33772c1eSriastradh     return crypto_box_open_detached(m, c + crypto_box_MACBYTES, c,
113*33772c1eSriastradh                                     clen - crypto_box_MACBYTES,
114*33772c1eSriastradh                                     n, pk, sk);
115*33772c1eSriastradh }
116