diff --git a/src/libopensc/pkcs15-cert.c b/src/libopensc/pkcs15-cert.c index 84edafc0..b965b655 100644 --- a/src/libopensc/pkcs15-cert.c +++ b/src/libopensc/pkcs15-cert.c @@ -250,9 +250,16 @@ int sc_pkcs15_decode_cdf_entry(struct sc_pkcs15_card *p15card, if (r == SC_ERROR_ASN1_END_OF_CONTENTS) return r; SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "ASN.1 decoding failed"); - r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); - if (r < 0) - return r; + + if (!p15card->app || !p15card->app->ddo.aid.len) { + r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); + SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "Cannot make absolute path"); + } + else { + info.path.aid = p15card->app->ddo.aid; + } + sc_debug(ctx, SC_LOG_DEBUG_ASN1, "Certificate path '%s'", sc_print_path(&info.path)); + obj->type = SC_PKCS15_TYPE_CERT_X509; obj->data = malloc(sizeof(info)); if (obj->data == NULL) diff --git a/src/libopensc/pkcs15-data.c b/src/libopensc/pkcs15-data.c index b9ed0669..1c881a35 100644 --- a/src/libopensc/pkcs15-data.c +++ b/src/libopensc/pkcs15-data.c @@ -113,9 +113,16 @@ int sc_pkcs15_decode_dodf_entry(struct sc_pkcs15_card *p15card, if (r == SC_ERROR_ASN1_END_OF_CONTENTS) return r; SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "ASN.1 decoding failed"); - r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); - if (r < 0) - return r; + + if (!p15card->app || !p15card->app->ddo.aid.len) { + r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); + if (r < 0) + return r; + } + else { + info.path.aid = p15card->app->ddo.aid; + } + obj->type = SC_PKCS15_TYPE_DATA_OBJECT; obj->data = malloc(sizeof(info)); if (obj->data == NULL) diff --git a/src/libopensc/pkcs15-prkey.c b/src/libopensc/pkcs15-prkey.c index 88641d26..c3409c90 100644 --- a/src/libopensc/pkcs15-prkey.c +++ b/src/libopensc/pkcs15-prkey.c @@ -205,12 +205,19 @@ int sc_pkcs15_decode_prkdf_entry(struct sc_pkcs15_card *p15card, sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Neither RSA or DSA or GOSTR3410 key in PrKDF entry."); SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_ASN1_OBJECT); } - r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); - if (r < 0) { - if (info.params) - free(info.params); - return r; + + if (!p15card->app || !p15card->app->ddo.aid.len) { + r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); + if (r < 0) { + if (info.params) + free(info.params); + return r; + } } + else { + info.path.aid = p15card->app->ddo.aid; + } + sc_debug(ctx, SC_LOG_DEBUG_ASN1, "PrivKey path '%s'", sc_print_path(&info.path)); /* OpenSC 0.11.4 and older encoded "keyReference" as a negative value. Fixed in 0.11.5 we need to add a hack, so old cards diff --git a/src/libopensc/pkcs15-pubkey.c b/src/libopensc/pkcs15-pubkey.c index 88af79d2..cd61eb05 100644 --- a/src/libopensc/pkcs15-pubkey.c +++ b/src/libopensc/pkcs15-pubkey.c @@ -201,12 +201,18 @@ int sc_pkcs15_decode_pukdf_entry(struct sc_pkcs15_card *p15card, } else { obj->type = SC_PKCS15_TYPE_PUBKEY_DSA; } - r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); - if (r < 0) { - if (info.params) - free(info.params); - return r; + if (!p15card->app || !p15card->app->ddo.aid.len) { + r = sc_pkcs15_make_absolute_path(&p15card->file_app->path, &info.path); + if (r < 0) { + if (info.params) + free(info.params); + return r; + } } + else { + info.path.aid = p15card->app->ddo.aid; + } + sc_debug(ctx, SC_LOG_DEBUG_ASN1, "PubKey path '%s'", sc_print_path(&info.path)); /* OpenSC 0.11.4 and older encoded "keyReference" as a negative value. Fixed in 0.11.5 we need to add a hack, so old cards