Commit 3f4bcf5b authored by Andy Polyakov's avatar Andy Polyakov Committed by Matt Caswell
Browse files

bn/asm/x86_64-mont5.pl: fix carry bug in bn_sqr8x_internal.



CVE-2017-3732

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
parent 3e7a4963
Loading
Loading
Loading
Loading
+7 −9
Original line number Original line Diff line number Diff line
@@ -1934,6 +1934,7 @@ __bn_sqr8x_reduction:


.align	32
.align	32
.L8x_tail_done:
.L8x_tail_done:
	xor	%rax,%rax
	add	(%rdx),%r8		# can this overflow?
	add	(%rdx),%r8		# can this overflow?
	adc	\$0,%r9
	adc	\$0,%r9
	adc	\$0,%r10
	adc	\$0,%r10
@@ -1941,10 +1942,8 @@ __bn_sqr8x_reduction:
	adc	\$0,%r12
	adc	\$0,%r12
	adc	\$0,%r13
	adc	\$0,%r13
	adc	\$0,%r14
	adc	\$0,%r14
	adc	\$0,%r15		# can't overflow, because we
	adc	\$0,%r15
					# started with "overhung" part
	adc	\$0,%rax
					# of multiplication
	xor	%rax,%rax


	neg	$carry
	neg	$carry
.L8x_no_tail:
.L8x_no_tail:
@@ -3384,6 +3383,7 @@ __bn_sqrx8x_reduction:


.align	32
.align	32
.Lsqrx8x_tail_done:
.Lsqrx8x_tail_done:
	xor	%rax,%rax
	add	24+8(%rsp),%r8		# can this overflow?
	add	24+8(%rsp),%r8		# can this overflow?
	adc	\$0,%r9
	adc	\$0,%r9
	adc	\$0,%r10
	adc	\$0,%r10
@@ -3391,10 +3391,8 @@ __bn_sqrx8x_reduction:
	adc	\$0,%r12
	adc	\$0,%r12
	adc	\$0,%r13
	adc	\$0,%r13
	adc	\$0,%r14
	adc	\$0,%r14
	adc	\$0,%r15		# can't overflow, because we
	adc	\$0,%r15
					# started with "overhung" part
	adc	\$0,%rax
					# of multiplication
	mov	$carry,%rax		# xor	%rax,%rax


	sub	16+8(%rsp),$carry	# mov 16(%rsp),%cf
	sub	16+8(%rsp),$carry	# mov 16(%rsp),%cf
.Lsqrx8x_no_tail:			# %cf is 0 if jumped here
.Lsqrx8x_no_tail:			# %cf is 0 if jumped here
@@ -3409,7 +3407,7 @@ __bn_sqrx8x_reduction:
	adc	8*5($tptr),%r13
	adc	8*5($tptr),%r13
	adc	8*6($tptr),%r14
	adc	8*6($tptr),%r14
	adc	8*7($tptr),%r15
	adc	8*7($tptr),%r15
	adc	%rax,%rax		# top-most carry
	adc	\$0,%rax		# top-most carry


	mov	32+8(%rsp),%rbx		# n0
	mov	32+8(%rsp),%rbx		# n0
	mov	8*8($tptr,%rcx),%rdx	# modulo-scheduled "%r8"
	mov	8*8($tptr,%rcx),%rdx	# modulo-scheduled "%r8"