课上测试
代码如下:
sdf.c
include "sdf.h"
include <string.h>
include <time.h>
include <stdlib.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,"RocSDF");
strcpy(di.DeviceName,"SDFBESTI181x");
strcpy(di.DeviceSerial,"2021040001");
di.DeviceVersion = 1;
//...
//pstDevicelnfo = &di;
*pstDeviceInfo = di;
return SDR_OK;
}
static int getRandom(unsigned char *r, int length){
int ret;
ret=RAND_bytes(r, length);
return ret;
}
int SDF_GenerateRandom (void * hSessionHandle, unsigned int uiLength, unsigned char * pucRandom){
int ret;
getRandom(pucRandom, uiLength);
return SDR_OK;
}
/*
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){
EVP_CIPHER_CTX ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,type,NULL,NULL,NULL);
EVP_CIPHER_CTX_rand_key(ctx,SM4Key);
switch (uiAlgID)
{
case 0x00000401:
SM4_decrypt(EVP_sm4_ecb(),argv[5],argv[6]);
}else if(uiAlgID == 0x00000402){
SM4_decrypt(EVP_sm4_cbc(),argv[5],argv[6]);
}else if(uiAlgID == 0x00000404){
SM4_decrypt(EVP_sm4_cfb(),argv[5],argv[6]);
}else if(uiAlgID == 0x00000408){
SM4_decrypt(EVP_sm4_ofb(),argv[5],argv[6]);
}else{
printf("usage: ./a.out cbc -d -K aaaaaaaaaaaaaa infile outfile");
printf("没有%s解密模式\n",argv[1]);
return 1;
}/
/*
int SM4_encrypt(const EVP_CIPHER *type,const char *filename,const char *outfilename)
{
FILE *fp1 = fopen(filename,"rb");
FILE *fp2 = fopen(outfilename,"wb");
//初始化
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,type,NULL,NULL,NULL);
//随机生成密钥
EVP_CIPHER_CTX_rand_key(ctx,SM4Key);
//判断模式
unsigned char iv[IV_LEN];
if(type != EVP_sm4_ecb()){
//随机iv模式
EVP_CIPHER_CTX_rand_key(ctx,iv);
EVP_EncryptInit_ex(ctx,type,NULL,SM4Key,iv);
//先在密文头部写入16字节的iv
fwrite(iv,1,IV_LEN,fp2);
ifdef DEBUG
printf("iv: ");
for(int i=0;i<IV_LEN;i++){
printf("%02x",iv[i]);
}
printf("\n");
endif
}else{
EVP_EncryptInit_ex(ctx,type,NULL,SM4Key,NULL);
}
//读取明文,写入密文
unsigned char inbuf[1024] = {0};
unsigned char outbuf[4096] = {0};
int outlen;
int inlen = 0;
while((inlen = fread(inbuf,1,sizeof(inbuf),fp1))){
EVP_EncryptUpdate(ctx,outbuf,&outlen,inbuf,inlen);
fwrite(outbuf,1,outlen,fp2);
fflush(fp2);
}
int finlen;
EVP_EncryptFinal_ex(ctx,outbuf,&finlen);
fwrite(outbuf,1,finlen,fp2);
fflush(fp2);
fclose(fp1);
fclose(fp2);
EVP_CIPHER_CTX_cleanup(ctx);
return 1;
}
*/
/*int SM4_decrypt(const EVP_CIPHER *type,const char *filename,const char *outfilename)
{
FILE *fp1 = fopen(filename,"rb");
FILE *fp2 = fopen(outfilename,"wb");
//上下文初始化
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
//读出iv,解密初始化
unsigned char iv[IV_LEN];
if(type != EVP_sm4_ecb()){
fread(iv,1,IV_LEN,fp1);
EVP_DecryptInit_ex(ctx,type,NULL,SM4Key,iv);
}else{
EVP_DecryptInit_ex(ctx,type,NULL,SM4Key,NULL);
}
//读写输入文件,输出文件
unsigned char inbuf[1024] = {0};
unsigned char outbuf[4096] = {0};
int outlen;
int inlen = 0;
while((inlen = fread(inbuf,1,sizeof(inbuf),fp1))){
// printf("inlen = %d\n",inlen);
EVP_DecryptUpdate(ctx,outbuf,&outlen,inbuf,inlen);
fwrite(outbuf,1,outlen,fp2);
fflush(fp2);
}
int finlen;
EVP_DecryptFinal_ex(ctx,outbuf,&finlen);
fwrite(outbuf,1,finlen,fp2);
fflush(fp2);
fclose(fp1);
fclose(fp2);
EVP_CIPHER_CTX_cleanup(ctx);
return 1;
}*/
main.c
include "sdf.h"
include <stdio.h>
include <stdlib.h>
int main(){
void ** pdh;
pdh = (void **) malloc(20);
int ret;
/*ret = SDF_OpenDevice(pdh);
if(ret != SDR_OK){
printf("error!");
} else {
printf("device opened!\n");
}
DEVICEINFO testdi;
ret = SDF_GetDeviceInfo(pdh, &testdi);
if(ret != SDR_OK){
printf("error!");
} else {
printf("Issuer Name: %s\n", testdi.IssuerName);
printf("Device Name: %s\n", testdi.DeviceName);
printf("Device Serial: %s\n", testdi.DeviceSerial);
printf("Device Version: %d\n", testdi.DeviceVersion);
}*/
unsigned int n;
unsigned char pRandom[10017];
scanf("%d", &n);
ret = SDF_GenerateRandom(*pdh, n, pRandom);
if(ret != SDR_OK){
printf("error!");
} else {
for(int i=0; i<n; i++)
printf("%02x", pRandom[i]);
}
printf("\n");
ret = SDF_CloseDevice(*pdh);
/*if(ret != SDR_OK){
printf("error!");
} else {
free(pdh);
printf("device closed!\n");
}*/
return 0;
}