sdf 测试-1-龙脉智能钥匙

news/2024/11/16 15:27:52/文章来源:https://www.cnblogs.com/20211110lyx/p/18201233

在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。
0. 根据gmt0018标准,推导sdf的接口调用模式,比如调用SDF_GenerateRandom,还应调用其他什么函数,调用顺序是什么,给出结论和推导过程。(10‘)

  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‘)

  4. 提交代码(或代码链接)和运行结果截图

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");elseprintf("查看设备信息成功!\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("生成随机数失败!");elseprintf("生成的随机数为%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,"lyxSDF");strcpy(di.DeviceName,"SDFlyx20211110");strcpy(di.DeviceSerial,"20211110");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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sdf 测试-1

在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。根据gmt0018标准,推导sdf的接口调用模式,比如调用SDF_GenerateRandom,还应调用其他什么函数,调用顺序是什么,给出结论和推导过程。(10‘) 使用龙脉智能钥匙定义一…

Spring 对于事务上的应用的详细说明

1. Spring 对于事务上的应用的详细说明 @目录1. Spring 对于事务上的应用的详细说明每博一文案2. 事务概述3. 引入事务场景3.1 第一步:准备数据库表3.2 第二步:创建包结构3.3 第三步:准备对应数据库映射的 Bean 类3.4 第四步:编写持久层3.5 第五步:编写业务层3.6 第六步:…

日常Bug排查-偶发性读数据不一致

日常Bug排查-偶发性读数据不一致 前言 日常Bug排查系列都是一些简单Bug的排查。笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材。 Bug现场 业务场景 先描述这个问题出现的业务场景。这是一个支付的场景,如果支付成功了,我们就把支付状态置为success(主单据更新)同…

多线程和多进程 - 初窥

一、说明 在平常工作中,我们使用top命令查看一台linux服务器的cpu使用情况时,会发现某个进程的cpu使用率会超过100%,这是为什么? 二、举例 实验环境为 CentOS7.6 + Python2.7 1. 多线程、多进程在操作系统中的表现形式 我们首先看两个例子,test1.py和test2.py,都是执行死…

EDP .Net开发框架--权限

EDP是一套集组织架构,权限框架【功能权限,操作权限,数据访问权限,WebApi权限】,自动化日志,动态Interface,WebApi管理等基础功能于一体的,基于.net的企业应用开发框架。通过友好的编码方式实现数据行、列权限的管控。平台下载地址:https://gitee.com/alwaysinsist/edp…

两台数据库在数据写入时性能的差异

介绍:我有两台数据库,分别称为200和203,200和203的服务器性能配置相当,203的配置甚至还要好一点。都是安装的centos7.7,oracle 19C,均已开日志归档,这两台服务器在同一个机房,同一个网段。当我在本地使用JDBC去往这两个数据库分别插入10w条记录,每插入一条提交一次,2…

【一步步开发AI运动小程序】十七、如何识别用户上传视频中的运动、动作、姿态?

【云智AI运动识别小程序插件】,可以为您的小程序,赋于人体检测识别、运动检测识别、姿态识别检测AI能力。本地原生识别引擎,内置10余个运动,无需依赖任何后台或第三方服务,有着识别速度快、体验佳、扩展性强、集成快、成本低的特点,本篇实现需要使用此插件,请先行在微信…

Mysql - 数据库时区是客户端属性还是服务端属性

一、说明 同事问我数据库的时区是客户端属性还是服务端属性,我觉得这个问题十分有意思,之前没怎么留意,自己来做下实验。 首先介绍几个术语。 GMT(Greenwich Mean Time),格林尼治平均时间。 UTC(Coordinated Universal Time),协调世界时。 CST(China Standard Time)…

sql求连续值问题

一. 找出表test1中tflag字段连续出现3次及以上为1的行思路:1. 对行进行编号,2. 对相邻三行进行求和算出值作为sumflag,3. 如果值为3,则该行以及接下来的2行都输出出来,通过自关联解决。 WITH tmp AS (SELECT tday, tflag, row_number() over(partition by null order by t…

Xming - xmanager的替代方案

一、概述 安装某些数据库的时候使用图像化还是比较方便的,但是由于服务器一般不提供图形化界面。之前一直都是使用Xmanager去导出图形,但是Xmanager是收费的,公司不让用,所以找了一款可以完美替代的产品Xming,本文将介绍xming如何安装和使用。 二、安装 1. 下载 https://s…

使用 Spacesniffer 找回 48G 系统存储空间的总结

Spacesniffer 是一个免费的文件扫描工具,操作完毕,我成功找回了 48G 的C盘空间前言Spacesniffer 是一个免费的文件扫描工具,通过使用树状图可视化布局,可以立即了解大文件夹的位置,帮助用户处理找到这些文件夹当前系统C盘空间清理后系统C盘空间下载 Spacesniffer 下载地址…

在WebGL中使用GLSL实现光线追踪

Update:git地址 https://github.com/mahiru23/raytrace 本文的根本目标是在WebGL中使用GLSL实现光线追踪,无图(懒得放了),仅供参考。 在一切开始之前,我们默认对GLSL的基本语法有所了解,不理解请自行查找。 一些需要重点关注的东西,请确认自己完全明白这一点再继续: …