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