]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
crypto/evp/signature.c: add checks for consistent presence of 'update' and 'final...
authorDr. David von Oheimb <dev@ddvo.net>
Wed, 16 Apr 2025 04:20:23 +0000 (06:20 +0200)
committerTomas Mraz <tomas@openssl.org>
Tue, 20 May 2025 19:19:34 +0000 (21:19 +0200)
Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27367)

crypto/evp/signature.c

index 9697889cf0b21855687f36338bcc5b9bfa2ab993..d01df3282fa41d694e689804ac0486396d5b32ee 100644 (file)
@@ -421,6 +421,35 @@ static void *evp_signature_from_algorithm(int name_id,
         goto err;
     }
 
+    if ((signature->sign_message_update == NULL) !=
+        (signature->sign_message_final == NULL)) {
+        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
+                       "only one of %s message signing update and final available:%s",
+                       signature->type_name, desc);
+        goto err;
+    }
+    if ((signature->verify_message_update == NULL) !=
+        (signature->verify_message_final == NULL)) {
+        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
+                       "only one of %s message verification update and final available:%s",
+                       signature->type_name, desc);
+        goto err;
+    }
+    if ((signature->digest_sign_update == NULL) !=
+        (signature->digest_sign_final == NULL)) {
+        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
+                       "only one of %s digest signing update and final available:%s",
+                       signature->type_name, desc);
+        goto err;
+    }
+    if ((signature->digest_verify_update == NULL) !=
+        (signature->digest_verify_final == NULL)) {
+        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
+                       "only one of %s digest verification update and final available:%s",
+                       signature->type_name, desc);
+        goto err;
+    }
+
     return signature;
  err:
     EVP_SIGNATURE_free(signature);