sdf 测试-1-龙脉智能钥匙
- 根据gmt0018标准,推导sdf的接口调用模式,比如调用SDF_GenerateRandom,还应调用其他什么函数,调用顺序是什么,给出结论和推导过程。(10‘)
- 具体要求
- 代码截图:
- 运行截图
- 具体代码
- ifndef _SDF_H
- define _SDF_H
- 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 //输出参数错误
- endif
- include<stdio.h>
- include<stdlib.h>
- include"sdf.h"
- include<stdio.h>
- include<stdlib.h>
- include<string.h>
- include"sdf.h"
- include<time.h>
- include<openssl/bn.h>
根据gmt0018标准,推导sdf的接口调用模式,比如调用SDF_GenerateRandom,还应调用其他什么函数,调用顺序是什么,给出结论和推导过程。(10‘)
根据GMT 0018 标准,SDF_GenerateRandom
是一个用于生成随机数的接口函数。在密码设备上使用这类接口一般需要遵循特定的顺序和规则,例如:
-
设备初始化:一般会有一个设备初始化函数,如
SDF_OpenDevice
或SDF_OpenSession
,用于连接密码设备并开始一个会话。 -
生成随机数:调用
SDF_GenerateRandom
来生成所需长度的随机数。 -
清理和结束会话:一旦你完成了操作,通常需要调用结束会话的函数,如
SDF_CloseDevice
或SDF_CloseSession
,来释放资源。
因此,使用 SDF_GenerateRandom
接口调用的顺序大致如下:
SDF_OpenDevice
/SDF_OpenSession
SDF_GenerateRandom
SDF_CloseDevice
/SDF_CloseSession
具体的调用可能不限于这些接口,并且可能根据使用的密码设备和技术要求包含其他函数。例如,如果在多线程环境中或者需要管理密钥,可能还需要涉及到线程的初始化和同步,密钥的加载或者创建等。
下面是一个简化的示例流程:
// 假设需要的头文件和库已正确引入
// 定义变量,保存随机数等
unsigned char * randomData = NULL;
int randomDataLen = 256; // 假设我们需要生成256字节的随机数
int deviceHandle;
int sessionHandle;
int ret;
// 初始化设备和会话
ret = SDF_OpenDevice(&deviceHandle);
if (ret != SDF_SUCCESS) {
// 错误处理
}
ret = SDF_OpenSession(deviceHandle, &sessionHandle);
if (ret != SDF_SUCCESS) {
// 错误处理
}
// 分配存储随机数的空间
randomData = malloc(randomDataLen);
if (randomData == NULL) {
// 错误处理
}
// 生成随机数
ret = SDF_GenerateRandom(sessionHandle, randomDataLen, randomData);
if (ret != SDF_SUCCESS) {
// 错误处理
}
// 使用生成的随机数
// ...
// 结束会话并关闭设备
ret = SDF_CloseSession(sessionHandle);
if (ret != SDF_SUCCESS) {
// 错误处理
}
ret = SDF_CloseDevice(deviceHandle);
if (ret != SDF_SUCCESS) {
// 错误处理
}
// 清理资源
free(randomData);
具体要求
1.使用龙脉智能钥匙定义一个私有函数 static int getRandom(char *r, int length), 获取length个字节的随机数(5‘)
2. 把上述函数集成到src中的sdf.c中的SDF_GenerateRandom中(5')
3. 在test中的main.c调用SDF_GenerateRandom进行测试,至少测试1个字节,5个字节,20个字节三种情况。(5‘)
代码截图:
main.c
sdf.h
sdf.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];
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
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
include<stdio.h>
include<stdlib.h>
include<string.h>
include"sdf.h"
include<time.h>
include<openssl/bn.h>
int SDF_OpenDevice( void ** phDeviceHandle)
{
return SDF_OK;
}
int SDF_CloseDevice( void * hDeviceHandle)
{
return SDF_OK;
}
int SDF_GetDeviceInfo(void * hSessionHandle,DEVICEINFO * pstDeviceInfo)
{
DEVICEINFO di;
strcpy(di.IssuerName,"hzxSDF");
strcpy(di.DeviceName,"SDFhzx20201310");
strcpy(di.DeviceSerial,"20221026");
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;
}
”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述