oberthur: add in emulator and create in pkcs15init the private data object

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4253 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
viktor.tarasov 2010-04-18 14:51:44 +00:00
parent 3c813ce57b
commit 0004461734
4 changed files with 53 additions and 23 deletions

View File

@ -487,7 +487,7 @@ sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card,
struct sc_context *ctx = p15card->card->ctx;
size_t ii;
int rv;
int no_more_private_keys = 0;
int no_more_private_keys = 0, no_more_private_data = 0;
SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
@ -499,7 +499,7 @@ sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card,
file_id = 0x100 * *(buff+ii + 1) + *(buff+ii + 2);
size = 0x100 * *(buff+ii + 3) + *(buff+ii + 4);
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "add private object (file-id:%04X,size:%X)", file_id, size);
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "add private object (file-id:%04X, size:%X)", file_id, size);
switch (*(buff+ii + 1)) {
case BASE_ID_PRV_RSA :
@ -524,6 +524,24 @@ sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card,
case BASE_ID_PRV_DES :
break;
case BASE_ID_PRV_DATA :
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "*(buff+ii + 1):%X", *(buff+ii + 1));
if (no_more_private_data)
break;
/* There are private data objects, so set LOGIN_REQUIRED flag */
p15card->flags |= SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED;
rv = sc_pkcs15emu_oberthur_add_data(p15card, file_id, size, 1);
if (rv == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED && postpone_allowed) {
struct sc_path path;
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "postpone adding of the private data");
sc_format_path("5011A6A6", &path);
rv = sc_pkcs15_add_df(p15card, SC_PKCS15_DODF, &path, NULL);
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Add DODF error");
no_more_private_data = 1;
}
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot parse private data info");
break;
default:
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Private object parse error");
@ -830,8 +848,7 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card,
struct sc_pkcs15_object dobj;
unsigned flags;
unsigned char *info_blob = NULL, *label = NULL, *app = NULL, *oid = NULL;
size_t info_len, label_len, app_len, oid_len;
size_t offs;
size_t info_len, label_len, app_len, oid_len, offs;
char ch_tmp[0x100];
int rv;
@ -840,10 +857,7 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card,
memset(&dinfo, 0, sizeof(dinfo));
memset(&dobj, 0, sizeof(dobj));
if (private)
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_NOT_SUPPORTED, "Failed to add data: 'private' attribut not supported");
else
snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id | 0x100);
snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", private ? AWP_OBJECTS_DF_PRV : AWP_OBJECTS_DF_PUB, file_id | 0x100);
rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1);
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add data: read oberthur file error");
@ -883,7 +897,8 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card,
oid_len -= 2;
}
snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id);
snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", private ? AWP_OBJECTS_DF_PRV : AWP_OBJECTS_DF_PUB, file_id);
sc_format_path(ch_tmp, &dinfo.path);
memcpy(dobj.label, label, label_len);
@ -894,6 +909,14 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card,
if (flags & OBERTHUR_ATTR_MODIFIABLE)
dobj.flags |= SC_PKCS15_CO_FLAG_MODIFIABLE;
if (private) {
dobj.auth_id.len = sizeof(PinDomainID) > sizeof(dobj.auth_id.value)
? sizeof(dobj.auth_id.value) : sizeof(PinDomainID);
memcpy(dobj.auth_id.value, PinDomainID, dobj.auth_id.len);
dobj.flags |= SC_PKCS15_CO_FLAG_PRIVATE;
}
rv = sc_pkcs15emu_add_data_object(p15card, &dobj, &dinfo);
SC_FUNC_RETURN(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, rv);
@ -1061,7 +1084,7 @@ sc_awp_parse_df(struct sc_pkcs15_card *p15card, struct sc_pkcs15_df *df)
int rv;
SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
if (df->type != SC_PKCS15_PRKDF)
if (df->type != SC_PKCS15_PRKDF && df->type != SC_PKCS15_DODF)
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_NOT_SUPPORTED);
if (df->enumerated)

View File

@ -89,10 +89,10 @@ filesystem {
}
# Private data
EF OberthurAWP-private-data-info {
EF OberthurAWP-privdata-info {
ACL = WRITE=CHV1, UPDATE=CHV1, READ=CHV1;
}
EF template-private-data {
EF template-privdata {
file-id = 6000;
ACL = WRITE=CHV1, UPDATE=CHV1, READ=CHV1;
}

View File

@ -82,6 +82,7 @@ awp_get_commonName(X509 *x)
return ret;
}
static int
awp_new_file(struct sc_pkcs15_card *p15card, struct sc_profile *profile,
unsigned int type, unsigned int num,
@ -117,6 +118,11 @@ awp_new_file(struct sc_pkcs15_card *p15card, struct sc_profile *profile,
itag = "data-info";
otag = "template-data";
break;
case COSM_TYPE_PRIVDATA_OBJECT:
desc = "Oberthur AWP private data object info";
itag = "privdata-info";
otag = "template-privdata";
break;
case SC_PKCS15_TYPE_AUTH_PIN:
case COSM_TOKENINFO :
desc = "Oberthur AWP token info";
@ -741,25 +747,25 @@ awp_update_object_list(struct sc_pkcs15_card *p15card, struct sc_profile *profil
switch (type) {
case SC_PKCS15_TYPE_CERT_X509:
snprintf(obj_name, NAME_MAX_LEN, "template-certificate");
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list",
COSM_TITLE);
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list", COSM_TITLE);
break;
case SC_PKCS15_TYPE_PUBKEY_RSA:
case COSM_TYPE_PUBKEY_RSA:
snprintf(obj_name, NAME_MAX_LEN, "template-public-key");
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list",
COSM_TITLE);
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list", COSM_TITLE);
break;
case SC_PKCS15_TYPE_DATA_OBJECT:
snprintf(obj_name, NAME_MAX_LEN, "template-data");
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list",
COSM_TITLE);
snprintf(lst_name, NAME_MAX_LEN,"%s-public-list", COSM_TITLE);
break;
case COSM_TYPE_PRIVDATA_OBJECT:
snprintf(obj_name, NAME_MAX_LEN, "template-privdata");
snprintf(lst_name, NAME_MAX_LEN,"%s-private-list", COSM_TITLE);
break;
case SC_PKCS15_TYPE_PRKEY_RSA:
case COSM_TYPE_PRKEY_RSA:
snprintf(obj_name, NAME_MAX_LEN,"template-private-key");
snprintf(lst_name, NAME_MAX_LEN,"%s-private-list",
COSM_TITLE);
snprintf(lst_name, NAME_MAX_LEN,"%s-private-list", COSM_TITLE);
break;
default:
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Not supported file type %X", type);
@ -1633,7 +1639,7 @@ awp_update_df_create_data(struct sc_pkcs15_card *p15card, struct sc_profile *pro
struct awp_data_info idata;
struct sc_pkcs15_der der;
struct sc_path path;
unsigned obj_id;
unsigned obj_id, obj_type = obj->auth_id.len ? COSM_TYPE_PRIVDATA_OBJECT : SC_PKCS15_TYPE_DATA_OBJECT;
int rv;
SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_NORMAL);
@ -1642,7 +1648,7 @@ awp_update_df_create_data(struct sc_pkcs15_card *p15card, struct sc_profile *pro
path = ((struct sc_pkcs15_data_info *)obj->data)->path;
obj_id = (path.value[path.len-1] & 0xFF) + (path.value[path.len-2] & 0xFF) * 0x100;
rv = awp_new_file(p15card, profile, obj->type, obj_id & 0xFF, &info_file, &obj_file);
rv = awp_new_file(p15card, profile, obj_type, obj_id & 0xFF, &info_file, &obj_file);
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "COSM new file error");
memset(&idata, 0, sizeof(idata));
@ -1653,7 +1659,7 @@ awp_update_df_create_data(struct sc_pkcs15_card *p15card, struct sc_profile *pro
rv = awp_set_data_info(p15card, profile, info_file, &idata);
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "'Create Data' update DF failed: cannot set info");
rv = awp_update_object_list(p15card, profile, obj->type, obj_id & 0xFF);
rv = awp_update_object_list(p15card, profile, obj_type, obj_id & 0xFF);
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "'Create Data' update DF failed: cannot update list");
awp_free_data_info(&idata);

View File

@ -33,6 +33,7 @@
#define COSM_TOKENINFO (SC_DEVICE_SPECIFIC_TYPE | 0x05)
#define COSM_TYPE_PRKEY_RSA (SC_DEVICE_SPECIFIC_TYPE | SC_PKCS15_TYPE_PRKEY_RSA)
#define COSM_TYPE_PUBKEY_RSA (SC_DEVICE_SPECIFIC_TYPE | SC_PKCS15_TYPE_PUBKEY_RSA)
#define COSM_TYPE_PRIVDATA_OBJECT (SC_DEVICE_SPECIFIC_TYPE | 0x06)
#define COSM_TITLE "OberthurAWP"