Skip to contentSkip to conversation

crypto: remove bare cipher from public API

PATCH In review Ard Biesheuvel 3 participants 6 messages Dec 11, 2020 – Jan 2, 2021

Subsystems (10)
lore
Share & tools
lore
#0 lore raw

v2 cover crypto: remove bare cipher from public API

Patch #2 puts the cipher API (which should not be used outside of the crypto API implementation) into an internal header file and module namespace

Patch #1 is a prerequisite for this, to avoid having to make the chelsio driver import the crypto internal namespace.

Changes since v1:
- add missing Kconfig dependency on CRYPT_LIB_AES (#1)
- add missing module namespace import into skcipher.c (#2) - this addresses the kbuild failure report
- add module import to QAT driver, which now contains a valid use of the bare cipher API

Cc Eric Biggers <[email protected]>

Ard Biesheuvel (2):
chcr_ktls: use AES library for single use cipher
crypto: remove cipher routines from public crypto API

 Documentation/crypto/api-skcipher.rst         |   4 +-
 arch/arm/crypto/aes-neonbs-glue.c             |   3 +
 arch/s390/crypto/aes_s390.c                   |   2 +
 crypto/adiantum.c                             |   2 +
 crypto/ansi_cprng.c                           |   2 +
 crypto/cbc.c                                  |   1 +
 crypto/ccm.c                                  |   2 +
 crypto/cfb.c                                  |   2 +
 crypto/cipher.c                               |   7 +-
 crypto/cmac.c                                 |   2 +
 crypto/ctr.c                                  |   2 +
 crypto/drbg.c                                 |   2 +
 crypto/ecb.c                                  |   1 +
 crypto/essiv.c                                |   2 +
 crypto/keywrap.c                              |   2 +
 crypto/ofb.c                                  |   2 +
 crypto/pcbc.c                                 |   2 +
 crypto/skcipher.c                             |   2 +
 crypto/testmgr.c                              |   3 +
 crypto/vmac.c                                 |   2 +
 crypto/xcbc.c                                 |   2 +
 crypto/xts.c                                  |   2 +
 drivers/crypto/geode-aes.c                    |   2 +
 drivers/crypto/inside-secure/safexcel.c       |   1 +
 drivers/crypto/inside-secure/safexcel_hash.c  |   1 +
 drivers/crypto/qat/qat_common/adf_ctl_drv.c   |   1 +
 drivers/crypto/qat/qat_common/qat_algs.c      |   1 +
 drivers/crypto/vmx/aes.c                      |   1 +
 drivers/crypto/vmx/vmx.c                      |   1 +
 .../ethernet/chelsio/inline_crypto/Kconfig    |   1 +
 .../chelsio/inline_crypto/ch_ktls/chcr_ktls.c |  19 +-
 include/crypto/algapi.h                       |  39 ----
 include/crypto/internal/cipher.h              | 218 ++++++++++++++++++
 include/crypto/internal/skcipher.h            |   1 +
 include/linux/crypto.h                        | 163 -------------
 35 files changed, 281 insertions(+), 219 deletions(-)
 create mode 100644 include/crypto/internal/cipher.h
Signature · 1 line
2.17.1
#1 lore raw

PATCH v2 1/2 chcr_ktls: use AES library for single use cipher

Allocating a cipher via the crypto API only to free it again after using it to encrypt a single block is unnecessary in cases where the algorithm is known at compile time. So replace this pattern with a call to the AES library.

Cc Ayush Sawal <[email protected]>
Cc Vinay Kumar Yadav <[email protected]>
Cc Rohit Maheshwari <[email protected]>
---
 drivers/net/ethernet/chelsio/inline_crypto/Kconfig             |  1 +
 drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c | 19 +++++++------------
 2 files changed, 8 insertions(+), 12 deletions(-)
drivers/net/ethernet/chelsio/inline_crypto/Kconfig +1 -0
index bc06e83fd3c6..521955e1f894 100644
@@ -42,6 +42,7 @@ config CHELSIO_TLS_DEVICE
         depends on CHELSIO_T4
         depends on TLS
         depends on TLS_DEVICE
+	select CRYPTO_LIB_AES
         help
           This flag enables support for kernel tls offload over Chelsio T6
           crypto accelerator. CONFIG_CHELSIO_TLS_DEVICE flag can be enabled
drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c +7 -12
index 5195f692f14d..e9b75cec34db 100644
@@ -9,6 +9,7 @@
 #include <linux/ip.h>
 #include <net/ipv6.h>
 #include <linux/netdevice.h>
+#include <crypto/aes.h>
 #include "chcr_ktls.h"
 
 static LIST_HEAD(uld_ctx_list);
@@ -30,7 +31,7 @@ static int chcr_ktls_save_keys(struct chcr_ktls_info *tx_info,
 	unsigned char ghash_h[TLS_CIPHER_AES_GCM_256_TAG_SIZE];
 	struct tls12_crypto_info_aes_gcm_128 *info_128_gcm;
 	struct ktls_key_ctx *kctx = &tx_info->key_ctx;
-	struct crypto_cipher *cipher;
+	struct crypto_aes_ctx aes_ctx;
 	unsigned char *key, *salt;
 
 	switch (crypto_info->cipher_type) {
@@ -91,18 +92,14 @@ static int chcr_ktls_save_keys(struct chcr_ktls_info *tx_info,
 	/* Calculate the H = CIPH(K, 0 repeated 16 times).
 	 * It will go in key context
 	 */
-	cipher = crypto_alloc_cipher("aes", 0, 0);
-	if (IS_ERR(cipher)) {
-		ret = -ENOMEM;
-		goto out;
-	}
 
-	ret = crypto_cipher_setkey(cipher, key, keylen);
+	ret = aes_expandkey(&aes_ctx, key, keylen);
 	if (ret)
-		goto out1;
+		goto out;
 
 	memset(ghash_h, 0, ghash_size);
-	crypto_cipher_encrypt_one(cipher, ghash_h, ghash_h);
+	aes_encrypt(&aes_ctx, ghash_h, ghash_h);
+	memzero_explicit(&aes_ctx, sizeof(aes_ctx));
 
 	/* fill the Key context */
 	if (direction == TLS_OFFLOAD_CTX_DIR_TX) {
@@ -111,7 +108,7 @@ static int chcr_ktls_save_keys(struct chcr_ktls_info *tx_info,
 						 key_ctx_size >> 4);
 	} else {
 		ret = -EINVAL;
-		goto out1;
+		goto out;
 	}
 
 	memcpy(kctx->salt, salt, tx_info->salt_size);
@@ -119,8 +116,6 @@ static int chcr_ktls_save_keys(struct chcr_ktls_info *tx_info,
 	memcpy(kctx->key + keylen, ghash_h, ghash_size);
 	tx_info->key_ctx_len = key_ctx_size;
 
-out1:
-	crypto_free_cipher(cipher);
 out:
 	return ret;
 }
Signature · 1 line
2.17.1
Reviewed-by on v2 1/2
#2 lore raw

Re: [PATCH v2 1/2] chcr_ktls: use AES library for single use cipher

Quoted 9 lines · Ard Biesheuvel

Allocating a cipher via the crypto API only to free it again after using it to encrypt a single block is unnecessary in cases where the algorithm is known at compile time. So replace this pattern with a call to the AES library.

Cc Ayush Sawal <[email protected]>
Cc Vinay Kumar Yadav <[email protected]>
Cc Rohit Maheshwari <[email protected]>
#3 lore raw

PATCH v2 2/2 crypto: remove cipher routines from public crypto API

In reply to Ard Biesheuvel

The cipher routines in the crypto API are mostly intended for templates implementing skcipher modes generically in software, and shouldn't be used outside of the crypto subsystem. So move the prototypes and all related definitions to a new header file under include/crypto/internal. Also, let's use the new module namespace feature to move the symbol exports into a new namespace CRYPTO_INTERNAL.

---
 Documentation/crypto/api-skcipher.rst        |   4 +-
 arch/arm/crypto/aes-neonbs-glue.c            |   3 +
 arch/s390/crypto/aes_s390.c                  |   2 +
 crypto/adiantum.c                            |   2 +
 crypto/ansi_cprng.c                          |   2 +
 crypto/cbc.c                                 |   1 +
 crypto/ccm.c                                 |   2 +
 crypto/cfb.c                                 |   2 +
 crypto/cipher.c                              |   7 +-
 crypto/cmac.c                                |   2 +
 crypto/ctr.c                                 |   2 +
 crypto/drbg.c                                |   2 +
 crypto/ecb.c                                 |   1 +
 crypto/essiv.c                               |   2 +
 crypto/keywrap.c                             |   2 +
 crypto/ofb.c                                 |   2 +
 crypto/pcbc.c                                |   2 +
 crypto/skcipher.c                            |   2 +
 crypto/testmgr.c                             |   3 +
 crypto/vmac.c                                |   2 +
 crypto/xcbc.c                                |   2 +
 crypto/xts.c                                 |   2 +
 drivers/crypto/geode-aes.c                   |   2 +
 drivers/crypto/inside-secure/safexcel.c      |   1 +
 drivers/crypto/inside-secure/safexcel_hash.c |   1 +
 drivers/crypto/qat/qat_common/adf_ctl_drv.c  |   1 +
 drivers/crypto/qat/qat_common/qat_algs.c     |   1 +
 drivers/crypto/vmx/aes.c                     |   1 +
 drivers/crypto/vmx/vmx.c                     |   1 +
 include/crypto/algapi.h                      |  39 ----
 include/crypto/internal/cipher.h             | 218 ++++++++++++++++++++
 include/crypto/internal/skcipher.h           |   1 +
 include/linux/crypto.h                       | 163 ---------------
 33 files changed, 273 insertions(+), 207 deletions(-)
Documentation/crypto/api-skcipher.rst +2 -2
index 1aaf8985894b..04d6cc5357c8 100644
@@ -28,8 +28,8 @@ Symmetric Key Cipher Request Handle
 Single Block Cipher API
 -----------------------
 
-.. kernel-doc:: include/linux/crypto.h
+.. kernel-doc:: include/crypto/internal/cipher.h
    :doc: Single Block Cipher API
 
-.. kernel-doc:: include/linux/crypto.h
+.. kernel-doc:: include/crypto/internal/cipher.h
    :functions: crypto_alloc_cipher crypto_free_cipher crypto_has_cipher crypto_cipher_blocksize crypto_cipher_setkey crypto_cipher_encrypt_one crypto_cipher_decrypt_one
arch/arm/crypto/aes-neonbs-glue.c +3 -0
index f70af1d0514b..5c6cd3c63cbc 100644
@@ -9,6 +9,7 @@
 #include <asm/simd.h>
 #include <crypto/aes.h>
 #include <crypto/ctr.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/simd.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
@@ -23,6 +24,8 @@ MODULE_ALIAS_CRYPTO("cbc(aes)-all");
 MODULE_ALIAS_CRYPTO("ctr(aes)");
 MODULE_ALIAS_CRYPTO("xts(aes)");
 
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
+
 asmlinkage void aesbs_convert_key(u8 out[], u32 const rk[], int rounds);
 
 asmlinkage void aesbs_ecb_encrypt(u8 out[], u8 const in[], u8 const rk[],
arch/s390/crypto/aes_s390.c +2 -0
index 73044634d342..54c7536f2482 100644
@@ -21,6 +21,7 @@
 #include <crypto/algapi.h>
 #include <crypto/ghash.h>
 #include <crypto/internal/aead.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
 #include <linux/err.h>
@@ -1055,3 +1056,4 @@ MODULE_ALIAS_CRYPTO("aes-all");
 
 MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
 MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/adiantum.c +2 -0
index ce4d5725342c..84450130cb6b 100644
@@ -32,6 +32,7 @@
 
 #include <crypto/b128ops.h>
 #include <crypto/chacha.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 #include <crypto/internal/poly1305.h>
 #include <crypto/internal/skcipher.h>
@@ -616,3 +617,4 @@ MODULE_DESCRIPTION("Adiantum length-preserving encryption mode");
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Eric Biggers <[email protected]>");
 MODULE_ALIAS_CRYPTO("adiantum");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/ansi_cprng.c +2 -0
index c475c1129ff2..3f512efaba3a 100644
@@ -7,6 +7,7 @@
  *  (C) Neil Horman <[email protected]>
  */
 
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/rng.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -470,3 +471,4 @@ subsys_initcall(prng_mod_init);
 module_exit(prng_mod_fini);
 MODULE_ALIAS_CRYPTO("stdrng");
 MODULE_ALIAS_CRYPTO("ansi_cprng");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/cbc.c +1 -0
index 0d9509dff891..6c03e96b945f 100644
@@ -6,6 +6,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
crypto/ccm.c +2 -0
index 494d70901186..6b815ece51c6 100644
@@ -6,6 +6,7 @@
  */
 
 #include <crypto/internal/aead.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
@@ -954,3 +955,4 @@ MODULE_ALIAS_CRYPTO("ccm_base");
 MODULE_ALIAS_CRYPTO("rfc4309");
 MODULE_ALIAS_CRYPTO("ccm");
 MODULE_ALIAS_CRYPTO("cbcmac");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/cfb.c +2 -0
index 4e5219bbcd19..0d664dfb47bc 100644
@@ -20,6 +20,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -250,3 +251,4 @@ module_exit(crypto_cfb_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("CFB block cipher mode of operation");
 MODULE_ALIAS_CRYPTO("cfb");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/cipher.c +4 -3
index fd78150deb1c..b47141ed4a9f 100644
@@ -9,6 +9,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <linux/kernel.h>
 #include <linux/crypto.h>
 #include <linux/errno.h>
@@ -53,7 +54,7 @@ int crypto_cipher_setkey(struct crypto_cipher *tfm,
 
 	return cia->cia_setkey(crypto_cipher_tfm(tfm), key, keylen);
 }
-EXPORT_SYMBOL_GPL(crypto_cipher_setkey);
+EXPORT_SYMBOL_NS_GPL(crypto_cipher_setkey, CRYPTO_INTERNAL);
 
 static inline void cipher_crypt_one(struct crypto_cipher *tfm,
 				    u8 *dst, const u8 *src, bool enc)
@@ -81,11 +82,11 @@ void crypto_cipher_encrypt_one(struct crypto_cipher *tfm,
 {
 	cipher_crypt_one(tfm, dst, src, true);
 }
-EXPORT_SYMBOL_GPL(crypto_cipher_encrypt_one);
+EXPORT_SYMBOL_NS_GPL(crypto_cipher_encrypt_one, CRYPTO_INTERNAL);
 
 void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
 			       u8 *dst, const u8 *src)
 {
 	cipher_crypt_one(tfm, dst, src, false);
 }
-EXPORT_SYMBOL_GPL(crypto_cipher_decrypt_one);
+EXPORT_SYMBOL_NS_GPL(crypto_cipher_decrypt_one, CRYPTO_INTERNAL);
crypto/cmac.c +2 -0
index df36be1efb81..f4a5d3bfb376 100644
@@ -11,6 +11,7 @@
  *   Author: Kazunori Miyazawa <[email protected]>
  */
 
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
@@ -313,3 +314,4 @@ module_exit(crypto_cmac_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("CMAC keyed hash algorithm");
 MODULE_ALIAS_CRYPTO("cmac");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/ctr.c +2 -0
index c39fcffba27f..23c698b22013 100644
@@ -7,6 +7,7 @@
 
 #include <crypto/algapi.h>
 #include <crypto/ctr.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -358,3 +359,4 @@ MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("CTR block cipher mode of operation");
 MODULE_ALIAS_CRYPTO("rfc3686");
 MODULE_ALIAS_CRYPTO("ctr");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/drbg.c +2 -0
index 3132967a1749..1b4587e0ddad 100644
@@ -98,6 +98,7 @@
  */
 
 #include <crypto/drbg.h>
+#include <crypto/internal/cipher.h>
 #include <linux/kernel.h>
 
 /***************************************************************
@@ -2161,3 +2162,4 @@ MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "
 		   CRYPTO_DRBG_HMAC_STRING
 		   CRYPTO_DRBG_CTR_STRING);
 MODULE_ALIAS_CRYPTO("stdrng");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/ecb.c +1 -0
index 69a687cbdf21..71fbb0543d64 100644
@@ -6,6 +6,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
crypto/essiv.c +2 -0
index d012be23d496..8bcc5bdcb2a9 100644
@@ -30,6 +30,7 @@
 
 #include <crypto/authenc.h>
 #include <crypto/internal/aead.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
@@ -643,3 +644,4 @@ module_exit(essiv_module_exit);
 MODULE_DESCRIPTION("ESSIV skcipher/aead wrapper for block encryption");
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS_CRYPTO("essiv");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/keywrap.c +2 -0
index 0355cce21b1e..3517773bc7f7 100644
@@ -85,6 +85,7 @@
 #include <linux/crypto.h>
 #include <linux/scatterlist.h>
 #include <crypto/scatterwalk.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 
 struct crypto_kw_block {
@@ -316,3 +317,4 @@ MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Stephan Mueller <[email protected]>");
 MODULE_DESCRIPTION("Key Wrapping (RFC3394 / NIST SP800-38F)");
 MODULE_ALIAS_CRYPTO("kw");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/ofb.c +2 -0
index 2ec68e3f2c55..b630fdecceee 100644
@@ -8,6 +8,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -102,3 +103,4 @@ module_exit(crypto_ofb_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("OFB block cipher mode of operation");
 MODULE_ALIAS_CRYPTO("ofb");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/pcbc.c +2 -0
index ae921fb74dc9..7030f59e46b6 100644
@@ -10,6 +10,7 @@
  */
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -191,3 +192,4 @@ module_exit(crypto_pcbc_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("PCBC block cipher mode of operation");
 MODULE_ALIAS_CRYPTO("pcbc");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/skcipher.c +2 -0
index b4dae640de9f..ff16d05644c7 100644
@@ -10,6 +10,7 @@
  */
 
 #include <crypto/internal/aead.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
 #include <linux/bug.h>
@@ -986,3 +987,4 @@ EXPORT_SYMBOL_GPL(skcipher_alloc_instance_simple);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Symmetric key cipher type");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/testmgr.c +3 -0
index 321e38eef51b..a896d77e9611 100644
@@ -33,10 +33,13 @@
 #include <crypto/akcipher.h>
 #include <crypto/kpp.h>
 #include <crypto/acompress.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/simd.h>
 
 #include "internal.h"
 
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
+
 static bool notests;
 module_param(notests, bool, 0644);
 MODULE_PARM_DESC(notests, "disable crypto self-tests");
crypto/vmac.c +2 -0
index 9b565d1040d6..4633b2dda1e0 100644
@@ -36,6 +36,7 @@
 #include <linux/scatterlist.h>
 #include <asm/byteorder.h>
 #include <crypto/scatterwalk.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 
 /*
@@ -693,3 +694,4 @@ module_exit(vmac_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("VMAC hash algorithm");
 MODULE_ALIAS_CRYPTO("vmac64");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/xcbc.c +2 -0
index af3b7eb5d7c7..6074c5c1da49 100644
@@ -6,6 +6,7 @@
  * 	Kazunori Miyazawa <[email protected]>
  */
 
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/hash.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
@@ -272,3 +273,4 @@ module_exit(crypto_xcbc_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("XCBC keyed hash algorithm");
 MODULE_ALIAS_CRYPTO("xcbc");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
crypto/xts.c +2 -0
index ad45b009774b..6c12f30dbdd6 100644
@@ -7,6 +7,7 @@
  * Based on ecb.c
  * Copyright (c) 2006 Herbert Xu <[email protected]>
  */
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
 #include <linux/err.h>
@@ -464,3 +465,4 @@ module_exit(xts_module_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("XTS block cipher mode");
 MODULE_ALIAS_CRYPTO("xts");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
drivers/crypto/geode-aes.c +2 -0
index f4f18bfc2247..4ee010f39912 100644
@@ -10,6 +10,7 @@
 #include <linux/spinlock.h>
 #include <crypto/algapi.h>
 #include <crypto/aes.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 
 #include <linux/io.h>
@@ -434,3 +435,4 @@ module_pci_driver(geode_aes_driver);
 MODULE_AUTHOR("Advanced Micro Devices, Inc.");
 MODULE_DESCRIPTION("Geode LX Hardware AES driver");
 MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
drivers/crypto/inside-secure/safexcel.c +1 -0
index 2e1562108a85..30aedfcfee7c 100644
@@ -1999,3 +1999,4 @@ MODULE_AUTHOR("Ofer Heifetz <[email protected]>");
 MODULE_AUTHOR("Igal Liberman <[email protected]>");
 MODULE_DESCRIPTION("Support for SafeXcel cryptographic engines: EIP97 & EIP197");
 MODULE_LICENSE("GPL v2");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
drivers/crypto/inside-secure/safexcel_hash.c +1 -0
index 50fb6d90a2e0..bc60b5802256 100644
@@ -13,6 +13,7 @@
 #include <crypto/sha3.h>
 #include <crypto/skcipher.h>
 #include <crypto/sm3.h>
+#include <crypto/internal/cipher.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmapool.h>
drivers/crypto/qat/qat_common/adf_ctl_drv.c +1 -0
index eb9b3be9d8eb..96b437bfe3de 100644
@@ -464,3 +464,4 @@ MODULE_AUTHOR("Intel");
 MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");
 MODULE_ALIAS_CRYPTO("intel_qat");
 MODULE_VERSION(ADF_DRV_VERSION);
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
drivers/crypto/qat/qat_common/qat_algs.c +1 -0
index 31c7a206a629..ff78c73c47e3 100644
@@ -4,6 +4,7 @@
 #include <linux/slab.h>
 #include <linux/crypto.h>
 #include <crypto/internal/aead.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/aes.h>
 #include <crypto/sha1.h>
drivers/crypto/vmx/aes.c +1 -0
index 2bc5d4e1adf4..d05c02baebcf 100644
@@ -14,6 +14,7 @@
 #include <asm/simd.h>
 #include <asm/switch_to.h>
 #include <crypto/aes.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/internal/simd.h>
 
 #include "aesp8-ppc.h"
drivers/crypto/vmx/vmx.c +1 -0
index 3e0335fb406c..87a194455d6a 100644
@@ -78,3 +78,4 @@ MODULE_DESCRIPTION("IBM VMX cryptographic acceleration instructions "
 		   "support on Power 8");
 MODULE_LICENSE("GPL");
 MODULE_VERSION("1.0.0");
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);
include/crypto/algapi.h +0 -39
index 18dd7a4aaf7d..86f0748009af 100644
@@ -189,45 +189,6 @@ static inline void *crypto_instance_ctx(struct crypto_instance *inst)
 	return inst->__ctx;
 }
 
-struct crypto_cipher_spawn {
-	struct crypto_spawn base;
-};
-
-static inline int crypto_grab_cipher(struct crypto_cipher_spawn *spawn,
-				     struct crypto_instance *inst,
-				     const char *name, u32 type, u32 mask)
-{
-	type &= ~CRYPTO_ALG_TYPE_MASK;
-	type |= CRYPTO_ALG_TYPE_CIPHER;
-	mask |= CRYPTO_ALG_TYPE_MASK;
-	return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
-}
-
-static inline void crypto_drop_cipher(struct crypto_cipher_spawn *spawn)
-{
-	crypto_drop_spawn(&spawn->base);
-}
-
-static inline struct crypto_alg *crypto_spawn_cipher_alg(
-	struct crypto_cipher_spawn *spawn)
-{
-	return spawn->base.alg;
-}
-
-static inline struct crypto_cipher *crypto_spawn_cipher(
-	struct crypto_cipher_spawn *spawn)
-{
-	u32 type = CRYPTO_ALG_TYPE_CIPHER;
-	u32 mask = CRYPTO_ALG_TYPE_MASK;
-
-	return __crypto_cipher_cast(crypto_spawn_tfm(&spawn->base, type, mask));
-}
-
-static inline struct cipher_alg *crypto_cipher_alg(struct crypto_cipher *tfm)
-{
-	return &crypto_cipher_tfm(tfm)->__crt_alg->cra_cipher;
-}
-
 static inline struct crypto_async_request *crypto_get_backlog(
 	struct crypto_queue *queue)
 {
include/crypto/internal/cipher.h new file +218 -0

218 lines not on this page · raw message

include/crypto/internal/skcipher.h +1 -0
index 10226c12c5df..9dd6c0c17eb8 100644
@@ -9,6 +9,7 @@
 #define _CRYPTO_INTERNAL_SKCIPHER_H
 
 #include <crypto/algapi.h>
+#include <crypto/internal/cipher.h>
 #include <crypto/skcipher.h>
 #include <linux/list.h>
 #include <linux/types.h>
include/linux/crypto.h +0 -163

175 lines not on this page · raw message

Signature · 1 line
2.17.1
Acked-by on v2 2/2
#4 lore raw

Re: [PATCH v2 2/2] crypto: remove cipher routines from public crypto API

Quoted 8 lines · Ard Biesheuvel

The cipher routines in the crypto API are mostly intended for templates implementing skcipher modes generically in software, and shouldn't be used outside of the crypto subsystem. So move the prototypes and all related definitions to a new header file under include/crypto/internal. Also, let's use the new module namespace feature to move the symbol exports into a new namespace CRYPTO_INTERNAL.

maintainer
#5 lore raw
In reply to Ard Biesheuvel
Quoted 49 lines · Ard Biesheuvel

Patch #2 puts the cipher API (which should not be used outside of the crypto API implementation) into an internal header file and module namespace

Patch #1 is a prerequisite for this, to avoid having to make the chelsio driver import the crypto internal namespace.

Changes since v1:
- add missing Kconfig dependency on CRYPT_LIB_AES (#1)
- add missing module namespace import into skcipher.c (#2) - this addresses the kbuild failure report
- add module import to QAT driver, which now contains a valid use of the bare cipher API

Cc Eric Biggers <[email protected]>

Ard Biesheuvel (2):
chcr_ktls: use AES library for single use cipher
crypto: remove cipher routines from public crypto API

 Documentation/crypto/api-skcipher.rst         |   4 +-
 arch/arm/crypto/aes-neonbs-glue.c             |   3 +
 arch/s390/crypto/aes_s390.c                   |   2 +
 crypto/adiantum.c                             |   2 +
 crypto/ansi_cprng.c                           |   2 +
 crypto/cbc.c                                  |   1 +
 crypto/ccm.c                                  |   2 +
 crypto/cfb.c                                  |   2 +
 crypto/cipher.c                               |   7 +-
 crypto/cmac.c                                 |   2 +
 crypto/ctr.c                                  |   2 +
 crypto/drbg.c                                 |   2 +
 crypto/ecb.c                                  |   1 +
 crypto/essiv.c                                |   2 +
 crypto/keywrap.c                              |   2 +
 crypto/ofb.c                                  |   2 +
 crypto/pcbc.c                                 |   2 +
 crypto/skcipher.c                             |   2 +
 crypto/testmgr.c                              |   3 +
 crypto/vmac.c                                 |   2 +
 crypto/xcbc.c                                 |   2 +
 crypto/xts.c                                  |   2 +
 drivers/crypto/geode-aes.c                    |   2 +
 drivers/crypto/inside-secure/safexcel.c       |   1 +
 drivers/crypto/inside-secure/safexcel_hash.c  |   1 +
 drivers/crypto/qat/qat_common/adf_ctl_drv.c   |   1 +
 drivers/crypto/qat/qat_common/qat_algs.c      |   1 +
 drivers/crypto/vmx/aes.c                      |   1 +
 drivers/crypto/vmx/vmx.c                      |   1 +
Quoted 8 lines
 .../ethernet/chelsio/inline_crypto/Kconfig    |   1 +
 .../chelsio/inline_crypto/ch_ktls/chcr_ktls.c |  19 +-
 include/crypto/algapi.h                       |  39 ----
 include/crypto/internal/cipher.h              | 218 ++++++++++++++++++
 include/crypto/internal/skcipher.h            |   1 +
 include/linux/crypto.h                        | 163 -------------
 35 files changed, 281 insertions(+), 219 deletions(-)
 create mode 100644 include/crypto/internal/cipher.h

All applied. Thanks.

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt