summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjob <>2023-04-28 17:59:53 +0000
committerjob <>2023-04-28 17:59:53 +0000
commit24aa308331dbfa98b78086598d448798f4dc2ab7 (patch)
tree622fd7644d641978f518ce745f3569afb0dc3cb2
parent34e3c561c803320bc7ec429ea359bc540095d11c (diff)
downloadopenbsd-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.c11
-rw-r--r--src/lib/libcrypto/asn1/tasn_enc.c10
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
736asn1_item_d2i_sequence(ASN1_VALUE **pval, CBS *cbs, const ASN1_ITEM *it, 736asn1_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) {