#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