diff options
| author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2017-07-24 11:28:03 +0100 | 
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-08-04 09:27:05 +0800 | 
| commit | a7c391f04fe3259fb0417d71fec78ae28f25780e (patch) | |
| tree | ae138006abd68d231231dbea641ea1cb46e43dff /crypto | |
| parent | 9a42e4eed3fcd7ba8dff6622384cd08bfe5ef707 (diff) | |
| download | linux-a7c391f04fe3259fb0417d71fec78ae28f25780e.tar.bz2 | |
crypto: algapi - use separate dst and src operands for __crypto_xor()
In preparation of introducing crypto_xor_cpy(), which will use separate
operands for input and output, modify the __crypto_xor() implementation,
which it will share with the existing crypto_xor(), which provides the
actual functionality when not using the inline version.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
| -rw-r--r-- | crypto/algapi.c | 25 | 
1 files changed, 15 insertions, 10 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c index e4cc7615a139..aa699ff6c876 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -975,13 +975,15 @@ void crypto_inc(u8 *a, unsigned int size)  }  EXPORT_SYMBOL_GPL(crypto_inc); -void __crypto_xor(u8 *dst, const u8 *src, unsigned int len) +void __crypto_xor(u8 *dst, const u8 *src1, const u8 *src2, unsigned int len)  {  	int relalign = 0;  	if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) {  		int size = sizeof(unsigned long); -		int d = ((unsigned long)dst ^ (unsigned long)src) & (size - 1); +		int d = (((unsigned long)dst ^ (unsigned long)src1) | +			 ((unsigned long)dst ^ (unsigned long)src2)) & +			(size - 1);  		relalign = d ? 1 << __ffs(d) : size; @@ -992,34 +994,37 @@ void __crypto_xor(u8 *dst, const u8 *src, unsigned int len)  		 * process the remainder of the input using optimal strides.  		 */  		while (((unsigned long)dst & (relalign - 1)) && len > 0) { -			*dst++ ^= *src++; +			*dst++ = *src1++ ^ *src2++;  			len--;  		}  	}  	while (IS_ENABLED(CONFIG_64BIT) && len >= 8 && !(relalign & 7)) { -		*(u64 *)dst ^= *(u64 *)src; +		*(u64 *)dst = *(u64 *)src1 ^  *(u64 *)src2;  		dst += 8; -		src += 8; +		src1 += 8; +		src2 += 8;  		len -= 8;  	}  	while (len >= 4 && !(relalign & 3)) { -		*(u32 *)dst ^= *(u32 *)src; +		*(u32 *)dst = *(u32 *)src1 ^ *(u32 *)src2;  		dst += 4; -		src += 4; +		src1 += 4; +		src2 += 4;  		len -= 4;  	}  	while (len >= 2 && !(relalign & 1)) { -		*(u16 *)dst ^= *(u16 *)src; +		*(u16 *)dst = *(u16 *)src1 ^ *(u16 *)src2;  		dst += 2; -		src += 2; +		src1 += 2; +		src2 += 2;  		len -= 2;  	}  	while (len--) -		*dst++ ^= *src++; +		*dst++ = *src1++ ^ *src2++;  }  EXPORT_SYMBOL_GPL(__crypto_xor);  |