From 7b6371dae1ffe88d15c7e2721d0da9a10702100c Mon Sep 17 00:00:00 2001 From: jey Date: Wed, 20 Mar 2002 19:31:56 +0000 Subject: [PATCH] - Added Olaf's ASN.1 wrapping magic git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@350 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/pkcs11/framework-pkcs15.c | 39 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/pkcs11/framework-pkcs15.c b/src/pkcs11/framework-pkcs15.c index 922279dd..61675023 100644 --- a/src/pkcs11/framework-pkcs15.c +++ b/src/pkcs11/framework-pkcs15.c @@ -79,6 +79,7 @@ static int get_modulus(struct sc_pkcs15_pubkey_rsa *, CK_ATTRIBUTE_PTR); static int get_modulus_bits(struct sc_pkcs15_pubkey_rsa *, CK_ATTRIBUTE_PTR); +static int asn1_sequence_wrapper(const u8 *, size_t, CK_ATTRIBUTE_PTR); /* PKCS#15 Framework */ @@ -526,13 +527,13 @@ CK_RV pkcs15_cert_get_attribute(struct sc_pkcs11_session *session, memcpy(attr->pValue, cert->certificate->serial, cert->certificate->serial_len); break; case CKA_SUBJECT: - check_attribute_buffer(attr, cert->certificate->subject_len); - memcpy(attr->pValue, cert->certificate->subject, cert->certificate->subject_len); - break; + return asn1_sequence_wrapper(cert->certificate->subject, + cert->certificate->subject_len, + attr); case CKA_ISSUER: - check_attribute_buffer(attr, cert->certificate->issuer_len); - memcpy(attr->pValue, cert->certificate->issuer, cert->certificate->issuer_len); - break; + return asn1_sequence_wrapper(cert->certificate->issuer, + cert->certificate->issuer_len, + attr); default: return CKR_ATTRIBUTE_TYPE_INVALID; } @@ -970,3 +971,29 @@ get_public_exponent(struct sc_pkcs15_pubkey_rsa *key, CK_ATTRIBUTE_PTR attr) memcpy(attr->pValue, exponent, n); return CKR_OK; } + +static int +asn1_sequence_wrapper(const u8 *data, size_t len, CK_ATTRIBUTE_PTR attr) +{ + u8 *dest; + unsigned int n; + + check_attribute_buffer(attr, len + 1 + sizeof(len)); + + dest = attr->pValue; + *dest++ = 0x30; /* SEQUENCE tag */ + if (len <= 127) { + *dest++ = len; + } else { + for (n = 4; (len & 0xFF000000) == 0; n--) + len <<= 8; + *dest++ = 0x80 + n; + while (n--) { + *dest++ = len >> 24; + len <<= 8; + } + } + memcpy(dest, data, len); + attr->ulValueLen = (dest - (u8 *) attr->pValue) + len; + return CKR_OK; +}