课上测试

代码如下:

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;

}

posted @ 2022-04-28 14:11  20191231  阅读(68)  评论(0编辑  收藏  举报