📄 iccapp.h
字号:
/************************
* iccapp.h *
* Designe by 刘俐训 *
* Ic Card application *
************************/
#ifndef _SAMAPP_H_
#define _SAMAPP_H_
/*****************************************************
* 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;
//============================================================================//
//================================================================================//
/*******************************************************************************
* 密钥类型:30: DES加密; 31:DES解密;32:DESMAC;34:内部密钥;36:维护密钥 *
* 39:主控/外部认证;37:口令解锁;38:口令重装;3C:修改透支限额 *
* 3D:圈提;3E:消费;3A:口令;3B:解锁口令;3X:连接MF下的密钥 *
*******************************************************************************/
#define DES_EN 0x30 // DES加密
#define DES_DE 0x31 // DES解密
#define DES_MAC 0x32 // DESMAC
#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
//密钥用途
#define MCKey 0 //主控密钥
#define WHKey 1 //维护密钥
#define XFKey 2 //消费密钥
#define JSKey 3 //PIN解锁密钥
#define CZKey 4 //重装PIN密钥
#define YYKey 5 //用户卡应用维护密钥
#define MACKey 6 //MAC密钥
#define ENKey 7 //加密密钥
#define MEKey 8 //MAC加密密钥
//密钥算法标识
#define TDES 0 //3DES
#define SDES 1 //DES
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 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 0x9302 /* MAC错误 */
#define APP_LOCK 0x9303 /* 应用已锁定 */
#define NO_MONEY 0x9401 /* 金额不足 */
#define NO_KEY 0x9403 /* 密钥未找到 */
#define UNUSE_MAC 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
/*################################## 辅助命令 ##################################*/
/*****************************************
* 如果执行后面的命令后, *
* 返回数据长度未知, *
* 可用该函数取回返回数据的长度。 *
* 例如:ICC_sam_des_mac(...); *
* len = ICC_get_rsp_len(); *
* 则len即ICC_sam_des_mac()返回的数据长度*
*****************************************/
/*################################## 发卡命令 ##################################*/
//int ICC_creat_file(ICC_FILE *file);
//int ICC_erase_df(void);
//int ICC_set_protocol();
//int ICC_write_key(KEY *key, int flag);
//write key
//#define LOAD 0
//#define UPDATE 1
/*############################## 针对SAM卡的命令 ###############################*/
/*****************************************
* 计算MAC1 *
* 用户卡随机数,4字节 *
* 用户卡交易序号,2字节 *
* 交易金额,4字节 *
* 交易类型标识,1字节 *
* 交易日期(终端),4字节 *
* 交易时间(终端),3字节 *
* 消费密钥版本号,1字节 *
* 消费密钥算法标识,1字节 *
* 用户卡应用序列号,8字节 *
* 成员银行标识,8字节 *
* 试点城市标识,8字节 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -