pkcs15: encode/decode 'subjectName' in 'CommonPrivateKeyAttributes'

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4512 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
viktor.tarasov 2010-07-05 13:29:10 +00:00
parent f85b625b47
commit b78d7630e7
6 changed files with 30 additions and 15 deletions

View File

@ -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,

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -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);

View File

@ -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;