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