Commit a0aae821 authored by Christian Lamparter's avatar Christian Lamparter Committed by Herbert Xu

crypto: crypto4xx - prepare for AEAD support

This patch enhances existing interfaces and
functions to support AEAD ciphers in the next
patches.
Signed-off-by: default avatarChristian Lamparter <chunkeey@gmail.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 2f77690d
...@@ -315,6 +315,10 @@ config CRYPTO_DEV_PPC4XX ...@@ -315,6 +315,10 @@ config CRYPTO_DEV_PPC4XX
tristate "Driver AMCC PPC4xx crypto accelerator" tristate "Driver AMCC PPC4xx crypto accelerator"
depends on PPC && 4xx depends on PPC && 4xx
select CRYPTO_HASH select CRYPTO_HASH
select CRYPTO_AEAD
select CRYPTO_AES
select CRYPTO_CCM
select CRYPTO_GCM
select CRYPTO_BLKCIPHER select CRYPTO_BLKCIPHER
help help
This option allows you to have support for AMCC crypto acceleration. This option allows you to have support for AMCC crypto acceleration.
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <crypto/internal/hash.h> #include <crypto/internal/hash.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <crypto/algapi.h> #include <crypto/algapi.h>
#include <crypto/aead.h>
#include <crypto/aes.h> #include <crypto/aes.h>
#include <crypto/sha.h> #include <crypto/sha.h>
#include <crypto/ctr.h> #include <crypto/ctr.h>
...@@ -83,7 +84,7 @@ int crypto4xx_encrypt(struct ablkcipher_request *req) ...@@ -83,7 +84,7 @@ int crypto4xx_encrypt(struct ablkcipher_request *req)
crypto4xx_memcpy_to_le32(iv, req->info, ivlen); crypto4xx_memcpy_to_le32(iv, req->info, ivlen);
return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst, return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
req->nbytes, iv, ivlen, ctx->sa_out, ctx->sa_len); req->nbytes, iv, ivlen, ctx->sa_out, ctx->sa_len, 0);
} }
int crypto4xx_decrypt(struct ablkcipher_request *req) int crypto4xx_decrypt(struct ablkcipher_request *req)
...@@ -97,7 +98,7 @@ int crypto4xx_decrypt(struct ablkcipher_request *req) ...@@ -97,7 +98,7 @@ int crypto4xx_decrypt(struct ablkcipher_request *req)
crypto4xx_memcpy_to_le32(iv, req->info, ivlen); crypto4xx_memcpy_to_le32(iv, req->info, ivlen);
return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst, return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
req->nbytes, iv, ivlen, ctx->sa_in, ctx->sa_len); req->nbytes, iv, ivlen, ctx->sa_in, ctx->sa_len, 0);
} }
/** /**
...@@ -213,7 +214,7 @@ int crypto4xx_rfc3686_encrypt(struct ablkcipher_request *req) ...@@ -213,7 +214,7 @@ int crypto4xx_rfc3686_encrypt(struct ablkcipher_request *req)
return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst, return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
req->nbytes, iv, AES_IV_SIZE, req->nbytes, iv, AES_IV_SIZE,
ctx->sa_out, ctx->sa_len); ctx->sa_out, ctx->sa_len, 0);
} }
int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req) int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req)
...@@ -227,7 +228,7 @@ int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req) ...@@ -227,7 +228,7 @@ int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req)
return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst, return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
req->nbytes, iv, AES_IV_SIZE, req->nbytes, iv, AES_IV_SIZE,
ctx->sa_out, ctx->sa_len); ctx->sa_out, ctx->sa_len, 0);
} }
/** /**
...@@ -239,11 +240,13 @@ static int crypto4xx_hash_alg_init(struct crypto_tfm *tfm, ...@@ -239,11 +240,13 @@ static int crypto4xx_hash_alg_init(struct crypto_tfm *tfm,
unsigned char hm) unsigned char hm)
{ {
struct crypto_alg *alg = tfm->__crt_alg; struct crypto_alg *alg = tfm->__crt_alg;
struct crypto4xx_alg *my_alg = crypto_alg_to_crypto4xx_alg(alg); struct crypto4xx_alg *my_alg;
struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm); struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm);
struct dynamic_sa_hash160 *sa; struct dynamic_sa_hash160 *sa;
int rc; int rc;
my_alg = container_of(__crypto_ahash_alg(alg), struct crypto4xx_alg,
alg.u.hash);
ctx->dev = my_alg->dev; ctx->dev = my_alg->dev;
/* Create SA */ /* Create SA */
...@@ -300,7 +303,7 @@ int crypto4xx_hash_update(struct ahash_request *req) ...@@ -300,7 +303,7 @@ int crypto4xx_hash_update(struct ahash_request *req)
return crypto4xx_build_pd(&req->base, ctx, req->src, &dst, return crypto4xx_build_pd(&req->base, ctx, req->src, &dst,
req->nbytes, NULL, 0, ctx->sa_in, req->nbytes, NULL, 0, ctx->sa_in,
ctx->sa_len); ctx->sa_len, 0);
} }
int crypto4xx_hash_final(struct ahash_request *req) int crypto4xx_hash_final(struct ahash_request *req)
...@@ -319,7 +322,7 @@ int crypto4xx_hash_digest(struct ahash_request *req) ...@@ -319,7 +322,7 @@ int crypto4xx_hash_digest(struct ahash_request *req)
return crypto4xx_build_pd(&req->base, ctx, req->src, &dst, return crypto4xx_build_pd(&req->base, ctx, req->src, &dst,
req->nbytes, NULL, 0, ctx->sa_in, req->nbytes, NULL, 0, ctx->sa_in,
ctx->sa_len); ctx->sa_len, 0);
} }
/** /**
...@@ -330,5 +333,3 @@ int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm) ...@@ -330,5 +333,3 @@ int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm)
return crypto4xx_hash_alg_init(tfm, SA_HASH160_LEN, SA_HASH_ALG_SHA1, return crypto4xx_hash_alg_init(tfm, SA_HASH160_LEN, SA_HASH_ALG_SHA1,
SA_HASH_MODE_HASH); SA_HASH_MODE_HASH);
} }
This diff is collapsed.
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
#ifndef __CRYPTO4XX_CORE_H__ #ifndef __CRYPTO4XX_CORE_H__
#define __CRYPTO4XX_CORE_H__ #define __CRYPTO4XX_CORE_H__
#include <linux/ratelimit.h>
#include <crypto/internal/hash.h> #include <crypto/internal/hash.h>
#include <crypto/internal/aead.h>
#include "crypto4xx_reg_def.h" #include "crypto4xx_reg_def.h"
#include "crypto4xx_sa.h" #include "crypto4xx_sa.h"
...@@ -106,6 +108,7 @@ struct crypto4xx_device { ...@@ -106,6 +108,7 @@ struct crypto4xx_device {
struct pd_uinfo *pdr_uinfo; struct pd_uinfo *pdr_uinfo;
struct list_head alg_list; /* List of algorithm supported struct list_head alg_list; /* List of algorithm supported
by this device */ by this device */
struct ratelimit_state aead_ratelimit;
}; };
struct crypto4xx_core_device { struct crypto4xx_core_device {
...@@ -125,6 +128,9 @@ struct crypto4xx_ctx { ...@@ -125,6 +128,9 @@ struct crypto4xx_ctx {
struct dynamic_sa_ctl *sa_out; struct dynamic_sa_ctl *sa_out;
__le32 iv_nonce; __le32 iv_nonce;
u32 sa_len; u32 sa_len;
union {
struct crypto_aead *aead;
} sw_cipher;
}; };
struct crypto4xx_alg_common { struct crypto4xx_alg_common {
...@@ -132,6 +138,7 @@ struct crypto4xx_alg_common { ...@@ -132,6 +138,7 @@ struct crypto4xx_alg_common {
union { union {
struct crypto_alg cipher; struct crypto_alg cipher;
struct ahash_alg hash; struct ahash_alg hash;
struct aead_alg aead;
} u; } u;
}; };
...@@ -141,18 +148,6 @@ struct crypto4xx_alg { ...@@ -141,18 +148,6 @@ struct crypto4xx_alg {
struct crypto4xx_device *dev; struct crypto4xx_device *dev;
}; };
static inline struct crypto4xx_alg *crypto_alg_to_crypto4xx_alg(
struct crypto_alg *x)
{
switch (x->cra_flags & CRYPTO_ALG_TYPE_MASK) {
case CRYPTO_ALG_TYPE_AHASH:
return container_of(__crypto_ahash_alg(x),
struct crypto4xx_alg, alg.u.hash);
}
return container_of(x, struct crypto4xx_alg, alg.u.cipher);
}
int crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size); int crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size);
void crypto4xx_free_sa(struct crypto4xx_ctx *ctx); void crypto4xx_free_sa(struct crypto4xx_ctx *ctx);
void crypto4xx_free_ctx(struct crypto4xx_ctx *ctx); void crypto4xx_free_ctx(struct crypto4xx_ctx *ctx);
...@@ -163,7 +158,8 @@ int crypto4xx_build_pd(struct crypto_async_request *req, ...@@ -163,7 +158,8 @@ int crypto4xx_build_pd(struct crypto_async_request *req,
const unsigned int datalen, const unsigned int datalen,
const __le32 *iv, const u32 iv_len, const __le32 *iv, const u32 iv_len,
const struct dynamic_sa_ctl *sa, const struct dynamic_sa_ctl *sa,
const unsigned int sa_len); const unsigned int sa_len,
const unsigned int assoclen);
int crypto4xx_setkey_aes_cbc(struct crypto_ablkcipher *cipher, int crypto4xx_setkey_aes_cbc(struct crypto_ablkcipher *cipher,
const u8 *key, unsigned int keylen); const u8 *key, unsigned int keylen);
int crypto4xx_setkey_aes_cfb(struct crypto_ablkcipher *cipher, int crypto4xx_setkey_aes_cfb(struct crypto_ablkcipher *cipher,
......
...@@ -55,6 +55,8 @@ union dynamic_sa_contents { ...@@ -55,6 +55,8 @@ union dynamic_sa_contents {
#define SA_OP_GROUP_BASIC 0 #define SA_OP_GROUP_BASIC 0
#define SA_OPCODE_ENCRYPT 0 #define SA_OPCODE_ENCRYPT 0
#define SA_OPCODE_DECRYPT 0 #define SA_OPCODE_DECRYPT 0
#define SA_OPCODE_ENCRYPT_HASH 1
#define SA_OPCODE_HASH_DECRYPT 1
#define SA_OPCODE_HASH 3 #define SA_OPCODE_HASH 3
#define SA_CIPHER_ALG_DES 0 #define SA_CIPHER_ALG_DES 0
#define SA_CIPHER_ALG_3DES 1 #define SA_CIPHER_ALG_3DES 1
...@@ -65,6 +67,8 @@ union dynamic_sa_contents { ...@@ -65,6 +67,8 @@ union dynamic_sa_contents {
#define SA_HASH_ALG_MD5 0 #define SA_HASH_ALG_MD5 0
#define SA_HASH_ALG_SHA1 1 #define SA_HASH_ALG_SHA1 1
#define SA_HASH_ALG_GHASH 12
#define SA_HASH_ALG_CBC_MAC 14
#define SA_HASH_ALG_NULL 15 #define SA_HASH_ALG_NULL 15
#define SA_HASH_ALG_SHA1_DIGEST_SIZE 20 #define SA_HASH_ALG_SHA1_DIGEST_SIZE 20
...@@ -233,6 +237,36 @@ struct dynamic_sa_aes256 { ...@@ -233,6 +237,36 @@ struct dynamic_sa_aes256 {
#define SA_AES256_CONTENTS 0x3e000082 #define SA_AES256_CONTENTS 0x3e000082
#define SA_AES_CONTENTS 0x3e000002 #define SA_AES_CONTENTS 0x3e000002
/**
* Security Association (SA) for AES128 CCM
*/
struct dynamic_sa_aes128_ccm {
struct dynamic_sa_ctl ctrl;
__le32 key[4];
__le32 iv[4];
u32 state_ptr;
u32 reserved;
} __packed;
#define SA_AES128_CCM_LEN (sizeof(struct dynamic_sa_aes128_ccm)/4)
#define SA_AES128_CCM_CONTENTS 0x3e000042
#define SA_AES_CCM_CONTENTS 0x3e000002
/**
* Security Association (SA) for AES128_GCM
*/
struct dynamic_sa_aes128_gcm {
struct dynamic_sa_ctl ctrl;
__le32 key[4];
__le32 inner_digest[4];
__le32 iv[4];
u32 state_ptr;
u32 reserved;
} __packed;
#define SA_AES128_GCM_LEN (sizeof(struct dynamic_sa_aes128_gcm)/4)
#define SA_AES128_GCM_CONTENTS 0x3e000442
#define SA_AES_GCM_CONTENTS 0x3e000402
/** /**
* Security Association (SA) for HASH160: HMAC-SHA1 * Security Association (SA) for HASH160: HMAC-SHA1
*/ */
...@@ -274,4 +308,11 @@ static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts) ...@@ -274,4 +308,11 @@ static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl)); return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
} }
static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
{
return (__le32 *) ((unsigned long)cts +
sizeof(struct dynamic_sa_ctl) +
cts->sa_contents.bf.key_size * 4);
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment