📄 map57.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "openssl/bn.h"
BIGNUM *bn_glb0, *bn_glb1, *bn_glb3, *bn_glb5, *bn_glb6, *bn_glb7;
BIGNUM *bn_glb_a, *bn_glb_b, *bn_glb_c, *bn_glb_d, *bn_glb_e, *bn_glb_f, *bn_glb_g;
BIGNUM *bn_glb_h, *bn_glb_i, *bn_glb_j, *bn_glb_k, *bn_glb_l, *bn_glb_m;
BIGNUM *glb2pow128, *mask128, *glb2pow64, *mask64;
BN_CTX *t1;
static void RotateBytes(unsigned char *in, int n)
{
// loop is executed atleast once, so it's not a good idea to
// call with n=0 !!
unsigned char *e=in+n-1;
do {
unsigned char temp=*in;
*in++=*e;
*e-- =temp;
} while(in<e);
}
void printx(BIGNUM *bn) {
unsigned char data[256];
int i, len;
memset(data, 0, 256);
len = BN_bn2bin(bn, data);
if(len)
RotateBytes(data, len);
for(i = 0; i < len; i+=4) {
if(i != 0 && i%4 == 0)
printf(" ");
printf("0x%08x", *(unsigned int *)(&data[i]));
}
printf("\n");
}
static char *bn2str(char *str, BIGNUM *bn) {
unsigned char data[256];
int i, len;
memset(data, 0, 256);
len = BN_bn2bin(bn, data);
if(len)
RotateBytes(data, len);
str[0]=0;
for(i = 0; i < 16; i+=4) {
if(i != 0 && i%4 == 0)
sprintf(str, "%s ", str);
sprintf(str, "%s%08x", str, *(unsigned int *)(&data[i]));
}
return str;
}
static void dump_emu(char *str) {
char data[80], data1[80];
printf("%s:\n", str);
printf("0:%s e:%s\n", bn2str(data, bn_glb0), bn2str(data1, bn_glb_e));
printf("1:%s f:%s\n", bn2str(data, bn_glb1), bn2str(data1, bn_glb_f));
printf("3:%s g:%s\n", bn2str(data, bn_glb3), bn2str(data1, bn_glb_g));
printf("5:%s h:%s\n", bn2str(data, bn_glb5), bn2str(data1, bn_glb_h));
printf("6:%s i:%s\n", bn2str(data, bn_glb6), bn2str(data1, bn_glb_i));
printf("7:%s j:%s\n", bn2str(data, bn_glb7), bn2str(data1, bn_glb_j));
printf("a:%s k:%s\n", bn2str(data, bn_glb_a), bn2str(data1, bn_glb_k));
printf("b:%s l:%s\n", bn2str(data, bn_glb_b), bn2str(data1, bn_glb_l));
printf("c:%s m:%s\n", bn2str(data, bn_glb_c), bn2str(data1, bn_glb_m));
printf("d:%s\n", bn2str(data, bn_glb_d));
}
mod_add(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3, BIGNUM *arg4)
{
BN_add(arg1, arg2, arg3);
if(BN_cmp(arg1, arg4) >= 0) {
BN_sub(arg1, arg1, arg4);
}
BN_mask_bits(arg1, 128);
}
bn_cmplx1(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5)
{
int j;
BIGNUM *var44, *var64, *var84, *vara4;
var44 = BN_new();
var64 = BN_new();
var84 = BN_new();
vara4 = BN_new();
BN_copy(var44, arg2);
BN_copy(var64, arg3);
BN_clear(vara4);
for(j=0; j<2; j++) {
BN_copy(var84, var64);
BN_mask_bits(var84, 64);
BN_rshift(var64, var64, 64);
BN_mul(var84, var84, var44, t1);
BN_add(vara4, vara4, var84);
BN_copy(var84, vara4);
BN_mask_bits(var84, 128);
BN_mul(var84, vara4, arg4, t1);
BN_mask_bits(var84, 64);
BN_mul(var84, var84, arg5, t1);
BN_add(vara4, vara4, var84);
BN_rshift(vara4, vara4, 64);
if(BN_cmp(vara4, arg5) >= 0) {
BN_sub(vara4, vara4, arg5);
}
BN_mask_bits(vara4, 128);
}
BN_copy(arg1, vara4);
BN_free(var44);
BN_free(var64);
BN_free(var84);
BN_free(vara4);
}
bn_cmplx1a(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5)
{
int j;
BIGNUM *var44, *var64, *var84, *vara4;
var44 = BN_new();
var64 = BN_new();
var84 = BN_new();
vara4 = BN_new();
BN_copy(var44, arg2);
BN_copy(var64, arg3);
BN_clear(vara4);
for(j=0; j<2; j++) {
BN_copy(var84, var64);
BN_mask_bits(var84, 64);
BN_rshift(var64, var64, 64);
BN_mul(var84, var84, var44, t1);
BN_add(vara4, vara4, var84);
BN_copy(var84, vara4);
BN_mask_bits(var84, 128);
BN_mul(var84, vara4, arg4, t1);
BN_mask_bits(var84, 64);
BN_mul(var84, var84, arg5, t1);
BN_add(vara4, vara4, var84);
BN_rshift(vara4, vara4, 64);
if(j==0 && BN_cmp(vara4, arg5) >= 0) {
BN_sub(vara4, vara4, arg5);
}
BN_mask_bits(vara4, 128);
}
BN_copy(arg1, vara4);
BN_free(var44);
BN_free(var64);
BN_free(var84);
BN_free(vara4);
}
//uses 3, 1, glb2pow128
//sets 1, 0 (unused)
mod_sub()
{
BN_copy(bn_glb0, bn_glb3);
BN_mod_sub(bn_glb1, bn_glb3, bn_glb1, glb2pow128, t1);
BN_mask_bits(bn_glb1, 128);
}
//uses 1, 3, 6
//sets 1, 0 (unused), 7(unused)
bn_func1(BIGNUM *arg0) {
unsigned int x;
BIGNUM *var30 = BN_new();
BIGNUM *var50 = BN_new();
BN_copy(var30, arg0);
BN_mask_bits(var30, 8);
x = BN_get_word(var30);
BN_copy(var30,arg0);
if( x != 0) {
BN_clear(var50);
BN_set_word(var50, 2);
BN_sub(var30, var30, var50);
} else {
BN_clear(var50);
BN_set_word(var50, 0xfe);
BN_add(var30, var30, var50);
}
BN_copy(bn_glb7, bn_glb1);
if(BN_is_zero(arg0)) {
BN_clear(bn_glb7);
BN_set_word(bn_glb7, 1);
BN_clear(bn_glb0);
mod_add(bn_glb1, bn_glb7, bn_glb0, bn_glb3);
BN_free(var30);
BN_free(var50);
return;
} else {
int msb = BN_num_bits(var30) -1;
while (msb > 0) {
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
msb--;
if(BN_is_bit_set(var30, msb)) {
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
}
}
BN_clear(bn_glb7);
BN_set_word(bn_glb7, 1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_clear(bn_glb0);
}
BN_free(var30);
BN_free(var50);
}
//uses 3, 6, a, b, c, l, glb2pow128
//sets 0, 1, 5, 7, a, b, c, f, g
bn_func2(int arg0)
{
BN_copy(bn_glb1, bn_glb_b);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb5, bn_glb_c);
BN_mask_bits(bn_glb1, 128);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
BN_copy(bn_glb_g, bn_glb1);
BN_copy(bn_glb1, bn_glb7);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb_a);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
mod_sub();
BN_copy(bn_glb_f, bn_glb1);
BN_copy(bn_glb1, bn_glb7);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb1, bn_glb_c);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb5, bn_glb_l);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb0, bn_glb_f);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
if(arg0 == 0) {
BN_copy(bn_glb_a, bn_glb1);
} else {
BN_copy(bn_glb_f, bn_glb1);
}
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb1, bn_glb_b);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
mod_sub();
if(arg0 == 0) {
BN_copy(bn_glb_b, bn_glb1);
BN_copy(bn_glb_c, bn_glb_g);
} else {
BN_copy(bn_glb_f, bn_glb1);
BN_copy(bn_glb_f, bn_glb_g);
}
}
//uses 3, 6, a, b, c, d, e, k
//sets 0, 1, 5, 7, a, b, c, f, g, h, i, j
bn_func3(int arg0)
{
BN_copy(bn_glb1, bn_glb_c);
BN_copy(bn_glb7, bn_glb1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
bn_cmplx1(bn_glb0, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_copy(bn_glb_f, bn_glb0);
BN_copy(bn_glb5, bn_glb_d);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
mod_sub();
BN_copy(bn_glb0, bn_glb_a);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
BN_copy(bn_glb_g, bn_glb1);
BN_copy(bn_glb5, bn_glb_c);
bn_cmplx1(bn_glb0, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
if(arg0 == 0) {
BN_copy(bn_glb_c, bn_glb0);
} else {
BN_copy(bn_glb_g, bn_glb0);
}
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb_h, bn_glb1);
BN_copy(bn_glb0, bn_glb_a);
mod_add(bn_glb0, bn_glb0, bn_glb7, bn_glb3);
BN_copy(bn_glb7, bn_glb0);
//NOTE: don't 'mod' bn_glb1, but DO 'mod' glb_i
bn_cmplx1(bn_glb7, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
bn_cmplx1a(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_copy(bn_glb_i, bn_glb7);
BN_copy(bn_glb1, bn_glb_e);
BN_copy(bn_glb5, bn_glb_f);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
BN_copy(bn_glb_f, bn_glb1);
mod_sub();
BN_copy(bn_glb0, bn_glb_b);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
BN_copy(bn_glb_j, bn_glb1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb0, bn_glb1);
BN_copy(bn_glb1, bn_glb7);
BN_copy(bn_glb7, bn_glb0);
mod_sub();
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
if(arg0 == 0) {
BN_copy(bn_glb_a, bn_glb1);
} else {
BN_copy(bn_glb_f, bn_glb1);
}
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -