From cae09d458a4509614c6cdb32e93ab2f6263c18ce Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 28 Dec 2014 21:34:59 +0100 Subject: [PATCH] Let crypto_sign_open() accept NULL for the message length pointer Ditto for edwards25519sha512batch for consistency Add a _p suffix to lengths that are actually pointers for clarity --- src/libsodium/crypto_sign/crypto_sign.c | 12 ++++++------ .../crypto_sign/ed25519/ref10/open.c | 19 +++++++++++++------ .../crypto_sign/ed25519/ref10/sign.c | 16 ++++++++-------- .../ref/sign_edwards25519sha512batch.c | 16 ++++++++++------ src/libsodium/include/sodium/crypto_sign.h | 6 +++--- .../include/sodium/crypto_sign_ed25519.h | 6 +++--- .../crypto_sign_edwards25519sha512batch.h | 4 ++-- 7 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/libsodium/crypto_sign/crypto_sign.c b/src/libsodium/crypto_sign/crypto_sign.c index 4f868993..b5508fb8 100644 --- a/src/libsodium/crypto_sign/crypto_sign.c +++ b/src/libsodium/crypto_sign/crypto_sign.c @@ -45,27 +45,27 @@ crypto_sign_keypair(unsigned char *pk, unsigned char *sk) } int -crypto_sign(unsigned char *sm, unsigned long long *smlen, +crypto_sign(unsigned char *sm, unsigned long long *smlen_p, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) { - return crypto_sign_ed25519(sm, smlen, m, mlen, sk); + return crypto_sign_ed25519(sm, smlen_p, m, mlen, sk); } int -crypto_sign_open(unsigned char *m, unsigned long long *mlen, +crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, const unsigned char *sm, unsigned long long smlen, const unsigned char *pk) { - return crypto_sign_ed25519_open(m, mlen, sm, smlen, pk); + return crypto_sign_ed25519_open(m, mlen_p, sm, smlen, pk); } int -crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, +crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) { - return crypto_sign_ed25519_detached(sig, siglen, m, mlen, sk); + return crypto_sign_ed25519_detached(sig, siglen_p, m, mlen, sk); } int diff --git a/src/libsodium/crypto_sign/ed25519/ref10/open.c b/src/libsodium/crypto_sign/ed25519/ref10/open.c index 488333e9..1e2b7add 100644 --- a/src/libsodium/crypto_sign/ed25519/ref10/open.c +++ b/src/libsodium/crypto_sign/ed25519/ref10/open.c @@ -48,23 +48,30 @@ crypto_sign_verify_detached(const unsigned char *sig, const unsigned char *m, } int -crypto_sign_open(unsigned char *m, unsigned long long *mlen, +crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, const unsigned char *sm, unsigned long long smlen, const unsigned char *pk) { + unsigned long long mlen; + if (smlen < 64 || smlen > SIZE_MAX) { goto badsig; } - if (crypto_sign_verify_detached(sm, sm + 64, smlen - 64, pk) != 0) { - memset(m, 0, smlen - 64); + mlen = smlen - 64; + if (crypto_sign_verify_detached(sm, sm + 64, mlen, pk) != 0) { + memset(m, 0, mlen); goto badsig; } - *mlen = smlen - 64; - memmove(m, sm + 64, *mlen); + if (mlen_p != NULL) { + *mlen_p = mlen; + } + memmove(m, sm + 64, mlen); return 0; badsig: - *mlen = 0; + if (mlen_p != NULL) { + *mlen_p = 0; + } return -1; } diff --git a/src/libsodium/crypto_sign/ed25519/ref10/sign.c b/src/libsodium/crypto_sign/ed25519/ref10/sign.c index 1ee5d6c4..fa3080eb 100644 --- a/src/libsodium/crypto_sign/ed25519/ref10/sign.c +++ b/src/libsodium/crypto_sign/ed25519/ref10/sign.c @@ -8,7 +8,7 @@ #include "utils.h" int -crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, +crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) { @@ -48,14 +48,14 @@ crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, sodium_memzero(az, sizeof az); sodium_memzero(nonce, sizeof nonce); - if (siglen != NULL) { - *siglen = 64U; + if (siglen_p != NULL) { + *siglen_p = 64U; } return 0; } int -crypto_sign(unsigned char *sm, unsigned long long *smlen, +crypto_sign(unsigned char *sm, unsigned long long *smlen_p, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) { @@ -66,16 +66,16 @@ crypto_sign(unsigned char *sm, unsigned long long *smlen, if (crypto_sign_detached(sm, &siglen, sm + crypto_sign_ed25519_BYTES, mlen, sk) != 0 || siglen != crypto_sign_ed25519_BYTES) { - if (smlen != NULL) { - *smlen = 0; + if (smlen_p != NULL) { + *smlen_p = 0; } memset(sm, 0, mlen + crypto_sign_ed25519_BYTES); return -1; } /* LCOV_EXCL_STOP */ - if (smlen != NULL) { - *smlen = mlen + siglen; + if (smlen_p != NULL) { + *smlen_p = mlen + siglen; } return 0; } diff --git a/src/libsodium/crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c b/src/libsodium/crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c index 9c548dcf..b3c0c0d5 100644 --- a/src/libsodium/crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c +++ b/src/libsodium/crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c @@ -27,7 +27,7 @@ int crypto_sign_keypair( } int crypto_sign( - unsigned char *sm,unsigned long long *smlen, + unsigned char *sm,unsigned long long *smlen_p, const unsigned char *m,unsigned long long mlen, const unsigned char *sk ) @@ -40,7 +40,9 @@ int crypto_sign( unsigned char hmg[crypto_hash_sha512_BYTES]; unsigned char hmr[crypto_hash_sha512_BYTES]; - *smlen = mlen+64; + if (smlen_p != NULL) { + *smlen_p = mlen+64; + } for(i=0;i