实验一-密码引擎-加密API实现与测试
1 下载并查找GMT 0018-2012密码设备应用接口规范原始文档进行学习 (5分)
2 实现GMT 0018-2012密码设备应用接口规范的接口函数,至少实现:
1)设备管理中的打开设备,关闭设备,获取设备信息,产生随机数(4分)
2)密钥管理导出 ECC 签名公钥;SDF_ExportSignPublicKey_ECC I.导出 ECC加密公钥∶SDF_ExportEncPublicKey_ECC J. 产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC
K. (6分)
3)非对称算法(至少支持SM2):外部密钥 ECC验证∶SDF_ExternalVerify_ECC ,内部密钥 ECC签名;SDF_InternalSign_ECC ,内部密钥 ECC验证∶SDF_InternalVerify_ECC 外部密钥 ECC加密∶SDF_ExternalEncrypt_ECC
(8分)
4)对称算法(至少支持SM4)∶SDF_Encrypt 对称解密∶SDF_Dccrypt 计算 MAC∶SDF_CalculateMAC(6分)
5)杂凑算法(至少支持SM3):· 杂凑运算初始化∶SDF_HashInit· 多包杂凑运算∶SDF_HashUpdate· 杂凑运算结束∶SDF_HashFinal(6分)
sdf.h
#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; #define SDR_OK 0x0 /*打开设备*/ int SDF_OpenDevice( void * * phDeviceHandle); /*关闭设备*/ int SDF_CloseDevice( void * hDeviceHandle); /*获取设备信息*/ int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo) ; /*产生随机数*/ int SDF_GenerateRandom (void * hSessionHandle,unsigned int uiLength,unsigned char * pucRandom); /*Error Code */ #define SDR_OK 0x0 //操作成功 #define SDR_BASE 0x01000000 //错误码基础值 # define SDR_UNKNOWERR SDR_BASE +Ox00000001 //未知错误 #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 //创建会话失败 #endif
main.c
#include<stdio.h> #include<stdlib.h> #include "sdf.h" int main(){ void **pdh; pdh = (void **)malloc(20); int ret; ret = SDF_OpenDevice(pdh); if(ret != SDR_OK) { printf("打开设备失败! \n"); } else { printf("成功打开设备!\n"); } printf("查看设备信息\n"); DEVICEINFO a; ret = SDF_GetDeviceInfo(*pdh,&a); if(ret !=SDR_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 !=SDR_OK) printf("生成随机数失败!"); else printf("生成的随机数为%s\n",string); ret = SDF_CloseDevice(*pdh); if(ret != SDR_OK) { printf("关闭设备失败!\n"); } else { printf("成功关闭设备!\n"); } }
sdf.c
#include<stdio.h> #include <stdlib.h> #include<string.h> #include "sdf.h" #include<time.h> int SDF_OpenDevice( void * * phDeviceHandle) { return SDR_OK; } int SDF_CloseDevice( void * hDeviceHandle) { return SDR_OK; } int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo) { DEVICEINFO di; strcpy(di.IssuerName,"lu"); strcpy(di.DeviceName,"LuSDF"); strcpy(di.DeviceSerial,"20220512"); di.DeviceVersion=1; (*pstDeviceInfo)= di; return SDR_OK; } int SDF_GenerateRandom (void * hSessionHandle,unsigned int uiLength,unsigned char * pucRandom) { int i=0; char number[100]; srand(time(NULL)); number[i]=rand()%9+1+'0'; for(i=1;i<uiLength;i++) { number[i]=rand()%10+'0'; } number[uiLength]='\0'; for(i=0;i<=uiLength;i++) { *(pucRandom+i)=number[i]; } //itoa(num, pucRandom, 10); printf("pucRandom的值为%s",pucRandom); return SDR_OK; }