|
|
/*
|
|
|
* alg_drv.h
|
|
|
*
|
|
|
* Created on: 2017年6月9日
|
|
|
* Author: ccore
|
|
|
*/
|
|
|
|
|
|
#ifndef ALG_DRV_H_
|
|
|
#define ALG_DRV_H_
|
|
|
#include "type.h"
|
|
|
#include "memmap.h"
|
|
|
|
|
|
#define SRAM_BEGIN (UINT32)(0x20000000)
|
|
|
#define SRAM_END (UINT32)(0x20038000)
|
|
|
|
|
|
#define EFLASH_BEGIN (UINT32)(0x8000000)
|
|
|
#define EFLASH_END (UINT32)(0x807F000)
|
|
|
|
|
|
typedef enum
|
|
|
{
|
|
|
TYPE_ERROR = 0,
|
|
|
TYPE_SRAM = 1,
|
|
|
TYPE_EFLASH= 2,
|
|
|
}TYPE_ADDR;
|
|
|
|
|
|
/*******Hash算法类型编号********/
|
|
|
#define HASH_SM3 0
|
|
|
#define HASH_SHA0 1
|
|
|
#define HASH_SHA1 2
|
|
|
#define HASH_SHA224 3
|
|
|
#define HASH_SHA256 4
|
|
|
#define HASH_SHA384 5
|
|
|
#define HASH_SHA512 6
|
|
|
|
|
|
/*******Hash算法数据结构********/
|
|
|
typedef struct Hash_tx
|
|
|
{
|
|
|
unsigned int hash_len[4]; //本次传送数据长度;
|
|
|
unsigned int DataBuf[16]; //本次运算结果
|
|
|
unsigned char HASHMode; //Hash算法类型编号
|
|
|
unsigned char fb_flag[1]; //第一包数据标志,1 - 第一包数据传输完;0 - 未完成
|
|
|
|
|
|
}Hash_tx;
|
|
|
|
|
|
#define SHA0_R_Len 20
|
|
|
#define SHA1_R_Len 20
|
|
|
#define SHA224_R_Len 28
|
|
|
#define SHA256_R_Len 32
|
|
|
#define SM3_R_Len 32
|
|
|
#define SHA384_R_Len 48
|
|
|
#define SHA512_R_Len 64
|
|
|
|
|
|
//sm2
|
|
|
#define SM2_TEST_BITS 256
|
|
|
//大数运算相关的数据结构定义与运算函数
|
|
|
#define ECC_BIGINT32_MAXLEN 12
|
|
|
|
|
|
/*******大数的32位数组结构********/
|
|
|
typedef struct
|
|
|
{
|
|
|
UINT16 uLen; //32位数组的实际长度
|
|
|
UINT32 auValue[ECC_BIGINT32_MAXLEN]; //32位数组的值,数组的低32位地址存放大数的低32位有效数,高32位地址存放大数的高32位有效数
|
|
|
}ECC_STU_BIGINT32;
|
|
|
|
|
|
/*******SM2参数据结构********/
|
|
|
typedef struct
|
|
|
{
|
|
|
UINT16 uBits; // 模数P的位数
|
|
|
ECC_STU_BIGINT32 stuPrimeP; // 模数P
|
|
|
ECC_STU_BIGINT32 stuCoefficientA; // 椭圆系数A
|
|
|
ECC_STU_BIGINT32 stuCoefficientB; // 椭圆系数B
|
|
|
ECC_STU_BIGINT32 stuGx; // 椭圆基点坐标Gx
|
|
|
ECC_STU_BIGINT32 stuGy; // 椭圆基点坐标Gy
|
|
|
ECC_STU_BIGINT32 stuPrimeN; // 椭圆基点坐标G的阶
|
|
|
} SM2_STU_PRAMS;
|
|
|
|
|
|
/******SM2公钥结构********/
|
|
|
typedef struct
|
|
|
{
|
|
|
ECC_STU_BIGINT32 stuQx; // 公钥坐标Qx
|
|
|
ECC_STU_BIGINT32 stuQy; // 公钥坐标Qy
|
|
|
} SM2_STU_PUBKEY;
|
|
|
|
|
|
|
|
|
extern SM2_STU_PRAMS stuEccPrams;
|
|
|
extern SM2_STU_PUBKEY stuPubKey;
|
|
|
extern ECC_STU_BIGINT32 stuPrivKey;
|
|
|
extern ECC_STU_BIGINT32 stuSignatureR;
|
|
|
extern ECC_STU_BIGINT32 stuSignatureS;
|
|
|
|
|
|
|
|
|
//rsa
|
|
|
//#define RSA_TEST_BITS 512
|
|
|
//#define RSA_TEST_BITS 1024
|
|
|
#define RSA_TEST_BITS 2048
|
|
|
|
|
|
//#define MAX_RSA_MODULUS_BITS 512
|
|
|
//#define MAX_RSA_MODULUS_BITS 1024
|
|
|
#define MAX_RSA_MODULUS_BITS 2048
|
|
|
|
|
|
#define MAX_RSA_MODULUS_LEN ((MAX_RSA_MODULUS_BITS + 31) / 32)
|
|
|
#define MAX_RSA_PRIME_BITS ((MAX_RSA_MODULUS_BITS + 1) / 2 )
|
|
|
#define MAX_RSA_PRIME_LEN ((MAX_RSA_PRIME_BITS + 31) / 32)
|
|
|
|
|
|
/******RSA公钥结构********/
|
|
|
typedef struct
|
|
|
{
|
|
|
unsigned int bits; /* length in bits of modulus */
|
|
|
unsigned int modulus[MAX_RSA_MODULUS_LEN]; /* modulus */
|
|
|
unsigned int exponent[MAX_RSA_MODULUS_LEN]; /* public exponent */
|
|
|
} STU_RSA_PUBKEY;
|
|
|
|
|
|
/******RSA私钥结构********/
|
|
|
typedef struct
|
|
|
{
|
|
|
unsigned int bits; /* length in bits of modulus */
|
|
|
unsigned int modulus[MAX_RSA_MODULUS_LEN]; /* modulus */
|
|
|
unsigned int publicExponent[MAX_RSA_MODULUS_LEN]; /* public exponent */
|
|
|
unsigned int exponent[MAX_RSA_MODULUS_LEN]; /* private exponent */
|
|
|
unsigned int prime[2][MAX_RSA_PRIME_LEN]; /* prime factors */
|
|
|
unsigned int primeExponent[2][MAX_RSA_PRIME_LEN]; /* exponents for CRT */
|
|
|
unsigned int coefficient[MAX_RSA_PRIME_LEN]; /* CRT coefficient */
|
|
|
} STU_RSA_PRIVKEY;
|
|
|
|
|
|
typedef struct
|
|
|
{
|
|
|
unsigned int bits; /*length in bits of modulus*/
|
|
|
unsigned char *modulus; /* modulus */
|
|
|
unsigned char *exponent; /* public exponent */
|
|
|
unsigned int explen; /* exponent bytes */
|
|
|
}rsa_pub_key_t;
|
|
|
|
|
|
extern STU_RSA_PUBKEY publicKeyRSA;
|
|
|
extern STU_RSA_PRIVKEY privateKeyRSA;
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AES_Enable
|
|
|
* Description : 使能AES模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void AES_Enable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AES_Enable
|
|
|
* Description : 禁用AES模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void AES_Disable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AES_EnDecrypt
|
|
|
* Description : 通过AES (128bits、192bits、256bits)进行加解密运算
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:原来的库此函数内部运算之前打开了EDMAC时钟,退出之前关闭了EDMAC时钟;调用完本函数之后,如其它操作使用EDMAC模块,需要先主动打开EDMAC模块时钟;
|
|
|
* 2:原库与新库参数的顺序有所不同;
|
|
|
* 3:本库中内部对EDMAC时钟未进行任何操作;
|
|
|
*
|
|
|
* Input : EncDe_Mode - 加解密选择
|
|
|
* 0 - 表示加密;
|
|
|
* 1 - 表示解密.
|
|
|
* CTR_ECB_MODE - 模式选择
|
|
|
* 0 - ECB模式;
|
|
|
* 1 - CTR模式.
|
|
|
* Key - 加解密密钥
|
|
|
* cntIV - CTR模式初始向量值
|
|
|
* key_mode - AES算法密钥长度
|
|
|
* 0 - 128bit;
|
|
|
* 1 - 192bit;
|
|
|
* 2 - 256bit.
|
|
|
* srcbuffer - 加解密数据地址
|
|
|
* Output - 加解密结果地址
|
|
|
* datalen - 加解密数据长度,16字节的整数倍
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void AES_EnDecrypt(U8 EncDe_Mode, U8 CTR_ECB_MODE,U32 *Key, U32 *cntIV,U32 key_mode, U32 *srcbuffer, U32 *Output, U32 datalen);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : DES_Enable
|
|
|
* Description : 使能DES模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void DES_Enable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : DES_Disable
|
|
|
* Description : 禁用DES模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void DES_Disable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AES_EnDecrypt
|
|
|
* Description : 通过des/3des (64bits、128bits、192bits) 进行加解密运算
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:原来的库此函数内部运算之前打开了EDMAC时钟,退出之前关闭了EDMAC时钟;调用完本函数之后,如其它操作使用EDMAC模块,需要先主动打开EDMAC模块时钟;
|
|
|
* 2:本库中内部对EDMAC时钟未进行任何操作;
|
|
|
*
|
|
|
* Input : EncDe_Mode - 加解密选择
|
|
|
* 0 - 表示加密;
|
|
|
* 1 - 表示解密.
|
|
|
* ECB_CBC_Mode - 模式选择
|
|
|
* 0 - ECB模式;
|
|
|
* 1 - CBC模式
|
|
|
* Key - 加解密密钥
|
|
|
* KeyLen - 加解密密钥长度,单位为字节
|
|
|
* 8 - 64bit的des加解密;
|
|
|
* 16 - 128bit的3des加解密;
|
|
|
* 24 - 192bit的3des加解密.
|
|
|
* ivbuffer - 初始向量值,固定为8字节长度的值
|
|
|
* srcbuffer - 加解密数据地址
|
|
|
* Output - 加解密结果地址
|
|
|
* datalen - 加解密数据长度,8字节的整数倍
|
|
|
* check_parity:输入的key是否需要进行校验,如果校验错误则返回key校验错误不再继续加解密
|
|
|
* 1 - 打开此功能;
|
|
|
* 0 - 禁用此功能.
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void DES_EnDecrypt(U8 EncDe_Mode, U8 ECB_CBC_Mode, U32 *Key, U32 KeyLen, U32 *ivbuffer, U32 *srcbuffer, U32 *Output,U32 datalen, U8 check_parity);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SMS4_Enable
|
|
|
* Description : 使能SMS4模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SMS4_Enable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SMS4_Disable
|
|
|
* Description : 禁用SMS4模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SMS4_Disable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SMS4_EnDecrypt
|
|
|
* Description : 通过SMS4模块对数据加解密
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:原来的库此函数内部运算之前打开了EDMAC时钟,退出之前关闭了EDMAC时钟;调用完本函数之后,如其它操作使用EDMAC模块,需要先主动打开EDMAC模块时钟;
|
|
|
* 2:本库中内部对EDMAC时钟未进行任何操作;
|
|
|
*
|
|
|
* Input : EncDe_Mode - 加解密选择
|
|
|
* 0 - 表示加密;
|
|
|
* 1 - 表示解密.
|
|
|
* ECB_CBC_Mode - 模式选择
|
|
|
* 0 - ECB模式;
|
|
|
* 1 - CBC模式
|
|
|
* KEY - 128位加解密密钥
|
|
|
* IV - 128位初始向量
|
|
|
* ivbuffer - 初始向量值,固定为8字节长度的值
|
|
|
* srcbuffer - 加解密数据地址
|
|
|
* Output - 加解密结果地址
|
|
|
* datalen - 加解密数据长度,16字节的整数倍
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SMS4_EnDecrypt (unsigned char EncDe_Mode, unsigned char ECB_CBC_Mode, unsigned int *KEY, unsigned int*IV, unsigned int *srcbuffer, unsigned int *Output, unsigned int datalen);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Init
|
|
|
* Description : SHA算法模块初始化
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:使用SHA模块函数之前必需先主动打开SHA、EDAMC模块时钟;
|
|
|
* 2:与原来版本相比较增加Hash_tx *phash_tx参数;
|
|
|
*
|
|
|
* Input : phash_tx - 哈希算法数据结构
|
|
|
* HashModeNum - 哈希算法编号,取值范围0~4
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SHA_Init(Hash_tx *phash_tx, unsigned char HashModeNum);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Update
|
|
|
* Description : 发送要进行SHA运算的数据
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:使用SHA模块函数之前必需先主动打开SHA、EDAMC模块时钟;
|
|
|
* 2:与原来版本相比较增加Hash_tx *phash_tx参数。
|
|
|
*
|
|
|
* Input : phash_tx - 哈希算法数据结构
|
|
|
* pMessageBlock – 指向本次待处理的数据,地址最好4字节对齐
|
|
|
* DataLen – 本次待处理数据长度,长度最好为4的整数倍
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SHA_Update(Hash_tx *phash_tx, unsigned char *pMessageBlock, unsigned int DataLen);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Final
|
|
|
* Description : 结束SHA操作并获取结果
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:使用SHA模块函数之前必需先主动打开SHA、EDAMC模块时钟;
|
|
|
* 2:与原来版本相比较增加Hash_tx *phash_tx参数。
|
|
|
*
|
|
|
* Input : phash_tx - 哈希算法数据结构
|
|
|
* pRes – 哈希运算结果
|
|
|
* Output : None
|
|
|
* Return : 本次SHA运算结果字节长度
|
|
|
******************************************************************************/
|
|
|
extern unsigned int SHA_Final(Hash_tx *phash_tx, unsigned int *pRes);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2_Enable
|
|
|
* Description : SM2模块使能
|
|
|
*
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2_Enable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2_Disable
|
|
|
* Description : SM2模块禁用
|
|
|
*
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2_Disable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Init
|
|
|
* Description : SM2模块初始化
|
|
|
*
|
|
|
* 备注:
|
|
|
* 原库函数名称为ECCInit(unsigned short bits);
|
|
|
*
|
|
|
* Input : bits - SM2位数
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
//extern void SM2Init(unsigned short bits);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateKeyPair
|
|
|
* Description : SM2生成的密钥对
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1:此函数内部会使用随机数模块,需打开随机数模块时钟并调用InitTrng函数;
|
|
|
* 2:函数内部使用EDMAC,需要主动打开EDMAC模块时钟;
|
|
|
* 3:内部使用CRYPTO模块,需要主动打开CRYPTO模块时钟;
|
|
|
*
|
|
|
* Input : pstuSM2Prams->uBits 模数P的位数
|
|
|
* pstuSM2Prams->stuCoefficientA 椭圆系数A
|
|
|
* pstuSM2Prams->stuCoefficientA 椭圆系数B
|
|
|
* pstuSM2Prams->stuGx 椭圆基点坐标Gx
|
|
|
* pstuSM2Prams->stuGy 椭圆基点坐标Gy
|
|
|
* pstuSM2Prams->stuPrimeN 椭圆基点坐标G的阶
|
|
|
* pstuPrivKey 存放生成的私钥
|
|
|
* pstuPbuKey 存放生成的公钥
|
|
|
* Output : None
|
|
|
* Return : 1 - 密钥对产生正确
|
|
|
* 0 - 密钥对产生失败
|
|
|
******************************************************************************/
|
|
|
extern char SM2GenerateKeyPair(SM2_STU_PRAMS *pstuSM2Prams, ECC_STU_BIGINT32 *pstuPrivKey,SM2_STU_PUBKEY *pstuPbuKey);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Encrypt_V2
|
|
|
* Description : 使用公钥对明文加密,产生的密文长度 = 明文长度 + 96字节
|
|
|
* SM2Encrypt_V2:使用公钥对明文加密,成生的密文存储方式为:C1|C3|C2;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.函数内部使用EDMAC,需要打开EDMAC模块时钟;
|
|
|
* 2.函数内部使用SHA模块,需要打开SHA模块时钟;
|
|
|
* 3.内部使用CRYPTO模块,需要打开CRYPTO模块时钟;
|
|
|
*
|
|
|
* Input : mes 明文,高字节在后,低字节在前(大端结构),mes[0]为高字节,若最后一个字节不满32位,则在该字节的末尾填0直到满32位;
|
|
|
* 例如mes若为48bit长的123456789abc,则mes[0]为0x12345678,mes[1]为0x9abc0000,
|
|
|
* klen 明文字节长度
|
|
|
* pstuPubKey 公钥
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* cipher 存放输出的密文,存储方式和明文相同
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2Encrypt_V2(unsigned char *mes, unsigned short klen, SM2_STU_PUBKEY *pstuPubKey,SM2_STU_PRAMS *pstuEccPrams, unsigned char *cipher);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Decrypt_V2
|
|
|
* Description : 使用私钥对密文解密
|
|
|
* SM2Decrypt_V2:使用私钥对存储方式为C1|C3|C2的密文进行解密;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.函数内部使用EDMAC,需要打开EDMAC模块时钟;
|
|
|
* 2.函数内部使用SHA模块,需要打开SHA模块时钟;
|
|
|
* 3.内部使用CRYPTO模块,需要打开CRYPTO模块时钟;
|
|
|
* 4.原库:使用私钥对存储方式为C1|C3|C2的密文进行解密
|
|
|
*
|
|
|
* Input : cipher 密文,大端结构
|
|
|
* klen 明文字节长度
|
|
|
* stuPrivKey 私钥
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* plain: 输出明文,大端结构
|
|
|
* Output : None
|
|
|
* Return : 1 - 成功
|
|
|
* 0 - 失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2Decrypt_V2(unsigned char *cipher, unsigned short klen, ECC_STU_BIGINT32 *stuPrivKey, SM2_STU_PRAMS *pstuEccPrams, unsigned char *plain);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Signature
|
|
|
* Description : 使用私钥对明文进行签名;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用随机数模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用EDAMC模块,需要打开模块时钟;
|
|
|
* 3.此函数内部使用CRYPTO模块,需要请打开模块时钟;
|
|
|
*
|
|
|
* Input : mes 明文
|
|
|
* klen 明文字节长度
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* pstuPubKey 公钥
|
|
|
* pSignatureR 输出明文的签名信息R
|
|
|
* pSignatureS 输出明文的签名信息S
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2Signature(unsigned char *mes, unsigned short klen, SM2_STU_PRAMS *pstuEccPrams, ECC_STU_BIGINT32 *pstuPrivKey, ECC_STU_BIGINT32 *pSignatureR, ECC_STU_BIGINT32 *pSignatureS);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2SignatureWithIDA
|
|
|
* Description : 使用私钥及身份信息对明文进行签名;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用随机数模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用SHA模块,需要请打开模块时钟;
|
|
|
* 3.此函数内部使用EDMAC模块,需要请打开模块时钟;
|
|
|
* 4.此函数内部使用CRYPTO模块,需要请打开模块时钟;
|
|
|
*
|
|
|
* Input : mes 明文
|
|
|
* klen 明文字节长度
|
|
|
* IDA 签名方的身份信息
|
|
|
* entla 签名方身份信息字节长度
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* pstuPubKey 公钥
|
|
|
* pstuPrivKey 私钥
|
|
|
* pSignatureR 输出明文的签名信息R
|
|
|
* pSignatureS 输出明文的签名信息S
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2SignatureWithIDA(unsigned char *mes, unsigned short klen, unsigned char *IDA, unsigned short entla, SM2_STU_PRAMS *pstuEccPrams, SM2_STU_PUBKEY *pstuPubKey, ECC_STU_BIGINT32 *pstuPrivKey, ECC_STU_BIGINT32 *pSignatureR,ECC_STU_BIGINT32 *pSignatureS);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Verification
|
|
|
* Description : 使用公钥对明文和签名进行验证;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用EDAMC模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用CRYPTO模块,需要打开模块时钟;
|
|
|
*
|
|
|
* Input : mes 明文
|
|
|
* klen 明文字节长度
|
|
|
* IDA 签名方的身份信息
|
|
|
* entla 签名方身份信息的字节长度(备注:原来库为签名方身份信息的bit长度)
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* pstuPubKey 公钥
|
|
|
* pSignatureR 明文的签名信息R
|
|
|
* pSignatureS 明文的签名信息S
|
|
|
* Output : None
|
|
|
* Return : 1 - 验证通过
|
|
|
* 0 - 验证失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2Verification(unsigned char *mes, unsigned short klen, SM2_STU_PRAMS *pstuEccPrams, SM2_STU_PUBKEY *pstuPubKey, ECC_STU_BIGINT32 *pSignatureR, ECC_STU_BIGINT32 *pSignatureS);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2VerificationWithIDA
|
|
|
* Description : 使用公钥及身份信息对明文和签名进行验证;
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用CRYPTO模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用SHA模块,需要打开模块时钟;
|
|
|
* 3.此函数内部使用EDMAC模块,需要打开模块时钟;
|
|
|
* 4.此函数内部使用CRYPTO模块,需要打开模块时钟;
|
|
|
*
|
|
|
* Input : mes 明文
|
|
|
* klen 明文字节长度
|
|
|
* IDA 签名方的身份信息
|
|
|
* entla 签名方身份信息的字节长度(备注:原来库为签名方身份信息的bit长度)
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* pstuPubKey 公钥
|
|
|
* pSignatureR 明文的签名信息R
|
|
|
* pSignatureS 明文的签名信息S
|
|
|
* Output : None
|
|
|
* Return : 1 - 验证通过
|
|
|
* 0 - 验证失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2VerificationWithIDA(unsigned char *mes, unsigned short klen, unsigned char *IDA, unsigned short entla, SM2_STU_PRAMS *pstuEccPrams, SM2_STU_PUBKEY *pstuPubKey, ECC_STU_BIGINT32 *pSignatureR, ECC_STU_BIGINT32 *pSignatureS);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : sign
|
|
|
* Description : 输出用户的身份信息
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用SHA(SM3)模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用EDMAC模块,需要打开模块时钟;
|
|
|
*
|
|
|
* Input : IDA 签名方的身份信息
|
|
|
* Entla 签名方身份信息的字节长度(备注:原库为签名方身份信息的bit长度)
|
|
|
* pstuPubKey 公钥
|
|
|
* pstuEccPrams 椭圆曲线参数
|
|
|
* za 输出用户的身份信息
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void sign(unsigned char *IDA, unsigned short entla, SM2_STU_PUBKEY *pstuPubKey, SM2_STU_PRAMS *pstuEccPrams, unsigned int *za);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2KeyExchange
|
|
|
* Description : 交换用户A和用户B的密钥
|
|
|
*
|
|
|
* 备注:
|
|
|
* 1.此函数内部使用SHA(SM3)模块,需要打开模块时钟;
|
|
|
* 2.此函数内部使用EDMAC模块,需要打开模块时钟;
|
|
|
* 3.此函数内部使用CRYPTO模块,需要打开模块时钟;
|
|
|
*
|
|
|
* Input : pstuEccPrams 椭圆曲线参数
|
|
|
* pSelfPrikey 已方私钥
|
|
|
* pSelfTempPubkey 已方临时公钥
|
|
|
* pSelfTempPrikey 已方临时私钥
|
|
|
* pOtherPubkey 对方公钥
|
|
|
* pOtherTempPubkey 对方临时公钥
|
|
|
* za 已方Z值
|
|
|
* zb 对方Z值
|
|
|
* pAgreedKey 协商密钥
|
|
|
* AgreedKeyLen 协商密钥长度
|
|
|
* sA SA或S2
|
|
|
* sB SB或S1
|
|
|
* Mode 0表示已方为A方,1表示已方为B方
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : 1 - 验证通过
|
|
|
* 0 - 验证失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2KeyExchange(SM2_STU_PRAMS *pstuEccPrams, ECC_STU_BIGINT32 *pSelfPrikey, SM2_STU_PUBKEY *pSelfTempPubkey, ECC_STU_BIGINT32 *pSelfTempPrikey, SM2_STU_PUBKEY*pOtherPubkey,
|
|
|
SM2_STU_PUBKEY *pOtherTempPubkey, UINT32 *za, UINT32 *zb, UINT32 *pAgreedKey, UINT32 AgreedKeyLen, UINT32 *sA, UINT32 *sB, UINT32 Mode);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : EccBig32Initial
|
|
|
* Description : 大数的初始化。数组值全赋值为0,数组长度记为1
|
|
|
*
|
|
|
*
|
|
|
* Input : None
|
|
|
*
|
|
|
* Output : pstuA 指向结构体ECC_STU_BIGINT的指针,初始化后的pstuA
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void EccBig32Initial(ECC_STU_BIGINT32 *pstuA);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : EccCharToHex
|
|
|
* Description : 字符型数据转化成为Hex格式数据
|
|
|
*
|
|
|
*
|
|
|
* Input : pChar 指向需要转化的字符型数据存储地址
|
|
|
* uLen 转化数据的长度,即pChar数据的字节数
|
|
|
* Output : pHex 指向转化成Hex格式数据的存储地址
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void EccCharToHex(UINT8 *pChar, UINT8 *pHex, UINT16 uLen);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : EccByBufToBigInt32
|
|
|
* Description : 输入无符号8位整型数组转换为结构体ECC_STU_BIGINT32的大数格式
|
|
|
* 例如:长度为8的数据:
|
|
|
* pbyOutBuf[0]=0x55;
|
|
|
* pbyOutBuf[1]=0x66;
|
|
|
* pbyOutBuf[2]=0x77;
|
|
|
* pbyOutBuf[3]=0x88;
|
|
|
* pbyOutBuf[4]=0x11;
|
|
|
* pbyOutBuf[5]=0x22;
|
|
|
* pbyOutBuf[6]=0x33;
|
|
|
* pbyOutBuf[7]=0x44;
|
|
|
* 转化为 长度为2的大数 :
|
|
|
* pstuInBigInt->auValue[0]=0x11223344;
|
|
|
* pstuInBigInt->auValue[1]=0x55667788;
|
|
|
*
|
|
|
* Input : pbyInBuf 指向无符号8位字符型数组首地址
|
|
|
* uInLen 无符号8位字符型数组的长度
|
|
|
* Output : pstuOutBigInt 指向结构体ECC_STU_BIGINT32的地址,输出转换后的对应大数
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
void EccByBufToBigInt32(UINT8 *pbyInBuf,UINT16 uInLen, ECC_STU_BIGINT32 *pstuOutBigInt);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : TestKeyChange
|
|
|
* Description : SM2交换密钥测试函数
|
|
|
*
|
|
|
* Input : pstuPrivKey_A 己方私钥
|
|
|
* pstuPubKey_A 己方公钥
|
|
|
* pstuPrivKey_B 对方私钥
|
|
|
* pstuPubKey_B 对方公钥
|
|
|
* pstuEccPrams ECC参数
|
|
|
* za 己方z值
|
|
|
* zb 对方z值
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : 1 - 成功
|
|
|
* 0 - 失败
|
|
|
******************************************************************************/
|
|
|
UINT8 TestKeyChange(ECC_STU_BIGINT32 *pstuPrivKey_A,SM2_STU_PUBKEY *pstuPubKey_A,ECC_STU_BIGINT32 *pstuPrivKey_B,SM2_STU_PUBKEY *pstuPubKey_B,SM2_STU_PRAMS *pstuEccPrams,unsigned int *za,unsigned int *zb);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AB_Check
|
|
|
* Description : 交换用户之间参数检测
|
|
|
*
|
|
|
* Input : s1
|
|
|
* sB
|
|
|
* sA
|
|
|
* s2
|
|
|
* pstuEccPrams Ecc参数
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : 1 - 成功
|
|
|
* 0 - 失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 AB_Check(UINT32 *s1, UINT32 *sB, UINT32 *sA, UINT32 *s2, SM2_STU_PRAMS *pstuEccPrams);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2VerifySA
|
|
|
* Description : USER_B verification USER_A
|
|
|
*
|
|
|
* Input : s2
|
|
|
* sA
|
|
|
* pstuEccPrams Ecc参数
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : 1 - 成功
|
|
|
* 0 - 失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2VerifySA(UINT32 *s2, UINT32 *sA, SM2_STU_PRAMS *pstuEccPrams);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateKA
|
|
|
* Description : USER_A verification USER_B , then Send choice(SA) to USER_B
|
|
|
*
|
|
|
* Input : pstuEccPrams
|
|
|
* pstuPubKey_B
|
|
|
* pstuPrivKey_A
|
|
|
* za
|
|
|
* zb
|
|
|
* rA
|
|
|
* sB
|
|
|
* sA
|
|
|
* RA_x1
|
|
|
* RA_y1
|
|
|
* RB_x2
|
|
|
* RB_y2
|
|
|
* kA
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : 1 - 成功
|
|
|
* 0 - 失败
|
|
|
******************************************************************************/
|
|
|
extern UINT8 SM2GenerateKA(SM2_STU_PRAMS *pstuEccPrams, SM2_STU_PUBKEY *pstuPubKey_B, ECC_STU_BIGINT32 *pstuPrivKey_A, UINT32 *za, UINT32 *zb,
|
|
|
ECC_STU_BIGINT32 *rA, UINT32 *sB, UINT32 *sA, ECC_STU_BIGINT32 *RA_x1, ECC_STU_BIGINT32 *RA_y1, ECC_STU_BIGINT32 *RB_x2, ECC_STU_BIGINT32 *RB_y2, UINT32 *kA);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateRBKB
|
|
|
* Description : USER_B response USER_A, then Send RB and choice(SB) to USER_A
|
|
|
*
|
|
|
* Input : pstuEccPrams
|
|
|
* pstuPubKey_A
|
|
|
* pstuPrivKey_B
|
|
|
* sB
|
|
|
* s2
|
|
|
* za
|
|
|
* zb
|
|
|
* RA_x1
|
|
|
* RA_y1
|
|
|
* RB_x2
|
|
|
* RB_y2
|
|
|
* kB
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2GenerateRBKB(SM2_STU_PRAMS *pstuEccPrams, SM2_STU_PUBKEY *pstuPubKey_A, ECC_STU_BIGINT32 *pstuPrivKey_B, UINT32 *sB, UINT32 *s2, UINT32 *za, UINT32 *zb,
|
|
|
ECC_STU_BIGINT32 *RA_x1, ECC_STU_BIGINT32 *RA_y1, ECC_STU_BIGINT32 *RB_x2, ECC_STU_BIGINT32 *RB_y2, UINT32 *kB);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateRBKB
|
|
|
* Description : USER_B response USER_A, then Send RB and choice(SB) to USER_A
|
|
|
*
|
|
|
* Input : pstuEccPrams
|
|
|
* RA_x1
|
|
|
* RA_y1
|
|
|
* rA
|
|
|
*
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void SM2GenerateRA(SM2_STU_PRAMS *pstuEccPrams, ECC_STU_BIGINT32 *RA_x1, ECC_STU_BIGINT32 *RA_y1, ECC_STU_BIGINT32 *rA);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaModuleEnable
|
|
|
* Description : 使能RSA模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void RsaModuleEnable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaModuleDisable
|
|
|
* Description : 禁用RSA模块
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern void RsaModuleDisable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaGenerateKeyPair
|
|
|
* Description : RSA 密钥对生产
|
|
|
* Input : mode RSA算法位数,应填写值为,1024、2048等。
|
|
|
* fixkey 公钥形式
|
|
|
* 0 - 公钥不固定,随机产生
|
|
|
* 1 - 公钥固定为0x10001
|
|
|
* 2 - 公钥外部导入
|
|
|
* crt RSA密钥格式
|
|
|
* 0 - 密钥格式为普通格式
|
|
|
* 1 - 密钥格式为CRT格式
|
|
|
* Output : pub_key 输出公钥地址
|
|
|
* prv_key 输出私钥地址
|
|
|
* Return : 0 - 成功
|
|
|
* 1 - 失败
|
|
|
******************************************************************************/
|
|
|
extern unsigned char RsaGenerateKeyPair( unsigned int mode, STU_RSA_PUBKEY * pub_key, STU_RSA_PRIVKEY * prv_key,unsigned char fixkey, unsigned char crt);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPubKey
|
|
|
* Description : RSA 公钥运算
|
|
|
* Input : input 输入数据地址
|
|
|
* inputLen 输入数据长度
|
|
|
* publicKey RSA公钥地址
|
|
|
*
|
|
|
* Output : output 输出数据地址
|
|
|
* outputLen 输出数据长度
|
|
|
|
|
|
* Return : 0 - 成功
|
|
|
* 非0 - 失败(0x0401)
|
|
|
******************************************************************************/
|
|
|
extern int RsaPubKey(unsigned int *output, unsigned int *outputLen, unsigned int *input, unsigned int inputLen, STU_RSA_PUBKEY *publicKey);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPubKey
|
|
|
* Description : RSA 公钥运算
|
|
|
* Input : input 输入数据地址
|
|
|
* inputLen 输入数据长度
|
|
|
* privateKey RSA私钥地址
|
|
|
*
|
|
|
* Output : output 输出数据地址
|
|
|
* outputLen 输出数据长度
|
|
|
|
|
|
* Return : 0 - 成功
|
|
|
* 非0 - 失败(0x0401)
|
|
|
******************************************************************************/
|
|
|
extern int RsaPrivKey(unsigned int *output, unsigned int *outputLen, unsigned int *input, unsigned int inputLen, STU_RSA_PRIVKEY * privateKey, ...);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPubKey
|
|
|
* Description : RSA 公钥运算
|
|
|
* Input : input 输入数据地址
|
|
|
* inputLen 输入数据长度
|
|
|
* pprivateKey RSA私钥地址(密钥格式为CRT格式)
|
|
|
*
|
|
|
* Output : output 输出数据地址
|
|
|
* outputLen 输出数据长度
|
|
|
|
|
|
* Return : 0 - 成功
|
|
|
* 非0 - 失败(0x0401)
|
|
|
******************************************************************************/
|
|
|
extern int RsaPrivKeyCRT(unsigned int *output, unsigned int *outputLen, unsigned int *input, unsigned int inputLen, STU_RSA_PRIVKEY * pprivateKey);
|
|
|
|
|
|
/******************************************************************************
|
|
|
*** 以下为应用调用接口,用户可以调用 ****
|
|
|
*******************************************************************************/
|
|
|
|
|
|
//算法保护的防护等级防护等级
|
|
|
typedef enum {
|
|
|
dpa_middle, //中等防护等级
|
|
|
dpa_high, //最高防护等级
|
|
|
dpa_low, //最低防护等级
|
|
|
dpa_disable,//没有防护
|
|
|
}dpa_level_t;
|
|
|
|
|
|
|
|
|
#define SUCCESS_ALG 1
|
|
|
#define FAIL_ALG 0
|
|
|
#define ERROR_DATA_LENGTH -1
|
|
|
#define ERROR_KEY_LENGTH -2
|
|
|
#define ERROR_KEY_MODE -3
|
|
|
#define ERROR_ENDE_MODE -4
|
|
|
#define ERROR_ECBCBC_MODE -5
|
|
|
#define ERROR_DATA_BUF -6
|
|
|
#define ERROR_OTHER_PARA -7
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : Get_AlgLib_Version
|
|
|
* Description : 算法版本号
|
|
|
* Input : -NONE
|
|
|
* Output : -version:算法版本号
|
|
|
* Return : return 1: success, 0: fail
|
|
|
******************************************************************************/
|
|
|
extern int Get_AlgLib_Version(UINT8*version);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : des_dpa_ctrl
|
|
|
* Description : DES防护
|
|
|
* Input : -level:防护等级middle high low disable
|
|
|
* Output : None
|
|
|
* Return : return 1: success, 0: fail
|
|
|
******************************************************************************/
|
|
|
extern int des_dpa_ctrl(dpa_level_t level);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : des_dpa_ctrl
|
|
|
* Description : DES防护
|
|
|
* Input : -level:防护等级middle high low disable
|
|
|
* Output : None
|
|
|
* Return : return 1: success, 0: fail
|
|
|
******************************************************************************/
|
|
|
extern int aes_dpa_ctrl(dpa_level_t level);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : des_dpa_ctrl
|
|
|
* Description : DES防护
|
|
|
* Input : -level:防护等级middle high low disable
|
|
|
* Output : None
|
|
|
* Return : return 1: success, 0: fail
|
|
|
******************************************************************************/
|
|
|
extern int sm4_dpa_ctrl(dpa_level_t level);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : AES_EnDecrypt_2
|
|
|
* Description : AES加解密运算
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -EncDe_Mode :加解密模式
|
|
|
* -CBC_ECB_MODE :ECB 或 CBC模式
|
|
|
* -key :密钥
|
|
|
* -cbc_iv :CBC初始向量
|
|
|
* -key_mode :密钥模式
|
|
|
* -src_buf :源数据buf
|
|
|
* -data_len :源数据长度
|
|
|
* Output : -out_buf :输出数据buf
|
|
|
*
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int AES_EnDecrypt_2(UINT8 EncDe_Mode,
|
|
|
UINT8 CTR_ECB_MODE,UINT8 *key,
|
|
|
UINT8 *ctr_iv,
|
|
|
UINT32 key_mode,
|
|
|
UINT8 *src_buf,
|
|
|
UINT8 *out_buf,
|
|
|
UINT32 data_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : DES_EnDecrypt_2
|
|
|
* Description : DES加解密运算
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -EncDe_Mode :加解密模式
|
|
|
* -CBC_ECB_MODE :ECB 或 CBC模式
|
|
|
* -key :密钥
|
|
|
* -key_len :密钥长度
|
|
|
* -iv :初始向量
|
|
|
* -src_buf :源数据buf
|
|
|
* -data_len :源数据长度
|
|
|
* -check_parity :输入的key是否需要进行校验,如果校验错误则返回key校验错误不再继续加解密
|
|
|
* Output : -out_buf :输出数据buf
|
|
|
*
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int DES_EnDecrypt_2(UINT8 EncDe_Mode,
|
|
|
UINT8 ECB_CBC_Mode,
|
|
|
UINT8 *key,
|
|
|
UINT32 key_len,
|
|
|
UINT8 *iv,
|
|
|
UINT8 *src_buf,
|
|
|
UINT8 *out_buf,
|
|
|
UINT32 data_len,
|
|
|
UINT8 check_parity);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SMS4_EnDecrypt_2
|
|
|
* Description : SMS4加解密运算
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -EncDe_Mode :加解密模式
|
|
|
* -CBC_ECB_MODE :ECB 或 CBC模式
|
|
|
* -key :密钥
|
|
|
* -iv :初始向量
|
|
|
* -src_buf :源数据buf
|
|
|
* -data_len :输出数据长度
|
|
|
* Output : -out_buf :输出数据buf
|
|
|
*
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int SMS4_EnDecrypt_2(UINT8 EncDe_Mode,
|
|
|
UINT8 ECB_CBC_Mode,
|
|
|
UINT8 *key,
|
|
|
UINT8 *iv,
|
|
|
UINT8 *src_buf,
|
|
|
UINT8 *out_buf,
|
|
|
UINT32 data_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Init_2
|
|
|
* Description : HASH运算初始化
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -phash_tx :哈希算法数据结构模式
|
|
|
* -HashModeNum :哈希算法编号,取值范围0~4
|
|
|
* Output : None
|
|
|
* Return : 结果
|
|
|
******************************************************************************/
|
|
|
extern int SHA_Init_2(Hash_tx *phash_tx, unsigned char HashModeNum);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Update_2
|
|
|
* Description : 发送要进行HASH运算的数据
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -phash_tx :哈希算法数据结构模式
|
|
|
* -pMessageBlock :信息块
|
|
|
* -DataLen :信息块长度
|
|
|
* Output : None
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int SHA_Update_2(Hash_tx *phash_tx, unsigned char *pMessageBlock, unsigned int DataLen);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SHA_Final_2
|
|
|
* Description : 结束HASH操作并获取结果
|
|
|
* 注意:
|
|
|
* None
|
|
|
* Input : -phash_tx :哈希算法数据结构模式
|
|
|
* Output : -pRes :HASH运算结果
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int SHA_Final_2(Hash_tx *phash_tx, unsigned char *pRes);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Init
|
|
|
* Description : SM2模块初始化
|
|
|
* Input : testbits : SM2位数
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
extern int SM2Init(UINT16 testbits);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateKeyPair_2
|
|
|
* Description : SM2密钥生成
|
|
|
* Input : None
|
|
|
* Output : -pub_key :公钥
|
|
|
* -pri_key :私钥
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2GenerateKeyPair_2(UINT8 *pub_key,UINT8 *pri_key);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Encrypt_2
|
|
|
* Description : SM2加密
|
|
|
* Input : -mes :明文
|
|
|
* -len :明文长度
|
|
|
* -pub_key :公钥
|
|
|
* Output : -cipher :密文
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2Encrypt_2(UINT8 *mes,UINT16 len,UINT8 *pub_key,UINT8 *cipher);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Decrypt_2
|
|
|
* Description : SM2解密
|
|
|
* Input : -cipher :密文
|
|
|
* -len :明文长度
|
|
|
* -pri_key :私钥
|
|
|
* Output : -mes :明文
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2Decrypt_2(UINT8 *cipher,UINT16 len,UINT8 *pri_key,UINT8 *mes);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Signature_2
|
|
|
* Description : SM2签名
|
|
|
* Input : -mes :明文
|
|
|
* -len :明文长度
|
|
|
* -pri_key :私钥
|
|
|
* Output : -r :签名值R块
|
|
|
* -s :签名值S块
|
|
|
* Return : 运算结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2Signature_2(UINT8 *mes,UINT16 len,UINT8 *pri_key,UINT8 *r,UINT8 *s);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2Verification_2
|
|
|
* Description : SM2验签
|
|
|
* Input : -mes :明文
|
|
|
* -len :明文长度
|
|
|
* -pri_key :私钥
|
|
|
* -r :签名值R块
|
|
|
* -s :签名值S块
|
|
|
* Output : None
|
|
|
* Return : 验签结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2Verification_2(UINT8 *mes,UINT16 len,UINT8 *pub_key,UINT8 *r,UINT8 *s);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2GenerateE_2
|
|
|
* Description : SM2计算E值
|
|
|
* Input : -IDA :用户ID
|
|
|
* -ida_len :用户ID长度
|
|
|
* -pub_key :公钥
|
|
|
* -pMessage :信息
|
|
|
* -mesLen :信息长度
|
|
|
* Output : -res_E :E值
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2GenerateE_2(UINT8 *IDA,UINT16 ida_len,UINT8 *pub_key,UINT8 *pMessage,UINT32 mesLen,UINT8 *res_E);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SM2KeyExchange_2
|
|
|
* Description : SM2密钥交换
|
|
|
* Input : -self_pri :己方私钥
|
|
|
* -self_temp_pub :己方临时公钥
|
|
|
* -self_temp_pri :己方临时私钥
|
|
|
* -other_pub :对方公钥
|
|
|
* -other_temp_pub :对方临时公钥
|
|
|
* -za :己方Z值
|
|
|
* -zb :对方Z值
|
|
|
* -AgreedKeyLen :协商密钥的长度
|
|
|
* -Mode :密钥交换发起方。0表示已方为A方,1表示已方为B方
|
|
|
* Output : -agree_key :协商密钥
|
|
|
* -sA :己方S值
|
|
|
* -sB :对方S值
|
|
|
* Return : 交换结果
|
|
|
******************************************************************************/
|
|
|
extern int SM2KeyExchange_2(UINT8*self_pri,
|
|
|
UINT8*self_temp_pub,
|
|
|
UINT8 *self_temp_pri,
|
|
|
UINT8*other_pub,
|
|
|
UINT8*other_temp_pub,
|
|
|
UINT8*za,
|
|
|
UINT8*zb,
|
|
|
UINT8*agree_key,
|
|
|
UINT32 AgreedKeyLen,
|
|
|
UINT8*sA,
|
|
|
UINT8*sB,
|
|
|
UINT32 Mode);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : sign_2
|
|
|
* Description : SM2生成Z值
|
|
|
* Input : -IDA :用户ID
|
|
|
* -entla :用户ID长度
|
|
|
* -pub_key :公钥
|
|
|
* Output : -za :Z值
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int sign_2(UINT8 *IDA, UINT16 entla, UINT8 *pub_key,UINT8*za);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : rsa_keypair_gen
|
|
|
* Description : RSA密钥生成
|
|
|
* Input : -rsa_bit_len :RSA算法位数
|
|
|
* -fixkey :E值是否固定
|
|
|
* Output : -n_addr :N
|
|
|
* -e_addr :E
|
|
|
* -d_addr :D
|
|
|
* -p_addr :P
|
|
|
* -q_addr :Q
|
|
|
* -dp_addr :dP
|
|
|
* -dq_addr :dQ
|
|
|
* -qinv_addr :PQ
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int rsa_keypair_gen(UINT32 rsa_bit_len,
|
|
|
UINT8 fixkey,
|
|
|
UINT8* n_addr,
|
|
|
UINT8* e_addr,
|
|
|
UINT8 *d_addr,
|
|
|
UINT8* p_addr,
|
|
|
UINT8* q_addr,
|
|
|
UINT8* dp_addr,
|
|
|
UINT8* dq_addr,
|
|
|
UINT8* qinv_addr);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPubKey_2
|
|
|
* Description : RSA公钥运算
|
|
|
* Input : -fixkey :E值是否固定
|
|
|
* -n_addr :N
|
|
|
* -e_addr :E
|
|
|
* -in :输入数据
|
|
|
* -in_len :输入数据长度
|
|
|
* Output : -out :输出数据
|
|
|
* -out_len :输出数据长度
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int RsaPubKey_2(UINT8 fixkey,
|
|
|
UINT8 *n_addr,
|
|
|
UINT8* e_addr,
|
|
|
UINT8 *in,UINT32 in_len,
|
|
|
UINT8 *out,
|
|
|
UINT32 *out_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPrivKey_2
|
|
|
* Description : RSA私钥运算
|
|
|
* Input :-n_addr :N
|
|
|
* -d_addr :D
|
|
|
* -in :输入数据
|
|
|
* -in_len :输入数据长度
|
|
|
* Output : -out :输出数据
|
|
|
* -out_len :输出数据长度
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int RsaPrivKey_2(UINT8*n_addr,UINT8 *d_addr,UINT8 *in,UINT32 in_len,UINT8 *out,UINT32 *out_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPrivKey_3
|
|
|
* Description : RSA私钥运算(DPA = High)
|
|
|
* Input :-n_addr :N
|
|
|
* -d_addr :D
|
|
|
* -in :输入数据
|
|
|
* -in_len :输入数据长度
|
|
|
* Output : -out :输出数据
|
|
|
* -out_len :输出数据长度
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int RsaPrivKey_3(UINT8 *n_addr,
|
|
|
UINT8 *d_addr,
|
|
|
UINT8 *e_addr,
|
|
|
UINT8 *in,
|
|
|
UINT32 in_len,
|
|
|
UINT8 *out,
|
|
|
UINT32 *out_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RsaPrivKeyCRT_2
|
|
|
* Description : RSA CRT模式运算
|
|
|
* Input : -p_addr :P
|
|
|
* -q_addr :Q
|
|
|
* -dp_addr :dP
|
|
|
* -dq_addr :dQ
|
|
|
* -qinv_addr :PQ
|
|
|
* -in :输入数据
|
|
|
* -in_len :输入数据长度
|
|
|
* Output : -out :输出数据
|
|
|
* -out_len :输出数据长度
|
|
|
* Return : 执行结果
|
|
|
******************************************************************************/
|
|
|
extern int RsaPrivKeyCRT_2(UINT8*p_addr,
|
|
|
UINT8*q_addr,
|
|
|
UINT8*dp_addr,
|
|
|
UINT8*dq_addr,
|
|
|
UINT8*qinv_addr,
|
|
|
UINT8 *in,
|
|
|
UINT32 in_len,
|
|
|
UINT8 *out,
|
|
|
UINT32 *out_len);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : GetRandomWord
|
|
|
* Description : 随机数生成函数
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : 1个UINT32型随机数
|
|
|
******************************************************************************/
|
|
|
UINT32 GetRandomWord(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : Get_Random_Word
|
|
|
* Description : 随机数生成函数
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : 1个UINT32型随机数
|
|
|
******************************************************************************/
|
|
|
UINT32 Get_Random_Word(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : Init_Trng
|
|
|
* Description : 随机数功能初始化函数。
|
|
|
* 开启随机数模块时钟,并设置随机数模块时钟频率为系统时钟频率的1/8
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
void Init_Trng(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : Trng_Disable
|
|
|
* Description : 关闭随机数模块时钟
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
******************************************************************************/
|
|
|
void Trng_Disable(void);
|
|
|
#endif /* ALG_DRV_H_ */
|