Parse X509's signature algorithm with the CBS/CBB functions
In doing so, embed it into the struct and save a small malloc.
Bug: 42290417
Change-Id: Iaf6c679b577a27876b489d688c57c78a69d9130c
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/81778
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h
index 3ec7bf7..60c6ae0 100644
--- a/crypto/x509/internal.h
+++ b/crypto/x509/internal.h
@@ -117,7 +117,7 @@
struct x509_st {
X509_CINF *cert_info;
- X509_ALGOR *sig_alg;
+ X509_ALGOR sig_alg;
ASN1_BIT_STRING signature;
CRYPTO_refcount_t references;
CRYPTO_EX_DATA ex_data;
diff --git a/crypto/x509/t_x509.cc b/crypto/x509/t_x509.cc
index 765d551..2e18daf 100644
--- a/crypto/x509/t_x509.cc
+++ b/crypto/x509/t_x509.cc
@@ -203,7 +203,7 @@
}
if (!(cflag & X509_FLAG_NO_SIGDUMP)) {
- if (X509_signature_print(bp, x->sig_alg, &x->signature) <= 0) {
+ if (X509_signature_print(bp, &x->sig_alg, &x->signature) <= 0) {
return 0;
}
}
diff --git a/crypto/x509/x_all.cc b/crypto/x509/x_all.cc
index 493eb05..2290255 100644
--- a/crypto/x509/x_all.cc
+++ b/crypto/x509/x_all.cc
@@ -29,11 +29,11 @@
int X509_verify(X509 *x509, EVP_PKEY *pkey) {
- if (X509_ALGOR_cmp(x509->sig_alg, x509->cert_info->signature)) {
+ if (X509_ALGOR_cmp(&x509->sig_alg, x509->cert_info->signature)) {
OPENSSL_PUT_ERROR(X509, X509_R_SIGNATURE_ALGORITHM_MISMATCH);
return 0;
}
- return ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), x509->sig_alg,
+ return ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), &x509->sig_alg,
&x509->signature, x509->cert_info, pkey);
}
@@ -45,13 +45,13 @@
int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) {
asn1_encoding_clear(&x->cert_info->enc);
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
- x->sig_alg, &x->signature, x->cert_info, pkey, md));
+ &x->sig_alg, &x->signature, x->cert_info, pkey, md));
}
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) {
asn1_encoding_clear(&x->cert_info->enc);
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
- x->sig_alg, &x->signature, x->cert_info, ctx);
+ &x->sig_alg, &x->signature, x->cert_info, ctx);
}
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md) {
diff --git a/crypto/x509/x_x509.cc b/crypto/x509/x_x509.cc
index a110368..c8cf7e0 100644
--- a/crypto/x509/x_x509.cc
+++ b/crypto/x509/x_x509.cc
@@ -57,6 +57,7 @@
ret->references = 1;
ret->ex_pathlen = -1;
+ x509_algor_init(&ret->sig_alg);
asn1_string_init(&ret->signature, V_ASN1_BIT_STRING);
CRYPTO_new_ex_data(&ret->ex_data);
CRYPTO_MUTEX_init(&ret->lock);
@@ -70,8 +71,7 @@
}
ret->cert_info = X509_CINF_new();
- ret->sig_alg = X509_ALGOR_new();
- if (ret->cert_info == NULL || ret->sig_alg == NULL) {
+ if (ret->cert_info == NULL) {
X509_free(ret);
return NULL;
}
@@ -87,7 +87,7 @@
CRYPTO_free_ex_data(&g_ex_data_class, &x509->ex_data);
X509_CINF_free(x509->cert_info);
- X509_ALGOR_free(x509->sig_alg);
+ x509_algor_cleanup(&x509->sig_alg);
asn1_string_cleanup(&x509->signature);
ASN1_OCTET_STRING_free(x509->skid);
AUTHORITY_KEYID_free(x509->akid);
@@ -106,13 +106,13 @@
return nullptr;
}
- CBS cert, tbs, sigalg;
+ CBS cert, tbs;
if (!CBS_get_asn1(cbs, &cert, CBS_ASN1_SEQUENCE) ||
// Bound the length to comfortably fit in an int. Lengths in this
// module often omit overflow checks.
CBS_len(&cert) > INT_MAX / 2 ||
!CBS_get_asn1_element(&cert, &tbs, CBS_ASN1_SEQUENCE) ||
- !CBS_get_asn1_element(&cert, &sigalg, CBS_ASN1_SEQUENCE) ||
+ !x509_parse_algorithm(&cert, &ret->sig_alg) ||
// For just the signature field, we accept non-minimal BER lengths, though
// not indefinite-length encoding. See b/18228011.
//
@@ -135,12 +135,6 @@
return nullptr;
}
- inp = CBS_data(&sigalg);
- ret->sig_alg = d2i_X509_ALGOR(nullptr, &inp, CBS_len(&sigalg));
- if (ret->sig_alg == nullptr || inp != CBS_data(&sigalg) + CBS_len(&sigalg)) {
- return nullptr;
- }
-
// The version must be one of v1(0), v2(1), or v3(2).
long version = X509_VERSION_1;
if (ret->cert_info->version != nullptr) {
@@ -196,7 +190,7 @@
if (len < 0 || //
!CBB_add_space(&cert, &out, static_cast<size_t>(len)) ||
i2d_X509_CINF(x509->cert_info, &out) != len ||
- !x509_marshal_algorithm(&cert, x509->sig_alg) ||
+ !x509_marshal_algorithm(&cert, &x509->sig_alg) ||
!asn1_marshal_bit_string(&cert, &x509->signature, /*tag=*/0) ||
!CBB_flush(cbb)) {
return false;
@@ -398,7 +392,7 @@
}
int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo) {
- return X509_ALGOR_copy(x509->sig_alg, algo) &&
+ return X509_ALGOR_copy(&x509->sig_alg, algo) &&
X509_ALGOR_copy(x509->cert_info->signature, algo);
}
@@ -417,10 +411,10 @@
*psig = &x->signature;
}
if (palg) {
- *palg = x->sig_alg;
+ *palg = &x->sig_alg;
}
}
int X509_get_signature_nid(const X509 *x) {
- return OBJ_obj2nid(x->sig_alg->algorithm);
+ return OBJ_obj2nid(x->sig_alg.algorithm);
}