Remove error string from sodium_misuse()

Returning the name of an internal function to bindings is useless.

They need way more context to recover from these errors, and
their own backtrace will be way more useful for diagnostics.
This commit is contained in:
Frank Denis
2017-07-19 00:57:19 +02:00
parent 9361070f96
commit 8b9b6a54be
18 changed files with 66 additions and 66 deletions
@@ -525,7 +525,7 @@ crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c,
(void) nsec;
memcpy(H, ctx->H, sizeof H);
if (mlen > 16ULL * ((1ULL << 32) - 2)) {
sodium_misuse("crypto_aead_aes256gcm_encrypt_detached_afternm(): message too long"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
memcpy(&n2[0], npub, 3 * 4);
n2[3] = 0x01000000;
@@ -663,7 +663,7 @@ crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, unsigned char *
(void) nsec;
if (clen > 16ULL * (1ULL << 32)) {
sodium_misuse("crypto_aead_aes256gcm_decrypt_detached_afternm(): ciphertext too long"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
mlen = clen;
@@ -71,7 +71,7 @@ crypto_aead_chacha20poly1305_encrypt(unsigned char *c,
int ret;
if (mlen > UINT64_MAX - crypto_aead_chacha20poly1305_ABYTES) {
sodium_misuse("crypto_aead_chacha20poly1305_encrypt(): message too long");
sodium_misuse();
}
ret = crypto_aead_chacha20poly1305_encrypt_detached(c,
c + mlen, NULL,
@@ -146,7 +146,7 @@ crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c,
int ret;
if (mlen > UINT64_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES) {
sodium_misuse("crypto_aead_chacha20poly1305_ietf_encrypt(): message too long");
sodium_misuse();
}
ret = crypto_aead_chacha20poly1305_ietf_encrypt_detached(c,
c + mlen, NULL,
@@ -54,7 +54,7 @@ crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c,
int ret;
if (mlen > UINT64_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) {
sodium_misuse("crypto_aead_xchacha20poly1305_ietf_encrypt(): message too long");
sodium_misuse();
}
ret = crypto_aead_xchacha20poly1305_ietf_encrypt_detached
(c, c + mlen, NULL, m, mlen, ad, adlen, nsec, npub, k);
@@ -192,7 +192,7 @@ blake2b_init(blake2b_state *S, const uint8_t outlen)
blake2b_param P[1];
if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) {
sodium_misuse("blake2b_init(): unsupported output length");
sodium_misuse();
}
P->digest_length = outlen;
P->key_length = 0;
@@ -215,7 +215,7 @@ blake2b_init_salt_personal(blake2b_state *S, const uint8_t outlen,
blake2b_param P[1];
if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) {
sodium_misuse("blake2b_init_salt_personal(): unsupported output length");
sodium_misuse();
}
P->digest_length = outlen;
P->key_length = 0;
@@ -246,10 +246,10 @@ blake2b_init_key(blake2b_state *S, const uint8_t outlen, const void *key,
blake2b_param P[1];
if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) {
sodium_misuse("blake2b_init_key(): unsupported output length");
sodium_misuse();
}
if (!key || !keylen || keylen > BLAKE2B_KEYBYTES) {
sodium_misuse("blake2b_init_key(): unsupported key length");
sodium_misuse();
}
P->digest_length = outlen;
P->key_length = keylen;
@@ -264,7 +264,7 @@ blake2b_init_key(blake2b_state *S, const uint8_t outlen, const void *key,
memset(P->personal, 0, sizeof(P->personal));
if (blake2b_init_param(S, P) < 0) {
sodium_misuse("blake2b_init_key(): invalid parameters");
sodium_misuse();
}
{
uint8_t block[BLAKE2B_BLOCKBYTES];
@@ -284,10 +284,10 @@ blake2b_init_key_salt_personal(blake2b_state *S, const uint8_t outlen,
blake2b_param P[1];
if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) {
sodium_misuse("blake2b_init_key_salt_personal(): unsupported output length");
sodium_misuse();
}
if (!key || !keylen || keylen > BLAKE2B_KEYBYTES) {
sodium_misuse("blake2b_init_key_salt_personal(): unsupported key length");
sodium_misuse();
}
P->digest_length = outlen;
P->key_length = keylen;
@@ -310,7 +310,7 @@ blake2b_init_key_salt_personal(blake2b_state *S, const uint8_t outlen,
}
if (blake2b_init_param(S, P) < 0) {
sodium_misuse("blake2b_init_key_salt_personal(): invalid parameters");
sodium_misuse();
}
{
uint8_t block[BLAKE2B_BLOCKBYTES];
@@ -356,7 +356,7 @@ int
blake2b_final(blake2b_state *S, uint8_t *out, uint8_t outlen)
{
if (!outlen || outlen > BLAKE2B_OUTBYTES) {
sodium_misuse("blake2b_final(): unsupported output length");
sodium_misuse();
}
if (blake2b_is_lastblock(S)) {
return -1;
@@ -403,27 +403,27 @@ blake2b(uint8_t *out, const void *in, const void *key, const uint8_t outlen,
/* Verify parameters */
if (NULL == in && inlen > 0) {
sodium_misuse("blake2b(): NULL input, but length > 0");
sodium_misuse();
}
if (NULL == out) {
sodium_misuse("blake2b(): NULL output pointer");
sodium_misuse();
}
if (!outlen || outlen > BLAKE2B_OUTBYTES) {
sodium_misuse("blake2b(): unsupported output length");
sodium_misuse();
}
if (NULL == key && keylen > 0) {
sodium_misuse("blake2b(): NULL key, but key length > 0");
sodium_misuse();
}
if (keylen > BLAKE2B_KEYBYTES) {
sodium_misuse("blake2b(): unsupported key length");
sodium_misuse();
}
if (keylen > 0) {
if (blake2b_init_key(S, outlen, key, keylen) < 0) {
sodium_misuse("blake2b(): invalid parameters");
sodium_misuse();
}
} else {
if (blake2b_init(S, outlen) < 0) {
sodium_misuse("blake2b(): invalid parameters");
sodium_misuse();
}
}
@@ -441,28 +441,28 @@ blake2b_salt_personal(uint8_t *out, const void *in, const void *key,
/* Verify parameters */
if (NULL == in && inlen > 0) {
sodium_misuse("blake2b_salt_personal(): NULL input, but length > 0");
sodium_misuse();
}
if (NULL == out) {
sodium_misuse("blake2b_salt_personal(): NULL output pointer");
sodium_misuse();
}
if (!outlen || outlen > BLAKE2B_OUTBYTES) {
sodium_misuse("blake2b_salt_personal(): unsupported output length");
sodium_misuse();
}
if (NULL == key && keylen > 0) {
sodium_misuse("blake2b_salt_personal(): NULL key, but key length > 0");
sodium_misuse();
}
if (keylen > BLAKE2B_KEYBYTES) {
sodium_misuse("blake2b_salt_personal(): unsupported key length");
sodium_misuse();
}
if (keylen > 0) {
if (blake2b_init_key_salt_personal(S, outlen, key, keylen, salt,
personal) < 0) {
sodium_misuse("blake2b_salt_personal(): invalid parameters");
sodium_misuse();
}
} else {
if (blake2b_init_salt_personal(S, outlen, salt, personal) < 0) {
sodium_misuse("blake2b_salt_personal(): invalid parameters");
sodium_misuse();
}
}
+2 -2
View File
@@ -49,7 +49,7 @@ crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES],
tx = rx;
}
if (rx == NULL) {
sodium_misuse("crypto_kx_client_session_keys(): no pointers given"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
if (crypto_scalarmult(q, client_sk, server_pk) != 0) {
return -1;
@@ -90,7 +90,7 @@ crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES],
tx = rx;
}
if (rx == NULL) {
sodium_misuse("crypto_kx_server_session_keys(): no pointers given"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
if (crypto_scalarmult(q, server_sk, client_pk) != 0) {
return -1;
@@ -57,7 +57,7 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt,
#if SIZE_MAX > 0x1fffffffe0ULL
if (dkLen > 0x1fffffffe0ULL) {
sodium_misuse("PBKDF2_SHA256(): derived key length is too large"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#endif
crypto_auth_hmacsha256_init(&PShctx, passwd, passwdlen);
@@ -78,7 +78,7 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
return; /* LCOV_EXCL_LINE */
}
if (bytes > 64ULL * (1ULL << 32) - 64ULL) {
sodium_misuse("chacha20_encrypt_bytes(): message too long");
sodium_misuse();
}
# include "u8.h"
# include "u4.h"
@@ -73,7 +73,7 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
return; /* LCOV_EXCL_LINE */
}
if (bytes > 64ULL * (1ULL << 32) - 64ULL) {
sodium_misuse("chacha20_encrypt_bytes(): message too long");
sodium_misuse();
}
# include "u4.h"
# include "u1.h"
@@ -93,7 +93,7 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
return; /* LCOV_EXCL_LINE */
}
if (bytes > 64ULL * (1ULL << 32) - 64ULL) {
sodium_misuse("chacha20_encrypt_bytes(): message too long");
sodium_misuse();
}
j0 = ctx->input[0];
j1 = ctx->input[1];
+2 -2
View File
@@ -15,10 +15,10 @@ int sodium_init(void)
/* ---- */
SODIUM_EXPORT
int sodium_set_misuse_handler(void (*handler)(const char *err));
int sodium_set_misuse_handler(void (*handler)(void));
SODIUM_EXPORT
void sodium_misuse(const char *err)
void sodium_misuse(void)
__attribute__ ((noreturn));
#ifdef __cplusplus
@@ -21,12 +21,12 @@ randombytes_nativeclient_buf(void * const buf, const size_t size)
if (nacl_interface_query(NACL_IRT_RANDOM_v0_1, &rand_intf,
sizeof rand_intf) != sizeof rand_intf) {
sodium_misuse("randombytes_nativeclient_buf(): NaCl IRT_RANDOM API failed");
sodium_misuse();
}
while (toread > (size_t) 0U) {
if (rand_intf.get_random_bytes(buf_, size, &readnb) != 0 ||
readnb > size) {
sodium_misuse("randombytes_nativeclient_buf(): NaCl IRT_RANDOM API didn't return the correct amount of bytes");
sodium_misuse();
}
toread -= readnb;
buf_ += readnb;
+1 -1
View File
@@ -173,7 +173,7 @@ randombytes_buf_deterministic(void * const buf, const size_t size,
COMPILER_ASSERT(randombytes_SEEDBYTES == crypto_stream_chacha20_ietf_KEYBYTES);
#if SIZE_MAX > 0x4000000000ULL
if (size > 0x4000000000ULL) {
sodium_misuse("randombytes_buf_deterministic(): length shouldn't exceed 0x4000000000");
sodium_misuse();
}
#endif
crypto_stream_chacha20_ietf((unsigned char *) buf, (unsigned long long) size,
@@ -99,7 +99,7 @@ sodium_hrtime(void)
struct timeval tv;
if (gettimeofday(&tv, NULL) != 0) {
sodium_misuse("sodium_hrtime(): gettimeofday() failed"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
ts = ((uint64_t) tv.tv_sec) * 1000000U + (uint64_t) tv.tv_usec;
}
@@ -278,7 +278,7 @@ randombytes_salsa20_random_init(void)
if ((stream.random_data_source_fd =
randombytes_salsa20_random_random_dev_open()) == -1) {
sodium_misuse("randombytes_salsa20_random_init(): unable to open the random device"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
errno = errno_save;
# endif /* HAVE_SAFE_ARC4RANDOM */
@@ -332,24 +332,24 @@ randombytes_salsa20_random_stir(void)
# elif defined(SYS_getrandom) && defined(__NR_getrandom)
if (stream.getrandom_available != 0) {
if (randombytes_linux_getrandom(m0, sizeof m0) != 0) {
sodium_misuse("randombytes_salsa20_random_stir(): linux getrandom() failed"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
} else if (stream.random_data_source_fd == -1 ||
safe_read(stream.random_data_source_fd, m0,
sizeof m0) != (ssize_t) sizeof m0) {
sodium_misuse("randombytes_salsa20_random_stir(): unable to read from the random device"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
# else
if (stream.random_data_source_fd == -1 ||
safe_read(stream.random_data_source_fd, m0,
sizeof m0) != (ssize_t) sizeof m0) {
sodium_misuse("randombytes_salsa20_random_stir(): unable to read from the random device"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
# endif
#else /* _WIN32 */
if (! RtlGenRandom((PVOID) m0, (ULONG) sizeof m0)) {
sodium_misuse("randombytes_salsa20_random_stir(): RtlGenRandom() failed"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#endif
if (crypto_generichash(stream.key, sizeof stream.key, k0, sizeof_k0,
@@ -371,7 +371,7 @@ randombytes_salsa20_random_stir_if_needed(void)
if (stream.initialized == 0) {
randombytes_salsa20_random_stir();
} else if (stream.pid != getpid()) {
sodium_misuse("randombytes_salsa20_random_stir_if_needed(): stirring is required after fork()"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#else
if (stream.initialized == 0) {
@@ -254,7 +254,7 @@ randombytes_sysrandom_init(void)
if ((stream.random_data_source_fd =
randombytes_sysrandom_random_dev_open()) == -1) {
sodium_misuse("randombytes_sysrandom_init(): unable to open the random device"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
errno = errno_save;
}
@@ -324,21 +324,21 @@ randombytes_sysrandom_buf(void * const buf, const size_t size)
# if defined(SYS_getrandom) && defined(__NR_getrandom)
if (stream.getrandom_available != 0) {
if (randombytes_linux_getrandom(buf, size) != 0) {
sodium_misuse("randombytes_sysrandom_buf(): linux getrandom() failed"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
return;
}
# endif
if (stream.random_data_source_fd == -1 ||
safe_read(stream.random_data_source_fd, buf, size) != (ssize_t) size) {
sodium_misuse("randombytes_sysrandom_buf(): unable to read the random device"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#else
if (size > (size_t) 0xffffffff) {
sodium_misuse("randombytes_sysrandom_buf(): cannot read more than 0xffffffff bytes at a time"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
if (! RtlGenRandom((PVOID) buf, (ULONG) size)) {
sodium_misuse("randombytes_sysrandom_buf(): RtlGenRandom() failed"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#endif
}
+5 -5
View File
@@ -171,24 +171,24 @@ sodium_crit_leave(void)
#endif
static void (*_misuse_handler)(const char *err);
static void (*_misuse_handler)(void);
void
sodium_misuse(const char *err)
sodium_misuse(void)
{
void (*handler)(const char *err);
void (*handler)(void);
if (sodium_crit_enter() == 0) {
handler = _misuse_handler;
if (sodium_crit_leave() == 0 && handler != NULL) {
handler(err);
handler();
}
}
abort();
}
int
sodium_set_misuse_handler(void (*handler)(const char *err))
sodium_set_misuse_handler(void (*handler)(void))
{
if (sodium_crit_enter() != 0) {
return -1; /* LCOV_EXCL_LINE */
+5 -5
View File
@@ -80,7 +80,7 @@ sodium_memzero(void *const pnt, const size_t len)
SecureZeroMemory(pnt, len);
#elif defined(HAVE_MEMSET_S)
if (len > 0U && memset_s(pnt, (rsize_t) len, 0, (rsize_t) len) != 0) {
sodium_misuse("sodium_memzero(): length is more than RSIZE_MAX"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#elif defined(HAVE_EXPLICIT_BZERO)
explicit_bzero(pnt, len);
@@ -301,7 +301,7 @@ sodium_bin2hex(char *const hex, const size_t hex_maxlen,
int c;
if (bin_len >= SIZE_MAX / 2 || hex_maxlen <= bin_len * 2U) {
sodium_misuse("sodium_bin2hex(): invalid length"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
while (i < bin_len) {
c = bin[i] & 0xf;
@@ -388,7 +388,7 @@ _sodium_alloc_init(void)
page_size = (size_t) si.dwPageSize;
# endif
if (page_size < CANARY_SIZE || page_size < sizeof(size_t)) {
sodium_misuse("_sodium_alloc_init(): page size is smaller than the canary size"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
#endif
randombytes_buf(canary, sizeof canary);
@@ -540,7 +540,7 @@ _unprotected_ptr_from_user_ptr(void *const ptr)
page_mask = page_size - 1U;
unprotected_ptr_u = ((uintptr_t) canary_ptr & (uintptr_t) ~page_mask);
if (unprotected_ptr_u <= page_size * 2U) {
sodium_misuse("_unprotected_ptr_from_user_ptr(): invalid pointer (too low)"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
return (unsigned char *) unprotected_ptr_u;
}
@@ -570,7 +570,7 @@ _sodium_malloc(const size_t size)
return NULL;
}
if (page_size <= sizeof canary || page_size < sizeof unprotected_size) {
sodium_misuse("_sodium_malloc(): page size too small"); /* LCOV_EXCL_LINE */
sodium_misuse(); /* LCOV_EXCL_LINE */
}
size_with_canary = (sizeof canary) + size;
unprotected_size = _page_round(size_with_canary);
+4 -4
View File
@@ -3,9 +3,9 @@
#include "cmptest.h"
static void
misuse_handler(const char *err)
misuse_handler(void)
{
printf("misuse_handler(): [%s]\n", err);
printf("misuse_handler()\n");
exit(0);
}
@@ -16,7 +16,7 @@ main(void)
sodium_set_misuse_handler(misuse_handler);
sodium_set_misuse_handler(NULL);
printf("%d\n", sodium_init());
assert(sodium_init() == 1);
(void) sodium_runtime_has_neon();
(void) sodium_runtime_has_sse2();
@@ -27,7 +27,7 @@ main(void)
(void) sodium_runtime_has_aesni();
sodium_set_misuse_handler(misuse_handler);
sodium_misuse("TEST");
sodium_misuse();
printf("Misuse handler returned\n");
return 0;
+1 -1
View File
@@ -1 +1 @@
1
misuse_handler()