libopensc: parse EF.DIR: no need to check the presence of mandatory AID after success of ASN1 decoding
use "struct sc_aid" git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5080 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
8f5f0b684a
commit
a1c3191ba1
|
@ -57,16 +57,17 @@ static int parse_dir_record(sc_card_t *card, u8 ** buf, size_t *buflen,
|
||||||
{
|
{
|
||||||
struct sc_asn1_entry asn1_dirrecord[5], asn1_dir[2];
|
struct sc_asn1_entry asn1_dirrecord[5], asn1_dir[2];
|
||||||
sc_app_info_t *app = NULL;
|
sc_app_info_t *app = NULL;
|
||||||
|
struct sc_aid aid;
|
||||||
|
u8 label[128], path[128], ddo[128];
|
||||||
|
size_t label_len = sizeof(label), path_len = sizeof(path), ddo_len = sizeof(ddo);
|
||||||
int r;
|
int r;
|
||||||
u8 aid[SC_MAX_AID_SIZE], label[128], path[128];
|
|
||||||
u8 ddo[128];
|
aid.len = sizeof(aid.value);
|
||||||
size_t aid_len = sizeof(aid), label_len = sizeof(label),
|
|
||||||
path_len = sizeof(path), ddo_len = sizeof(ddo);
|
|
||||||
|
|
||||||
sc_copy_asn1_entry(c_asn1_dirrecord, asn1_dirrecord);
|
sc_copy_asn1_entry(c_asn1_dirrecord, asn1_dirrecord);
|
||||||
sc_copy_asn1_entry(c_asn1_dir, asn1_dir);
|
sc_copy_asn1_entry(c_asn1_dir, asn1_dir);
|
||||||
sc_format_asn1_entry(asn1_dir + 0, asn1_dirrecord, NULL, 0);
|
sc_format_asn1_entry(asn1_dir + 0, asn1_dirrecord, NULL, 0);
|
||||||
sc_format_asn1_entry(asn1_dirrecord + 0, aid, &aid_len, 0);
|
sc_format_asn1_entry(asn1_dirrecord + 0, aid.value, &aid.len, 0);
|
||||||
sc_format_asn1_entry(asn1_dirrecord + 1, label, &label_len, 0);
|
sc_format_asn1_entry(asn1_dirrecord + 1, label, &label_len, 0);
|
||||||
sc_format_asn1_entry(asn1_dirrecord + 2, path, &path_len, 0);
|
sc_format_asn1_entry(asn1_dirrecord + 2, path, &path_len, 0);
|
||||||
sc_format_asn1_entry(asn1_dirrecord + 3, ddo, &ddo_len, 0);
|
sc_format_asn1_entry(asn1_dirrecord + 3, ddo, &ddo_len, 0);
|
||||||
|
@ -79,21 +80,20 @@ static int parse_dir_record(sc_card_t *card, u8 ** buf, size_t *buflen,
|
||||||
sc_strerror(r));
|
sc_strerror(r));
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
if (aid_len > SC_MAX_AID_SIZE) {
|
|
||||||
sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "AID is too long.\n");
|
|
||||||
return SC_ERROR_INVALID_ASN1_OBJECT;
|
|
||||||
}
|
|
||||||
app = calloc(1, sizeof(struct sc_app_info));
|
app = calloc(1, sizeof(struct sc_app_info));
|
||||||
if (app == NULL)
|
if (app == NULL)
|
||||||
return SC_ERROR_OUT_OF_MEMORY;
|
return SC_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(app->aid.value, aid, aid_len);
|
memcpy(&app->aid, &aid, sizeof(struct sc_aid));
|
||||||
app->aid.len = aid_len;
|
|
||||||
if (asn1_dirrecord[1].flags & SC_ASN1_PRESENT)
|
if (asn1_dirrecord[1].flags & SC_ASN1_PRESENT)
|
||||||
app->label = strdup((char *) label);
|
app->label = strdup((char *) label);
|
||||||
else
|
else
|
||||||
app->label = NULL;
|
app->label = NULL;
|
||||||
|
|
||||||
if (asn1_dirrecord[2].flags & SC_ASN1_PRESENT) {
|
if (asn1_dirrecord[2].flags & SC_ASN1_PRESENT) {
|
||||||
|
/* application path present: ignore AID */
|
||||||
if (path_len > SC_MAX_PATH_SIZE) {
|
if (path_len > SC_MAX_PATH_SIZE) {
|
||||||
sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Application path is too long.\n");
|
sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Application path is too long.\n");
|
||||||
free(app);
|
free(app);
|
||||||
|
@ -102,12 +102,14 @@ static int parse_dir_record(sc_card_t *card, u8 ** buf, size_t *buflen,
|
||||||
memcpy(app->path.value, path, path_len);
|
memcpy(app->path.value, path, path_len);
|
||||||
app->path.len = path_len;
|
app->path.len = path_len;
|
||||||
app->path.type = SC_PATH_TYPE_PATH;
|
app->path.type = SC_PATH_TYPE_PATH;
|
||||||
} else if (aid_len < sizeof(app->path.value)) {
|
}
|
||||||
memcpy(app->path.value, aid, aid_len);
|
else {
|
||||||
app->path.len = aid_len;
|
/* application path not present: use AID as application path */
|
||||||
|
memcpy(app->path.value, aid.value, aid.len);
|
||||||
|
app->path.len = aid.len;
|
||||||
app->path.type = SC_PATH_TYPE_DF_NAME;
|
app->path.type = SC_PATH_TYPE_DF_NAME;
|
||||||
} else
|
}
|
||||||
app->path.len = 0;
|
|
||||||
if (asn1_dirrecord[3].flags & SC_ASN1_PRESENT) {
|
if (asn1_dirrecord[3].flags & SC_ASN1_PRESENT) {
|
||||||
app->ddo.value = malloc(ddo_len);
|
app->ddo.value = malloc(ddo_len);
|
||||||
if (app->ddo.value == NULL) {
|
if (app->ddo.value == NULL) {
|
||||||
|
|
Loading…
Reference in New Issue