⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test03.c

📁 开发源代码的CPU卡的COS源程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ============================================================================   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 + -