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