Support new function in new CCPs
Subsystems (2)
v3 cover Support new function in new CCPs
The following series implements new function in a version 5 coprocessor. New features are:
- Support for SHA-2 384-bit and 512-bit hashing
- Support for 3DES encryption
- Support for AES GCM encryption
Changes from V2:
- Correct a comment in the GCM support code.
- Ensure the patches apply to the current repo
Changes from V1:
- Ensure the patches build correctly
---
Gary R Hook (3):
crypto: ccp - Add SHA-2 384- and 512-bit support
crypto: ccp - Enable 3DES function on v5 CCPs
crypto: ccp - Enable support for AES GCM on v5 CCPs
drivers/crypto/ccp/Makefile | 2 drivers/crypto/ccp/ccp-crypto-aes-galois.c | 252 ++++++++++++++ drivers/crypto/ccp/ccp-crypto-des3.c | 254 ++++++++++++++ drivers/crypto/ccp/ccp-crypto-main.c | 22 + drivers/crypto/ccp/ccp-crypto-sha.c | 22 + drivers/crypto/ccp/ccp-crypto.h | 44 ++ drivers/crypto/ccp/ccp-dev-v3.c | 1 drivers/crypto/ccp/ccp-dev-v5.c | 54 +++ drivers/crypto/ccp/ccp-dev.h | 14 + drivers/crypto/ccp/ccp-ops.c | 522 ++++++++++++++++++++++++++++ include/linux/ccp.h | 68 ++++ 11 files changed, 1249 insertions(+), 6 deletions(-) create mode 100644 drivers/crypto/ccp/ccp-crypto-aes-galois.c create mode 100644 drivers/crypto/ccp/ccp-crypto-des3.c
PATCH v3 1/3 crypto: ccp - Add SHA-2 384- and 512-bit support
Incorporate 384-bit and 512-bit hashing for a version 5 CCP device
--- drivers/crypto/ccp/ccp-crypto-sha.c | 22 +++++++++++ drivers/crypto/ccp/ccp-crypto.h | 8 ++-- drivers/crypto/ccp/ccp-ops.c | 72 +++++++++++++++++++++++++++++++++++ include/linux/ccp.h | 2 + 4 files changed, 101 insertions(+), 3 deletions(-)
drivers/crypto/ccp/ccp-crypto-sha.c +22 -0
@@ -146,6 +146,12 @@ static int ccp_do_sha_update(struct ahash_request *req, unsigned int nbytes,case CCP_SHA_TYPE_256 : rctx->cmd.u.sha.ctx_len =SHA256_DIGEST_SIZE ;break ; +case CCP_SHA_TYPE_384 : + rctx->cmd.u.sha.ctx_len =SHA384_DIGEST_SIZE ; +break ; +case CCP_SHA_TYPE_512 : + rctx->cmd.u.sha.ctx_len =SHA512_DIGEST_SIZE ; +break ;default :/* Should never get here */ break ;
@@ -393,6 +399,22 @@ struct ccp_sha_def { .digest_size = SHA256_DIGEST_SIZE, .block_size = SHA256_BLOCK_SIZE, }, + { + .version = CCP_VERSION(5, 0), + .name = "sha384", + .drv_name = "sha384-ccp", + .type = CCP_SHA_TYPE_384, + .digest_size = SHA384_DIGEST_SIZE, + .block_size = SHA384_BLOCK_SIZE, + }, + { + .version = CCP_VERSION(5, 0), + .name = "sha512", + .drv_name = "sha512-ccp", + .type = CCP_SHA_TYPE_512, + .digest_size = SHA512_DIGEST_SIZE, + .block_size = SHA512_BLOCK_SIZE, + }, }; static int ccp_register_hmac_alg(struct list_head *head,
drivers/crypto/ccp/ccp-crypto.h +5 -3
@@ -137,9 +137,11 @@ struct ccp_aes_cmac_exp_ctx {u8 buf[AES_BLOCK_SIZE ]; }; -/***** SHA related defines *****/ -#define MAX_SHA_CONTEXT_SIZE SHA256_DIGEST_SIZE -#define MAX_SHA_BLOCK_SIZE SHA256_BLOCK_SIZE +/* SHA-related defines +* These values must be large enough to accommodate any variant +*/ +#define MAX_SHA_CONTEXT_SIZE SHA512_DIGEST_SIZE +#define MAX_SHA_BLOCK_SIZE SHA512_BLOCK_SIZEstruct ccp_sha_ctx {struct scatterlist opad_sg;
drivers/crypto/ccp/ccp-ops.c +72 -0
114 lines not on this page · raw message
include/linux/ccp.h +2 -0
@@ -249,6 +249,8 @@ enum ccp_sha_type {CCP_SHA_TYPE_1 =1 ,CCP_SHA_TYPE_224 ,CCP_SHA_TYPE_256 , +CCP_SHA_TYPE_384 , +CCP_SHA_TYPE_512 , CCP_SHA_TYPE__LAST, };
PATCH v3 2/3 crypto: ccp - Enable 3DES function on v5 CCPs
In reply to Gary R HookWire up support for Triple DES in ECB mode.
--- drivers/crypto/ccp/Makefile | 1 drivers/crypto/ccp/ccp-crypto-des3.c | 254 ++++++++++++++++++++++++++++++++++ drivers/crypto/ccp/ccp-crypto-main.c | 10 + drivers/crypto/ccp/ccp-crypto.h | 22 +++ drivers/crypto/ccp/ccp-dev-v3.c | 1 drivers/crypto/ccp/ccp-dev-v5.c | 54 +++++++ drivers/crypto/ccp/ccp-dev.h | 14 ++ drivers/crypto/ccp/ccp-ops.c | 198 +++++++++++++++++++++++++++ include/linux/ccp.h | 57 +++++++- 9 files changed, 608 insertions(+), 3 deletions(-) create mode 100644 drivers/crypto/ccp/ccp-crypto-des3.c
drivers/crypto/ccp/Makefile +1 -0
@@ -12,4 +12,5 @@ ccp-crypto-objs := ccp-crypto-main.o \ ccp-crypto-aes.o \ ccp-crypto-aes-cmac.o \ ccp-crypto-aes-xts.o \ + ccp-crypto-des3.o \ ccp-crypto-sha.o
drivers/crypto/ccp/ccp-crypto-des3.c new file +254 -0
254 lines not on this page · raw message
drivers/crypto/ccp/ccp-crypto-main.c +10 -0
@@ -33,6 +33,10 @@module_param (sha_disable, uint,0444 );MODULE_PARM_DESC (sha_disable,"Disable use of SHA - any non-zero value" ); +static unsigned int des3_disable; +module_param (des3_disable, uint,0444 ); +MODULE_PARM_DESC (des3_disable,"Disable use of 3DES - any non-zero value" ); +/* List heads for the supported algorithms */ static LIST_HEAD (hash_algs);static LIST_HEAD (cipher_algs);
@@ -337,6 +341,12 @@ static int ccp_register_algs(void)return ret; } +if (!des3_disable) { + ret =ccp_register_des3_algs (&cipher_algs); +if (ret) +return ret; + } +if (!sha_disable) { ret =ccp_register_sha_algs (&hash_algs);if (ret)
drivers/crypto/ccp/ccp-crypto.h +22 -0
@@ -23,6 +23,8 @@#include <crypto/hash.h> #include <crypto/sha.h> +#define CCP_LOG_LEVEL KERN_INFO +#define CCP_CRA_PRIORITY 300struct ccp_crypto_ablkcipher_alg {
@@ -137,6 +139,24 @@ struct ccp_aes_cmac_exp_ctx {u8 buf[AES_BLOCK_SIZE ]; }; +/***** 3DES related defines *****/ +struct ccp_des3_ctx { +enum ccp_engine engine; +enum ccp_des3_type type; +enum ccp_des3_mode mode; + +struct scatterlist key_sg; +unsigned int key_len; +u8 key[AES_MAX_KEY_SIZE ]; +}; + +struct ccp_des3_req_ctx { +struct scatterlist iv_sg; +u8 iv[AES_BLOCK_SIZE ]; + +struct ccp_cmd cmd; +}; +/* SHA-related defines * These values must be large enough to accommodate any variant */
@@ -201,6 +221,7 @@ struct ccp_ctx {union {struct ccp_aes_ctx aes;struct ccp_sha_ctx sha; +struct ccp_des3_ctx des3; } u; };
@@ -213,5 +234,6 @@ struct scatterlist *ccp_crypto_sg_table_add(struct sg_table *table,int ccp_register_aes_cmac_algs (struct list_head *head);int ccp_register_aes_xts_algs (struct list_head *head);int ccp_register_sha_algs (struct list_head *head); +int ccp_register_des3_algs (struct list_head *head);#endif
drivers/crypto/ccp/ccp-dev-v3.c +1 -0
@@ -553,6 +553,7 @@ static irqreturn_t ccp_irq_handler(int irq, void *data)static const struct ccp_actions ccp3_actions = { .aes = ccp_perform_aes, .xts_aes = ccp_perform_xts_aes, + .des3 =NULL , .sha = ccp_perform_sha, .rsa = ccp_perform_rsa, .passthru = ccp_perform_passthru,
drivers/crypto/ccp/ccp-dev-v5.c +54 -0
90 lines not on this page · raw message
drivers/crypto/ccp/ccp-dev.h +12 -2
@@ -190,6 +190,9 @@#define CCP_XTS_AES_KEY_SB_COUNT 1#define CCP_XTS_AES_CTX_SB_COUNT 1 +#define CCP_DES3_KEY_SB_COUNT 1 +#define CCP_DES3_CTX_SB_COUNT 1 +#define CCP_SHA_SB_COUNT 1#define CCP_RSA_MAX_WIDTH 4096
@@ -475,6 +478,12 @@ struct ccp_xts_aes_op {enum ccp_xts_aes_unit_size unit_size; }; +struct ccp_des3_op { +enum ccp_des3_type type; +enum ccp_des3_mode mode; +enum ccp_des3_action action; +}; +struct ccp_sha_op {enum ccp_sha_type type;u64 msg_bits;
@@ -512,6 +521,7 @@ struct ccp_op {union {struct ccp_aes_op aes;struct ccp_xts_aes_op xts; +struct ccp_des3_op des3;struct ccp_sha_op sha;struct ccp_rsa_op rsa;struct ccp_passthru_op passthru;
@@ -620,13 +630,13 @@ struct ccp5_desc {struct ccp_actions {int (*aes)(struct ccp_op *);int (*xts_aes)(struct ccp_op *); +int (*des3)(struct ccp_op *);int (*sha)(struct ccp_op *);int (*rsa)(struct ccp_op *);int (*passthru)(struct ccp_op *);int (*ecc)(struct ccp_op *);u32 (*sballoc)(struct ccp_cmd_queue *,unsigned int ); -void (*sbfree)(struct ccp_cmd_queue *,unsigned int , -unsigned int ); +void (*sbfree)(struct ccp_cmd_queue *,unsigned int ,unsigned int );unsigned int (*get_free_slots)(struct ccp_cmd_queue *);int (*init)(struct ccp_device *);void (*destroy)(struct ccp_device *);
drivers/crypto/ccp/ccp-ops.c +198 -0
216 lines not on this page · raw message
include/linux/ccp.h +56 -1
75 lines not on this page · raw message
PATCH v3 3/3 crypto: ccp - Enable support for AES GCM on v5 CCPs
In reply to Gary R HookA version 5 device provides the primitive commands required for AES GCM. This patch adds support for en/decryption.
--- drivers/crypto/ccp/Makefile | 1 drivers/crypto/ccp/ccp-crypto-aes-galois.c | 252 ++++++++++++++++++++++++++++ drivers/crypto/ccp/ccp-crypto-main.c | 12 + drivers/crypto/ccp/ccp-crypto.h | 14 ++ drivers/crypto/ccp/ccp-ops.c | 252 ++++++++++++++++++++++++++++ include/linux/ccp.h | 9 + 6 files changed, 540 insertions(+) create mode 100644 drivers/crypto/ccp/ccp-crypto-aes-galois.c
drivers/crypto/ccp/Makefile +1 -0
@@ -12,5 +12,6 @@ ccp-crypto-objs := ccp-crypto-main.o \ ccp-crypto-aes.o \ ccp-crypto-aes-cmac.o \ ccp-crypto-aes-xts.o \ + ccp-crypto-aes-galois.o \ ccp-crypto-des3.o \ ccp-crypto-sha.o
drivers/crypto/ccp/ccp-crypto-aes-galois.c new file +252 -0
252 lines not on this page · raw message
drivers/crypto/ccp/ccp-crypto-main.c +12 -0
@@ -40,6 +40,7 @@/* List heads for the supported algorithms */ static LIST_HEAD (hash_algs);static LIST_HEAD (cipher_algs); +static LIST_HEAD (aead_algs);/* For any tfm, requests for that tfm must be returned on the order * received. With multiple queues available, the CCP can process more
@@ -339,6 +340,10 @@ static int ccp_register_algs(void) ret =ccp_register_aes_xts_algs (&cipher_algs);if (ret)return ret; + + ret =ccp_register_aes_aeads (&aead_algs); +if (ret) +return ret; }if (!des3_disable) {
@@ -360,6 +365,7 @@ static void ccp_unregister_algs(void) {struct ccp_crypto_ahash_alg *ahash_alg, *ahash_tmp;struct ccp_crypto_ablkcipher_alg *ablk_alg, *ablk_tmp; +struct ccp_crypto_aead *aead_alg, *aead_tmp;list_for_each_entry_safe (ahash_alg, ahash_tmp, &hash_algs, entry) {crypto_unregister_ahash (&ahash_alg->alg);
@@ -372,6 +378,12 @@ static void ccp_unregister_algs(void)list_del (&ablk_alg->entry);kfree (ablk_alg); } + +list_for_each_entry_safe (aead_alg, aead_tmp, &aead_algs, entry) { +crypto_unregister_aead (&aead_alg->alg); +list_del (&aead_alg->entry); +kfree (aead_alg); + } }static int ccp_crypto_init (void )
drivers/crypto/ccp/ccp-crypto.h +14 -0
@@ -19,6 +19,8 @@#include <linux/ccp.h> #include <crypto/algapi.h> #include <crypto/aes.h> +#include <crypto/internal/aead.h> +#include <crypto/aead.h> #include <crypto/ctr.h> #include <crypto/hash.h> #include <crypto/sha.h>
@@ -35,6 +37,14 @@ struct ccp_crypto_ablkcipher_alg {struct crypto_alg alg; }; +struct ccp_crypto_aead { +struct list_head entry; + +u32 mode; + +struct aead_alg alg; +}; +struct ccp_crypto_ahash_alg {struct list_head entry;
@@ -97,6 +107,9 @@ struct ccp_aes_req_ctx {struct scatterlist iv_sg;u8 iv[AES_BLOCK_SIZE ]; +struct scatterlist tag_sg; +u8 tag[AES_BLOCK_SIZE ]; +/* Fields used for RFC3686 requests */ u8 *rfc3686_info;u8 rfc3686_iv[AES_BLOCK_SIZE ];
@@ -233,6 +246,7 @@ struct scatterlist *ccp_crypto_sg_table_add(struct sg_table *table,int ccp_register_aes_algs (struct list_head *head);int ccp_register_aes_cmac_algs (struct list_head *head);int ccp_register_aes_xts_algs (struct list_head *head); +int ccp_register_aes_aeads (struct list_head *head);int ccp_register_sha_algs (struct list_head *head);int ccp_register_des3_algs (struct list_head *head);
drivers/crypto/ccp/ccp-ops.c +252 -0
264 lines not on this page · raw message
include/linux/ccp.h +9 -0
@@ -123,6 +123,10 @@ enum ccp_aes_mode {CCP_AES_MODE_CFB ,CCP_AES_MODE_CTR ,CCP_AES_MODE_CMAC , +CCP_AES_MODE_GHASH , +CCP_AES_MODE_GCTR , +CCP_AES_MODE_GCM , +CCP_AES_MODE_GMAC , CCP_AES_MODE__LAST, };
@@ -137,6 +141,9 @@ enum ccp_aes_action {CCP_AES_ACTION_ENCRYPT , CCP_AES_ACTION__LAST, }; +/* Overloaded field */ +#define CCP_AES_GHASHAAD CCP_AES_ACTION_DECRYPT +#define CCP_AES_GHASHFINAL CCP_AES_ACTION_ENCRYPT/** * struct ccp_aes_engine - CCP AES operation
@@ -181,6 +188,8 @@ struct ccp_aes_engine {struct scatterlist *cmac_key;/* K1/K2 cmac key required for * final cmac cmd */ u32 cmac_key_len;/* In bytes */ + +u32 aad_len;/* In bytes */ };/***** XTS-AES engine *****/
Herbert Xu
maintainerQuoted 9 lines · Gary R Hook
The following series implements new function in a version 5 coprocessor. New features are:
- Support for SHA-2 384-bit and 512-bit hashing
- Support for 3DES encryption
- Support for AES GCM encryptionChanges from V2:
- Correct a comment in the GCM support code.
- Ensure the patches apply to the current repo
All patches 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