Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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