Enable Ed25519 signing/verifying to use the libctx
authorMatt Caswell <matt@openssl.org>
Tue, 7 Apr 2020 10:10:02 +0000 (11:10 +0100)
committerMatt Caswell <matt@openssl.org>
Thu, 9 Apr 2020 15:10:00 +0000 (16:10 +0100)
Ed25519 needs to fetch a digest and so needs to use the correct libctx.

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/11496)

crypto/ec/curve25519.c
crypto/ec/ecx_meth.c
include/crypto/ecx.h
providers/implementations/signature/eddsa.c

index 024f7fe169789a718c492c4c025c9cbd770ae76f..8db6cdb16dcd0d55e113b7d9591c1d61d1ee99c7 100644 (file)
@@ -5438,13 +5438,14 @@ static void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b,
 }
 
 int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len,
-                 const uint8_t public_key[32], const uint8_t private_key[32])
+                 const uint8_t public_key[32], const uint8_t private_key[32],
+                 OPENSSL_CTX *libctx, const char *propq)
 {
     uint8_t az[SHA512_DIGEST_LENGTH];
     uint8_t nonce[SHA512_DIGEST_LENGTH];
     ge_p3 R;
     uint8_t hram[SHA512_DIGEST_LENGTH];
-    EVP_MD *sha512 = EVP_MD_fetch(NULL, SN_sha512, NULL);
+    EVP_MD *sha512 = EVP_MD_fetch(libctx, SN_sha512, propq);
     EVP_MD_CTX *hash_ctx = EVP_MD_CTX_new();
     unsigned int sz;
     int res = 0;
@@ -5493,7 +5494,8 @@ err:
 static const char allzeroes[15];
 
 int ED25519_verify(const uint8_t *message, size_t message_len,
-                   const uint8_t signature[64], const uint8_t public_key[32])
+                   const uint8_t signature[64], const uint8_t public_key[32],
+                   OPENSSL_CTX *libctx, const char *propq)
 {
     int i;
     ge_p3 A;
@@ -5548,7 +5550,7 @@ int ED25519_verify(const uint8_t *message, size_t message_len,
     fe_neg(A.X, A.X);
     fe_neg(A.T, A.T);
 
-    sha512 = EVP_MD_fetch(NULL, SN_sha512, NULL);
+    sha512 = EVP_MD_fetch(libctx, SN_sha512, propq);
     if (sha512 == NULL)
         return 0;
     hash_ctx = EVP_MD_CTX_new();
index 750a51c3f248215909095b4120ad075fda6c3c03..03d6a7af83eb8470c07eddd2121ac8b8a67b680e 100644 (file)
@@ -837,7 +837,8 @@ static int pkey_ecd_digestsign25519(EVP_MD_CTX *ctx, unsigned char *sig,
         return 0;
     }
 
-    if (ED25519_sign(sig, tbs, tbslen, edkey->pubkey, edkey->privkey) == 0)
+    if (ED25519_sign(sig, tbs, tbslen, edkey->pubkey, edkey->privkey, NULL,
+                     NULL) == 0)
         return 0;
     *siglen = ED25519_SIGSIZE;
     return 1;
@@ -878,7 +879,7 @@ static int pkey_ecd_digestverify25519(EVP_MD_CTX *ctx, const unsigned char *sig,
     if (siglen != ED25519_SIGSIZE)
         return 0;
 
-    return ED25519_verify(tbs, tbslen, sig, edkey->pubkey);
+    return ED25519_verify(tbs, tbslen, sig, edkey->pubkey, NULL, NULL);
 }
 
 static int pkey_ecd_digestverify448(EVP_MD_CTX *ctx, const unsigned char *sig,
index 41020a22b3326eaa17c44c5f9ecf575a76b92093..0c6655ca79e855d6e4fbc54d46b59faa1e46e1d5 100644 (file)
@@ -83,9 +83,11 @@ void X25519_public_from_private(uint8_t out_public_value[32],
                                 const uint8_t private_key[32]);
 
 int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len,
-                 const uint8_t public_key[32], const uint8_t private_key[32]);
+                 const uint8_t public_key[32], const uint8_t private_key[32],
+                 OPENSSL_CTX *libctx, const char *propq);
 int ED25519_verify(const uint8_t *message, size_t message_len,
-                   const uint8_t signature[64], const uint8_t public_key[32]);
+                   const uint8_t signature[64], const uint8_t public_key[32],
+                   OPENSSL_CTX *libctx, const char *propq);
 
 int ED448_sign(OPENSSL_CTX *ctx, uint8_t *out_sig, const uint8_t *message,
                size_t message_len, const uint8_t public_key[57],
index d2444f9e36a6c0ccc3da2fab5fa551c51163d5e3..1a7bf9470228118acf9ae9b4aec6dd3b2c98e627 100644 (file)
@@ -87,7 +87,8 @@ int ed25519_digest_sign(void *vpeddsactx, unsigned char *sigret,
         return 0;
     }
 
-    if (ED25519_sign(sigret, tbs, tbslen, edkey->pubkey, edkey->privkey) == 0) {
+    if (ED25519_sign(sigret, tbs, tbslen, edkey->pubkey, edkey->privkey,
+                     peddsactx->libctx, NULL) == 0) {
         PROVerr(0, PROV_R_FAILED_TO_SIGN);
         return 0;
     }
@@ -130,7 +131,8 @@ int ed25519_digest_verify(void *vpeddsactx, const unsigned char *sig,
     if (siglen != ED25519_SIGSIZE)
         return 0;
 
-    return ED25519_verify(tbs, tbslen, sig, edkey->pubkey);
+    return ED25519_verify(tbs, tbslen, sig, edkey->pubkey, peddsactx->libctx,
+                          NULL);
 }
 
 int ed448_digest_verify(void *vpeddsactx, const unsigned char *sig,