diff options
| author | Antoine Tenart <antoine.tenart@bootlin.com> | 2018-05-14 09:11:03 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-26 12:12:00 -0400 |
| commit | 678b2878ac396ff1cceb870b72d1e95721f7a7f2 (patch) | |
| tree | e6752d0ce0aebb78d5c74b69971f8e0fd9edce32 /drivers/crypto/inside-secure | |
| parent | f6beaea304872bb1c76bf6c551386bf896cac8b9 (diff) | |
crypto: inside-secure - authenc(hmac(sha224), cbc(aes)) support
This patch adds the authenc(hmac(sha224),cbc(aes)) AEAD algorithm
support to the Inside Secure SafeXcel driver.
Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/inside-secure')
| -rw-r--r-- | drivers/crypto/inside-secure/safexcel.c | 1 | ||||
| -rw-r--r-- | drivers/crypto/inside-secure/safexcel.h | 1 | ||||
| -rw-r--r-- | drivers/crypto/inside-secure/safexcel_cipher.c | 50 |
3 files changed, 50 insertions, 2 deletions
diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c index 8c963ef0953a..0f061c3757e9 100644 --- a/drivers/crypto/inside-secure/safexcel.c +++ b/drivers/crypto/inside-secure/safexcel.c | |||
| @@ -793,6 +793,7 @@ static struct safexcel_alg_template *safexcel_algs[] = { | |||
| 793 | &safexcel_alg_hmac_sha1, | 793 | &safexcel_alg_hmac_sha1, |
| 794 | &safexcel_alg_hmac_sha224, | 794 | &safexcel_alg_hmac_sha224, |
| 795 | &safexcel_alg_hmac_sha256, | 795 | &safexcel_alg_hmac_sha256, |
| 796 | &safexcel_alg_authenc_hmac_sha224_cbc_aes, | ||
| 796 | &safexcel_alg_authenc_hmac_sha256_cbc_aes, | 797 | &safexcel_alg_authenc_hmac_sha256_cbc_aes, |
| 797 | }; | 798 | }; |
| 798 | 799 | ||
diff --git a/drivers/crypto/inside-secure/safexcel.h b/drivers/crypto/inside-secure/safexcel.h index ae113c14caea..c2e953f60447 100644 --- a/drivers/crypto/inside-secure/safexcel.h +++ b/drivers/crypto/inside-secure/safexcel.h | |||
| @@ -668,6 +668,7 @@ extern struct safexcel_alg_template safexcel_alg_sha256; | |||
| 668 | extern struct safexcel_alg_template safexcel_alg_hmac_sha1; | 668 | extern struct safexcel_alg_template safexcel_alg_hmac_sha1; |
| 669 | extern struct safexcel_alg_template safexcel_alg_hmac_sha224; | 669 | extern struct safexcel_alg_template safexcel_alg_hmac_sha224; |
| 670 | extern struct safexcel_alg_template safexcel_alg_hmac_sha256; | 670 | extern struct safexcel_alg_template safexcel_alg_hmac_sha256; |
| 671 | extern struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_aes; | ||
| 671 | extern struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes; | 672 | extern struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes; |
| 672 | 673 | ||
| 673 | #endif | 674 | #endif |
diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c index 51ab448f664e..9250fb205cf2 100644 --- a/drivers/crypto/inside-secure/safexcel_cipher.c +++ b/drivers/crypto/inside-secure/safexcel_cipher.c | |||
| @@ -184,9 +184,21 @@ static int safexcel_aead_aes_setkey(struct crypto_aead *ctfm, const u8 *key, | |||
| 184 | ctx->base.needs_inv = true; | 184 | ctx->base.needs_inv = true; |
| 185 | 185 | ||
| 186 | /* Auth key */ | 186 | /* Auth key */ |
| 187 | if (safexcel_hmac_setkey("safexcel-sha256", keys.authkey, | 187 | switch (ctx->alg) { |
| 188 | keys.authkeylen, &istate, &ostate)) | 188 | case CONTEXT_CONTROL_CRYPTO_ALG_SHA224: |
| 189 | if (safexcel_hmac_setkey("safexcel-sha224", keys.authkey, | ||
| 190 | keys.authkeylen, &istate, &ostate)) | ||
| 191 | goto badkey; | ||
| 192 | break; | ||
| 193 | case CONTEXT_CONTROL_CRYPTO_ALG_SHA256: | ||
| 194 | if (safexcel_hmac_setkey("safexcel-sha256", keys.authkey, | ||
| 195 | keys.authkeylen, &istate, &ostate)) | ||
| 196 | goto badkey; | ||
| 197 | break; | ||
| 198 | default: | ||
| 199 | dev_err(priv->dev, "aead: unsupported hash algorithm\n"); | ||
| 189 | goto badkey; | 200 | goto badkey; |
| 201 | } | ||
| 190 | 202 | ||
| 191 | crypto_aead_set_flags(ctfm, crypto_aead_get_flags(ctfm) & | 203 | crypto_aead_set_flags(ctfm, crypto_aead_get_flags(ctfm) & |
| 192 | CRYPTO_TFM_RES_MASK); | 204 | CRYPTO_TFM_RES_MASK); |
| @@ -937,3 +949,37 @@ struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes = { | |||
| 937 | }, | 949 | }, |
| 938 | }, | 950 | }, |
| 939 | }; | 951 | }; |
| 952 | |||
| 953 | static int safexcel_aead_sha224_cra_init(struct crypto_tfm *tfm) | ||
| 954 | { | ||
| 955 | struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 956 | |||
| 957 | safexcel_aead_cra_init(tfm); | ||
| 958 | ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA224; | ||
| 959 | ctx->state_sz = SHA256_DIGEST_SIZE; | ||
| 960 | return 0; | ||
| 961 | } | ||
| 962 | |||
| 963 | struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_aes = { | ||
| 964 | .type = SAFEXCEL_ALG_TYPE_AEAD, | ||
| 965 | .alg.aead = { | ||
| 966 | .setkey = safexcel_aead_aes_setkey, | ||
| 967 | .encrypt = safexcel_aead_encrypt, | ||
| 968 | .decrypt = safexcel_aead_decrypt, | ||
| 969 | .ivsize = AES_BLOCK_SIZE, | ||
| 970 | .maxauthsize = SHA224_DIGEST_SIZE, | ||
| 971 | .base = { | ||
| 972 | .cra_name = "authenc(hmac(sha224),cbc(aes))", | ||
| 973 | .cra_driver_name = "safexcel-authenc-hmac-sha224-cbc-aes", | ||
| 974 | .cra_priority = 300, | ||
| 975 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC | | ||
| 976 | CRYPTO_ALG_KERN_DRIVER_ONLY, | ||
| 977 | .cra_blocksize = AES_BLOCK_SIZE, | ||
| 978 | .cra_ctxsize = sizeof(struct safexcel_cipher_ctx), | ||
| 979 | .cra_alignmask = 0, | ||
| 980 | .cra_init = safexcel_aead_sha224_cra_init, | ||
| 981 | .cra_exit = safexcel_aead_cra_exit, | ||
| 982 | .cra_module = THIS_MODULE, | ||
| 983 | }, | ||
| 984 | }, | ||
| 985 | }; | ||
