221 lines
4.0 KiB
ArmAsm
221 lines
4.0 KiB
ArmAsm
TEXT _sha1block+0(SB),$328
|
|
|
|
/*
|
|
* wp[off] = x;
|
|
* x += A <<< 5;
|
|
* E += 0xca62c1d6 + x;
|
|
* x = FN(B,C,D);
|
|
* E += x;
|
|
* B >>> 2
|
|
*/
|
|
#define BODYX(off,FN,V,A,B,C,D,E)\
|
|
FN(B,C,D)\
|
|
ADDU TMP1,E;\
|
|
ADDU V,E;\
|
|
MOVW TMP2,off(WREG);\
|
|
ADDU TMP2,E;\
|
|
SLL $5,A,TMP3;\
|
|
SRL $27,A,TMP4;\
|
|
OR TMP3,TMP4;\
|
|
ADDU TMP4,E;\
|
|
SLL $30,B,TMP4;\
|
|
SRL $2,B;\
|
|
OR TMP4,B
|
|
|
|
/*
|
|
* x = data[i]
|
|
* BODYX
|
|
*/
|
|
#define BODY1(off,FN,V,A,B,C,D,E)\
|
|
MOVBU off(DATAREG),TMP2;\
|
|
MOVBU (off+1)(DATAREG),TMP3;\
|
|
MOVBU (off+2)(DATAREG),TMP1;\
|
|
MOVBU (off+3)(DATAREG),TMP4;\
|
|
SLL $24,TMP2;\
|
|
SLL $16,TMP3;\
|
|
OR TMP3,TMP2;\
|
|
SLL $8,TMP1;\
|
|
OR TMP1,TMP2;\
|
|
OR TMP4,TMP2;\
|
|
BODYX(off,FN,V,A,B,C,D,E)
|
|
|
|
/*
|
|
* x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
|
|
* BODYX
|
|
*/
|
|
#define BODY(off,FN,V,A,B,C,D,E)\
|
|
MOVW (off-64)(WREG),TMP1;\
|
|
MOVW (off-56)(WREG),TMP2;\
|
|
MOVW (off-32)(WREG),TMP3;\
|
|
MOVW (off-12)(WREG),TMP4;\
|
|
XOR TMP1,TMP2;\
|
|
XOR TMP3,TMP2;\
|
|
XOR TMP4,TMP2;\
|
|
SLL $1,TMP2,TMP1;\
|
|
SRL $31,TMP2;\
|
|
OR TMP1,TMP2;\
|
|
BODYX(off,FN,V,A,B,C,D,E)
|
|
|
|
/*
|
|
* fn1 = (((C^D)&B)^D);
|
|
*/
|
|
#define FN1(B,C,D)\
|
|
XOR C,D,TMP1;\
|
|
AND B,TMP1;\
|
|
XOR D,TMP1;
|
|
|
|
/*
|
|
* fn24 = B ^ C ^ D
|
|
*/
|
|
#define FN24(B,C,D)\
|
|
XOR B,C,TMP1;\
|
|
XOR D,TMP1;
|
|
|
|
/*
|
|
* fn3 = ((B ^ C) & (D ^ B)) ^ B
|
|
*/
|
|
#define FN3(B,C,D)\
|
|
XOR B,C,TMP1;\
|
|
XOR B,D,TMP4;\
|
|
AND TMP4,TMP1;\
|
|
XOR B,TMP1;
|
|
|
|
/*
|
|
* stack offsets
|
|
* void vtSha1Block(ulong *STATE, uchar *DATA, int LEN)
|
|
*/
|
|
#define DATA 0
|
|
#define LEN 4
|
|
#define STATE 8
|
|
|
|
/*
|
|
* stack offsets for locals
|
|
* ulong w[80];
|
|
* uchar *edata;
|
|
* ulong *w15, *w40, *w60, *w80;
|
|
* register local
|
|
* ulong *wp = BP
|
|
* ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
|
|
* ulong tmp = edi
|
|
*/
|
|
#define WARRAY (-4-(80*4))
|
|
|
|
#define AREG R5
|
|
#define BREG R6
|
|
#define CREG R7
|
|
#define DREG R8
|
|
#define EREG R9
|
|
#define DATAREG R1
|
|
#define STREG R11
|
|
#define WREG R12
|
|
#define W15REG R13
|
|
#define W60REG R14
|
|
#define W40REG R15
|
|
#define W80REG R16
|
|
#define EDREG R17
|
|
#define VREG R18
|
|
|
|
#define TMP1 R10
|
|
#define TMP2 R2
|
|
#define TMP3 R3
|
|
#define TMP4 R4
|
|
#define TMP5 R19
|
|
|
|
MOVW len+LEN(FP),TMP1
|
|
MOVW state+STATE(FP),STREG
|
|
ADDU DATAREG,TMP1,EDREG
|
|
|
|
MOVW 0(STREG),AREG
|
|
MOVW 4(STREG),BREG
|
|
MOVW 8(STREG),CREG
|
|
MOVW 12(STREG),DREG
|
|
MOVW 16(STREG),EREG
|
|
|
|
MOVW $warray+WARRAY(SP),WREG
|
|
ADDU $(15*4),WREG,W15REG
|
|
ADDU $(40*4),WREG,W40REG
|
|
ADDU $(60*4),WREG,W60REG
|
|
ADDU $(80*4),WREG,W80REG
|
|
|
|
mainloop:
|
|
MOVW $warray+WARRAY(SP),WREG
|
|
|
|
MOVW $0x5a827999,VREG
|
|
loop1:
|
|
BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
|
|
BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
|
|
BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
|
|
BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
|
|
BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
|
|
|
|
ADDU $20,DATAREG
|
|
ADDU $20,WREG
|
|
BNE WREG,W15REG,loop1
|
|
|
|
BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
|
|
ADDU $4,DATAREG
|
|
|
|
BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
|
|
BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
|
|
BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
|
|
BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
|
|
|
|
ADDU $20,WREG
|
|
|
|
MOVW $0x6ed9eba1,VREG
|
|
loop2:
|
|
BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
|
|
BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
|
|
BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
|
|
BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
|
|
BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
|
|
|
|
ADDU $20,WREG
|
|
BNE WREG,W40REG,loop2
|
|
|
|
MOVW $0x8f1bbcdc,VREG
|
|
loop3:
|
|
BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG)
|
|
BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG)
|
|
BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG)
|
|
BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG)
|
|
BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG)
|
|
|
|
ADDU $20,WREG
|
|
BNE WREG,W60REG,loop3
|
|
|
|
MOVW $0xca62c1d6,VREG
|
|
loop4:
|
|
BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
|
|
BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
|
|
BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
|
|
BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
|
|
BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
|
|
|
|
ADDU $20,WREG
|
|
BNE WREG,W80REG,loop4
|
|
|
|
MOVW 0(STREG),TMP1
|
|
MOVW 4(STREG),TMP2
|
|
MOVW 8(STREG),TMP3
|
|
MOVW 12(STREG),TMP4
|
|
MOVW 16(STREG),TMP5
|
|
|
|
ADDU TMP1,AREG
|
|
ADDU TMP2,BREG
|
|
ADDU TMP3,CREG
|
|
ADDU TMP4,DREG
|
|
ADDU TMP5,EREG
|
|
|
|
MOVW AREG,0(STREG)
|
|
MOVW BREG,4(STREG)
|
|
MOVW CREG,8(STREG)
|
|
MOVW DREG,12(STREG)
|
|
MOVW EREG,16(STREG)
|
|
|
|
BNE DATAREG,EDREG,mainloop
|
|
|
|
RET
|
|
|
|
END
|