pkcs15: add 'aid' parameter to the prototype of the 'bind' functions ...
prepare for the multi-application support git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5041 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
103af724fe
commit
f2924672d8
|
@ -584,7 +584,7 @@ void sc_pkcs15_card_clear(sc_pkcs15_card_t *p15card)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sc_pkcs15_bind_internal(sc_pkcs15_card_t *p15card)
|
static int sc_pkcs15_bind_internal(sc_pkcs15_card_t *p15card, struct sc_aid *aid)
|
||||||
{
|
{
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
int err, ok = 0;
|
int err, ok = 0;
|
||||||
|
@ -614,6 +614,7 @@ static int sc_pkcs15_bind_internal(sc_pkcs15_card_t *p15card)
|
||||||
const sc_app_info_t *info;
|
const sc_app_info_t *info;
|
||||||
|
|
||||||
info = sc_find_pkcs15_app(card);
|
info = sc_find_pkcs15_app(card);
|
||||||
|
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "info '%p'", info);
|
||||||
if (info != NULL) {
|
if (info != NULL) {
|
||||||
if (info->path.len)
|
if (info->path.len)
|
||||||
p15card->file_app->path = info->path;
|
p15card->file_app->path = info->path;
|
||||||
|
@ -641,10 +642,12 @@ static int sc_pkcs15_bind_internal(sc_pkcs15_card_t *p15card)
|
||||||
/* check if an ODF is present; we don't know yet whether we have a pkcs15 card */
|
/* check if an ODF is present; we don't know yet whether we have a pkcs15 card */
|
||||||
tmppath = p15card->file_app->path;
|
tmppath = p15card->file_app->path;
|
||||||
sc_append_path_id(&tmppath, (const u8 *) "\x50\x31", 2);
|
sc_append_path_id(&tmppath, (const u8 *) "\x50\x31", 2);
|
||||||
|
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "tmppath '%s'", sc_print_path(&tmppath));
|
||||||
err = sc_select_file(card, &tmppath, &p15card->file_odf);
|
err = sc_select_file(card, &tmppath, &p15card->file_odf);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
tmppath = p15card->file_odf->path;
|
tmppath = p15card->file_odf->path;
|
||||||
|
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "tmppath '%s'", sc_print_path(&tmppath));
|
||||||
sc_file_free(p15card->file_odf);
|
sc_file_free(p15card->file_odf);
|
||||||
p15card->file_odf = NULL;
|
p15card->file_odf = NULL;
|
||||||
err = sc_select_file(card, &tmppath, &p15card->file_odf);
|
err = sc_select_file(card, &tmppath, &p15card->file_odf);
|
||||||
|
@ -758,7 +761,8 @@ end:
|
||||||
return SC_SUCCESS;
|
return SC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sc_pkcs15_bind(sc_card_t *card, struct sc_pkcs15_card **p15card_out)
|
int sc_pkcs15_bind(sc_card_t *card, struct sc_aid *aid,
|
||||||
|
struct sc_pkcs15_card **p15card_out)
|
||||||
{
|
{
|
||||||
struct sc_pkcs15_card *p15card = NULL;
|
struct sc_pkcs15_card *p15card = NULL;
|
||||||
sc_context_t *ctx = card->ctx;
|
sc_context_t *ctx = card->ctx;
|
||||||
|
@ -801,11 +805,11 @@ int sc_pkcs15_bind(sc_card_t *card, struct sc_pkcs15_card **p15card_out)
|
||||||
r = sc_pkcs15_bind_synthetic(p15card);
|
r = sc_pkcs15_bind_synthetic(p15card);
|
||||||
if (r == SC_SUCCESS)
|
if (r == SC_SUCCESS)
|
||||||
goto done;
|
goto done;
|
||||||
r = sc_pkcs15_bind_internal(p15card);
|
r = sc_pkcs15_bind_internal(p15card, aid);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto error;
|
goto error;
|
||||||
} else {
|
} else {
|
||||||
r = sc_pkcs15_bind_internal(p15card);
|
r = sc_pkcs15_bind_internal(p15card, aid);
|
||||||
if (r == SC_SUCCESS)
|
if (r == SC_SUCCESS)
|
||||||
goto done;
|
goto done;
|
||||||
r = sc_pkcs15_bind_synthetic(p15card);
|
r = sc_pkcs15_bind_synthetic(p15card);
|
||||||
|
@ -813,7 +817,7 @@ int sc_pkcs15_bind(sc_card_t *card, struct sc_pkcs15_card **p15card_out)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
r = sc_pkcs15_bind_internal(p15card);
|
r = sc_pkcs15_bind_internal(p15card, aid);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -503,7 +503,7 @@ typedef struct sc_pkcs15_card {
|
||||||
* and initializes a new PKCS #15 card object. Will return
|
* and initializes a new PKCS #15 card object. Will return
|
||||||
* SC_ERROR_PKCS15_APP_NOT_FOUND, if the card hasn't got a
|
* SC_ERROR_PKCS15_APP_NOT_FOUND, if the card hasn't got a
|
||||||
* valid PKCS #15 file structure. */
|
* valid PKCS #15 file structure. */
|
||||||
int sc_pkcs15_bind(struct sc_card *card,
|
int sc_pkcs15_bind(struct sc_card *card, struct sc_aid *aid,
|
||||||
struct sc_pkcs15_card **pkcs15_card);
|
struct sc_pkcs15_card **pkcs15_card);
|
||||||
/* sc_pkcs15_unbind: Releases a PKCS #15 card object, and frees any
|
/* sc_pkcs15_unbind: Releases a PKCS #15 card object, and frees any
|
||||||
* memory allocations done on the card object. */
|
* memory allocations done on the card object. */
|
||||||
|
|
|
@ -53,6 +53,10 @@ struct sc_object_id {
|
||||||
int value[SC_MAX_OBJECT_ID_OCTETS];
|
int value[SC_MAX_OBJECT_ID_OCTETS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sc_aid {
|
||||||
|
unsigned char value[SC_MAX_AID_SIZE];
|
||||||
|
size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
#define SC_PATH_TYPE_FILE_ID 0
|
#define SC_PATH_TYPE_FILE_ID 0
|
||||||
#define SC_PATH_TYPE_DF_NAME 1
|
#define SC_PATH_TYPE_DF_NAME 1
|
||||||
|
|
|
@ -163,7 +163,7 @@ static CK_RV pkcs15_bind(struct sc_pkcs11_card *p11card)
|
||||||
return CKR_HOST_MEMORY;
|
return CKR_HOST_MEMORY;
|
||||||
p11card->fw_data = fw_data;
|
p11card->fw_data = fw_data;
|
||||||
|
|
||||||
rc = sc_pkcs15_bind(p11card->card, &fw_data->p15_card);
|
rc = sc_pkcs15_bind(p11card->card, NULL, &fw_data->p15_card);
|
||||||
if (rc != SC_SUCCESS) {
|
if (rc != SC_SUCCESS) {
|
||||||
sc_debug(context, SC_LOG_DEBUG_NORMAL, "sc_pkcs15_bind failed: %d", rc);
|
sc_debug(context, SC_LOG_DEBUG_NORMAL, "sc_pkcs15_bind failed: %d", rc);
|
||||||
return sc_to_cryptoki_error(rc, NULL);
|
return sc_to_cryptoki_error(rc, NULL);
|
||||||
|
|
|
@ -459,7 +459,7 @@ sc_pkcs15init_erase_card(struct sc_pkcs15_card *p15card, struct sc_profile *prof
|
||||||
{
|
{
|
||||||
/* Needs the 'SOPIN' AUTH pkcs15 object.
|
/* Needs the 'SOPIN' AUTH pkcs15 object.
|
||||||
* So that, SOPIN can be found by it's reference. */
|
* So that, SOPIN can be found by it's reference. */
|
||||||
if (sc_pkcs15_bind(p15card->card, &p15card) >= 0)
|
if (sc_pkcs15_bind(p15card->card, NULL, &p15card) >= 0)
|
||||||
profile->p15_data = p15card;
|
profile->p15_data = p15card;
|
||||||
|
|
||||||
if (profile->ops->erase_card == NULL)
|
if (profile->ops->erase_card == NULL)
|
||||||
|
|
|
@ -112,7 +112,7 @@ int main(int argc, char *argv[])
|
||||||
printf("Looking for a PKCS#15 compatible Smart Card... ");
|
printf("Looking for a PKCS#15 compatible Smart Card... ");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
sc_lock(card);
|
sc_lock(card);
|
||||||
i = sc_pkcs15_bind(card, &p15card);
|
i = sc_pkcs15_bind(card, NULL, &p15card);
|
||||||
/* Keep card locked to prevent useless calls to sc_logout */
|
/* Keep card locked to prevent useless calls to sc_logout */
|
||||||
if (i) {
|
if (i) {
|
||||||
fprintf(stderr, "failed: %s\n", sc_strerror(i));
|
fprintf(stderr, "failed: %s\n", sc_strerror(i));
|
||||||
|
|
|
@ -91,7 +91,7 @@ int main(int argc, char *argv[])
|
||||||
printf("Looking for a PKCS#15 compatible Smart Card... ");
|
printf("Looking for a PKCS#15 compatible Smart Card... ");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
sc_lock(card);
|
sc_lock(card);
|
||||||
i = sc_pkcs15_bind(card, &p15card);
|
i = sc_pkcs15_bind(card, NULL, &p15card);
|
||||||
sc_unlock(card);
|
sc_unlock(card);
|
||||||
if (i) {
|
if (i) {
|
||||||
fprintf(stderr, "failed: %s\n", sc_strerror(i));
|
fprintf(stderr, "failed: %s\n", sc_strerror(i));
|
||||||
|
|
|
@ -579,7 +579,7 @@ int main(int argc, char * const argv[])
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "Trying to find a PKCS #15 compatible card...\n");
|
fprintf(stderr, "Trying to find a PKCS #15 compatible card...\n");
|
||||||
r = sc_pkcs15_bind(card, &p15card);
|
r = sc_pkcs15_bind(card, NULL, &p15card);
|
||||||
if (r) {
|
if (r) {
|
||||||
fprintf(stderr, "PKCS #15 binding failed: %s\n", sc_strerror(r));
|
fprintf(stderr, "PKCS #15 binding failed: %s\n", sc_strerror(r));
|
||||||
err = 1;
|
err = 1;
|
||||||
|
|
|
@ -450,7 +450,7 @@ main(int argc, char **argv)
|
||||||
&& action != ACTION_ASSERT_PRISTINE
|
&& action != ACTION_ASSERT_PRISTINE
|
||||||
&& p15card == NULL) {
|
&& p15card == NULL) {
|
||||||
/* Read the PKCS15 structure from the card */
|
/* Read the PKCS15 structure from the card */
|
||||||
r = sc_pkcs15_bind(card, &p15card);
|
r = sc_pkcs15_bind(card, NULL, &p15card);
|
||||||
if (r) {
|
if (r) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"PKCS#15 binding failed: %s\n",
|
"PKCS#15 binding failed: %s\n",
|
||||||
|
|
|
@ -1724,7 +1724,7 @@ int main(int argc, char * const argv[])
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "Trying to find a PKCS#15 compatible card...\n");
|
fprintf(stderr, "Trying to find a PKCS#15 compatible card...\n");
|
||||||
r = sc_pkcs15_bind(card, &p15card);
|
r = sc_pkcs15_bind(card, NULL, &p15card);
|
||||||
if (r) {
|
if (r) {
|
||||||
fprintf(stderr, "PKCS#15 binding failed: %s\n", sc_strerror(r));
|
fprintf(stderr, "PKCS#15 binding failed: %s\n", sc_strerror(r));
|
||||||
err = 1;
|
err = 1;
|
||||||
|
|
Loading…
Reference in New Issue