Commit 2debd332 authored by Harsh Jain's avatar Harsh Jain Committed by Herbert Xu

crypto: chcr - Add AEAD algos.

Add support for following AEAD algos.
 GCM,CCM,RFC4106,RFC4309,authenc(hmac(shaXXX),cbc(aes)).
Reviewed-by: default avatarStephan Mueller <smueller@chronox.de>
Signed-off-by: default avatarHarsh Jain <harsh@chelsio.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 5c86a8ff
...@@ -4,6 +4,7 @@ config CRYPTO_DEV_CHELSIO ...@@ -4,6 +4,7 @@ config CRYPTO_DEV_CHELSIO
select CRYPTO_SHA1 select CRYPTO_SHA1
select CRYPTO_SHA256 select CRYPTO_SHA256
select CRYPTO_SHA512 select CRYPTO_SHA512
select CRYPTO_AUTHENC
---help--- ---help---
The Chelsio Crypto Co-processor driver for T6 adapters. The Chelsio Crypto Co-processor driver for T6 adapters.
......
This diff is collapsed.
...@@ -258,13 +258,15 @@ enum { ...@@ -258,13 +258,15 @@ enum {
* where they indicate the size of the integrity check value (ICV) * where they indicate the size of the integrity check value (ICV)
*/ */
enum { enum {
AES_CCM_ICV_4 = 4, ICV_4 = 4,
AES_CCM_ICV_6 = 6, ICV_6 = 6,
AES_CCM_ICV_8 = 8, ICV_8 = 8,
AES_CCM_ICV_10 = 10, ICV_10 = 10,
AES_CCM_ICV_12 = 12, ICV_12 = 12,
AES_CCM_ICV_14 = 14, ICV_13 = 13,
AES_CCM_ICV_16 = 16 ICV_14 = 14,
ICV_15 = 15,
ICV_16 = 16
}; };
struct hash_op_params { struct hash_op_params {
......
...@@ -109,14 +109,12 @@ static int cpl_fw6_pld_handler(struct chcr_dev *dev, ...@@ -109,14 +109,12 @@ static int cpl_fw6_pld_handler(struct chcr_dev *dev,
if (ack_err_status) { if (ack_err_status) {
if (CHK_MAC_ERR_BIT(ack_err_status) || if (CHK_MAC_ERR_BIT(ack_err_status) ||
CHK_PAD_ERR_BIT(ack_err_status)) CHK_PAD_ERR_BIT(ack_err_status))
error_status = -EINVAL; error_status = -EBADMSG;
} }
/* call completion callback with failure status */ /* call completion callback with failure status */
if (req) { if (req) {
if (!chcr_handle_resp(req, input, error_status)) error_status = chcr_handle_resp(req, input, error_status);
req->complete(req, error_status); req->complete(req, error_status);
else
return -EINVAL;
} else { } else {
pr_err("Incorrect request address from the firmware\n"); pr_err("Incorrect request address from the firmware\n");
return -EFAULT; return -EFAULT;
......
...@@ -72,9 +72,7 @@ struct chcr_wr { ...@@ -72,9 +72,7 @@ struct chcr_wr {
}; };
struct chcr_dev { struct chcr_dev {
/* Request submited to h/w and waiting for response. */
spinlock_t lock_chcr_dev; spinlock_t lock_chcr_dev;
struct crypto_queue pending_queue;
struct uld_ctx *u_ctx; struct uld_ctx *u_ctx;
unsigned char tx_channel_id; unsigned char tx_channel_id;
}; };
......
...@@ -36,6 +36,14 @@ ...@@ -36,6 +36,14 @@
#ifndef __CHCR_CRYPTO_H__ #ifndef __CHCR_CRYPTO_H__
#define __CHCR_CRYPTO_H__ #define __CHCR_CRYPTO_H__
#define GHASH_BLOCK_SIZE 16
#define GHASH_DIGEST_SIZE 16
#define CCM_B0_SIZE 16
#define CCM_AAD_FIELD_SIZE 2
#define T5_MAX_AAD_SIZE 512
/* Define following if h/w is not dropping the AAD and IV data before /* Define following if h/w is not dropping the AAD and IV data before
* giving the processed data * giving the processed data
*/ */
...@@ -63,22 +71,36 @@ ...@@ -63,22 +71,36 @@
#define CHCR_SCMD_AUTH_CTRL_AUTH_CIPHER 0 #define CHCR_SCMD_AUTH_CTRL_AUTH_CIPHER 0
#define CHCR_SCMD_AUTH_CTRL_CIPHER_AUTH 1 #define CHCR_SCMD_AUTH_CTRL_CIPHER_AUTH 1
#define CHCR_SCMD_CIPHER_MODE_NOP 0 #define CHCR_SCMD_CIPHER_MODE_NOP 0
#define CHCR_SCMD_CIPHER_MODE_AES_CBC 1 #define CHCR_SCMD_CIPHER_MODE_AES_CBC 1
#define CHCR_SCMD_CIPHER_MODE_GENERIC_AES 4 #define CHCR_SCMD_CIPHER_MODE_AES_GCM 2
#define CHCR_SCMD_CIPHER_MODE_AES_XTS 6 #define CHCR_SCMD_CIPHER_MODE_AES_CTR 3
#define CHCR_SCMD_CIPHER_MODE_GENERIC_AES 4
#define CHCR_SCMD_CIPHER_MODE_AES_XTS 6
#define CHCR_SCMD_CIPHER_MODE_AES_CCM 7
#define CHCR_SCMD_AUTH_MODE_NOP 0 #define CHCR_SCMD_AUTH_MODE_NOP 0
#define CHCR_SCMD_AUTH_MODE_SHA1 1 #define CHCR_SCMD_AUTH_MODE_SHA1 1
#define CHCR_SCMD_AUTH_MODE_SHA224 2 #define CHCR_SCMD_AUTH_MODE_SHA224 2
#define CHCR_SCMD_AUTH_MODE_SHA256 3 #define CHCR_SCMD_AUTH_MODE_SHA256 3
#define CHCR_SCMD_AUTH_MODE_GHASH 4
#define CHCR_SCMD_AUTH_MODE_SHA512_224 5 #define CHCR_SCMD_AUTH_MODE_SHA512_224 5
#define CHCR_SCMD_AUTH_MODE_SHA512_256 6 #define CHCR_SCMD_AUTH_MODE_SHA512_256 6
#define CHCR_SCMD_AUTH_MODE_SHA512_384 7 #define CHCR_SCMD_AUTH_MODE_SHA512_384 7
#define CHCR_SCMD_AUTH_MODE_SHA512_512 8 #define CHCR_SCMD_AUTH_MODE_SHA512_512 8
#define CHCR_SCMD_AUTH_MODE_CBCMAC 9
#define CHCR_SCMD_AUTH_MODE_CMAC 10
#define CHCR_SCMD_HMAC_CTRL_NOP 0 #define CHCR_SCMD_HMAC_CTRL_NOP 0
#define CHCR_SCMD_HMAC_CTRL_NO_TRUNC 1 #define CHCR_SCMD_HMAC_CTRL_NO_TRUNC 1
#define CHCR_SCMD_HMAC_CTRL_TRUNC_RFC4366 2
#define CHCR_SCMD_HMAC_CTRL_IPSEC_96BIT 3
#define CHCR_SCMD_HMAC_CTRL_PL1 4
#define CHCR_SCMD_HMAC_CTRL_PL2 5
#define CHCR_SCMD_HMAC_CTRL_PL3 6
#define CHCR_SCMD_HMAC_CTRL_DIV2 7
#define VERIFY_HW 0
#define VERIFY_SW 1
#define CHCR_SCMD_IVGEN_CTRL_HW 0 #define CHCR_SCMD_IVGEN_CTRL_HW 0
#define CHCR_SCMD_IVGEN_CTRL_SW 1 #define CHCR_SCMD_IVGEN_CTRL_SW 1
...@@ -106,12 +128,20 @@ ...@@ -106,12 +128,20 @@
#define IV_IMMEDIATE 1 #define IV_IMMEDIATE 1
#define IV_DSGL 2 #define IV_DSGL 2
#define AEAD_H_SIZE 16
#define CRYPTO_ALG_SUB_TYPE_MASK 0x0f000000 #define CRYPTO_ALG_SUB_TYPE_MASK 0x0f000000
#define CRYPTO_ALG_SUB_TYPE_HASH_HMAC 0x01000000 #define CRYPTO_ALG_SUB_TYPE_HASH_HMAC 0x01000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 0x02000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_GCM 0x03000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_AUTHENC 0x04000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_CCM 0x05000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309 0x06000000
#define CRYPTO_ALG_SUB_TYPE_AEAD_NULL 0x07000000
#define CRYPTO_ALG_SUB_TYPE_CTR 0x08000000
#define CRYPTO_ALG_TYPE_HMAC (CRYPTO_ALG_TYPE_AHASH |\ #define CRYPTO_ALG_TYPE_HMAC (CRYPTO_ALG_TYPE_AHASH |\
CRYPTO_ALG_SUB_TYPE_HASH_HMAC) CRYPTO_ALG_SUB_TYPE_HASH_HMAC)
#define MAX_SALT 4
#define MAX_SCRATCH_PAD_SIZE 32 #define MAX_SCRATCH_PAD_SIZE 32
#define CHCR_HASH_MAX_BLOCK_SIZE_64 64 #define CHCR_HASH_MAX_BLOCK_SIZE_64 64
...@@ -126,6 +156,42 @@ struct ablk_ctx { ...@@ -126,6 +156,42 @@ struct ablk_ctx {
unsigned char ciph_mode; unsigned char ciph_mode;
u8 rrkey[AES_MAX_KEY_SIZE]; u8 rrkey[AES_MAX_KEY_SIZE];
}; };
struct chcr_aead_reqctx {
struct sk_buff *skb;
short int dst_nents;
u16 verify;
u8 iv[CHCR_MAX_CRYPTO_IV_LEN];
unsigned char scratch_pad[MAX_SCRATCH_PAD_SIZE];
};
struct chcr_gcm_ctx {
u8 ghash_h[AEAD_H_SIZE];
};
struct chcr_authenc_ctx {
u8 dec_rrkey[AES_MAX_KEY_SIZE];
u8 h_iopad[2 * CHCR_HASH_MAX_DIGEST_SIZE];
unsigned char auth_mode;
};
struct __aead_ctx {
struct chcr_gcm_ctx gcm[0];
struct chcr_authenc_ctx authenc[0];
};
struct chcr_aead_ctx {
__be32 key_ctx_hdr;
unsigned int enckey_len;
struct crypto_skcipher *null;
u8 salt[MAX_SALT];
u8 key[CHCR_AES_MAX_KEY_LEN];
u16 hmac_ctrl;
u16 mayverify;
struct __aead_ctx ctx[0];
};
struct hmac_ctx { struct hmac_ctx {
...@@ -137,6 +203,7 @@ struct hmac_ctx { ...@@ -137,6 +203,7 @@ struct hmac_ctx {
struct __crypto_ctx { struct __crypto_ctx {
struct hmac_ctx hmacctx[0]; struct hmac_ctx hmacctx[0];
struct ablk_ctx ablkctx[0]; struct ablk_ctx ablkctx[0];
struct chcr_aead_ctx aeadctx[0];
}; };
struct chcr_context { struct chcr_context {
...@@ -171,16 +238,19 @@ struct chcr_alg_template { ...@@ -171,16 +238,19 @@ struct chcr_alg_template {
union { union {
struct crypto_alg crypto; struct crypto_alg crypto;
struct ahash_alg hash; struct ahash_alg hash;
struct aead_alg aead;
} alg; } alg;
}; };
struct chcr_req_ctx { struct chcr_req_ctx {
union { union {
struct ahash_request *ahash_req; struct ahash_request *ahash_req;
struct aead_request *aead_req;
struct ablkcipher_request *ablk_req; struct ablkcipher_request *ablk_req;
} req; } req;
union { union {
struct chcr_ahash_req_ctx *ahash_ctx; struct chcr_ahash_req_ctx *ahash_ctx;
struct chcr_aead_reqctx *reqctx;
struct chcr_blkcipher_req_ctx *ablk_ctx; struct chcr_blkcipher_req_ctx *ablk_ctx;
} ctx; } ctx;
}; };
...@@ -190,9 +260,15 @@ struct sge_opaque_hdr { ...@@ -190,9 +260,15 @@ struct sge_opaque_hdr {
dma_addr_t addr[MAX_SKB_FRAGS + 1]; dma_addr_t addr[MAX_SKB_FRAGS + 1];
}; };
typedef struct sk_buff *(*create_wr_t)(struct crypto_async_request *req, typedef struct sk_buff *(*create_wr_t)(struct aead_request *req,
struct chcr_context *ctx,
unsigned short qid, unsigned short qid,
int size,
unsigned short op_type); unsigned short op_type);
static int chcr_aead_op(struct aead_request *req_base,
unsigned short op_type,
int size,
create_wr_t create_wr_fn);
static inline int get_aead_subtype(struct crypto_aead *aead);
#endif /* __CHCR_CRYPTO_H__ */ #endif /* __CHCR_CRYPTO_H__ */
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