Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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

Generated by GNU Enscript 1.6.6.