#ifndef _SJL19_h_ #define _SJL19_h_ #define PCI_DEVNAME "/dev/SJK1117Card0" #define PCI_KEY 0x400 #define ERR_RESPOND_LEN -1 #define ERR_PARAM_FAILED -2 #define ERR_RESPOND_TIMEOUT -3 #define ERR_DEAL_CHK -4 #define ERR_PARAM -7 #define ERR_OPENDEV -8 #define ERR_FORK -9 #define CI_NOCI 0xFF #define CI_DES 0x10 #define CI_3DES 0x20 #define CI_IDEA 0x30 #define CI_SEA 0x40 #define CI_SP02 0x50 #define CI_RSA128 0x60 #define CI_RSA256 0x70 #define KI_ZMK 0 #define KI_ZPK 1 #define KI_ZAK 2 #define KI_ZEK 3 #define KI_TMK 4 #define KI_TPK 5 #define KI_TAK 6 #define KI_TEK 7 #define KI_PVK 8 #define KI_CVK 9 #define KI_RAK 10 #define KI_PEK 11 #define KI_PMK 12 #define KI_ICKEY 13 //加解密PIN BLOCK的PIK #define KI_PIK 49 #ifndef HAVE_ #define HAVE_ typedef struct _DEV_HANDLE { int handle; int msgqid; int pid; }DevHandle; #endif /* ZMK: LMK0 ZPK: LMK1 ZAK: LMK2 ZEK: LMK3 TMK: LMK4 TPK: LMK5 TAK: LMK6 TEK: LMK7 PVK: LMK8 CVK: LMK9 RAK: LMK10 PEK: LMK11 PMK: LMK12 IC_KEY:LMK13(旧IC卡,除交易签名密钥外的其他IC卡密钥) IC_KEY:LMK14(旧IC卡,IC卡交易签名密钥) PCK: LMK15 IC_KEY:LMK16(新IC卡,所有密钥) RPK: LMK17 */ struct SJL19_Head { unsigned char head[32]; unsigned char command; unsigned char cipher; unsigned char datalen_h; unsigned char datalen_l; }; #define ERR_RESPOND_LEN -1 #define ERR_PARAM_FAILED -2 #define ERR_RESPOND_TIMEOUT -3 #define ERR_DEAL_CHK -4 #define PUTU32(ct, st) \ { (ct)[0] = (unsigned int8_t)((st) >> 24); \ (ct)[1] = (unsigned int8_t)((st) >> 16); \ (ct)[2] = (unsigned int8_t)((st) >> 8); \ (ct)[3] = (unsigned int8_t)(st); } extern int GetCRC(unsigned char *data, int len, unsigned char crc[2]); /* 状态管理指令集(Group=1) 编号 功能 代码 函数名称 1加密卡硬件自检 0x10 int SJL19_SelfTest(int hPCI) 2加密卡初始化 0x11 int SJL19_CardInit(int hPCI) 3取得加密卡状态 0x12 */ extern int SJL19_SelfTest(int hPCI); extern int SJL19_CardInit(int hPCI); extern int SJL19_GetCardInfo(int hPCI, unsigned char CardSerial[8], unsigned char CardVersion[4], unsigned char LMKCheckString[16], unsigned char *CardState, unsigned char LoginState[3]); /* 2.2 安全管理指令集(Group=2) 编号 指令内容 指令代码 函数定义 1 管理员登录 0x20 int SJL19_OperLogin(int hPCI,unsigned char OperIndex,unsigned char OperPasswd[8]) 2 退到正常状态 0x21 int SJL19_LogoutToNormal(int hPCI) 3 退到未登录状态 0x22 int SJL19_LogoutToNologin(int hPCI) 4 修改管理员口令 0x23 int SJL19_ChangePassword(int hPCI,unsigned char OperIndex,unsigned char OldPwd[8],unsigned char NewPwd[8]) */ extern int SJL19_OperLogin(int hPCI, unsigned char OperIndex, unsigned char OperPasswd[8]); extern int SJL19_LogoutToNormal(int hPCI); extern int SJL19_LogoutToNologin(int hPCI); extern int SJL19_ChangePassword(int hPCI, unsigned char OperIndex, unsigned char OldPwd[8], unsigned char NewPwd[8]); extern int SJL19_GenerateRand(int hPCI, unsigned char rand[16]); extern int SJL19_ReadFlash(int hPCI, unsigned int address, unsigned char *data, unsigned int datalen); extern int SJL19_SetLmkToTemp(int hPCI, unsigned char lmk[800]); extern int SJL19_MoveLmkToWork(int hPCI); extern int SJL19_ConvertDataByLMK_TempToWork(int hPCI, int Cipher, int Index, unsigned char Data[16]); extern int SJL19_ConvertDataByLMK_WorkToTemp(int hPCI, int Cipher, int Index, unsigned char Data[16]); extern int SJL19_EncryptByLMK(int hPCI, int Cipher, int Index, unsigned char *Data, unsigned int data_len); extern int SJL19_DecryptByLMK(int hPCI, int Cipher, int Index, unsigned char *Data, unsigned int data_len); extern int SJL19_EncryptByWorkKey(int hPCI, int Cipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); extern int SJL19_DecryptByWorkKey(int hPCI, int Cipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /*用工作密钥(密文)加密数据*/ extern int SJL19_EncryptByEncWorkKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /*用工作密钥(密文)解密数据*/ extern int SJL19_DecryptByEncWorkKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /* 产生RSA密钥对(私钥明文)*/ extern int SJL19_GenerateRsaKey(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char PrivateKey[256]); /* 产生RSA密钥对(私钥密文)*/ extern int SJL19_GenerateRsaEncKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PublicKey[256], unsigned char PrivateKey[256]); /* 用RSA公钥加密数据*/ extern int SJL19_EncryptByPublicKey_RSA(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char *Data, int data_len); /* 用RSA公钥解密数据*/ extern int SJL19_DecryptByPublicKey_RSA(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char *Data, int data_len); /* 用RSA私钥明文加密数据*/ extern int SJL19_EncryptByPrivateKey_RSA(int hPCI, int Cipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥明文解密数据*/ extern int SJL19_DecryptByPrivateKey_RSA(int hPCI, int Cipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥密文加密数据*/ extern int SJL19_EncryptByEncPrivateKey_RSA(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥密文加密数据*/ extern int SJL19_DecryptByEncPrivateKey_RSA(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /*数据由LMK加密转换为用工作密钥(密文)加密*/ extern int SJL19_EncryptBy_LMKToEncWorkkey(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, int data_len); /*数据由工作密钥(密文)加密转换为用LMK加密*/ extern int SJL19_EncryptBy_EncWorkkeyToLMK(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, int data_len); /*数据由工作密钥一(密文)加密转换为用工作密钥二(密文)加密*/ extern int SJL19_EncryptBy_EncWorkkey1ToEncWorkkey2(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char *Data, int data_len); /*数据在同一LMK下进行加密算法转换*/ extern int SJL19_ConvertByLMK(int hPCI, int Index, int LMKCipher1, int LMKCipher2, unsigned char *Data, int data_len); /*数据在同一工作密钥(密文)下进行加密算法转换*/ extern int SJL19_ConvertByWorkKey(int hPCI, int Index, int LMKCipher, int KeyCipher1, int KeyCipher2, unsigned char WorkKey[16], unsigned char *Data, int data_len); /*PINBLOCK由工作密钥一(密文)加密转为PIN用工作密钥二(密文)加密*/ extern int SJL19_PinblockToPin(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char PINFormat, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char PAN[8], unsigned char PINBLOCK[8]/*PinBlock(In)Pin(Out)*/); /* PIN用工作密钥一(密文)转为PINBLOCK用工作密钥二(密文)加密*/ extern int SJL19_PinToPinblock(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char PINFormat, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char PAN[8], unsigned char PINBLOCK[8]/*Pin(In)PinBlock(Out)*/); extern int SJL19_MD5(int hPCI, unsigned char *Data, unsigned int data_len, unsigned char Code[16]); extern int GetCRC(unsigned char *data, int len, unsigned char crc[2]); /* 2.1 状态管理指令集(Group=1) 编号 功能 代码 函数名称 1 加密卡硬件自检 0x10 int SJL19_SelfTest(int hPCI) 2 加密卡初始化 0x11 int SJL19_CardInit(int hPCI) 3 取得加密卡状态 0x12 */ extern int SJL19_SelfTest(int hPCI); extern int SJL19_CardInit(int hPCI); extern int SJL19_GetCardInfo(int hPCI, unsigned char CardSerial[8], unsigned char CardVersion[4], unsigned char LMKCheckString[16], unsigned char *CardState, unsigned char LoginState[3] ); /* 2.2 安全管理指令集(Group=2) 编号 指令内容 指令代码 函数定义 1 管理员登录 0x20 int SJL19_OperLogin(int hPCI,unsigned char OperIndex,unsigned char OperPasswd[8]) 2 退到正常状态 0x21 int SJL19_LogoutToNormal(int hPCI) 3 退到未登录状态 0x22 int SJL19_LogoutToNologin(int hPCI) 4 修改管理员口令 0x23 int SJL19_ChangePassword(int hPCI,unsigned char OperIndex,unsigned char OldPwd[8],unsigned char NewPwd[8]) */ extern int SJL19_OperLogin(int hPCI, unsigned char OperIndex, unsigned char OperPasswd[8]); extern int SJL19_LogoutToNormal(int hPCI); extern int SJL19_LogoutToNologin(int hPCI); extern int SJL19_ChangePassword(int hPCI, unsigned char OperIndex, unsigned char OldPwd[8], unsigned char NewPwd[8]); extern int SJL19_GenerateRand(int hPCI, unsigned char rand[16]); extern int SJL19_ReadFlash(int hPCI, unsigned int address, unsigned char *data, unsigned int datalen); extern int SJL19_WriteFlash(int hPCI, unsigned int address, unsigned char *data, unsigned int datalen); extern int SJL19_SetLmkToTemp(int hPCI, unsigned char lmk[800]); extern int SJL19_MoveLmkToWork(int hPCI); extern int SJL19_ConvertDataByLMK_TempToWork(int hPCI, int Cipher, int Index, unsigned char Data[16]); extern int SJL19_ConvertDataByLMK_WorkToTemp(int hPCI, int Cipher, int Index, unsigned char Data[16]); extern int SJL19_EncryptByLMK(int hPCI, int Cipher, int Index, unsigned char *Data, unsigned int data_len); extern int SJL19_DecryptByLMK(int hPCI, int Cipher, int Index, unsigned char *Data, unsigned int data_len); extern int SJL19_EncryptByWorkKey(int hPCI, int Cipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); extern int SJL19_DecryptByWorkKey(int hPCI, int Cipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /*用工作密钥(密文)加密数据*/ extern int SJL19_EncryptByEncWorkKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /*用工作密钥(密文)解密数据*/ extern int SJL19_DecryptByEncWorkKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, unsigned int data_len); /* 产生RSA密钥对(私钥明文)*/ extern int SJL19_GenerateRsaKey(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char PrivateKey[256]); /* 产生RSA密钥对(私钥密文)*/ extern int SJL19_GenerateRsaEncKey(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PublicKey[256], unsigned char PrivateKey[256]); /* 用RSA公钥加密数据*/ extern int SJL19_EncryptByPublicKey_RSA(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char *Data, int data_len); /* 用RSA公钥解密数据*/ extern int SJL19_DecryptByPublicKey_RSA(int hPCI, int Cipher, unsigned char PublicKey[256], unsigned char *Data, int data_len); /* 用RSA私钥明文加密数据*/ extern int SJL19_EncryptByPrivateKey_RSA(int hPCI, int Cipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥明文解密数据*/ extern int SJL19_DecryptByPrivateKey_RSA(int hPCI, int Cipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥密文加密数据*/ extern int SJL19_EncryptByEncPrivateKey_RSA(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /* 用RSA私钥密文加密数据*/ extern int SJL19_DecryptByEncPrivateKey_RSA(int hPCI, int Cipher, int Index, int LMKCipher, unsigned char PrivateKey[256], unsigned char *Data, int data_len); /*数据由LMK加密转换为用工作密钥(密文)加密*/ extern int SJL19_EncryptBy_LMKToEncWorkkey(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, int data_len); /*数据由工作密钥(密文)加密转换为用LMK加密*/ int SJL19_EncryptBy_EncWorkkeyToLMK(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey[16], unsigned char *Data, int data_len); /*数据由工作密钥一(密文)加密转换为用工作密钥二(密文)加密*/ extern int SJL19_EncryptBy_EncWorkkey1ToEncWorkkey2(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char *Data, int data_len); /*数据在同一LMK下进行加密算法转换*/ extern int SJL19_ConvertByLMK(int hPCI, int Index,int LMKCipher1, int LMKCipher2,unsigned char *Data, int data_len); /*数据在同一工作密钥(密文)下进行加密算法转换*/ extern int SJL19_ConvertByWorkKey(int hPCI, int Index,int LMKCipher, int KeyCipher1, int KeyCipher2, unsigned char WorkKey[16],unsigned char *Data, int data_len); /*PINBLOCK由工作密钥一(密文)加密转为PIN用工作密钥二(密文)加密*/ extern int SJL19_PinblockToPin(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char PINFormat, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char PAN[8], unsigned char PINBLOCK[8]//PinBlock(In)Pin(Out) ); /* PIN用工作密钥一(密文)转为PINBLOCK用工作密钥二(密文)加密*/ extern int SJL19_PinToPinblock(int hPCI, int Cipher, int Index1, int Index2, int LMKCipher, unsigned char PINFormat, unsigned char WorkKey1[16], unsigned char WorkKey2[16], unsigned char PAN[8], unsigned char PINBLOCK[8]//Pin(In)PinBlock(Out) ); extern int SJL19_MD5(int hPCI, unsigned char *Data, unsigned int data_len, unsigned char Code[16]); #endif