<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      20221320馮泰瑞-實驗三密碼模塊實現-4-6課時實踐過程記錄

      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

      posted @ 2025-01-27 18:14  20221320馮泰瑞  閱讀(45)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美精品在线观看| 久久se精品一区精品二区国产| 亚洲综合一区国产精品| 亚洲国产精品老熟女乱码| 久久久无码精品国产一区| 亚洲AV无码不卡在线播放| 一本色道久久加勒比综合| 国产毛片子一区二区三区| 深夜免费av在线观看| 性按摩玩人妻hd中文字幕| 亚洲国产精品综合久久网络| 免费人妻无码不卡中文18禁| 宾馆人妻4P互换视频| 国产精品亚洲综合第一页| 日韩精品人妻av一区二区三区| 久久综合亚洲鲁鲁九月天| 日本熟妇色xxxxx| 西青区| 欧美老少配性行为| 九九热在线视频观看最新| 视频一区二区不中文字幕| 亚洲av无码精品色午夜蛋壳| 亚洲岛国av一区二区| 亚洲精品第一区二区三区| 男女扒开双腿猛进入爽爽免费看| 亚洲国产成熟视频在线多多 | 真实国产老熟女无套中出| 国产区成人精品视频| 欧美性猛交xxxx富婆| 国产三级精品片| 少妇伦子伦情品无吗| 久草热大美女黄色片免费看| 中文字幕免费一二三区乱码| 亚洲色最新高清AV网站| 日韩精品一区二区三区激情视频| 毕节市| 国产果冻豆传媒麻婆精东| 亚洲AV无码国产成人久久强迫| 日韩深夜视频在线观看| 久久国产精品第一区二区| 高清有码国产一区二区|