From b78d7630e7c2bb7e96b49663aeafcf05cf9f05ca Mon Sep 17 00:00:00 2001 From: "viktor.tarasov" Date: Mon, 5 Jul 2010 13:29:10 +0000 Subject: [PATCH] pkcs15: encode/decode 'subjectName' in 'CommonPrivateKeyAttributes' git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4512 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/asn1.c | 7 +++++++ src/libopensc/asn1.h | 1 + src/libopensc/pkcs15-oberthur.c | 8 ++++---- src/libopensc/pkcs15-prkey.c | 15 ++++++++++----- src/libopensc/pkcs15-pubkey.c | 4 ++-- src/libopensc/pkcs15.h | 10 ++++++---- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/libopensc/asn1.c b/src/libopensc/asn1.c index 1727cd08..1cd6285c 100644 --- a/src/libopensc/asn1.c +++ b/src/libopensc/asn1.c @@ -1422,6 +1422,13 @@ no_object: *obj = NULL; *objlen = 0; r = 0; + } else if (!buflen && (entry->flags & SC_ASN1_EMPTY_ALLOWED)) { + *obj = NULL; + *objlen = 0; + r = asn1_write_element(ctx, entry->tag, buf, buflen, obj, objlen); + if (r) + sc_debug(ctx, SC_LOG_DEBUG_ASN1, "error writing ASN.1 tag and length: %s\n", sc_strerror(r)); + } else if (buflen || entry->type == SC_ASN1_NULL || entry->tag & SC_ASN1_CONS) { r = asn1_write_element(ctx, entry->tag, diff --git a/src/libopensc/asn1.h b/src/libopensc/asn1.h index 43139f4a..f776bf45 100644 --- a/src/libopensc/asn1.h +++ b/src/libopensc/asn1.h @@ -124,6 +124,7 @@ void sc_asn1_clear_algorithm_id(struct sc_algorithm_id *); #define SC_ASN1_OPTIONAL 0x00000002 #define SC_ASN1_ALLOC 0x00000004 #define SC_ASN1_UNSIGNED 0x00000008 +#define SC_ASN1_EMPTY_ALLOWED 0x00000010 #define SC_ASN1_BOOLEAN 1 #define SC_ASN1_INTEGER 2 diff --git a/src/libopensc/pkcs15-oberthur.c b/src/libopensc/pkcs15-oberthur.c index 4fcaa689..cd79793c 100644 --- a/src/libopensc/pkcs15-oberthur.c +++ b/src/libopensc/pkcs15-oberthur.c @@ -803,11 +803,11 @@ sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, return SC_ERROR_UNKNOWN_DATA_RECEIVED; len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len) { - kinfo.subject = malloc(len); - if (!kinfo.subject) + kinfo.subject.value = malloc(len); + if (!kinfo.subject.value) SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_MEMORY_FAILURE, "Failed to add private key: memory allocation error"); - kinfo.subject_len = len; - memcpy(kinfo.subject, info_blob + offs + 2, len); + kinfo.subject.len = len; + memcpy(kinfo.subject.value, info_blob + offs + 2, len); } /* Modulus and exponent are ignored */ diff --git a/src/libopensc/pkcs15-prkey.c b/src/libopensc/pkcs15-prkey.c index 6b069550..db3acc37 100644 --- a/src/libopensc/pkcs15-prkey.c +++ b/src/libopensc/pkcs15-prkey.c @@ -39,7 +39,7 @@ static const struct sc_asn1_entry c_asn1_com_key_attr[] = { }; static const struct sc_asn1_entry c_asn1_com_prkey_attr[] = { - /* FIXME */ + { "subjectName", SC_ASN1_OCTET_STRING, SC_ASN1_TAG_SEQUENCE | SC_ASN1_CONS, SC_ASN1_EMPTY_ALLOWED | SC_ASN1_ALLOC, NULL, NULL }, { NULL, 0, 0, 0, NULL, NULL } }; @@ -106,7 +106,7 @@ int sc_pkcs15_decode_prkdf_entry(struct sc_pkcs15_card *p15card, struct sc_pkcs15_keyinfo_gostparams *keyinfo_gostparams; size_t usage_len = sizeof(info.usage); size_t af_len = sizeof(info.access_flags); - struct sc_asn1_entry asn1_com_key_attr[6], asn1_com_prkey_attr[1]; + struct sc_asn1_entry asn1_com_key_attr[6], asn1_com_prkey_attr[2]; struct sc_asn1_entry asn1_rsakey_attr[4], asn1_prk_rsa_attr[2]; struct sc_asn1_entry asn1_dsakey_attr[2], asn1_prk_dsa_attr[2], asn1_dsakey_i_p_attr[2], @@ -162,6 +162,8 @@ int sc_pkcs15_decode_prkdf_entry(struct sc_pkcs15_card *p15card, sc_format_asn1_entry(asn1_com_key_attr + 3, &info.access_flags, &af_len, 0); sc_format_asn1_entry(asn1_com_key_attr + 4, &info.key_reference, NULL, 0); + sc_format_asn1_entry(asn1_com_prkey_attr + 0, &info.subject.value, &info.subject.len, 0); + /* Fill in defaults */ memset(&info, 0, sizeof(info)); info.key_reference = -1; @@ -228,7 +230,7 @@ int sc_pkcs15_encode_prkdf_entry(sc_context_t *ctx, const struct sc_pkcs15_object *obj, u8 **buf, size_t *buflen) { - struct sc_asn1_entry asn1_com_key_attr[6], asn1_com_prkey_attr[1]; + struct sc_asn1_entry asn1_com_key_attr[6], asn1_com_prkey_attr[2]; struct sc_asn1_entry asn1_rsakey_attr[4], asn1_prk_rsa_attr[2]; struct sc_asn1_entry asn1_dsakey_attr[2], asn1_prk_dsa_attr[2], asn1_dsakey_value_attr[3], @@ -315,6 +317,9 @@ int sc_pkcs15_encode_prkdf_entry(sc_context_t *ctx, } if (prkey->key_reference >= 0) sc_format_asn1_entry(asn1_com_key_attr + 4, &prkey->key_reference, NULL, 1); + + sc_format_asn1_entry(asn1_com_prkey_attr + 0, prkey->subject.value, &prkey->subject.len, prkey->subject.len != 0); + r = sc_asn1_encode(ctx, asn1_prkey, buf, buflen); return r; @@ -504,8 +509,8 @@ sc_pkcs15_free_prkey(struct sc_pkcs15_prkey *key) void sc_pkcs15_free_prkey_info(sc_pkcs15_prkey_info_t *key) { - if (key->subject) - free(key->subject); + if (key->subject.value) + free(key->subject.value); if (key->params) free(key->params); free(key); diff --git a/src/libopensc/pkcs15-pubkey.c b/src/libopensc/pkcs15-pubkey.c index f9a817ae..6afedb3b 100644 --- a/src/libopensc/pkcs15-pubkey.c +++ b/src/libopensc/pkcs15-pubkey.c @@ -733,8 +733,8 @@ void sc_pkcs15_free_pubkey(struct sc_pkcs15_pubkey *key) void sc_pkcs15_free_pubkey_info(sc_pkcs15_pubkey_info_t *key) { - if (key->subject) - free(key->subject); + if (key->subject.value) + free(key->subject.value); if (key->params) free(key->params); free(key); diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index 4b05f966..4a67b889 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -269,8 +269,9 @@ struct sc_pkcs15_prkey_info { unsigned int usage, access_flags; int native, key_reference; size_t modulus_length; - u8 *subject; - size_t subject_len; + + struct sc_pkcs15_der subject; + void *params; size_t params_len; @@ -283,8 +284,9 @@ struct sc_pkcs15_pubkey_info { unsigned int usage, access_flags; int native, key_reference; size_t modulus_length; - u8 *subject; - size_t subject_len; + + struct sc_pkcs15_der subject; + void *params; size_t params_len;