📄 hash_sha1.c
字号:
#include <config.h>
uint8 sha1_buf[ SHA1_BUFLEN ];
uint32 H[5];
uint32 Sn(uint32 u32t ,uint8 n)
{
uint32 t0,t1;
t0 = u32t ;
t1 = u32t;
u32t = (t0 << n)|(t1 >> (32 - n)) ;
return u32t;
}
void sha1_compress(uint8 *buf)
{
uint32 a,b,c,d,e,W[80],i;
uint32 t,te;
// uint8 *p;
/* copy the state into 512-bits into W[0..15] */
for (i = 0; i < 16; i++) {
memcpy( (void*)&W[i], buf + (4*i) ,4);
}
/* ds_send_byte(0x6b);
ds_send_byte(0x6b);
ds_send_byte(0x6b);
ds_send_byte(0x6b);
p = (void*)W;
for(i = 0; i< 64 ;i++)
{
ds_send_byte(p[i]);
}
ds_send_byte(0x66);
ds_send_byte(0x66);
ds_send_byte(0x66);
ds_send_byte(0x66);
*/
/* copy state */
a = H[0];
b = H[1];
c = H[2];
d = H[3];
e = H[4];
/* expand it */
for (i = 16; i < 80; i++) {
//W[i] = ROL(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
W[i] = Sn(( W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]),1) ;
}
// ds_send_byte(0xa6);
for (i = 0; i < 20; ) {
// FF0(a,b,c,d,e,i++);
// t = e; e = d; d = c; c = b; b = a; a = t;
te = (b & c) ^ ((0xffffffff ^ b) & d);
t = (Sn(a,5) + te + e + W[i] + 0x5a827999);
b =Sn(b,30);
e = d; d = c; c = b; b = a; a = t;
i++;
}
/*
p = (void*)&a;
for(i = 0; i<4; i++)
{
ds_send_byte(*p++);
}
ds_send_byte(0x61);
i = 20 ;
*/
for (; i < 40; ) {
// FF1(a,b,c,d,e,i++);
// t = e; e = d; d = c; c = b; b = a; a = t;
te = b ^ c ^ d;
t = (Sn(a,5) + te + e + W[i] + 0x6ed9eba1);
b =Sn(b,30);
e = d; d = c; c = b; b = a; a = t;
i++;
}
/* p = (void*)&a;
for(i = 0; i<4; i++)
{
ds_send_byte(*p++);
}
ds_send_byte(0x62);
while(1);
*/
for (; i < 60; ) {
// FF2(a,b,c,d,e,i++);
//t = e; e = d; d = c; c = b; b = a; a = t;
//#define F2(x,y,z) ((x & y) | (x & z) | (y & z))
te = (b & c) ^(b & d) ^ (c & d);
t = (Sn(a,5) + te + e + W[i] + 0x8f1bbcdc);
b =Sn(b,30);
e = d; d = c; c = b; b = a; a = t;
i++;
}
/* p = (void*)&a;
for(i = 0; i<4; i++)
{
ds_send_byte(*p++);
}
while(1);
ds_send_byte(0x63);
*/
for (; i < 80; ) {
// FF3(a,b,c,d,e,i++);
// t = e; e = d; d = c; c = b; b = a; a = t;
te = b ^ c ^ d;
t = (Sn(a,5) + te + e + W[i] + 0xca62c1d6);
b =Sn(b,30);
e = d; d = c; c = b; b = a; a = t;
i++;
}
/* store */
H[0] = H[0] + a;
H[1] = H[1] + b;
H[2] = H[2] + c;
H[3] = H[3] + d;
H[4] = H[4] + e;
/*
ds_send_byte(0x66);
ds_send_byte(0x66);
ds_send_byte(0x66);
ds_send_byte(0x66);
p = (void*)H;
for (i= 0; i < 20; i++)
{
ds_send_byte(p[i]);
}
ds_send_byte(0x99);
ds_send_byte(0x99);
ds_send_byte(0x99);
ds_send_byte(0x99);
*/
}
uint8 sha1_done(uint8 *md ,uint8 *pd, uint16 len)
{
// uint16 i;
uint8 *DataPtr;
uint16 DataLen;
uint8 q; // 商
uint8 r; // 余数
DataPtr = pd ;
DataLen = len;
q = len / 64;
r = len % 64;
memcpy(sha1_buf , md , len); //copy data to inner buf;
sha1_buf[DataLen++] = 0x80; //append the '1' bit
DataPtr += DataLen ; //append the '1' bit,use one char
if( r < 56)
{
while( DataLen < (56 + q * 64))
{
*DataPtr++ = 0x00;
//ds_send_byte(*(DataPtr - 1));
DataLen++;
} // fill zero
*(uint32 *)DataPtr = (uint32)0 ; // fill length
*(uint32 *)(DataPtr + 4) = (uint32)(len * 8) ;
/* for( i = 0; i< (q + 1)*64 ;i++)
{
ds_send_byte( sha1_buf[i]);
}
*/ return 1 + q ;
}
if( r > 56 )
{
while( DataLen < (112 + q * 64))
{
*DataPtr++ = 0;
} // fill zero
*(uint32 *)DataPtr = (uint32)0 ; // fill length
*(uint32 *)(DataPtr + 4) = (uint32)(len * 8) ;
return 2 + q;
}
}
uint8 generater_compress(uint8 *md ,uint8 *pd ,uint16 Dlen) // pd = process data address
{
uint16 i;
uint8 sect;
uint16 datalen;
// uint8 *p; //test for printer
datalen = Dlen;
// ds_send_byte(Dlen / 256);
// ds_send_byte(Dlen %256);
sect = sha1_done( md,pd,Dlen);
// ds_send_byte( sect);
/*
for(i = 0; i< sect * 64;i++)
{
ds_send_byte(sha1_buf[i]);
}
ds_send_byte(0x55);
ds_send_byte(0x55);
ds_send_byte(0x55);
ds_send_byte(0x55);
*/
//initialize H[];
H[0] = 0x67452301;
H[1] = 0xefcdab89;
H[2] = 0x98badcfe;
H[3] = 0x10325476;
H[4] = 0xc3d2e1f0;
for(i = 0;i < sect ; i++)
{
sha1_compress( sha1_buf + i*64);
memcpy(sha1_buf, H, 20);
}
memcpy((pd + i * 20), H, 20);
/*
p = (void*)H;
for (i= 0; i < 20; i++)
{
ds_send_byte(p[i]);
}
ds_send_byte(0x99);
ds_send_byte(0x99);
ds_send_byte(0x99);
ds_send_byte(0x99);
*/
return sect;
}
void clear_sha1_buf(void)
{
memset(sha1_buf, 0 ,SHA1_BUFLEN);
}
/*
uint8 gen_compress_len(uint16 datalen)
{
uint16 r ,q;
r = datalen / 64;
q = datalen % 64;
if (q < 56) return r + 1;
if (q > 56) return r + 2;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -