xref: /plan9/sys/src/cmd/unix/drawterm/posix-386/sha1block.spp (revision 96cbc34f1b36a29efdcfd47b10e70703a690febc)
18ccd4a63SDavid du Colombier.text
28ccd4a63SDavid du Colombier
38ccd4a63SDavid du Colombier.p2align 2,0x90
4*96cbc34fSDavid du Colombier#ifdef __APPLE__
5*96cbc34fSDavid du Colombier.globl __sha1block
6*96cbc34fSDavid du Colombier__sha1block:
7*96cbc34fSDavid du Colombier#else
88ccd4a63SDavid du Colombier.globl _sha1block
98ccd4a63SDavid du Colombier_sha1block:
10*96cbc34fSDavid du Colombier#endif
118ccd4a63SDavid du Colombier
128ccd4a63SDavid du Colombier/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
138ccd4a63SDavid du Colombier * wp[off] = x;
148ccd4a63SDavid du Colombier * x += A <<< 5;
158ccd4a63SDavid du Colombier * E += 0xca62c1d6 + x;
168ccd4a63SDavid du Colombier * x = FN(B,C,D);
178ccd4a63SDavid du Colombier * E += x;
188ccd4a63SDavid du Colombier * B >>> 2
198ccd4a63SDavid du Colombier */
208ccd4a63SDavid du Colombier#define BSWAPDI	BYTE $0x0f; BYTE $0xcf;
218ccd4a63SDavid du Colombier
228ccd4a63SDavid du Colombier#define BODY(off,FN,V,A,B,C,D,E)\
238ccd4a63SDavid du Colombier	movl (off-64)(%ebp), %edi;\
248ccd4a63SDavid du Colombier	xorl (off-56)(%ebp), %edi;\
258ccd4a63SDavid du Colombier	xorl (off-32)(%ebp), %edi;\
268ccd4a63SDavid du Colombier	xorl (off-12)(%ebp), %edi;\
278ccd4a63SDavid du Colombier	roll $1, %edi;\
288ccd4a63SDavid du Colombier	movl %edi, off(%ebp);\
298ccd4a63SDavid du Colombier	leal V(%edi, E, 1), E;\
308ccd4a63SDavid du Colombier	movl A, %edi;\
318ccd4a63SDavid du Colombier	roll $5, %edi;\
328ccd4a63SDavid du Colombier	addl %edi, E;\
338ccd4a63SDavid du Colombier	FN(B,C,D)\
348ccd4a63SDavid du Colombier	addl %edi, E;\
358ccd4a63SDavid du Colombier	rorl $2, B;\
368ccd4a63SDavid du Colombier
378ccd4a63SDavid du Colombier#define BODY0(off,FN,V,A,B,C,D,E)\
388ccd4a63SDavid du Colombier	movl off(%ebx), %edi;\
398ccd4a63SDavid du Colombier	bswap %edi;\
408ccd4a63SDavid du Colombier	movl %edi, off(%ebp);\
418ccd4a63SDavid du Colombier	leal V(%edi,E,1), E;\
428ccd4a63SDavid du Colombier	movl A, %edi;\
438ccd4a63SDavid du Colombier	roll $5,%edi;\
448ccd4a63SDavid du Colombier	addl %edi,E;\
458ccd4a63SDavid du Colombier	FN(B,C,D)\
468ccd4a63SDavid du Colombier	addl %edi,E;\
478ccd4a63SDavid du Colombier	rorl $2,B;\
488ccd4a63SDavid du Colombier
498ccd4a63SDavid du Colombier/*
508ccd4a63SDavid du Colombier * fn1 = (((C^D)&B)^D);
518ccd4a63SDavid du Colombier */
528ccd4a63SDavid du Colombier#define FN1(B,C,D)\
538ccd4a63SDavid du Colombier	movl C, %edi;\
548ccd4a63SDavid du Colombier	xorl D, %edi;\
558ccd4a63SDavid du Colombier	andl B, %edi;\
568ccd4a63SDavid du Colombier	xorl D, %edi;\
578ccd4a63SDavid du Colombier
588ccd4a63SDavid du Colombier/*
598ccd4a63SDavid du Colombier * fn24 = B ^ C ^ D
608ccd4a63SDavid du Colombier */
618ccd4a63SDavid du Colombier#define FN24(B,C,D)\
628ccd4a63SDavid du Colombier	movl B, %edi;\
638ccd4a63SDavid du Colombier	xorl C, %edi;\
648ccd4a63SDavid du Colombier	xorl D, %edi;\
658ccd4a63SDavid du Colombier
668ccd4a63SDavid du Colombier/*
678ccd4a63SDavid du Colombier * fn3 = ((B ^ C) & (D ^= B)) ^ B
688ccd4a63SDavid du Colombier * D ^= B to restore D
698ccd4a63SDavid du Colombier */
708ccd4a63SDavid du Colombier#define FN3(B,C,D)\
718ccd4a63SDavid du Colombier	movl B, %edi;\
728ccd4a63SDavid du Colombier	xorl C, %edi;\
738ccd4a63SDavid du Colombier	xorl B, D;\
748ccd4a63SDavid du Colombier	andl D, %edi;\
758ccd4a63SDavid du Colombier	xorl B, %edi;\
768ccd4a63SDavid du Colombier	xorl B, D;\
778ccd4a63SDavid du Colombier
788ccd4a63SDavid du Colombier/*
798ccd4a63SDavid du Colombier * stack offsets
808ccd4a63SDavid du Colombier * void sha1block(uchar *DATA, int LEN, ulong *STATE)
818ccd4a63SDavid du Colombier */
828ccd4a63SDavid du Colombier#define STACKSIZE (48+80*4)
838ccd4a63SDavid du Colombier#define	DATA	(STACKSIZE+8)
848ccd4a63SDavid du Colombier#define	LEN	(STACKSIZE+12)
858ccd4a63SDavid du Colombier#define	STATE	(STACKSIZE+16)
868ccd4a63SDavid du Colombier
878ccd4a63SDavid du Colombier/*
888ccd4a63SDavid du Colombier * stack offsets for locals
898ccd4a63SDavid du Colombier * ulong w[80];
908ccd4a63SDavid du Colombier * uchar *edata;
918ccd4a63SDavid du Colombier * ulong *w15, *w40, *w60, *w80;
928ccd4a63SDavid du Colombier * register local
938ccd4a63SDavid du Colombier * ulong *wp = %ebp
948ccd4a63SDavid du Colombier * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
958ccd4a63SDavid du Colombier * ulong tmp = edi
968ccd4a63SDavid du Colombier */
978ccd4a63SDavid du Colombier#define WARRAY	(STACKSIZE-4-(80*4))
988ccd4a63SDavid du Colombier#define TMP1	(STACKSIZE-8-(80*4))
998ccd4a63SDavid du Colombier#define TMP2	(STACKSIZE-12-(80*4))
1008ccd4a63SDavid du Colombier#define W15	(STACKSIZE-16-(80*4))
1018ccd4a63SDavid du Colombier#define W40	(STACKSIZE-20-(80*4))
1028ccd4a63SDavid du Colombier#define W60	(STACKSIZE-24-(80*4))
1038ccd4a63SDavid du Colombier#define W80	(STACKSIZE-28-(80*4))
1048ccd4a63SDavid du Colombier#define EDATA	(STACKSIZE-32-(80*4))
1058ccd4a63SDavid du Colombier#define OLDEBX	(STACKSIZE-36-(80*4))
1068ccd4a63SDavid du Colombier#define OLDESI	(STACKSIZE-40-(80*4))
1078ccd4a63SDavid du Colombier#define OLDEDI	(STACKSIZE-44-(80*4))
1088ccd4a63SDavid du Colombier
1098ccd4a63SDavid du Colombier	/* Prelude */
1108ccd4a63SDavid du Colombier	pushl %ebp
1118ccd4a63SDavid du Colombier	subl $(STACKSIZE), %esp
1128ccd4a63SDavid du Colombier
1138ccd4a63SDavid du Colombier	mov %ebx, OLDEBX(%esp)
1148ccd4a63SDavid du Colombier	mov %esi, OLDESI(%esp)
1158ccd4a63SDavid du Colombier	mov %edi, OLDEDI(%esp)
1168ccd4a63SDavid du Colombier
1178ccd4a63SDavid du Colombier	movl DATA(%esp), %eax
1188ccd4a63SDavid du Colombier	addl LEN(%esp), %eax
1198ccd4a63SDavid du Colombier	movl %eax, EDATA(%esp)
1208ccd4a63SDavid du Colombier
1218ccd4a63SDavid du Colombier	leal (WARRAY+15*4)(%esp), %edi	/* aw15 */
1228ccd4a63SDavid du Colombier	movl %edi, W15(%esp)
1238ccd4a63SDavid du Colombier	leal (WARRAY+40*4)(%esp), %edx	/* aw40 */
1248ccd4a63SDavid du Colombier	movl %edx, W40(%esp)
1258ccd4a63SDavid du Colombier	leal (WARRAY+60*4)(%esp), %ecx	/* aw60 */
1268ccd4a63SDavid du Colombier	movl %ecx, W60(%esp)
1278ccd4a63SDavid du Colombier	leal (WARRAY+80*4)(%esp), %edi	/* aw80 */
1288ccd4a63SDavid du Colombier	movl %edi, W80(%esp)
1298ccd4a63SDavid du Colombier
1308ccd4a63SDavid du Colombier0:
1318ccd4a63SDavid du Colombier	leal WARRAY(%esp), %ebp		/* warray */
1328ccd4a63SDavid du Colombier
1338ccd4a63SDavid du Colombier	movl STATE(%esp), %edi		/* state */
1348ccd4a63SDavid du Colombier	movl (%edi),%eax
1358ccd4a63SDavid du Colombier	movl 4(%edi),%ebx
1368ccd4a63SDavid du Colombier	movl %ebx, TMP1(%esp)		/* tmp1 */
1378ccd4a63SDavid du Colombier	movl 8(%edi), %ecx
1388ccd4a63SDavid du Colombier	movl 12(%edi), %edx
1398ccd4a63SDavid du Colombier	movl 16(%edi), %esi
1408ccd4a63SDavid du Colombier
1418ccd4a63SDavid du Colombier	movl DATA(%esp), %ebx		/* data */
1428ccd4a63SDavid du Colombier
1438ccd4a63SDavid du Colombier1:
1448ccd4a63SDavid du Colombier	BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
1458ccd4a63SDavid du Colombier	movl %esi,TMP2(%esp)
1468ccd4a63SDavid du Colombier	BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx)
1478ccd4a63SDavid du Colombier	movl TMP1(%esp),%esi
1488ccd4a63SDavid du Colombier	BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx)
1498ccd4a63SDavid du Colombier	BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi)
1508ccd4a63SDavid du Colombier	movl %esi,TMP1(%esp)
1518ccd4a63SDavid du Colombier	BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax)
1528ccd4a63SDavid du Colombier	movl TMP2(%esp),%esi
1538ccd4a63SDavid du Colombier
1548ccd4a63SDavid du Colombier	addl $20, %ebx
1558ccd4a63SDavid du Colombier	addl $20, %ebp
1568ccd4a63SDavid du Colombier	cmpl W15(%esp), %ebp	/* w15 */
1578ccd4a63SDavid du Colombier	jb 1b
1588ccd4a63SDavid du Colombier
1598ccd4a63SDavid du Colombier	BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
1608ccd4a63SDavid du Colombier	addl $4, %ebx
1618ccd4a63SDavid du Colombier	MOVL %ebx, DATA(%esp)	/* data */
1628ccd4a63SDavid du Colombier	MOVL TMP1(%esp),%ebx
1638ccd4a63SDavid du Colombier
1648ccd4a63SDavid du Colombier	BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx)
1658ccd4a63SDavid du Colombier	BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx)
1668ccd4a63SDavid du Colombier	BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx)
1678ccd4a63SDavid du Colombier	BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax)
1688ccd4a63SDavid du Colombier
1698ccd4a63SDavid du Colombier	addl $20, %ebp
1708ccd4a63SDavid du Colombier
1718ccd4a63SDavid du Colombier2:
1728ccd4a63SDavid du Colombier	BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi)
1738ccd4a63SDavid du Colombier	BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx)
1748ccd4a63SDavid du Colombier	BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx)
1758ccd4a63SDavid du Colombier	BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx)
1768ccd4a63SDavid du Colombier	BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax)
1778ccd4a63SDavid du Colombier
1788ccd4a63SDavid du Colombier	addl $20,%ebp
1798ccd4a63SDavid du Colombier	cmpl W40(%esp), %ebp
1808ccd4a63SDavid du Colombier	jb 2b
1818ccd4a63SDavid du Colombier
1828ccd4a63SDavid du Colombier3:
1838ccd4a63SDavid du Colombier	BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi)
1848ccd4a63SDavid du Colombier	BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx)
1858ccd4a63SDavid du Colombier	BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx)
1868ccd4a63SDavid du Colombier	BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx)
1878ccd4a63SDavid du Colombier	BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax)
1888ccd4a63SDavid du Colombier
1898ccd4a63SDavid du Colombier	addl $20, %ebp
1908ccd4a63SDavid du Colombier	cmpl W60(%esp), %ebp 	/* w60 */
1918ccd4a63SDavid du Colombier	jb 3b
1928ccd4a63SDavid du Colombier
1938ccd4a63SDavid du Colombier4:
1948ccd4a63SDavid du Colombier	BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi)
1958ccd4a63SDavid du Colombier	BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx)
1968ccd4a63SDavid du Colombier	BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx)
1978ccd4a63SDavid du Colombier	BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx)
1988ccd4a63SDavid du Colombier	BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax)
1998ccd4a63SDavid du Colombier
2008ccd4a63SDavid du Colombier	addl $20, %ebp
2018ccd4a63SDavid du Colombier	cmpl W80(%esp), %ebp 	/* w80 */
2028ccd4a63SDavid du Colombier	jb 4b
2038ccd4a63SDavid du Colombier
2048ccd4a63SDavid du Colombier	movl STATE(%esp), %edi	/* state */
2058ccd4a63SDavid du Colombier	addl %eax, 0(%edi)
2068ccd4a63SDavid du Colombier	addl %ebx, 4(%edi)
2078ccd4a63SDavid du Colombier	addl %ecx, 8(%edi)
2088ccd4a63SDavid du Colombier	addl %edx, 12(%edi)
2098ccd4a63SDavid du Colombier	addl %esi, 16(%edi)
2108ccd4a63SDavid du Colombier
2118ccd4a63SDavid du Colombier	movl EDATA(%esp), %edi	/* edata */
2128ccd4a63SDavid du Colombier	cmpl %edi, DATA(%esp)	/* data */
2138ccd4a63SDavid du Colombier	jb 0b
2148ccd4a63SDavid du Colombier
2158ccd4a63SDavid du Colombier	/* Postlude */
2168ccd4a63SDavid du Colombier	mov OLDEBX(%esp), %ebx
2178ccd4a63SDavid du Colombier	mov OLDESI(%esp), %esi
2188ccd4a63SDavid du Colombier	mov OLDEDI(%esp), %edi
2198ccd4a63SDavid du Colombier	addl $(STACKSIZE), %esp
2208ccd4a63SDavid du Colombier	popl %ebp
2218ccd4a63SDavid du Colombier	ret
222