123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- /*
- * 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
|