aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/inside-secure
diff options
context:
space:
mode:
authorAntoine Tenart <antoine.tenart@bootlin.com>2018-05-14 09:11:03 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2018-05-26 12:12:00 -0400
commit678b2878ac396ff1cceb870b72d1e95721f7a7f2 (patch)
treee6752d0ce0aebb78d5c74b69971f8e0fd9edce32 /drivers/crypto/inside-secure
parentf6beaea304872bb1c76bf6c551386bf896cac8b9 (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.c1
-rw-r--r--drivers/crypto/inside-secure/safexcel.h1
-rw-r--r--drivers/crypto/inside-secure/safexcel_cipher.c50
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;
668extern struct safexcel_alg_template safexcel_alg_hmac_sha1; 668extern struct safexcel_alg_template safexcel_alg_hmac_sha1;
669extern struct safexcel_alg_template safexcel_alg_hmac_sha224; 669extern struct safexcel_alg_template safexcel_alg_hmac_sha224;
670extern struct safexcel_alg_template safexcel_alg_hmac_sha256; 670extern struct safexcel_alg_template safexcel_alg_hmac_sha256;
671extern struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_aes;
671extern struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes; 672extern 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
953static 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
963struct 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};