📄 iccapp.h
字号:
/************************
* samapp.h *
* Designe by 刘俐训 *
* Sam Card application *
************************/
#ifndef _ICCAPP_H_
#define _ICCAPP_H_
//file type
#define DF 0
#define EF 1
//write key
#define LOAD 0
#define UPDATE 1
#define EN0 0 /* MODE == encrypt */
#define ENCRYPT 0
#define DE1 1 /* MODE == decrypt */
#define DECRYPT 1
#define STAND 0 /* MAC 标准 */
#define BPI 1
#define CUP 2
#if 0
typedef union
{
/*****************************************************
* file type: 专用文件df: 38 *
* 二进制文件: 28 *
* 定长记录文件: 2A *
* 循环文件: 2E *
* 普通钱包文件: 2F *
* 电子存折文件: 2F *
* 变长记录文件: 2C *
* 密钥文件: 3F *
* *
* b7-b6: 00: 无线路保护, 此时: byte7 = 0xff *
* 10: MAC *
* 11: DES&MAC *
*****************************************************/
/*****************************************************
* file_id: 文件标识符. *
* MF: 3F00 *
* KEY: 0000 *
* 电子存折文件: 0001 *
* 电子钱包文件: 0002 *
*****************************************************/
struct DF
{
unsigned int id; // file_id = 0xp1p2
unsigned char type; // byte 1
unsigned int size; // byte 2-3
unsigned char creat_purview; // DF下建立文件的权限。 byte 4
unsigned char erase_purview; // df下擦除文件的权限。
unsigned char reserved[3]; // byte 6-7-8 0xffffff
unsigned char name[16]; // DF file name(5-16 bytes)
unsigned char name_len; // length of name int bytes
}
/********************************************************************************
* byte7 for EF: | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | *
* |是否线路保护| 1 | 1 | 1 | 读密钥标识符| 写密钥标识符 | *
* ------------------------------------------------------------- *
* b7: 1 不支持线路保护读,b3-b2 = 11; 0: 必须线路保护读. *
* b3-b2: 11: 用标识00的维护密钥. *
* 10: 用标识01的维护密钥. *
* 01: 用标识02的维护密钥. *
* 00: 用标识03的维护密钥. *
* b1-b0: 类似于b3b2. *
********************************************************************************/
struct EF
{
unsigned int id; // file_id = 0xp1p2
unsigned char type; // byte 1
unsigned int size; // byte 2,3
unsigned char read_purview; // ef(二进制文件、记录文件、循环文件)读权限。
// 普通钱包文件扣款权限
// 电子钱包文件使用权限
// 密钥文件所在的df文件的短标示符
// byte 4
unsigned char write_purview; // ef的写权限
// 普通钱包文件的存款权限
// TAC密钥表示符
// 密钥文件的增加权限
// byte 5
unsigned char reserved; // byte 6: 0xff
unsigned char byte7; // 保护信息
// 信息文件的短标示符
}
}ICC_FILE;
#else
/*****************************************************
* file type: 专用文件df: 38 *
* 二进制文件: 28 *
* 定长记录文件: 2A *
* 循环文件: 2E *
* 普通钱包文件: 2F *
* 电子存折文件: 2F *
* 变长记录文件: 2C *
* 密钥文件: 3F *
* *
* b7-b6: 00: 无线路保护, 此时: byte7 = 0xff *
* 10: MAC *
* 11: DES&MAC *
*****************************************************/
/*****************************************************
* file_id: 文件标识符. *
* MF: 3F00 *
* KEY: 0000 *
* 电子存折文件: 0001 *
* 电子钱包文件: 0002 *
*****************************************************/
/********************************************************************************
* byte7 for EF: | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | *
* |是否线路保护| 1 | 1 | 1 | 读密钥标识符| 写密钥标识符 | *
* ------------------------------------------------------------- *
* b7: 1 不支持线路保护读,b3-b2 = 11; 0: 必须线路保护读. *
* b3-b2: 11: 用标识00的维护密钥. *
* 10: 用标识01的维护密钥. *
* 01: 用标识02的维护密钥. *
* 00: 用标识03的维护密钥. *
* b1-b0: 类似于b3b2. *
********************************************************************************/
typedef struct
{
unsigned int id; // FILE ID = 0xp1p2
unsigned char type; // byte 1
unsigned int size; // byte 2, 3
unsigned char c_r_purview; // DF下建立文件的权限。
// ef(二进制文件、记录文件、循环文件)读权限。
// 普通钱包文件扣款权限
// 电子钱包文件使用权限
// 密钥文件所在的df文件的短标示符
// byte 4
unsigned char e_w_purview; // DF下建立文件的权限。
// ef的写权限
// 普通钱包文件的存款权限
// TAC密钥表示符
// 密钥文件的增加权限
// byte 5
unsigned char reserved1; // 0xff
// byte 6
unsigned char reserved2; // DF: reserved, 0xff
// EF: 保护信息, 信息文件的短标识符, the last byte.
// byte 7
unsigned char reserved3; // 0xff
unsigned char name[16]; // DF file name(5-16 bytes)
unsigned char name_len; // length of name int bytes
} ICC_FILE;
#endif
/*******************************************************************************
* 密钥类型:30: DES加密; 31:DES解密;32:DESMAC;34:内部密钥;36:维护密钥 *
* 39:主控/外部认证;37:口令解锁;38:口令重装;3C:修改透支限额 *
* 3D:圈提;3E:消费;3A:口令;3B:解锁口令;3X:连接MF下的密钥 *
*******************************************************************************/
#define DES_EN 0x30
#define DES_DE 0x31
#define DES_MAC 0x32
#define INTERNAL 0x34
#define MAINTENANCE 0x36
#define MCTRL 0x39
#define EXTERNAL 0x39
#define PIN_UB 0x37
#define PIN_RELOAD 0x38
#define PER_PIN 0x3a
/* ... */
#define DES_ENCRYPT 0x40
#define PROTECT 0xc0
#define NORMAL 0x00
typedef struct
{
unsigned char type; // 密钥类型
unsigned char use_purview; // 使用权限
unsigned char update_purview; // 更改权限
unsigned char edition_state; // 密钥版本、后续状态
unsigned char cid_cnt; // 算法标识/错误计数器
unsigned char key[16]; // 密钥值
unsigned char keylen; // 密钥长度,8或16
unsigned char id; // 密钥标识
}KEY;
// return value of funcitons
#define SUCCESS (int)0x9000 /* 成功 */
#define MAY_ERROR 0x6281 /* 会送数据可能有错 */
#define INV_FILE 0x6283 /* 选择文件无效, 文件或密钥校验错误 */
#define STAT_DEAD 0x6400 /* 状态标志没有变化 */
#define WR_FAILE 0x6581 /* 写EEPROM 失败 */
#define ERR_LEN 0x6700 /* 错误的长度 */
#define REFUSE_CLA 0x6900 /* CLA与线路保护要求不匹配 */
#define INV_STAT 0x6901 /* 无效状态 */
#define BAD_CMD 0x6981 /* 命令与文件结构不相容 */
#define NOT_SAFE 0x6982 /* 不满足安全状态 */
#define KEY_LOCKED 0x6983 /* 密钥被锁死 */
#define INV_CON 0x6985 /* 使用条件不满足 */
#define NO_SAFE_UD 0x6987 /* 没有安全报文 */
#define ERR_SAFE_UD 0x6988 /* 安全报文数据不正确 */
#define ERR_PARA 0x6A80 /* 数据与参数错误 */
#define NO_MF 0x6A81 /* 没有MF或命令不支持 */
#define NO_FILE 0x6A82 /* 文件未找到 */
#define NO_REC 0x6A83 /* 记录未找到 */
#define FILE_FULL 0x6A84 /* 文件无足够空间 */
#define ERR_P1P2 0x6A86 /* 参数P1P2错误 */
#define FILE_EXIST 0x6a86 /* 文件已存在 */
#define OFFSET_ERR 0x6B00 /* 在达到Le/Lc字节之前文件结束,偏移量错误 */
#define INV_CLA 0x6E00 /* 无效CLA */
#define INV_DATA 0x6F00 /* 数据无效 */
#define MAC_ERR (int)0x9302 /* MAC错误 */
#define APP_LOCK (int)0x9303 /* 应用已锁定 */
#define NO_MONEY (int)0x9401 /* 金额不足 */
#define NO_KEY (int)0x9403 /* 密钥未找到 */
#define UNUSE_MAC (int)0x9406 /* 所需MAC不可用 */
#ifndef ERROR
#define ERROR -1 /* 一般错误 */
#endif
#ifndef TIMEOUT
#define TIMEOUT -1 /* 超时, SAM无响应 */
#endif
#ifndef CHECK_ERR
#define CHECK_ERR -2 /* 校验出错 */
#endif
#ifndef COMM_ERR
#define COMM_ERR -3 /* 通讯错误 */
#endif
int ICC_creat_file(ICC_FILE *file);
int ICC_erase_df(void);
int ICC_set_protocol();
int ICC_decrease();
int ICC_increase();
int ICC_write_key(KEY *key, int flag);
int ICC_verify_pin(char *pin, int pinlen, int id);
int ICC_external_auth();
int ICC_internal_auth(unsigned char *buf, int len, int keyid, int flag);
int ICC_get_challenge();
int ICC_select_file(char *filename, int namelen, int fileid, int flag);
int ICC_read_binary();
int ICC_read_record();
int ICC_get_response();
int ICC_update_binary();
int ICC_update_record();
int ICC_block();
int ICC_app_unblock();
int ICC_app_block();
int ICC_pin_unblock();
int ICC_initialize();
int ICC_credit_for_load();
int ICC_case_withdraw();
int ICC_update_overdraw_limit();
int ICC_get_transaction_proof();
int ICC_get_balance();
int ICC_reload_pin();
int ICC_append_record();
int ICC_DES(unsigned char *inblock, unsigned char *outblock, int wkeyid, int flag);
int ICC_MAC(unsigned char *inblock, int len, unsigned char *outblock,
int mkeyid, int wkeyid, int flag);
int ICC_creat_ltfs(void);
int ICC_store_masterkey(char *mkey, int mkeylen, int mkeyid);
int ICC_store_workingkey(char *wkey, int wkeylen, int mkeyid, int wkeyid);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -