Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a6d0071 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull crypto fixes from Herbert Xu:
 - Fix compiler warnings in inside-secure
 - Fix LS1021A support in caam
 - Avoid using RBP in x86 crypto code
 - Fix bug in talitos that prevents hashing with algif
 - Fix bugs talitos hashing code that cause incorrect hash result
 - Fix memory freeing path bug in drbg
 - Fix af_alg crash when two SG lists are chained

* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
  crypto: af_alg - update correct dst SGL entry
  crypto: caam - fix LS1021A support on ARMv7 multiplatform kernel
  crypto: inside-secure - fix gcc-4.9 warnings
  crypto: talitos - Don't provide setkey for non hmac hashing algs
  crypto: talitos - fix hashing
  crypto: talitos - fix sha224
  crypto: x86/twofish - Fix RBP usage
  crypto: sha512-avx2 - Fix RBP usage
  crypto: x86/sha256-ssse3 - Fix RBP usage
  crypto: x86/sha256-avx2 - Fix RBP usage
  crypto: x86/sha256-avx - Fix RBP usage
  crypto: x86/sha1-ssse3 - Fix RBP usage
  crypto: x86/sha1-avx2 - Fix RBP usage
  crypto: x86/des3_ede - Fix RBP usage
  crypto: x86/cast6 - Fix RBP usage
  crypto: x86/cast5 - Fix RBP usage
  crypto: x86/camellia - Fix RBP usage
  crypto: x86/blowfish - Fix RBP usage
  crypto: drbg - fix freeing of resources
parents 6e80ecdd e117765a
Loading
Loading
Loading
Loading
+26 −22
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
#define s3	((16 + 2 + (3 * 256)) * 4)

/* register macros */
#define CTX %rdi
#define CTX %r12
#define RIO %rsi

#define RX0 %rax
@@ -56,12 +56,12 @@
#define RX2bh %ch
#define RX3bh %dh

#define RT0 %rbp
#define RT0 %rdi
#define RT1 %rsi
#define RT2 %r8
#define RT3 %r9

#define RT0d %ebp
#define RT0d %edi
#define RT1d %esi
#define RT2d %r8d
#define RT3d %r9d
@@ -120,13 +120,14 @@

ENTRY(__blowfish_enc_blk)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 *	%rcx: bool, if true: xor output
	 */
	movq %rbp, %r11;
	movq %r12, %r11;

	movq %rdi, CTX;
	movq %rsi, %r10;
	movq %rdx, RIO;

@@ -142,7 +143,7 @@ ENTRY(__blowfish_enc_blk)
	round_enc(14);
	add_roundkey_enc(16);

	movq %r11, %rbp;
	movq %r11, %r12;

	movq %r10, RIO;
	test %cl, %cl;
@@ -157,12 +158,13 @@ ENDPROC(__blowfish_enc_blk)

ENTRY(blowfish_dec_blk)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	movq %rbp, %r11;
	movq %r12, %r11;

	movq %rdi, CTX;
	movq %rsi, %r10;
	movq %rdx, RIO;

@@ -181,7 +183,7 @@ ENTRY(blowfish_dec_blk)
	movq %r10, RIO;
	write_block();

	movq %r11, %rbp;
	movq %r11, %r12;

	ret;
ENDPROC(blowfish_dec_blk)
@@ -298,20 +300,21 @@ ENDPROC(blowfish_dec_blk)

ENTRY(__blowfish_enc_blk_4way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 *	%rcx: bool, if true: xor output
	 */
	pushq %rbp;
	pushq %r12;
	pushq %rbx;
	pushq %rcx;

	preload_roundkey_enc(0);

	movq %rdi, CTX
	movq %rsi, %r11;
	movq %rdx, RIO;

	preload_roundkey_enc(0);

	read_block4();

	round_enc4(0);
@@ -324,39 +327,40 @@ ENTRY(__blowfish_enc_blk_4way)
	round_enc4(14);
	add_preloaded_roundkey4();

	popq %rbp;
	popq %r12;
	movq %r11, RIO;

	test %bpl, %bpl;
	test %r12b, %r12b;
	jnz .L__enc_xor4;

	write_block4();

	popq %rbx;
	popq %rbp;
	popq %r12;
	ret;

.L__enc_xor4:
	xor_block4();

	popq %rbx;
	popq %rbp;
	popq %r12;
	ret;
ENDPROC(__blowfish_enc_blk_4way)

ENTRY(blowfish_dec_blk_4way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	pushq %rbp;
	pushq %r12;
	pushq %rbx;
	preload_roundkey_dec(17);

	movq %rsi, %r11;
	movq %rdi, CTX;
	movq %rsi, %r11
	movq %rdx, RIO;

	preload_roundkey_dec(17);
	read_block4();

	round_dec4(17);
@@ -373,7 +377,7 @@ ENTRY(blowfish_dec_blk_4way)
	write_block4();

	popq %rbx;
	popq %rbp;
	popq %r12;

	ret;
ENDPROC(blowfish_dec_blk_4way)
+13 −13
Original line number Diff line number Diff line
@@ -75,17 +75,17 @@
#define RCD1bh %dh

#define RT0 %rsi
#define RT1 %rbp
#define RT1 %r12
#define RT2 %r8

#define RT0d %esi
#define RT1d %ebp
#define RT1d %r12d
#define RT2d %r8d

#define RT2bl %r8b

#define RXOR %r9
#define RRBP %r10
#define RR12 %r10
#define RDST %r11

#define RXORd %r9d
@@ -197,7 +197,7 @@ ENTRY(__camellia_enc_blk)
	 *	%rdx: src
	 *	%rcx: bool xor
	 */
	movq %rbp, RRBP;
	movq %r12, RR12;

	movq %rcx, RXOR;
	movq %rsi, RDST;
@@ -227,13 +227,13 @@ ENTRY(__camellia_enc_blk)

	enc_outunpack(mov, RT1);

	movq RRBP, %rbp;
	movq RR12, %r12;
	ret;

.L__enc_xor:
	enc_outunpack(xor, RT1);

	movq RRBP, %rbp;
	movq RR12, %r12;
	ret;
ENDPROC(__camellia_enc_blk)

@@ -248,7 +248,7 @@ ENTRY(camellia_dec_blk)
	movl $24, RXORd;
	cmovel RXORd, RT2d; /* max */

	movq %rbp, RRBP;
	movq %r12, RR12;
	movq %rsi, RDST;
	movq %rdx, RIO;

@@ -271,7 +271,7 @@ ENTRY(camellia_dec_blk)

	dec_outunpack();

	movq RRBP, %rbp;
	movq RR12, %r12;
	ret;
ENDPROC(camellia_dec_blk)

@@ -433,7 +433,7 @@ ENTRY(__camellia_enc_blk_2way)
	 */
	pushq %rbx;

	movq %rbp, RRBP;
	movq %r12, RR12;
	movq %rcx, RXOR;
	movq %rsi, RDST;
	movq %rdx, RIO;
@@ -461,14 +461,14 @@ ENTRY(__camellia_enc_blk_2way)

	enc_outunpack2(mov, RT2);

	movq RRBP, %rbp;
	movq RR12, %r12;
	popq %rbx;
	ret;

.L__enc2_xor:
	enc_outunpack2(xor, RT2);

	movq RRBP, %rbp;
	movq RR12, %r12;
	popq %rbx;
	ret;
ENDPROC(__camellia_enc_blk_2way)
@@ -485,7 +485,7 @@ ENTRY(camellia_dec_blk_2way)
	cmovel RXORd, RT2d; /* max */

	movq %rbx, RXOR;
	movq %rbp, RRBP;
	movq %r12, RR12;
	movq %rsi, RDST;
	movq %rdx, RIO;

@@ -508,7 +508,7 @@ ENTRY(camellia_dec_blk_2way)

	dec_outunpack2();

	movq RRBP, %rbp;
	movq RR12, %r12;
	movq RXOR, %rbx;
	ret;
ENDPROC(camellia_dec_blk_2way)
+30 −17
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
/**********************************************************************
  16-way AVX cast5
 **********************************************************************/
#define CTX %rdi
#define CTX %r15

#define RL1 %xmm0
#define RR1 %xmm1
@@ -70,8 +70,8 @@

#define RTMP %xmm15

#define RID1  %rbp
#define RID1d %ebp
#define RID1  %rdi
#define RID1d %edi
#define RID2  %rsi
#define RID2d %esi

@@ -226,7 +226,7 @@
.align 16
__cast5_enc_blk16:
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	RL1: blocks 1 and 2
	 *	RR1: blocks 3 and 4
	 *	RL2: blocks 5 and 6
@@ -246,9 +246,11 @@ __cast5_enc_blk16:
	 *	RR4: encrypted blocks 15 and 16
	 */

	pushq %rbp;
	pushq %r15;
	pushq %rbx;

	movq %rdi, CTX;

	vmovdqa .Lbswap_mask, RKM;
	vmovd .Lfirst_mask, R1ST;
	vmovd .L32_mask, R32;
@@ -283,7 +285,7 @@ __cast5_enc_blk16:

.L__skip_enc:
	popq %rbx;
	popq %rbp;
	popq %r15;

	vmovdqa .Lbswap_mask, RKM;

@@ -298,7 +300,7 @@ ENDPROC(__cast5_enc_blk16)
.align 16
__cast5_dec_blk16:
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	RL1: encrypted blocks 1 and 2
	 *	RR1: encrypted blocks 3 and 4
	 *	RL2: encrypted blocks 5 and 6
@@ -318,9 +320,11 @@ __cast5_dec_blk16:
	 *	RR4: decrypted blocks 15 and 16
	 */

	pushq %rbp;
	pushq %r15;
	pushq %rbx;

	movq %rdi, CTX;

	vmovdqa .Lbswap_mask, RKM;
	vmovd .Lfirst_mask, R1ST;
	vmovd .L32_mask, R32;
@@ -356,7 +360,7 @@ __cast5_dec_blk16:

	vmovdqa .Lbswap_mask, RKM;
	popq %rbx;
	popq %rbp;
	popq %r15;

	outunpack_blocks(RR1, RL1, RTMP, RX, RKM);
	outunpack_blocks(RR2, RL2, RTMP, RX, RKM);
@@ -372,12 +376,14 @@ ENDPROC(__cast5_dec_blk16)

ENTRY(cast5_ecb_enc_16way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;

	vmovdqu (0*4*4)(%rdx), RL1;
@@ -400,18 +406,22 @@ ENTRY(cast5_ecb_enc_16way)
	vmovdqu RR4, (6*4*4)(%r11);
	vmovdqu RL4, (7*4*4)(%r11);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast5_ecb_enc_16way)

ENTRY(cast5_ecb_dec_16way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */

	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;

	vmovdqu (0*4*4)(%rdx), RL1;
@@ -434,20 +444,22 @@ ENTRY(cast5_ecb_dec_16way)
	vmovdqu RR4, (6*4*4)(%r11);
	vmovdqu RL4, (7*4*4)(%r11);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast5_ecb_dec_16way)

ENTRY(cast5_cbc_dec_16way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	FRAME_BEGIN

	pushq %r12;
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;
	movq %rdx, %r12;

@@ -483,23 +495,24 @@ ENTRY(cast5_cbc_dec_16way)
	vmovdqu RR4, (6*16)(%r11);
	vmovdqu RL4, (7*16)(%r11);

	popq %r15;
	popq %r12;

	FRAME_END
	ret;
ENDPROC(cast5_cbc_dec_16way)

ENTRY(cast5_ctr_16way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 *	%rcx: iv (big endian, 64bit)
	 */
	FRAME_BEGIN

	pushq %r12;
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;
	movq %rdx, %r12;

@@ -558,8 +571,8 @@ ENTRY(cast5_ctr_16way)
	vmovdqu RR4, (6*16)(%r11);
	vmovdqu RL4, (7*16)(%r11);

	popq %r15;
	popq %r12;

	FRAME_END
	ret;
ENDPROC(cast5_ctr_16way)
+34 −16
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
/**********************************************************************
  8-way AVX cast6
 **********************************************************************/
#define CTX %rdi
#define CTX %r15

#define RA1 %xmm0
#define RB1 %xmm1
@@ -70,8 +70,8 @@

#define RTMP %xmm15

#define RID1  %rbp
#define RID1d %ebp
#define RID1  %rdi
#define RID1d %edi
#define RID2  %rsi
#define RID2d %esi

@@ -264,15 +264,17 @@
.align 8
__cast6_enc_blk8:
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: blocks
	 * output:
	 *	RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
	 */

	pushq %rbp;
	pushq %r15;
	pushq %rbx;

	movq %rdi, CTX;

	vmovdqa .Lbswap_mask, RKM;
	vmovd .Lfirst_mask, R1ST;
	vmovd .L32_mask, R32;
@@ -297,7 +299,7 @@ __cast6_enc_blk8:
	QBAR(11);

	popq %rbx;
	popq %rbp;
	popq %r15;

	vmovdqa .Lbswap_mask, RKM;

@@ -310,15 +312,17 @@ ENDPROC(__cast6_enc_blk8)
.align 8
__cast6_dec_blk8:
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: encrypted blocks
	 * output:
	 *	RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2: decrypted blocks
	 */

	pushq %rbp;
	pushq %r15;
	pushq %rbx;

	movq %rdi, CTX;

	vmovdqa .Lbswap_mask, RKM;
	vmovd .Lfirst_mask, R1ST;
	vmovd .L32_mask, R32;
@@ -343,7 +347,7 @@ __cast6_dec_blk8:
	QBAR(0);

	popq %rbx;
	popq %rbp;
	popq %r15;

	vmovdqa .Lbswap_mask, RKM;
	outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
@@ -354,12 +358,14 @@ ENDPROC(__cast6_dec_blk8)

ENTRY(cast6_ecb_enc_8way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;

	load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
@@ -368,18 +374,21 @@ ENTRY(cast6_ecb_enc_8way)

	store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast6_ecb_enc_8way)

ENTRY(cast6_ecb_dec_8way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;

	load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
@@ -388,20 +397,22 @@ ENTRY(cast6_ecb_dec_8way)

	store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast6_ecb_dec_8way)

ENTRY(cast6_cbc_dec_8way)
	/* input:
	 *	%rdi: ctx, CTX
	 *	%rdi: ctx
	 *	%rsi: dst
	 *	%rdx: src
	 */
	FRAME_BEGIN

	pushq %r12;
	pushq %r15;

	movq %rdi, CTX;
	movq %rsi, %r11;
	movq %rdx, %r12;

@@ -411,8 +422,8 @@ ENTRY(cast6_cbc_dec_8way)

	store_cbc_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	popq %r12;

	FRAME_END
	ret;
ENDPROC(cast6_cbc_dec_8way)
@@ -425,9 +436,10 @@ ENTRY(cast6_ctr_8way)
	 *	%rcx: iv (little endian, 128bit)
	 */
	FRAME_BEGIN

	pushq %r12;
	pushq %r15

	movq %rdi, CTX;
	movq %rsi, %r11;
	movq %rdx, %r12;

@@ -438,8 +450,8 @@ ENTRY(cast6_ctr_8way)

	store_ctr_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	popq %r12;

	FRAME_END
	ret;
ENDPROC(cast6_ctr_8way)
@@ -452,7 +464,9 @@ ENTRY(cast6_xts_enc_8way)
	 *	%rcx: iv (t  αⁿ  GF(2¹²⁸))
	 */
	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX
	movq %rsi, %r11;

	/* regs <= src, dst <= IVs, regs <= regs xor IVs */
@@ -464,6 +478,7 @@ ENTRY(cast6_xts_enc_8way)
	/* dst <= regs xor IVs(in dst) */
	store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast6_xts_enc_8way)
@@ -476,7 +491,9 @@ ENTRY(cast6_xts_dec_8way)
	 *	%rcx: iv (t  αⁿ  GF(2¹²⁸))
	 */
	FRAME_BEGIN
	pushq %r15;

	movq %rdi, CTX
	movq %rsi, %r11;

	/* regs <= src, dst <= IVs, regs <= regs xor IVs */
@@ -488,6 +505,7 @@ ENTRY(cast6_xts_dec_8way)
	/* dst <= regs xor IVs(in dst) */
	store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);

	popq %r15;
	FRAME_END
	ret;
ENDPROC(cast6_xts_dec_8way)
+9 −6
Original line number Diff line number Diff line
@@ -64,12 +64,12 @@
#define RW2bh %ch

#define RT0 %r15
#define RT1 %rbp
#define RT1 %rsi
#define RT2 %r14
#define RT3 %rdx

#define RT0d %r15d
#define RT1d %ebp
#define RT1d %esi
#define RT2d %r14d
#define RT3d %edx

@@ -177,13 +177,14 @@ ENTRY(des3_ede_x86_64_crypt_blk)
	 *	%rsi: dst
	 *	%rdx: src
	 */
	pushq %rbp;
	pushq %rbx;
	pushq %r12;
	pushq %r13;
	pushq %r14;
	pushq %r15;

	pushq %rsi; /* dst */

	read_block(%rdx, RL0, RR0);
	initial_permutation(RL0, RR0);

@@ -241,6 +242,8 @@ ENTRY(des3_ede_x86_64_crypt_blk)
	round1(32+15, RL0, RR0, dummy2);

	final_permutation(RR0, RL0);

	popq %rsi /* dst */
	write_block(%rsi, RR0, RL0);

	popq %r15;
@@ -248,7 +251,6 @@ ENTRY(des3_ede_x86_64_crypt_blk)
	popq %r13;
	popq %r12;
	popq %rbx;
	popq %rbp;

	ret;
ENDPROC(des3_ede_x86_64_crypt_blk)
@@ -432,13 +434,14 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
	 *	%rdx: src (3 blocks)
	 */

	pushq %rbp;
	pushq %rbx;
	pushq %r12;
	pushq %r13;
	pushq %r14;
	pushq %r15;

	pushq %rsi /* dst */

	/* load input */
	movl 0 * 4(%rdx), RL0d;
	movl 1 * 4(%rdx), RR0d;
@@ -520,6 +523,7 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
	bswapl RR2d;
	bswapl RL2d;

	popq %rsi /* dst */
	movl RR0d, 0 * 4(%rsi);
	movl RL0d, 1 * 4(%rsi);
	movl RR1d, 2 * 4(%rsi);
@@ -532,7 +536,6 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
	popq %r13;
	popq %r12;
	popq %rbx;
	popq %rbp;

	ret;
ENDPROC(des3_ede_x86_64_crypt_blk_3way)
Loading