/*
 *  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 __Darwin__
	.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

