📄 tck_bios_fs.c
字号:
/* ============================================================================ Project Name : jayaCard TCK Module Name : proto/tck/bios/stream/tck_bios_fs.c Version : $Id: tck_bios_fs.c,v 1.22 2004/04/23 20:29:17 dgil Exp $ Description: BIOS FILE SYSTEM 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 050303 dgil wrote it from scratch ============================================================================*/#include <precomp.h>/* ============================================================================ globals ========================================================================= */#define FID_COUNTERS 0x3F33#define FID_UPDATEONCE 0x3F13/* ============================================================================ Global ========================================================================= */long giNumErr;jbyte gN = 0;jbyte* gBuf;/* ============================================================================ isoerr() ========================================================================= */jword isoerr(jbyte _err){ jbyte save_err; jword werr; save_err = lasterr; lasterr = _err; werr = __bios_err(); lasterr = save_err; return werr;}/* ============================================================================ __bios_send(byte) store the byte in the global buffer ========================================================================= */void __bios_send(jbyte b){ gBuf[gN] = b; gN++; //fprintf(stderr,"<%.2X>",b);}/* ============================================================================ __bios_send_Iins() ========================================================================= */void __bios_send_Iins(){ /* just return ... */ //fprintf(stderr,"<Iins>");}/* ============================================================================ __bios_application_select() ========================================================================= */void __bios_application_select(void){}/* ============================================================================ __bios_application_deselect() ========================================================================= */void __bios_application_deselect(void){}/* ============================================================================ __bios_receive() -> byte return a byte from a global buffer (simulate IO by buffer) ========================================================================= */jbyte __bios_receive(){ jbyte b; b = gBuf[gN]; gN++; //fprintf(stderr,">%.2X<",b); return b;}/* ============================================================================ File Access Condition extensions : dummy ========================================================================= */jbool gACext = jfalse;jbyte cos_check_AC_ext(void){ if (gACext) return JSEC_OK; return JSEC_FAIL;}/* ============================================================================ bootstrap the filesystem ========================================================================= */void boostrap_filesystem(void){ CLA = 0x80; INS = 0xE0; P1P2 = FID_MF; P3 = 0x01; BIOS_BITSET_SEQVAL(SEQVAL_EXT_AUTH); gGlobalSem = JSEC_OK; FS_BOOTSTRAP(0x03); if (lasterr!=SUCCESS) { fprintf(stderr,"nok: error code 0x%.2X\n",lasterr); giNumErr++; exit(-1); } if (gGlobalSem!=JSEC_SEM) { fprintf(stderr,"nok: error gGlobalSem = %.2X but 58 was required\n",gGlobalSem); giNumErr++; exit(-1); } LOG("TCK","FS_BOOTSTRAP (9000)");}/* ============================================================================ Select a file Returns lasterr error code or SUCCESS ========================================================================= */jbyte select_file(jword id){ BIOS_SETERR(NOERR); CLA = 0x80; INS = 0xF2; P1P2 = id; P3 = 0x00; FS_SELECT_FILE_BY_FID(P1P2,LOOKUP_MODE_DEFAULT); return lasterr;}void SELECT_FILE_SUCCESS(jword id){ jbyte err; LOG1("TCK","SELECT FILE (9000) id=%.4X ",id); err = select_file(id); if (err != SUCCESS) { fprintf(stderr,"select_file(%.4X): nok: error code %d\n",id,err); giNumErr++; }}void SELECT_FILE_ERR(jword id,jbyte _err){ jbyte err; LOG2("TCK","SELECT FILE (%.4X) id=%.4X ",isoerr(_err),id); err = select_file(id); if (err != _err) { fprintf(stderr,"select_file(%.4X): nok: error code %d but %d was required\n",id,err,_err); giNumErr++; }}/* ============================================================================ Delete a file Returns lasterr error code or SUCCESS ========================================================================= */jbyte delete_file(jword id){ BIOS_SETERR(NOERR); CLA = 0x80; INS = 0xF2; P1P2 = id; P3 = 0x00; FS_SELECT_FILE_BY_FID(P1P2,LOOKUP_MODE_DEFAULT); if (lasterr == SUCCESS) { FS_DELETE_FILE(); } return lasterr;}void DELETE_FILE_SUCCESS(jword id){ jbyte err; LOG1("TCK","DELETE FILE (9000) id=%.4X ",id); err = delete_file(id); if (err != SUCCESS) { fprintf(stderr,"delete_file(%.4X): nok: error code %d\n",id,err); giNumErr++; }}void DELETE_FILE_ERR(jword id,jbyte _err){ jbyte err; LOG2("TCK","DELETE FILE (%.4X) id=%.4X ",isoerr(_err),id); err = delete_file(id); if (err != _err) { fprintf(stderr,"delete_file(%.4X): nok: error code %d but %d was required\n",id,err,_err); giNumErr++; }}/* ============================================================================ Create a DF Returns lasterr error code or SUCCESS ========================================================================= */jbyte create_df(jword id){ BIOS_SETERR(NOERR); HAL_ERASE_XRAM((jbyte xdata*)&header_file,sizeof(header_file)); header_file.fid = id; header_file.fdesc = FDESC_TYPE_DF; header_file.sfi = SFI_NOTUSE; header_file.ac[0] = 0xFF; header_file.ac[1] = 0xFF; header_file.ac[2] = 0xFF; header_file.ac_key[0] = 0x00; header_file.ac_key[1] = 0x00; header_file.ac_key[2] = 0x00; /* create the file */ FS_CREATE_FILE(); if (lasterr==SUCCESS) { FS_SELECT_FILE_BY_FID(id,LOOKUP_MODE_DEFAULT); } return lasterr;}void CREATE_DF_SUCCESS(jword id){ jbyte err; LOG1("TCK","CREATE DF (9000) id=%.4X ",id); err = create_df(id); if (err != SUCCESS) { fprintf(stderr,"create_df(%.4X): nok: error code %d\n",id,err); giNumErr++; }}void CREATE_DF_ERR(jword id,jbyte _err){ jbyte err; LOG2("TCK","CREATE DF (%.4X) id=%.4X ",isoerr(_err),id); err = create_df(id); if (err != _err) { fprintf(stderr,"create_df(%.4X): nok: error code %d but %d was required\n",id,err,_err); giNumErr++; }}/* ============================================================================ Create a binary file Returns lasterr error code or SUCCESS ========================================================================= */jbyte create_binary_file(jword id,jword length){ BIOS_SETERR(NOERR); HAL_ERASE_XRAM((jbyte xdata*)&header_file,sizeof(header_file)); header_file.fid = id; if (id == FID_UPDATEONCE) { header_file.fdesc = FDESC_TYPE_BINARY | FDESC_UPDATE_ONCE; } else { header_file.fdesc = FDESC_TYPE_BINARY; } header_file.sfi = SFI_NOTUSE; header_file.ac[0] = 0xFF; header_file.ac[1] = 0xFF; header_file.ac[2] = 0xFF; header_file.ac_key[0] = 0x00; header_file.ac_key[1] = 0x00; header_file.ac_key[2] = 0x00; header_file.u4.sizefile = length; if (header_file.fid==FID_KEYS) { /* more than a binary file ! must be a key file ! */ header_file.sfi |= FDESC2_KEYS; } if (header_file.fid==FID_COUNTERS) { /* more than a binary file ! must be a counte file ! */ header_file.sfi |= FDESC2_COUNTERS; } if ((header_file.sfi&FDESC2_MASK)!=FDESC2_STANDARD) { /* more than a binary file ! must be an internal file ! */ header_file.fdesc |= FDESC_INTERNAL_EF; } /* create the file */ FS_CREATE_FILE(); if (lasterr==SUCCESS) { switch (header_file.sfi&FDESC2_MASK) { case FDESC2_KEYS: case FDESC2_TEMPLATE: /* more than a binary file ! must accept TLV inside */ TLV_INIT_AREA(); break; case FDESC2_COUNTERS: case FDESC2_STANDARD: default: FS_ERASE_FILE(); break; } } return lasterr;}void CREATE_BINARY_FILE_SUCCESS(jword id,jword length){ jbyte err; LOG2("TCK","CREATE BINARY FILE (9000) id=%.4X length=%d",id,length); err = create_binary_file(id,length); if (err != SUCCESS) { fprintf(stderr,"create_binary_file(%.4X,%d): nok: error code %d\n",id,length,err); giNumErr++; }}void CREATE_BINARY_FILE_ERR(jword id,jword length,jbyte _err){ jbyte err; LOG3("TCK","CREATE BINARY FILE (%.4X) id=%.4X length=%d",isoerr(_err),id,length); err = create_binary_file(id,length); if (err != _err) { fprintf(stderr,"create_binary_file(%.4X,%d): nok: error code %d but %d was required\n",id,length,err,_err); giNumErr++; }}/* ============================================================================ Update a binary file Returns lasterr error code or SUCCESS ========================================================================= */jbyte update_binary_file(jword id,jbyte* buf,jword ofs,jbyte len){ BIOS_SETERR(NOERR); gN = 0; gBuf = buf; FS_LOOKUP_FID(id,LOOKUP_MODE_DEFAULT); if (lasterr!=SUCCESS) return lasterr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -