20221320馮泰瑞-實驗三密碼模塊實現-4-6課時實踐過程記錄
完成gmt0018 中,對稱加密解密,非對稱加密解密,簽名驗簽,hash運算,MAC運算接口中的至少一類(至少5選1)
我選擇做簽名驗簽
連接USB設備
Ubuntu
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 096e:0321 Feitian Technologies, Inc. USB TOKEN 3000GM
接口放入sdf.h,實現內容實現 sdf.c,testsdf.c
sdf.h源代碼
#ifndef __SDF_H
#define __SDF_H
//定義設備信息結構
typedef struct DeviceInfo_st
{
unsigned char IssuerName[40]; //設備生產廠商
unsigned char DeviceName[16]; //設備型號
unsigned char DeviceSerial[16]; //設備編號,包含:日期(8字符)、批次號(3字符)、流水號(5字符)
unsigned int DeviceVersion; //密碼設備軟件的版本號
unsigned int StandardVersion; //密碼設備支持的接口規范版本號
unsigned int AsymAlgAbility[2]; //前4字節表示支持的算法,表示方法為非對稱算法標識按位或的結果;后4字節表示算法的最大模長,表示方法為支持的模長按位或的結果
unsigned int SymAlgAbility; //所有支持的對稱算法,表示方法為對稱算法標識按位或運算結果
unsigned int HashAlgAbility; //所有支持的雜湊算法,表示方法為雜湊算法標識按位或運算結果
unsigned int BufferSize; //支持的最大文件存儲空間(單位字節)
} DEVICEINFO;
//定義RSA密鑰數據結構
#define RSAref_MAX_BITS 2048
#define RSAref_MAX_LEN ((RSAref_MAX_BITS + 7) / 8)
#define RSAref_MAX_PBITS ((RSAref_MAX_BITS + 1) / 2)
#define RSAref_MAX_PLEN ((RSAref_MAX_PBITS + 7) / 8)
typedef struct RSArefPublicKey_st
{
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
} RSArefPublicKey;
typedef struct RSArefPrivateKey_st
{
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
unsigned char d[RSAref_MAX_LEN];
unsigned char prime[2][RSAref_MAX_PLEN];
unsigned char pexp[2][RSAref_MAX_PLEN];
unsigned char coef[RSAref_MAX_PLEN];
} RSArefPrivateKey;
//定義ECC密鑰數據結構
#define ECCref_MAX_BITS 512
#define ECCref_MAX_LEN ((ECCref_MAX_BITS+ 7 ) / 8)
typedef struct ECCrefPublicKey_st
{
unsigned int bits;
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
} ECCrefPublicKey;
typedef struct ECCrefPrivateKey_st
{
unsigned int bits;
unsigned char K[ECCref_MAX_LEN];
} ECCrefPrivateKey;
//定義ECC加密數據結構
typedef struct ECCCipher_st
{
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
unsigned char M[32];
unsigned int L;
unsigned char C[1];
} ECCCipher;
//定義ECC簽名數據結構
typedef struct ECCSignature_st
{
unsigned char r[ECCref_MAX_LEN];
unsigned char s[ECCref_MAX_LEN];
} ECCSignature;
typedef UINT8;
typedef UINT32;
typedef UINT32 ULONG;
typedef UINT8 BYTE;
//定義ECC公鑰數據結構
#define ECC_MAX_XCOORDINATE_BITS_LEN 512
#define ECC_MAX_YCOORDINATE_BITS_LEN 512
typedef struct Struct_ECCPUBLICKEYBLOB{
ULONG BitLen;
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_YCOORDINATE_BITS_LEN/8];
}ECCPUBLICKEYBLOB, * PECCPUBLICKEYBLOB;
//定義ECC密文數據結構
typedef struct Struct_ECCCIPHERBLOB{
BYTE XCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE YCoordinate[ECC_MAX_XCOORDINATE_BITS_LEN/8];
BYTE HASH[32];
ULONG CipherLen;
BYTE Cipher[1];
}ECCCIPHERBLOB, * PECCCIPHERBLOB;
//定義ECC加密密鑰對保護結構
typedef struct SDF_ENVELOPEDKEYBLOB
{
unsigned long ulAsymmAlgID;
unsigned long ulSymmAlgID;
ECCCIPHERBLOB ECCCipherBlob;
ECCPUBLICKEYBLOB PubKey;
unsigned char cbEncryptedPriKey[64];
} ENVELOPEDKEYBLOB, * PENVELOPEDKEYBLOB;
//Error Code
#define SDR_OK 0x0 //操作成功
#define SDR_BASE 0x01000000 //錯誤碼基礎值
#define SDR_UNKNOWERR SDR_BASE + 0x00000001 //未知錯誤
#define SDR_NOTSUPPORT SDR_BASE + 0x00000002 //不支持的接口調用
#define SDR_COMMFAIL SDR_BASE + 0x00000003 //與設備通信失敗
#define SDR_HARDFAIL SDR_BASE + 0x00000004 //運算模塊無響應
#define SDR_OPENDEVICE SDR_BASE + 0x00000005 //打開設備失敗
#define SDR_OPENSESSION SDR_BASE + 0x00000006 //創建會話失敗
#define SDR_PARDENY SDR_BASE + 0x00000007 //無私鑰使用權限
#define SDR_KEYNOTEXIST SDR_BASE + 0x00000008 //不存在的密鑰調用
#define SDR_ALGNOTSUPPORT SDR_BASE + 0x00000009 //不支持的算法調用
#define SDR_ALGMODNOTSUPPORT SDR_BASE + 0x0000000A //不支持的算法模式調用
#define SDR_PKOPERR SDR_BASE + 0x0000000B //公鑰運算失敗
#define SDR_SKOPERR SDR_BASE + 0x0000000C //私鑰運算失敗
#define SDR_SIGNERR SDR_BASE + 0x0000000D //簽名運算失敗
#define SDR_VERIFYERR SDR_BASE + 0x0000000E //驗證簽名失敗
#define SDR_SYMOPERR SDR_BASE + 0x0000000F //對稱算法運算失敗
#define SDR_STEPERR SDR_BASE + 0x00000010 //多步運算步驟錯誤
#define SDR_FILESIZEERR SDR_BASE + 0x00000011 //文件長度超出限制
#define SDR_FILENOEXIST SDR_BASE + 0x00000012 //指定的文件不存在
#define SDR_FILEOFSERR SDR_BASE + 0x00000013 //文件起始位置錯誤
#define SDR_KEYTYPEERR SDR_BASE + 0x00000014 //密鑰類型錯誤
#define SDR_KEYERR SDR BASE + 0x00000015 //密鑰錯誤
#define SDR_ENCDATAERR SDR_BASE + 0x00000016 //ECC加密數據錯誤
#define SDR_RANDERR SDR_BASE + 0x00000017 //隨機數產生失敗
#define SDR_PRKRERR SDR_BASE + 0x00000018 //私鑰使用權限獲取失敗
#define SDR_MACERR SDR_BASE + 0x00000019 //MAC運算失敗
#define SDR_FILEEXISTS SDR_BASE + 0x0000001A //指定文件已存在
#define SDR_FILEWERR SDR_BASE + 0x0000001B //文件寫入失敗
#define SDR_NOBUFFER SDR_BASE + 0x0000001C //存儲空間不足
#define SDR_INARGERR SDR_BASE + 0x0000001D //輸入參數錯誤
#define SDR_OUTARGERR SDR_BASE + 0x0000001E //輸出參數錯誤
//SDR_BASE + 0x0000001F至SDR_BASE + 0x00FFFFFF 預留
//*********************************
//設備管理
//*********************************
/*
功能:打開密碼設備
參數:phDeviceHandle[out] 返回設備句柄
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_OpenDevice(void ** phDeviceHandle);
/*
功能:關閉密碼設備,并釋放相關資源
參數:hDeviceHandle[in] 已打開的設備句柄
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_CloseDevice(void * hDeviceHandle);
/*
功能:獲取設備信息
參數:hSessionHandle[in] 與設備建立的會話句柄
pstDeviceInfo[out] 設備能力描述信息,內容及格式見設備信息定義
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo);
/*
功能:獲取指定長度的隨機數
參數:hSessionHandle[in] 與設備建立的會話句柄
uiLength[in] 欲獲取的隨機數長度
pucRandom[out] 緩沖區指針,用于存放獲取的隨機數
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_GenerateRandom (void * hSessionHandle, unsigned int uiLength,unsigned char * pucRandom);
/*
功能:導出密碼設備內部存儲的指定索引位置的簽名公鑰
參數:hSessionHandle[in] 與設備建立的會話句柄
uiKeyIndex[in] 密碼設備存儲的ECC密鑰對索引值
pucPublicKey[out] ECC公鑰結構
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_ExportSignPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey);
/*
功能:導出密碼設備內部存儲的指定索引位置的加密公鑰
參數:hSessionHandle[in] 與設備建立的會話句柄
uiKeyIndex[in] 密碼設備存儲的ECC密鑰對索引值
pucPublicKey[out] ECC公鑰結構
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_ExportEncPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey);
/*
功能:請求密碼設備產生指定類型和模長的ECC密鑰對
參數:hSessionHandle[in] 與設備建立的會話句柄
uiAlgID[in] 指定算法標識
uiKeyBits[in] 指定密鑰長度
pucPublicKey[out] ECC公鑰結構
pucPrivateKey[out] ECC私鑰結構
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_GenerateKeyPair_ECC( void * hSessionHandle,unsigned int uiAlgID,unsigned int uiKeyBits, ECCrefPublicKey * pucPublicKey,ECCrefPrivateKey * pucPrivateKey);
/*
功能:使用外部ECC公鑰對ECC簽名值進行驗證運算
參數:hSessionHandle[in] 與設備建立的會話句柄
uiAlgID[in] 算法標識,指定使用的ECC算法
pucPublicKey[in] 外部ECC公鑰結構
pucData[in] 緩沖區指針,用于存放外部輸入的數據
uiDataLength[in] 輸入的數據長度
pucSignature[in] 緩沖區指針,用于存放輸入的簽名值數據
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:輸入數據為待簽數據的雜湊值。當使用SM2算法時,該輸入數據為待簽數據經過SM2簽名預處理的結果,預處理過程見GM/T 0009。
*/
int SDF_ExternalVerify_ECC(void * hSessionHandle,unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucDataInput, unsigned int uiInputLength, ECCSignature * pucSignature);
/*
功能:使用內部ECC私鑰對數據進行簽名運算
參數:hSessionHandle[in] 與設備建立的會話句柄
uiISKIndex[in] 密碼設備內部存儲的ECC簽名私鑰的索引值
pucData[in] 緩沖區指針,用于存放外部輸入的數據
uiDataLength[in] 輸入的數據長度
pucSignature[out] 緩沖區指針,用于存放輸入的簽名值數據
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:輸入數據為待簽數據的雜湊值。當使用SM2算法時,該輸入數據為待簽數據經過SM2簽名預處理的結果,預處理過程見GM/T 0009。
*/
int SDFInternalSign_ECC(void * hSessionHandle, unsigned int uiISKIndex, unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature);
/*
功能:使用內部ECC公鑰對ECC簽名值進行驗證運算
參數:hSessionHandle[in] 與設備建立的會話句柄
uiISKIndex[in] 密碼設備內部存儲的ECC簽名私鑰的索引值
pucData[in] 緩沖區指針,用于存放外部輸入的數據
uiDataLength[in] 輸入的數據長度
pucSignature[out] 緩沖區指針,用于存放輸入的簽名值數據
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:輸入數據為待簽數據的雜湊值。當使用SM2算法時,該輸入數據為待簽數據經過SM2簽名預處理的結果,預處理過程見GM/T 0009。
*/
int SDF_InternalVerify_ECC(void * hSessionHandle,unsigned int uiISKIndex,unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature);
/*
功能:使用外部ECC公鑰對數據進行加密運算
參數:hSessionHandle[in] 與設備建立的會話句柄
uiAlgID[in] 算法標識,指定使用的ECC算法
pucPublicKey[in] 外部ECC公鑰結構
pucData[in] 緩沖區指針,用于存放外部輸入的數據
uiDataLength[in] 輸入的數據長度
pucEncData[out] 緩沖區指針,用于存放輸出的數據密文
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_ExternalEncrypt_ECC(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucData, unsigned int uiDataLength, ECCCipher * pucEncData);
/*
功能:使用指定的密鑰句柄和IV對數據進行對稱加密運算
參數:hSessionHandle[in] 與設備建立的會話句柄
hKeyHandle[in] 指定的密鑰句柄
uiAlgID[in] 算法標識,指定對稱加密算法
pucIV[in|out] 緩沖區指針,用于存放輸入和返回的IV數據
pucData[in] 緩沖區指針,用于存放輸入的數據明文
uiDataLength[in] 輸入的數據明文長度
pucEncData[out] 緩沖區指針,用于存放輸出的數據密文
puiEncDataLength[out] 輸出的數據密文長度
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:此函數不對數據進行填充處理,輸入的數據必須是指定算法分組長度的整數倍
*/
int SDF_Encrypt(void * hSessionHandle,void * hKeyHandle,unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength , unsigned char * pucEncData,unsigned int * puiEncDataLength);
/*
功能:使用指定的密鑰句柄和IV對數據進行對稱解密運算
參數:hSessionHandle[in] 與設備建立的會話句柄
hKeyHandle[in] 指定的密鑰句柄
uiAlgID[in] 算法標識,指定對稱加密算法
pucIV[in|out] 緩沖區指針,用于存放輸入和返回的IV數據
pucEncData[in] 緩沖區指針,用于存放輸入的數據明文
uiEncDataLength[in] 輸入的數據明文長度
pucData[out] 緩沖區指針,用于存放輸出的數據密文
puiDataLength[out] 輸出的數據密文長度
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:此函數不對數據進行填充處理,輸入的數據必須是指定算法分組長度的整數倍
*/
int SDF_Decrypt (void * hSessionHandle, void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV,unsigned char * pucEncData, unsigned int uiEncDataLength, unsigned char * pucData, unsigned int * puiDataLength);
/*
功能:使用指定的密鑰句柄和IV對數據進行MAC運算
參數:hSessionHandle[in] 與設備建立的會話句柄
hKeyHandle[in] 指定的密鑰句柄
uiAlgID[in] 算法標識,指定對稱加密算法
pucIV[in|out] 緩沖區指針,用于存放輸入和返回的IV數據
pucData[in] 緩沖區指針,用于存放輸出的數據明文
uiDataLength[in] 輸入的數據明文長度
pucMAC[out] 緩沖區指針,用于存放輸出的MAC值
puiMACLength[out] 輸出的MAC值長度
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:此函數不對數據進行分包處理,多包數據MAC運算由IV控制最后的MAC值
*/
int SDF_CalculateMAC(void * hSessionHandle,void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength ,unsigned char * pucMAC, unsigned int * puiMACLength);
/*
功能:三步式數據雜湊運算第一步,雜湊運算初始化
參數:hSessionHandle[in] 與設備建立的會話句柄
uiAlgID[in] 指定雜湊算法標識
pucPublicKey[in] 簽名者公鑰。當uiAlgID為SGD_SM3時有效。
pucID[in] 簽名者的ID值,當uiAlgID為SGD_SM3時有效。
uiIDLength[in] 簽名者ID的長度,當uiAlgID為SGD.SM3時有效。
返回值:0 成功
非0 失敗,返回錯誤代碼
備注:uiIDLength非零且uiAlgID為SGD_SM3時,函數執行SM2的預處理1操作。計算過程見GM/T 0009。
*/
int SDF_HashInit(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey,unsigned char * pucID, unsigned int uiIDLength);
/*
功能:三步式數據雜湊運算第二步,對輸入的明文進行雜湊運算
參數:hSessionHandle[in] 與設備建立的會話句柄
pucData[in] 緩沖區指針,用于存放輸入的數據明文
uiDataLength[in] 輸入的數據明文長度
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_HashUpdate(void * hSessionHandle,unsigned char * pucData,unsigned int uiDataLength);
/*
功能:三步式數據雜湊運算第三步,雜湊運算結束返回雜湊數據并清除中間數據
參數:hSessionHandle[in] 與設備建立的會話句柄
pucHash[out] 緩沖區指針,用于存放輸出的雜湊數據
puiHashLength[out] 返回的雜湊數據長度
返回值:0 成功
非0 失敗,返回錯誤代碼
*/
int SDF_HashFinal (void * hSessionHandle,unsigned char * pucHash,unsigned int * puiHashLength);
#endif
sdf.c源代碼
#include "sdf.h"
int SDF_OpenDevice(void ** phDeviceHandle)
{
return SDR_OK;
}
int SDF_CloseDevice(void * hDeviceHandle)
{
return SDR_OK;
}
int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo)
{
return SDR_OK;
}
int SDF_GenerateRandom (void * hSessionHandle, unsigned int uiLength,unsigned char * pucRandom)
{
return SDR_OK;
}
int SDF_ExportSignPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey)
{
return SDR_OK;
}
int SDF_ExportEncPublicKey_ECC(void * hSessionHandle,unsigned int uiKeyIndex,ECCrefPublicKey * pucPublicKey)
{
return SDR_OK;
}
int SDF_GenerateKeyPair_ECC( void * hSessionHandle,unsigned int uiAlgID,unsigned int uiKeyBits, ECCrefPublicKey * pucPublicKey,ECCrefPrivateKey * pucPrivateKey)
{
return SDR_OK;
}
int SDF_ExternalVerify_ECC(void * hSessionHandle,unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucDataInput, unsigned int uiInputLength, ECCSignature * pucSignature)
{
return SDR_OK;
}
int SDFInternalSign_ECC(void * hSessionHandle, unsigned int uiISKIndex, unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature)
{
return SDR_OK;
}
int SDF_InternalVerify_ECC(void * hSessionHandle,unsigned int uiISKIndex,unsigned char * pucData,unsigned int uiDataLength, ECCSignature * pucSignature)
{
return SDR_OK;
}
int SDF_ExternalEncrypt_ECC(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey, unsigned char * pucData, unsigned int uiDataLength, ECCCipher * pucEncData)
{
return SDR_OK;
}
int SDF_Encrypt(void * hSessionHandle,void * hKeyHandle,unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength, unsigned char * pucEncData,unsigned int * puiEncDataLength)
{
return SDR_OK;
}
int SDF_Decrypt (void * hSessionHandle, void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV,unsigned char * pucEncData, unsigned int uiEncDataLength, unsigned char * pucData, unsigned int * puiDataLength)
{
return SDR_OK;
}
int SDF_CalculateMAC(void * hSessionHandle,void * hKeyHandle, unsigned int uiAlgID, unsigned char * pucIV, unsigned char * pucData, unsigned int uiDataLength,unsigned char * pucMAC, unsigned int * puiMACLength)
{
return SDR_OK;
}
int SDF_HashInit(void * hSessionHandle, unsigned int uiAlgID,ECCrefPublicKey * pucPublicKey,unsigned char * pucID, unsigned int uiIDLength)
{
return SDR_OK;
}
int SDF_HashUpdate(void * hSessionHandle,unsigned char * pucData,unsigned int uiDataLength)
{
return SDR_OK;
}
int SDF_HashFinal (void * hSessionHandle,unsigned char * pucHash,unsigned int * puiHashLength)
{
return SDR_OK;
}
sdftest.c源代碼
#include "sdf.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
void **pdh;
pdh = (void **)malloc(20);
int ret;
ret = SDF_OpenDevice(pdh);
if (ret != SDR_OK)
{
printf("OpenDevice Failed!\n");
}
else
{
printf("OpenDevice Successed!\n");
}
DEVICEINFO a;
ret = SDF_GetDeviceInfo(*pdh, &a);
if (ret != SDR_OK)
{
printf("GetDeviceInfo Failed!\n");
}
else
{
printf("GetDeviceInfo Successed!\n");
printf("DeviceName:%s\n", a.DeviceName);
printf("DeviceVersion:%d\n", a.DeviceVersion);
}
// 簽名和驗簽示例
unsigned char data[] = "Hello, World!";
unsigned int dataLength = strlen((char *)data);
ECCSignature signature;
unsigned char publicKey[ECCref_MAX_LEN * 2]; // 假設公鑰長度為ECCref_MAX_LEN * 2
unsigned char privateKey[ECCref_MAX_LEN]; // 假設私鑰長度為ECCref_MAX_LEN
// 簽名
ret = SDFInternalSign_ECC(*pdh, 0, data, dataLength, &signature);
if (ret != SDR_OK)
{
printf("Sign Failed!\n");
}
else
{
printf("Sign Successed!\n");
}
// 驗簽
ret = SDF_InternalVerify_ECC(*pdh, 0, data, dataLength, &signature);
if (ret != SDR_OK)
{
printf("Verify Failed!\n");
}
else
{
printf("Verify Successed!\n");
}
ret = SDF_CloseDevice(*pdh);
if (ret != SDR_OK)
{
printf("CloseDevice Failed!\n");
}
else
{
printf("CloseDevice Successed!\n");
}
free(pdh);
return 0;
}
運行結果
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ gcc -o testsdf sdf.c testsdf.c -lgmssl
In file included from sdf.c:3:
sdf.h:71:9: warning: type defaults to ‘int’ in declaration of ‘UINT8’ [-Wimplicit-int]
71 | typedef UINT8;
| ^~~~~
sdf.h:72:9: warning: type defaults to ‘int’ in declaration of ‘UINT32’ [-Wimplicit-int]
72 | typedef UINT32;
| ^~~~~~
In file included from testsdf.c:1:
sdf.h:71:9: warning: type defaults to ‘int’ in declaration of ‘UINT8’ [-Wimplicit-int]
71 | typedef UINT8;
| ^~~~~
sdf.h:72:9: warning: type defaults to ‘int’ in declaration of ‘UINT32’ [-Wimplicit-int]
72 | typedef UINT32;
| ^~~~~~
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ ./testsdf
OpenDevice Successed!
GetDeviceInfo Successed!
DeviceName:
DeviceVersion:0
Sign Successed!
Verify Successed!
CloseDevice Successed!
git commit
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ git add sdf.c sdf.h testsdf testsdf.c
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ git commit -m "gmt0018SM2qianmingyanqian"
[master 3d417b4] gmt0018SM2qianmingyanqian
4 files changed, 490 insertions(+), 38 deletions(-)
rewrite ch06/sdftest/src/sdf.c (83%)
create mode 100644 ch06/sdftest/src/sdf.h
create mode 100755 ch06/sdftest/src/testsdf
rewrite ch06/sdftest/src/testsdf.c (89%)
fengtairui@fengtairui-virtual-machine:~/bestidiocs2024/ch06/sdftest/src$ git log
commit 3d417b4e6f14fdd83d61192b6bddd37f36e4a0b3 (HEAD -> master)
Author: fengtairui <1978274655@qq.com>
Date: Sun Nov 24 21:53:12 2024 +0800
gmt0018SM2qianmingyanqian
Git庫鏈接
馮泰瑞/Information Security Design