133 lines
3.3 KiB
C
Executable File
133 lines
3.3 KiB
C
Executable File
/*
|
|
**********************************************************************************************************************
|
|
* 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;
|
|
}
|
|
|
|
|