xref: /plan9/sys/src/libsec/mips/md5block.s (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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
229mainloop:
230
231	MOVW $md5tab<>+0(SB),TABREG
232	ADDU $(16*4),DATAREG,ELOOPREG
233	MOVW $x+XOFF(SP),XREG
234
235loop1:
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
251loop2:
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
264loop3:
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
276loop4:
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
306