📄 test03.c
字号:
/* ============================================================================ Project Name : jayaCard TCK Module Name : proto/tck/cos/test03/test03.c Version : $Id: test03.c,v 1.46 2004/01/11 09:56:34 dgil Exp $ Description: COS TEST03 - COS Commands The Original Code is jayaCard TCK code. The Initial Developer of the Original Code is Gilles Dumortier. Portions created by the Initial Developer are Copyright (C) 2002-2004 the Initial Developer. All Rights Reserved. Contributor(s): Permission is granted to any individual to use, copy, or redistribute this software so long as all of the original files are included unmodified, that it is not sold for profit, and that this copyright notice is retained. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. History Rev Description 021503 dgil wrote it from scratch ============================================================================*/#include "precomp.h"/* ============================================================================ __x TEMP ========================================================================= */extern jbyte gTPDU[JAYACFG_APDU_LENGTH];extern jword gnTPDU;/* ============================================================================ Some keys ========================================================================= */jbyte PSK[16] = { 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 };jbyte key1[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };jbyte key2[16] = { 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 };jbyte keyc[16] = { 21,22,23,24,25,26,27,28,29,20,21,22,23,24,25,26 };/* ============================================================================ Some Pins ========================================================================= */jbyte PUK[8] = { 0x28, 0x12, 0x34, 0x56, 0x78, 0xFF, 0xFF, 0xFF }; /* PUK = 12345678 */jbyte Pin0[8] = { 0x24, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } ; /* Pin0 = 0000 */jbyte Pin1[8] = { 0x24, 0x07, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } ; /* Pin1 = 0748 *//* ============================================================================ StopAtExit ========================================================================= */int bExit = 0;/* ============================================================================ __hal_halt() ========================================================================= */void __hal_halt(void){ /* just return ... */}/* ============================================================================ CREATE DF __x XXX will be moved to protomac.c at later time ========================================================================= */void CREATE_DF(jword fid,jbyte sfi,jdword ac,jword ac_key){ char szApdu[512]; /* create a DF file : fid fdesc sfi ac ac_key */ sprintf(szApdu,"80E0%.4X08%.2X%.2X%.2X%.4X%.2X%.4X",fid,FDESC_TYPE_DF,sfi,HIWORD(ac),LOWORD(ac),HIWORD(ac_key),LOWORD(ac_key)); APDU_RES(szApdu,0,0x9000);}/* ============================================================================ FILL_BUFFER_WITH_KEY __x XXX will be moved to protomac.c at later time ========================================================================= */jbyte FILL_BUFFER_WITH_KEY(jbyte* buffer,jbyte algo,jbyte keyusage,jbyte keynum,jbyte* key){ jbyte n; jbyte i; jbyte lrc; jbyte counter; HAL_CRC_INIT(); n = sizeofkey[((algo&CIPHER_ALGO_KEYMASK)>>CIPHER_ALGO_KEYSHIFT)]; if (algo == REFDATA_ALGO_PASSWORD) { counter = JAYACFG_SUBMITPASSWORD_MAX; } else { counter = JAYACFG_SUBMITKEY_MAX; } buffer[0] = algo; buffer[1] = counter; buffer[2] = keynum; buffer[3] = keyusage; buffer[4] = 0x00; /* will be LRC */ for (i=0; i<n; i++) { buffer[7+i] = key[i]; HAL_CRC_COMPUTE(key[i]); } buffer[5] = HAL_CRC_LO(); buffer[6] = HAL_CRC_HI(); /* start with an internal value not zero */ lrc = 0xAA; /* LRC the fields */ lrc += algo; lrc += keyusage; lrc += counter; lrc += keynum; lrc += buffer[5]; lrc += buffer[6]; buffer[4] = lrc; LOG1("KEY","__calculate_LRC_of_currentkey(): %.2X",lrc); return n + 7;}/* ============================================================================ CHANGE_KEY Note: this function authenticate with the MSK/PSK only. __x XXX will be moved to protomac.c at later time ========================================================================= */void CHANGE_KEY(jbyte* masterkey,jbyte algo,jbyte keyusage,jbyte keynum,jbyte* key){ jbyte buffer[64]; jbyte lenbuf; char chiffre[64]; char newkey[128]; char str[128]; /* fill buffer with newkey */ lenbuf = FILL_BUFFER_WITH_KEY(buffer,algo,keyusage,keynum,key); if (gnTPDU!=10) { fprintf(stderr,"CHANGE_KEY(): Hmmm. Don't have my random number (%d) !\n",gnTPDU); return; } memcpy(&u.bBlock[JAYA_BCRYPTO_INPUT0],gTPDU,8); /* 3DES2(random,MSK|key) devnote: it is not a good idea to use the same cryptographic source code than the COS to test the change key command. but for now, we need to go quickly on our roadmap. inKit scripts *will use* its own cryptographic layer to avoid any potential problem. note: master key to change key is limited under this file to be 3DES2 key ... */ BIOS_SETCIPHERALGO(CIPHER_ALGO_ECB_3DES2); BIOS_SETPADDING(REFDATA_PAD_NOPAD); if (masterkey==NULL) { memcpy(&r.bBlock[JAYA_BCRYPTO_KEYCRC],MSK,sizeof(MSK)); } else { memcpy(&r.bBlock[JAYA_BCRYPTO_KEYA],masterkey,16); } BIOS_CIPHER_INIT(); BIOS_CIPHER(gTPDU,8,ENCIPHER); bytes2hexa(chiffre,&u.bBlock[JAYA_BCRYPTO_OUTPUT0],8,'\0'); bytes2hexa(newkey,buffer,lenbuf,'\0'); sprintf(str,"80D8%.2X00%.2X%s%s",keynum,lenbuf+8,chiffre,newkey); APDU_RES(str,0,0x9000);}/* ============================================================================ CREATE BINARY FILE __x XXX will be moved to protomac.c at later time ========================================================================= */void CREATE_BINARY_FILE(jword fid,jbyte sfi,jdword ac,jdword ac_key,jword fsize){ char szApdu[512]; LOG7("COMMAND","CREATE_BINARY_FILE fid=0x%.4X sfi=%.2X ac=%.4X%.4X ac_key=%.4X%.4X fsize=%d",fid,sfi,HIWORD(ac),LOWORD(ac),HIWORD(ac_key),LOWORD(ac_key),fsize); /* create a binary EF file : fid fdesc sfi ac ac_key size */ sprintf(szApdu,"80E0%.4X0A%.2X%.2X%.2X%.4X%.2X%.4X%.4X",fid,FDESC_TYPE_BINARY,sfi,HIWORD(ac),LOWORD(ac),HIWORD(ac_key),LOWORD(ac_key),fsize); /* printf("\n%s\n",szApdu); */ APDU_RES(szApdu,0,0x9000);}/* ============================================================================ SELECT APPLICATION BY NAME __x XXX will be moved to protomac.c at later time ========================================================================= */void SELECT_APPLICATION_BY_NAME(char* name){ char szApdu[512]; char hexa[80]; /* select a file by its file identifier */ bytes2hexa(hexa,(jbyte*)name,strlen(name),'\0'); LOG2("COMMAND","SELECT_APPLICATION_BY_NAME name=%s (%s)",name,hexa); sprintf(szApdu,"00A40400%.2X%s",strlen(hexa)/2,hexa); APDU_RES(szApdu,0,0x9000);}/* ============================================================================ SELECT FILE BY FID __x XXX will be moved to protomac.c at later time ========================================================================= */#define SELECT_DF 0x00#define SELECT_EF 0x01#define SELECT_INTERNAL 0x02void analyse_FCI(char* szApdu,jbyte byType){ switch (byType) { case SELECT_DF: APDU_RES(szApdu,0,0x6118); sprintf(szApdu,"00C0000018"); APDU_RES(szApdu,0x18,0x9000); break; case SELECT_EF: APDU_RES(szApdu,0,0x6115); sprintf(szApdu,"00C0000015"); APDU_RES(szApdu,0x15,0x9000); break; case SELECT_INTERNAL: APDU_RES(szApdu,0,0x6109); sprintf(szApdu,"00C0000009"); APDU_RES(szApdu,0x09,0x9000); break; }}void SELECT_FILE_BY_FID(jword fid,jbyte byType){ char szApdu[512]; /* select a file by its file identifier */ LOG1("COMMAND","SELECT_FILE_BY_FID fid=0x%.4X",fid); sprintf(szApdu,"00A4000002%.4X",fid); analyse_FCI(szApdu,byType);}/* ============================================================================ SELECT FILE BY ABSOLUTE PATH __x XXX will be moved to protomac.c at later time ========================================================================= */void SELECT_FILE_BY_ABSOLUTE_PATH(char* path,jbyte byType){ char szApdu[512]; /* select a file by its absolute path */ LOG1("COMMAND","SELECT_FILE_BY_ABSOLUTE path=%s",path); sprintf(szApdu,"00A40800%.2X%s",strlen(path)/2,path); analyse_FCI(szApdu,byType);}/* ============================================================================ SELECT FILE BY RELATIVE PATH __x XXX will be moved to protomac.c at later time ========================================================================= */void SELECT_FILE_BY_RELATIVE_PATH(char* path,jbyte byType){ char szApdu[512]; /* select a file by its relative path */ LOG1("COMMAND","SELECT_FILE_BY_RELATIVE_PATH path=%s",path); sprintf(szApdu,"00A40900%.2X%s",strlen(path)/2,path); analyse_FCI(szApdu,byType);}/* ============================================================================ INCREASE __x XXX will be moved to protomac.c at later time ========================================================================= */void INCREASE(jbyte sfi,jbyte cnt,jdword value){ char szApdu[512]; /* increase on the specified file */ LOG4("COMMAND","INCREASE file sfi=%d cnt=%d value=%ld(0x%.8lX)",sfi,cnt,value,value); sprintf(szApdu,"8032%.2X%.2X04%.2X%.2X%.2X%.2X",cnt,sfi<<3,HIBYTE(HIWORD(value)),LOBYTE(HIWORD(value)),HIBYTE(LOWORD(value)),LOBYTE(LOWORD(value))); APDU_RES(szApdu,0,0x6104); sprintf(szApdu,"00C0000004"); APDU_RES(szApdu,0x04,0x9000);}/* ============================================================================ DECREASE __x XXX will be moved to protomac.c at later time ========================================================================= */void DECREASE(jbyte sfi,jbyte cnt,jdword value){ char szApdu[512]; /* decrease on the specified file */ LOG4("COMMAND","DECREASE file sfi=%d cnt=%d value=%ld(0x%.8lX)",sfi,cnt,value,value); sprintf(szApdu,"8030%.2X%.2X04%.2X%.2X%.2X%.2X",cnt,sfi<<3,HIBYTE(HIWORD(value)),LOBYTE(HIWORD(value)),HIBYTE(LOWORD(value)),LOBYTE(LOWORD(value))); APDU_RES(szApdu,0,0x6104); sprintf(szApdu,"00C0000004"); APDU_RES(szApdu,0x04,0x9000);}/* ============================================================================ CHANGE CONFIGURATION note: change only bit config here __x XXX will be moved to protomac.c at later time ========================================================================= */#define CHANGE_CONFIG_T1_ENCAPS 0#define CHANGE_CONFIG_CONFIG_FWI 1#define CHANGE_CONFIG_TYPEA 2#define CHANGE_CONFIG_CONFIG_FSCI 3#define CHANGE_CONFIG_CONFIG_WTXM 4#define CHANGE_CONFIG_CONFIG_CHUNKEEP 5#define CHANGE_CONFIG_CONFIG_BITRATECAP 6#define CHANGE_CONFIG_PIN_PRIOR_INTAUTH 7#define CHANGE_CONFIG_MUTUAL_AUTHENTICATE 8#define CHANGE_CONFIG_SAM 9void CHANGE_CONFIGURATION(jbyte config,jbyte val){ char szApdu[512]; LOG2("COMMAND","CHANGE CONFIGURATION config=%.2X value=%.2X ",config,val); sprintf(szApdu,"B058%.2X%.2X00",config,val); APDU_RES(szApdu,0,0x9000);}/* ============================================================================ UPDATE BINARY __x XXX will be moved to protomac.c at later time ========================================================================= */void UPDATEBINARY(jbyte sfi,jword ofs,char* str){ char szApdu[512]; if (sfi==SFI_CURRENT) { ofs = ofs & 0x7FFF; /* updatebinary on the current file */ LOG2("COMMAND","UPDATEBINARY currentfile ofs=%.4X str=%s",ofs,str); sprintf(szApdu,"00D6%.4X%.2X%s",ofs,strlen(str)/2,str); APDU_RES(szApdu,0,0x9000); } else { ofs = ofs&0x00FF; /* updatebinary on the specified file */ LOG3("COMMAND","UPDATEBINARY file sfi=%d ofs=%.4X str=%s",sfi,ofs,str); sprintf(szApdu,"00D6%.2X%.2X%.2X%s",sfi|0x80,ofs,strlen(str)/2,str); APDU_RES(szApdu,0,0x9000); }}/* ============================================================================ READ BINARY __x XXX will be moved to protomac.c at later time ========================================================================= */void READBINARY(jbyte sfi,jword ofs,jbyte len)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -