diff options
author | job <> | 2023-04-28 17:59:53 +0000 |
---|---|---|
committer | job <> | 2023-04-28 17:59:53 +0000 |
commit | 24aa308331dbfa98b78086598d448798f4dc2ab7 (patch) | |
tree | 622fd7644d641978f518ce745f3569afb0dc3cb2 | |
parent | 34e3c561c803320bc7ec429ea359bc540095d11c (diff) | |
download | openbsd-24aa308331dbfa98b78086598d448798f4dc2ab7.tar.gz openbsd-24aa308331dbfa98b78086598d448798f4dc2ab7.tar.bz2 openbsd-24aa308331dbfa98b78086598d448798f4dc2ab7.zip |
Remove preservation and use of cached DER/BER encodings in the d2i/i2d paths
A long time ago a workflow was envisioned for X509, X509_CRL, and X509_REQ
structures in which only fields modified after deserialization would need to
be re-encoded upon serialization.
Unfortunately, over the years, authors would sometimes forget to add code in
setter functions to trigger invalidation of previously cached DER encodings.
The presence of stale versions of structures can lead to very hard-to-debug
issues and cause immense sorrow.
Fully removing the concept of caching DER encodings ensures stale versions
of structures can never rear their ugly heads again.
OK tb@ jsing@
-rw-r--r-- | src/lib/libcrypto/asn1/tasn_dec.c | 11 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/tasn_enc.c | 10 |
2 files changed, 4 insertions, 17 deletions
diff --git a/src/lib/libcrypto/asn1/tasn_dec.c b/src/lib/libcrypto/asn1/tasn_dec.c index 0c2357c2bb..ac59cc7e21 100644 --- a/src/lib/libcrypto/asn1/tasn_dec.c +++ b/src/lib/libcrypto/asn1/tasn_dec.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tasn_dec.c,v 1.84 2022/11/26 16:08:50 tb Exp $ */ | 1 | /* $OpenBSD: tasn_dec.c,v 1.85 2023/04/28 17:59:53 job Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -736,7 +736,7 @@ static int | |||
736 | asn1_item_d2i_sequence(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, | 736 | asn1_item_d2i_sequence(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, |
737 | int tag_number, int tag_class, int optional, int depth) | 737 | int tag_number, int tag_class, int optional, int depth) |
738 | { | 738 | { |
739 | CBS cbs_seq, cbs_seq_content, cbs_object; | 739 | CBS cbs_seq, cbs_seq_content; |
740 | int constructed, indefinite, optional_field; | 740 | int constructed, indefinite, optional_field; |
741 | const ASN1_TEMPLATE *errat = NULL; | 741 | const ASN1_TEMPLATE *errat = NULL; |
742 | const ASN1_TEMPLATE *seqat, *at; | 742 | const ASN1_TEMPLATE *seqat, *at; |
@@ -878,14 +878,9 @@ asn1_item_d2i_sequence(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, | |||
878 | ASN1_template_free(pseqval, seqat); | 878 | ASN1_template_free(pseqval, seqat); |
879 | } | 879 | } |
880 | 880 | ||
881 | if (!CBS_get_bytes(cbs, &cbs_object, CBS_offset(&cbs_seq))) | 881 | if (!CBS_skip(cbs, CBS_offset(&cbs_seq))) |
882 | goto err; | 882 | goto err; |
883 | 883 | ||
884 | if (!asn1_enc_save(&aseq, &cbs_object, it)) { | ||
885 | ASN1error(ERR_R_MALLOC_FAILURE); | ||
886 | goto err; | ||
887 | } | ||
888 | |||
889 | if (asn1_cb != NULL && !asn1_cb(ASN1_OP_D2I_POST, &aseq, it, NULL)) { | 884 | if (asn1_cb != NULL && !asn1_cb(ASN1_OP_D2I_POST, &aseq, it, NULL)) { |
890 | ASN1error(ASN1_R_AUX_ERROR); | 885 | ASN1error(ASN1_R_AUX_ERROR); |
891 | goto err; | 886 | goto err; |
diff --git a/src/lib/libcrypto/asn1/tasn_enc.c b/src/lib/libcrypto/asn1/tasn_enc.c index 6e0524c39f..430e8e1e8e 100644 --- a/src/lib/libcrypto/asn1/tasn_enc.c +++ b/src/lib/libcrypto/asn1/tasn_enc.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tasn_enc.c,v 1.29 2023/03/06 12:00:27 tb Exp $ */ | 1 | /* $OpenBSD: tasn_enc.c,v 1.30 2023/04/28 17:59:53 job Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -210,14 +210,6 @@ ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, | |||
210 | /* fall through */ | 210 | /* fall through */ |
211 | 211 | ||
212 | case ASN1_ITYPE_SEQUENCE: | 212 | case ASN1_ITYPE_SEQUENCE: |
213 | i = asn1_enc_restore(&seqcontlen, out, pval, it); | ||
214 | /* An error occurred */ | ||
215 | if (i < 0) | ||
216 | return 0; | ||
217 | /* We have a valid cached encoding... */ | ||
218 | if (i > 0) | ||
219 | return seqcontlen; | ||
220 | /* Otherwise carry on */ | ||
221 | seqcontlen = 0; | 213 | seqcontlen = 0; |
222 | /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */ | 214 | /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */ |
223 | if (tag == -1) { | 215 | if (tag == -1) { |