summaryrefslogtreecommitdiff
path: root/sys/src/libsec/mips/md5block.s
blob: eb7b49ff79e1843a3a8e3b48304e8e1f106e1892 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
/*
 *  rfc1321 requires that I include this.  The code is new.  The constants
 *  all come from the rfc (hence the copyright).  We trade a table for the
 *  macros in rfc.  The total size is a lot less. -- presotto
 *
 *	Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
 *	rights reserved.
 *
 *	License to copy and use this software is granted provided that it
 *	is identified as the "RSA Data Security, Inc. MD5 Message-Digest
 *	Algorithm" in all material mentioning or referencing this software
 *	or this function.
 *
 *	License is also granted to make and use derivative works provided
 *	that such works are identified as "derived from the RSA Data
 *	Security, Inc. MD5 Message-Digest Algorithm" in all material
 *	mentioning or referencing the derived work.
 *
 *	RSA Data Security, Inc. makes no representations concerning either
 *	the merchantability of this software or the suitability of this
 *	software forany particular purpose. It is provided "as is"
 *	without express or implied warranty of any kind.
 *	These notices must be retained in any copies of any part of this
 *	documentation and/or software.
 */

	/* round 1 */
	DATA	md5tab<>+( 0*4)(SB)/4,$0xd76aa478	
	DATA	md5tab<>+( 1*4)(SB)/4,$0xe8c7b756	
	DATA	md5tab<>+( 2*4)(SB)/4,$0x242070db	
	DATA	md5tab<>+( 3*4)(SB)/4,$0xc1bdceee	
	DATA	md5tab<>+( 4*4)(SB)/4,$0xf57c0faf	
	DATA	md5tab<>+( 5*4)(SB)/4,$0x4787c62a	
	DATA	md5tab<>+( 6*4)(SB)/4,$0xa8304613	
	DATA	md5tab<>+( 7*4)(SB)/4,$0xfd469501	
	DATA	md5tab<>+( 8*4)(SB)/4,$0x698098d8	
	DATA	md5tab<>+( 9*4)(SB)/4,$0x8b44f7af	
	DATA	md5tab<>+(10*4)(SB)/4,$0xffff5bb1	
	DATA	md5tab<>+(11*4)(SB)/4,$0x895cd7be	
	DATA	md5tab<>+(12*4)(SB)/4,$0x6b901122	
	DATA	md5tab<>+(13*4)(SB)/4,$0xfd987193	
	DATA	md5tab<>+(14*4)(SB)/4,$0xa679438e	
	DATA	md5tab<>+(15*4)(SB)/4,$0x49b40821

	/* round 2 */
	DATA	md5tab<>+(16*4)(SB)/4,$0xf61e2562	
	DATA	md5tab<>+(17*4)(SB)/4,$0xc040b340	
	DATA	md5tab<>+(18*4)(SB)/4,$0x265e5a51	
	DATA	md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa	
	DATA	md5tab<>+(20*4)(SB)/4,$0xd62f105d	
	DATA	md5tab<>+(21*4)(SB)/4,$0x02441453	
	DATA	md5tab<>+(22*4)(SB)/4,$0xd8a1e681	
	DATA	md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8	
	DATA	md5tab<>+(24*4)(SB)/4,$0x21e1cde6	
	DATA	md5tab<>+(25*4)(SB)/4,$0xc33707d6	
	DATA	md5tab<>+(26*4)(SB)/4,$0xf4d50d87	
	DATA	md5tab<>+(27*4)(SB)/4,$0x455a14ed	
	DATA	md5tab<>+(28*4)(SB)/4,$0xa9e3e905	
	DATA	md5tab<>+(29*4)(SB)/4,$0xfcefa3f8	
	DATA	md5tab<>+(30*4)(SB)/4,$0x676f02d9	
	DATA	md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a

	/* round 3 */
	DATA	md5tab<>+(32*4)(SB)/4,$0xfffa3942	
	DATA	md5tab<>+(33*4)(SB)/4,$0x8771f681	
	DATA	md5tab<>+(34*4)(SB)/4,$0x6d9d6122	
	DATA	md5tab<>+(35*4)(SB)/4,$0xfde5380c	
	DATA	md5tab<>+(36*4)(SB)/4,$0xa4beea44	
	DATA	md5tab<>+(37*4)(SB)/4,$0x4bdecfa9	
	DATA	md5tab<>+(38*4)(SB)/4,$0xf6bb4b60	
	DATA	md5tab<>+(39*4)(SB)/4,$0xbebfbc70	
	DATA	md5tab<>+(40*4)(SB)/4,$0x289b7ec6	
	DATA	md5tab<>+(41*4)(SB)/4,$0xeaa127fa	
	DATA	md5tab<>+(42*4)(SB)/4,$0xd4ef3085	
	DATA	md5tab<>+(43*4)(SB)/4,$0x04881d05	
	DATA	md5tab<>+(44*4)(SB)/4,$0xd9d4d039	
	DATA	md5tab<>+(45*4)(SB)/4,$0xe6db99e5	
	DATA	md5tab<>+(46*4)(SB)/4,$0x1fa27cf8	
	DATA	md5tab<>+(47*4)(SB)/4,$0xc4ac5665	

	/* round 4 */
	DATA	md5tab<>+(48*4)(SB)/4,$0xf4292244	
	DATA	md5tab<>+(49*4)(SB)/4,$0x432aff97	
	DATA	md5tab<>+(50*4)(SB)/4,$0xab9423a7	
	DATA	md5tab<>+(51*4)(SB)/4,$0xfc93a039	
	DATA	md5tab<>+(52*4)(SB)/4,$0x655b59c3	
	DATA	md5tab<>+(53*4)(SB)/4,$0x8f0ccc92	
	DATA	md5tab<>+(54*4)(SB)/4,$0xffeff47d	
	DATA	md5tab<>+(55*4)(SB)/4,$0x85845dd1	
	DATA	md5tab<>+(56*4)(SB)/4,$0x6fa87e4f	
	DATA	md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0	
	DATA	md5tab<>+(58*4)(SB)/4,$0xa3014314	
	DATA	md5tab<>+(59*4)(SB)/4,$0x4e0811a1	
	DATA	md5tab<>+(60*4)(SB)/4,$0xf7537e82	
	DATA	md5tab<>+(61*4)(SB)/4,$0xbd3af235	
	DATA	md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb	
	DATA	md5tab<>+(63*4)(SB)/4,$0xeb86d391

#define S11 7
#define S12 12
#define S13 17
#define S14 22

#define S21 5
#define S22 9
#define S23 14
#define S24 20

#define S31 4
#define S32 11
#define S33 16
#define S34 23

#define S41 6
#define S42 10
#define S43 15
#define S44 21

#define	AREG		R5
#define BREG		R6
#define CREG		R7
#define DREG		R8
#define DATAREG		R1
#define TABREG		R10
#define STREG		R11
#define XREG		R12
#define ELOOPREG	R13
#define EDREG		R14
#define IREG		R15

#define TMP1		R9
#define TMP2		R2
#define TMP3		R3
#define TMP4		R4

/*
 * decode little endian data into x[off], then the body
 * bodies have this form:
 *	a += FN(B,C,D);
 *	a += x[off] + t[off];
 *	a = (a << S11) | (a >> (32 - S11));
 *	a += b;
 */
#define BODY1(off,FN,SH,A,B,C,D)\
	MOVBU off(DATAREG),TMP2;\
	MOVBU (off+1)(DATAREG),TMP3;\
	MOVBU (off+2)(DATAREG),TMP1;\
	MOVBU (off+3)(DATAREG),TMP4;\
	SLL $8,TMP3;\
	OR TMP3,TMP2;\
	SLL $16,TMP1;\
	OR TMP1,TMP2;\
	SLL $24,TMP4;\
	OR TMP4,TMP2;\
	MOVW off(TABREG),TMP3;\
	FN(B,C,D)\
	ADDU TMP1,A;\
	MOVW TMP2,off(XREG);\
	ADDU TMP2,A;\
	ADDU TMP3,A;\
	SLL $SH,A,TMP1;\
	SRL $(32-SH),A;\
	OR TMP1,A;\
	ADDU B,A;\

#define BODY(off,inc,FN,SH,A,B,C,D)\
	MOVW off(TABREG),TMP3;\
	ADDU XREG,IREG,TMP4;\
	MOVW (TMP4),TMP2;\
	ADDU $(inc*4),IREG;\
	AND $63,IREG;\
	FN(B,C,D)\
	ADDU TMP1,A;\
	ADDU TMP2,A;\
	ADDU TMP3,A;\
	SLL $SH,A,TMP1;\
	SRL $(32-SH),A;\
	OR  TMP1,A;\
	ADDU B,A;\

/*
 * fn1 = ((c ^ d) & b) ^ d
 */
#define FN1(B,C,D)\
	XOR C,D,TMP1;\
	AND B,TMP1;\
	XOR D,TMP1;\

/*
 * fn2 = ((b ^ c) & d) ^ c;
 */
#define FN2(B,C,D)\
	XOR B,C,TMP1;\
	AND D,TMP1;\
	XOR C,TMP1;\

/*
 * fn3 = b ^ c ^ d;
 */
#define FN3(B,C,D)\
	XOR B,C,TMP1;\
	XOR D,TMP1;\

/*
 * fn4 = c ^ (b | ~d);
 */
#define FN4(B,C,D)\
	XOR $-1,D,TMP1;\
	OR B,TMP1;\
	XOR C,TMP1;\

#define	DATA	0
#define	LEN	4
#define	STATE	8

#define XOFF	(-4-16*4)

	TEXT	_md5block+0(SB),$68

	MOVW	len+LEN(FP),TMP1
	ADDU	DATAREG,TMP1,EDREG
	MOVW	state+STATE(FP),STREG

	MOVW 0(STREG),AREG
	MOVW 4(STREG),BREG
	MOVW 8(STREG),CREG
	MOVW 12(STREG),DREG

mainloop:

	MOVW $md5tab<>+0(SB),TABREG
	ADDU $(16*4),DATAREG,ELOOPREG
	MOVW $x+XOFF(SP),XREG

loop1:
	BODY1(0,FN1,S11,AREG,BREG,CREG,DREG)
	BODY1(4,FN1,S12,DREG,AREG,BREG,CREG)
	BODY1(8,FN1,S13,CREG,DREG,AREG,BREG)
	BODY1(12,FN1,S14,BREG,CREG,DREG,AREG)

	ADDU $16,DATAREG
	ADDU $16,TABREG
	ADDU $16,XREG

	BNE DATAREG,ELOOPREG,loop1


	MOVW $x+XOFF(SP),XREG
	MOVW $(1*4),IREG
	MOVW $(1*4),ELOOPREG
loop2:
	BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG)
	BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG)
	BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG)
	BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG)

	ADDU $16,TABREG

	BNE IREG,ELOOPREG,loop2


	MOVW $(5*4),IREG
	MOVW $(5*4),ELOOPREG
loop3:
	BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG)
	BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG)
	BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG)
	BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG)

	ADDU $16,TABREG

	BNE IREG,ELOOPREG,loop3


	MOVW $0,IREG
loop4:
	BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG)
	BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG)
	BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG)
	BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG)

	ADDU $16,TABREG

	BNE IREG,R0,loop4

	MOVW 0(STREG),TMP1
	MOVW 4(STREG),TMP2
	MOVW 8(STREG),TMP3
	MOVW 12(STREG),TMP4
	ADDU TMP1,AREG
	ADDU TMP2,BREG
	ADDU TMP3,CREG
	ADDU TMP4,DREG
	MOVW AREG,0(STREG)
	MOVW BREG,4(STREG)
	MOVW CREG,8(STREG)
	MOVW DREG,12(STREG)

	BNE DATAREG,EDREG,mainloop

	RET

	GLOBL	md5tab<>+0(SB),$256

	END