SmartAudio/lichee/brandy/pack_tools/openssl_signature/openssl.c

133 lines
3.3 KiB
C
Raw Normal View History

2018-07-13 01:31:50 +00:00
/*
**********************************************************************************************************************
* eGon
* the Embedded GO-ON Bootloader System
* eGON arm boot sub-system
*
* Copyright(C), 2006-2014, Allwinner Technology Co., Ltd.
* All Rights Reserved
*
* File :
*
* By : Jerry
*
* Version : V2.00
*
* Date :
*
* Descript:
**********************************************************************************************************************
*/
#include "common.h"
/*
************************************************************************************************************
*
* function
*
* name :
*
* parmeters :
*
* return :
*
* note :
*
*
************************************************************************************************************
*/
int sunxi_rsa_publickey_decrypt(char *source_str, char *decryped_data, int data_bytes, char *key_path)
{
RSA *p_rsa;
FILE *file;
int rsa_len, ret=-1;
char fullname[MAX_PATH];
memset(fullname, 0, MAX_PATH);
sunxi_GetFullPath(fullname, key_path);
if((file=fopen(fullname,"r"))==NULL)
{
printf("open key file error\n");
return -1;
}
if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL)
{
printf("unable to get public key\n");
goto __sunxi_rsa_publickey_decrypt_err;
}
rsa_len=RSA_size(p_rsa);
ret = RSA_public_decrypt(rsa_len,(unsigned char *)source_str, (unsigned char*)decryped_data, p_rsa, RSA_NO_PADDING);
__sunxi_rsa_publickey_decrypt_err:
RSA_free(p_rsa);
fclose(file);
return ret;
}
/*
************************************************************************************************************
*
* function
*
* name :
*
* parmeters :
*
* return :
*
* note :
*
*
************************************************************************************************************
*/
int sunxi_rsa_privatekey_encrypt(char *source_str, char *encryped_data, int data_bytes, char *key_path)
{
RSA *p_rsa;
FILE *file;
int rsa_len, ret=-1;
char fullname[MAX_PATH];
memset(fullname, 0, MAX_PATH);
sunxi_GetFullPath(fullname, key_path);
sunxi_dbg("%s %s %d: keyname=%s\n", __FILE__, __func__, __LINE__, fullname);
if((file=fopen(fullname,"r"))==NULL)
{
printf("open key file error\n");
return -1;
}
if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL)
{
printf("unable to get private key\n");
goto __sunxi_rsa_privatekey_encrypt_err;
}
sunxi_dbg("data bytes %d\n", data_bytes);
rsa_len=RSA_size(p_rsa);
sunxi_dbg("rsa_len=%d\n", rsa_len);
ret = RSA_private_encrypt(rsa_len,(unsigned char *)source_str,(unsigned char*)encryped_data,p_rsa,RSA_NO_PADDING);
sunxi_dbg("encrypt ret=%d\n", ret);
#ifdef _DEBUG
if(ret >= 0)
{
sunxi_dbg("begin dump\n");
sunxi_dump(encryped_data, 2048/8);
sunxi_dbg("finish dump\n");
}
#endif
__sunxi_rsa_privatekey_encrypt_err:
RSA_free(p_rsa);
fclose(file);
return ret;
}