首页 > 其他分享 >skf接口规范

skf接口规范

时间:2024-08-25 16:53:16浏览次数:5  
标签:加密 SKF ULONG 规范 接口 skf ECC BYTE define

 

 

#ifndef __SKF_TYPE_DEF_H__
#define __SKF_TYPE_DEF_H__
#include "base_type.h"


#ifndef _WINDOWS
#define PACKED_ST(st) __attribute__((packed, aligned(1))) st
#else
#pragma pack(push, skf, 1)
#define PACKED_ST(st) st
#endif

/*
    6.4.1 版本
    主版本号和次版本号以"."分隔,
    例如  Version 1.0,主版本号为 1,此版本号为 0;
    Version 2.10,主版本号为 2,此版本号为 10;
*/
typedef struct version_st 
{
    BYTE major; //主版本号
    BYTE minor; //次版本号
}PACKED_ST(VERSION);

/*
    6.4.2 设备信息
*/
typedef struct devinfo_st 
{ 
    VERSION Version;          //版本号。数据结构版本号,本结构的版本号为1.0
    CHAR Manufacturer[64];    //设备厂商信息。以 "\0" 为结束符的 ASCII 字符串
    CHAR Issuer[64];          //发行厂商信息。以 "\0" 为结束符的 ASCII 字符串
    CHAR Label[32];           //设备标签信息。以 "\0" 为结束符的 ASCII 字符串
    CHAR SerialNumber[32];    //设备序列号。以 "\0" 为结束符的 ASCII 字符串
    VERSION HWVersion;        //设备硬件版本
    VERSION FirmwareVersion;  //设备固件版本
    ULONG AlgSymCap;          //分组密码算法标识
    ULONG AlgAsymCap;         //非对称密码算法标识
    ULONG AlgHashCap;         //密码杂凑算法标识
    ULONG DevAuthAlgId;       //设备认证使用的分组密码算法标识
    ULONG TotalSpace;         //设备总空间大小
    ULONG FreeSpace;          //用户可用空间大小
    ULONG MaxECCBufferSize;   //能够处理的 ECC 加密数据大小
    ULONG MaxBufferSize;      //能够处理的分组运算和杂凑运算的数据大小
    BYTE Reserved[56];        //保留扩展  //todo 国芯协议,不支持2012版本接口规范,他们支持的规范版本是2010
}PACKED_ST(DEVINFO); 
typedef DEVINFO * PDEVINFO;



#define MAX_RSA_MODULUS_LEN        256  // 算法模数的最大长度
#define    MAX_RSA_EXPONENT_LEN    4    // 算法指数的最大长度
/*
    6.4.3 RAS公钥数据结构
*/
typedef struct rsapubkeyblob_st 
{
    ULONG AlgID;    //算法标识号
    ULONG BitLen;   //模数的实际位长度,必须是 8 的倍数
    BYTE Modulus[MAX_RSA_MODULUS_LEN];  //模数  n = p * q,实际长度为 Bitlen/8 字节.
    BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公钥秘钥,一般为 00010001
}PACKED_ST(RSAPUBLICKEYBLOB);
typedef RSAPUBLICKEYBLOB * PRSAPUBLICKEYBLOB;


/*
    6.4.4 RSA 私钥数据结构
*/
typedef struct rsaprivkeyblob_st 
{
    ULONG AlgID;    //算法标识号
    ULONG BitLen;   //模数的实际位长度,必须是 8 的倍数
    BYTE Modulus[MAX_RSA_MODULUS_LEN];  // 模数 n = p * q,实际长度为 Bitlen/8 字节
    BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公钥秘钥e,一般为 00010001
    BYTE PrivateExponent[MAX_RSA_MODULUS_LEN]; // 私钥秘钥d,实际长度为 Bitlen/8 字节
    BYTE Prime1[MAX_RSA_MODULUS_LEN/2];  // 素数p,实际长度为 Bitlen/16 字节
    BYTE Prime2[MAX_RSA_MODULUS_LEN/2];  // 素数q,实际长度为 Bitlen/16 字节
    BYTE Prime1Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模数模p的逆元,实际长度为 Bitlen/16 字节
    BYTE Prime2Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模数模q的逆元,实际长度为 Bitlen/16 字节
    BYTE Coefficient[MAX_RSA_MODULUS_LEN/2]; // q模p 的乘法逆元,实际长度为 Bitlen/16 字节
}PACKED_ST(RSAPRIVATEKEYBLOB);
typedef RSAPRIVATEKEYBLOB * PRSAPRIVATEKEYBLOB;

#define ECC_MAX_XCOORDINATE_BITS_LEN        512   // ECC算法 X 坐标的最大长度
#define ECC_MAX_YCOORDINATE_BITS_LEN        ECC_MAX_XCOORDINATE_BITS_LEN   // ECC算法 Y 坐标的最大长度
#define ECC_MAX_MODULUS_BITS_LEN            ECC_MAX_XCOORDINATE_BITS_LEN   // ECC算法 模数的最大长度
/*
    6.4.5 ECC 公钥数据结构
*/
typedef struct eccpubkeyblob_st 
{
    ULONG BitLen;  //模数的实际位长度,必须是 8 的倍数
    BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];  //曲线上点的 X 坐标(64位)
    BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN / 8];  //曲线上点的 y 坐标(64位)
}PACKED_ST(ECCPUBLICKEYBLOB);
typedef ECCPUBLICKEYBLOB * PECCPUBLICKEYBLOB;

/*
    6.4.6 ECC 私钥数据结构
*/
typedef struct eccprivkeyblob_st 
{
    ULONG BitLen;   //模数的实际位长度,必须是 8 的倍数
    BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN / 8]; //私有秘钥(64位)
}PACKED_ST(ECCPRIVATEKEYBLOB);
typedef ECCPRIVATEKEYBLOB  * PECCPRIVATEKEYBLOB; 

/*
    6.4.7 ECC 密文数据结构
*/
typedef struct ecccipherblob_st
{ 
    BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];  //与y组成椭圆 曲线上的点(x,y)
    BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN / 8];  //与x组成椭圆 曲线上的点(x,y)
    BYTE HASH[32]; //明文的杂凑值
    ULONG CipherLen;  //密文数据长度
    BYTE Cipher[1]; //密文数据, 实际长度为 CipherLen 字节...这种变长,最不好处理了.
} PACKED_ST(ECCCIPHERBLOB);
typedef ECCCIPHERBLOB  * PECCCIPHERBLOB; 

/*
    6.4.8 ECC签名数据结构
*/
typedef struct eccsignatureblob_st
{ 
    BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN / 8];  //签名结果的 r 部分 (64 Byte)
    BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN / 8];  //签名结果的 s 部分 (64 Byte)
}PACKED_ST(ECCSIGNATUREBLOB); 
typedef ECCSIGNATUREBLOB  * PECCSIGNATUREBLOB;

#define    MAX_IV_LEN            32   // 初始向量的最大长度

/*
    6.4.9 分组密码参数
*/
typedef struct blockcipherparam_st 
{ 
    BYTE IV[MAX_IV_LEN];  //初始向量
    ULONG IVLen; //初始向量实际长度(按字节计算)
    ULONG PaddingType; //填充方式,0表示不填充,1表示按照 PSCK#5 方式进行填充
    ULONG FeedBitLen; //反馈值的位长度(按位计算),只针对 OFB, CFB 模式
} PACKED_ST(BLOCKCIPHERPARAM); 
typedef BLOCKCIPHERPARAM  *  PBLOCKCIPHERPARAM;

/*
    6.4.10 ECC加密秘钥对 保护结构
*/
typedef struct SKF_ENVELOPEDKEYBLOB{
    ULONG Version;  //当前版本为1
    ULONG ulSymmAlgID; //对称算法标识,限定 ECB模式
    ULONG ulBits;   //加密秘钥对的秘钥位长度
    BYTE cbEncryptedPriKey[64];  //加密秘钥对私钥的密文
    ECCPUBLICKEYBLOB PubKey;   //加密秘钥对的公钥
    ECCCIPHERBLOB ECCCipherBlob; //用保护公钥加密的对称秘钥密文
}PACKED_ST(ENVELOPEDKEYBLOB);
typedef ENVELOPEDKEYBLOB  *  PENVELOPEDKEYBLOB;


/*
    6.4.11 文件属性
*/
typedef struct fileattr_st 
{
    CHAR FileName[32];  // 文件名。以 "\0" 结束的 ASCII 字符串,最大长度是32
    ULONG FileSize;   //文件大小。创建文件时定义的文件大小
    ULONG ReadRights;  //读取权限。读取文件需要的权限
    ULONG WriteRights; //写入权限。写入文件需要的权限
}PACKED_ST(FILEATTRIBUTE); 
typedef FILEATTRIBUTE  *  PFILEATTRIBUTE;


#define V_FPF_FEARURE  0x00
#define V_FPF_IMAGE    0x01
#define V_FPF_RECOVER  0x100
#define V_FPF_BEGIN    0x200
typedef struct __fp_id_name
{
    ULONG uId;
    char szName[32];
    ULONG uAttr;
}PACKED_ST(FP_ID_NAME);

typedef struct __fp_info
{
    ULONG uType;
    ULONG uRegCount;
    ULONG uMaxFP;
    FP_ID_NAME *pIdName;
    ULONG uCount;
}PACKED_ST(FP_INFO);

//Flags for CIPHER_PARAM
#define CIPHER_NO_PADDING     0x0000
#define CIPHER_PKCS5_PADDING  0x0001
#define CIPHER_ENCRYPT        0x0000
#define CIPHER_DECRYPT        0x0010
#define CIPHER_FEED_BITS_MASK 0xFF00
typedef struct __cipher_param
{
    ULONG uAlgo;
    ULONG uFlags;
    int cbIV;
    BYTE  pbIV[32];
    int cbKey;
    BYTE  pbKey[128];
}PACKED_ST(CIPHER_PARAM);

typedef struct blockcipherdata_st {
    ULONG num;
    BYTE **buf;
    ULONG *bufLen;
}PACKED_ST(BLOCKCIPHERDATA);
typedef BLOCKCIPHERDATA *PBLOCKCIPHERDATA;

typedef struct init_param_st
{
    char* token;/* the length MUST BE less than 32 bytes */
    BYTE* k_external;/* the length MUST BE 16 bytes, CAN be NULL */

    char *app_name; /* app name */
    char* k_sopin;/* the length MUST BE less than 16 bytes */
    char* k_userpin;/* the length MUST BE less than 16 bytes */
    int so_retry;/* value 1-15 */
    int user_retry;/* value 1-15 */
}PACKED_ST(INIT_PARAM);

#define        V_SGD_SIGN    (0x100)
#define        V_SGD_KEYX    (0x400)

// 以下宏用于V_GenerateKey函数ulAlgId参数
#define GENERATE_KEY_USAGE_SIGN        0x00001000
#define GENERATE_KEY_USAGE_ENCRYPT    0x00002000
#define GENERATE_KEY_USAGE_MASK        0x00003000
#define GENERATE_KEY_SRAM           0x00010000
#define GENERATE_KEY_EFLASH          0x00020000
#define GENERATE_KEY_SAVE_MASK      0x00030000
#define GENERATE_KEY_ALGO_RSA        0x00000100
#define GENERATE_KEY_ALGO_SM2        0x00000200
#define GENERATE_KEY_ALGO_SM9        0x00000300
#define GENERATE_KEY_ASYM_ALGO_MASK 0x00000300
#define GENERATE_KEY_SYM_MODE_ECB   0x00000001
#define GENERATE_KEY_SYM_MODE_CBC   0x00000002
#define GENERATE_KEY_SYM_MODE_CFB   0x00000003
#define GENERATE_KEY_SYM_MODE_OFB   0x00000004
#define GENERATE_KEY_SYM_MODE_MAC   0x00000005
#define GENERATE_KEY_SYM_MODE_MASK  0x00000007
#define GENERATE_KEY_ALGO_DES        0x00000010
#define GENERATE_KEY_ALGO_AES        0x00000020
#define GENERATE_KEY_ALGO_SM1        0x00000030
#define GENERATE_KEY_ALGO_SM4        0x00000040
#define GENERATE_KEY_ALGO_SM6        0x00000050
#define GENERATE_KEY_ALGO_SSF33        0x00000060
#define GENERATE_KEY_SYM_ALGO_MASK  0x00000070
#define GENERATE_KEY_BIT_64            0x00400000      
#define GENERATE_KEY_BIT_128        0x00800000  
#define GENERATE_KEY_BIT_256        0x01000000      
#define GENERATE_KEY_BIT_512        0x02000000       
#define GENERATE_KEY_BIT_1024        0x04000000      
#define GENERATE_KEY_BIT_2048        0x08000000       
#define GENERATE_KEY_BIT_MASK        0x0FF00000

#if defined(_WINDOWS)
#pragma pack(pop, skf) 
#endif

#define MAX_CONTAINER_NAME_LEN            64
#define MAX_APPLICATION_NAME_LEN        16

/* algorithm */
#define SGD_SM1_ECB            0x00000101       //SM1 算法 ECB 加密模式 
#define SGD_SM1_CBC            0x00000102       //SM1 算法 CBC 加密模式 
#define SGD_SM1_CFB            0x00000104       //SM1 算法 CFB 加密模式 
#define SGD_SM1_OFB            0x00000108       //SM1 算法 OFB 加密模式 
#define SGD_SM1_MAC            0x00000110       //SM1 算法 MAC 运算 
#define SGD_SSF33_ECB       0x00000201       //SSF33 算法 ECB 加密模式 
#define SGD_SSF33_CBC       0x00000202       //SSF33 算法 CBC 加密模式 
#define SGD_SSF33_CFB       0x00000204       //SSF33 算法 CFB 加密模式 
#define SGD_SSF33_OFB       0x00000208       //SSF33 算法 OFB 加密模式 
#define SGD_SSF33_MAC       0x00000210       //SSF33 算法 MAC 运算 
#define SGD_SMS4_ECB        0x00000401       //SMS4 算法 ECB 加密模式 
#define SGD_SMS4_CBC        0x00000402       //SMS4 算法 CBC 加密模式 
#define SGD_SMS4_CFB        0x00000404       //SMS4 算法 CFB 加密模式 
#define SGD_SMS4_OFB        0x00000408       //SMS4 算法 OFB 加密模式 
#define SGD_SMS4_MAC        0x00000410       //SMS4 算法 MAC 运算 

#define SGD_RSA                0x00010000       //RSA 算法 
#define SGD_SM2                0x00020000       //SM2 算法 
#define SGD_SM2_1            0x00020100       //椭圆曲线签名算法 
#define SGD_SM2_2            0x00020200       //椭圆曲线密钥交换协议 
#define SGD_SM2_3            0x00020400       //椭圆曲线加密算法 

#define SGD_SM3                0x00000001       //SM3 杂凑算法 
#define SGD_SHA1            0x00000002       //SHA1 杂凑算法 
#define SGD_SHA256            0x00000004       //SHA256 杂凑算法 


////////////////////////////VENDOR DEFINED/////////////////////////////////////
#define SGD_DES_ECB            0x80000101       //DES 算法 ECB 加密模式 
#define SGD_DES_CBC            0x80000102       //DES 算法 CBC 加密模式 
#define SGD_DES_CFB            0x80000104       //DES 算法 CFB 加密模式 
#define SGD_DES_OFB            0x80000108       //DES 算法 OFB 加密模式 
#define SGD_DES_MAC            0x80000110       //DES 算法 MAC 运算 

#define SGD_AES_ECB            0x80000201       //AES-128 算法 ECB 加密模式 
#define SGD_AES_CBC            0x80000202       //AES-128 算法 CBC 加密模式 
#define SGD_AES_CFB            0x80000204       //AES-128 算法 CFB 加密模式 
#define SGD_AES_OFB            0x80000208       //AES-128 算法 OFB 加密模式 
#define SGD_AES_MAC            0x80000210       //AES-128 算法 MAC 运算 

#define SGD_SM6_ECB            0x80000301       //SM6 算法 ECB 加密模式 
#define SGD_SM6_CBC            0x80000302       //SM6 算法 CBC 加密模式 
#define SGD_SM6_CFB            0x80000304       //SM6 算法 CFB 加密模式 
#define SGD_SM6_OFB            0x80000308       //SM6 算法 OFB 加密模式 
#define SGD_SM6_MAC            0x80000310       //SM6 算法 MAC 运算 
////////////////////////////VENDOR DEFINED/////////////////////////////////////

#ifndef TRUE
#define TRUE                1                //布尔值为真 
#endif
#ifndef FALSE
#define FALSE                0                //布尔值为假 
#endif

#ifndef NULL
#define NULL                0
#endif

#define ADMIN_TYPE            0                //管理员 PIN 类型 
#define USER_TYPE            1                //用户 PIN 类型 


/* account */
// 6.4.12 权限类型
#define SECURE_NEVER_ACCOUNT    0x00        //不允许 
#define SECURE_ADM_ACCOUNT        0x01        //管理员权限 
#define SECURE_USER_ACCOUNT        0x10        //用户权限 
#define SECURE_ANYONE_ACCOUNT    0xFF        //任何人 

#ifndef MIN_PIN_LEN
#define MIN_PIN_LEN                0x06
#endif
#ifndef MAX_PIN_LEN
#ifdef MAX_PIN_LEN
#undef MAX_PIN_LEN
#endif
#define MAX_PIN_LEN                0x10
#endif


// 6.4.13 设备状态
#define DEV_ABSENT_STATE        0x00000000      //设备不存在       
#define DEV_PRESENT_STATE        0x00000001    //设备存在        
#define DEV_UNKNOW_STATE        0x00000002    //设备状态未知    

#ifndef PKCS5_PADDING
#define PKCS5_PADDING            1
#endif

#ifndef NO_PADDING
#define NO_PADDING                0
#endif

#define CTNF_NOSET                0
#define CTNF_RSA                1
#define CTNF_ECC                2

#define HLF_DEV                    0x1
#define HLF_APP                    0x2
#define HLF_CTN                    0x4
#define HLF_KEY                    0x8
#define HLF_HASH                0x10
#define HLF_ECCWRAP_KEY            0x20

/* return value */
#define SAR_OK                            0x00000000  //成功
#define SAR_FAIL                        0x0A000001  //失败
#define SAR_UNKOWNERR                    0x0A000002  //异常错误
#define SAR_NOTSUPPORTYETERR            0x0A000003  //不支持的服务
#define SAR_FILEERR                        0x0A000004  //文件错误
#define SAR_INVALIDHANDLEERR            0x0A000005  //无效句柄
#define SAR_INVALIDPARAMERR                0x0A000006  //无效参数
#define SAR_READFILEERR                    0x0A000007  //读取文件错误
#define SAR_WRITEFILEERR                0x0A000008  //写入文件错误
#define SAR_NAMELENERR                    0x0A000009  //名称长度错误
#define SAR_KEYUSAGEERR                    0x0A00000A  //秘钥用途错误
#define SAR_MODULUSLENERR                0x0A00000B  //模的长度错误
#define SAR_NOTINITIALIZEERR            0x0A00000C  //未初始化
#define SAR_OBJERR                        0x0A00000D  //对象错误
#define SAR_MEMORYERR                    0x0A00000E  //内存错误
#define SAR_TIMEOUTERR                    0x0A00000F  //超时
#define SAR_INDATALENERR                0x0A000010  //输入数据长度错误
#define SAR_INDATAERR                    0x0A000011  //输入数据错误
#define SAR_GENRANDERR                    0x0A000012  //生成随机数错误
#define SAR_HASHOBJERR                    0x0A000013  //HASH 对象错误
#define SAR_HASHERR                        0x0A000014  //HASH 运算错误
#define SAR_GENRSAKEYERR                0x0A000015  //产生 RSA 秘钥错误
#define SAR_RSAMODULUSLENERR            0x0A000016  //RSA 秘钥模的长度错误
#define SAR_CSPIMPRTPUBKEYERR            0x0A000017  //CSP服务导入公钥错误
#define SAR_RSAENCERR                    0x0A000018  //RSA 加密错误
#define SAR_RSADECERR                    0x0A000019  //RSA 解密错误
#define SAR_HASHNOTEQUALERR                0x0A00001A  //HASH 不相等错误
#define SAR_KEYNOTFOUNTERR                0x0A00001B  //秘钥未找到错误
#define SAR_CERTNOTFOUNTERR                0x0A00001C  //证书未找到错误
#define SAR_NOTEXPORTERR                0x0A00001D   //对象未导出
#define SAR_DECRYPTPADERR                0x0A00001E  //解密时做补丁错误
#define SAR_MACLENERR                    0x0A00001F  //MAC 长度错误
#define SAR_BUFFER_TOO_SMALL            0x0A000020  //缓冲区不足
#define SAR_KEYINFOTYPEERR                0x0A000021  //秘钥类型错误
#define SAR_NOT_EVENTERR                0x0A000022  //无事件错误
#define SAR_DEVICE_REMOVED                0x0A000023  //设备已移除
#define SAR_PIN_INCORRECT                0x0A000024  //PIN 不正确
#define SAR_PIN_LOCKED                    0x0A000025  //PIN 被锁死
#define SAR_PIN_INVALID                    0x0A000026  //PIN 无效
#define SAR_PIN_LEN_RANGE                0x0A000027  //PIN 长度错误
#define SAR_USER_ALREADY_LOGGED_IN        0x0A000028  //用户已经登录
#define SAR_USER_PIN_NOT_INITIALIZED    0x0A000029  //没有初始化用户口令
#define SAR_USER_TYPE_INVALID            0x0A00002A  //PIN 类型错误
#define SAR_APPLICATION_NAME_INVALID    0x0A00002B  //应用名称错误
#define SAR_APPLICATION_EXISTS            0x0A00002C  //应用已经存在
#define SAR_USER_NOT_LOGGED_IN            0x0A00002D  //用户没有登录
#define SAR_APPLICATION_NOT_EXISTS        0x0A00002E  //应用不存在
#define SAR_FILE_ALREADY_EXIST            0x0A00002F  //文件已经存在
#define SAR_NO_ROOM                        0x0A000030  //空间不足
#define SAR_FILE_NOT_EXIST                0x0A000031  //文件不存在
#define SAR_REACH_MAX_CONTAINER_COUNT    0x0A000032  //已达到最大可管理容器数

#define VR_FP_ID_INVALIED               0x0B000001  
#define VR_FP_IMAGE_ERROR               0x0B000002  
#define VR_FP_MATCH_ERROR               0x0B000003  
#define VR_FP_NOT_LEAVE                 0x0B000004  
#define VR_FP_NOT_TOUCH                 0x0B000005  
#define VR_OP_NOT_FOUND                    0x0B000006  




// 容器类型
static const ULONG CONTIANER_TYPE_NULL = 0;   // 0:未定义、尚未分配类型或者为空容器
static const ULONG CONTIANER_TYPE_RSA  = 1;   // 1:RSA容器
static const ULONG CONTIANER_TYPE_ECC  = 2;   // 2:ECC容器





    

#endif /*__SKF_TYPE_DEF_H__*/

 

### 7.6 密码服务 系列函数
|函数指针 | 注释|
|----------|----------|
SKF_FUN_INFO(SKF_GenRandom, (DEVHANDLE hDev,BYTE* pbRandom,ULONG ulRandom));  | 生成随机数
SKF_FUN_INFO(SKF_GenECCKeyPair, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pBlob));  |  生成ECC签名密钥对
SKF_FUN_INFO(SKF_ImportECCKeyPair, (HCONTAINER hContainer, PENVELOPEDKEYBLOB blob)); |  导入ECC加密密钥对
SKF_FUN_INFO(SKF_ECCSignData, (HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)); |  ECC 签名
SKF_FUN_INFO(SKF_ECCVerify, (DEVHANDLE hDev , PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)); |  ECC 验签
SKF_FUN_INFO(SKF_ECCExportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pPubKey, PECCCIPHERBLOB pData, HANDLE *phSessionKey)); |  ECC 生成并导出会话密钥
SKF_FUN_INFO(SKF_ExtECCEncrypt, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbPlainText, ULONG ulPlainTextLen, PECCCIPHERBLOB pCipherText)); |  ECC 外来公钥加密
SKF_FUN_INFO(SKF_ExtECCDecrypt, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, PECCCIPHERBLOB pCipherText, BYTE* pbPlainText, ULONG* pulPlainTextLen)); |  ECC 外来私钥解密
SKF_FUN_INFO(SKF_ExtECCSign, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)); |  ECC 外来私钥签名
SKF_FUN_INFO(SKF_ExtECCVerify, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)); |  ECC 外来公钥验签
SKF_FUN_INFO(SKF_GenerateAgreementDataWithECC, (HCONTAINER hContainer, ULONG ulAlgId,        PECCPUBLICKEYBLOB pTempECCPubKeyBlob,BYTE* pbID, ULONG ulIDLen,        HANDLE *phAgreementHandle)); |  ECC 生成密钥协商参数并输出
SKF_FUN_INFO(SKF_GenerateAgreementDataAndKeyWithECC, (HANDLE hContainer, ULONG ulAlgId,    PECCPUBLICKEYBLOB pSponsorECCPubKeyBlob, PECCPUBLICKEYBLOB pSponsorTempECCPubKeyBlob,    PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, BYTE *pbSponsorID,    ULONG ulSponsorIDLen, HANDLE *phKeyHandle)); |  ECC产生协商数据并计算会话密钥
SKF_FUN_INFO(SKF_GenerateKeyWithECC, (HANDLE hAgreementHandle, PECCPUBLICKEYBLOB pECCPubKeyBlob,    PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, HANDLE *phKeyHandle)); |  ECC计算会话密钥
SKF_FUN_INFO(SKF_ExportPublicKey, (HCONTAINER hContainer, BOOL bSignFlag, BYTE* pbBlob, ULONG* pulBlobLen));  |  导出公钥
SKF_FUN_INFO(SKF_ImportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId,BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey));  |  导入会话密钥
SKF_FUN_INFO(SKF_SetSymmKey, (DEVHANDLE hDev, BYTE* pbKey, ULONG ulAlgID, HANDLE* phKey));  |  明文导入会话密钥   | todo 2012版本已经没有这个方法
SKF_FUN_INFO(SKF_EncryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param));  |  加密初始化
SKF_FUN_INFO(SKF_Encrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)); | 单组数据加码
SKF_FUN_INFO(SKF_EncryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)); | 多组数据加密
SKF_FUN_INFO(SKF_EncryptFinal, (HANDLE hKey, BYTE*pbEncrypt,ULONG* pulEncryptLen)); | 结束加密
SKF_FUN_INFO(SKF_DecryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param));  |  解密初始化
SKF_FUN_INFO(SKF_Decrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen)); | 单组数据解密
SKF_FUN_INFO(SKF_DecryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen)); | 多组数据解密
SKF_FUN_INFO(SKF_DecryptFinal, (HANDLE hKey, BYTE*pbDecrypt, ULONG* pulDecryptLen));  |  结束解密
SKF_FUN_INFO(SKF_DigestInit, (DEVHANDLE hDev, ULONG ulAlgID,  PECCPUBLICKEYBLOB pPubKey, BYTE *pucID, ULONG ulIDLen, HANDLE *phHash)); | 密码杂凑初始化
SKF_FUN_INFO(SKF_Digest, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen, BYTE* pbDigest, ULONG* pulDigestLen)); | 单组数据密码杂凑
SKF_FUN_INFO(SKF_DigestUpdate, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen)); | 多组数据密码杂凑
SKF_FUN_INFO(SKF_DigestFinal, (HANDLE hHash, BYTE* pbDigest, ULONG* pulDigestLen)); | 结束密码杂凑
SKF_FUN_INFO(SKF_MacInit, (HANDLE hKey, BLOCKCIPHERPARAM* pMacParam, HANDLE* phMac)); | 消息鉴别码运算初始化
SKF_FUN_INFO(SKF_Mac, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen, BYTE* pbMac, ULONG* pulMacLen)); |  单组数据消息鉴别码运算
SKF_FUN_INFO(SKF_MacUpdate, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen)); | 多组数据消息鉴别码运算
SKF_FUN_INFO(SKF_MacFinal, (HANDLE hMac, BYTE* pbMac, ULONG* pulMacLen));  | 结束消息鉴别码运算
SKF_FUN_INFO(SKF_CloseHandle, (HANDLE hHandle));  |  关闭密码对象句柄

 

## 函数介绍

### 7.6.11 生成ECC签名密钥对
(SKF_GenECCKeyPair, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pBlob))

功能描述:生成 ECC 签名 密钥对并输出 签名公钥。

hContainer: [IN] 容器句柄
ulAlgId: [IN] 算法标识,只支持 SGD_SM2_1 算法
pBlob: [OUT] 返回ECC公钥数据结构体



### 7.6.12 导入ECC加密密钥对
(SKF_ImportECCKeyPair, (HCONTAINER hContainer, PENVELOPEDKEYBLOB blob))

功能描述:导入 ECC 公私钥对。

hContainer: [IN] 密钥容器句柄
blob: [IN] 受保护的加密密钥对


### 7.6.13 ECC签名
(SKF_ECCSignData, (HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))

功能描述:ECC 数字签名。采用 ECC算法 和指定私钥 hKey ,对指定数据 pbData进行数字签名。签名后的结果存放到 pSignature中。

hContainer: [IN] 密钥容器句柄
pbData: [IN] 待签名的数据
ulDataLen: [IN] 待签名的数据长度,必须小于密钥模长度
pSignature: [OUT] 签名值
备注:输入数据位待处理的杂凑值。 先对需要处理的数据,用SM3杂凑算法计算(得到摘要),然后再用ECC签名算法签名(使用私钥对摘要内容加密)。


### 7.6.14 ECC验签
(SKF_ECCVerify, (DEVHANDLE hDev , PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))

功能描述:使用 ECC 公钥对数据进行验签。

hDev: [IN] 设备句柄
pECCPubKeyBlob: [IN] ECC公钥数据结构体
pbData: [IN] 待验签的数据
ulDataLen: [IN] 待验签的数据长度,必须小于密钥模长度
pSignature: [IN] 签名值
备注:输入数据位待处理的杂凑值。 先对需要处理的数据,用SM3杂凑算法计算(得到摘要),然后再用ECC验签算法验签(使用公钥对摘要内容解密)。


### 7.6.15 生成并导出会话密钥
SKF_ECCExportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pPubKey, PECCCIPHERBLOB pData, HANDLE *phSessionKey)

功能描述:生成会话密钥并用外部公钥加密导出

hContainer: [IN] 容器句柄
ulAlgId: [IN] 会话密钥算法标识, (厂家提供的示例里面,这里是用的 SGD_SM1_ECB 对称加密算法)
pPubKey: [IN] 外部输入的公钥结构
pData: [OUT] 会话密钥密文
phSessionKey: [OUT] 返回会话密钥句柄
.....................---------------需要研究这里第4个参数,和容器本身自己的 公钥,是什么关系;是不是加解密关系


### 7.6.16  ECC 外来公钥加密
SKF_ExtECCEncrypt, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbPlainText, ULONG ulPlainTextLen, PECCCIPHERBLOB pCipherText)

功能描述:使用外部传入的 ECC 公钥对输入的数据做加密运算并输出结果。

hDev: [IN] 设备句柄
pECCPubKeyBlob: [IN] ECC公钥数据结构
pbPlainText: [IN] 待加密的明文数据
ulPlainTextLen: [IN] 待加密的明文数据长度
pCipherText: [OUT] 加密后的密文数据
-----------------------------------这里2个接口都涉及到了 PECCCIPHERBLOB 这个结构体,这个结构体各个字段的含义,需要研究一下


### 7.6.17 ECC 外来私钥解密  [IN/OUT] ======  仅仅用于测试和调试 ======
SKF_ExtECCDecrypt, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, PECCCIPHERBLOB pCipherText, BYTE* pbPlainText, ULONG* pulPlainTextLen)

功能描述:使用外部传入的 ECC 私钥对输入的数据做解密运算并输出结果。

hDev: [IN] 设备句柄
pECCPriKeyBlob: [IN] ECC私钥数据结构
pCipherText: [IN] 待解密的密文数据
pbPlainText: [OUT] 返回明文数据,如果该参数为NULL,则由 pulPlainTextLen 返回明文数据的实际长度
-------------------- 特别留意这里的 [IN/OUT]
pulPlainTextLen: [IN/OUT] 输入时表示pbPlainText换冲区的长度; 输出时表示明文数据的实际长度

备注:本函数仅用于测试和调试,不建议用于实际的密码服务。


### 7.6.18 ECC 外来私钥签名 ======  仅仅用于测试和调试 ======
(SKF_ExtECCSign, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))

功能描述:使用外部传入的 ECC 私钥对输入的数据做签名运算并计算结果。

hDev: [IN] 设备句柄
pECCPriKeyBlob: [IN] ECC私钥数据结构
pbData: [IN] 待签名的数据
ulDataLen: [IN] 待签名的数据长度
pSignature: [OUT] 签名值
备注:输入数据为待签数据的杂凑值。
备注:本函数仅用于测试和调试,不建议用于实际的密码服务。


### 7.6.19 ECC 外来公钥验签
SKF_ExtECCVerify, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)

功能描述:使用外部传入的 ECC 公钥做签名验证

hDev: [IN] 设备句柄
pECCPubKeyBlob: [IN] ECC公钥数据结构
pbData: [IN] 待验签的数据
ulDataLen: [IN] 待验签的数据长度
pSignature: [IN] 签名值
备注:输入数据为待验签的数据的杂凑值。

### 7.6.20 ECC 生成密钥协商参数并输出
SKF_GenerateAgreementDataWithECC, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pTempECCPubKeyBlob,BYTE* pbID, ULONG ulIDLen, HANDLE *phAgreementHandle)

功能描述:使用 ECC 密钥协商算法,为计算会话密钥而产生协商参数,临时返回 ECC 密钥对的公钥及协商句柄。

hContainer: [IN] 容器句柄
ulAlgId: [IN] 会话密钥算法标识
pTempECCPubKeyBlob: [OUT] 发起方的临时 ECC 公钥
pbID: [IN] 发起方的 ID
ulIDLen: [IN] 发起方 ID 的长度,不大于32 
phAgreementHandle: [OUT] 返回的密钥协商句柄
备注:为协商会话密钥,协商的发起方应首先调用本函数


### 7.6.21 ECC产生协商数据并计算会话密钥
SKF_GenerateAgreementDataAndKeyWithECC, (HANDLE hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pSponsorECCPubKeyBlob, PECCPUBLICKEYBLOB pSponsorTempECCPubKeyBlob,    PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, BYTE *pbSponsorID, ULONG ulSponsorIDLen, HANDLE *phKeyHandle)

功能描述:使用 ECC 密钥协商算法,产生协商参数并计算会话密钥,临时输出 ECC密钥对公钥,并返回 产生的密钥句柄。

hContainer: [IN] 容器句柄
ulAlgId: [IN] 会话密钥算法标识
pSponsorECCPubKeyBlob: [IN] 发起方的 ECC 公钥
pSponsorTempECCPubKeyBlob: [IN] 发起方的临时 ECC 公钥
pTempECCPubKeyBlob: [OUT] 响应方的临时 ECC 公钥
pbID: [IN] 响应方的 ID
ulIDLen: [IN] 响应方 ID 的长度,不大于32
pbSponsorID: [IN] 发起方的 ID
ulSponsorIDLen: [IN] 发起方 ID 的长度,不大于32
phKeyHandle: [OUT] 返回的 【对称算法】密钥句柄
备注:本函数由响应方调用


### 7.6.22 ECC计算会话密钥
SKF_GenerateKeyWithECC, (HANDLE hAgreementHandle, PECCPUBLICKEYBLOB pECCPubKeyBlob,    PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, HANDLE *phKeyHandle)

功能描述:使用 ECC 密钥协商算法,使用自身协商句柄和响应方的协商参数计算会话密钥,同时返回会话密钥句柄。

hAgreementHandle: [IN] 密钥协商句柄
pECCPubKeyBlob: [IN] 外部输入的响应方 ECC 公钥
pTempECCPubKeyBlob: [IN] 外部输入的响应方临时 ECC 公钥
pbID: [IN] 响应方的 ID
ulIDLen: [IN] 响应方 ID 的长度,不大于32
phKeyHandle: [OUT] 返回的 密钥句柄
备注:协商的发起方获得响应的协商参数后调用本函数,计算会话密钥。计算过程遵循GM/T AAAA。

### 7.6.23 导出公钥 [IN/OUT]
SKF_ExportPublicKey, (HCONTAINER hContainer, BOOL bSignFlag, BYTE* pbBlob, ULONG* pulBlobLen)

功能描述:导出容器中的签名公钥或者加密公钥。

hContainer: [IN] 密钥容器句柄
bSignFlag: [IN] TRUE表示导出签名公钥,FALSE表示导出加密公钥
pbBlob: [OUT] 指向RSA公钥结构(RSAPUBLICKEYBLOB结构体)或ECC公钥结构(ECCPUBLICKEYBLOB),如果此参数为NULL时,由pulBlobLen返回 pbBlob 实际长度
-------------------- 特别留意这里的 [IN/OUT]---这个参数决定了是 RSA 还是 ECC
pulBlobLen: [IN/OUT] 输入时表示pbBlob缓冲区的长度; 输出时表示导出公钥结构体的大小


### 7.6.24 导入会话密钥
SKF_ImportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId,BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey)

功能描述:导入会话密钥密文,使用容器中的加密私钥解密得到会话密钥。

hContainer: [IN] 容器句柄
ulAlgId: [IN] 会话密钥算法标识
pbWrapedData: [IN] 要导入的会话密钥密文。当容器为 ECC 类型时,此参数为 ECCCIPHERBLOB密文数据;当容器为 RSA 类型时,此参数为 RSA 公钥加密后的数据
pulWrapedLen: [IN] 会话密钥密文长度
phKey: [OUT] 返回会话密钥句柄


### 7.6.25 明文导入会话密钥   ======  仅仅用于测试和调试 ======
SKF_SetSymmKey, (DEVHANDLE hDev, BYTE* pbKey, ULONG ulAlgID, HANDLE* phKey)

功能描述:设置明文对称密钥,返回密钥句柄

hDev: [IN] 设备句柄
pbKey: [IN] 指向会话密钥值的缓冲区
ulAlgID: [IN] 会话密钥算法标识
phKey: [OUT] 返回会话密钥句柄
备注:本函数仅用于测试和调试,不建议用于实际的密码服务。


### 7.6.26 加密初始化
SKF_EncryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param)

功能描述:数据加密初始化。设置数据加密的算法相关参数。

hKey: [IN] 加密密钥句柄
Param: [IN] 分组加密算法相关参数:初始向量、初始向量长度、填充方法、反馈值的位长度


### 7.6.27 单组数据加密
SKF_Encrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)

功能描述:单一分组数据的加密操作。用指定加密密钥对指定数据进行加密,被加密的数据只包含一个分组,加密后的密文保存到指定的缓冲区中。SKF_Encrypt 只对单个分组数据进行加密,在调用 SKF_Encrypt 之前,必须调用 SKF_EncryptInit 进行初始化加密操作。

hKey: [IN] 加密密钥句柄
pbData: [IN] 待加密数据
ulDataLen: [IN] 待加密数据的长度
pbEncrypt: [OUT] 加密后的数据缓冲区指针,可以为 NULL,用于获得加密后数据长度 
--------------------特别留意这里的 [IN/OUT]
pulEncryptLen: [IN/OUT] 输入时表示 结果缓冲区的长度; 输出时表示加密后数据长度


### 7.6.28 多组数据加密
(SKF_EncryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen))

功能描述:多个分组数据的加密操作。

hKey: [IN] 加密密钥句柄
pbData: [IN] 待加密数据
ulDataLen: [IN] 待加密数据的长度
pbEncrypt: [OUT] 加密后的数据缓冲区指针
pulEncryptLen: [OUT] 返回加密后数据长度


### 7.6.29 结束加密
(SKF_EncryptFinal, (HANDLE hKey, BYTE*pbEncrypt,ULONG* pulEncryptLen))

功能描述:结束多个分组数据的加密,返回剩余加密结果。

hKey: [IN] 加密密钥句柄
pbEncrypt: [OUT] 加密结果的缓冲区
pulEncryptLen: [OUT] 加密结果的长度


### 7.6.30 解密初始化
(SKF_DecryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param))

功能描述:数据解密初始化,设置解密密钥相关参数。调用 SKF_DecryptInit 之后,可以调用SKF_Decrypt 对单个分组数据进行解密,也可以多次调用 SKF_DecryptUpdate 之后,再调用 SKF_DecryptFinal 完成对多个分组数据的解密。

hKey: [IN] 解密密钥句柄
Param: [IN] 分组加密算法相关参数:初始向量、初始向量长度、填充方法、反馈值的位长度


### 7.6.31 单组数据解密
(SKF_Decrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen))

功能描述:单个分组数据的解密操作。用指定解密密钥对指定数据进行解密,被解密的数据为单个分组,解密后的明文保存到指定的缓冲区中。 SKF_Decrypt 对单个分组数据进行解密,在调用 SKF_Decrypt 之前,必须调用 SKF_DecryptInit 初始化解密操作;SKF_Decypt等价于 先调用 SKF_DecryptUpdate 再调用 SKF_DecryptFinal。

hKey: [IN] 解密密钥句柄
pbData: [IN] 待解密数据
ulDataLen: [IN] 待解密数据的长度
pbDecrypt: [OUT] 解密后的数据缓冲区指针,可以为 NULL,用于获得解密后数据长度
--------------------特别留意这里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 输入时表示结果数据缓冲区长度, 输出时表示结果数据实际长度



### 7.6.32 多组数据解密
(SKF_DecryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen))

功能描述:多个分组数据的解密操作。用指定解密密钥对指定数据进行解密,被解密的数据包含多个分组,解密后的明文保存到指定的缓冲区中。 SKF_DecryptUpdate 对多个分组数据进行解密,在调用 SKF_DecryptUpdate 之前,必须调用 SKF_DecryptInit 初始化解密操作;在调用 SKF_DecryptUpdate 之后,必须调用 SKF_DecryptFinal 结束解密操作。

hKey: [IN] 解密密钥句柄
pbData: [IN] 待解密数据
ulDataLen: [IN] 待解密数据的长度
pbDecrypt: [OUT] 解密后的数据缓冲区指针
--------------------特别留意这里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 输入时表示结果数据缓冲区长度, 输出时表示结果数据实际长度



### 7.6.33 结束解密
(SKF_DecryptFinal, (HANDLE hKey, BYTE*pbDecrypt, ULONG* pulDecryptLen))

功能描述:结束多个分组数据的解密。先调用 SKF_DecryptInit 初始化解密操作,再调用 SKF_DecryptUpdate 分段解密数据,最后调用 SKF_DecryptFinal 结束多个分组数据的解密操作。

hKey: [IN] 解密密钥句柄
pbDecrypt: [OUT] 指向解密结果的缓冲区,如果此参数为 NULL时,由 pulDecryptLen返回解密结果的长度
--------------------特别留意这里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 输入时表示 pbDecrypt缓冲区的长度; 输出时表示解密结果的长度


### 7.6.34 密码杂凑初始化
(SKF_DigestInit, (DEVHANDLE hDev, ULONG ulAlgID,  PECCPUBLICKEYBLOB pPubKey, BYTE *pucID, ULONG ulIDLen, HANDLE *phHash))

功能描述:初始化密码杂凑计算操作,指定计算密码杂凑的算法。

hDev: [IN] 连接设备时返回的设备句柄
ulAlgID: [IN] 密码杂凑算法标识
pPubKey: [IN] 签名者公钥。当 ulAlgID 为 SGD_SM3 时有效
pucID: [IN] 签名者ID值。当 ulAlgID 为 SGD_SM3 时有效
pulIDLen: [IN] 签名者ID长度。当 ulAlgID 为 SGD_SM3 时有效
phHash: [OUT] 返回密码杂凑对象句柄
备注:当ulAlgID 为 SGD_SM3 且 ulIDLen 不为0的情况下 pPubkey, pucID有效,执行 SM2算法前面预处理1操作。


### 7.6.35 单组数据密码杂凑 [IN/OUT]
(SKF_Digest, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen, BYTE* pbDigest, ULONG* pulDigestLen))

功能描述:对单一分组消息进行密码杂凑计算。调用 SKF_Digest 之前,必须调用 SKF_DigestInit 初始化密码杂凑计算操作; 调用 SKF_Digest 等价于多次调用 SKF_DigestUpdate之后再调用SKF_DigestFinal。

hHash: [IN] 密码杂凑对象句柄
pbData: [IN] 指向消息数据的缓冲区
ulDataLen: [IN] 消息数据的长度
pbDigest: [OUT] 密码杂凑数据缓冲区指针,当此参数为 NULL时,由 pulDigestLen 返回密码杂凑结果的长度
--------------------特别留意这里的 [IN/OUT]
pulDigestLen: [IN/OUT] 输入时表示 结果缓冲区的长度; 输出时表示密码杂凑结果的长度




### 7.6.36 多组数据密码杂凑
(SKF_DigestUpdate, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen))

功能描述:对多个分组的消息进行密码杂凑计算。调用 SKF_DigestUpdate 之前,必须调用 SKF_DigestInit 初始化密码杂凑计算操作; 调用 SKF_DigestUpdate 之后,必须调用 SKF_DigestFinal 结束密码杂凑计算操作。

hHash: [IN] 密码杂凑对象句柄
pbData: [IN] 指向消息数据的缓冲区
ulDataLen: [IN] 消息数据的长度


### 7.6.37 结束密码杂凑
(SKF_DigestFinal, (HANDLE hHash, BYTE* pbDigest, ULONG* pulDigestLen))

功能描述:结束多个分组消息的密码杂凑计算操作,将密码杂凑结果保存到指定的缓冲区。

hHash: [IN] 密码杂凑对象句柄
pbDigest: [OUT] 返回的密码杂凑结果缓冲区指针,当此参数为 NULL时,由 pulDigestLen 返回密码杂凑结果的长度
--------------------特别留意这里的 [IN/OUT]
pulDigestLen: [IN/OUT] 输入时表示 结果缓冲区的长度; 输出时表示密码杂凑结果的长度

备注: SKF_DigestFinal 必须 用于 SKF_DigestUpdate 之后。



### 7.6.38 消息鉴别码运算初始化
(SKF_MacInit, (HANDLE hKey, BLOCKCIPHERPARAM* pMacParam, HANDLE* phMac))

功能描述:初始化消息鉴别码计算操作,设置计算消息鉴别码的所需参数,并返回消息鉴别码句柄。

hKey: [IN] 计算消息鉴别码的密钥句柄
pMacParam: [IN] 消息认证计算相关参数,包括 初始向量、初始向量长度、填充方法、反馈值的位长度
phMac: [OUT] 消息鉴别码对象句柄

备注:消息鉴别码计算采用分组加密算法的 CBC 模式,将加密结果的最后一块作为计算结果。待计算数据的长度必须是分组加密算法块长的倍数,接口内部不坐数据填充。


### 7.6.39 单组数据消息鉴别码运算
(SKF_Mac, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen, BYTE* pbMac, ULONG* pulMacLen))

功能描述:计算单一分组数据的消息鉴别码

hMac: [IN] 消息鉴别码对象句柄
pbData: [IN] 指向待计算数据的缓冲区
ulDataLen: [IN] 待计算数据的长度
pbMac: [OUT] 指向计算后的 Mac结果,当此参数为 NULL时,由 pulMacLen 返回计算结果的长度
--------------------特别留意这里的 [IN/OUT]
pulMacLen: [IN/OUT] 输入时表示 结果缓冲区的长度; 输出时表示计算结果的长度

备注:调用  SKF_Mac 之前,必须调用 SKF_MacInit 初始化消息鉴别码计算操作。 SKF_Mac 等价于多次调用 SKF_MacUpdate 之后再调用 SKF_MacFinal。


### 7.6.40 多组数据消息鉴别码运算
(SKF_MacUpdate, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen))

功能描述:计算多个分组数据的消息鉴别码

hMac: [IN] 消息鉴别码对象句柄
pbData: [IN] 指向待计算数据的缓冲区
ulDataLen: [IN] 待计算数据的长度

备注:调用 SKF_MacUpdate 之前,必须调用 SKF_MacInit 初始化消息鉴别码计算操作;调用 SKF_MacUpdate 之后,必须调用 SKF_MacFinal 结束多个分组数据的消息鉴别码计算操作。


### 7.6.41 结束消息鉴别码运算 [IN/OUT]
(SKF_MacFinal, (HANDLE hMac, BYTE* pbMac, ULONG* pulMacLen))

功能描述:结束多个分组数据的消息鉴别码计算操作

hMac: [IN] 消息鉴别码对象句柄
pbMac: [OUT] 指向计算后的 Mac结果,当此参数为 NULL时,由 pulMacLen 返回计算结果的长度
--------------------特别留意这里的 [IN/OUT]
pulMacLen [IN/OUT] 调用时表示消息鉴别码结果缓冲区的长度;返回时表示计算结果的长度



### 7.6.42 关闭密码对象句柄
(SKF_CloseHandle, (HANDLE hHandle))

功能描述:关闭会话密钥、密码杂凑对象、消息鉴别码对象、ECC密钥协商等句柄

hHandle: [IN] 待关闭的句柄

 

标签:加密,SKF,ULONG,规范,接口,skf,ECC,BYTE,define
From: https://www.cnblogs.com/music-liang/p/18379127

相关文章

  • Java Comparable接口-自然排序
    什么是Comparable排序接口?Comparable接口是Java提供的一个用于对象排序的机制,它允许类的实例自然排序,即定义对象的默认排序顺序。Comparable接口概述Comparable接口是属于Java.lang包。它主要作用是提供一个统一的比较方法,用于对类的对象进行排序。作用:自然排序:是......
  • Tushare金融数据接口使用介绍【学生可以免费获取高级数据接口哦】
    Tushare是一个面向数据分析师和量化投资者的免费、开源Python财经数据接口包,它提供了丰富的中国股市历史数据和实时数据,包括股票、基金、期货、指数和行业数据等。用户可以通过Tushare获取股票交易数据、实时数据以及公司基本信息等。Tushare的使用相对简单,首先需要在Tushare官......
  • 调用Web接口产生的invalid literal for int()错误
    错误产生调用新浪股票的按节点(如hs_a)获取股票总数接口,然后转换为整型,但是返回的是字符串,导致转换失败。报invalidliteralforint()withbase10:'"5349"'错误。出错代码如下:importrequestsdefget_stock_count(node='hs_a'):url=f'https://vip.stock.......
  • 调用股票网站接口读取大A数据——个股资金流入趋势
    以某股票为例,调用自定义的一个类,读取数据。classBigAData:#获取资金流向数据defget_money_flow(self,stock_code,page=1,num=20,sort='opendate',asc=0):'''该函数通过股票代码从新浪财经API获取资金流向数据。参数包括股票代码......
  • JAVA案例之使用接口实现手机功能
    题目:原始的手机,可以发短信,通电话。随着发展,手机增加了功能:音频、视频播放、拍照、上网。使用接口实现手机功能类图:AptitudeHandest:智能手机CommonHandset:普通手机Handset:手机父类Network:网络PlayWiring:播放功能TheakePictures:拍照功能代码实......
  • Android开发 - ServiceConnection 接口处理 Service 与客户端(如 Activity)之间的连接解
    什么是ServiceConnectionServiceConnection是一个用于处理Service与客户端(如Activity)之间连接的接口,它让客户端能够绑定到Service并与之进行交互。它定义了两个重要的回调方法,用于管理客户端与Service之间的连接。当客户端绑定到一个Service时,这些回调方法会被调用,允......
  • 一探究竟:免费提供API接口的原理揭秘
    API接口是软件系统中不同组件之间进行交互的一种方式。它定义了不同软件组件之间的通信规范和数据格式,使得这些组件能够相互调用和交换数据。API的全称是“ApplicationProgrammingInterface”,意为“应用程序编程接口”API接口的原理定义与规范:API接口首先定义了一套规范,......
  • 如何解决接口数据重复问题?
    1.前端实现  前端设置按钮的状态,提交以后就加载,成功以后再恢复正常状态。  缺点:无法绝对保证不重复,但是前端实现可以减少网络请求2.后端通过幂等性来实现2.1幂等性概念  幂等指多次操作产生的影响只会跟一次执行的结果相同,通俗的说:某个行为重复的执行,最终获取......
  • 直播系统开发,接口异步调用一小步,耗时减少一大步
    直播系统开发,接口异步调用一小步,耗时减少一大步随着直播系统开发业务发展,底层数据量越来越大,业务逻辑也日趋复杂化,某些接口耗时也越来越长,这时候接口就需要进行性能优化了,当然性能优化主要跟业务相关涉及改造点可能各不相同,这里就来介绍异步调用多个接口减少响应时间。适用......
  • 内置函数式接口
    只包含一个抽象方法的接口,称为函数式接口。可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。在任意函数式接口上设置@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会......