1*8ccd4a63SDavid du Colombier/* 2*8ccd4a63SDavid du Colombier * rfc1321 requires that I include this. The code is new. The constants 3*8ccd4a63SDavid du Colombier * all come from the rfc (hence the copyright). We trade a table for the 4*8ccd4a63SDavid du Colombier * macros in rfc. The total size is a lot less. -- presotto 5*8ccd4a63SDavid du Colombier * 6*8ccd4a63SDavid du Colombier * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 7*8ccd4a63SDavid du Colombier * rights reserved. 8*8ccd4a63SDavid du Colombier * 9*8ccd4a63SDavid du Colombier * License to copy and use this software is granted provided that it 10*8ccd4a63SDavid du Colombier * is identified as the "RSA Data Security, Inc. MD5 Message-Digest 11*8ccd4a63SDavid du Colombier * Algorithm" in all material mentioning or referencing this software 12*8ccd4a63SDavid du Colombier * or this function. 13*8ccd4a63SDavid du Colombier * 14*8ccd4a63SDavid du Colombier * License is also granted to make and use derivative works provided 15*8ccd4a63SDavid du Colombier * that such works are identified as "derived from the RSA Data 16*8ccd4a63SDavid du Colombier * Security, Inc. MD5 Message-Digest Algorithm" in all material 17*8ccd4a63SDavid du Colombier * mentioning or referencing the derived work. 18*8ccd4a63SDavid du Colombier * 19*8ccd4a63SDavid du Colombier * RSA Data Security, Inc. makes no representations concerning either 20*8ccd4a63SDavid du Colombier * the merchantability of this software or the suitability of this 21*8ccd4a63SDavid du Colombier * software forany particular purpose. It is provided "as is" 22*8ccd4a63SDavid du Colombier * without express or implied warranty of any kind. 23*8ccd4a63SDavid du Colombier * These notices must be retained in any copies of any part of this 24*8ccd4a63SDavid du Colombier * documentation and/or software. 25*8ccd4a63SDavid du Colombier */ 26*8ccd4a63SDavid du Colombier#define S11 7 27*8ccd4a63SDavid du Colombier#define S12 12 28*8ccd4a63SDavid du Colombier#define S13 17 29*8ccd4a63SDavid du Colombier#define S14 22 30*8ccd4a63SDavid du Colombier 31*8ccd4a63SDavid du Colombier#define S21 5 32*8ccd4a63SDavid du Colombier#define S22 9 33*8ccd4a63SDavid du Colombier#define S23 14 34*8ccd4a63SDavid du Colombier#define S24 20 35*8ccd4a63SDavid du Colombier 36*8ccd4a63SDavid du Colombier#define S31 4 37*8ccd4a63SDavid du Colombier#define S32 11 38*8ccd4a63SDavid du Colombier#define S33 16 39*8ccd4a63SDavid du Colombier#define S34 23 40*8ccd4a63SDavid du Colombier 41*8ccd4a63SDavid du Colombier#define S41 6 42*8ccd4a63SDavid du Colombier#define S42 10 43*8ccd4a63SDavid du Colombier#define S43 15 44*8ccd4a63SDavid du Colombier#define S44 21 45*8ccd4a63SDavid du Colombier 46*8ccd4a63SDavid du Colombier#define PAYME(x) $ ## x 47*8ccd4a63SDavid du Colombier 48*8ccd4a63SDavid du Colombier/* 49*8ccd4a63SDavid du Colombier * SI is data 50*8ccd4a63SDavid du Colombier * a += FN(B,C,D); 51*8ccd4a63SDavid du Colombier * a += x[sh] + t[sh]; 52*8ccd4a63SDavid du Colombier * a = (a << S11) | (a >> (32 - S11)); 53*8ccd4a63SDavid du Colombier * a += b; 54*8ccd4a63SDavid du Colombier */ 55*8ccd4a63SDavid du Colombier 56*8ccd4a63SDavid du Colombier#define BODY1(off,V,FN,SH,A,B,C,D)\ 57*8ccd4a63SDavid du Colombier FN(B,C,D)\ 58*8ccd4a63SDavid du Colombier leal V(A, %edi, 1), A;\ 59*8ccd4a63SDavid du Colombier addl off(%ebp), A;\ 60*8ccd4a63SDavid du Colombier roll PAYME(SH), A;\ 61*8ccd4a63SDavid du Colombier addl B, A;\ 62*8ccd4a63SDavid du Colombier 63*8ccd4a63SDavid du Colombier#define BODY(off,V,FN,SH,A,B,C,D)\ 64*8ccd4a63SDavid du Colombier FN(B,C,D)\ 65*8ccd4a63SDavid du Colombier leal V(A, %edi, 1), A;\ 66*8ccd4a63SDavid du Colombier addl (off)(%ebp), A;\ 67*8ccd4a63SDavid du Colombier roll PAYME(SH), A;\ 68*8ccd4a63SDavid du Colombier addl B,A;\ 69*8ccd4a63SDavid du Colombier 70*8ccd4a63SDavid du Colombier/* 71*8ccd4a63SDavid du Colombier * fn1 = ((c ^ d) & b) ^ d 72*8ccd4a63SDavid du Colombier */ 73*8ccd4a63SDavid du Colombier#define FN1(B,C,D)\ 74*8ccd4a63SDavid du Colombier movl C, %edi;\ 75*8ccd4a63SDavid du Colombier xorl D, %edi;\ 76*8ccd4a63SDavid du Colombier andl B, %edi;\ 77*8ccd4a63SDavid du Colombier xorl D, %edi;\ 78*8ccd4a63SDavid du Colombier 79*8ccd4a63SDavid du Colombier/* 80*8ccd4a63SDavid du Colombier * fn2 = ((b ^ c) & d) ^ c; 81*8ccd4a63SDavid du Colombier */ 82*8ccd4a63SDavid du Colombier#define FN2(B,C,D)\ 83*8ccd4a63SDavid du Colombier movl B, %edi;\ 84*8ccd4a63SDavid du Colombier xorl C, %edi;\ 85*8ccd4a63SDavid du Colombier andl D, %edi;\ 86*8ccd4a63SDavid du Colombier xorl C, %edi;\ 87*8ccd4a63SDavid du Colombier 88*8ccd4a63SDavid du Colombier/* 89*8ccd4a63SDavid du Colombier * fn3 = b ^ c ^ d; 90*8ccd4a63SDavid du Colombier */ 91*8ccd4a63SDavid du Colombier#define FN3(B,C,D)\ 92*8ccd4a63SDavid du Colombier movl B, %edi;\ 93*8ccd4a63SDavid du Colombier xorl C, %edi;\ 94*8ccd4a63SDavid du Colombier xorl D, %edi;\ 95*8ccd4a63SDavid du Colombier 96*8ccd4a63SDavid du Colombier/* 97*8ccd4a63SDavid du Colombier * fn4 = c ^ (b | ~d); 98*8ccd4a63SDavid du Colombier */ 99*8ccd4a63SDavid du Colombier#define FN4(B,C,D)\ 100*8ccd4a63SDavid du Colombier movl D, %edi;\ 101*8ccd4a63SDavid du Colombier xorl $-1, %edi;\ 102*8ccd4a63SDavid du Colombier orl B, %edi;\ 103*8ccd4a63SDavid du Colombier xorl C, %edi;\ 104*8ccd4a63SDavid du Colombier 105*8ccd4a63SDavid du Colombier#define STACKSIZE 20 106*8ccd4a63SDavid du Colombier 107*8ccd4a63SDavid du Colombier#define DATA (STACKSIZE+8) 108*8ccd4a63SDavid du Colombier#define LEN (STACKSIZE+12) 109*8ccd4a63SDavid du Colombier#define STATE (STACKSIZE+16) 110*8ccd4a63SDavid du Colombier 111*8ccd4a63SDavid du Colombier#define EDATA (STACKSIZE-4) 112*8ccd4a63SDavid du Colombier#define OLDEBX (STACKSIZE-8) 113*8ccd4a63SDavid du Colombier#define OLDESI (STACKSIZE-12) 114*8ccd4a63SDavid du Colombier#define OLDEDI (STACKSIZE-16) 115*8ccd4a63SDavid du Colombier 116*8ccd4a63SDavid du Colombier .text 117*8ccd4a63SDavid du Colombier 118*8ccd4a63SDavid du Colombier .p2align 2,0x90 119*8ccd4a63SDavid du Colombier .globl ___md5block 120*8ccd4a63SDavid du Colombier ___md5block: 121*8ccd4a63SDavid du Colombier 122*8ccd4a63SDavid du Colombier .p2align 2,0x90 123*8ccd4a63SDavid du Colombier .globl __md5block 124*8ccd4a63SDavid du Colombier __md5block: 125*8ccd4a63SDavid du Colombier 126*8ccd4a63SDavid du Colombier .p2align 2,0x90 127*8ccd4a63SDavid du Colombier .globl _md5block 128*8ccd4a63SDavid du Colombier _md5block: 129*8ccd4a63SDavid du Colombier 130*8ccd4a63SDavid du Colombier .p2align 2,0x90 131*8ccd4a63SDavid du Colombier .globl md5block 132*8ccd4a63SDavid du Colombier md5block: 133*8ccd4a63SDavid du Colombier 134*8ccd4a63SDavid du Colombier /* Prelude */ 135*8ccd4a63SDavid du Colombier pushl %ebp 136*8ccd4a63SDavid du Colombier subl $(STACKSIZE), %esp 137*8ccd4a63SDavid du Colombier movl %ebx, OLDEBX(%esp) 138*8ccd4a63SDavid du Colombier movl %esi, OLDESI(%esp) 139*8ccd4a63SDavid du Colombier movl %edi, OLDEDI(%esp) 140*8ccd4a63SDavid du Colombier 141*8ccd4a63SDavid du Colombier movl DATA(%esp), %eax 142*8ccd4a63SDavid du Colombier addl LEN(%esp), %eax 143*8ccd4a63SDavid du Colombier movl %eax, EDATA(%esp) 144*8ccd4a63SDavid du Colombier 145*8ccd4a63SDavid du Colombier movl DATA(%esp), %ebp 146*8ccd4a63SDavid du Colombier 147*8ccd4a63SDavid du Colombier0: 148*8ccd4a63SDavid du Colombier movl STATE(%esp), %esi 149*8ccd4a63SDavid du Colombier movl (%esi), %eax 150*8ccd4a63SDavid du Colombier movl 4(%esi), %ebx 151*8ccd4a63SDavid du Colombier movl 8(%esi), %ecx 152*8ccd4a63SDavid du Colombier movl 12(%esi), %edx 153*8ccd4a63SDavid du Colombier 154*8ccd4a63SDavid du Colombier BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx) 155*8ccd4a63SDavid du Colombier BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx) 156*8ccd4a63SDavid du Colombier BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx) 157*8ccd4a63SDavid du Colombier BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax) 158*8ccd4a63SDavid du Colombier 159*8ccd4a63SDavid du Colombier BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx) 160*8ccd4a63SDavid du Colombier BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx) 161*8ccd4a63SDavid du Colombier BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx) 162*8ccd4a63SDavid du Colombier BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax) 163*8ccd4a63SDavid du Colombier 164*8ccd4a63SDavid du Colombier BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx) 165*8ccd4a63SDavid du Colombier BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx) 166*8ccd4a63SDavid du Colombier BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx) 167*8ccd4a63SDavid du Colombier BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax) 168*8ccd4a63SDavid du Colombier 169*8ccd4a63SDavid du Colombier BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx) 170*8ccd4a63SDavid du Colombier BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx) 171*8ccd4a63SDavid du Colombier BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx) 172*8ccd4a63SDavid du Colombier BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax) 173*8ccd4a63SDavid du Colombier 174*8ccd4a63SDavid du Colombier 175*8ccd4a63SDavid du Colombier BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx) 176*8ccd4a63SDavid du Colombier BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx) 177*8ccd4a63SDavid du Colombier BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx) 178*8ccd4a63SDavid du Colombier BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax) 179*8ccd4a63SDavid du Colombier 180*8ccd4a63SDavid du Colombier BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx) 181*8ccd4a63SDavid du Colombier BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx) 182*8ccd4a63SDavid du Colombier BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx) 183*8ccd4a63SDavid du Colombier BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax) 184*8ccd4a63SDavid du Colombier 185*8ccd4a63SDavid du Colombier BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx) 186*8ccd4a63SDavid du Colombier BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx) 187*8ccd4a63SDavid du Colombier BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx) 188*8ccd4a63SDavid du Colombier BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax) 189*8ccd4a63SDavid du Colombier 190*8ccd4a63SDavid du Colombier BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx) 191*8ccd4a63SDavid du Colombier BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx) 192*8ccd4a63SDavid du Colombier BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx) 193*8ccd4a63SDavid du Colombier BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax) 194*8ccd4a63SDavid du Colombier 195*8ccd4a63SDavid du Colombier 196*8ccd4a63SDavid du Colombier BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx) 197*8ccd4a63SDavid du Colombier BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx) 198*8ccd4a63SDavid du Colombier BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx) 199*8ccd4a63SDavid du Colombier BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax) 200*8ccd4a63SDavid du Colombier 201*8ccd4a63SDavid du Colombier BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx) 202*8ccd4a63SDavid du Colombier BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx) 203*8ccd4a63SDavid du Colombier BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx) 204*8ccd4a63SDavid du Colombier BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax) 205*8ccd4a63SDavid du Colombier 206*8ccd4a63SDavid du Colombier BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx) 207*8ccd4a63SDavid du Colombier BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx) 208*8ccd4a63SDavid du Colombier BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx) 209*8ccd4a63SDavid du Colombier BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax) 210*8ccd4a63SDavid du Colombier 211*8ccd4a63SDavid du Colombier BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx) 212*8ccd4a63SDavid du Colombier BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx) 213*8ccd4a63SDavid du Colombier BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx) 214*8ccd4a63SDavid du Colombier BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax) 215*8ccd4a63SDavid du Colombier 216*8ccd4a63SDavid du Colombier 217*8ccd4a63SDavid du Colombier BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx) 218*8ccd4a63SDavid du Colombier BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx) 219*8ccd4a63SDavid du Colombier BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx) 220*8ccd4a63SDavid du Colombier BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax) 221*8ccd4a63SDavid du Colombier 222*8ccd4a63SDavid du Colombier BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx) 223*8ccd4a63SDavid du Colombier BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx) 224*8ccd4a63SDavid du Colombier BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx) 225*8ccd4a63SDavid du Colombier BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax) 226*8ccd4a63SDavid du Colombier 227*8ccd4a63SDavid du Colombier BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx) 228*8ccd4a63SDavid du Colombier BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx) 229*8ccd4a63SDavid du Colombier BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx) 230*8ccd4a63SDavid du Colombier BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax) 231*8ccd4a63SDavid du Colombier 232*8ccd4a63SDavid du Colombier BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx) 233*8ccd4a63SDavid du Colombier BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx) 234*8ccd4a63SDavid du Colombier BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx) 235*8ccd4a63SDavid du Colombier BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax) 236*8ccd4a63SDavid du Colombier 237*8ccd4a63SDavid du Colombier addl $(16*4), %ebp 238*8ccd4a63SDavid du Colombier movl STATE(%esp), %edi 239*8ccd4a63SDavid du Colombier addl %eax,0(%edi) 240*8ccd4a63SDavid du Colombier addl %ebx,4(%edi) 241*8ccd4a63SDavid du Colombier addl %ecx,8(%edi) 242*8ccd4a63SDavid du Colombier addl %edx,12(%edi) 243*8ccd4a63SDavid du Colombier 244*8ccd4a63SDavid du Colombier movl EDATA(%esp), %edi 245*8ccd4a63SDavid du Colombier cmpl %edi, %ebp 246*8ccd4a63SDavid du Colombier jb 0b 247*8ccd4a63SDavid du Colombier 248*8ccd4a63SDavid du Colombier /* Postlude */ 249*8ccd4a63SDavid du Colombier movl OLDEBX(%esp), %ebx 250*8ccd4a63SDavid du Colombier movl OLDESI(%esp), %esi 251*8ccd4a63SDavid du Colombier movl OLDEDI(%esp), %edi 252*8ccd4a63SDavid du Colombier addl $(STACKSIZE), %esp 253*8ccd4a63SDavid du Colombier popl %ebp 254*8ccd4a63SDavid du Colombier ret 255*8ccd4a63SDavid du Colombier 256