SmartAudio/lichee/brandy/pack_tools/update_signature/rsa.c

172 lines
3.8 KiB
C
Raw Normal View History

2018-07-13 01:31:50 +00:00
/*
* (C) Copyright 2012
* wangflord@allwinnertech.com
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program;
*
*/
/*
A. <EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD>
1. <EFBFBD><EFBFBD>Կ<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD>
1) <EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>*<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2) <EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>صĴ<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD><EFBFBD><EFBFBD><EFBFBD>E<M<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>ʹD<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>1 MOD M<EFBFBD><EFBFBD>
3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ(<EFBFBD><EFBFBD>Կ)<EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ(˽Կ)<EFBFBD><EFBFBD>
2. <EFBFBD><EFBFBD><EFBFBD>ܵIJ<EFBFBD><EFBFBD><EFBFBD>
1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tn1<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>0x012A05<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>tn1<EFBFBD><EFBFBD>4
2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>tn1λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD>Ŀÿ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊbn<EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>ÿ<EFBFBD>С<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>
3) <EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD>Ai<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bi<EFBFBD><EFBFBD>Ai^E MOD N<EFBFBD><EFBFBD><EFBFBD>Bi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>
3. <EFBFBD><EFBFBD><EFBFBD>ܵIJ<EFBFBD><EFBFBD><EFBFBD>
1) ͬ<EFBFBD><EFBFBD><EFBFBD>ܵĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>tnλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD>Ŀÿ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊbn<EFBFBD><EFBFBD>
3) <EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD>Bi<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ci<EFBFBD><EFBFBD>Bi^D MOD N<EFBFBD><EFBFBD><EFBFBD>Ci<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>
*/
#include "signature.h"
void rsa_dump(void);
typedef struct public_key_pairs_t
{
unsigned public_key; // e
unsigned divider; // n
}
public_key_pairs;
typedef struct private_key_pairs_t
{
unsigned private_key; // d
unsigned divider; // n
}
private_key_pairs;
#define P (127)
#define Q (401)
#define N ((P) * (Q))
#define M ((P-1) * (Q-1))
#define E (53)
public_key_pairs pblc_keys;
private_key_pairs prvt_keys;
static unsigned probe_gcd(unsigned divdend, unsigned divder)
{
unsigned ret = divdend % divder;
while(ret)
{
divdend = divder;
divder = ret;
ret = divdend % divder;
}
return divder;
}
unsigned probe_high_level_power_mod(unsigned base_value, unsigned power, unsigned divider)
{
unsigned ret = 1;
base_value %= divider;
while(power > 0)
{
if(power & 1)
{
ret = (ret * base_value) % divider;
}
power /= 2;
base_value = (base_value * base_value) % divider;
}
return ret;
}
unsigned rsa_init(void)
{
unsigned k;
unsigned product;
unsigned m_value;
m_value = M;
k = 1;
if(probe_gcd(m_value, E) == 1) //e,M<><4D><EFBFBD><EFBFBD>
{
do
{
product = M * k + 1;
if(!(product % E))
{
pblc_keys.public_key = E;
pblc_keys.divider = N;
prvt_keys.private_key = product/E;
prvt_keys.divider = N;
#ifdef DEBUG_MODE
rsa_dump();
#endif
return 0;
}
k ++;
}
while(1);
}
return -1;
}
void rsa_dump(void)
{
printf("base value\n");
printf("M = %d(%d * %d), N = %d(%d * %d)\n", M, P-1, Q-1, N, P, Q);
printf("public key: \n");
printf("{e, n} = %d, %d\n", pblc_keys.public_key, pblc_keys.divider);
printf("private key: \n");
printf("{d, n} = %d, %d\n", prvt_keys.private_key, prvt_keys.divider);
}
void rsa_encrypt( unsigned *input, unsigned int length, unsigned *output )
{
unsigned int i;
for(i=0;i<length;i++)
{
debug("rsa_encrypt %d start\n", i);
output[i] = probe_high_level_power_mod(input[i], pblc_keys.public_key, pblc_keys.divider);
debug("rsa_encrypt %d end\n", i);
}
return ;
}
void rsa_decrypt( unsigned *input, unsigned int length, unsigned *output )
{
unsigned int i;
for(i=0;i<length;i++)
{
output[i] = probe_high_level_power_mod(input[i], prvt_keys.private_key, prvt_keys.divider);
}
return ;
}