You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto update from Herbert Xu: "Here is the crypto update for 3.14: - Improved crypto_memneq helper - Use cyprto_memneq in arch-specific crypto code - Replaced orphaned DCP driver with Freescale MXS DCP driver - Added AVX/AVX2 version of AESNI-GCM encode and decode - Added AMD Cryptographic Coprocessor (CCP) driver - Misc fixes" * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (41 commits) crypto: aesni - fix build on x86 (32bit) crypto: mxs - Fix sparse non static symbol warning crypto: ccp - CCP device enabled/disabled changes crypto: ccp - Cleanup hash invocation calls crypto: ccp - Change data length declarations to u64 crypto: ccp - Check for caller result area before using it crypto: ccp - Cleanup scatterlist usage crypto: ccp - Apply appropriate gfp_t type to memory allocations crypto: drivers - Sort drivers/crypto/Makefile ARM: mxs: dts: Enable DCP for MXS crypto: mxs - Add Freescale MXS DCP driver crypto: mxs - Remove the old DCP driver crypto: ahash - Fully restore ahash request before completing crypto: aesni - fix build on x86 (32bit) crypto: talitos - Remove redundant dev_set_drvdata crypto: ccp - Remove redundant dev_set_drvdata crypto: crypto4xx - Remove redundant dev_set_drvdata crypto: caam - simplify and harden key parsing crypto: omap-sham - Fix Polling mode for larger blocks crypto: tcrypt - Added speed tests for AEAD crypto alogrithms in tcrypt test suite ...
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
Freescale DCP (Data Co-Processor) found on i.MX23/i.MX28 .
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "fsl,<soc>-dcp"
|
||||
- reg : Should contain MXS DCP registers location and length
|
||||
- interrupts : Should contain MXS DCP interrupt numbers, VMI IRQ and DCP IRQ
|
||||
must be supplied, optionally Secure IRQ can be present, but
|
||||
is currently not implemented and not used.
|
||||
|
||||
Example:
|
||||
|
||||
dcp@80028000 {
|
||||
compatible = "fsl,imx28-dcp", "fsl,imx23-dcp";
|
||||
reg = <0x80028000 0x2000>;
|
||||
interrupts = <52 53>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -538,6 +538,13 @@ F: drivers/tty/serial/altera_jtaguart.c
|
||||
F: include/linux/altera_uart.h
|
||||
F: include/linux/altera_jtaguart.h
|
||||
|
||||
AMD CRYPTOGRAPHIC COPROCESSOR (CCP) DRIVER
|
||||
M: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/crypto/ccp/
|
||||
F: include/linux/ccp.h
|
||||
|
||||
AMD FAM15H PROCESSOR POWER MONITORING DRIVER
|
||||
M: Andreas Herrmann <herrmann.der.user@googlemail.com>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
|
||||
@@ -337,8 +337,10 @@
|
||||
};
|
||||
|
||||
dcp@80028000 {
|
||||
compatible = "fsl,imx23-dcp";
|
||||
reg = <0x80028000 0x2000>;
|
||||
status = "disabled";
|
||||
interrupts = <53 54>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
pxp@8002a000 {
|
||||
|
||||
@@ -813,9 +813,10 @@
|
||||
};
|
||||
|
||||
dcp: dcp@80028000 {
|
||||
compatible = "fsl,imx28-dcp", "fsl,imx23-dcp";
|
||||
reg = <0x80028000 0x2000>;
|
||||
interrupts = <52 53 54>;
|
||||
compatible = "fsl-dcp";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
pxp: pxp@8002a000 {
|
||||
|
||||
@@ -237,8 +237,8 @@ static int des3_setkey(struct crypto_tfm *tfm, const u8 *key,
|
||||
struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
u32 *flags = &tfm->crt_flags;
|
||||
|
||||
if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
|
||||
memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
|
||||
if (!(crypto_memneq(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
|
||||
crypto_memneq(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
|
||||
DES_KEY_SIZE)) &&
|
||||
(*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
|
||||
*flags |= CRYPTO_TFM_RES_WEAK_KEY;
|
||||
|
||||
@@ -76,6 +76,7 @@ ifeq ($(avx2_supported),yes)
|
||||
endif
|
||||
|
||||
aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o fpu.o
|
||||
aesni-intel-$(CONFIG_64BIT) += aesni-intel_avx-x86_64.o
|
||||
ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o
|
||||
sha1-ssse3-y := sha1_ssse3_asm.o sha1_ssse3_glue.o
|
||||
crc32c-intel-y := crc32c-intel_glue.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -101,6 +101,9 @@ asmlinkage void aesni_cbc_dec(struct crypto_aes_ctx *ctx, u8 *out,
|
||||
int crypto_fpu_init(void);
|
||||
void crypto_fpu_exit(void);
|
||||
|
||||
#define AVX_GEN2_OPTSIZE 640
|
||||
#define AVX_GEN4_OPTSIZE 4096
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
asmlinkage void aesni_ctr_enc(struct crypto_aes_ctx *ctx, u8 *out,
|
||||
const u8 *in, unsigned int len, u8 *iv);
|
||||
@@ -150,6 +153,123 @@ asmlinkage void aesni_gcm_dec(void *ctx, u8 *out,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
|
||||
#ifdef CONFIG_AS_AVX
|
||||
/*
|
||||
* asmlinkage void aesni_gcm_precomp_avx_gen2()
|
||||
* gcm_data *my_ctx_data, context data
|
||||
* u8 *hash_subkey, the Hash sub key input. Data starts on a 16-byte boundary.
|
||||
*/
|
||||
asmlinkage void aesni_gcm_precomp_avx_gen2(void *my_ctx_data, u8 *hash_subkey);
|
||||
|
||||
asmlinkage void aesni_gcm_enc_avx_gen2(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long plaintext_len, u8 *iv,
|
||||
const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
asmlinkage void aesni_gcm_dec_avx_gen2(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long ciphertext_len, u8 *iv,
|
||||
const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
static void aesni_gcm_enc_avx(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long plaintext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len)
|
||||
{
|
||||
if (plaintext_len < AVX_GEN2_OPTSIZE) {
|
||||
aesni_gcm_enc(ctx, out, in, plaintext_len, iv, hash_subkey, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
} else {
|
||||
aesni_gcm_precomp_avx_gen2(ctx, hash_subkey);
|
||||
aesni_gcm_enc_avx_gen2(ctx, out, in, plaintext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void aesni_gcm_dec_avx(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long ciphertext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len)
|
||||
{
|
||||
if (ciphertext_len < AVX_GEN2_OPTSIZE) {
|
||||
aesni_gcm_dec(ctx, out, in, ciphertext_len, iv, hash_subkey, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
} else {
|
||||
aesni_gcm_precomp_avx_gen2(ctx, hash_subkey);
|
||||
aesni_gcm_dec_avx_gen2(ctx, out, in, ciphertext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AS_AVX2
|
||||
/*
|
||||
* asmlinkage void aesni_gcm_precomp_avx_gen4()
|
||||
* gcm_data *my_ctx_data, context data
|
||||
* u8 *hash_subkey, the Hash sub key input. Data starts on a 16-byte boundary.
|
||||
*/
|
||||
asmlinkage void aesni_gcm_precomp_avx_gen4(void *my_ctx_data, u8 *hash_subkey);
|
||||
|
||||
asmlinkage void aesni_gcm_enc_avx_gen4(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long plaintext_len, u8 *iv,
|
||||
const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
asmlinkage void aesni_gcm_dec_avx_gen4(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long ciphertext_len, u8 *iv,
|
||||
const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
static void aesni_gcm_enc_avx2(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long plaintext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len)
|
||||
{
|
||||
if (plaintext_len < AVX_GEN2_OPTSIZE) {
|
||||
aesni_gcm_enc(ctx, out, in, plaintext_len, iv, hash_subkey, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
} else if (plaintext_len < AVX_GEN4_OPTSIZE) {
|
||||
aesni_gcm_precomp_avx_gen2(ctx, hash_subkey);
|
||||
aesni_gcm_enc_avx_gen2(ctx, out, in, plaintext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
} else {
|
||||
aesni_gcm_precomp_avx_gen4(ctx, hash_subkey);
|
||||
aesni_gcm_enc_avx_gen4(ctx, out, in, plaintext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void aesni_gcm_dec_avx2(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long ciphertext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len)
|
||||
{
|
||||
if (ciphertext_len < AVX_GEN2_OPTSIZE) {
|
||||
aesni_gcm_dec(ctx, out, in, ciphertext_len, iv, hash_subkey,
|
||||
aad, aad_len, auth_tag, auth_tag_len);
|
||||
} else if (ciphertext_len < AVX_GEN4_OPTSIZE) {
|
||||
aesni_gcm_precomp_avx_gen2(ctx, hash_subkey);
|
||||
aesni_gcm_dec_avx_gen2(ctx, out, in, ciphertext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
} else {
|
||||
aesni_gcm_precomp_avx_gen4(ctx, hash_subkey);
|
||||
aesni_gcm_dec_avx_gen4(ctx, out, in, ciphertext_len, iv, aad,
|
||||
aad_len, auth_tag, auth_tag_len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void (*aesni_gcm_enc_tfm)(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long plaintext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
static void (*aesni_gcm_dec_tfm)(void *ctx, u8 *out,
|
||||
const u8 *in, unsigned long ciphertext_len, u8 *iv,
|
||||
u8 *hash_subkey, const u8 *aad, unsigned long aad_len,
|
||||
u8 *auth_tag, unsigned long auth_tag_len);
|
||||
|
||||
static inline struct
|
||||
aesni_rfc4106_gcm_ctx *aesni_rfc4106_gcm_ctx_get(struct crypto_aead *tfm)
|
||||
{
|
||||
@@ -915,7 +1035,7 @@ static int __driver_rfc4106_encrypt(struct aead_request *req)
|
||||
dst = src;
|
||||
}
|
||||
|
||||
aesni_gcm_enc(aes_ctx, dst, src, (unsigned long)req->cryptlen, iv,
|
||||
aesni_gcm_enc_tfm(aes_ctx, dst, src, (unsigned long)req->cryptlen, iv,
|
||||
ctx->hash_subkey, assoc, (unsigned long)req->assoclen, dst
|
||||
+ ((unsigned long)req->cryptlen), auth_tag_len);
|
||||
|
||||
@@ -996,12 +1116,12 @@ static int __driver_rfc4106_decrypt(struct aead_request *req)
|
||||
dst = src;
|
||||
}
|
||||
|
||||
aesni_gcm_dec(aes_ctx, dst, src, tempCipherLen, iv,
|
||||
aesni_gcm_dec_tfm(aes_ctx, dst, src, tempCipherLen, iv,
|
||||
ctx->hash_subkey, assoc, (unsigned long)req->assoclen,
|
||||
authTag, auth_tag_len);
|
||||
|
||||
/* Compare generated tag with passed in tag. */
|
||||
retval = memcmp(src + tempCipherLen, authTag, auth_tag_len) ?
|
||||
retval = crypto_memneq(src + tempCipherLen, authTag, auth_tag_len) ?
|
||||
-EBADMSG : 0;
|
||||
|
||||
if (one_entry_in_sg) {
|
||||
@@ -1353,6 +1473,27 @@ static int __init aesni_init(void)
|
||||
|
||||
if (!x86_match_cpu(aesni_cpu_id))
|
||||
return -ENODEV;
|
||||
#ifdef CONFIG_X86_64
|
||||
#ifdef CONFIG_AS_AVX2
|
||||
if (boot_cpu_has(X86_FEATURE_AVX2)) {
|
||||
pr_info("AVX2 version of gcm_enc/dec engaged.\n");
|
||||
aesni_gcm_enc_tfm = aesni_gcm_enc_avx2;
|
||||
aesni_gcm_dec_tfm = aesni_gcm_dec_avx2;
|
||||
} else
|
||||
#endif
|
||||
#ifdef CONFIG_AS_AVX
|
||||
if (boot_cpu_has(X86_FEATURE_AVX)) {
|
||||
pr_info("AVX version of gcm_enc/dec engaged.\n");
|
||||
aesni_gcm_enc_tfm = aesni_gcm_enc_avx;
|
||||
aesni_gcm_dec_tfm = aesni_gcm_dec_avx;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
pr_info("SSE version of gcm_enc/dec engaged.\n");
|
||||
aesni_gcm_enc_tfm = aesni_gcm_enc;
|
||||
aesni_gcm_dec_tfm = aesni_gcm_dec;
|
||||
}
|
||||
#endif
|
||||
|
||||
err = crypto_fpu_init();
|
||||
if (err)
|
||||
|
||||
@@ -2,11 +2,6 @@
|
||||
# Cryptographic API
|
||||
#
|
||||
|
||||
# memneq MUST be built with -Os or -O0 to prevent early-return optimizations
|
||||
# that will defeat memneq's actual purpose to prevent timing attacks.
|
||||
CFLAGS_REMOVE_memneq.o := -O1 -O2 -O3
|
||||
CFLAGS_memneq.o := -Os
|
||||
|
||||
obj-$(CONFIG_CRYPTO) += crypto.o
|
||||
crypto-y := api.o cipher.o compress.o memneq.o
|
||||
|
||||
|
||||
+4
-1
@@ -213,7 +213,10 @@ static void ahash_op_unaligned_done(struct crypto_async_request *req, int err)
|
||||
|
||||
ahash_op_unaligned_finish(areq, err);
|
||||
|
||||
complete(data, err);
|
||||
areq->base.complete = complete;
|
||||
areq->base.data = data;
|
||||
|
||||
complete(&areq->base, err);
|
||||
}
|
||||
|
||||
static int ahash_op_unaligned(struct ahash_request *req,
|
||||
|
||||
+55
-25
@@ -72,6 +72,7 @@ __crypto_memneq_generic(const void *a, const void *b, size_t size)
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
while (size >= sizeof(unsigned long)) {
|
||||
neq |= *(unsigned long *)a ^ *(unsigned long *)b;
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
a += sizeof(unsigned long);
|
||||
b += sizeof(unsigned long);
|
||||
size -= sizeof(unsigned long);
|
||||
@@ -79,6 +80,7 @@ __crypto_memneq_generic(const void *a, const void *b, size_t size)
|
||||
#endif /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
|
||||
while (size > 0) {
|
||||
neq |= *(unsigned char *)a ^ *(unsigned char *)b;
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
a += 1;
|
||||
b += 1;
|
||||
size -= 1;
|
||||
@@ -89,33 +91,61 @@ __crypto_memneq_generic(const void *a, const void *b, size_t size)
|
||||
/* Loop-free fast-path for frequently used 16-byte size */
|
||||
static inline unsigned long __crypto_memneq_16(const void *a, const void *b)
|
||||
{
|
||||
unsigned long neq = 0;
|
||||
|
||||
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
if (sizeof(unsigned long) == 8)
|
||||
return ((*(unsigned long *)(a) ^ *(unsigned long *)(b))
|
||||
| (*(unsigned long *)(a+8) ^ *(unsigned long *)(b+8)));
|
||||
else if (sizeof(unsigned int) == 4)
|
||||
return ((*(unsigned int *)(a) ^ *(unsigned int *)(b))
|
||||
| (*(unsigned int *)(a+4) ^ *(unsigned int *)(b+4))
|
||||
| (*(unsigned int *)(a+8) ^ *(unsigned int *)(b+8))
|
||||
| (*(unsigned int *)(a+12) ^ *(unsigned int *)(b+12)));
|
||||
else
|
||||
if (sizeof(unsigned long) == 8) {
|
||||
neq |= *(unsigned long *)(a) ^ *(unsigned long *)(b);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned long *)(a+8) ^ *(unsigned long *)(b+8);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
} else if (sizeof(unsigned int) == 4) {
|
||||
neq |= *(unsigned int *)(a) ^ *(unsigned int *)(b);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned int *)(a+4) ^ *(unsigned int *)(b+4);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned int *)(a+8) ^ *(unsigned int *)(b+8);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned int *)(a+12) ^ *(unsigned int *)(b+12);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
} else
|
||||
#endif /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
|
||||
return ((*(unsigned char *)(a) ^ *(unsigned char *)(b))
|
||||
| (*(unsigned char *)(a+1) ^ *(unsigned char *)(b+1))
|
||||
| (*(unsigned char *)(a+2) ^ *(unsigned char *)(b+2))
|
||||
| (*(unsigned char *)(a+3) ^ *(unsigned char *)(b+3))
|
||||
| (*(unsigned char *)(a+4) ^ *(unsigned char *)(b+4))
|
||||
| (*(unsigned char *)(a+5) ^ *(unsigned char *)(b+5))
|
||||
| (*(unsigned char *)(a+6) ^ *(unsigned char *)(b+6))
|
||||
| (*(unsigned char *)(a+7) ^ *(unsigned char *)(b+7))
|
||||
| (*(unsigned char *)(a+8) ^ *(unsigned char *)(b+8))
|
||||
| (*(unsigned char *)(a+9) ^ *(unsigned char *)(b+9))
|
||||
| (*(unsigned char *)(a+10) ^ *(unsigned char *)(b+10))
|
||||
| (*(unsigned char *)(a+11) ^ *(unsigned char *)(b+11))
|
||||
| (*(unsigned char *)(a+12) ^ *(unsigned char *)(b+12))
|
||||
| (*(unsigned char *)(a+13) ^ *(unsigned char *)(b+13))
|
||||
| (*(unsigned char *)(a+14) ^ *(unsigned char *)(b+14))
|
||||
| (*(unsigned char *)(a+15) ^ *(unsigned char *)(b+15)));
|
||||
{
|
||||
neq |= *(unsigned char *)(a) ^ *(unsigned char *)(b);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+1) ^ *(unsigned char *)(b+1);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+2) ^ *(unsigned char *)(b+2);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+3) ^ *(unsigned char *)(b+3);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+4) ^ *(unsigned char *)(b+4);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+5) ^ *(unsigned char *)(b+5);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+6) ^ *(unsigned char *)(b+6);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+7) ^ *(unsigned char *)(b+7);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+8) ^ *(unsigned char *)(b+8);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+9) ^ *(unsigned char *)(b+9);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+10) ^ *(unsigned char *)(b+10);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+11) ^ *(unsigned char *)(b+11);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+12) ^ *(unsigned char *)(b+12);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+13) ^ *(unsigned char *)(b+13);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+14) ^ *(unsigned char *)(b+14);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
neq |= *(unsigned char *)(a+15) ^ *(unsigned char *)(b+15);
|
||||
OPTIMIZER_HIDE_VAR(neq);
|
||||
}
|
||||
|
||||
return neq;
|
||||
}
|
||||
|
||||
/* Compare two areas of memory without leaking timing information,
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ static int pcrypt_do_parallel(struct padata_priv *padata, unsigned int *cb_cpu,
|
||||
cpu = *cb_cpu;
|
||||
|
||||
rcu_read_lock_bh();
|
||||
cpumask = rcu_dereference(pcrypt->cb_cpumask);
|
||||
cpumask = rcu_dereference_bh(pcrypt->cb_cpumask);
|
||||
if (cpumask_test_cpu(cpu, cpumask->mask))
|
||||
goto out;
|
||||
|
||||
|
||||
+270
@@ -137,7 +137,272 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int test_aead_jiffies(struct aead_request *req, int enc,
|
||||
int blen, int sec)
|
||||
{
|
||||
unsigned long start, end;
|
||||
int bcount;
|
||||
int ret;
|
||||
|
||||
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
||||
time_before(jiffies, end); bcount++) {
|
||||
if (enc)
|
||||
ret = crypto_aead_encrypt(req);
|
||||
else
|
||||
ret = crypto_aead_decrypt(req);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
printk("%d operations in %d seconds (%ld bytes)\n",
|
||||
bcount, sec, (long)bcount * blen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_aead_cycles(struct aead_request *req, int enc, int blen)
|
||||
{
|
||||
unsigned long cycles = 0;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
/* Warm-up run. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (enc)
|
||||
ret = crypto_aead_encrypt(req);
|
||||
else
|
||||
ret = crypto_aead_decrypt(req);
|
||||
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* The real thing. */
|
||||
for (i = 0; i < 8; i++) {
|
||||
cycles_t start, end;
|
||||
|
||||
start = get_cycles();
|
||||
if (enc)
|
||||
ret = crypto_aead_encrypt(req);
|
||||
else
|
||||
ret = crypto_aead_decrypt(req);
|
||||
end = get_cycles();
|
||||
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
cycles += end - start;
|
||||
}
|
||||
|
||||
out:
|
||||
local_irq_enable();
|
||||
|
||||
if (ret == 0)
|
||||
printk("1 operation in %lu cycles (%d bytes)\n",
|
||||
(cycles + 4) / 8, blen);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
|
||||
static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
|
||||
|
||||
#define XBUFSIZE 8
|
||||
#define MAX_IVLEN 32
|
||||
|
||||
static int testmgr_alloc_buf(char *buf[XBUFSIZE])
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < XBUFSIZE; i++) {
|
||||
buf[i] = (void *)__get_free_page(GFP_KERNEL);
|
||||
if (!buf[i])
|
||||
goto err_free_buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_buf:
|
||||
while (i-- > 0)
|
||||
free_page((unsigned long)buf[i]);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void testmgr_free_buf(char *buf[XBUFSIZE])
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < XBUFSIZE; i++)
|
||||
free_page((unsigned long)buf[i]);
|
||||
}
|
||||
|
||||
static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
|
||||
unsigned int buflen)
|
||||
{
|
||||
int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
|
||||
int k, rem;
|
||||
|
||||
np = (np > XBUFSIZE) ? XBUFSIZE : np;
|
||||
rem = buflen % PAGE_SIZE;
|
||||
if (np > XBUFSIZE) {
|
||||
rem = PAGE_SIZE;
|
||||
np = XBUFSIZE;
|
||||
}
|
||||
sg_init_table(sg, np);
|
||||
for (k = 0; k < np; ++k) {
|
||||
if (k == (np-1))
|
||||
sg_set_buf(&sg[k], xbuf[k], rem);
|
||||
else
|
||||
sg_set_buf(&sg[k], xbuf[k], PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_aead_speed(const char *algo, int enc, unsigned int sec,
|
||||
struct aead_speed_template *template,
|
||||
unsigned int tcount, u8 authsize,
|
||||
unsigned int aad_size, u8 *keysize)
|
||||
{
|
||||
unsigned int i, j;
|
||||
struct crypto_aead *tfm;
|
||||
int ret = -ENOMEM;
|
||||
const char *key;
|
||||
struct aead_request *req;
|
||||
struct scatterlist *sg;
|
||||
struct scatterlist *asg;
|
||||
struct scatterlist *sgout;
|
||||
const char *e;
|
||||
void *assoc;
|
||||
char iv[MAX_IVLEN];
|
||||
char *xbuf[XBUFSIZE];
|
||||
char *xoutbuf[XBUFSIZE];
|
||||
char *axbuf[XBUFSIZE];
|
||||
unsigned int *b_size;
|
||||
unsigned int iv_len;
|
||||
|
||||
if (enc == ENCRYPT)
|
||||
e = "encryption";
|
||||
else
|
||||
e = "decryption";
|
||||
|
||||
if (testmgr_alloc_buf(xbuf))
|
||||
goto out_noxbuf;
|
||||
if (testmgr_alloc_buf(axbuf))
|
||||
goto out_noaxbuf;
|
||||
if (testmgr_alloc_buf(xoutbuf))
|
||||
goto out_nooutbuf;
|
||||
|
||||
sg = kmalloc(sizeof(*sg) * 8 * 3, GFP_KERNEL);
|
||||
if (!sg)
|
||||
goto out_nosg;
|
||||
asg = &sg[8];
|
||||
sgout = &asg[8];
|
||||
|
||||
|
||||
printk(KERN_INFO "\ntesting speed of %s %s\n", algo, e);
|
||||
|
||||
tfm = crypto_alloc_aead(algo, 0, 0);
|
||||
|
||||
if (IS_ERR(tfm)) {
|
||||
pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
|
||||
PTR_ERR(tfm));
|
||||
return;
|
||||
}
|
||||
|
||||
req = aead_request_alloc(tfm, GFP_KERNEL);
|
||||
if (!req) {
|
||||
pr_err("alg: aead: Failed to allocate request for %s\n",
|
||||
algo);
|
||||
goto out;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
b_size = aead_sizes;
|
||||
do {
|
||||
assoc = axbuf[0];
|
||||
|
||||
if (aad_size < PAGE_SIZE)
|
||||
memset(assoc, 0xff, aad_size);
|
||||
else {
|
||||
pr_err("associate data length (%u) too big\n",
|
||||
aad_size);
|
||||
goto out_nosg;
|
||||
}
|
||||
sg_init_one(&asg[0], assoc, aad_size);
|
||||
|
||||
if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
|
||||
pr_err("template (%u) too big for tvmem (%lu)\n",
|
||||
*keysize + *b_size,
|
||||
TVMEMSIZE * PAGE_SIZE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
key = tvmem[0];
|
||||
for (j = 0; j < tcount; j++) {
|
||||
if (template[j].klen == *keysize) {
|
||||
key = template[j].key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = crypto_aead_setkey(tfm, key, *keysize);
|
||||
ret = crypto_aead_setauthsize(tfm, authsize);
|
||||
|
||||
iv_len = crypto_aead_ivsize(tfm);
|
||||
if (iv_len)
|
||||
memset(&iv, 0xff, iv_len);
|
||||
|
||||
crypto_aead_clear_flags(tfm, ~0);
|
||||
printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
|
||||
i, *keysize * 8, *b_size);
|
||||
|
||||
|
||||
memset(tvmem[0], 0xff, PAGE_SIZE);
|
||||
|
||||
if (ret) {
|
||||
pr_err("setkey() failed flags=%x\n",
|
||||
crypto_aead_get_flags(tfm));
|
||||
goto out;
|
||||
}
|
||||
|
||||
sg_init_aead(&sg[0], xbuf,
|
||||
*b_size + (enc ? authsize : 0));
|
||||
|
||||
sg_init_aead(&sgout[0], xoutbuf,
|
||||
*b_size + (enc ? authsize : 0));
|
||||
|
||||
aead_request_set_crypt(req, sg, sgout, *b_size, iv);
|
||||
aead_request_set_assoc(req, asg, aad_size);
|
||||
|
||||
if (sec)
|
||||
ret = test_aead_jiffies(req, enc, *b_size, sec);
|
||||
else
|
||||
ret = test_aead_cycles(req, enc, *b_size);
|
||||
|
||||
if (ret) {
|
||||
pr_err("%s() failed return code=%d\n", e, ret);
|
||||
break;
|
||||
}
|
||||
b_size++;
|
||||
i++;
|
||||
} while (*b_size);
|
||||
keysize++;
|
||||
} while (*keysize);
|
||||
|
||||
out:
|
||||
crypto_free_aead(tfm);
|
||||
kfree(sg);
|
||||
out_nosg:
|
||||
testmgr_free_buf(xoutbuf);
|
||||
out_nooutbuf:
|
||||
testmgr_free_buf(axbuf);
|
||||
out_noaxbuf:
|
||||
testmgr_free_buf(xbuf);
|
||||
out_noxbuf:
|
||||
return;
|
||||
}
|
||||
|
||||
static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
|
||||
struct cipher_speed_template *template,
|
||||
@@ -1427,6 +1692,11 @@ static int do_test(int m)
|
||||
speed_template_32_64);
|
||||
break;
|
||||
|
||||
case 211:
|
||||
test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
|
||||
NULL, 0, 16, 8, aead_speed_template_20);
|
||||
break;
|
||||
|
||||
case 300:
|
||||
/* fall through */
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ struct cipher_speed_template {
|
||||
unsigned int klen;
|
||||
};
|
||||
|
||||
struct aead_speed_template {
|
||||
const char *key;
|
||||
unsigned int klen;
|
||||
};
|
||||
|
||||
struct hash_speed {
|
||||
unsigned int blen; /* buffer length */
|
||||
unsigned int plen; /* per-update length */
|
||||
@@ -57,6 +62,11 @@ static u8 speed_template_32_48[] = {32, 48, 0};
|
||||
static u8 speed_template_32_48_64[] = {32, 48, 64, 0};
|
||||
static u8 speed_template_32_64[] = {32, 64, 0};
|
||||
|
||||
/*
|
||||
* AEAD speed tests
|
||||
*/
|
||||
static u8 aead_speed_template_20[] = {20, 0};
|
||||
|
||||
/*
|
||||
* Digest speed tests
|
||||
*/
|
||||
|
||||
+29
-10
@@ -289,16 +289,6 @@ config CRYPTO_DEV_SAHARA
|
||||
This option enables support for the SAHARA HW crypto accelerator
|
||||
found in some Freescale i.MX chips.
|
||||
|
||||
config CRYPTO_DEV_DCP
|
||||
tristate "Support for the DCP engine"
|
||||
depends on ARCH_MXS && OF
|
||||
select CRYPTO_BLKCIPHER
|
||||
select CRYPTO_AES
|
||||
select CRYPTO_CBC
|
||||
help
|
||||
This options enables support for the hardware crypto-acceleration
|
||||
capabilities of the DCP co-processor
|
||||
|
||||
config CRYPTO_DEV_S5P
|
||||
tristate "Support for Samsung S5PV210 crypto accelerator"
|
||||
depends on ARCH_S5PV210
|
||||
@@ -399,4 +389,33 @@ config CRYPTO_DEV_ATMEL_SHA
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called atmel-sha.
|
||||
|
||||
config CRYPTO_DEV_CCP
|
||||
bool "Support for AMD Cryptographic Coprocessor"
|
||||
depends on X86 && PCI
|
||||
default n
|
||||
help
|
||||
The AMD Cryptographic Coprocessor provides hardware support
|
||||
for encryption, hashing and related operations.
|
||||
|
||||
if CRYPTO_DEV_CCP
|
||||
source "drivers/crypto/ccp/Kconfig"
|
||||
endif
|
||||
|
||||
config CRYPTO_DEV_MXS_DCP
|
||||
tristate "Support for Freescale MXS DCP"
|
||||
depends on ARCH_MXS
|
||||
select CRYPTO_SHA1
|
||||
select CRYPTO_SHA256
|
||||
select CRYPTO_CBC
|
||||
select CRYPTO_ECB
|
||||
select CRYPTO_AES
|
||||
select CRYPTO_BLKCIPHER
|
||||
select CRYPTO_ALGAPI
|
||||
help
|
||||
The Freescale i.MX23/i.MX28 has SHA1/SHA256 and AES128 CBC/ECB
|
||||
co-processor on the die.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called mxs-dcp.
|
||||
|
||||
endif # CRYPTO_HW
|
||||
|
||||
+17
-16
@@ -1,24 +1,25 @@
|
||||
obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_AES) += atmel-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_SHA) += atmel-sha.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_TDES) += atmel-tdes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_BFIN_CRC) += bfin_crc.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_CCP) += ccp/
|
||||
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM) += caam/
|
||||
obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_IXP4XX) += ixp4xx_crypto.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_MV_CESA) += mv_cesa.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_MXS_DCP) += mxs-dcp.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_NIAGARA2) += n2_crypto.o
|
||||
n2_crypto-y := n2_core.o n2_asm.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_MV_CESA) += mv_cesa.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_TALITOS) += talitos.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM) += caam/
|
||||
obj-$(CONFIG_CRYPTO_DEV_IXP4XX) += ixp4xx_crypto.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PPC4XX) += amcc/
|
||||
obj-$(CONFIG_CRYPTO_DEV_OMAP_SHAM) += omap-sham.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_NX) += nx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_OMAP_AES) += omap-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_OMAP_SHAM) += omap-sham.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PICOXCELL) += picoxcell_crypto.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_SAHARA) += sahara.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_DCP) += dcp.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_PPC4XX) += amcc/
|
||||
obj-$(CONFIG_CRYPTO_DEV_S5P) += s5p-sss.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_SAHARA) += sahara.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_TALITOS) += talitos.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_TEGRA_AES) += tegra-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_UX500) += ux500/
|
||||
obj-$(CONFIG_CRYPTO_DEV_BFIN_CRC) += bfin_crc.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_NX) += nx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_AES) += atmel-aes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_TDES) += atmel-tdes.o
|
||||
obj-$(CONFIG_CRYPTO_DEV_ATMEL_SHA) += atmel-sha.o
|
||||
|
||||
@@ -724,7 +724,6 @@ static void crypto4xx_stop_all(struct crypto4xx_core_device *core_dev)
|
||||
crypto4xx_destroy_pdr(core_dev->dev);
|
||||
crypto4xx_destroy_gdr(core_dev->dev);
|
||||
crypto4xx_destroy_sdr(core_dev->dev);
|
||||
dev_set_drvdata(core_dev->device, NULL);
|
||||
iounmap(core_dev->dev->ce_base);
|
||||
kfree(core_dev->dev);
|
||||
kfree(core_dev);
|
||||
|
||||
@@ -467,24 +467,10 @@ static int aead_setkey(struct crypto_aead *aead,
|
||||
static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
|
||||
struct caam_ctx *ctx = crypto_aead_ctx(aead);
|
||||
struct device *jrdev = ctx->jrdev;
|
||||
struct rtattr *rta = (void *)key;
|
||||
struct crypto_authenc_key_param *param;
|
||||
unsigned int authkeylen;
|
||||
unsigned int enckeylen;
|
||||
struct crypto_authenc_keys keys;
|
||||
int ret = 0;
|
||||
|
||||
param = RTA_DATA(rta);
|
||||
enckeylen = be32_to_cpu(param->enckeylen);
|
||||
|
||||
key += RTA_ALIGN(rta->rta_len);
|
||||
keylen -= RTA_ALIGN(rta->rta_len);
|
||||
|
||||
if (keylen < enckeylen)
|
||||
goto badkey;
|
||||
|
||||
authkeylen = keylen - enckeylen;
|
||||
|
||||
if (keylen > CAAM_MAX_KEY_SIZE)
|
||||
if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
|
||||
goto badkey;
|
||||
|
||||
/* Pick class 2 key length from algorithm submask */
|
||||
@@ -492,25 +478,29 @@ static int aead_setkey(struct crypto_aead *aead,
|
||||
OP_ALG_ALGSEL_SHIFT] * 2;
|
||||
ctx->split_key_pad_len = ALIGN(ctx->split_key_len, 16);
|
||||
|
||||
if (ctx->split_key_pad_len + keys.enckeylen > CAAM_MAX_KEY_SIZE)
|
||||
goto badkey;
|
||||
|
||||
#ifdef DEBUG
|
||||
printk(KERN_ERR "keylen %d enckeylen %d authkeylen %d\n",
|
||||
keylen, enckeylen, authkeylen);
|
||||
keys.authkeylen + keys.enckeylen, keys.enckeylen,
|
||||
keys.authkeylen);
|
||||
printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n",
|
||||
ctx->split_key_len, ctx->split_key_pad_len);
|
||||
print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
|
||||
DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
|
||||
#endif
|
||||
|
||||
ret = gen_split_aead_key(ctx, key, authkeylen);
|
||||
ret = gen_split_aead_key(ctx, keys.authkey, keys.authkeylen);
|
||||
if (ret) {
|
||||
goto badkey;
|
||||
}
|
||||
|
||||
/* postpend encryption key to auth split key */
|
||||
memcpy(ctx->key + ctx->split_key_pad_len, key + authkeylen, enckeylen);
|
||||
memcpy(ctx->key + ctx->split_key_pad_len, keys.enckey, keys.enckeylen);
|
||||
|
||||
ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->split_key_pad_len +
|
||||
enckeylen, DMA_TO_DEVICE);
|
||||
keys.enckeylen, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(jrdev, ctx->key_dma)) {
|
||||
dev_err(jrdev, "unable to map key i/o memory\n");
|
||||
return -ENOMEM;
|
||||
@@ -518,15 +508,15 @@ static int aead_setkey(struct crypto_aead *aead,
|
||||
#ifdef DEBUG
|
||||
print_hex_dump(KERN_ERR, "ctx.key@"__stringify(__LINE__)": ",
|
||||
DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
|
||||
ctx->split_key_pad_len + enckeylen, 1);
|
||||
ctx->split_key_pad_len + keys.enckeylen, 1);
|
||||
#endif
|
||||
|
||||
ctx->enckeylen = enckeylen;
|
||||
ctx->enckeylen = keys.enckeylen;
|
||||
|
||||
ret = aead_set_sh_desc(aead);
|
||||
if (ret) {
|
||||
dma_unmap_single(jrdev, ctx->key_dma, ctx->split_key_pad_len +
|
||||
enckeylen, DMA_TO_DEVICE);
|
||||
keys.enckeylen, DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
config CRYPTO_DEV_CCP_DD
|
||||
tristate "Cryptographic Coprocessor device driver"
|
||||
depends on CRYPTO_DEV_CCP
|
||||
default m
|
||||
select HW_RANDOM
|
||||
help
|
||||
Provides the interface to use the AMD Cryptographic Coprocessor
|
||||
which can be used to accelerate or offload encryption operations
|
||||
such as SHA, AES and more. If you choose 'M' here, this module
|
||||
will be called ccp.
|
||||
|
||||
config CRYPTO_DEV_CCP_CRYPTO
|
||||
tristate "Encryption and hashing acceleration support"
|
||||
depends on CRYPTO_DEV_CCP_DD
|
||||
default m
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_HASH
|
||||
select CRYPTO_BLKCIPHER
|
||||
select CRYPTO_AUTHENC
|
||||
help
|
||||
Support for using the cryptographic API with the AMD Cryptographic
|
||||
Coprocessor. This module supports acceleration and offload of SHA
|
||||
and AES algorithms. If you choose 'M' here, this module will be
|
||||
called ccp_crypto.
|
||||
@@ -0,0 +1,10 @@
|
||||
obj-$(CONFIG_CRYPTO_DEV_CCP_DD) += ccp.o
|
||||
ccp-objs := ccp-dev.o ccp-ops.o
|
||||
ccp-objs += ccp-pci.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_DEV_CCP_CRYPTO) += ccp-crypto.o
|
||||
ccp-crypto-objs := ccp-crypto-main.o \
|
||||
ccp-crypto-aes.o \
|
||||
ccp-crypto-aes-cmac.o \
|
||||
ccp-crypto-aes-xts.o \
|
||||
ccp-crypto-sha.o
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user