From 3168c8ea26551eb35def9c2879adec990902b452 Mon Sep 17 00:00:00 2001 From: okir Date: Wed, 4 Dec 2002 09:26:40 +0000 Subject: [PATCH] - added new cardctl SC_CARDCTL_GET_DEFAULT_KEY to get default transport keys git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@741 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-gpk.c | 26 +++++++++++++++++++++++++- src/libopensc/cardctl.h | 13 +++++++++++++ src/libopensc/errors.h | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/libopensc/card-gpk.c b/src/libopensc/card-gpk.c index 3ed685a9..83c3a645 100644 --- a/src/libopensc/card-gpk.c +++ b/src/libopensc/card-gpk.c @@ -73,7 +73,8 @@ struct gpk_private_data { * should really query for this during gpk_init */ unsigned int offset_shift; unsigned int offset_mask; - unsigned int locked : 1; + unsigned int locked : 1, + sample_card : 1; /* access control bits of file most recently selected */ unsigned short int ac[3]; @@ -222,6 +223,10 @@ gpk_init(struct sc_card *card) if (info[12] & 0x08) { priv->locked = 1; } + /* Sample cards use a transport key of "TEST KEYTEST KEY" */ + if (!memcmp(info+5, "\x00\xff\x00", 3)) { + priv->sample_card = 1; + } } return 0; @@ -1725,6 +1730,22 @@ gpk_pkfile_load(struct sc_card *card, struct sc_cardctl_gpk_pkload *args) SC_FUNC_RETURN(card->ctx, 1, r); } +/* + * This function lets pkcs15init query for the transport key + */ +static int +gpk_get_default_key(struct sc_card *card, struct sc_cardctl_default_key *data) +{ + if (data->method == SC_AC_PRO && data->key_ref == 1) { + if (data->len < 16) + return SC_ERROR_BUFFER_TOO_SMALL; + memcpy(data->key_data, "TEST KEYTEST KEY", 16); + data->len = 16; + return 0; + } + return SC_ERROR_NO_DEFAULT_KEY; +} + /* * Get the maximum size of a session key the card is * willing to decrypt @@ -1788,6 +1809,9 @@ gpk_card_ctl(struct sc_card *card, unsigned long cmd, void *ptr) switch (cmd) { case SC_CARDCTL_ERASE_CARD: return gpk_erase_card(card); + case SC_CARDCTL_GET_DEFAULT_KEY: + return gpk_get_default_key(card, + (struct sc_cardctl_default_key *) ptr); case SC_CARDCTL_GPK_VARIANT: *(int *) ptr = DRVDATA(card)->variant; return 0; diff --git a/src/libopensc/cardctl.h b/src/libopensc/cardctl.h index e7863ca3..957b1c92 100644 --- a/src/libopensc/cardctl.h +++ b/src/libopensc/cardctl.h @@ -27,6 +27,7 @@ enum { */ SC_CARDCTL_GENERIC_BASE = 0x00000000, SC_CARDCTL_ERASE_CARD, + SC_CARDCTL_GET_DEFAULT_KEY, /* * GPK specific calls @@ -65,6 +66,18 @@ enum { SC_CARDCTL_ETOKEN_GENERATE_KEY }; +/* + * Generic cardctl - check if the required key is a default + * key (such as the GPK "TEST KEYTEST KEY" key, or the Cryptoflex AAK) + */ +struct sc_cardctl_default_key { + int method; /* SC_AC_XXX */ + int key_ref; /* key reference */ + + size_t len; /* in: max size, out: actual size */ + u8 * key_data; /* out: key data */ +}; + /* * GPK lock file. * Parent DF of file must be selected. diff --git a/src/libopensc/errors.h b/src/libopensc/errors.h index 0db6bb11..b8b21b59 100644 --- a/src/libopensc/errors.h +++ b/src/libopensc/errors.h @@ -82,6 +82,7 @@ extern "C" { #define SC_ERROR_SYNTAX_ERROR -1501 #define SC_ERROR_INCONSISTENT_PROFILE -1502 #define SC_ERROR_INCOMPATIBLE_KEY -1503 +#define SC_ERROR_NO_DEFAULT_KEY -1504 /* Errors that do not fit the categories above */ #define SC_ERROR_UNKNOWN -1900