implement Sha1; include "sha1.m"; sha1(p: array of byte): array of byte { state := array[5] of int; state[0] = 16r67452301; state[1] = int 16rEFCDAB89; state[2] = int 16r98BADCFE; state[3] = 16r10325476; state[4] = int 16rC3D2E1F0; l := len p; p = sha1block(p, state); q: array of byte; if(len p < 56) q = array[64] of { * => byte 0 }; else q = array[128] of { * => byte 0 }; q[0:] = p[0:]; q[len p] = byte 16r80; end := q[len q-8:]; end[4] = byte (l>>24); end[5] = byte (l>>16); end[6] = byte (l>>8); end[7] = byte l; sha1block(q, state); d := array[20] of byte; j := 0; for(i:=0; i<5; i++){ d[j++] = byte (state[i]>>24); d[j++] = byte (state[i]>>16); d[j++] = byte (state[i]>>8); d[j++] = byte (state[i]); } return d; } sha1block(p: array of byte, s: array of int): array of byte { w := array[80] of int; while(len p >= 64){ a := s[0]; b := s[1]; c := s[2]; d := s[3]; e := s[4]; wp := w; for(i:=0; i<3; i++){ wp[0] = ((int p[0])<<24) | ((int p[1])<<16) | ((int p[2])<<8) | (int p[3]); e += ((a<<5) | (a>>27)) + wp[0]; e += 16r5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); wp[1] = ((int p[4])<<24) | ((int p[5])<<16) | ((int p[6])<<8) | (int p[7]); d += ((e<<5) | (e>>27)) + wp[1]; d += 16r5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); wp[2] = ((int p[8])<<24) | ((int p[9])<<16) | ((int p[10])<<8) | (int p[11]); c += ((d<<5) | (d>>27)) + wp[2]; c += 16r5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); wp[3] = ((int p[12])<<24) | ((int p[13])<<16) | ((int p[14])<<8) | (int p[15]); b += ((c<<5) | (c>>27)) + wp[3]; b += 16r5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); wp[4] = ((int p[16])<<24) | ((int p[17])<<16) | ((int p[18])<<8) | (int p[19]); a += ((b<<5) | (b>>27)) + wp[4]; a += 16r5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); p = p[20:]; wp = wp[5:]; } wp = w; wp[15+0] = ((int p[0])<<24) | ((int p[1])<<16) | ((int p[2])<<8) | (int p[3]); e += ((a<<5) | (a>>27)) + wp[15+0]; e += 16r5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); x := wp[15+-2] ^ wp[15+-7] ^ wp[15+-13] ^ wp[15+-15]; wp[15+1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[15+1]; d += 16r5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); x = wp[15+-1] ^ wp[15+-6] ^ wp[15+-12] ^ wp[15+-14]; wp[15+2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[15+2]; c += 16r5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); x = wp[15+0] ^ wp[15+-5] ^ wp[15+-11] ^ wp[15+-13]; wp[15+3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[15+3]; b += 16r5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); x = wp[15+1] ^ wp[15+-4] ^ wp[15+-10] ^ wp[15+-12]; wp[15+4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[15+4]; a += 16r5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); p = p[4:]; wp = w; for(i=0; i<4; i++){ x = wp[20+-3] ^ wp[20+-8] ^ wp[20+-14] ^ wp[20+-16]; wp[20+0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[20+0]; e += 16r6ed9eba1 + (b^c^d); b = (b<<30)|(b>>2); x = wp[20+-2] ^ wp[20+-7] ^ wp[20+-13] ^ wp[20+-15]; wp[20+1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[20+1]; d += 16r6ed9eba1 + (a^b^c); a = (a<<30)|(a>>2); x = wp[20+-1] ^ wp[20+-6] ^ wp[20+-12] ^ wp[20+-14]; wp[20+2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[20+2]; c += 16r6ed9eba1 + (e^a^b); e = (e<<30)|(e>>2); x = wp[20+0] ^ wp[20+-5] ^ wp[20+-11] ^ wp[20+-13]; wp[20+3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[20+3]; b += 16r6ed9eba1 + (d^e^a); d = (d<<30)|(d>>2); x = wp[20+1] ^ wp[20+-4] ^ wp[20+-10] ^ wp[20+-12]; wp[20+4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[20+4]; a += 16r6ed9eba1 + (c^d^e); c = (c<<30)|(c>>2); wp = wp[5:]; } for(i=0; i<4; i++){ x = wp[20+-3] ^ wp[20+-8] ^ wp[20+-14] ^ wp[20+-16]; wp[20+0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[20+0]; e += int 16r8f1bbcdc + ((b&c)|((b|c)&d)); b = (b<<30)|(b>>2); x = wp[20+-2] ^ wp[20+-7] ^ wp[20+-13] ^ wp[20+-15]; wp[20+1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[20+1]; d += int 16r8f1bbcdc + ((a&b)|((a|b)&c)); a = (a<<30)|(a>>2); x = wp[20+-1] ^ wp[20+-6] ^ wp[20+-12] ^ wp[20+-14]; wp[20+2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[20+2]; c += int 16r8f1bbcdc + ((e&a)|((e|a)&b)); e = (e<<30)|(e>>2); x = wp[20+0] ^ wp[20+-5] ^ wp[20+-11] ^ wp[20+-13]; wp[20+3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[20+3]; b += int 16r8f1bbcdc + ((d&e)|((d|e)&a)); d = (d<<30)|(d>>2); x = wp[20+1] ^ wp[20+-4] ^ wp[20+-10] ^ wp[20+-12]; wp[20+4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[20+4]; a += int 16r8f1bbcdc + ((c&d)|((c|d)&e)); c = (c<<30)|(c>>2); wp = wp[5:]; } for(i=0; i<4; i++){ x = wp[20+-3] ^ wp[20+-8] ^ wp[20+-14] ^ wp[20+-16]; wp[20+0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[20+0]; e += int 16rca62c1d6 + (b^c^d); b = (b<<30)|(b>>2); x = wp[20+-2] ^ wp[20+-7] ^ wp[20+-13] ^ wp[20+-15]; wp[20+1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[20+1]; d += int 16rca62c1d6 + (a^b^c); a = (a<<30)|(a>>2); x = wp[20+-1] ^ wp[20+-6] ^ wp[20+-12] ^ wp[20+-14]; wp[20+2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[20+2]; c += int 16rca62c1d6 + (e^a^b); e = (e<<30)|(e>>2); x = wp[20+0] ^ wp[20+-5] ^ wp[20+-11] ^ wp[20+-13]; wp[20+3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[20+3]; b += int 16rca62c1d6 + (d^e^a); d = (d<<30)|(d>>2); x = wp[20+1] ^ wp[20+-4] ^ wp[20+-10] ^ wp[20+-12]; wp[20+4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[20+4]; a += int 16rca62c1d6 + (c^d^e); c = (c<<30)|(c>>2); wp = wp[5:]; } s[0] += a; s[1] += b; s[2] += c; s[3] += d; s[4] += e; } return p; }