test03.c

来自「一个免费的SMART CARD OS系统。」· C语言 代码 · 共 879 行 · 第 1/2 页

C
879
字号
/* ============================================================================   Project Name : jayaCard TCK   Module Name  : proto/tck/cos/test03/test03.c   Version : $Id: test03.c,v 1.49 2004/04/23 21:01:06 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];	LOG6("COMMAND","CREATE_DF fid=0x%.4X sfi=%.2X ac=%.4X%.4X ac_key=%.4X%.4X",fid,sfi,HIWORD(ac),LOWORD(ac),HIWORD(ac_key),LOWORD(ac_key));    /* 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);}/* ============================================================================	DELETE EF	__x XXX will be moved to protomac.c at later time   ========================================================================= */void DELETE_EF(jword fid){	char	szApdu[512];	LOG1("COMMAND","DELETE_EF fid=0x%.4X",fid);    /* delete an EF file : fid */    sprintf(szApdu,"80E4%.4X00",fid);	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	0x02#define SELECT_MF		0x03void analyse_FCI(char* szApdu,jbyte byType){	switch (byType) {		case SELECT_MF:			APDU_RES(szApdu,0,0x6114);			sprintf(szApdu,"00C0000014");			APDU_RES(szApdu,0x14,0x9000);			break;		case SELECT_DF:			APDU_RES(szApdu,0,0x6114);			sprintf(szApdu,"00C0000014");			APDU_RES(szApdu,0x14,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                   9#define CHANGE_CONFIG_CODOP_VERSION			10void 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 + =
减小字号Ctrl + -
显示快捷键?