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

📄 tck_bios_fs.c

📁 一个免费的SMART CARD OS系统。
💻 C
📖 第 1 页 / 共 4 页
字号:
/* ============================================================================   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 + -