]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/port/sha1block.c
libsec: generalize pbkdf2_hmac_sha1() to pbkdf2_x() passing the hmac as an argument
[plan9front.git] / sys / src / libsec / port / sha1block.c
1 #include "os.h"
2
3 void
4 _sha1block(uchar *p, ulong len, u32int *s)
5 {
6         u32int a, b, c, d, e, x;
7         uchar *end;
8         u32int *wp, *wend;
9         u32int w[80];
10
11         /* at this point, we have a multiple of 64 bytes */
12         for(end = p+len; p < end;){
13                 a = s[0];
14                 b = s[1];
15                 c = s[2];
16                 d = s[3];
17                 e = s[4];
18
19                 wend = w + 15;
20                 for(wp = w; wp < wend; wp += 5){
21                         wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
22                         e += ((a<<5) | (a>>27)) + wp[0];
23                         e += 0x5a827999 + (((c^d)&b)^d);
24                         b = (b<<30)|(b>>2);
25
26                         wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
27                         d += ((e<<5) | (e>>27)) + wp[1];
28                         d += 0x5a827999 + (((b^c)&a)^c);
29                         a = (a<<30)|(a>>2);
30
31                         wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11];
32                         c += ((d<<5) | (d>>27)) + wp[2];
33                         c += 0x5a827999 + (((a^b)&e)^b);
34                         e = (e<<30)|(e>>2);
35
36                         wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15];
37                         b += ((c<<5) | (c>>27)) + wp[3];
38                         b += 0x5a827999 + (((e^a)&d)^a);
39                         d = (d<<30)|(d>>2);
40
41                         wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19];
42                         a += ((b<<5) | (b>>27)) + wp[4];
43                         a += 0x5a827999 + (((d^e)&c)^e);
44                         c = (c<<30)|(c>>2);
45                         
46                         p += 20;
47                 }
48
49                 wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
50                 e += ((a<<5) | (a>>27)) + wp[0];
51                 e += 0x5a827999 + (((c^d)&b)^d);
52                 b = (b<<30)|(b>>2);
53
54                 x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
55                 wp[1] = (x<<1) | (x>>31);
56                 d += ((e<<5) | (e>>27)) + wp[1];
57                 d += 0x5a827999 + (((b^c)&a)^c);
58                 a = (a<<30)|(a>>2);
59
60                 x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
61                 wp[2] = (x<<1) | (x>>31);
62                 c += ((d<<5) | (d>>27)) + wp[2];
63                 c += 0x5a827999 + (((a^b)&e)^b);
64                 e = (e<<30)|(e>>2);
65
66                 x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
67                 wp[3] = (x<<1) | (x>>31);
68                 b += ((c<<5) | (c>>27)) + wp[3];
69                 b += 0x5a827999 + (((e^a)&d)^a);
70                 d = (d<<30)|(d>>2);
71
72                 x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
73                 wp[4] = (x<<1) | (x>>31);
74                 a += ((b<<5) | (b>>27)) + wp[4];
75                 a += 0x5a827999 + (((d^e)&c)^e);
76                 c = (c<<30)|(c>>2);
77
78                 wp += 5;
79                 p += 4;
80
81                 wend = w + 40;
82                 for(; wp < wend; wp += 5){
83                         x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
84                         wp[0] = (x<<1) | (x>>31);
85                         e += ((a<<5) | (a>>27)) + wp[0];
86                         e += 0x6ed9eba1 + (b^c^d);
87                         b = (b<<30)|(b>>2);
88
89                         x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
90                         wp[1] = (x<<1) | (x>>31);
91                         d += ((e<<5) | (e>>27)) + wp[1];
92                         d += 0x6ed9eba1 + (a^b^c);
93                         a = (a<<30)|(a>>2);
94
95                         x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
96                         wp[2] = (x<<1) | (x>>31);
97                         c += ((d<<5) | (d>>27)) + wp[2];
98                         c += 0x6ed9eba1 + (e^a^b);
99                         e = (e<<30)|(e>>2);
100
101                         x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
102                         wp[3] = (x<<1) | (x>>31);
103                         b += ((c<<5) | (c>>27)) + wp[3];
104                         b += 0x6ed9eba1 + (d^e^a);
105                         d = (d<<30)|(d>>2);
106
107                         x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
108                         wp[4] = (x<<1) | (x>>31);
109                         a += ((b<<5) | (b>>27)) + wp[4];
110                         a += 0x6ed9eba1 + (c^d^e);
111                         c = (c<<30)|(c>>2);
112                 }
113
114                 wend = w + 60;
115                 for(; wp < wend; wp += 5){
116                         x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
117                         wp[0] = (x<<1) | (x>>31);
118                         e += ((a<<5) | (a>>27)) + wp[0];
119                         e += 0x8f1bbcdc + ((b&c)|((b|c)&d));
120                         b = (b<<30)|(b>>2);
121
122                         x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
123                         wp[1] = (x<<1) | (x>>31);
124                         d += ((e<<5) | (e>>27)) + wp[1];
125                         d += 0x8f1bbcdc + ((a&b)|((a|b)&c));
126                         a = (a<<30)|(a>>2);
127
128                         x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
129                         wp[2] = (x<<1) | (x>>31);
130                         c += ((d<<5) | (d>>27)) + wp[2];
131                         c += 0x8f1bbcdc + ((e&a)|((e|a)&b));
132                         e = (e<<30)|(e>>2);
133
134                         x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
135                         wp[3] = (x<<1) | (x>>31);
136                         b += ((c<<5) | (c>>27)) + wp[3];
137                         b += 0x8f1bbcdc + ((d&e)|((d|e)&a));
138                         d = (d<<30)|(d>>2);
139
140                         x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
141                         wp[4] = (x<<1) | (x>>31);
142                         a += ((b<<5) | (b>>27)) + wp[4];
143                         a += 0x8f1bbcdc + ((c&d)|((c|d)&e));
144                         c = (c<<30)|(c>>2);
145                 }
146
147                 wend = w + 80;
148                 for(; wp < wend; wp += 5){
149                         x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
150                         wp[0] = (x<<1) | (x>>31);
151                         e += ((a<<5) | (a>>27)) + wp[0];
152                         e += 0xca62c1d6 + (b^c^d);
153                         b = (b<<30)|(b>>2);
154
155                         x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
156                         wp[1] = (x<<1) | (x>>31);
157                         d += ((e<<5) | (e>>27)) + wp[1];
158                         d += 0xca62c1d6 + (a^b^c);
159                         a = (a<<30)|(a>>2);
160
161                         x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
162                         wp[2] = (x<<1) | (x>>31);
163                         c += ((d<<5) | (d>>27)) + wp[2];
164                         c += 0xca62c1d6 + (e^a^b);
165                         e = (e<<30)|(e>>2);
166
167                         x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
168                         wp[3] = (x<<1) | (x>>31);
169                         b += ((c<<5) | (c>>27)) + wp[3];
170                         b += 0xca62c1d6 + (d^e^a);
171                         d = (d<<30)|(d>>2);
172
173                         x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
174                         wp[4] = (x<<1) | (x>>31);
175                         a += ((b<<5) | (b>>27)) + wp[4];
176                         a += 0xca62c1d6 + (c^d^e);
177                         c = (c<<30)|(c>>2);
178                 }
179
180                 /* save state */
181                 s[0] += a;
182                 s[1] += b;
183                 s[2] += c;
184                 s[3] += d;
185                 s[4] += e;
186         }
187 }