Commit 6d7e3d89 authored by Herbert Xu's avatar Herbert Xu

Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Merge the crypto tree for 4.1 to pull in the changeset that disables
algif_aead.
parents d7253322 f858c7bc
...@@ -147,13 +147,21 @@ static int chksum_final(struct shash_desc *desc, u8 *out) ...@@ -147,13 +147,21 @@ static int chksum_final(struct shash_desc *desc, u8 *out)
{ {
struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
put_unaligned_le32(ctx->crc, out);
return 0;
}
static int chksumc_final(struct shash_desc *desc, u8 *out)
{
struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
put_unaligned_le32(~ctx->crc, out); put_unaligned_le32(~ctx->crc, out);
return 0; return 0;
} }
static int __chksum_finup(u32 crc, const u8 *data, unsigned int len, u8 *out) static int __chksum_finup(u32 crc, const u8 *data, unsigned int len, u8 *out)
{ {
put_unaligned_le32(~crc32_arm64_le_hw(crc, data, len), out); put_unaligned_le32(crc32_arm64_le_hw(crc, data, len), out);
return 0; return 0;
} }
...@@ -199,6 +207,14 @@ static int crc32_cra_init(struct crypto_tfm *tfm) ...@@ -199,6 +207,14 @@ static int crc32_cra_init(struct crypto_tfm *tfm)
{ {
struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
mctx->key = 0;
return 0;
}
static int crc32c_cra_init(struct crypto_tfm *tfm)
{
struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
mctx->key = ~0; mctx->key = ~0;
return 0; return 0;
} }
...@@ -229,7 +245,7 @@ static struct shash_alg crc32c_alg = { ...@@ -229,7 +245,7 @@ static struct shash_alg crc32c_alg = {
.setkey = chksum_setkey, .setkey = chksum_setkey,
.init = chksum_init, .init = chksum_init,
.update = chksumc_update, .update = chksumc_update,
.final = chksum_final, .final = chksumc_final,
.finup = chksumc_finup, .finup = chksumc_finup,
.digest = chksumc_digest, .digest = chksumc_digest,
.descsize = sizeof(struct chksum_desc_ctx), .descsize = sizeof(struct chksum_desc_ctx),
...@@ -241,7 +257,7 @@ static struct shash_alg crc32c_alg = { ...@@ -241,7 +257,7 @@ static struct shash_alg crc32c_alg = {
.cra_alignmask = 0, .cra_alignmask = 0,
.cra_ctxsize = sizeof(struct chksum_ctx), .cra_ctxsize = sizeof(struct chksum_ctx),
.cra_module = THIS_MODULE, .cra_module = THIS_MODULE,
.cra_init = crc32_cra_init, .cra_init = crc32c_cra_init,
} }
}; };
......
...@@ -74,6 +74,9 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data, ...@@ -74,6 +74,9 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data,
static int sha1_ce_final(struct shash_desc *desc, u8 *out) static int sha1_ce_final(struct shash_desc *desc, u8 *out)
{ {
struct sha1_ce_state *sctx = shash_desc_ctx(desc);
sctx->finalize = 0;
kernel_neon_begin_partial(16); kernel_neon_begin_partial(16);
sha1_base_do_finalize(desc, (sha1_block_fn *)sha1_ce_transform); sha1_base_do_finalize(desc, (sha1_block_fn *)sha1_ce_transform);
kernel_neon_end(); kernel_neon_end();
......
...@@ -75,6 +75,9 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data, ...@@ -75,6 +75,9 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data,
static int sha256_ce_final(struct shash_desc *desc, u8 *out) static int sha256_ce_final(struct shash_desc *desc, u8 *out)
{ {
struct sha256_ce_state *sctx = shash_desc_ctx(desc);
sctx->finalize = 0;
kernel_neon_begin_partial(28); kernel_neon_begin_partial(28);
sha256_base_do_finalize(desc, (sha256_block_fn *)sha2_ce_transform); sha256_base_do_finalize(desc, (sha256_block_fn *)sha2_ce_transform);
kernel_neon_end(); kernel_neon_end();
......
...@@ -16,11 +16,12 @@ ...@@ -16,11 +16,12 @@
#define GHASH_DIGEST_SIZE 16 #define GHASH_DIGEST_SIZE 16
struct ghash_ctx { struct ghash_ctx {
u8 icv[16]; u8 key[GHASH_BLOCK_SIZE];
u8 key[16];
}; };
struct ghash_desc_ctx { struct ghash_desc_ctx {
u8 icv[GHASH_BLOCK_SIZE];
u8 key[GHASH_BLOCK_SIZE];
u8 buffer[GHASH_BLOCK_SIZE]; u8 buffer[GHASH_BLOCK_SIZE];
u32 bytes; u32 bytes;
}; };
...@@ -28,8 +29,10 @@ struct ghash_desc_ctx { ...@@ -28,8 +29,10 @@ struct ghash_desc_ctx {
static int ghash_init(struct shash_desc *desc) static int ghash_init(struct shash_desc *desc)
{ {
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc); struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
struct ghash_ctx *ctx = crypto_shash_ctx(desc->tfm);
memset(dctx, 0, sizeof(*dctx)); memset(dctx, 0, sizeof(*dctx));
memcpy(dctx->key, ctx->key, GHASH_BLOCK_SIZE);
return 0; return 0;
} }
...@@ -45,7 +48,6 @@ static int ghash_setkey(struct crypto_shash *tfm, ...@@ -45,7 +48,6 @@ static int ghash_setkey(struct crypto_shash *tfm,
} }
memcpy(ctx->key, key, GHASH_BLOCK_SIZE); memcpy(ctx->key, key, GHASH_BLOCK_SIZE);
memset(ctx->icv, 0, GHASH_BLOCK_SIZE);
return 0; return 0;
} }
...@@ -54,7 +56,6 @@ static int ghash_update(struct shash_desc *desc, ...@@ -54,7 +56,6 @@ static int ghash_update(struct shash_desc *desc,
const u8 *src, unsigned int srclen) const u8 *src, unsigned int srclen)
{ {
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc); struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
struct ghash_ctx *ctx = crypto_shash_ctx(desc->tfm);
unsigned int n; unsigned int n;
u8 *buf = dctx->buffer; u8 *buf = dctx->buffer;
int ret; int ret;
...@@ -70,7 +71,7 @@ static int ghash_update(struct shash_desc *desc, ...@@ -70,7 +71,7 @@ static int ghash_update(struct shash_desc *desc,
src += n; src += n;
if (!dctx->bytes) { if (!dctx->bytes) {
ret = crypt_s390_kimd(KIMD_GHASH, ctx, buf, ret = crypt_s390_kimd(KIMD_GHASH, dctx, buf,
GHASH_BLOCK_SIZE); GHASH_BLOCK_SIZE);
if (ret != GHASH_BLOCK_SIZE) if (ret != GHASH_BLOCK_SIZE)
return -EIO; return -EIO;
...@@ -79,7 +80,7 @@ static int ghash_update(struct shash_desc *desc, ...@@ -79,7 +80,7 @@ static int ghash_update(struct shash_desc *desc,
n = srclen & ~(GHASH_BLOCK_SIZE - 1); n = srclen & ~(GHASH_BLOCK_SIZE - 1);
if (n) { if (n) {
ret = crypt_s390_kimd(KIMD_GHASH, ctx, src, n); ret = crypt_s390_kimd(KIMD_GHASH, dctx, src, n);
if (ret != n) if (ret != n)
return -EIO; return -EIO;
src += n; src += n;
...@@ -94,7 +95,7 @@ static int ghash_update(struct shash_desc *desc, ...@@ -94,7 +95,7 @@ static int ghash_update(struct shash_desc *desc,
return 0; return 0;
} }
static int ghash_flush(struct ghash_ctx *ctx, struct ghash_desc_ctx *dctx) static int ghash_flush(struct ghash_desc_ctx *dctx)
{ {
u8 *buf = dctx->buffer; u8 *buf = dctx->buffer;
int ret; int ret;
...@@ -104,24 +105,24 @@ static int ghash_flush(struct ghash_ctx *ctx, struct ghash_desc_ctx *dctx) ...@@ -104,24 +105,24 @@ static int ghash_flush(struct ghash_ctx *ctx, struct ghash_desc_ctx *dctx)
memset(pos, 0, dctx->bytes); memset(pos, 0, dctx->bytes);
ret = crypt_s390_kimd(KIMD_GHASH, ctx, buf, GHASH_BLOCK_SIZE); ret = crypt_s390_kimd(KIMD_GHASH, dctx, buf, GHASH_BLOCK_SIZE);
if (ret != GHASH_BLOCK_SIZE) if (ret != GHASH_BLOCK_SIZE)
return -EIO; return -EIO;
}
dctx->bytes = 0; dctx->bytes = 0;
}
return 0; return 0;
} }
static int ghash_final(struct shash_desc *desc, u8 *dst) static int ghash_final(struct shash_desc *desc, u8 *dst)
{ {
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc); struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
struct ghash_ctx *ctx = crypto_shash_ctx(desc->tfm);
int ret; int ret;
ret = ghash_flush(ctx, dctx); ret = ghash_flush(dctx);
if (!ret) if (!ret)
memcpy(dst, ctx->icv, GHASH_BLOCK_SIZE); memcpy(dst, dctx->icv, GHASH_BLOCK_SIZE);
return ret; return ret;
} }
......
...@@ -79,7 +79,7 @@ NUM_BLKS = %rdx ...@@ -79,7 +79,7 @@ NUM_BLKS = %rdx
c = %rcx c = %rcx
d = %r8 d = %r8
e = %rdx e = %rdx
y3 = %rdi y3 = %rsi
TBL = %rbp TBL = %rbp
......
...@@ -1532,15 +1532,6 @@ config CRYPTO_USER_API_RNG ...@@ -1532,15 +1532,6 @@ config CRYPTO_USER_API_RNG
This option enables the user-spaces interface for random This option enables the user-spaces interface for random
number generator algorithms. number generator algorithms.
config CRYPTO_USER_API_AEAD
tristate "User-space interface for AEAD cipher algorithms"
depends on NET
select CRYPTO_AEAD
select CRYPTO_USER_API
help
This option enables the user-spaces interface for AEAD
cipher algorithms.
config CRYPTO_HASH_INFO config CRYPTO_HASH_INFO
bool bool
......
...@@ -34,7 +34,7 @@ struct aead_ctx { ...@@ -34,7 +34,7 @@ struct aead_ctx {
/* /*
* RSGL_MAX_ENTRIES is an artificial limit where user space at maximum * RSGL_MAX_ENTRIES is an artificial limit where user space at maximum
* can cause the kernel to allocate RSGL_MAX_ENTRIES * ALG_MAX_PAGES * can cause the kernel to allocate RSGL_MAX_ENTRIES * ALG_MAX_PAGES
* bytes * pages
*/ */
#define RSGL_MAX_ENTRIES ALG_MAX_PAGES #define RSGL_MAX_ENTRIES ALG_MAX_PAGES
struct af_alg_sgl rsgl[RSGL_MAX_ENTRIES]; struct af_alg_sgl rsgl[RSGL_MAX_ENTRIES];
...@@ -436,11 +436,10 @@ static int aead_recvmsg(struct socket *sock, struct msghdr *msg, size_t ignored, ...@@ -436,11 +436,10 @@ static int aead_recvmsg(struct socket *sock, struct msghdr *msg, size_t ignored,
if (err < 0) if (err < 0)
goto unlock; goto unlock;
usedpages += err; usedpages += err;
/* chain the new scatterlist with initial list */ /* chain the new scatterlist with previous one */
if (cnt) if (cnt)
scatterwalk_crypto_chain(ctx->rsgl[0].sg, af_alg_link_sg(&ctx->rsgl[cnt-1], &ctx->rsgl[cnt]);
ctx->rsgl[cnt].sg, 1,
sg_nents(ctx->rsgl[cnt-1].sg));
/* we do not need more iovecs as we have sufficient memory */ /* we do not need more iovecs as we have sufficient memory */
if (outlen <= usedpages) if (outlen <= usedpages)
break; break;
......
...@@ -57,7 +57,7 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng) ...@@ -57,7 +57,7 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng)
val &= ~RNG_EN; val &= ~RNG_EN;
__raw_writel(val, priv->regs + RNG_CTRL); __raw_writel(val, priv->regs + RNG_CTRL);
clk_didsable_unprepare(prov->clk); clk_disable_unprepare(priv->clk);
} }
static int bcm63xx_rng_data_present(struct hwrng *rng, int wait) static int bcm63xx_rng_data_present(struct hwrng *rng, int wait)
...@@ -97,14 +97,14 @@ static int bcm63xx_rng_probe(struct platform_device *pdev) ...@@ -97,14 +97,14 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
priv->rng.name = pdev->name; priv->rng.name = pdev->name;
priv->rng.init = bcm63xx_rng_init; priv->rng.init = bcm63xx_rng_init;
priv->rng.cleanup = bcm63xx_rng_cleanup; priv->rng.cleanup = bcm63xx_rng_cleanup;
prov->rng.data_present = bcm63xx_rng_data_present; priv->rng.data_present = bcm63xx_rng_data_present;
priv->rng.data_read = bcm63xx_rng_data_read; priv->rng.data_read = bcm63xx_rng_data_read;
priv->clk = devm_clk_get(&pdev->dev, "ipsec"); priv->clk = devm_clk_get(&pdev->dev, "ipsec");
if (IS_ERR(priv->clk)) { if (IS_ERR(priv->clk)) {
error = PTR_ERR(priv->clk); ret = PTR_ERR(priv->clk);
dev_err(&pdev->dev, "no clock for device: %d\n", error); dev_err(&pdev->dev, "no clock for device: %d\n", ret);
return error; return ret;
} }
if (!devm_request_mem_region(&pdev->dev, r->start, if (!devm_request_mem_region(&pdev->dev, r->start,
...@@ -120,11 +120,11 @@ static int bcm63xx_rng_probe(struct platform_device *pdev) ...@@ -120,11 +120,11 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
error = devm_hwrng_register(&pdev->dev, &priv->rng); ret = devm_hwrng_register(&pdev->dev, &priv->rng);
if (error) { if (ret) {
dev_err(&pdev->dev, "failed to register rng device: %d\n", dev_err(&pdev->dev, "failed to register rng device: %d\n",
error); ret);
return error; return ret;
} }
dev_info(&pdev->dev, "registered RNG driver\n"); dev_info(&pdev->dev, "registered RNG driver\n");
......
...@@ -466,8 +466,9 @@ config CRYPTO_DEV_VMX ...@@ -466,8 +466,9 @@ config CRYPTO_DEV_VMX
source "drivers/crypto/vmx/Kconfig" source "drivers/crypto/vmx/Kconfig"
config CRYPTO_DEV_IMGTEC_HASH config CRYPTO_DEV_IMGTEC_HASH
depends on MIPS || COMPILE_TEST
tristate "Imagination Technologies hardware hash accelerator" tristate "Imagination Technologies hardware hash accelerator"
depends on MIPS || COMPILE_TEST
depends on HAS_DMA
select CRYPTO_ALGAPI select CRYPTO_ALGAPI
select CRYPTO_MD5 select CRYPTO_MD5
select CRYPTO_SHA1 select CRYPTO_SHA1
......
...@@ -9,10 +9,24 @@ ...@@ -9,10 +9,24 @@
+ __GNUC_MINOR__ * 100 \ + __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__) + __GNUC_PATCHLEVEL__)
/* Optimization barrier */ /* Optimization barrier */
/* The "volatile" is due to gcc bugs */ /* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("": : :"memory") #define barrier() __asm__ __volatile__("": : :"memory")
/*
* This version is i.e. to prevent dead stores elimination on @ptr
* where gcc and llvm may behave differently when otherwise using
* normal barrier(): while gcc behavior gets along with a normal
* barrier(), llvm needs an explicit input variable to be assumed
* clobbered. The issue is as follows: while the inline asm might
* access any memory it wants, the compiler could have fit all of
* @ptr into memory registers instead, and since @ptr never escaped
* from that, it proofed that the inline asm wasn't touching any of
* it. This version works well with both compilers, i.e. we're telling
* the compiler that the inline asm absolutely may see the contents
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
*/
#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
/* /*
* This macro obfuscates arithmetic on a variable address so that gcc * This macro obfuscates arithmetic on a variable address so that gcc
......
...@@ -13,9 +13,12 @@ ...@@ -13,9 +13,12 @@
/* Intel ECC compiler doesn't support gcc specific asm stmts. /* Intel ECC compiler doesn't support gcc specific asm stmts.
* It uses intrinsics to do the equivalent things. * It uses intrinsics to do the equivalent things.
*/ */
#undef barrier_data
#undef RELOC_HIDE #undef RELOC_HIDE
#undef OPTIMIZER_HIDE_VAR #undef OPTIMIZER_HIDE_VAR
#define barrier_data(ptr) barrier()
#define RELOC_HIDE(ptr, off) \ #define RELOC_HIDE(ptr, off) \
({ unsigned long __ptr; \ ({ unsigned long __ptr; \
__ptr = (unsigned long) (ptr); \ __ptr = (unsigned long) (ptr); \
......
...@@ -169,6 +169,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); ...@@ -169,6 +169,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
# define barrier() __memory_barrier() # define barrier() __memory_barrier()
#endif #endif
#ifndef barrier_data
# define barrier_data(ptr) barrier()
#endif
/* Unreachable code */ /* Unreachable code */
#ifndef unreachable #ifndef unreachable
# define unreachable() do { } while (1) # define unreachable() do { } while (1)
......
...@@ -607,7 +607,7 @@ EXPORT_SYMBOL(memset); ...@@ -607,7 +607,7 @@ EXPORT_SYMBOL(memset);
void memzero_explicit(void *s, size_t count) void memzero_explicit(void *s, size_t count)
{ {
memset(s, 0, count); memset(s, 0, count);
barrier(); barrier_data(s);
} }
EXPORT_SYMBOL(memzero_explicit); EXPORT_SYMBOL(memzero_explicit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment