Lines 41-47
Link Here
|
41 |
CKYStatus |
41 |
CKYStatus |
42 |
CKYAppletFactory_SelectFile(CKYAPDU *apdu, const void *param) |
42 |
CKYAppletFactory_SelectFile(CKYAPDU *apdu, const void *param) |
43 |
{ |
43 |
{ |
44 |
return CKYAPDUFactory_SelectFile(apdu,(const CKYBuffer *)param); |
44 |
return CKYAPDUFactory_SelectFile(apdu, 4, 0, (const CKYBuffer *)param); |
|
|
45 |
} |
46 |
|
47 |
CKYStatus |
48 |
CACAppletFactory_SelectFile(CKYAPDU *apdu, const void *param) |
49 |
{ |
50 |
return CKYAPDUFactory_SelectFile(apdu, 2, 12, (const CKYBuffer *)param); |
45 |
} |
51 |
} |
46 |
|
52 |
|
47 |
CKYStatus |
53 |
CKYStatus |
Lines 225-234
Link Here
|
225 |
} |
231 |
} |
226 |
|
232 |
|
227 |
CKYStatus |
233 |
CKYStatus |
228 |
CACAppletFactory_SignDecrypt(CKYAPDU *apdu, const void *param) |
234 |
CACAppletFactory_SignDecryptStep(CKYAPDU *apdu, const void *param) |
|
|
235 |
{ |
236 |
const CKYBuffer *buf=(CKYBuffer *)param; |
237 |
return CACAPDUFactory_SignDecrypt(apdu, CAC_P1_STEP, buf); |
238 |
} |
239 |
|
240 |
CKYStatus |
241 |
CACAppletFactory_SignDecryptFinal(CKYAPDU *apdu, const void *param) |
229 |
{ |
242 |
{ |
230 |
const CKYBuffer *buf=(CKYBuffer *)param; |
243 |
const CKYBuffer *buf=(CKYBuffer *)param; |
231 |
return CACAPDUFactory_SignDecrypt(apdu, buf); |
244 |
return CACAPDUFactory_SignDecrypt(apdu, CAC_P1_FINAL, buf); |
232 |
} |
245 |
} |
233 |
|
246 |
|
234 |
CKYStatus |
247 |
CKYStatus |
Lines 246-251
Link Here
|
246 |
} |
259 |
} |
247 |
|
260 |
|
248 |
CKYStatus |
261 |
CKYStatus |
|
|
262 |
CACAppletFactory_ReadFile(CKYAPDU *apdu, const void *param) |
263 |
{ |
264 |
const CACAppletArgReadFile *rfs = (const CACAppletArgReadFile *)param; |
265 |
return CACAPDUFactory_ReadFile(apdu, rfs->offset, rfs->type, rfs->count); |
266 |
} |
267 |
|
268 |
CKYStatus |
249 |
CACAppletFactory_GetProperties(CKYAPDU *apdu, const void *param) |
269 |
CACAppletFactory_GetProperties(CKYAPDU *apdu, const void *param) |
250 |
{ |
270 |
{ |
251 |
return CACAPDUFactory_GetProperties(apdu); |
271 |
return CACAPDUFactory_GetProperties(apdu); |
Lines 457-463
Link Here
|
457 |
CKYISOStatus *apduRC) |
477 |
CKYISOStatus *apduRC) |
458 |
{ |
478 |
{ |
459 |
return CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, AID, NULL, |
479 |
return CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, AID, NULL, |
460 |
0, CKYAppletFill_Null, NULL, apduRC); |
480 |
CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
461 |
} |
481 |
} |
462 |
|
482 |
|
463 |
static CKYByte coolkeyid[] = {0x62, 0x76, 0x01, 0xff, 0x00, 0x00, 0x00 }; |
483 |
static CKYByte coolkeyid[] = {0x62, 0x76, 0x01, 0xff, 0x00, 0x00, 0x00 }; |
Lines 477-498
Link Here
|
477 |
return ret; |
497 |
return ret; |
478 |
} |
498 |
} |
479 |
|
499 |
|
480 |
static CKYByte CACPKIid[] = {0xa0, 0x00, 0x00, 0x00, 0x79, 0x01, 0x00 }; |
500 |
static CKYByte CACPKIid[] = { 0xa0, 0x00, 0x00, 0x00, 0x79, 0x01 }; |
481 |
/* |
501 |
/* |
482 |
* Select the CoolKey applet. Must happen after we start a transaction and |
502 |
* Select the CoolKey applet. Must happen after we start a transaction and |
483 |
* before we issue any applet specific command. |
503 |
* before we issue any applet specific command. |
484 |
*/ |
504 |
*/ |
485 |
CKYStatus |
505 |
CKYStatus |
486 |
CACApplet_SelectPKI(CKYCardConnection *conn, CKYByte instance, |
506 |
CACApplet_SelectPKI(CKYCardConnection *conn, CKYBuffer *cacAID, |
487 |
CKYISOStatus *apduRC) |
507 |
CKYByte instance, CKYISOStatus *apduRC) |
488 |
{ |
508 |
{ |
489 |
CKYStatus ret; |
509 |
CKYStatus ret; |
490 |
CKYBuffer CACPKIAID; |
510 |
CKYBuffer_AppendData(cacAID, CACPKIid, sizeof(CACPKIid)); |
491 |
CKYBuffer_InitFromData(&CACPKIAID, CACPKIid, sizeof(CACPKIid)); |
511 |
CKYBuffer_AppendChar(cacAID, instance); |
492 |
CKYBuffer_SetChar(&CACPKIAID, 6, instance); |
512 |
ret = CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, cacAID, |
493 |
ret = CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, &CACPKIAID, |
|
|
494 |
NULL, CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
513 |
NULL, CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
495 |
CKYBuffer_FreeData(&CACPKIAID); |
514 |
if (ret != CKYSUCCESS) { |
|
|
515 |
CKYBuffer_Resize(cacAID, 0); |
516 |
} |
496 |
return ret; |
517 |
return ret; |
497 |
} |
518 |
} |
498 |
|
519 |
|
Lines 515-525
Link Here
|
515 |
CKYBuffer CAC_CM_AID; |
536 |
CKYBuffer CAC_CM_AID; |
516 |
CKYBuffer_InitFromData(&CAC_CM_AID, cacmgrid, sizeof(cacmgrid)); |
537 |
CKYBuffer_InitFromData(&CAC_CM_AID, cacmgrid, sizeof(cacmgrid)); |
517 |
ret = CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, &CAC_CM_AID, |
538 |
ret = CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, &CAC_CM_AID, |
518 |
NULL, 0, CKYAppletFill_Null, NULL, apduRC); |
539 |
NULL, CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
519 |
CKYBuffer_FreeData(&CAC_CM_AID); |
540 |
CKYBuffer_FreeData(&CAC_CM_AID); |
520 |
return ret; |
541 |
return ret; |
521 |
} |
542 |
} |
522 |
|
543 |
|
|
|
544 |
static CKYByte cacCCCid[] = {0xa0, 0x00, 0x00, 0x01, 0x16, 0xdb, 0x00 }; |
545 |
CKYStatus |
546 |
CACApplet_SelectCCC(CKYCardConnection *conn, CKYISOStatus *apduRC) |
547 |
{ |
548 |
CKYStatus ret; |
549 |
CKYBuffer CAC_CM_AID; |
550 |
CKYBuffer_InitFromData(&CAC_CM_AID, cacCCCid, sizeof(cacCCCid)); |
551 |
ret = CKYApplet_HandleAPDU(conn, CKYAppletFactory_SelectFile, &CAC_CM_AID, |
552 |
NULL, CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
553 |
CKYBuffer_FreeData(&CAC_CM_AID); |
554 |
return ret; |
555 |
} |
556 |
|
557 |
CKYStatus |
558 |
CACApplet_SelectFile(CKYCardConnection *conn, unsigned short ef, |
559 |
CKYISOStatus *apduRC) |
560 |
{ |
561 |
CKYStatus ret; |
562 |
CKYBuffer efBuf; |
563 |
CKYBuffer_InitEmpty(&efBuf); |
564 |
CKYBuffer_AppendShortLE(&efBuf, ef); |
565 |
ret = CKYApplet_HandleAPDU(conn, CACAppletFactory_SelectFile, &efBuf, |
566 |
NULL, CKY_SIZE_UNKNOWN, CKYAppletFill_Null, NULL, apduRC); |
567 |
CKYBuffer_FreeData(&efBuf); |
568 |
return ret; |
569 |
} |
570 |
|
523 |
/* |
571 |
/* |
524 |
* GetCPLC cluster -- must be called with CM selected |
572 |
* GetCPLC cluster -- must be called with CM selected |
525 |
*/ |
573 |
*/ |
Lines 673-680
Link Here
|
673 |
ccd.keyNumber = keyNumber; |
721 |
ccd.keyNumber = keyNumber; |
674 |
ccd.location = location; |
722 |
ccd.location = location; |
675 |
ccd.data = data; |
723 |
ccd.data = data; |
676 |
return CKYApplet_HandleAPDU(conn, CKYAppletFactory_ComputeCryptProcess, &ccd, |
724 |
return CKYApplet_HandleAPDU(conn, CKYAppletFactory_ComputeCryptProcess, |
677 |
nonce, 0, CKYAppletFill_Null, NULL, apduRC); |
725 |
&ccd, nonce, 0, CKYAppletFill_Null, NULL, apduRC); |
678 |
} |
726 |
} |
679 |
|
727 |
|
680 |
/* computeCrypt returns data in the form : |
728 |
/* computeCrypt returns data in the form : |
Lines 832-842
Link Here
|
832 |
CKYBuffer *result, CKYISOStatus *apduRC) |
880 |
CKYBuffer *result, CKYISOStatus *apduRC) |
833 |
{ |
881 |
{ |
834 |
CKYStatus ret; |
882 |
CKYStatus ret; |
835 |
|
883 |
CKYSize dataSize = CKYBuffer_Size(data); |
836 |
ret = CKYApplet_HandleAPDU(conn, |
884 |
CKYOffset offset = 0; |
837 |
CACAppletFactory_SignDecrypt, data, NULL, |
885 |
CKYBuffer tmp; |
838 |
CKYBuffer_Size(data), CKYAppletFill_ReplaceBuffer, |
886 |
|
|
|
887 |
CKYBuffer_InitEmpty(&tmp); |
888 |
|
889 |
CKYBuffer_Resize(result, 0); |
890 |
for(offset = 0; (dataSize-offset) > CKY_MAX_WRITE_CHUNK_SIZE; |
891 |
offset += CKY_MAX_WRITE_CHUNK_SIZE) { |
892 |
CKYBuffer_Resize(&tmp,0); |
893 |
CKYBuffer_AppendBuffer(&tmp, data, offset, CKY_MAX_WRITE_CHUNK_SIZE); |
894 |
ret = CKYApplet_HandleAPDU(conn, CACAppletFactory_SignDecryptStep, |
895 |
&tmp, NULL, CKY_SIZE_UNKNOWN, |
896 |
CKYAppletFill_AppendBuffer, |
897 |
result, apduRC); |
898 |
if (ret != CKYSUCCESS) { |
899 |
goto done; |
900 |
} |
901 |
} |
902 |
CKYBuffer_Resize(&tmp,0); |
903 |
CKYBuffer_AppendBuffer(&tmp, data, offset, dataSize - offset); |
904 |
ret = CKYApplet_HandleAPDU(conn, CACAppletFactory_SignDecryptFinal, |
905 |
&tmp, NULL, CKY_SIZE_UNKNOWN, |
906 |
CKYAppletFill_AppendBuffer, |
839 |
result, apduRC); |
907 |
result, apduRC); |
|
|
908 |
|
909 |
if ((ret == CKYSUCCESS) && (CKYBuffer_Size(result) != dataSize)) { |
910 |
/* RSA returns the same data size as input, didn't happen, so |
911 |
* something is wrong. */ |
912 |
} |
913 |
|
914 |
done: |
915 |
CKYBuffer_FreeData(&tmp); |
840 |
return ret; |
916 |
return ret; |
841 |
} |
917 |
} |
842 |
|
918 |
|
Lines 895-900
Link Here
|
895 |
} |
971 |
} |
896 |
return ret; |
972 |
return ret; |
897 |
} |
973 |
} |
|
|
974 |
|
975 |
/* |
976 |
* Read a CAC Tag/Value file |
977 |
*/ |
978 |
CKYStatus |
979 |
CACApplet_ReadFile(CKYCardConnection *conn, CKYByte type, CKYBuffer *buffer, |
980 |
CKYISOStatus *apduRC) |
981 |
{ |
982 |
CKYStatus ret; |
983 |
CKYISOStatus status; |
984 |
CKYByte maxtransfer; |
985 |
unsigned short offset = 0; |
986 |
unsigned short size; |
987 |
CACAppletArgReadFile rfs; |
988 |
|
989 |
CKYBuffer_Resize(buffer,0); |
990 |
if (apduRC == NULL) { |
991 |
apduRC = &status; |
992 |
} |
993 |
rfs.offset = 0; |
994 |
rfs.count = 2; |
995 |
rfs.type = type; |
996 |
|
997 |
/* APDU's are expensive, Grab a big chunk of the file first if possible */ |
998 |
ret = CKYApplet_HandleAPDU(conn, |
999 |
CACAppletFactory_ReadFile, &rfs, NULL, |
1000 |
rfs.count, CKYAppletFill_AppendBuffer, |
1001 |
buffer, apduRC); |
1002 |
/* file is probably smaller than 100 bytes, get the actual size first */ |
1003 |
if (ret != CKYSUCCESS) { |
1004 |
return ret; |
1005 |
} |
1006 |
size = CKYBuffer_GetShortLE(buffer, 0) + 2 /* include the length itself */; |
1007 |
maxtransfer = CKY_MAX_READ_CHUNK_SIZE; |
1008 |
/* get the rest of the buffer if necessary */ |
1009 |
for (offset = CKYBuffer_Size(buffer); size > offset; |
1010 |
offset = CKYBuffer_Size(buffer)) { |
1011 |
rfs.offset = offset; |
1012 |
rfs.count = MIN(size - offset, maxtransfer); |
1013 |
ret = CKYApplet_HandleAPDU(conn, |
1014 |
CACAppletFactory_ReadFile, &rfs, NULL, |
1015 |
rfs.count, CKYAppletFill_AppendBuffer, |
1016 |
buffer, apduRC); |
1017 |
if (ret != CKYSUCCESS) { |
1018 |
if (*apduRC == CAC_INVALID_PARAMS) { |
1019 |
maxtransfer = maxtransfer/2; |
1020 |
if (maxtransfer == 0) { |
1021 |
return ret; |
1022 |
} |
1023 |
} else { |
1024 |
return ret; |
1025 |
} |
1026 |
} |
1027 |
} |
1028 |
return ret; |
1029 |
} |
1030 |
|
898 |
CKYStatus |
1031 |
CKYStatus |
899 |
CACApplet_GetCertificateFirst(CKYCardConnection *conn, CKYBuffer *cert, |
1032 |
CACApplet_GetCertificateFirst(CKYCardConnection *conn, CKYBuffer *cert, |
900 |
CKYSize *nextSize, CKYISOStatus *apduRC) |
1033 |
CKYSize *nextSize, CKYISOStatus *apduRC) |