- 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
This commit is contained in:
okir 2002-12-04 09:26:40 +00:00
parent 6df8dbbed3
commit 3168c8ea26
3 changed files with 39 additions and 1 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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