#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include "BigInt.h"
#include "sha1.h"
#include "time.h"
int shas1(const unsigned int x[], unsigned char digest[20])
{
SHA1_CTX context;
unsigned char buffer[16384]; //,digest[20];
// FILE *file;
SHA1Init(&context);
SHA1Update(&context, buffer, 1);
SHA1Final(digest, &context);
return 0;
}
CBigInt sha(CBigInt y)
{
SHA1_CTX context;
CBigInt X;
unsigned char buffer[16384],digest[20];
CString str;
char *t="0123456789ABCDEF";
if((y.m_nLength==1)&&(y.m_ulValue[0]==0))
{
str="0";
X.Mov(0);
return X;
}
str="";
int a;
char ch='\0';
str.Insert(0,ch);
X.Mov(y);
while(X.m_ulValue[X.m_nLength-1]>0)
{
a=X.Mod(16);
ch=t[a];
str.Insert(0,ch);
X.Mov(X.Div(16));
}
int i=0;
while (str[i]>0)
i++;
for (a=i,i=0;i<a;i++)
buffer[i]=str[i];
for (i=a;i<64;i++) buffer[i]='\0';
SHA1Init(&context);
SHA1Update(&context, buffer, 1);
SHA1Final(digest, &context);
int len=str.GetLength(),k;
X.Mov(0);
for(i=0;i<20;i++)
{
X.Mov(X.Mul(256));
// if((digest[i]>='0')&&(digest[i]<='9'))
k=digest[i];
// else if((digest[i]>='A')&&(digest[i]<='F'))k=digest[i]-55;
// else if((digest[i]>='a')&&(digest[i]<='f'))k=digest[i]-87;
// else k=0;
X.Mov(X.Add(k));
}
return X;
}
CBigInt makerandnumber( unsigned int len)
{
srand(time(NULL));
CBigInt X;
X.m_nLength=(len+31)/32;
// X.Mov(0);
for (unsigned int j=0;j<X.m_nLength;j++)
{
X.m_ulValue[j]=rand()*0x10000+rand();
}
X.m_ulValue[0]=X.m_ulValue[0]|0x1;
X.m_ulValue[j-1]=X.m_ulValue[j-1]|0x80000000;
return X;
}
CBigInt pow2( const int x, int y)
{
CBigInt p,q,t;
p.Mov(1);
q.Mov(x);
while (y>0)
{
if (y%2==0) {q.Mov(q.Mul(q)); y /= 2 ; }
else { p.Mov(p.Mul(q)); y -= 1; }
}
return p;
}
CBigInt pow3(CBigInt x, CBigInt y, CBigInt m)
{
CBigInt p,t;
p.Mov(1);
t.Mov(0);
while (y.Cmp(t)>0)
{
if (y.m_ulValue[0]&0x1==0)
{x.Mov(x.Mul(x)); x.Mov(x.Mod(m)); x.Mov(x.Div(2)); }
else {p.Mov(p.Mul(x)); p.Mov(p.Mod(m)); y.Mov(y.Sub(1)); }
}
return p;
}
/*
void dsa()
{
CBigInt r,s,u,v[4],w,p,q,t;
t.Mov(pow2(2,160));
int n=3,b=31,L=512,g=160,T=1;
while (T)
{
while (T)
{
s.Mov(makerandnumber(g));
r.Mov(s);
r.Mov(r.Add(1));
r.Mov(r.Mod(t));
u.Mov(sha(s));
q.Mov(sha(r));
for (int i=0;i<5;i++)
q.m_ulValue[i]=q.m_ulValue[0]^u.m_ulValue[i];
if (q.Rab()) break;
}
int C=0,N=2;
while (T)
{
// v[4],w,p;
for (int k=0;k<4;k++)
{
v[k].Mov(s);
v[k].Mov(v[k].Add(N+k));
v[k].Mov(v[k].Mod(t));
v[k].Mov(sha(v[k]));
}
w.Mov(0);
r.Mov(1);
for ( k=0;k<3;k++)
{
v[k].Mov(v[k].Mul(r));
w.Mov(w.Add(v[k]));
r.Mov(r.Mul(t));
}
v[k].Mov(v[k].Mod(0x80000000));
v[k].Mov(v[k].Mul(r));
w.Mov(w.Add(v[k]));
r.Mov(w);
r.Mov(r.Add(1));
w.Mov(w.Mod(q));
r.Mov(r.Sub(w));
p.Mov(r);
if (p.Rab()) break;
C=C+1;
N=N+n+1;
if (C==4096) break;
}
if (C<4096) break;
}
}
*/