Blame SOURCES/0001-pkcs15-regression-in-e35febe-compute-cert-length.patch

1fb492
From cc5a171ddcc8e49b2252135daac9ad3aa6d66ae7 Mon Sep 17 00:00:00 2001
1fb492
From: Viktor Tarasov <viktor.tarasov@gmail.com>
1fb492
Date: Tue, 25 Dec 2012 20:05:45 +0100
1fb492
Subject: [PATCH] pkcs15: regression in e35febe: compute cert length
1fb492
1fb492
parse_x509_cert() reviewed.
1fb492
Now certificate's DER data are allocated and the DER data length is determined in one place.
1fb492
1fb492
https://github.com/OpenSC/OpenSC/pull/114
1fb492
https://github.com/OpenSC/OpenSC/commit/e35febe
1fb492
---
1fb492
 src/libopensc/pkcs15-cert.c | 37 +++++++++++++++++++------------------
1fb492
 1 file changed, 19 insertions(+), 18 deletions(-)
1fb492
1fb492
diff --git a/src/libopensc/pkcs15-cert.c b/src/libopensc/pkcs15-cert.c
1fb492
index 86bea25..9b08aac 100644
1fb492
--- a/src/libopensc/pkcs15-cert.c
1fb492
+++ b/src/libopensc/pkcs15-cert.c
1fb492
@@ -34,13 +34,13 @@
1fb492
 #include "pkcs15.h"
1fb492
 
1fb492
 static int
1fb492
-parse_x509_cert(sc_context_t *ctx, const u8 *buf, size_t buflen, struct sc_pkcs15_cert *cert)
1fb492
+parse_x509_cert(sc_context_t *ctx, struct sc_pkcs15_der *der, struct sc_pkcs15_cert *cert)
1fb492
 {
1fb492
 	int r;
1fb492
 	struct sc_algorithm_id sig_alg;
1fb492
-	struct sc_pkcs15_pubkey  * pubkey = NULL;
1fb492
-	u8 *serial = NULL;
1fb492
-	size_t serial_len = 0;
1fb492
+	struct sc_pkcs15_pubkey *pubkey = NULL;
1fb492
+	unsigned char *serial = NULL, *buf =  der->value;
1fb492
+	size_t serial_len = 0, data_len = 0, buflen = der->len;
1fb492
 	struct sc_asn1_entry asn1_version[] = {
1fb492
 		{ "version", SC_ASN1_INTEGER, SC_ASN1_TAG_INTEGER, 0, &cert->version, NULL },
1fb492
 		{ NULL, 0, 0, 0, NULL, NULL }
1fb492
@@ -87,30 +87,32 @@ parse_x509_cert(sc_context_t *ctx, const u8 *buf, size_t buflen, struct sc_pkcs1
1fb492
 	if (obj == NULL)
1fb492
 		LOG_TEST_RET(ctx, SC_ERROR_INVALID_ASN1_OBJECT, "X.509 certificate not found");
1fb492
 
1fb492
-	cert->data.len = objlen + (obj - buf);
1fb492
+	data_len = objlen + (obj - buf);
1fb492
+	cert->data.value = malloc(data_len);
1fb492
+	if (!cert->data.value)
1fb492
+		LOG_FUNC_RETURN(ctx, SC_ERROR_OUT_OF_MEMORY);
1fb492
+	memcpy(cert->data.value, buf, data_len);
1fb492
+	cert->data.len = data_len;
1fb492
+
1fb492
 	r = sc_asn1_decode(ctx, asn1_cert, obj, objlen, NULL, NULL);
1fb492
 	LOG_TEST_RET(ctx, r, "ASN.1 parsing of certificate failed");
1fb492
 
1fb492
 	cert->version++;
1fb492
 
1fb492
-	if (pubkey) {
1fb492
-		cert->key = pubkey;
1fb492
-		pubkey = NULL;
1fb492
-	}
1fb492
-	else {
1fb492
+	if (!pubkey)
1fb492
 		LOG_TEST_RET(ctx, SC_ERROR_INVALID_ASN1_OBJECT, "Unable to decode subjectPublicKeyInfo from cert");
1fb492
-	}
1fb492
+	cert->key = pubkey;
1fb492
+
1fb492
 	sc_asn1_clear_algorithm_id(&sig_alg);
1fb492
-	if (r < 0)
1fb492
-		return r;
1fb492
 
1fb492
 	if (serial && serial_len)   {
1fb492
 		sc_format_asn1_entry(asn1_serial_number + 0, serial, &serial_len, 1);
1fb492
 		r = sc_asn1_encode(ctx, asn1_serial_number, &cert->serial, &cert->serial_len);
1fb492
 		free(serial);
1fb492
+		LOG_TEST_RET(ctx, r, "ASN.1 encoding of serial failed");
1fb492
 	}
1fb492
 
1fb492
-	return r;
1fb492
+	return SC_SUCCESS;
1fb492
 }
1fb492
 
1fb492
 
1fb492
@@ -125,7 +127,7 @@ sc_pkcs15_pubkey_from_cert(struct sc_context *ctx,
1fb492
 	if (cert == NULL)
1fb492
 		return SC_ERROR_OUT_OF_MEMORY;
1fb492
 
1fb492
-	rv = parse_x509_cert(ctx, cert_blob->value, cert_blob->len, cert);
1fb492
+	rv = parse_x509_cert(ctx, cert_blob, cert);
1fb492
 
1fb492
 	*out = cert->key;
1fb492
 	cert->key = NULL;
1fb492
@@ -158,20 +160,19 @@ sc_pkcs15_read_certificate(struct sc_pkcs15_card *p15card, const struct sc_pkcs1
1fb492
 		return SC_ERROR_OBJECT_NOT_FOUND;
1fb492
 	}
1fb492
 
1fb492
-
1fb492
 	cert = malloc(sizeof(struct sc_pkcs15_cert));
1fb492
 	if (cert == NULL) {
1fb492
 		free(der.value);
1fb492
 		return SC_ERROR_OUT_OF_MEMORY;
1fb492
 	}
1fb492
 	memset(cert, 0, sizeof(struct sc_pkcs15_cert));
1fb492
-	if (parse_x509_cert(p15card->card->ctx, der.value, der.len, cert)) {
1fb492
+	if (parse_x509_cert(p15card->card->ctx, &der, cert)) {
1fb492
 		free(der.value);
1fb492
 		sc_pkcs15_free_certificate(cert);
1fb492
 		return SC_ERROR_INVALID_ASN1_OBJECT;
1fb492
 	}
1fb492
+	free(der.value);
1fb492
 
1fb492
-	cert->data = der;
1fb492
 	*cert_out = cert;
1fb492
 	return SC_SUCCESS;
1fb492
 }
1fb492
-- 
1fb492
1.8.1
1fb492