Blame SOURCES/opensc-0.16.0-cardos5.patch

4e5208
From 60dbebf511cf6112e5fc2c3549ce38881847b121 Mon Sep 17 00:00:00 2001
4e5208
From: Jakub Jelen <jjelen@redhat.com>
4e5208
Date: Tue, 22 Aug 2017 10:46:26 +0200
4e5208
Subject: [PATCH] Parse the ECC parameters from TokenInfo (CHOICE in
4e5208
 AlgorithmInfo)
4e5208
4e5208
Fixes #1134
4e5208
---
4e5208
 src/libopensc/opensc.h |  1 +
4e5208
 src/libopensc/pkcs15.c | 40 +++++++++++++++++++++++++++++++++-------
4e5208
 2 files changed, 34 insertions(+), 7 deletions(-)
4e5208
4e5208
diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h
4e5208
index f81f27e3a..688c14003 100644
4e5208
--- a/src/libopensc/opensc.h
4e5208
+++ b/src/libopensc/opensc.h
4e5208
@@ -163,6 +163,7 @@ extern "C" {
4e5208
 struct sc_supported_algo_info {
4e5208
 	unsigned int reference;
4e5208
 	unsigned int mechanism;
4e5208
+	struct sc_object_id *parameters; /* OID for ECC, NULL for RSA */
4e5208
 	unsigned int operations;
4e5208
 	struct sc_object_id algo_id;
4e5208
 	unsigned int algo_ref;
4e5208
diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c
4e5208
index 05fe03061..ba99c8af9 100644
4e5208
--- a/src/libopensc/pkcs15.c
4e5208
+++ b/src/libopensc/pkcs15.c
4e5208
@@ -50,13 +50,19 @@ static const struct sc_asn1_entry c_asn1_twlabel[] = {
4e5208
 static const struct sc_asn1_entry c_asn1_algorithm_info[7] = {
4e5208
 	{ "reference",		SC_ASN1_INTEGER,	SC_ASN1_TAG_INTEGER,	0, NULL, NULL },
4e5208
 	{ "algorithmPKCS#11",	SC_ASN1_INTEGER,	SC_ASN1_TAG_INTEGER,	0, NULL, NULL },
4e5208
-	{ "parameters",		SC_ASN1_NULL,		SC_ASN1_TAG_NULL,	0, NULL, NULL },
4e5208
+	{ "parameters",		SC_ASN1_CHOICE,		0,			0, NULL, NULL },
4e5208
 	{ "supportedOperations",SC_ASN1_BIT_FIELD,	SC_ASN1_TAG_BIT_STRING,	0, NULL, NULL },
4e5208
 	{ "objId",		SC_ASN1_OBJECT,		SC_ASN1_TAG_OBJECT,	SC_ASN1_OPTIONAL, NULL, NULL },
4e5208
 	{ "algRef",		SC_ASN1_INTEGER,	SC_ASN1_TAG_INTEGER,	SC_ASN1_OPTIONAL, NULL, NULL },
4e5208
 	{ NULL, 0, 0, 0, NULL, NULL }
4e5208
 };
4e5208
 
4e5208
+static const struct sc_asn1_entry c_asn1_algorithm_info_parameters[3] = {
4e5208
+	{ "PKCS15RSAParameters",SC_ASN1_NULL,		SC_ASN1_TAG_NULL,	0, NULL, NULL },
4e5208
+	{ "PKCS15ECParameters",	SC_ASN1_OBJECT,		SC_ASN1_TAG_OBJECT,	0, NULL, NULL },
4e5208
+	{ NULL, 0, 0, 0, NULL, NULL }
4e5208
+};
4e5208
+
4e5208
 /*
4e5208
  * in src/libopensc/types.h SC_MAX_SUPPORTED_ALGORITHMS  defined as 8
4e5208
  */
4e5208
@@ -134,9 +140,11 @@ int sc_pkcs15_parse_tokeninfo(sc_context_t *ctx,
4e5208
 	u8 preferred_language[3];
4e5208
 	size_t lang_length = sizeof(preferred_language);
4e5208
 	struct sc_asn1_entry asn1_supported_algorithms[SC_MAX_SUPPORTED_ALGORITHMS + 1],
4e5208
-			asn1_algo_infos[SC_MAX_SUPPORTED_ALGORITHMS][7];
4e5208
+			asn1_algo_infos[SC_MAX_SUPPORTED_ALGORITHMS][7],
4e5208
+			asn1_algo_infos_parameters[SC_MAX_SUPPORTED_ALGORITHMS][3];
4e5208
 	size_t reference_len = sizeof(ti->supported_algos[0].reference);
4e5208
 	size_t mechanism_len = sizeof(ti->supported_algos[0].mechanism);
4e5208
+	size_t parameter_len = sizeof(ti->supported_algos[0].parameters);
4e5208
 	size_t operations_len = sizeof(ti->supported_algos[0].operations);
4e5208
 	size_t algo_ref_len = sizeof(ti->supported_algos[0].algo_ref);
4e5208
 
4e5208
@@ -152,14 +160,22 @@ int sc_pkcs15_parse_tokeninfo(sc_context_t *ctx,
4e5208
 	sc_format_asn1_entry(asn1_twlabel, label, &label_len, 0);
4e5208
 	sc_copy_asn1_entry(c_asn1_profile_indication, asn1_profile_indication);
4e5208
 
4e5208
-	for (ii=0; ii
4e5208
+	for (ii=0; ii
4e5208
 		sc_copy_asn1_entry(c_asn1_algorithm_info, asn1_algo_infos[ii]);
4e5208
+		sc_copy_asn1_entry(c_asn1_algorithm_info_parameters,
4e5208
+			asn1_algo_infos_parameters[ii]);
4e5208
+	}
4e5208
 	sc_copy_asn1_entry(c_asn1_supported_algorithms, asn1_supported_algorithms);
4e5208
 
4e5208
 	for (ii=0; ii
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 0, &ti->supported_algos[ii].reference, &reference_len, 0);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 1, &ti->supported_algos[ii].mechanism, &mechanism_len, 0);
4e5208
-		sc_format_asn1_entry(asn1_algo_infos[ii] + 2, NULL, NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos[ii] + 2,
4e5208
+			asn1_algo_infos_parameters[ii], NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos_parameters[ii] + 0,
4e5208
+			NULL, NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos_parameters[ii] + 1,
4e5208
+			&ti->supported_algos[ii].parameters, &parameter_len, 0);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 3, &ti->supported_algos[ii].operations, &operations_len, 0);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 4, &ti->supported_algos[ii].algo_id, NULL, 1);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 5, &ti->supported_algos[ii].algo_ref, &algo_ref_len, 0);
4e5208
@@ -270,9 +286,11 @@ sc_pkcs15_encode_tokeninfo(sc_context_t *ctx, sc_pkcs15_tokeninfo_t *ti,
4e5208
 	struct sc_asn1_entry asn1_toki_attrs[C_ASN1_TOKI_ATTRS_SIZE];
4e5208
 	struct sc_asn1_entry asn1_tokeninfo[2];
4e5208
 	struct sc_asn1_entry asn1_supported_algorithms[SC_MAX_SUPPORTED_ALGORITHMS + 1],
4e5208
-			asn1_algo_infos[SC_MAX_SUPPORTED_ALGORITHMS][7];
4e5208
+			asn1_algo_infos[SC_MAX_SUPPORTED_ALGORITHMS][7],
4e5208
+			asn1_algo_infos_parameters[SC_MAX_SUPPORTED_ALGORITHMS][3];
4e5208
 	size_t reference_len = sizeof(ti->supported_algos[0].reference);
4e5208
 	size_t mechanism_len = sizeof(ti->supported_algos[0].mechanism);
4e5208
+	size_t parameter_len = sizeof(ti->supported_algos[0].parameters);
4e5208
 	size_t operations_len = sizeof(ti->supported_algos[0].operations);
4e5208
 	size_t algo_ref_len = sizeof(ti->supported_algos[0].algo_ref);
4e5208
 	struct sc_asn1_entry asn1_last_update[C_ASN1_LAST_UPDATE_SIZE];
4e5208
@@ -283,14 +301,22 @@ sc_pkcs15_encode_tokeninfo(sc_context_t *ctx, sc_pkcs15_tokeninfo_t *ti,
4e5208
 	sc_copy_asn1_entry(c_asn1_last_update, asn1_last_update);
4e5208
 	sc_copy_asn1_entry(c_asn1_profile_indication, asn1_profile_indication);
4e5208
 
4e5208
-	for (ii=0; ii<SC_MAX_SUPPORTED_ALGORITHMS && ti->supported_algos[ii].reference; ii++)
4e5208
+	for (ii=0; ii<SC_MAX_SUPPORTED_ALGORITHMS && ti->supported_algos[ii].reference; ii++) {
4e5208
 		sc_copy_asn1_entry(c_asn1_algorithm_info, asn1_algo_infos[ii]);
4e5208
+		sc_copy_asn1_entry(c_asn1_algorithm_info_parameters,
4e5208
+			asn1_algo_infos_parameters[ii]);
4e5208
+	}
4e5208
 	sc_copy_asn1_entry(c_asn1_supported_algorithms, asn1_supported_algorithms);
4e5208
 
4e5208
 	for (ii=0; ii<SC_MAX_SUPPORTED_ALGORITHMS && ti->supported_algos[ii].reference; ii++)   {
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 0, &ti->supported_algos[ii].reference, &reference_len, 1);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 1, &ti->supported_algos[ii].mechanism, &mechanism_len, 1);
4e5208
-		sc_format_asn1_entry(asn1_algo_infos[ii] + 2, NULL, NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos[ii] + 2,
4e5208
+			asn1_algo_infos_parameters[ii], NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos_parameters[ii] + 0,
4e5208
+			NULL, NULL, 0);
4e5208
+		sc_format_asn1_entry(asn1_algo_infos_parameters[ii] + 1,
4e5208
+			&ti->supported_algos[ii].parameters, &parameter_len, 0);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 3, &ti->supported_algos[ii].operations, &operations_len, 1);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 4, &ti->supported_algos[ii].algo_id, NULL, 1);
4e5208
 		sc_format_asn1_entry(asn1_algo_infos[ii] + 5, &ti->supported_algos[ii].algo_ref, &algo_ref_len, 1);
4e5208