crypto: talitos - fix ahash algorithms registration
Provide hardware state import/export functionality, as mandated by
commit 8996eafdcb
("crypto: ahash - ensure statesize is non-zero")
Cc: <stable@vger.kernel.org> # 4.3+
Reported-by: Jonas Eymann <J.Eymann@gmx.net>
Signed-off-by: Horia Geant? <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
b3c2fee5d6
commit
3639ca840d
|
@ -827,6 +827,16 @@ struct talitos_ahash_req_ctx {
|
|||
struct scatterlist *psrc;
|
||||
};
|
||||
|
||||
struct talitos_export_state {
|
||||
u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
|
||||
u8 buf[HASH_MAX_BLOCK_SIZE];
|
||||
unsigned int swinit;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
unsigned int to_hash_later;
|
||||
unsigned int nbuf;
|
||||
};
|
||||
|
||||
static int aead_setkey(struct crypto_aead *authenc,
|
||||
const u8 *key, unsigned int keylen)
|
||||
{
|
||||
|
@ -1967,6 +1977,46 @@ static int ahash_digest(struct ahash_request *areq)
|
|||
return ahash_process_req(areq, areq->nbytes);
|
||||
}
|
||||
|
||||
static int ahash_export(struct ahash_request *areq, void *out)
|
||||
{
|
||||
struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
|
||||
struct talitos_export_state *export = out;
|
||||
|
||||
memcpy(export->hw_context, req_ctx->hw_context,
|
||||
req_ctx->hw_context_size);
|
||||
memcpy(export->buf, req_ctx->buf, req_ctx->nbuf);
|
||||
export->swinit = req_ctx->swinit;
|
||||
export->first = req_ctx->first;
|
||||
export->last = req_ctx->last;
|
||||
export->to_hash_later = req_ctx->to_hash_later;
|
||||
export->nbuf = req_ctx->nbuf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ahash_import(struct ahash_request *areq, const void *in)
|
||||
{
|
||||
struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
|
||||
const struct talitos_export_state *export = in;
|
||||
|
||||
memset(req_ctx, 0, sizeof(*req_ctx));
|
||||
req_ctx->hw_context_size =
|
||||
(crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
|
||||
? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
|
||||
: TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
|
||||
memcpy(req_ctx->hw_context, export->hw_context,
|
||||
req_ctx->hw_context_size);
|
||||
memcpy(req_ctx->buf, export->buf, export->nbuf);
|
||||
req_ctx->swinit = export->swinit;
|
||||
req_ctx->first = export->first;
|
||||
req_ctx->last = export->last;
|
||||
req_ctx->to_hash_later = export->to_hash_later;
|
||||
req_ctx->nbuf = export->nbuf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct keyhash_result {
|
||||
struct completion completion;
|
||||
int err;
|
||||
|
@ -2444,6 +2494,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = MD5_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "md5",
|
||||
.cra_driver_name = "md5-talitos",
|
||||
|
@ -2459,6 +2510,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA1_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "sha1",
|
||||
.cra_driver_name = "sha1-talitos",
|
||||
|
@ -2474,6 +2526,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA224_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "sha224",
|
||||
.cra_driver_name = "sha224-talitos",
|
||||
|
@ -2489,6 +2542,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA256_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "sha256",
|
||||
.cra_driver_name = "sha256-talitos",
|
||||
|
@ -2504,6 +2558,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA384_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "sha384",
|
||||
.cra_driver_name = "sha384-talitos",
|
||||
|
@ -2519,6 +2574,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA512_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "sha512",
|
||||
.cra_driver_name = "sha512-talitos",
|
||||
|
@ -2534,6 +2590,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = MD5_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(md5)",
|
||||
.cra_driver_name = "hmac-md5-talitos",
|
||||
|
@ -2549,6 +2606,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA1_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(sha1)",
|
||||
.cra_driver_name = "hmac-sha1-talitos",
|
||||
|
@ -2564,6 +2622,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA224_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(sha224)",
|
||||
.cra_driver_name = "hmac-sha224-talitos",
|
||||
|
@ -2579,6 +2638,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA256_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(sha256)",
|
||||
.cra_driver_name = "hmac-sha256-talitos",
|
||||
|
@ -2594,6 +2654,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA384_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(sha384)",
|
||||
.cra_driver_name = "hmac-sha384-talitos",
|
||||
|
@ -2609,6 +2670,7 @@ static struct talitos_alg_template driver_algs[] = {
|
|||
{ .type = CRYPTO_ALG_TYPE_AHASH,
|
||||
.alg.hash = {
|
||||
.halg.digestsize = SHA512_DIGEST_SIZE,
|
||||
.halg.statesize = sizeof(struct talitos_export_state),
|
||||
.halg.base = {
|
||||
.cra_name = "hmac(sha512)",
|
||||
.cra_driver_name = "hmac-sha512-talitos",
|
||||
|
@ -2787,6 +2849,8 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
|
|||
t_alg->algt.alg.hash.finup = ahash_finup;
|
||||
t_alg->algt.alg.hash.digest = ahash_digest;
|
||||
t_alg->algt.alg.hash.setkey = ahash_setkey;
|
||||
t_alg->algt.alg.hash.import = ahash_import;
|
||||
t_alg->algt.alg.hash.export = ahash_export;
|
||||
|
||||
if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
|
||||
!strncmp(alg->cra_name, "hmac", 4)) {
|
||||
|
|
Loading…
Reference in New Issue