int main(void) { size_t i; crypto_secretbox_easy(c, m, 131, nonce, firstkey); for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } printf("\n"); crypto_secretbox_detached(c, mac, m, 131, nonce, firstkey); for (i = 0; i < crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)mac[i]); if (i % 8 == 7) printf("\n"); } for (i = 0; i < 131; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } return 0; }
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) { unsigned char k[crypto_box_BEFORENMBYTES]; int ret; (void) sizeof(int[crypto_box_BEFORENMBYTES >= crypto_secretbox_KEYBYTES ? 1 : -1]); crypto_box_beforenm(k, pk, sk); ret = crypto_secretbox_detached(c, mac, m, mlen, n, k); sodium_memzero(k, sizeof k); return ret; }
int main(void) { unsigned char *c; unsigned char *mac; size_t i; c = (unsigned char *) sodium_malloc(131 + crypto_secretbox_MACBYTES + 1); mac = (unsigned char *) sodium_malloc(crypto_secretbox_MACBYTES); assert(c != NULL && mac != NULL); crypto_secretbox_easy(c, m, 131, nonce, firstkey); for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } printf("\n"); crypto_secretbox_detached(c, mac, m, 131, nonce, firstkey); for (i = 0; i < crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)mac[i]); if (i % 8 == 7) printf("\n"); } for (i = 0; i < 131; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } printf("\n"); /* Same test, with c and m overlapping */ memcpy(c + 1, m, 131); crypto_secretbox_easy(c, c + 1, 131, nonce, firstkey); for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } printf("\n"); memcpy(c, m, 131); crypto_secretbox_easy(c + 1, c, 131, nonce, firstkey); for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)c[i + 1]); if (i % 8 == 7) printf("\n"); } printf("\n"); memcpy(c, m, 131); crypto_secretbox_easy(c, c, 131, nonce, firstkey); for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) { printf(",0x%02x", (unsigned int)c[i]); if (i % 8 == 7) printf("\n"); } printf("\n"); assert(crypto_secretbox_easy(c, m, SIZE_MAX - 1U, nonce, firstkey) == -1); sodium_free(mac); sodium_free(c); return 0; }