• 实验一密码引擎加密API实现与测试


    • 基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。
    • 本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。

    设备管理类函数

    1. 打开设备:SDF_OpenDevice
    2. 关闭设备:SDF_CloseDevice
    3. 创建会话:SDF_OpenSession
    4. 关闭会话:SDF_CloseSession
    5. 获取设备信息:SDF_GetDeviceInfo
    6. 产生随机数:SDF_GenerateRandom
    7. 获取私钥使用权限:SDF_GetPrivateKeyAccessRight
    8. 释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight

    密钥管理类函数

    1. 导出 RSA 签名公钥:SDF_ExportSignPublicKey_RSA
    2. 导出 RSA 加密公钥:SDF_ExportEncPublicKey_RSA
    3. 产生RSA非对称密钥对并输出:SDF_GenerateKeyPair_RSA
    4. 生成会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK_RSA
    5. 生成会话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_RSA
    6. 导人会话密钥并用内部RSA私钥解密:SDF_ImportKeyWithISK_RSA
    7. 基于 RSA 算法的数宇信封转换:SDF_ExchangeDigitEnvelopeBaseOnRSA
    8. 导出 ECC 签名公钥:SDF_ExportSignPublicKey_ECC
    9. 导出 ECC 加密公钥:SDF_ExportEncPublicKey_ECC
    10. 产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ECC
    11. 生成会话密钥并用内部ECC公钥加密输岀:SDF_GenerateKeyWithIPK_ECC
    12. 生成会话密钥并用外部ECC公钥加密输出:SDF_GenerateKeyWithEPK_ECC
    13. 导入会话密钥并用内部ECC私钥解密:SDFJmportKeyWithlSKJECC
    14. 生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
    15. 计算会话密钥:SDF_GenerateKey WithECC
    16. 产生协商数据并计算会话密钥:SDF_GenerateAgreementDataAndKeyWithECC
    17. 基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
    18. 生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
    19. 导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
    20. 销毁会话密钥:SDF_DestroyKey

    非对称算法运算类函数

    1. 外部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
    2. 内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
    3. 内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
    4. 外部密钥 ECC 验证:SDF_ExternalVerify_ECC
    5. 内部密钥 ECC 签名:SDF_InternalSign_ECC
    6. 内部密钥 ECC 验证:SDF_InternalVerify_ECC
    7. 外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC

    对称算法运算类函数

    1. 对称加密:SDF_Encrypt
    2. 对称解密:SDF_Decrypt
    3. 计算MAC:SDF_CalculateMAC

    杂凑运算类函数

    1. 杂凑运算初始化:SDF_HashInit
    2. 多包杂凑运算:SDF_HashUpdate
    3. 杂凑运算结束:SDF_HashFinal
    设备管理中的打开设备,关闭设备,获取设备信息,产生随机数

    mkdir sdfproject
    cd sdfproject
    mkdir src include libs docs test
    touch Makefile
    touch readme.md
    touch compile.shcd docs
    mkdir ref
    将GMT0018-2012放入ref文件夹下

    接着在include文件夹里创建一个sdf.h(可以在notepad++里写)

    #ifndef _SDF_H
    #define _SDF_H
    //定义设备信息结构
    typedef struct DeviceInfo_st{
    unsigned char IssuerName[40]; //设备生产商名称
    unsigned char DeviceName[16];
    unsigned char DeviceSerial[16];
    unsigned int DeviceVersion;
    unsigned int StandardVersion;
    unsigned int AsymAlgAbility[2];
    unsigned int SymAlgAbility;
    unsigned int HashAlgAbility;
    unsigned int BufferSize;
    }DEVICEINFO;
    
    //Error Code
    #define SDF_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_SK OPERR  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_FILES1ZEERR   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_BA3E+0x00000016  //ECC加密数据错误
    #define SDR_RANDERR  SDR_BASE+0x00000017  //随机数产生失败
    #define SDR_PRKRERR  SDR_BASE+0x00000018  //私钥使用权限获取失败
    #define SDR_MACFRR  SDR_BASE+0x00000019 //MAC运算失败
    #define SDR_FILEEXISTS   SDR_BASE+ 0x0000001A  //指定文件已存在
    #define SDR_FILEWERR  SDR_BASE+0x0000001B  //文件写入失败
    #define SDR_NORUFFER  SDR_BASE+0x0000001c  //存储空间不足
    #define SDR_INARGERR  SDR_BASE+0x0000001D  //输入参数错误
    #define SDR_OUTARGERR  SDR_BASE +0x0000001E  //输出参数错误
    
    
    //设备管理
    /*
    功能:打开密码设备
    参数:
    phDeviceHandle[out]返回设备句柄
    返回值:
    0       成功
    非0   失败,返回错误代码
    备注:
    phDeviceHandle由函数初始化并填写内容
    */
    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);
    
    
    #endif
    

    写main.c,其中调用src里定义的函数
    test/main.c

    
    #include<stdio.h>
    #include<stdlib.h>
    #include "sdf.h"
    int main(){
       void **pdh;
       pdh=(void **)malloc(20);  //给pdh分配空间
       int ret;
       ret = SDF_OpenDevice(pdh);  //返回handle的指针
    
       if(ret != SDF_OK)
       {
        printf("打开设备失败\n");
       }
       else
       {
        printf("打开设备成功!\n");
      }
       printf("查看设备信息\n");
       DEVICEINFO a;
       ret = SDF_GetDeviceInfo(*pdh,&a);
       if(ret !=SDF_OK)
               printf("查看设备信息失败!\n");
       else
               printf("查看设备信息成功!\n");
       printf("设备名字叫做%s\n",a.DeviceName);
       printf("设备版本号为%d\n",a.DeviceVersion);
       printf("想要获取的随机数长度为:\n");
       int n;
       scanf("%d",&n);
       char string[100];
       ret = SDF_GenerateRandom(*pdh,n,string);
       if(ret !=SDF_OK)
        printf("生成随机数失败!");
        else
         printf("生成的随机数为%s\n",string);
       ret = SDF_CloseDevice(*pdh);
       if(ret != SDF_OK)
       {
        printf("关闭不成功!\n");
       }
       else
       {
        printf("关闭成功!\n");
       }
    }
    
    
    

    sdf.c实现函数
    src/sdf.c

    
    #include<stdio.h>
    include <stdlib.h>
    #include<string.h>
    #include "sdf.h"
    #include<time.h>
    #include <openssl/bn.h>
    int SDF_OpenDevicevoid ** phDeviceHandle)
    {
     return SDF_OK;
    }
    int SDF_CloseDevicevoid * hDeviceHandle)
    {
     return SDF_OK;
    }
    int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo)
    {
     DEVICEINFO di;
     strcpy(di.IssuerName,"tzjSDF");
     strcpy(di.DeviceName,"SDFtzj20181212");
     strcpy(di.DeviceSerial,"20210425");
     di.DeviceVersion=1;
     (*pstDeviceInfo)= di; 
     
     return SDF_OK;
    }
    int SDF_GenerateRandom (void * hSessionHandle,unsigned int uiLength,unsigned char * pucRandom)
    {
     BIGNUM *bn;
            
            int i;
            bn = BN_new(); //生成一个BIGNUM结构
            //int bits = 20;
            int top = -1;
            int bottom = 1;
            BN_rand(bn, uiLength, top, bottom); //生成指定bits的随机数
            char *a = BN_bn2hex(bn); //转化成16进制字符串
            puts(a);
            printf("\n");
            for(i=0;*(a+i)!='\0';i++)
            {
                *(pucRandom+i)=*(a+i);
            }
            *(pucRandom+i)='\0';
            BN_free(bn); //释放BIGNUM结构
            return SDF_OK;
    }
    
    
    

    compile.sh

    gcc test/main.c src/sdf.c -o bin/test -Iinclude  -lpthread -lcrypto

    #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;

     

    //定义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;

     

    //定义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   //操作成功

     

    //*********************************

    设备管理

    //*********************************

     

    /*

    功能:打开密码设备

    参数: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 * hSession Handle, 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

  • 相关阅读:
    mmzrmo4delphi
    了解猫咪,和猫咪更好地相处
    无线分类
    压缩ASPX,替换ASPX多余的空格
    字符串编码转换Unicode>GB2312
    Make sure that the class defined in this code file matches the 'inherits' attribute, and that it extends the correct bas
    ntext、text 和 image (TransactSQL)
    ICON资源
    一个简单的优酷视频链接探测与分享功能
    表单圆角大法(无JS无图片通杀所有浏览器)
  • 原文地址:https://www.cnblogs.com/2902480848sy/p/16203186.html
Copyright © 2020-2023  润新知