From d26637455ea34889e61ed8b50c73ddc34ef484bb Mon Sep 17 00:00:00 2001 From: okir Date: Mon, 17 Jun 2002 15:24:21 +0000 Subject: [PATCH] - added cardctl SC_CARDCTL_GPK_VARIANT git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@662 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-gpk.c | 23 ++++++++++++++++++++++- src/libopensc/cardctl.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/libopensc/card-gpk.c b/src/libopensc/card-gpk.c index 9dfbe760..747bc815 100644 --- a/src/libopensc/card-gpk.c +++ b/src/libopensc/card-gpk.c @@ -1549,6 +1549,9 @@ gpk_pkfile_init(struct sc_card *card, struct sc_cardctl_gpk_pkinit *args) struct sc_apdu apdu; int r; + if (card->ctx->debug) + debug(card->ctx, "gpk_pkfile_init(%u)\n", args->privlen); + memset(&apdu, 0, sizeof(apdu)); apdu.cse = SC_APDU_CASE_1; apdu.cla = 0x80; @@ -1577,12 +1580,27 @@ gpk_pkfile_load(struct sc_card *card, struct sc_cardctl_gpk_pkload *args) u8 temp[256]; int r; + debug(card->ctx, "gpk_pkfile_load(fid=%04x, len=%d, datalen=%d)\n", + args->file->id, args->len, args->datalen); + +#if 0 + if (card->ctx->debug > 5) { + char buf[2048]; + + sc_hex_dump(card->ctx, args->data, args->datalen, + buf, sizeof(buf)); + debug(card->ctx, "Sending %d bytes (cleartext):\n%s", + args->datalen, buf); + } +#endif + apdu.cse = SC_APDU_CASE_3_SHORT; apdu.cla = 0x80; apdu.ins = 0x18; apdu.p1 = args->file->id & 0x1F; apdu.p2 = args->len; apdu.lc = args->datalen; + apdu.sensitive = 1; /* encrypt the private key material */ assert(args->datalen <= sizeof(temp)); @@ -1608,7 +1626,7 @@ gpk_pkfile_load(struct sc_card *card, struct sc_cardctl_gpk_pkload *args) r = sc_check_sw(card, apdu.sw1, apdu.sw2); SC_TEST_RET(card->ctx, r, "Card returned error"); - return r; + SC_FUNC_RETURN(card->ctx, 1, r); } /* @@ -1647,6 +1665,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_GPK_VARIANT: + *(int *) ptr = DRVDATA(card)->variant; + return 0; case SC_CARDCTL_GPK_LOCK: return gpk_lock(card, (struct sc_cardctl_gpk_lock *) ptr); case SC_CARDCTL_GPK_PKINIT: diff --git a/src/libopensc/cardctl.h b/src/libopensc/cardctl.h index fdbdfd13..79220043 100644 --- a/src/libopensc/cardctl.h +++ b/src/libopensc/cardctl.h @@ -32,6 +32,7 @@ enum { * GPK specific calls */ SC_CARDCTL_GPK_BASE = _CTL_PREFIX('G', 'P', 'K'), + SC_CARDCTL_GPK_VARIANT, SC_CARDCTL_GPK_LOCK, SC_CARDCTL_GPK_PKINIT, SC_CARDCTL_GPK_PKLOAD,