⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes-x86_64.pl

📁 Openssl 0.9.8h 最新版OpenSSL
💻 PL
📖 第 1 页 / 共 3 页
字号:
	shl	\$24,$acc1	xor	$acc0,$t2	xor	$acc1,$t3	mov	16+4($key),$s1	mov	16+8($key),$s2	xor	$t0,$s0	xor	$t1,$s1	xor	$t2,$s2	xor	$t3,$s3___}sub decstep(){ my ($i,@s) = @_;  my $tmp0=$acc0;  my $tmp1=$acc1;  my $tmp2=$acc2;  my $out=($t0,$t1,$t2,$s[0])[$i];	$code.="	mov	$s[0],$out\n"		if ($i!=3);			$tmp1=$s[2]			if ($i==3);	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);	$code.="	and	\$0xFF,$out\n";	$code.="	mov	0($sbox,$out,8),$out\n";	$code.="	shr	\$16,$tmp1\n";			$tmp2=$s[3]			if ($i==3);	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);			$tmp0=$s[1]			if ($i==3);	$code.="	movzb	".&hi($s[1]).",$tmp0\n";	$code.="	and	\$0xFF,$tmp1\n";	$code.="	shr	\$24,$tmp2\n";	$code.="	xor	3($sbox,$tmp0,8),$out\n";	$code.="	xor	2($sbox,$tmp1,8),$out\n";	$code.="	xor	1($sbox,$tmp2,8),$out\n";	$code.="	mov	$t2,$s[1]\n"		if ($i==3);	$code.="	mov	$t1,$s[2]\n"		if ($i==3);	$code.="	mov	$t0,$s[3]\n"		if ($i==3);	$code.="\n";}sub declast(){ my ($i,@s)=@_;  my $tmp0=$acc0;  my $tmp1=$acc1;  my $tmp2=$acc2;  my $out=($t0,$t1,$t2,$s[0])[$i];	$code.="	mov	$s[0],$out\n"		if ($i!=3);			$tmp1=$s[2]			if ($i==3);	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);	$code.="	and	\$0xFF,$out\n";	$code.="	movzb	2048($sbox,$out,1),$out\n";	$code.="	shr	\$16,$tmp1\n";			$tmp2=$s[3]			if ($i==3);	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);			$tmp0=$s[1]			if ($i==3);	$code.="	movzb	".&hi($s[1]).",$tmp0\n";	$code.="	and	\$0xFF,$tmp1\n";	$code.="	shr	\$24,$tmp2\n";	$code.="	movzb	2048($sbox,$tmp0,1),$tmp0\n";	$code.="	movzb	2048($sbox,$tmp1,1),$tmp1\n";	$code.="	movzb	2048($sbox,$tmp2,1),$tmp2\n";	$code.="	shl	\$8,$tmp0\n";	$code.="	shl	\$16,$tmp1\n";	$code.="	shl	\$24,$tmp2\n";	$code.="	xor	$tmp0,$out\n";	$code.="	mov	$t2,$s[1]\n"		if ($i==3);	$code.="	xor	$tmp1,$out\n";	$code.="	mov	$t1,$s[2]\n"		if ($i==3);	$code.="	xor	$tmp2,$out\n";	$code.="	mov	$t0,$s[3]\n"		if ($i==3);	$code.="\n";}$code.=<<___;.type	_x86_64_AES_decrypt,\@abi-omnipotent.align	16_x86_64_AES_decrypt:	xor	0($key),$s0			# xor with key	xor	4($key),$s1	xor	8($key),$s2	xor	12($key),$s3	mov	240($key),$rnds			# load key->rounds	sub	\$1,$rnds	jmp	.Ldec_loop.align	16.Ldec_loop:___	if ($verticalspin) { &decvert(); }	else {	&decstep(0,$s0,$s3,$s2,$s1);		&decstep(1,$s1,$s0,$s3,$s2);		&decstep(2,$s2,$s1,$s0,$s3);		&decstep(3,$s3,$s2,$s1,$s0);		$code.=<<___;		lea	16($key),$key		xor	0($key),$s0			# xor with key		xor	4($key),$s1		xor	8($key),$s2		xor	12($key),$s3___	}$code.=<<___;	sub	\$1,$rnds	jnz	.Ldec_loop___	if ($verticalspin) { &declastvert(); }	else {	&declast(0,$s0,$s3,$s2,$s1);		&declast(1,$s1,$s0,$s3,$s2);		&declast(2,$s2,$s1,$s0,$s3);		&declast(3,$s3,$s2,$s1,$s0);		$code.=<<___;		xor	16+0($key),$s0			# xor with key		xor	16+4($key),$s1		xor	16+8($key),$s2		xor	16+12($key),$s3___	}$code.=<<___;	.byte	0xf3,0xc3			# rep ret.size	_x86_64_AES_decrypt,.-_x86_64_AES_decrypt___# void AES_decrypt (const void *inp,void *out,const AES_KEY *key);$code.=<<___;.globl	AES_decrypt.type	AES_decrypt,\@function,3.align	16AES_decrypt:	push	%rbx	push	%rbp	push	%r12	push	%r13	push	%r14	push	%r15	mov	%rdx,$key	mov	%rdi,$inp	mov	%rsi,$out	.picmeup	$sbox	lea	AES_Td-.($sbox),$sbox	# prefetch Td4	lea	2048+128($sbox),$sbox;	mov	0-128($sbox),$s0	mov	32-128($sbox),$s1	mov	64-128($sbox),$s2	mov	96-128($sbox),$s3	mov	128-128($sbox),$s0	mov	160-128($sbox),$s1	mov	192-128($sbox),$s2	mov	224-128($sbox),$s3	lea	-2048-128($sbox),$sbox;	mov	0($inp),$s0	mov	4($inp),$s1	mov	8($inp),$s2	mov	12($inp),$s3	call	_x86_64_AES_decrypt	mov	$s0,0($out)	mov	$s1,4($out)	mov	$s2,8($out)	mov	$s3,12($out)	pop	%r15	pop	%r14	pop	%r13	pop	%r12	pop	%rbp	pop	%rbx	ret.size	AES_decrypt,.-AES_decrypt___#------------------------------------------------------------------#sub enckey(){$code.=<<___;	movz	%dl,%esi		# rk[i]>>0	mov	2(%rbp,%rsi,8),%ebx	movz	%dh,%esi		# rk[i]>>8	and	\$0xFF000000,%ebx	xor	%ebx,%eax	mov	2(%rbp,%rsi,8),%ebx	shr	\$16,%edx	and	\$0x000000FF,%ebx	movz	%dl,%esi		# rk[i]>>16	xor	%ebx,%eax	mov	0(%rbp,%rsi,8),%ebx	movz	%dh,%esi		# rk[i]>>24	and	\$0x0000FF00,%ebx	xor	%ebx,%eax	mov	0(%rbp,%rsi,8),%ebx	and	\$0x00FF0000,%ebx	xor	%ebx,%eax	xor	2048(%rbp,%rcx,4),%eax		# rcon___}# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,#                        AES_KEY *key)$code.=<<___;.globl	AES_set_encrypt_key.type	AES_set_encrypt_key,\@function,3.align	16AES_set_encrypt_key:	push	%rbx	push	%rbp	mov	%esi,%ecx			# %ecx=bits	mov	%rdi,%rsi			# %rsi=userKey	mov	%rdx,%rdi			# %rdi=key	test	\$-1,%rsi	jz	.Lbadpointer	test	\$-1,%rdi	jz	.Lbadpointer	.picmeup %rbp	lea	AES_Te-.(%rbp),%rbp	cmp	\$128,%ecx	je	.L10rounds	cmp	\$192,%ecx	je	.L12rounds	cmp	\$256,%ecx	je	.L14rounds	mov	\$-2,%rax			# invalid number of bits	jmp	.Lexit.L10rounds:	mov	0(%rsi),%eax			# copy first 4 dwords	mov	4(%rsi),%ebx	mov	8(%rsi),%ecx	mov	12(%rsi),%edx	mov	%eax,0(%rdi)	mov	%ebx,4(%rdi)	mov	%ecx,8(%rdi)	mov	%edx,12(%rdi)	xor	%ecx,%ecx	jmp	.L10shortcut.align	4.L10loop:		mov	0(%rdi),%eax			# rk[0]		mov	12(%rdi),%edx			# rk[3].L10shortcut:___		&enckey	();$code.=<<___;		mov	%eax,16(%rdi)			# rk[4]		xor	4(%rdi),%eax		mov	%eax,20(%rdi)			# rk[5]		xor	8(%rdi),%eax		mov	%eax,24(%rdi)			# rk[6]		xor	12(%rdi),%eax		mov	%eax,28(%rdi)			# rk[7]		add	\$1,%ecx		lea	16(%rdi),%rdi		cmp	\$10,%ecx	jl	.L10loop	movl	\$10,80(%rdi)			# setup number of rounds	xor	%rax,%rax	jmp	.Lexit.L12rounds:	mov	0(%rsi),%eax			# copy first 6 dwords	mov	4(%rsi),%ebx	mov	8(%rsi),%ecx	mov	12(%rsi),%edx	mov	%eax,0(%rdi)	mov	%ebx,4(%rdi)	mov	%ecx,8(%rdi)	mov	%edx,12(%rdi)	mov	16(%rsi),%ecx	mov	20(%rsi),%edx	mov	%ecx,16(%rdi)	mov	%edx,20(%rdi)	xor	%ecx,%ecx	jmp	.L12shortcut.align	4.L12loop:		mov	0(%rdi),%eax			# rk[0]		mov	20(%rdi),%edx			# rk[5].L12shortcut:___		&enckey	();$code.=<<___;		mov	%eax,24(%rdi)			# rk[6]		xor	4(%rdi),%eax		mov	%eax,28(%rdi)			# rk[7]		xor	8(%rdi),%eax		mov	%eax,32(%rdi)			# rk[8]		xor	12(%rdi),%eax		mov	%eax,36(%rdi)			# rk[9]		cmp	\$7,%ecx		je	.L12break		add	\$1,%ecx		xor	16(%rdi),%eax		mov	%eax,40(%rdi)			# rk[10]		xor	20(%rdi),%eax		mov	%eax,44(%rdi)			# rk[11]		lea	24(%rdi),%rdi	jmp	.L12loop.L12break:	movl	\$12,72(%rdi)		# setup number of rounds	xor	%rax,%rax	jmp	.Lexit.L14rounds:			mov	0(%rsi),%eax			# copy first 8 dwords	mov	4(%rsi),%ebx	mov	8(%rsi),%ecx	mov	12(%rsi),%edx	mov	%eax,0(%rdi)	mov	%ebx,4(%rdi)	mov	%ecx,8(%rdi)	mov	%edx,12(%rdi)	mov	16(%rsi),%eax	mov	20(%rsi),%ebx	mov	24(%rsi),%ecx	mov	28(%rsi),%edx	mov	%eax,16(%rdi)	mov	%ebx,20(%rdi)	mov	%ecx,24(%rdi)	mov	%edx,28(%rdi)	xor	%ecx,%ecx	jmp	.L14shortcut.align	4.L14loop:		mov	28(%rdi),%edx			# rk[4].L14shortcut:		mov	0(%rdi),%eax			# rk[0]___		&enckey	();$code.=<<___;		mov	%eax,32(%rdi)			# rk[8]		xor	4(%rdi),%eax		mov	%eax,36(%rdi)			# rk[9]		xor	8(%rdi),%eax		mov	%eax,40(%rdi)			# rk[10]		xor	12(%rdi),%eax		mov	%eax,44(%rdi)			# rk[11]		cmp	\$6,%ecx		je	.L14break		add	\$1,%ecx		mov	%eax,%edx		mov	16(%rdi),%eax			# rk[4]		movz	%dl,%esi			# rk[11]>>0		mov	2(%rbp,%rsi,8),%ebx		movz	%dh,%esi			# rk[11]>>8		and	\$0x000000FF,%ebx		xor	%ebx,%eax		mov	0(%rbp,%rsi,8),%ebx		shr	\$16,%edx		and	\$0x0000FF00,%ebx		movz	%dl,%esi			# rk[11]>>16		xor	%ebx,%eax		mov	0(%rbp,%rsi,8),%ebx		movz	%dh,%esi			# rk[11]>>24		and	\$0x00FF0000,%ebx		xor	%ebx,%eax		mov	2(%rbp,%rsi,8),%ebx		and	\$0xFF000000,%ebx		xor	%ebx,%eax		mov	%eax,48(%rdi)			# rk[12]		xor	20(%rdi),%eax		mov	%eax,52(%rdi)			# rk[13]		xor	24(%rdi),%eax		mov	%eax,56(%rdi)			# rk[14]		xor	28(%rdi),%eax		mov	%eax,60(%rdi)			# rk[15]		lea	32(%rdi),%rdi	jmp	.L14loop.L14break:	movl	\$14,48(%rdi)		# setup number of rounds	xor	%rax,%rax	jmp	.Lexit.Lbadpointer:	mov	\$-1,%rax.Lexit:	pop	%rbp	pop	%rbx	ret.size	AES_set_encrypt_key,.-AES_set_encrypt_key___sub deckey(){ my ($i,$ptr,$te,$td) = @_;$code.=<<___;	mov	$i($ptr),%eax	mov	%eax,%edx	movz	%ah,%ebx	shr	\$16,%edx	and	\$0xFF,%eax	movzb	2($te,%rax,8),%rax	movzb	2($te,%rbx,8),%rbx	mov	0($td,%rax,8),%eax	xor	3($td,%rbx,8),%eax	movzb	%dh,%ebx	and	\$0xFF,%edx	movzb	2($te,%rdx,8),%rdx	movzb	2($te,%rbx,8),%rbx	xor	2($td,%rdx,8),%eax	xor	1($td,%rbx,8),%eax	mov	%eax,$i($ptr)___}# int AES_set_decrypt_key(const unsigned char *userKey, const int bits,#                        AES_KEY *key)$code.=<<___;.globl	AES_set_decrypt_key.type	AES_set_decrypt_key,\@function,3.align	16AES_set_decrypt_key:	push	%rdx	call	AES_set_encrypt_key	cmp	\$0,%eax	je	.Lproceed	lea	24(%rsp),%rsp	ret.Lproceed:	mov	(%rsp),%r8		# restore key schedule	mov	%rbx,(%rsp)	mov	240(%r8),%ecx		# pull number of rounds	xor	%rdi,%rdi	lea	(%rdi,%rcx,4),%rcx	mov	%r8,%rsi	lea	(%r8,%rcx,4),%rdi	# pointer to last chunk.align	4.Linvert:		mov	0(%rsi),%rax		mov	8(%rsi),%rbx		mov	0(%rdi),%rcx		mov	8(%rdi),%rdx		mov	%rax,0(%rdi)		mov	%rbx,8(%rdi)		mov	%rcx,0(%rsi)		mov	%rdx,8(%rsi)		lea	16(%rsi),%rsi		lea	-16(%rdi),%rdi		cmp	%rsi,%rdi	jne	.Linvert	.picmeup %r9	lea	AES_Td-.(%r9),%rdi	lea	AES_Te-AES_Td(%rdi),%r9	mov	%r8,%rsi	mov	240(%r8),%ecx		# pull number of rounds	sub	\$1,%ecx.align	4.Lpermute:		lea	16(%rsi),%rsi___		&deckey	(0,"%rsi","%r9","%rdi");		&deckey	(4,"%rsi","%r9","%rdi");		&deckey	(8,"%rsi","%r9","%rdi");		&deckey	(12,"%rsi","%r9","%rdi");$code.=<<___;		sub	\$1,%ecx	jnz	.Lpermute	xor	%rax,%rax	pop	%rbx	ret.size	AES_set_decrypt_key,.-AES_set_decrypt_key___# void AES_cbc_encrypt (const void char *inp, unsigned char *out,#			size_t length, const AES_KEY *key,#			unsigned char *ivp,const int enc);{# stack frame layout# -8(%rsp)		return addressmy $_rsp="0(%rsp)";		# saved %rspmy $_len="8(%rsp)";		# copy of 3rd parameter, lengthmy $_key="16(%rsp)";		# copy of 4th parameter, keymy $_ivp="24(%rsp)";		# copy of 5th parameter, ivpmy $keyp="32(%rsp)";		# one to pass as $keymy $ivec="40(%rsp)";		# ivec[16]my $aes_key="56(%rsp)";		# copy of aes_keymy $mark="56+240(%rsp)";	# copy of aes_key->rounds$code.=<<___;.globl	AES_cbc_encrypt.type	AES_cbc_encrypt,\@function,6.align	16AES_cbc_encrypt:	cmp	\$0,%rdx	# check length	je	.Lcbc_just_ret	push	%rbx	push	%rbp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -