diff --git a/src/libsodium/crypto_sign/crypto_sign.c b/src/libsodium/crypto_sign/crypto_sign.c index 81fb1b96..d6fd6f30 100644 --- a/src/libsodium/crypto_sign/crypto_sign.c +++ b/src/libsodium/crypto_sign/crypto_sign.c @@ -59,3 +59,11 @@ crypto_sign_open(unsigned char *m, unsigned long long *mlen, { return crypto_sign_ed25519_open(m, mlen, sm, smlen, pk); } + +int +crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk) +{ + return crypto_sign_ed25519_detached(sig, siglen, m, mlen, sk); +} diff --git a/src/libsodium/crypto_sign/ed25519/ref10/api.h b/src/libsodium/crypto_sign/ed25519/ref10/api.h index a5c50313..c55b05c4 100644 --- a/src/libsodium/crypto_sign/ed25519/ref10/api.h +++ b/src/libsodium/crypto_sign/ed25519/ref10/api.h @@ -2,6 +2,7 @@ #include "crypto_sign_ed25519.h" #define crypto_sign crypto_sign_ed25519 +#define crypto_sign_detached crypto_sign_ed25519_detached #define crypto_sign_open crypto_sign_ed25519_open #define crypto_sign_keypair crypto_sign_ed25519_keypair #define crypto_sign_seed_keypair crypto_sign_ed25519_seed_keypair diff --git a/src/libsodium/crypto_sign/ed25519/ref10/sign.c b/src/libsodium/crypto_sign/ed25519/ref10/sign.c index 4840f500..6c770d3a 100644 --- a/src/libsodium/crypto_sign/ed25519/ref10/sign.c +++ b/src/libsodium/crypto_sign/ed25519/ref10/sign.c @@ -6,38 +6,69 @@ #include "ge.h" #include "sc.h" -int crypto_sign( - unsigned char *sm,unsigned long long *smlen, - const unsigned char *m,unsigned long long mlen, - const unsigned char *sk -) +int +crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk) { - unsigned char pk[32]; - unsigned char az[64]; - unsigned char nonce[64]; - unsigned char hram[64]; - ge_p3 R; + crypto_hash_sha512_state hs; + unsigned char pk[32]; + unsigned char az[64]; + unsigned char nonce[64]; + unsigned char hram[64]; + unsigned char *sig_R = sig; + unsigned char *sig_S = sig + 32; + ge_p3 R; - memmove(pk,sk + 32,32); + memmove(pk, sk + 32, 32); - crypto_hash_sha512(az,sk,32); - az[0] &= 248; - az[31] &= 63; - az[31] |= 64; + crypto_hash_sha512(az, sk, 32); + az[0] &= 248; + az[31] &= 63; + az[31] |= 64; - *smlen = mlen + 64; - memmove(sm + 64,m,mlen); - memmove(sm + 32,az + 32,32); - crypto_hash_sha512(nonce,sm + 32,mlen + 32); - memmove(sm + 32,pk,32); + crypto_hash_sha512_init(&hs); + crypto_hash_sha512_update(&hs, az + 32, 32); + crypto_hash_sha512_update(&hs, m, mlen); + crypto_hash_sha512_final(&hs, nonce); - sc_reduce(nonce); - ge_scalarmult_base(&R,nonce); - ge_p3_tobytes(sm,&R); + memmove(sig_S, pk, 32); - crypto_hash_sha512(hram,sm,mlen + 64); - sc_reduce(hram); - sc_muladd(sm + 32,hram,az,nonce); + sc_reduce(nonce); + ge_scalarmult_base(&R, nonce); + ge_p3_tobytes(sig_R, &R); - return 0; + crypto_hash_sha512_init(&hs); + crypto_hash_sha512_update(&hs, sig_R, 32); + crypto_hash_sha512_update(&hs, sig_S, 32); + crypto_hash_sha512_update(&hs, m, mlen); + crypto_hash_sha512_final(&hs, hram); + + sc_reduce(hram); + sc_muladd(sig_S, hram, az, nonce); + + if (siglen != NULL) { + *siglen = 64U; + } + return 0; +} + +int +crypto_sign(unsigned char *sm, unsigned long long *smlen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk) +{ + unsigned long long siglen; + + if (crypto_sign_detached(sm, &siglen, m, mlen, sk) != 0 || + siglen > crypto_sign_ed25519_BYTES) { + *smlen = 0; + memset(sm, 0, mlen + crypto_sign_ed25519_BYTES); + return -1; + } + memmove(sm + siglen, m, mlen); + if (smlen != NULL) { + *smlen = mlen + siglen; + } + return 0; } diff --git a/src/libsodium/include/sodium/crypto_sign.h b/src/libsodium/include/sodium/crypto_sign.h index 9baf7a91..b1a7f98c 100644 --- a/src/libsodium/include/sodium/crypto_sign.h +++ b/src/libsodium/include/sodium/crypto_sign.h @@ -57,6 +57,11 @@ int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, const unsigned char *pk); +SODIUM_EXPORT +int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk); + #ifdef __cplusplus } #endif diff --git a/src/libsodium/include/sodium/crypto_sign_ed25519.h b/src/libsodium/include/sodium/crypto_sign_ed25519.h index 5f88d61c..e0331019 100644 --- a/src/libsodium/include/sodium/crypto_sign_ed25519.h +++ b/src/libsodium/include/sodium/crypto_sign_ed25519.h @@ -37,6 +37,13 @@ int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, const unsigned char *pk); +SODIUM_EXPORT +int crypto_sign_ed25519_detached(unsigned char *sig, + unsigned long long *siglen, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *sk); + SODIUM_EXPORT int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk);