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
This commit is contained in:
@@ -73,6 +73,42 @@ static LONG parse_EstablishPACEChannel_OutputData(
|
|||||||
switch (result) {
|
switch (result) {
|
||||||
case 0x00000000:
|
case 0x00000000:
|
||||||
break;
|
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:
|
default:
|
||||||
fprintf(stderr, "Reader reported some error.\n");
|
fprintf(stderr, "Reader reported some error.\n");
|
||||||
return SCARD_F_COMM_ERROR;
|
return SCARD_F_COMM_ERROR;
|
||||||
@@ -178,6 +214,15 @@ printusageexit(FILE *f, const char *s, int e)
|
|||||||
exit(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
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -188,10 +233,11 @@ main(int argc, char *argv[])
|
|||||||
BYTE sendbuf[16], recvbuf[1024];
|
BYTE sendbuf[16], recvbuf[1024];
|
||||||
DWORD pace_ctl, modify_ctl, recvlen, protocol;
|
DWORD pace_ctl, modify_ctl, recvlen, protocol;
|
||||||
time_t t_start, t_end;
|
time_t t_start, t_end;
|
||||||
size_t l, pinlen = 0;
|
size_t l, pinlen = 0, chatlen = 0;
|
||||||
char *pin = NULL;
|
char *pin = NULL;
|
||||||
unsigned int readernum = 0, i;
|
unsigned int readernum = 0, i;
|
||||||
unsigned char secret_type = 0x03;
|
unsigned char secret_type = 0x03;
|
||||||
|
unsigned char *chat = NULL;
|
||||||
|
|
||||||
|
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
@@ -202,6 +248,11 @@ main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "Could not get type of secret\n");
|
fprintf(stderr, "Could not get type of secret\n");
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
if (secret_type == 2) {
|
||||||
|
/* CAN */
|
||||||
|
chat = st_chat;
|
||||||
|
chatlen = sizeof st_chat;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (argc > 3) {
|
if (argc > 3) {
|
||||||
if (sscanf(argv[3], "%u", &readernum) != 1) {
|
if (sscanf(argv[3], "%u", &readernum) != 1) {
|
||||||
@@ -311,18 +362,20 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
recvlen = sizeof(recvbuf);
|
recvlen = sizeof(recvbuf);
|
||||||
sendbuf[0] = 0x02; /* idxFunction = EstabishPACEChannel */
|
sendbuf[0] = 0x02; /* idxFunction = EstabishPACEChannel */
|
||||||
sendbuf[1] = (5+pinlen)&0xff; /* lengthInputData */
|
sendbuf[1] = (5+pinlen+chatlen)&0xff; /* lengthInputData */
|
||||||
sendbuf[2] = (5+pinlen)>>8; /* lengthInputData */
|
sendbuf[2] = (5+pinlen+chatlen)>>8; /* lengthInputData */
|
||||||
sendbuf[3] = secret_type;
|
sendbuf[3] = secret_type;
|
||||||
sendbuf[4] = 0x00; /* length CHAT */
|
sendbuf[4] = chatlen; /* length CHAT */
|
||||||
sendbuf[5] = pinlen; /* length PIN */
|
memcpy(sendbuf+5, chat, chatlen); /* CHAT */
|
||||||
memcpy(sendbuf+6, pin, pinlen); /* PIN */
|
sendbuf[5+chatlen] = pinlen; /* length PIN */
|
||||||
sendbuf[6+pinlen] = 0x00; /* length certificate description */
|
memcpy(sendbuf+6+chatlen, pin, pinlen); /* PIN */
|
||||||
sendbuf[7+pinlen] = 0x00; /* length certificate description */
|
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);
|
t_start = time(NULL);
|
||||||
r = SCardControl(hCard, pace_ctl,
|
r = SCardControl(hCard, pace_ctl,
|
||||||
sendbuf, 8+pinlen,
|
sendbuf, 8+pinlen+chatlen,
|
||||||
recvbuf, sizeof(recvbuf), &recvlen);
|
recvbuf, sizeof(recvbuf), &recvlen);
|
||||||
t_end = time(NULL);
|
t_end = time(NULL);
|
||||||
if (r != SCARD_S_SUCCESS) {
|
if (r != SCARD_S_SUCCESS) {
|
||||||
@@ -334,7 +387,6 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
r = parse_EstablishPACEChannel_OutputData(recvbuf, recvlen);
|
r = parse_EstablishPACEChannel_OutputData(recvbuf, recvlen);
|
||||||
if (r != SCARD_S_SUCCESS) {
|
if (r != SCARD_S_SUCCESS) {
|
||||||
printb("EstablishPACEChannel InBuffer\n", sendbuf, 8+pinlen);
|
|
||||||
printb("EstablishPACEChannel OutBuffer\n", recvbuf, recvlen);
|
printb("EstablishPACEChannel OutBuffer\n", recvbuf, recvlen);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user