#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 設(shè)備信息
*/
typedef struct devinfo_st
{
VERSION Version; //版本號。數(shù)據(jù)結(jié)構(gòu)版本號,本結(jié)構(gòu)的版本號為1.0
CHAR Manufacturer[64]; //設(shè)備廠商信息。以 "\0" 為結(jié)束符的 ASCII 字符串
CHAR Issuer[64]; //發(fā)行廠商信息。以 "\0" 為結(jié)束符的 ASCII 字符串
CHAR Label[32]; //設(shè)備標簽信息。以 "\0" 為結(jié)束符的 ASCII 字符串
CHAR SerialNumber[32]; //設(shè)備序列號。以 "\0" 為結(jié)束符的 ASCII 字符串
VERSION HWVersion; //設(shè)備硬件版本
VERSION FirmwareVersion; //設(shè)備固件版本
ULONG AlgSymCap; //分組密碼算法標識
ULONG AlgAsymCap; //非對稱密碼算法標識
ULONG AlgHashCap; //密碼雜湊算法標識
ULONG DevAuthAlgId; //設(shè)備認證使用的分組密碼算法標識
ULONG TotalSpace; //設(shè)備總空間大小
ULONG FreeSpace; //用戶可用空間大小
ULONG MaxECCBufferSize; //能夠處理的 ECC 加密數(shù)據(jù)大小
ULONG MaxBufferSize; //能夠處理的分組運算和雜湊運算的數(shù)據(jù)大小
BYTE Reserved[56]; //保留擴展 //todo 國芯協(xié)議,不支持2012版本接口規(guī)范,他們支持的規(guī)范版本是2010
}PACKED_ST(DEVINFO);
typedef DEVINFO * PDEVINFO;
#define MAX_RSA_MODULUS_LEN 256 // 算法模數(shù)的最大長度
#define MAX_RSA_EXPONENT_LEN 4 // 算法指數(shù)的最大長度
/*
6.4.3 RAS公鑰數(shù)據(jù)結(jié)構(gòu)
*/
typedef struct rsapubkeyblob_st
{
ULONG AlgID; //算法標識號
ULONG BitLen; //模數(shù)的實際位長度,必須是 8 的倍數(shù)
BYTE Modulus[MAX_RSA_MODULUS_LEN]; //模數(shù) n = p * q,實際長度為 Bitlen/8 字節(jié).
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公鑰秘鑰,一般為 00010001
}PACKED_ST(RSAPUBLICKEYBLOB);
typedef RSAPUBLICKEYBLOB * PRSAPUBLICKEYBLOB;
/*
6.4.4 RSA 私鑰數(shù)據(jù)結(jié)構(gòu)
*/
typedef struct rsaprivkeyblob_st
{
ULONG AlgID; //算法標識號
ULONG BitLen; //模數(shù)的實際位長度,必須是 8 的倍數(shù)
BYTE Modulus[MAX_RSA_MODULUS_LEN]; // 模數(shù) n = p * q,實際長度為 Bitlen/8 字節(jié)
BYTE PublicExponent[MAX_RSA_EXPONENT_LEN]; //公鑰秘鑰e,一般為 00010001
BYTE PrivateExponent[MAX_RSA_MODULUS_LEN]; // 私鑰秘鑰d,實際長度為 Bitlen/8 字節(jié)
BYTE Prime1[MAX_RSA_MODULUS_LEN/2]; // 素數(shù)p,實際長度為 Bitlen/16 字節(jié)
BYTE Prime2[MAX_RSA_MODULUS_LEN/2]; // 素數(shù)q,實際長度為 Bitlen/16 字節(jié)
BYTE Prime1Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模數(shù)模p的逆元,實際長度為 Bitlen/16 字節(jié)
BYTE Prime2Exponent[MAX_RSA_MODULUS_LEN/2]; //d, 模數(shù)模q的逆元,實際長度為 Bitlen/16 字節(jié)
BYTE Coefficient[MAX_RSA_MODULUS_LEN/2]; // q模p 的乘法逆元,實際長度為 Bitlen/16 字節(jié)
}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算法 模數(shù)的最大長度
/*
6.4.5 ECC 公鑰數(shù)據(jù)結(jié)構(gòu)
*/
typedef struct eccpubkeyblob_st
{
ULONG BitLen; //模數(shù)的實際位長度,必須是 8 的倍數(shù)
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 私鑰數(shù)據(jù)結(jié)構(gòu)
*/
typedef struct eccprivkeyblob_st
{
ULONG BitLen; //模數(shù)的實際位長度,必須是 8 的倍數(shù)
BYTE PrivateKey[ECC_MAX_MODULUS_BITS_LEN / 8]; //私有秘鑰(64位)
}PACKED_ST(ECCPRIVATEKEYBLOB);
typedef ECCPRIVATEKEYBLOB * PECCPRIVATEKEYBLOB;
/*
6.4.7 ECC 密文數(shù)據(jù)結(jié)構(gòu)
*/
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; //密文數(shù)據(jù)長度
BYTE Cipher[1]; //密文數(shù)據(jù), 實際長度為 CipherLen 字節(jié)...這種變長,最不好處理了.
} PACKED_ST(ECCCIPHERBLOB);
typedef ECCCIPHERBLOB * PECCCIPHERBLOB;
/*
6.4.8 ECC簽名數(shù)據(jù)結(jié)構(gòu)
*/
typedef struct eccsignatureblob_st
{
BYTE r[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //簽名結(jié)果的 r 部分 (64 Byte)
BYTE s[ECC_MAX_XCOORDINATE_BITS_LEN / 8]; //簽名結(jié)果的 s 部分 (64 Byte)
}PACKED_ST(ECCSIGNATUREBLOB);
typedef ECCSIGNATUREBLOB * PECCSIGNATUREBLOB;
#define MAX_IV_LEN 32 // 初始向量的最大長度
/*
6.4.9 分組密碼參數(shù)
*/
typedef struct blockcipherparam_st
{
BYTE IV[MAX_IV_LEN]; //初始向量
ULONG IVLen; //初始向量實際長度(按字節(jié)計算)
ULONG PaddingType; //填充方式,0表示不填充,1表示按照 PSCK#5 方式進行填充
ULONG FeedBitLen; //反饋值的位長度(按位計算),只針對 OFB, CFB 模式
} PACKED_ST(BLOCKCIPHERPARAM);
typedef BLOCKCIPHERPARAM * PBLOCKCIPHERPARAM;
/*
6.4.10 ECC加密秘鑰對 保護結(jié)構(gòu)
*/
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" 結(jié)束的 ASCII 字符串,最大長度是32
ULONG FileSize; //文件大小。創(chuàng)建文件時定義的文件大小
ULONG ReadRights; //讀取權(quán)限。讀取文件需要的權(quán)限
ULONG WriteRights; //寫入權(quán)限。寫入文件需要的權(quán)限
}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函數(shù)ulAlgId參數(shù)
#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 //橢圓曲線密鑰交換協(xié)議
#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 權(quán)限類型
#define SECURE_NEVER_ACCOUNT 0x00 //不允許
#define SECURE_ADM_ACCOUNT 0x01 //管理員權(quán)限
#define SECURE_USER_ACCOUNT 0x10 //用戶權(quán)限
#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 設(shè)備狀態(tài)
#define DEV_ABSENT_STATE 0x00000000 //設(shè)備不存在
#define DEV_PRESENT_STATE 0x00000001 //設(shè)備存在
#define DEV_UNKNOW_STATE 0x00000002 //設(shè)備狀態(tài)未知
#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 //不支持的服務(wù)
#define SAR_FILEERR 0x0A000004 //文件錯誤
#define SAR_INVALIDHANDLEERR 0x0A000005 //無效句柄
#define SAR_INVALIDPARAMERR 0x0A000006 //無效參數(shù)
#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 //內(nèi)存錯誤
#define SAR_TIMEOUTERR 0x0A00000F //超時
#define SAR_INDATALENERR 0x0A000010 //輸入數(shù)據(jù)長度錯誤
#define SAR_INDATAERR 0x0A000011 //輸入數(shù)據(jù)錯誤
#define SAR_GENRANDERR 0x0A000012 //生成隨機數(shù)錯誤
#define SAR_HASHOBJERR 0x0A000013 //HASH 對象錯誤
#define SAR_HASHERR 0x0A000014 //HASH 運算錯誤
#define SAR_GENRSAKEYERR 0x0A000015 //產(chǎn)生 RSA 秘鑰錯誤
#define SAR_RSAMODULUSLENERR 0x0A000016 //RSA 秘鑰模的長度錯誤
#define SAR_CSPIMPRTPUBKEYERR 0x0A000017 //CSP服務(wù)導(dǎo)入公鑰錯誤
#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 //對象未導(dǎo)出
#define SAR_DECRYPTPADERR 0x0A00001E //解密時做補丁錯誤
#define SAR_MACLENERR 0x0A00001F //MAC 長度錯誤
#define SAR_BUFFER_TOO_SMALL 0x0A000020 //緩沖區(qū)不足
#define SAR_KEYINFOTYPEERR 0x0A000021 //秘鑰類型錯誤
#define SAR_NOT_EVENTERR 0x0A000022 //無事件錯誤
#define SAR_DEVICE_REMOVED 0x0A000023 //設(shè)備已移除
#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 //用戶已經(jīng)登錄
#define SAR_USER_PIN_NOT_INITIALIZED 0x0A000029 //沒有初始化用戶口令
#define SAR_USER_TYPE_INVALID 0x0A00002A //PIN 類型錯誤
#define SAR_APPLICATION_NAME_INVALID 0x0A00002B //應(yīng)用名稱錯誤
#define SAR_APPLICATION_EXISTS 0x0A00002C //應(yīng)用已經(jīng)存在
#define SAR_USER_NOT_LOGGED_IN 0x0A00002D //用戶沒有登錄
#define SAR_APPLICATION_NOT_EXISTS 0x0A00002E //應(yīng)用不存在
#define SAR_FILE_ALREADY_EXIST 0x0A00002F //文件已經(jīng)存在
#define SAR_NO_ROOM 0x0A000030 //空間不足
#define SAR_FILE_NOT_EXIST 0x0A000031 //文件不存在
#define SAR_REACH_MAX_CONTAINER_COUNT 0x0A000032 //已達到最大可管理容器數(shù)
#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 密碼服務(wù) 系列函數(shù)
|函數(shù)指針 | 注釋|
|----------|----------|
SKF_FUN_INFO(SKF_GenRandom, (DEVHANDLE hDev,BYTE* pbRandom,ULONG ulRandom)); | 生成隨機數(shù)
SKF_FUN_INFO(SKF_GenECCKeyPair, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pBlob)); | 生成ECC簽名密鑰對
SKF_FUN_INFO(SKF_ImportECCKeyPair, (HCONTAINER hContainer, PENVELOPEDKEYBLOB blob)); | 導(dǎo)入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 生成并導(dǎo)出會話密鑰
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 生成密鑰協(xié)商參數(shù)并輸出
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產(chǎn)生協(xié)商數(shù)據(jù)并計算會話密鑰
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)); | 導(dǎo)出公鑰
SKF_FUN_INFO(SKF_ImportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId,BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey)); | 導(dǎo)入會話密鑰
SKF_FUN_INFO(SKF_SetSymmKey, (DEVHANDLE hDev, BYTE* pbKey, ULONG ulAlgID, HANDLE* phKey)); | 明文導(dǎo)入會話密鑰 | todo 2012版本已經(jīng)沒有這個方法
SKF_FUN_INFO(SKF_EncryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param)); | 加密初始化
SKF_FUN_INFO(SKF_Encrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)); | 單組數(shù)據(jù)加碼
SKF_FUN_INFO(SKF_EncryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)); | 多組數(shù)據(jù)加密
SKF_FUN_INFO(SKF_EncryptFinal, (HANDLE hKey, BYTE*pbEncrypt,ULONG* pulEncryptLen)); | 結(jié)束加密
SKF_FUN_INFO(SKF_DecryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param)); | 解密初始化
SKF_FUN_INFO(SKF_Decrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen)); | 單組數(shù)據(jù)解密
SKF_FUN_INFO(SKF_DecryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen)); | 多組數(shù)據(jù)解密
SKF_FUN_INFO(SKF_DecryptFinal, (HANDLE hKey, BYTE*pbDecrypt, ULONG* pulDecryptLen)); | 結(jié)束解密
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)); | 單組數(shù)據(jù)密碼雜湊
SKF_FUN_INFO(SKF_DigestUpdate, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen)); | 多組數(shù)據(jù)密碼雜湊
SKF_FUN_INFO(SKF_DigestFinal, (HANDLE hHash, BYTE* pbDigest, ULONG* pulDigestLen)); | 結(jié)束密碼雜湊
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)); | 單組數(shù)據(jù)消息鑒別碼運算
SKF_FUN_INFO(SKF_MacUpdate, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen)); | 多組數(shù)據(jù)消息鑒別碼運算
SKF_FUN_INFO(SKF_MacFinal, (HANDLE hMac, BYTE* pbMac, ULONG* pulMacLen)); | 結(jié)束消息鑒別碼運算
SKF_FUN_INFO(SKF_CloseHandle, (HANDLE hHandle)); | 關(guān)閉密碼對象句柄
## 函數(shù)介紹
### 7.6.11 生成ECC簽名密鑰對
(SKF_GenECCKeyPair, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pBlob))
功能描述:生成 ECC 簽名 密鑰對并輸出 簽名公鑰。
hContainer: [IN] 容器句柄
ulAlgId: [IN] 算法標識,只支持 SGD_SM2_1 算法
pBlob: [OUT] 返回ECC公鑰數(shù)據(jù)結(jié)構(gòu)體
### 7.6.12 導(dǎo)入ECC加密密鑰對
(SKF_ImportECCKeyPair, (HCONTAINER hContainer, PENVELOPEDKEYBLOB blob))
功能描述:導(dǎo)入 ECC 公私鑰對。
hContainer: [IN] 密鑰容器句柄
blob: [IN] 受保護的加密密鑰對
### 7.6.13 ECC簽名
(SKF_ECCSignData, (HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))
功能描述:ECC 數(shù)字簽名。采用 ECC算法 和指定私鑰 hKey ,對指定數(shù)據(jù) pbData進行數(shù)字簽名。簽名后的結(jié)果存放到 pSignature中。
hContainer: [IN] 密鑰容器句柄
pbData: [IN] 待簽名的數(shù)據(jù)
ulDataLen: [IN] 待簽名的數(shù)據(jù)長度,必須小于密鑰模長度
pSignature: [OUT] 簽名值
備注:輸入數(shù)據(jù)位待處理的雜湊值。 先對需要處理的數(shù)據(jù),用SM3雜湊算法計算(得到摘要),然后再用ECC簽名算法簽名(使用私鑰對摘要內(nèi)容加密)。
### 7.6.14 ECC驗簽
(SKF_ECCVerify, (DEVHANDLE hDev , PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))
功能描述:使用 ECC 公鑰對數(shù)據(jù)進行驗簽。
hDev: [IN] 設(shè)備句柄
pECCPubKeyBlob: [IN] ECC公鑰數(shù)據(jù)結(jié)構(gòu)體
pbData: [IN] 待驗簽的數(shù)據(jù)
ulDataLen: [IN] 待驗簽的數(shù)據(jù)長度,必須小于密鑰模長度
pSignature: [IN] 簽名值
備注:輸入數(shù)據(jù)位待處理的雜湊值。 先對需要處理的數(shù)據(jù),用SM3雜湊算法計算(得到摘要),然后再用ECC驗簽算法驗簽(使用公鑰對摘要內(nèi)容解密)。
### 7.6.15 生成并導(dǎo)出會話密鑰
SKF_ECCExportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pPubKey, PECCCIPHERBLOB pData, HANDLE *phSessionKey)
功能描述:生成會話密鑰并用外部公鑰加密導(dǎo)出
hContainer: [IN] 容器句柄
ulAlgId: [IN] 會話密鑰算法標識, (廠家提供的示例里面,這里是用的 SGD_SM1_ECB 對稱加密算法)
pPubKey: [IN] 外部輸入的公鑰結(jié)構(gòu)
pData: [OUT] 會話密鑰密文
phSessionKey: [OUT] 返回會話密鑰句柄
.....................---------------需要研究這里第4個參數(shù),和容器本身自己的 公鑰,是什么關(guān)系;是不是加解密關(guān)系
### 7.6.16 ECC 外來公鑰加密
SKF_ExtECCEncrypt, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbPlainText, ULONG ulPlainTextLen, PECCCIPHERBLOB pCipherText)
功能描述:使用外部傳入的 ECC 公鑰對輸入的數(shù)據(jù)做加密運算并輸出結(jié)果。
hDev: [IN] 設(shè)備句柄
pECCPubKeyBlob: [IN] ECC公鑰數(shù)據(jù)結(jié)構(gòu)
pbPlainText: [IN] 待加密的明文數(shù)據(jù)
ulPlainTextLen: [IN] 待加密的明文數(shù)據(jù)長度
pCipherText: [OUT] 加密后的密文數(shù)據(jù)
-----------------------------------這里2個接口都涉及到了 PECCCIPHERBLOB 這個結(jié)構(gòu)體,這個結(jié)構(gòu)體各個字段的含義,需要研究一下
### 7.6.17 ECC 外來私鑰解密 [IN/OUT] ====== 僅僅用于測試和調(diào)試 ======
SKF_ExtECCDecrypt, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, PECCCIPHERBLOB pCipherText, BYTE* pbPlainText, ULONG* pulPlainTextLen)
功能描述:使用外部傳入的 ECC 私鑰對輸入的數(shù)據(jù)做解密運算并輸出結(jié)果。
hDev: [IN] 設(shè)備句柄
pECCPriKeyBlob: [IN] ECC私鑰數(shù)據(jù)結(jié)構(gòu)
pCipherText: [IN] 待解密的密文數(shù)據(jù)
pbPlainText: [OUT] 返回明文數(shù)據(jù),如果該參數(shù)為NULL,則由 pulPlainTextLen 返回明文數(shù)據(jù)的實際長度
-------------------- 特別留意這里的 [IN/OUT]
pulPlainTextLen: [IN/OUT] 輸入時表示pbPlainText換沖區(qū)的長度; 輸出時表示明文數(shù)據(jù)的實際長度
備注:本函數(shù)僅用于測試和調(diào)試,不建議用于實際的密碼服務(wù)。
### 7.6.18 ECC 外來私鑰簽名 ====== 僅僅用于測試和調(diào)試 ======
(SKF_ExtECCSign, (DEVHANDLE hDev, PECCPRIVATEKEYBLOB pECCPriKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature))
功能描述:使用外部傳入的 ECC 私鑰對輸入的數(shù)據(jù)做簽名運算并計算結(jié)果。
hDev: [IN] 設(shè)備句柄
pECCPriKeyBlob: [IN] ECC私鑰數(shù)據(jù)結(jié)構(gòu)
pbData: [IN] 待簽名的數(shù)據(jù)
ulDataLen: [IN] 待簽名的數(shù)據(jù)長度
pSignature: [OUT] 簽名值
備注:輸入數(shù)據(jù)為待簽數(shù)據(jù)的雜湊值。
備注:本函數(shù)僅用于測試和調(diào)試,不建議用于實際的密碼服務(wù)。
### 7.6.19 ECC 外來公鑰驗簽
SKF_ExtECCVerify, (DEVHANDLE hDev, PECCPUBLICKEYBLOB pECCPubKeyBlob, BYTE* pbData, ULONG ulDataLen, PECCSIGNATUREBLOB pSignature)
功能描述:使用外部傳入的 ECC 公鑰做簽名驗證
hDev: [IN] 設(shè)備句柄
pECCPubKeyBlob: [IN] ECC公鑰數(shù)據(jù)結(jié)構(gòu)
pbData: [IN] 待驗簽的數(shù)據(jù)
ulDataLen: [IN] 待驗簽的數(shù)據(jù)長度
pSignature: [IN] 簽名值
備注:輸入數(shù)據(jù)為待驗簽的數(shù)據(jù)的雜湊值。
### 7.6.20 ECC 生成密鑰協(xié)商參數(shù)并輸出
SKF_GenerateAgreementDataWithECC, (HCONTAINER hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pTempECCPubKeyBlob,BYTE* pbID, ULONG ulIDLen, HANDLE *phAgreementHandle)
功能描述:使用 ECC 密鑰協(xié)商算法,為計算會話密鑰而產(chǎn)生協(xié)商參數(shù),臨時返回 ECC 密鑰對的公鑰及協(xié)商句柄。
hContainer: [IN] 容器句柄
ulAlgId: [IN] 會話密鑰算法標識
pTempECCPubKeyBlob: [OUT] 發(fā)起方的臨時 ECC 公鑰
pbID: [IN] 發(fā)起方的 ID
ulIDLen: [IN] 發(fā)起方 ID 的長度,不大于32
phAgreementHandle: [OUT] 返回的密鑰協(xié)商句柄
備注:為協(xié)商會話密鑰,協(xié)商的發(fā)起方應(yīng)首先調(diào)用本函數(shù)
### 7.6.21 ECC產(chǎn)生協(xié)商數(shù)據(jù)并計算會話密鑰
SKF_GenerateAgreementDataAndKeyWithECC, (HANDLE hContainer, ULONG ulAlgId, PECCPUBLICKEYBLOB pSponsorECCPubKeyBlob, PECCPUBLICKEYBLOB pSponsorTempECCPubKeyBlob, PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, BYTE *pbSponsorID, ULONG ulSponsorIDLen, HANDLE *phKeyHandle)
功能描述:使用 ECC 密鑰協(xié)商算法,產(chǎn)生協(xié)商參數(shù)并計算會話密鑰,臨時輸出 ECC密鑰對公鑰,并返回 產(chǎn)生的密鑰句柄。
hContainer: [IN] 容器句柄
ulAlgId: [IN] 會話密鑰算法標識
pSponsorECCPubKeyBlob: [IN] 發(fā)起方的 ECC 公鑰
pSponsorTempECCPubKeyBlob: [IN] 發(fā)起方的臨時 ECC 公鑰
pTempECCPubKeyBlob: [OUT] 響應(yīng)方的臨時 ECC 公鑰
pbID: [IN] 響應(yīng)方的 ID
ulIDLen: [IN] 響應(yīng)方 ID 的長度,不大于32
pbSponsorID: [IN] 發(fā)起方的 ID
ulSponsorIDLen: [IN] 發(fā)起方 ID 的長度,不大于32
phKeyHandle: [OUT] 返回的 【對稱算法】密鑰句柄
備注:本函數(shù)由響應(yīng)方調(diào)用
### 7.6.22 ECC計算會話密鑰
SKF_GenerateKeyWithECC, (HANDLE hAgreementHandle, PECCPUBLICKEYBLOB pECCPubKeyBlob, PECCPUBLICKEYBLOB pTempECCPubKeyBlob, BYTE* pbID, ULONG ulIDLen, HANDLE *phKeyHandle)
功能描述:使用 ECC 密鑰協(xié)商算法,使用自身協(xié)商句柄和響應(yīng)方的協(xié)商參數(shù)計算會話密鑰,同時返回會話密鑰句柄。
hAgreementHandle: [IN] 密鑰協(xié)商句柄
pECCPubKeyBlob: [IN] 外部輸入的響應(yīng)方 ECC 公鑰
pTempECCPubKeyBlob: [IN] 外部輸入的響應(yīng)方臨時 ECC 公鑰
pbID: [IN] 響應(yīng)方的 ID
ulIDLen: [IN] 響應(yīng)方 ID 的長度,不大于32
phKeyHandle: [OUT] 返回的 密鑰句柄
備注:協(xié)商的發(fā)起方獲得響應(yīng)的協(xié)商參數(shù)后調(diào)用本函數(shù),計算會話密鑰。計算過程遵循GM/T AAAA。
### 7.6.23 導(dǎo)出公鑰 [IN/OUT]
SKF_ExportPublicKey, (HCONTAINER hContainer, BOOL bSignFlag, BYTE* pbBlob, ULONG* pulBlobLen)
功能描述:導(dǎo)出容器中的簽名公鑰或者加密公鑰。
hContainer: [IN] 密鑰容器句柄
bSignFlag: [IN] TRUE表示導(dǎo)出簽名公鑰,F(xiàn)ALSE表示導(dǎo)出加密公鑰
pbBlob: [OUT] 指向RSA公鑰結(jié)構(gòu)(RSAPUBLICKEYBLOB結(jié)構(gòu)體)或ECC公鑰結(jié)構(gòu)(ECCPUBLICKEYBLOB),如果此參數(shù)為NULL時,由pulBlobLen返回 pbBlob 實際長度
-------------------- 特別留意這里的 [IN/OUT]---這個參數(shù)決定了是 RSA 還是 ECC
pulBlobLen: [IN/OUT] 輸入時表示pbBlob緩沖區(qū)的長度; 輸出時表示導(dǎo)出公鑰結(jié)構(gòu)體的大小
### 7.6.24 導(dǎo)入會話密鑰
SKF_ImportSessionKey, (HCONTAINER hContainer, ULONG ulAlgId,BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey)
功能描述:導(dǎo)入會話密鑰密文,使用容器中的加密私鑰解密得到會話密鑰。
hContainer: [IN] 容器句柄
ulAlgId: [IN] 會話密鑰算法標識
pbWrapedData: [IN] 要導(dǎo)入的會話密鑰密文。當容器為 ECC 類型時,此參數(shù)為 ECCCIPHERBLOB密文數(shù)據(jù);當容器為 RSA 類型時,此參數(shù)為 RSA 公鑰加密后的數(shù)據(jù)
pulWrapedLen: [IN] 會話密鑰密文長度
phKey: [OUT] 返回會話密鑰句柄
### 7.6.25 明文導(dǎo)入會話密鑰 ====== 僅僅用于測試和調(diào)試 ======
SKF_SetSymmKey, (DEVHANDLE hDev, BYTE* pbKey, ULONG ulAlgID, HANDLE* phKey)
功能描述:設(shè)置明文對稱密鑰,返回密鑰句柄
hDev: [IN] 設(shè)備句柄
pbKey: [IN] 指向會話密鑰值的緩沖區(qū)
ulAlgID: [IN] 會話密鑰算法標識
phKey: [OUT] 返回會話密鑰句柄
備注:本函數(shù)僅用于測試和調(diào)試,不建議用于實際的密碼服務(wù)。
### 7.6.26 加密初始化
SKF_EncryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param)
功能描述:數(shù)據(jù)加密初始化。設(shè)置數(shù)據(jù)加密的算法相關(guān)參數(shù)。
hKey: [IN] 加密密鑰句柄
Param: [IN] 分組加密算法相關(guān)參數(shù):初始向量、初始向量長度、填充方法、反饋值的位長度
### 7.6.27 單組數(shù)據(jù)加密
SKF_Encrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen)
功能描述:單一分組數(shù)據(jù)的加密操作。用指定加密密鑰對指定數(shù)據(jù)進行加密,被加密的數(shù)據(jù)只包含一個分組,加密后的密文保存到指定的緩沖區(qū)中。SKF_Encrypt 只對單個分組數(shù)據(jù)進行加密,在調(diào)用 SKF_Encrypt 之前,必須調(diào)用 SKF_EncryptInit 進行初始化加密操作。
hKey: [IN] 加密密鑰句柄
pbData: [IN] 待加密數(shù)據(jù)
ulDataLen: [IN] 待加密數(shù)據(jù)的長度
pbEncrypt: [OUT] 加密后的數(shù)據(jù)緩沖區(qū)指針,可以為 NULL,用于獲得加密后數(shù)據(jù)長度
--------------------特別留意這里的 [IN/OUT]
pulEncryptLen: [IN/OUT] 輸入時表示 結(jié)果緩沖區(qū)的長度; 輸出時表示加密后數(shù)據(jù)長度
### 7.6.28 多組數(shù)據(jù)加密
(SKF_EncryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbEncrypt, ULONG* pulEncryptLen))
功能描述:多個分組數(shù)據(jù)的加密操作。
hKey: [IN] 加密密鑰句柄
pbData: [IN] 待加密數(shù)據(jù)
ulDataLen: [IN] 待加密數(shù)據(jù)的長度
pbEncrypt: [OUT] 加密后的數(shù)據(jù)緩沖區(qū)指針
pulEncryptLen: [OUT] 返回加密后數(shù)據(jù)長度
### 7.6.29 結(jié)束加密
(SKF_EncryptFinal, (HANDLE hKey, BYTE*pbEncrypt,ULONG* pulEncryptLen))
功能描述:結(jié)束多個分組數(shù)據(jù)的加密,返回剩余加密結(jié)果。
hKey: [IN] 加密密鑰句柄
pbEncrypt: [OUT] 加密結(jié)果的緩沖區(qū)
pulEncryptLen: [OUT] 加密結(jié)果的長度
### 7.6.30 解密初始化
(SKF_DecryptInit, (HANDLE hKey, BLOCKCIPHERPARAM Param))
功能描述:數(shù)據(jù)解密初始化,設(shè)置解密密鑰相關(guān)參數(shù)。調(diào)用 SKF_DecryptInit 之后,可以調(diào)用SKF_Decrypt 對單個分組數(shù)據(jù)進行解密,也可以多次調(diào)用 SKF_DecryptUpdate 之后,再調(diào)用 SKF_DecryptFinal 完成對多個分組數(shù)據(jù)的解密。
hKey: [IN] 解密密鑰句柄
Param: [IN] 分組加密算法相關(guān)參數(shù):初始向量、初始向量長度、填充方法、反饋值的位長度
### 7.6.31 單組數(shù)據(jù)解密
(SKF_Decrypt, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen))
功能描述:單個分組數(shù)據(jù)的解密操作。用指定解密密鑰對指定數(shù)據(jù)進行解密,被解密的數(shù)據(jù)為單個分組,解密后的明文保存到指定的緩沖區(qū)中。 SKF_Decrypt 對單個分組數(shù)據(jù)進行解密,在調(diào)用 SKF_Decrypt 之前,必須調(diào)用 SKF_DecryptInit 初始化解密操作;SKF_Decypt等價于 先調(diào)用 SKF_DecryptUpdate 再調(diào)用 SKF_DecryptFinal。
hKey: [IN] 解密密鑰句柄
pbData: [IN] 待解密數(shù)據(jù)
ulDataLen: [IN] 待解密數(shù)據(jù)的長度
pbDecrypt: [OUT] 解密后的數(shù)據(jù)緩沖區(qū)指針,可以為 NULL,用于獲得解密后數(shù)據(jù)長度
--------------------特別留意這里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 輸入時表示結(jié)果數(shù)據(jù)緩沖區(qū)長度, 輸出時表示結(jié)果數(shù)據(jù)實際長度
### 7.6.32 多組數(shù)據(jù)解密
(SKF_DecryptUpdate, (HANDLE hKey, BYTE* pbData, ULONG ulDataLen, BYTE*pbDecrypt, ULONG* pulDecryptLen))
功能描述:多個分組數(shù)據(jù)的解密操作。用指定解密密鑰對指定數(shù)據(jù)進行解密,被解密的數(shù)據(jù)包含多個分組,解密后的明文保存到指定的緩沖區(qū)中。 SKF_DecryptUpdate 對多個分組數(shù)據(jù)進行解密,在調(diào)用 SKF_DecryptUpdate 之前,必須調(diào)用 SKF_DecryptInit 初始化解密操作;在調(diào)用 SKF_DecryptUpdate 之后,必須調(diào)用 SKF_DecryptFinal 結(jié)束解密操作。
hKey: [IN] 解密密鑰句柄
pbData: [IN] 待解密數(shù)據(jù)
ulDataLen: [IN] 待解密數(shù)據(jù)的長度
pbDecrypt: [OUT] 解密后的數(shù)據(jù)緩沖區(qū)指針
--------------------特別留意這里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 輸入時表示結(jié)果數(shù)據(jù)緩沖區(qū)長度, 輸出時表示結(jié)果數(shù)據(jù)實際長度
### 7.6.33 結(jié)束解密
(SKF_DecryptFinal, (HANDLE hKey, BYTE*pbDecrypt, ULONG* pulDecryptLen))
功能描述:結(jié)束多個分組數(shù)據(jù)的解密。先調(diào)用 SKF_DecryptInit 初始化解密操作,再調(diào)用 SKF_DecryptUpdate 分段解密數(shù)據(jù),最后調(diào)用 SKF_DecryptFinal 結(jié)束多個分組數(shù)據(jù)的解密操作。
hKey: [IN] 解密密鑰句柄
pbDecrypt: [OUT] 指向解密結(jié)果的緩沖區(qū),如果此參數(shù)為 NULL時,由 pulDecryptLen返回解密結(jié)果的長度
--------------------特別留意這里的 [IN/OUT]
pulDecryptLen: [IN/OUT] 輸入時表示 pbDecrypt緩沖區(qū)的長度; 輸出時表示解密結(jié)果的長度
### 7.6.34 密碼雜湊初始化
(SKF_DigestInit, (DEVHANDLE hDev, ULONG ulAlgID, PECCPUBLICKEYBLOB pPubKey, BYTE *pucID, ULONG ulIDLen, HANDLE *phHash))
功能描述:初始化密碼雜湊計算操作,指定計算密碼雜湊的算法。
hDev: [IN] 連接設(shè)備時返回的設(shè)備句柄
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有效,執(zhí)行 SM2算法前面預(yù)處理1操作。
### 7.6.35 單組數(shù)據(jù)密碼雜湊 [IN/OUT]
(SKF_Digest, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen, BYTE* pbDigest, ULONG* pulDigestLen))
功能描述:對單一分組消息進行密碼雜湊計算。調(diào)用 SKF_Digest 之前,必須調(diào)用 SKF_DigestInit 初始化密碼雜湊計算操作; 調(diào)用 SKF_Digest 等價于多次調(diào)用 SKF_DigestUpdate之后再調(diào)用SKF_DigestFinal。
hHash: [IN] 密碼雜湊對象句柄
pbData: [IN] 指向消息數(shù)據(jù)的緩沖區(qū)
ulDataLen: [IN] 消息數(shù)據(jù)的長度
pbDigest: [OUT] 密碼雜湊數(shù)據(jù)緩沖區(qū)指針,當此參數(shù)為 NULL時,由 pulDigestLen 返回密碼雜湊結(jié)果的長度
--------------------特別留意這里的 [IN/OUT]
pulDigestLen: [IN/OUT] 輸入時表示 結(jié)果緩沖區(qū)的長度; 輸出時表示密碼雜湊結(jié)果的長度
### 7.6.36 多組數(shù)據(jù)密碼雜湊
(SKF_DigestUpdate, (HANDLE hHash, BYTE* pbData, ULONG ulDataLen))
功能描述:對多個分組的消息進行密碼雜湊計算。調(diào)用 SKF_DigestUpdate 之前,必須調(diào)用 SKF_DigestInit 初始化密碼雜湊計算操作; 調(diào)用 SKF_DigestUpdate 之后,必須調(diào)用 SKF_DigestFinal 結(jié)束密碼雜湊計算操作。
hHash: [IN] 密碼雜湊對象句柄
pbData: [IN] 指向消息數(shù)據(jù)的緩沖區(qū)
ulDataLen: [IN] 消息數(shù)據(jù)的長度
### 7.6.37 結(jié)束密碼雜湊
(SKF_DigestFinal, (HANDLE hHash, BYTE* pbDigest, ULONG* pulDigestLen))
功能描述:結(jié)束多個分組消息的密碼雜湊計算操作,將密碼雜湊結(jié)果保存到指定的緩沖區(qū)。
hHash: [IN] 密碼雜湊對象句柄
pbDigest: [OUT] 返回的密碼雜湊結(jié)果緩沖區(qū)指針,當此參數(shù)為 NULL時,由 pulDigestLen 返回密碼雜湊結(jié)果的長度
--------------------特別留意這里的 [IN/OUT]
pulDigestLen: [IN/OUT] 輸入時表示 結(jié)果緩沖區(qū)的長度; 輸出時表示密碼雜湊結(jié)果的長度
備注: SKF_DigestFinal 必須 用于 SKF_DigestUpdate 之后。
### 7.6.38 消息鑒別碼運算初始化
(SKF_MacInit, (HANDLE hKey, BLOCKCIPHERPARAM* pMacParam, HANDLE* phMac))
功能描述:初始化消息鑒別碼計算操作,設(shè)置計算消息鑒別碼的所需參數(shù),并返回消息鑒別碼句柄。
hKey: [IN] 計算消息鑒別碼的密鑰句柄
pMacParam: [IN] 消息認證計算相關(guān)參數(shù),包括 初始向量、初始向量長度、填充方法、反饋值的位長度
phMac: [OUT] 消息鑒別碼對象句柄
備注:消息鑒別碼計算采用分組加密算法的 CBC 模式,將加密結(jié)果的最后一塊作為計算結(jié)果。待計算數(shù)據(jù)的長度必須是分組加密算法塊長的倍數(shù),接口內(nèi)部不坐數(shù)據(jù)填充。
### 7.6.39 單組數(shù)據(jù)消息鑒別碼運算
(SKF_Mac, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen, BYTE* pbMac, ULONG* pulMacLen))
功能描述:計算單一分組數(shù)據(jù)的消息鑒別碼
hMac: [IN] 消息鑒別碼對象句柄
pbData: [IN] 指向待計算數(shù)據(jù)的緩沖區(qū)
ulDataLen: [IN] 待計算數(shù)據(jù)的長度
pbMac: [OUT] 指向計算后的 Mac結(jié)果,當此參數(shù)為 NULL時,由 pulMacLen 返回計算結(jié)果的長度
--------------------特別留意這里的 [IN/OUT]
pulMacLen: [IN/OUT] 輸入時表示 結(jié)果緩沖區(qū)的長度; 輸出時表示計算結(jié)果的長度
備注:調(diào)用 SKF_Mac 之前,必須調(diào)用 SKF_MacInit 初始化消息鑒別碼計算操作。 SKF_Mac 等價于多次調(diào)用 SKF_MacUpdate 之后再調(diào)用 SKF_MacFinal。
### 7.6.40 多組數(shù)據(jù)消息鑒別碼運算
(SKF_MacUpdate, (HANDLE hMac, BYTE* pbData, ULONG ulDataLen))
功能描述:計算多個分組數(shù)據(jù)的消息鑒別碼
hMac: [IN] 消息鑒別碼對象句柄
pbData: [IN] 指向待計算數(shù)據(jù)的緩沖區(qū)
ulDataLen: [IN] 待計算數(shù)據(jù)的長度
備注:調(diào)用 SKF_MacUpdate 之前,必須調(diào)用 SKF_MacInit 初始化消息鑒別碼計算操作;調(diào)用 SKF_MacUpdate 之后,必須調(diào)用 SKF_MacFinal 結(jié)束多個分組數(shù)據(jù)的消息鑒別碼計算操作。
### 7.6.41 結(jié)束消息鑒別碼運算 [IN/OUT]
(SKF_MacFinal, (HANDLE hMac, BYTE* pbMac, ULONG* pulMacLen))
功能描述:結(jié)束多個分組數(shù)據(jù)的消息鑒別碼計算操作
hMac: [IN] 消息鑒別碼對象句柄
pbMac: [OUT] 指向計算后的 Mac結(jié)果,當此參數(shù)為 NULL時,由 pulMacLen 返回計算結(jié)果的長度
--------------------特別留意這里的 [IN/OUT]
pulMacLen [IN/OUT] 調(diào)用時表示消息鑒別碼結(jié)果緩沖區(qū)的長度;返回時表示計算結(jié)果的長度
### 7.6.42 關(guān)閉密碼對象句柄
(SKF_CloseHandle, (HANDLE hHandle))
功能描述:關(guān)閉會話密鑰、密碼雜湊對象、消息鑒別碼對象、ECC密鑰協(xié)商等句柄
hHandle: [IN] 待關(guān)閉的句柄