lcd/INCLUDE/SJL19.h
2026-05-22 17:19:03 +08:00

282 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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_KEYLMK13旧IC卡除交易签名密钥外的其他IC卡密钥
IC_KEYLMK14旧IC卡IC卡交易签名密钥
PCK LMK15
IC_KEYLMK16新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]);
/*
22 安全管理指令集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]/*PinBlockInPin(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]/*PinInPinBlock(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]);
/*
21 状态管理指令集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] );
/*
22 安全管理指令集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]//PinBlockInPin(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]//PinInPinBlock(Out)
);
extern int SJL19_MD5(int hPCI, unsigned char *Data, unsigned int data_len, unsigned char Code[16]);
#endif