/*
* 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.
*/
/* round 1 */
DATA md5tab<>+( 0*4)(SB)/4,$0xd76aa478
DATA md5tab<>+( 1*4)(SB)/4,$0xe8c7b756
DATA md5tab<>+( 2*4)(SB)/4,$0x242070db
DATA md5tab<>+( 3*4)(SB)/4,$0xc1bdceee
DATA md5tab<>+( 4*4)(SB)/4,$0xf57c0faf
DATA md5tab<>+( 5*4)(SB)/4,$0x4787c62a
DATA md5tab<>+( 6*4)(SB)/4,$0xa8304613
DATA md5tab<>+( 7*4)(SB)/4,$0xfd469501
DATA md5tab<>+( 8*4)(SB)/4,$0x698098d8
DATA md5tab<>+( 9*4)(SB)/4,$0x8b44f7af
DATA md5tab<>+(10*4)(SB)/4,$0xffff5bb1
DATA md5tab<>+(11*4)(SB)/4,$0x895cd7be
DATA md5tab<>+(12*4)(SB)/4,$0x6b901122
DATA md5tab<>+(13*4)(SB)/4,$0xfd987193
DATA md5tab<>+(14*4)(SB)/4,$0xa679438e
DATA md5tab<>+(15*4)(SB)/4,$0x49b40821
/* round 2 */
DATA md5tab<>+(16*4)(SB)/4,$0xf61e2562
DATA md5tab<>+(17*4)(SB)/4,$0xc040b340
DATA md5tab<>+(18*4)(SB)/4,$0x265e5a51
DATA md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa
DATA md5tab<>+(20*4)(SB)/4,$0xd62f105d
DATA md5tab<>+(21*4)(SB)/4,$0x02441453
DATA md5tab<>+(22*4)(SB)/4,$0xd8a1e681
DATA md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8
DATA md5tab<>+(24*4)(SB)/4,$0x21e1cde6
DATA md5tab<>+(25*4)(SB)/4,$0xc33707d6
DATA md5tab<>+(26*4)(SB)/4,$0xf4d50d87
DATA md5tab<>+(27*4)(SB)/4,$0x455a14ed
DATA md5tab<>+(28*4)(SB)/4,$0xa9e3e905
DATA md5tab<>+(29*4)(SB)/4,$0xfcefa3f8
DATA md5tab<>+(30*4)(SB)/4,$0x676f02d9
DATA md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a
/* round 3 */
DATA md5tab<>+(32*4)(SB)/4,$0xfffa3942
DATA md5tab<>+(33*4)(SB)/4,$0x8771f681
DATA md5tab<>+(34*4)(SB)/4,$0x6d9d6122
DATA md5tab<>+(35*4)(SB)/4,$0xfde5380c
DATA md5tab<>+(36*4)(SB)/4,$0xa4beea44
DATA md5tab<>+(37*4)(SB)/4,$0x4bdecfa9
DATA md5tab<>+(38*4)(SB)/4,$0xf6bb4b60
DATA md5tab<>+(39*4)(SB)/4,$0xbebfbc70
DATA md5tab<>+(40*4)(SB)/4,$0x289b7ec6
DATA md5tab<>+(41*4)(SB)/4,$0xeaa127fa
DATA md5tab<>+(42*4)(SB)/4,$0xd4ef3085
DATA md5tab<>+(43*4)(SB)/4,$0x04881d05
DATA md5tab<>+(44*4)(SB)/4,$0xd9d4d039
DATA md5tab<>+(45*4)(SB)/4,$0xe6db99e5
DATA md5tab<>+(46*4)(SB)/4,$0x1fa27cf8
DATA md5tab<>+(47*4)(SB)/4,$0xc4ac5665
/* round 4 */
DATA md5tab<>+(48*4)(SB)/4,$0xf4292244
DATA md5tab<>+(49*4)(SB)/4,$0x432aff97
DATA md5tab<>+(50*4)(SB)/4,$0xab9423a7
DATA md5tab<>+(51*4)(SB)/4,$0xfc93a039
DATA md5tab<>+(52*4)(SB)/4,$0x655b59c3
DATA md5tab<>+(53*4)(SB)/4,$0x8f0ccc92
DATA md5tab<>+(54*4)(SB)/4,$0xffeff47d
DATA md5tab<>+(55*4)(SB)/4,$0x85845dd1
DATA md5tab<>+(56*4)(SB)/4,$0x6fa87e4f
DATA md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0
DATA md5tab<>+(58*4)(SB)/4,$0xa3014314
DATA md5tab<>+(59*4)(SB)/4,$0x4e0811a1
DATA md5tab<>+(60*4)(SB)/4,$0xf7537e82
DATA md5tab<>+(61*4)(SB)/4,$0xbd3af235
DATA md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb
DATA md5tab<>+(63*4)(SB)/4,$0xeb86d391
#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 AREG R5
#define BREG R6
#define CREG R7
#define DREG R8
#define DATAREG R1
#define TABREG R10
#define STREG R11
#define XREG R12
#define ELOOPREG R13
#define EDREG R14
#define IREG R15
#define TMP1 R9
#define TMP2 R2
#define TMP3 R3
#define TMP4 R4
/*
* decode little endian data into x[off], then the body
* bodies have this form:
* a += FN(B,C,D);
* a += x[off] + t[off];
* a = (a << S11) | (a >> (32 - S11));
* a += b;
*/
#define BODY1(off,FN,SH,A,B,C,D)\
MOVBU off(DATAREG),TMP2;\
MOVBU (off+1)(DATAREG),TMP3;\
MOVBU (off+2)(DATAREG),TMP1;\
MOVBU (off+3)(DATAREG),TMP4;\
SLL $8,TMP3;\
OR TMP3,TMP2;\
SLL $16,TMP1;\
OR TMP1,TMP2;\
SLL $24,TMP4;\
OR TMP4,TMP2;\
MOVW off(TABREG),TMP3;\
FN(B,C,D)\
ADDU TMP1,A;\
MOVW TMP2,off(XREG);\
ADDU TMP2,A;\
ADDU TMP3,A;\
SLL $SH,A,TMP1;\
SRL $(32-SH),A;\
OR TMP1,A;\
ADDU B,A;\
#define BODY(off,inc,FN,SH,A,B,C,D)\
MOVW off(TABREG),TMP3;\
ADDU XREG,IREG,TMP4;\
MOVW (TMP4),TMP2;\
ADDU $(inc*4),IREG;\
AND $63,IREG;\
FN(B,C,D)\
ADDU TMP1,A;\
ADDU TMP2,A;\
ADDU TMP3,A;\
SLL $SH,A,TMP1;\
SRL $(32-SH),A;\
OR TMP1,A;\
ADDU B,A;\
/*
* fn1 = ((c ^ d) & b) ^ d
*/
#define FN1(B,C,D)\
XOR C,D,TMP1;\
AND B,TMP1;\
XOR D,TMP1;\
/*
* fn2 = ((b ^ c) & d) ^ c;
*/
#define FN2(B,C,D)\
XOR B,C,TMP1;\
AND D,TMP1;\
XOR C,TMP1;\
/*
* fn3 = b ^ c ^ d;
*/
#define FN3(B,C,D)\
XOR B,C,TMP1;\
XOR D,TMP1;\
/*
* fn4 = c ^ (b | ~d);
*/
#define FN4(B,C,D)\
XOR $-1,D,TMP1;\
OR B,TMP1;\
XOR C,TMP1;\
#define DATA 0
#define LEN 4
#define STATE 8
#define XOFF (-4-16*4)
TEXT _md5block+0(SB),$68
MOVW len+LEN(FP),TMP1
ADDU DATAREG,TMP1,EDREG
MOVW state+STATE(FP),STREG
MOVW 0(STREG),AREG
MOVW 4(STREG),BREG
MOVW 8(STREG),CREG
MOVW 12(STREG),DREG
mainloop:
MOVW $md5tab<>+0(SB),TABREG
ADDU $(16*4),DATAREG,ELOOPREG
MOVW $x+XOFF(SP),XREG
loop1:
BODY1(0,FN1,S11,AREG,BREG,CREG,DREG)
BODY1(4,FN1,S12,DREG,AREG,BREG,CREG)
BODY1(8,FN1,S13,CREG,DREG,AREG,BREG)
BODY1(12,FN1,S14,BREG,CREG,DREG,AREG)
ADDU $16,DATAREG
ADDU $16,TABREG
ADDU $16,XREG
BNE DATAREG,ELOOPREG,loop1
MOVW $x+XOFF(SP),XREG
MOVW $(1*4),IREG
MOVW $(1*4),ELOOPREG
loop2:
BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG)
BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG)
BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG)
BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG)
ADDU $16,TABREG
BNE IREG,ELOOPREG,loop2
MOVW $(5*4),IREG
MOVW $(5*4),ELOOPREG
loop3:
BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG)
BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG)
BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG)
BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG)
ADDU $16,TABREG
BNE IREG,ELOOPREG,loop3
MOVW $0,IREG
loop4:
BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG)
BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG)
BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG)
BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG)
ADDU $16,TABREG
BNE IREG,R0,loop4
MOVW 0(STREG),TMP1
MOVW 4(STREG),TMP2
MOVW 8(STREG),TMP3
MOVW 12(STREG),TMP4
ADDU TMP1,AREG
ADDU TMP2,BREG
ADDU TMP3,CREG
ADDU TMP4,DREG
MOVW AREG,0(STREG)
MOVW BREG,4(STREG)
MOVW CREG,8(STREG)
MOVW DREG,12(STREG)
BNE DATAREG,EDREG,mainloop
RET
GLOBL md5tab<>+0(SB),$256
END
|