summaryrefslogtreecommitdiff
path: root/sys/src/libsec/port/sha1block.c
blob: a1dbc8c99c8ea86165a97d4cca2f849c31a63e9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "os.h"

#define ROTL(x,n)	(((x)<<n)|((x)>>32-n))

#define F0(x,y,z)	(0x5a827999 + ((z) ^ ((x) & ((y) ^ (z)))))
#define F1(x,y,z)	(0x6ed9eba1 + ((x) ^ (y) ^ (z)))
#define F2(x,y,z)	(0x8f1bbcdc + (((x) & (y)) | (((x) | (y)) & (z))))
#define F3(x,y,z)	(0xca62c1d6 + ((x) ^ (y) ^ (z)))

void
_sha1block(uchar *p, ulong len, u32int *s)
{
	u32int w[16], a, b, c, d, e;
	uchar *end;

	/* at this point, we have a multiple of 64 bytes */
	for(end = p+len; p < end;){
		a = s[0];
		b = s[1];
		c = s[2];
		d = s[3];
		e = s[4];

#define STEP(a,b,c,d,e,f,i) \
	if(i < 16) {\
		w[i] = p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3]; \
		p += 4; \
	} else { \
		u32int x = w[i-3&15] ^ w[i-8&15] ^ w[i-14&15] ^ w[i-16&15]; \
		w[i&15] = ROTL(x, 1); \
	} \
	e += ROTL(a, 5) + w[i&15] + f(b,c,d); \
	b = ROTL(b, 30);

		STEP(a,b,c,d,e,F0,0);
		STEP(e,a,b,c,d,F0,1);
		STEP(d,e,a,b,c,F0,2);
		STEP(c,d,e,a,b,F0,3);
		STEP(b,c,d,e,a,F0,4);
	
		STEP(a,b,c,d,e,F0,5);
		STEP(e,a,b,c,d,F0,6);
		STEP(d,e,a,b,c,F0,7);
		STEP(c,d,e,a,b,F0,8);
		STEP(b,c,d,e,a,F0,9);
	
		STEP(a,b,c,d,e,F0,10);
		STEP(e,a,b,c,d,F0,11);
		STEP(d,e,a,b,c,F0,12);
		STEP(c,d,e,a,b,F0,13);
		STEP(b,c,d,e,a,F0,14);
	
		STEP(a,b,c,d,e,F0,15);
		STEP(e,a,b,c,d,F0,16);
		STEP(d,e,a,b,c,F0,17);
		STEP(c,d,e,a,b,F0,18);
		STEP(b,c,d,e,a,F0,19);
	
		STEP(a,b,c,d,e,F1,20);
		STEP(e,a,b,c,d,F1,21);
		STEP(d,e,a,b,c,F1,22);
		STEP(c,d,e,a,b,F1,23);
		STEP(b,c,d,e,a,F1,24);
	
		STEP(a,b,c,d,e,F1,25);
		STEP(e,a,b,c,d,F1,26);
		STEP(d,e,a,b,c,F1,27);
		STEP(c,d,e,a,b,F1,28);
		STEP(b,c,d,e,a,F1,29);
	
		STEP(a,b,c,d,e,F1,30);
		STEP(e,a,b,c,d,F1,31);
		STEP(d,e,a,b,c,F1,32);
		STEP(c,d,e,a,b,F1,33);
		STEP(b,c,d,e,a,F1,34);
	
		STEP(a,b,c,d,e,F1,35);
		STEP(e,a,b,c,d,F1,36);
		STEP(d,e,a,b,c,F1,37);
		STEP(c,d,e,a,b,F1,38);
		STEP(b,c,d,e,a,F1,39);
	
		STEP(a,b,c,d,e,F2,40);
		STEP(e,a,b,c,d,F2,41);
		STEP(d,e,a,b,c,F2,42);
		STEP(c,d,e,a,b,F2,43);
		STEP(b,c,d,e,a,F2,44);
	
		STEP(a,b,c,d,e,F2,45);
		STEP(e,a,b,c,d,F2,46);
		STEP(d,e,a,b,c,F2,47);
		STEP(c,d,e,a,b,F2,48);
		STEP(b,c,d,e,a,F2,49);
	
		STEP(a,b,c,d,e,F2,50);
		STEP(e,a,b,c,d,F2,51);
		STEP(d,e,a,b,c,F2,52);
		STEP(c,d,e,a,b,F2,53);
		STEP(b,c,d,e,a,F2,54);
	
		STEP(a,b,c,d,e,F2,55);
		STEP(e,a,b,c,d,F2,56);
		STEP(d,e,a,b,c,F2,57);
		STEP(c,d,e,a,b,F2,58);
		STEP(b,c,d,e,a,F2,59);
	
		STEP(a,b,c,d,e,F3,60);
		STEP(e,a,b,c,d,F3,61);
		STEP(d,e,a,b,c,F3,62);
		STEP(c,d,e,a,b,F3,63);
		STEP(b,c,d,e,a,F3,64);
	
		STEP(a,b,c,d,e,F3,65);
		STEP(e,a,b,c,d,F3,66);
		STEP(d,e,a,b,c,F3,67);
		STEP(c,d,e,a,b,F3,68);
		STEP(b,c,d,e,a,F3,69);
	
		STEP(a,b,c,d,e,F3,70);
		STEP(e,a,b,c,d,F3,71);
		STEP(d,e,a,b,c,F3,72);
		STEP(c,d,e,a,b,F3,73);
		STEP(b,c,d,e,a,F3,74);
	
		STEP(a,b,c,d,e,F3,75);
		STEP(e,a,b,c,d,F3,76);
		STEP(d,e,a,b,c,F3,77);
		STEP(c,d,e,a,b,F3,78);
		STEP(b,c,d,e,a,F3,79);

		s[0] += a;
		s[1] += b;
		s[2] += c;
		s[3] += d;
		s[4] += e;
	}
}