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

📄 iccapp.h

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 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 + -