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