282 lines
14 KiB
C
282 lines
14 KiB
C
#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
|