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:
parent
f85b625b47
commit
b78d7630e7
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue