1*80ee5cbfSDavid du Colombier TEXT _sha1block+0(SB),$328 2*80ee5cbfSDavid du Colombier 3*80ee5cbfSDavid du Colombier/* 4*80ee5cbfSDavid du Colombier * wp[off] = x; 5*80ee5cbfSDavid du Colombier * x += A <<< 5; 6*80ee5cbfSDavid du Colombier * E += 0xca62c1d6 + x; 7*80ee5cbfSDavid du Colombier * x = FN(B,C,D); 8*80ee5cbfSDavid du Colombier * E += x; 9*80ee5cbfSDavid du Colombier * B >>> 2 10*80ee5cbfSDavid du Colombier */ 11*80ee5cbfSDavid du Colombier#define BODYX(off,FN,V,A,B,C,D,E)\ 12*80ee5cbfSDavid du Colombier FN(B,C,D)\ 13*80ee5cbfSDavid du Colombier ADDU TMP1,E;\ 14*80ee5cbfSDavid du Colombier ADDU V,E;\ 15*80ee5cbfSDavid du Colombier MOVW TMP2,off(WREG);\ 16*80ee5cbfSDavid du Colombier ADDU TMP2,E;\ 17*80ee5cbfSDavid du Colombier SLL $5,A,TMP3;\ 18*80ee5cbfSDavid du Colombier SRL $27,A,TMP4;\ 19*80ee5cbfSDavid du Colombier OR TMP3,TMP4;\ 20*80ee5cbfSDavid du Colombier ADDU TMP4,E;\ 21*80ee5cbfSDavid du Colombier SLL $30,B,TMP4;\ 22*80ee5cbfSDavid du Colombier SRL $2,B;\ 23*80ee5cbfSDavid du Colombier OR TMP4,B 24*80ee5cbfSDavid du Colombier 25*80ee5cbfSDavid du Colombier/* 26*80ee5cbfSDavid du Colombier * x = data[i] 27*80ee5cbfSDavid du Colombier * BODYX 28*80ee5cbfSDavid du Colombier */ 29*80ee5cbfSDavid du Colombier#define BODY1(off,FN,V,A,B,C,D,E)\ 30*80ee5cbfSDavid du Colombier MOVBU off(DATAREG),TMP2;\ 31*80ee5cbfSDavid du Colombier MOVBU (off+1)(DATAREG),TMP3;\ 32*80ee5cbfSDavid du Colombier MOVBU (off+2)(DATAREG),TMP1;\ 33*80ee5cbfSDavid du Colombier MOVBU (off+3)(DATAREG),TMP4;\ 34*80ee5cbfSDavid du Colombier SLL $24,TMP2;\ 35*80ee5cbfSDavid du Colombier SLL $16,TMP3;\ 36*80ee5cbfSDavid du Colombier OR TMP3,TMP2;\ 37*80ee5cbfSDavid du Colombier SLL $8,TMP1;\ 38*80ee5cbfSDavid du Colombier OR TMP1,TMP2;\ 39*80ee5cbfSDavid du Colombier OR TMP4,TMP2;\ 40*80ee5cbfSDavid du Colombier BODYX(off,FN,V,A,B,C,D,E) 41*80ee5cbfSDavid du Colombier 42*80ee5cbfSDavid du Colombier/* 43*80ee5cbfSDavid du Colombier * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; 44*80ee5cbfSDavid du Colombier * BODYX 45*80ee5cbfSDavid du Colombier */ 46*80ee5cbfSDavid du Colombier#define BODY(off,FN,V,A,B,C,D,E)\ 47*80ee5cbfSDavid du Colombier MOVW (off-64)(WREG),TMP1;\ 48*80ee5cbfSDavid du Colombier MOVW (off-56)(WREG),TMP2;\ 49*80ee5cbfSDavid du Colombier MOVW (off-32)(WREG),TMP3;\ 50*80ee5cbfSDavid du Colombier MOVW (off-12)(WREG),TMP4;\ 51*80ee5cbfSDavid du Colombier XOR TMP1,TMP2;\ 52*80ee5cbfSDavid du Colombier XOR TMP3,TMP2;\ 53*80ee5cbfSDavid du Colombier XOR TMP4,TMP2;\ 54*80ee5cbfSDavid du Colombier SLL $1,TMP2,TMP1;\ 55*80ee5cbfSDavid du Colombier SRL $31,TMP2;\ 56*80ee5cbfSDavid du Colombier OR TMP1,TMP2;\ 57*80ee5cbfSDavid du Colombier BODYX(off,FN,V,A,B,C,D,E) 58*80ee5cbfSDavid du Colombier 59*80ee5cbfSDavid du Colombier/* 60*80ee5cbfSDavid du Colombier * fn1 = (((C^D)&B)^D); 61*80ee5cbfSDavid du Colombier */ 62*80ee5cbfSDavid du Colombier#define FN1(B,C,D)\ 63*80ee5cbfSDavid du Colombier XOR C,D,TMP1;\ 64*80ee5cbfSDavid du Colombier AND B,TMP1;\ 65*80ee5cbfSDavid du Colombier XOR D,TMP1; 66*80ee5cbfSDavid du Colombier 67*80ee5cbfSDavid du Colombier/* 68*80ee5cbfSDavid du Colombier * fn24 = B ^ C ^ D 69*80ee5cbfSDavid du Colombier */ 70*80ee5cbfSDavid du Colombier#define FN24(B,C,D)\ 71*80ee5cbfSDavid du Colombier XOR B,C,TMP1;\ 72*80ee5cbfSDavid du Colombier XOR D,TMP1; 73*80ee5cbfSDavid du Colombier 74*80ee5cbfSDavid du Colombier/* 75*80ee5cbfSDavid du Colombier * fn3 = ((B ^ C) & (D ^ B)) ^ B 76*80ee5cbfSDavid du Colombier */ 77*80ee5cbfSDavid du Colombier#define FN3(B,C,D)\ 78*80ee5cbfSDavid du Colombier XOR B,C,TMP1;\ 79*80ee5cbfSDavid du Colombier XOR B,D,TMP4;\ 80*80ee5cbfSDavid du Colombier AND TMP4,TMP1;\ 81*80ee5cbfSDavid du Colombier XOR B,TMP1; 82*80ee5cbfSDavid du Colombier 83*80ee5cbfSDavid du Colombier/* 84*80ee5cbfSDavid du Colombier * stack offsets 85*80ee5cbfSDavid du Colombier * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN) 86*80ee5cbfSDavid du Colombier */ 87*80ee5cbfSDavid du Colombier#define DATA 0 88*80ee5cbfSDavid du Colombier#define LEN 4 89*80ee5cbfSDavid du Colombier#define STATE 8 90*80ee5cbfSDavid du Colombier 91*80ee5cbfSDavid du Colombier/* 92*80ee5cbfSDavid du Colombier * stack offsets for locals 93*80ee5cbfSDavid du Colombier * ulong w[80]; 94*80ee5cbfSDavid du Colombier * uchar *edata; 95*80ee5cbfSDavid du Colombier * ulong *w15, *w40, *w60, *w80; 96*80ee5cbfSDavid du Colombier * register local 97*80ee5cbfSDavid du Colombier * ulong *wp = BP 98*80ee5cbfSDavid du Colombier * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi 99*80ee5cbfSDavid du Colombier * ulong tmp = edi 100*80ee5cbfSDavid du Colombier */ 101*80ee5cbfSDavid du Colombier#define WARRAY (-4-(80*4)) 102*80ee5cbfSDavid du Colombier 103*80ee5cbfSDavid du Colombier#define AREG R5 104*80ee5cbfSDavid du Colombier#define BREG R6 105*80ee5cbfSDavid du Colombier#define CREG R7 106*80ee5cbfSDavid du Colombier#define DREG R8 107*80ee5cbfSDavid du Colombier#define EREG R9 108*80ee5cbfSDavid du Colombier#define DATAREG R1 109*80ee5cbfSDavid du Colombier#define STREG R11 110*80ee5cbfSDavid du Colombier#define WREG R12 111*80ee5cbfSDavid du Colombier#define W15REG R13 112*80ee5cbfSDavid du Colombier#define W60REG R14 113*80ee5cbfSDavid du Colombier#define W40REG R15 114*80ee5cbfSDavid du Colombier#define W80REG R16 115*80ee5cbfSDavid du Colombier#define EDREG R17 116*80ee5cbfSDavid du Colombier#define VREG R18 117*80ee5cbfSDavid du Colombier 118*80ee5cbfSDavid du Colombier#define TMP1 R10 119*80ee5cbfSDavid du Colombier#define TMP2 R2 120*80ee5cbfSDavid du Colombier#define TMP3 R3 121*80ee5cbfSDavid du Colombier#define TMP4 R4 122*80ee5cbfSDavid du Colombier#define TMP5 R19 123*80ee5cbfSDavid du Colombier 124*80ee5cbfSDavid du Colombier MOVW len+LEN(FP),TMP1 125*80ee5cbfSDavid du Colombier MOVW state+STATE(FP),STREG 126*80ee5cbfSDavid du Colombier ADDU DATAREG,TMP1,EDREG 127*80ee5cbfSDavid du Colombier 128*80ee5cbfSDavid du Colombier MOVW 0(STREG),AREG 129*80ee5cbfSDavid du Colombier MOVW 4(STREG),BREG 130*80ee5cbfSDavid du Colombier MOVW 8(STREG),CREG 131*80ee5cbfSDavid du Colombier MOVW 12(STREG),DREG 132*80ee5cbfSDavid du Colombier MOVW 16(STREG),EREG 133*80ee5cbfSDavid du Colombier 134*80ee5cbfSDavid du Colombier MOVW $warray+WARRAY(SP),WREG 135*80ee5cbfSDavid du Colombier ADDU $(15*4),WREG,W15REG 136*80ee5cbfSDavid du Colombier ADDU $(40*4),WREG,W40REG 137*80ee5cbfSDavid du Colombier ADDU $(60*4),WREG,W60REG 138*80ee5cbfSDavid du Colombier ADDU $(80*4),WREG,W80REG 139*80ee5cbfSDavid du Colombier 140*80ee5cbfSDavid du Colombiermainloop: 141*80ee5cbfSDavid du Colombier MOVW $warray+WARRAY(SP),WREG 142*80ee5cbfSDavid du Colombier 143*80ee5cbfSDavid du Colombier MOVW $0x5a827999,VREG 144*80ee5cbfSDavid du Colombierloop1: 145*80ee5cbfSDavid du Colombier BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) 146*80ee5cbfSDavid du Colombier BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) 147*80ee5cbfSDavid du Colombier BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) 148*80ee5cbfSDavid du Colombier BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) 149*80ee5cbfSDavid du Colombier BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) 150*80ee5cbfSDavid du Colombier 151*80ee5cbfSDavid du Colombier ADDU $20,DATAREG 152*80ee5cbfSDavid du Colombier ADDU $20,WREG 153*80ee5cbfSDavid du Colombier BNE WREG,W15REG,loop1 154*80ee5cbfSDavid du Colombier 155*80ee5cbfSDavid du Colombier BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) 156*80ee5cbfSDavid du Colombier ADDU $4,DATAREG 157*80ee5cbfSDavid du Colombier 158*80ee5cbfSDavid du Colombier BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) 159*80ee5cbfSDavid du Colombier BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) 160*80ee5cbfSDavid du Colombier BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) 161*80ee5cbfSDavid du Colombier BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) 162*80ee5cbfSDavid du Colombier 163*80ee5cbfSDavid du Colombier ADDU $20,WREG 164*80ee5cbfSDavid du Colombier 165*80ee5cbfSDavid du Colombier MOVW $0x6ed9eba1,VREG 166*80ee5cbfSDavid du Colombierloop2: 167*80ee5cbfSDavid du Colombier BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) 168*80ee5cbfSDavid du Colombier BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) 169*80ee5cbfSDavid du Colombier BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) 170*80ee5cbfSDavid du Colombier BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) 171*80ee5cbfSDavid du Colombier BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) 172*80ee5cbfSDavid du Colombier 173*80ee5cbfSDavid du Colombier ADDU $20,WREG 174*80ee5cbfSDavid du Colombier BNE WREG,W40REG,loop2 175*80ee5cbfSDavid du Colombier 176*80ee5cbfSDavid du Colombier MOVW $0x8f1bbcdc,VREG 177*80ee5cbfSDavid du Colombierloop3: 178*80ee5cbfSDavid du Colombier BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG) 179*80ee5cbfSDavid du Colombier BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG) 180*80ee5cbfSDavid du Colombier BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG) 181*80ee5cbfSDavid du Colombier BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG) 182*80ee5cbfSDavid du Colombier BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG) 183*80ee5cbfSDavid du Colombier 184*80ee5cbfSDavid du Colombier ADDU $20,WREG 185*80ee5cbfSDavid du Colombier BNE WREG,W60REG,loop3 186*80ee5cbfSDavid du Colombier 187*80ee5cbfSDavid du Colombier MOVW $0xca62c1d6,VREG 188*80ee5cbfSDavid du Colombierloop4: 189*80ee5cbfSDavid du Colombier BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) 190*80ee5cbfSDavid du Colombier BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) 191*80ee5cbfSDavid du Colombier BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) 192*80ee5cbfSDavid du Colombier BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) 193*80ee5cbfSDavid du Colombier BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) 194*80ee5cbfSDavid du Colombier 195*80ee5cbfSDavid du Colombier ADDU $20,WREG 196*80ee5cbfSDavid du Colombier BNE WREG,W80REG,loop4 197*80ee5cbfSDavid du Colombier 198*80ee5cbfSDavid du Colombier MOVW 0(STREG),TMP1 199*80ee5cbfSDavid du Colombier MOVW 4(STREG),TMP2 200*80ee5cbfSDavid du Colombier MOVW 8(STREG),TMP3 201*80ee5cbfSDavid du Colombier MOVW 12(STREG),TMP4 202*80ee5cbfSDavid du Colombier MOVW 16(STREG),TMP5 203*80ee5cbfSDavid du Colombier 204*80ee5cbfSDavid du Colombier ADDU TMP1,AREG 205*80ee5cbfSDavid du Colombier ADDU TMP2,BREG 206*80ee5cbfSDavid du Colombier ADDU TMP3,CREG 207*80ee5cbfSDavid du Colombier ADDU TMP4,DREG 208*80ee5cbfSDavid du Colombier ADDU TMP5,EREG 209*80ee5cbfSDavid du Colombier 210*80ee5cbfSDavid du Colombier MOVW AREG,0(STREG) 211*80ee5cbfSDavid du Colombier MOVW BREG,4(STREG) 212*80ee5cbfSDavid du Colombier MOVW CREG,8(STREG) 213*80ee5cbfSDavid du Colombier MOVW DREG,12(STREG) 214*80ee5cbfSDavid du Colombier MOVW EREG,16(STREG) 215*80ee5cbfSDavid du Colombier 216*80ee5cbfSDavid du Colombier BNE DATAREG,EDREG,mainloop 217*80ee5cbfSDavid du Colombier 218*80ee5cbfSDavid du Colombier RET 219*80ee5cbfSDavid du Colombier 220*80ee5cbfSDavid du Colombier END 221