在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
使用OpenSSL定义一个私有函数 static int getRandom(char *r, int length), 获取length个字节的随机数(5‘)
把上述函数集成到src中的sdf.c中的SDF_GenerateRandom中(5')
在test中的main.c调用SDF_GenerateRandom进行测试,至少测试1个字节,5个字节,20个字节三种情况。(5‘)
提交代码(或代码链接)和运行结果截图

- 截图

代码:
- 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 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
#define SDR_RANDERR SDR_BASE+0x00000017
#define SDR_PRKRERR SDR_BASE+0x00000018
#define SDR_MACFRR SDR_BASE+0x00000019
#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
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);
#endif
#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 != 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");
}
}
#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();
int top = -1;
int bottom = 1;
BN_rand(bn, uiLength, top, bottom);
char *a = BN_bn2hex(bn);
puts(a);
printf("\n");
for(i=0;*(a+i)!='\0';i++)
{
*(pucRandom+i)=*(a+i);
}
*(pucRandom+i)='\0';
BN_free(bn);
return SDF_OK;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了