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