]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
X509_ALGOR_set_md(): Add return value to indicate success or failure
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>
Thu, 13 Jan 2022 16:19:24 +0000 (17:19 +0100)
committerDr. David von Oheimb <dev@ddvo.net>
Wed, 4 Feb 2026 12:44:40 +0000 (13:44 +0100)
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Nikola Pajkovsky <nikolap@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17495)

CHANGES.md
crypto/asn1/x_algor.c
crypto/cms/cms_dd.c
crypto/cms/cms_sd.c
crypto/ess/ess_lib.c
doc/man3/X509_ALGOR_dup.pod
include/openssl/x509.h.in

index b6e40fa1fc8839699df7f84b55781aa1c075e5d7..236eaf73e6f41843ee441d898ec4d3adc5ad3fb0 100644 (file)
@@ -123,6 +123,10 @@ OpenSSL 4.0
 
    *David von Oheimb*
 
+* `X509_ALGOR_set_md()` now returns a value indicating success or failure.
+
+   *David von Oheimb*
+
  * Drop darwin-i386{,-cc} and darwin-ppc{,64}{,-cc} targets from Configurations.
 
    *Daniel Kubec and Eugene Syromiatnikov*
index f8faf7209b198fc2ed954eec37c881631e52764c..ccd5ffabb7e3c948a9031abd626cc35a9bb63bef 100644 (file)
@@ -85,12 +85,12 @@ void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
 }
 
 /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
-void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md)
+int X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md)
 {
     int type = md->flags & EVP_MD_FLAG_DIGALGID_ABSENT ? V_ASN1_UNDEF
                                                        : V_ASN1_NULL;
 
-    (void)X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_get_type(md)), type, NULL);
+    return X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_get_type(md)), type, NULL);
 }
 
 int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
@@ -148,7 +148,10 @@ int ossl_x509_algor_new_from_md(X509_ALGOR **palg, const EVP_MD *md)
         return 1;
     if ((alg = X509_ALGOR_new()) == NULL)
         return 0;
-    X509_ALGOR_set_md(alg, md);
+    if (!X509_ALGOR_set_md(alg, md)) {
+        X509_ALGOR_free(alg);
+        return 0;
+    }
     *palg = alg;
     return 1;
 }
index aff9af63cafd6c0ab5b675b7b6356848802a6043..0dada2d08bbb960dba3d8aee0c2e1aca5004b0e0 100644 (file)
@@ -39,7 +39,8 @@ CMS_ContentInfo *ossl_cms_DigestedData_create(const EVP_MD *md,
     dd->version = 0;
     dd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data);
 
-    X509_ALGOR_set_md(dd->digestAlgorithm, md);
+    if (!X509_ALGOR_set_md(dd->digestAlgorithm, md))
+        goto err;
 
     return cms;
 
index 8e60e6e559c84c5663ee04fffea922cbc03e079c..2fd66e08ac0d6216b7379b39ac56c6cb4e663a54 100644 (file)
@@ -625,7 +625,8 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
     if (ossl_cms_adjust_md(pk, &md, flags) != 1)
         goto err;
 
-    X509_ALGOR_set_md(si->digestAlgorithm, md);
+    if (!X509_ALGOR_set_md(si->digestAlgorithm, md))
+        goto err;
 
     /* See if digest is present in digestAlgorithms */
     for (i = 0; i < sk_X509_ALGOR_num(sd->digestAlgorithms); i++) {
@@ -639,12 +640,9 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
             break;
     }
     if (i == sk_X509_ALGOR_num(sd->digestAlgorithms)) {
-        if ((alg = X509_ALGOR_new()) == NULL) {
-            ERR_raise(ERR_LIB_CMS, ERR_R_ASN1_LIB);
-            goto err;
-        }
-        X509_ALGOR_set_md(alg, md);
-        if (!sk_X509_ALGOR_push(sd->digestAlgorithms, alg)) {
+        if ((alg = X509_ALGOR_new()) == NULL
+            || !X509_ALGOR_set_md(alg, md)
+            || !sk_X509_ALGOR_push(sd->digestAlgorithms, alg)) {
             X509_ALGOR_free(alg);
             ERR_raise(ERR_LIB_CMS, ERR_R_CRYPTO_LIB);
             goto err;
index 0486beffc40fec8e3097d21ede1f1b7da350383d..03bd5a0937a63405295e147228dc7e1684ed40a9 100644 (file)
@@ -186,12 +186,7 @@ static ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new_init(const EVP_MD *hash_alg,
 
     if (!EVP_MD_is_a(hash_alg, SN_sha256)) {
         alg = X509_ALGOR_new();
-        if (alg == NULL) {
-            ERR_raise(ERR_LIB_ESS, ERR_R_ASN1_LIB);
-            goto err;
-        }
-        X509_ALGOR_set_md(alg, hash_alg);
-        if (alg->algorithm == NULL) {
+        if (alg == NULL || !X509_ALGOR_set_md(alg, hash_alg) || alg->algorithm == NULL) {
             ERR_raise(ERR_LIB_ESS, ERR_R_ASN1_LIB);
             goto err;
         }
index 6133735ea595e929bcc506f2005dfee77bc25cad..11198fb80d702f0b563384163da011b0541e697c 100644 (file)
@@ -15,7 +15,7 @@ X509_ALGOR_copy - AlgorithmIdentifier functions
  int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
  void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
                       const void **ppval, const X509_ALGOR *alg);
void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
int X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
  int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
  int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src);
 
@@ -49,16 +49,19 @@ a duplicate of each (and free any thing pointed to from within *dest).
 X509_ALGOR_dup() returns a valid B<X509_ALGOR> structure or NULL if an error
 occurred.
 
-X509_ALGOR_set0() and X509_ALGOR_copy() return 1 on success or 0 on error.
+X509_ALGOR_set0(), X509_ALGOR_set_md(), and X509_ALGOR_copy()
+return 1 on success or 0 on error.
 
-X509_ALGOR_get0() and X509_ALGOR_set_md() return no values.
+X509_ALGOR_get0() returns no values.
 
 X509_ALGOR_cmp() returns 0 if the two parameters have identical encodings and
 nonzero otherwise.
 
 =head1 HISTORY
 
-The X509_ALGOR_copy() was added in 1.1.1e.
+X509_ALGOR_copy() was added in OpenSSL 1.1.1e.
+
+X509_ALGOR_set_md() returns a value since OpenSSL 4.0.
 
 =head1 COPYRIGHT
 
index 1a62dfad8a21074d412fd3822aa0168362775aed..0ecf8c9049c1b3363b10dcfa87ec93a9894df2c9 100644 (file)
@@ -488,7 +488,7 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype,
     void *pval);
 void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
     const void **ppval, const X509_ALGOR *algor);
-void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
+int X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
 int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
 int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src);