]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/mips/md5block.s
libsec: generalize pbkdf2_hmac_sha1() to pbkdf2_x() passing the hmac as an argument
[plan9front.git] / sys / src / libsec / mips / md5block.s
1 /*
2  *  rfc1321 requires that I include this.  The code is new.  The constants
3  *  all come from the rfc (hence the copyright).  We trade a table for the
4  *  macros in rfc.  The total size is a lot less. -- presotto
5  *
6  *      Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
7  *      rights reserved.
8  *
9  *      License to copy and use this software is granted provided that it
10  *      is identified as the "RSA Data Security, Inc. MD5 Message-Digest
11  *      Algorithm" in all material mentioning or referencing this software
12  *      or this function.
13  *
14  *      License is also granted to make and use derivative works provided
15  *      that such works are identified as "derived from the RSA Data
16  *      Security, Inc. MD5 Message-Digest Algorithm" in all material
17  *      mentioning or referencing the derived work.
18  *
19  *      RSA Data Security, Inc. makes no representations concerning either
20  *      the merchantability of this software or the suitability of this
21  *      software forany particular purpose. It is provided "as is"
22  *      without express or implied warranty of any kind.
23  *      These notices must be retained in any copies of any part of this
24  *      documentation and/or software.
25  */
26
27         /* round 1 */
28         DATA    md5tab<>+( 0*4)(SB)/4,$0xd76aa478       
29         DATA    md5tab<>+( 1*4)(SB)/4,$0xe8c7b756       
30         DATA    md5tab<>+( 2*4)(SB)/4,$0x242070db       
31         DATA    md5tab<>+( 3*4)(SB)/4,$0xc1bdceee       
32         DATA    md5tab<>+( 4*4)(SB)/4,$0xf57c0faf       
33         DATA    md5tab<>+( 5*4)(SB)/4,$0x4787c62a       
34         DATA    md5tab<>+( 6*4)(SB)/4,$0xa8304613       
35         DATA    md5tab<>+( 7*4)(SB)/4,$0xfd469501       
36         DATA    md5tab<>+( 8*4)(SB)/4,$0x698098d8       
37         DATA    md5tab<>+( 9*4)(SB)/4,$0x8b44f7af       
38         DATA    md5tab<>+(10*4)(SB)/4,$0xffff5bb1       
39         DATA    md5tab<>+(11*4)(SB)/4,$0x895cd7be       
40         DATA    md5tab<>+(12*4)(SB)/4,$0x6b901122       
41         DATA    md5tab<>+(13*4)(SB)/4,$0xfd987193       
42         DATA    md5tab<>+(14*4)(SB)/4,$0xa679438e       
43         DATA    md5tab<>+(15*4)(SB)/4,$0x49b40821
44
45         /* round 2 */
46         DATA    md5tab<>+(16*4)(SB)/4,$0xf61e2562       
47         DATA    md5tab<>+(17*4)(SB)/4,$0xc040b340       
48         DATA    md5tab<>+(18*4)(SB)/4,$0x265e5a51       
49         DATA    md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa       
50         DATA    md5tab<>+(20*4)(SB)/4,$0xd62f105d       
51         DATA    md5tab<>+(21*4)(SB)/4,$0x02441453       
52         DATA    md5tab<>+(22*4)(SB)/4,$0xd8a1e681       
53         DATA    md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8       
54         DATA    md5tab<>+(24*4)(SB)/4,$0x21e1cde6       
55         DATA    md5tab<>+(25*4)(SB)/4,$0xc33707d6       
56         DATA    md5tab<>+(26*4)(SB)/4,$0xf4d50d87       
57         DATA    md5tab<>+(27*4)(SB)/4,$0x455a14ed       
58         DATA    md5tab<>+(28*4)(SB)/4,$0xa9e3e905       
59         DATA    md5tab<>+(29*4)(SB)/4,$0xfcefa3f8       
60         DATA    md5tab<>+(30*4)(SB)/4,$0x676f02d9       
61         DATA    md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a
62
63         /* round 3 */
64         DATA    md5tab<>+(32*4)(SB)/4,$0xfffa3942       
65         DATA    md5tab<>+(33*4)(SB)/4,$0x8771f681       
66         DATA    md5tab<>+(34*4)(SB)/4,$0x6d9d6122       
67         DATA    md5tab<>+(35*4)(SB)/4,$0xfde5380c       
68         DATA    md5tab<>+(36*4)(SB)/4,$0xa4beea44       
69         DATA    md5tab<>+(37*4)(SB)/4,$0x4bdecfa9       
70         DATA    md5tab<>+(38*4)(SB)/4,$0xf6bb4b60       
71         DATA    md5tab<>+(39*4)(SB)/4,$0xbebfbc70       
72         DATA    md5tab<>+(40*4)(SB)/4,$0x289b7ec6       
73         DATA    md5tab<>+(41*4)(SB)/4,$0xeaa127fa       
74         DATA    md5tab<>+(42*4)(SB)/4,$0xd4ef3085       
75         DATA    md5tab<>+(43*4)(SB)/4,$0x04881d05       
76         DATA    md5tab<>+(44*4)(SB)/4,$0xd9d4d039       
77         DATA    md5tab<>+(45*4)(SB)/4,$0xe6db99e5       
78         DATA    md5tab<>+(46*4)(SB)/4,$0x1fa27cf8       
79         DATA    md5tab<>+(47*4)(SB)/4,$0xc4ac5665       
80
81         /* round 4 */
82         DATA    md5tab<>+(48*4)(SB)/4,$0xf4292244       
83         DATA    md5tab<>+(49*4)(SB)/4,$0x432aff97       
84         DATA    md5tab<>+(50*4)(SB)/4,$0xab9423a7       
85         DATA    md5tab<>+(51*4)(SB)/4,$0xfc93a039       
86         DATA    md5tab<>+(52*4)(SB)/4,$0x655b59c3       
87         DATA    md5tab<>+(53*4)(SB)/4,$0x8f0ccc92       
88         DATA    md5tab<>+(54*4)(SB)/4,$0xffeff47d       
89         DATA    md5tab<>+(55*4)(SB)/4,$0x85845dd1       
90         DATA    md5tab<>+(56*4)(SB)/4,$0x6fa87e4f       
91         DATA    md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0       
92         DATA    md5tab<>+(58*4)(SB)/4,$0xa3014314       
93         DATA    md5tab<>+(59*4)(SB)/4,$0x4e0811a1       
94         DATA    md5tab<>+(60*4)(SB)/4,$0xf7537e82       
95         DATA    md5tab<>+(61*4)(SB)/4,$0xbd3af235       
96         DATA    md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb       
97         DATA    md5tab<>+(63*4)(SB)/4,$0xeb86d391
98
99 #define S11 7
100 #define S12 12
101 #define S13 17
102 #define S14 22
103
104 #define S21 5
105 #define S22 9
106 #define S23 14
107 #define S24 20
108
109 #define S31 4
110 #define S32 11
111 #define S33 16
112 #define S34 23
113
114 #define S41 6
115 #define S42 10
116 #define S43 15
117 #define S44 21
118
119 #define AREG            R5
120 #define BREG            R6
121 #define CREG            R7
122 #define DREG            R8
123 #define DATAREG         R1
124 #define TABREG          R10
125 #define STREG           R11
126 #define XREG            R12
127 #define ELOOPREG        R13
128 #define EDREG           R14
129 #define IREG            R15
130
131 #define TMP1            R9
132 #define TMP2            R2
133 #define TMP3            R3
134 #define TMP4            R4
135
136 /*
137  * decode little endian data into x[off], then the body
138  * bodies have this form:
139  *      a += FN(B,C,D);
140  *      a += x[off] + t[off];
141  *      a = (a << S11) | (a >> (32 - S11));
142  *      a += b;
143  */
144 #define BODY1(off,FN,SH,A,B,C,D)\
145         MOVBU off(DATAREG),TMP2;\
146         MOVBU (off+1)(DATAREG),TMP3;\
147         MOVBU (off+2)(DATAREG),TMP1;\
148         MOVBU (off+3)(DATAREG),TMP4;\
149         SLL $8,TMP3;\
150         OR TMP3,TMP2;\
151         SLL $16,TMP1;\
152         OR TMP1,TMP2;\
153         SLL $24,TMP4;\
154         OR TMP4,TMP2;\
155         MOVW off(TABREG),TMP3;\
156         FN(B,C,D)\
157         ADDU TMP1,A;\
158         MOVW TMP2,off(XREG);\
159         ADDU TMP2,A;\
160         ADDU TMP3,A;\
161         SLL $SH,A,TMP1;\
162         SRL $(32-SH),A;\
163         OR TMP1,A;\
164         ADDU B,A;\
165
166 #define BODY(off,inc,FN,SH,A,B,C,D)\
167         MOVW off(TABREG),TMP3;\
168         ADDU XREG,IREG,TMP4;\
169         MOVW (TMP4),TMP2;\
170         ADDU $(inc*4),IREG;\
171         AND $63,IREG;\
172         FN(B,C,D)\
173         ADDU TMP1,A;\
174         ADDU TMP2,A;\
175         ADDU TMP3,A;\
176         SLL $SH,A,TMP1;\
177         SRL $(32-SH),A;\
178         OR  TMP1,A;\
179         ADDU B,A;\
180
181 /*
182  * fn1 = ((c ^ d) & b) ^ d
183  */
184 #define FN1(B,C,D)\
185         XOR C,D,TMP1;\
186         AND B,TMP1;\
187         XOR D,TMP1;\
188
189 /*
190  * fn2 = ((b ^ c) & d) ^ c;
191  */
192 #define FN2(B,C,D)\
193         XOR B,C,TMP1;\
194         AND D,TMP1;\
195         XOR C,TMP1;\
196
197 /*
198  * fn3 = b ^ c ^ d;
199  */
200 #define FN3(B,C,D)\
201         XOR B,C,TMP1;\
202         XOR D,TMP1;\
203
204 /*
205  * fn4 = c ^ (b | ~d);
206  */
207 #define FN4(B,C,D)\
208         XOR $-1,D,TMP1;\
209         OR B,TMP1;\
210         XOR C,TMP1;\
211
212 #define DATA    0
213 #define LEN     4
214 #define STATE   8
215
216 #define XOFF    (-4-16*4)
217
218         TEXT    _md5block+0(SB),$68
219
220         MOVW    len+LEN(FP),TMP1
221         ADDU    DATAREG,TMP1,EDREG
222         MOVW    state+STATE(FP),STREG
223
224         MOVW 0(STREG),AREG
225         MOVW 4(STREG),BREG
226         MOVW 8(STREG),CREG
227         MOVW 12(STREG),DREG
228
229 mainloop:
230
231         MOVW $md5tab<>+0(SB),TABREG
232         ADDU $(16*4),DATAREG,ELOOPREG
233         MOVW $x+XOFF(SP),XREG
234
235 loop1:
236         BODY1(0,FN1,S11,AREG,BREG,CREG,DREG)
237         BODY1(4,FN1,S12,DREG,AREG,BREG,CREG)
238         BODY1(8,FN1,S13,CREG,DREG,AREG,BREG)
239         BODY1(12,FN1,S14,BREG,CREG,DREG,AREG)
240
241         ADDU $16,DATAREG
242         ADDU $16,TABREG
243         ADDU $16,XREG
244
245         BNE DATAREG,ELOOPREG,loop1
246
247
248         MOVW $x+XOFF(SP),XREG
249         MOVW $(1*4),IREG
250         MOVW $(1*4),ELOOPREG
251 loop2:
252         BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG)
253         BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG)
254         BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG)
255         BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG)
256
257         ADDU $16,TABREG
258
259         BNE IREG,ELOOPREG,loop2
260
261
262         MOVW $(5*4),IREG
263         MOVW $(5*4),ELOOPREG
264 loop3:
265         BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG)
266         BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG)
267         BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG)
268         BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG)
269
270         ADDU $16,TABREG
271
272         BNE IREG,ELOOPREG,loop3
273
274
275         MOVW $0,IREG
276 loop4:
277         BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG)
278         BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG)
279         BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG)
280         BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG)
281
282         ADDU $16,TABREG
283
284         BNE IREG,R0,loop4
285
286         MOVW 0(STREG),TMP1
287         MOVW 4(STREG),TMP2
288         MOVW 8(STREG),TMP3
289         MOVW 12(STREG),TMP4
290         ADDU TMP1,AREG
291         ADDU TMP2,BREG
292         ADDU TMP3,CREG
293         ADDU TMP4,DREG
294         MOVW AREG,0(STREG)
295         MOVW BREG,4(STREG)
296         MOVW CREG,8(STREG)
297         MOVW DREG,12(STREG)
298
299         BNE DATAREG,EDREG,mainloop
300
301         RET
302
303         GLOBL   md5tab<>+0(SB),$256
304
305         END