From 5088c7daa2f71ee209246d9cfb6d2746faf06c9f Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Fri, 4 Nov 2011 13:43:13 +0000 Subject: [PATCH] added chat for signature terminal and some error codes git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@614 96b47cad-a561-4643-ad3b-153ac7d7599c --- ccid/src/cats-test.c | 74 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/ccid/src/cats-test.c b/ccid/src/cats-test.c index 43bc7b0..b3deddb 100644 --- a/ccid/src/cats-test.c +++ b/ccid/src/cats-test.c @@ -73,6 +73,42 @@ static LONG parse_EstablishPACEChannel_OutputData( switch (result) { case 0x00000000: break; + case 0xD0000001: + fprintf(stderr, "Längen im Input sind inkonsistent\n"); + return SCARD_F_COMM_ERROR; + case 0xD0000002: + fprintf(stderr, "Unerwartete Daten im Input\n"); + return SCARD_F_COMM_ERROR; + case 0xD0000003: + fprintf(stderr, "Unerwartete Kombination von Daten im Input\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000001: + fprintf(stderr, "Syntaxfehler im Aufbau der TLV-Antwortdaten\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000002: + fprintf(stderr, "Unerwartete/fehlende Objekte in den TLV-Antwortdaten\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000003: + fprintf(stderr, "Der Kartenleser kennt die PIN-ID nicht.\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000006: + fprintf(stderr, "Fehlerhaftes PACE-Token\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000007: + fprintf(stderr, "Zertifikatskette für Terminalauthentisierung kann nicht gebildet werden\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000008: + fprintf(stderr, "Unerwartete Datenstruktur in Rückgabe der Chipauthentisierung\n"); + return SCARD_F_COMM_ERROR; + case 0xE0000009: + fprintf(stderr, "Passive Authentisierung fehlgeschlagen\n"); + return SCARD_F_COMM_ERROR; + case 0xE000000A: + fprintf(stderr, "Fehlerhaftes Chipauthentisierung-Token\n"); + return SCARD_F_COMM_ERROR; + case 0xF0100001: + fprintf(stderr, "Kommunikationsabbruch mit Karte.\n"); + return SCARD_F_COMM_ERROR; default: fprintf(stderr, "Reader reported some error.\n"); return SCARD_F_COMM_ERROR; @@ -178,6 +214,15 @@ printusageexit(FILE *f, const char *s, int e) exit(e); } +/* Signature Terminal with + * - "Generate electronic signature" + * - "Generate qualified electronic signature" + */ +unsigned char st_chat[] = { + 0x7f, 0x4c, 0x0e, 0x06, 0x09, 0x04, 0x00, 0x7f, 0x00, 0x07, 0x03, 0x01, + 0x02, 0x03, 0x53, 0x01, 0x03, +}; + int main(int argc, char *argv[]) { @@ -188,10 +233,11 @@ main(int argc, char *argv[]) BYTE sendbuf[16], recvbuf[1024]; DWORD pace_ctl, modify_ctl, recvlen, protocol; time_t t_start, t_end; - size_t l, pinlen = 0; + size_t l, pinlen = 0, chatlen = 0; char *pin = NULL; unsigned int readernum = 0, i; unsigned char secret_type = 0x03; + unsigned char *chat = NULL; if (argc > 1) { @@ -202,6 +248,11 @@ main(int argc, char *argv[]) fprintf(stderr, "Could not get type of secret\n"); exit(2); } + if (secret_type == 2) { + /* CAN */ + chat = st_chat; + chatlen = sizeof st_chat; + } } if (argc > 3) { if (sscanf(argv[3], "%u", &readernum) != 1) { @@ -310,19 +361,21 @@ main(int argc, char *argv[]) recvlen = sizeof(recvbuf); - sendbuf[0] = 0x02; /* idxFunction = EstabishPACEChannel */ - sendbuf[1] = (5+pinlen)&0xff; /* lengthInputData */ - sendbuf[2] = (5+pinlen)>>8; /* lengthInputData */ + sendbuf[0] = 0x02; /* idxFunction = EstabishPACEChannel */ + sendbuf[1] = (5+pinlen+chatlen)&0xff; /* lengthInputData */ + sendbuf[2] = (5+pinlen+chatlen)>>8; /* lengthInputData */ sendbuf[3] = secret_type; - sendbuf[4] = 0x00; /* length CHAT */ - sendbuf[5] = pinlen; /* length PIN */ - memcpy(sendbuf+6, pin, pinlen); /* PIN */ - sendbuf[6+pinlen] = 0x00; /* length certificate description */ - sendbuf[7+pinlen] = 0x00; /* length certificate description */ + sendbuf[4] = chatlen; /* length CHAT */ + memcpy(sendbuf+5, chat, chatlen); /* CHAT */ + sendbuf[5+chatlen] = pinlen; /* length PIN */ + memcpy(sendbuf+6+chatlen, pin, pinlen); /* PIN */ + sendbuf[6+pinlen+chatlen] = 0x00; /* length certificate description */ + sendbuf[7+pinlen+chatlen] = 0x00; /* length certificate description */ + printb("EstablishPACEChannel InBuffer\n", sendbuf, 8+pinlen+chatlen); t_start = time(NULL); r = SCardControl(hCard, pace_ctl, - sendbuf, 8+pinlen, + sendbuf, 8+pinlen+chatlen, recvbuf, sizeof(recvbuf), &recvlen); t_end = time(NULL); if (r != SCARD_S_SUCCESS) { @@ -334,7 +387,6 @@ main(int argc, char *argv[]) r = parse_EstablishPACEChannel_OutputData(recvbuf, recvlen); if (r != SCARD_S_SUCCESS) { - printb("EstablishPACEChannel InBuffer\n", sendbuf, 8+pinlen); printb("EstablishPACEChannel OutBuffer\n", recvbuf, recvlen); goto err; }