Path: blob/master/drivers/crypto/inside-secure/eip93/eip93-hash.c
26285 views
// SPDX-License-Identifier: GPL-2.01/*2* Copyright (C) 20243*4* Christian Marangi <[email protected]5*/67#include <crypto/sha1.h>8#include <crypto/sha2.h>9#include <crypto/md5.h>10#include <crypto/hmac.h>11#include <linux/dma-mapping.h>12#include <linux/delay.h>1314#include "eip93-cipher.h"15#include "eip93-hash.h"16#include "eip93-main.h"17#include "eip93-common.h"18#include "eip93-regs.h"1920static void eip93_hash_free_data_blocks(struct ahash_request *req)21{22struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);23struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);24struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);25struct eip93_device *eip93 = ctx->eip93;26struct mkt_hash_block *block, *tmp;2728list_for_each_entry_safe(block, tmp, &rctx->blocks, list) {29dma_unmap_single(eip93->dev, block->data_dma,30SHA256_BLOCK_SIZE, DMA_TO_DEVICE);31kfree(block);32}33if (!list_empty(&rctx->blocks))34INIT_LIST_HEAD(&rctx->blocks);3536if (rctx->finalize)37dma_unmap_single(eip93->dev, rctx->data_dma,38rctx->data_used,39DMA_TO_DEVICE);40}4142static void eip93_hash_free_sa_record(struct ahash_request *req)43{44struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);45struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);46struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);47struct eip93_device *eip93 = ctx->eip93;4849if (IS_HMAC(ctx->flags))50dma_unmap_single(eip93->dev, rctx->sa_record_hmac_base,51sizeof(rctx->sa_record_hmac), DMA_TO_DEVICE);5253dma_unmap_single(eip93->dev, rctx->sa_record_base,54sizeof(rctx->sa_record), DMA_TO_DEVICE);55}5657void eip93_hash_handle_result(struct crypto_async_request *async, int err)58{59struct ahash_request *req = ahash_request_cast(async);60struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);61struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);62struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);63int digestsize = crypto_ahash_digestsize(ahash);64struct sa_state *sa_state = &rctx->sa_state;65struct eip93_device *eip93 = ctx->eip93;66int i;6768dma_unmap_single(eip93->dev, rctx->sa_state_base,69sizeof(*sa_state), DMA_FROM_DEVICE);7071/*72* With partial_hash assume SHA256_DIGEST_SIZE buffer is passed.73* This is to handle SHA224 that have a 32 byte intermediate digest.74*/75if (rctx->partial_hash)76digestsize = SHA256_DIGEST_SIZE;7778if (rctx->finalize || rctx->partial_hash) {79/* bytes needs to be swapped for req->result */80if (!IS_HASH_MD5(ctx->flags)) {81for (i = 0; i < digestsize / sizeof(u32); i++) {82u32 *digest = (u32 *)sa_state->state_i_digest;8384digest[i] = be32_to_cpu((__be32 __force)digest[i]);85}86}8788memcpy(req->result, sa_state->state_i_digest, digestsize);89}9091eip93_hash_free_sa_record(req);92eip93_hash_free_data_blocks(req);9394ahash_request_complete(req, err);95}9697static void eip93_hash_init_sa_state_digest(u32 hash, u8 *digest)98{99static const u32 sha256_init[] = {100SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,101SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7102};103static const u32 sha224_init[] = {104SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,105SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7106};107static const u32 sha1_init[] = {108SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4109};110static const u32 md5_init[] = {111MD5_H0, MD5_H1, MD5_H2, MD5_H3112};113114/* Init HASH constant */115switch (hash) {116case EIP93_HASH_SHA256:117memcpy(digest, sha256_init, sizeof(sha256_init));118return;119case EIP93_HASH_SHA224:120memcpy(digest, sha224_init, sizeof(sha224_init));121return;122case EIP93_HASH_SHA1:123memcpy(digest, sha1_init, sizeof(sha1_init));124return;125case EIP93_HASH_MD5:126memcpy(digest, md5_init, sizeof(md5_init));127return;128default: /* Impossible */129return;130}131}132133static void eip93_hash_export_sa_state(struct ahash_request *req,134struct eip93_hash_export_state *state)135{136struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);137struct sa_state *sa_state = &rctx->sa_state;138139/*140* EIP93 have special handling for state_byte_cnt in sa_state.141* Even if a zero packet is passed (and a BADMSG is returned),142* state_byte_cnt is incremented to the digest handled (with the hash143* primitive). This is problematic with export/import as EIP93144* expect 0 state_byte_cnt for the very first iteration.145*/146if (!rctx->len)147memset(state->state_len, 0, sizeof(u32) * 2);148else149memcpy(state->state_len, sa_state->state_byte_cnt,150sizeof(u32) * 2);151memcpy(state->state_hash, sa_state->state_i_digest,152SHA256_DIGEST_SIZE);153state->len = rctx->len;154state->data_used = rctx->data_used;155}156157static void __eip93_hash_init(struct ahash_request *req)158{159struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);160struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);161struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);162struct sa_record *sa_record = &rctx->sa_record;163int digestsize;164165digestsize = crypto_ahash_digestsize(ahash);166167eip93_set_sa_record(sa_record, 0, ctx->flags);168sa_record->sa_cmd0_word |= EIP93_SA_CMD_HASH_FROM_STATE;169sa_record->sa_cmd0_word |= EIP93_SA_CMD_SAVE_HASH;170sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_OPCODE;171sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_OPCODE,172EIP93_SA_CMD_OPCODE_BASIC_OUT_HASH);173sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_DIGEST_LENGTH;174sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_DIGEST_LENGTH,175digestsize / sizeof(u32));176177/*178* HMAC special handling179* Enabling CMD_HMAC force the inner hash to be always finalized.180* This cause problems on handling message > 64 byte as we181* need to produce intermediate inner hash on sending intermediate182* 64 bytes blocks.183*184* To handle this, enable CMD_HMAC only on the last block.185* We make a duplicate of sa_record and on the last descriptor,186* we pass a dedicated sa_record with CMD_HMAC enabled to make187* EIP93 apply the outer hash.188*/189if (IS_HMAC(ctx->flags)) {190struct sa_record *sa_record_hmac = &rctx->sa_record_hmac;191192memcpy(sa_record_hmac, sa_record, sizeof(*sa_record));193/* Copy pre-hashed opad for HMAC */194memcpy(sa_record_hmac->sa_o_digest, ctx->opad, SHA256_DIGEST_SIZE);195196/* Disable HMAC for hash normal sa_record */197sa_record->sa_cmd1_word &= ~EIP93_SA_CMD_HMAC;198}199200rctx->len = 0;201rctx->data_used = 0;202rctx->partial_hash = false;203rctx->finalize = false;204INIT_LIST_HEAD(&rctx->blocks);205}206207static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data,208dma_addr_t *data_dma, u32 len, bool last)209{210struct ahash_request *req = ahash_request_cast(async);211struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);212struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);213struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);214struct eip93_device *eip93 = ctx->eip93;215struct eip93_descriptor cdesc = { };216dma_addr_t src_addr;217int ret;218219/* Map block data to DMA */220src_addr = dma_map_single(eip93->dev, data, len, DMA_TO_DEVICE);221ret = dma_mapping_error(eip93->dev, src_addr);222if (ret)223return ret;224225cdesc.pe_ctrl_stat_word = FIELD_PREP(EIP93_PE_CTRL_PE_READY_DES_TRING_OWN,226EIP93_PE_CTRL_HOST_READY);227cdesc.sa_addr = rctx->sa_record_base;228cdesc.arc4_addr = 0;229230cdesc.state_addr = rctx->sa_state_base;231cdesc.src_addr = src_addr;232cdesc.pe_length_word = FIELD_PREP(EIP93_PE_LENGTH_HOST_PE_READY,233EIP93_PE_LENGTH_HOST_READY);234cdesc.pe_length_word |= FIELD_PREP(EIP93_PE_LENGTH_LENGTH,235len);236237cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_HASH);238239if (last) {240int crypto_async_idr;241242if (rctx->finalize && !rctx->partial_hash) {243/* For last block, pass sa_record with CMD_HMAC enabled */244if (IS_HMAC(ctx->flags)) {245struct sa_record *sa_record_hmac = &rctx->sa_record_hmac;246247rctx->sa_record_hmac_base = dma_map_single(eip93->dev,248sa_record_hmac,249sizeof(*sa_record_hmac),250DMA_TO_DEVICE);251ret = dma_mapping_error(eip93->dev, rctx->sa_record_hmac_base);252if (ret)253return ret;254255cdesc.sa_addr = rctx->sa_record_hmac_base;256}257258cdesc.pe_ctrl_stat_word |= EIP93_PE_CTRL_PE_HASH_FINAL;259}260261scoped_guard(spinlock_bh, &eip93->ring->idr_lock)262crypto_async_idr = idr_alloc(&eip93->ring->crypto_async_idr, async, 0,263EIP93_RING_NUM - 1, GFP_ATOMIC);264265cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, (u16)crypto_async_idr) |266FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_LAST);267}268269again:270scoped_guard(spinlock_irqsave, &eip93->ring->write_lock)271ret = eip93_put_descriptor(eip93, &cdesc);272if (ret) {273usleep_range(EIP93_RING_BUSY_DELAY,274EIP93_RING_BUSY_DELAY * 2);275goto again;276}277278/* Writing new descriptor count starts DMA action */279writel(1, eip93->base + EIP93_REG_PE_CD_COUNT);280281*data_dma = src_addr;282return 0;283}284285static int eip93_hash_init(struct ahash_request *req)286{287struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);288struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);289struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);290struct sa_state *sa_state = &rctx->sa_state;291292memset(sa_state->state_byte_cnt, 0, sizeof(u32) * 2);293eip93_hash_init_sa_state_digest(ctx->flags & EIP93_HASH_MASK,294sa_state->state_i_digest);295296__eip93_hash_init(req);297298/* For HMAC setup the initial block for ipad */299if (IS_HMAC(ctx->flags)) {300memcpy(rctx->data, ctx->ipad, SHA256_BLOCK_SIZE);301302rctx->data_used = SHA256_BLOCK_SIZE;303rctx->len += SHA256_BLOCK_SIZE;304}305306return 0;307}308309/*310* With complete_req true, we wait for the engine to consume all the block in list,311* else we just queue the block to the engine as final() will wait. This is useful312* for finup().313*/314static int __eip93_hash_update(struct ahash_request *req, bool complete_req)315{316struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);317struct crypto_async_request *async = &req->base;318unsigned int read, to_consume = req->nbytes;319unsigned int max_read, consumed = 0;320struct mkt_hash_block *block;321bool wait_req = false;322int offset;323int ret;324325/* Get the offset and available space to fill req data */326offset = rctx->data_used;327max_read = SHA256_BLOCK_SIZE - offset;328329/* Consume req in block of SHA256_BLOCK_SIZE.330* to_read is initially set to space available in the req data331* and then reset to SHA256_BLOCK_SIZE.332*/333while (to_consume > max_read) {334block = kzalloc(sizeof(*block), GFP_ATOMIC);335if (!block) {336ret = -ENOMEM;337goto free_blocks;338}339340read = sg_pcopy_to_buffer(req->src, sg_nents(req->src),341block->data + offset,342max_read, consumed);343344/*345* For first iteration only, copy req data to block346* and reset offset and max_read for next iteration.347*/348if (offset > 0) {349memcpy(block->data, rctx->data, offset);350offset = 0;351max_read = SHA256_BLOCK_SIZE;352}353354list_add(&block->list, &rctx->blocks);355to_consume -= read;356consumed += read;357}358359/* Write the remaining data to req data */360read = sg_pcopy_to_buffer(req->src, sg_nents(req->src),361rctx->data + offset, to_consume,362consumed);363rctx->data_used = offset + read;364365/* Update counter with processed bytes */366rctx->len += read + consumed;367368/* Consume all the block added to list */369list_for_each_entry_reverse(block, &rctx->blocks, list) {370wait_req = complete_req &&371list_is_first(&block->list, &rctx->blocks);372373ret = eip93_send_hash_req(async, block->data,374&block->data_dma,375SHA256_BLOCK_SIZE, wait_req);376if (ret)377goto free_blocks;378}379380return wait_req ? -EINPROGRESS : 0;381382free_blocks:383eip93_hash_free_data_blocks(req);384385return ret;386}387388static int eip93_hash_update(struct ahash_request *req)389{390struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);391struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);392struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);393struct sa_record *sa_record = &rctx->sa_record;394struct sa_state *sa_state = &rctx->sa_state;395struct eip93_device *eip93 = ctx->eip93;396int ret;397398if (!req->nbytes)399return 0;400401rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,402sizeof(*sa_state),403DMA_TO_DEVICE);404ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);405if (ret)406return ret;407408rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,409sizeof(*sa_record),410DMA_TO_DEVICE);411ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);412if (ret)413goto free_sa_state;414415ret = __eip93_hash_update(req, true);416if (ret && ret != -EINPROGRESS)417goto free_sa_record;418419return ret;420421free_sa_record:422dma_unmap_single(eip93->dev, rctx->sa_record_base,423sizeof(*sa_record), DMA_TO_DEVICE);424425free_sa_state:426dma_unmap_single(eip93->dev, rctx->sa_state_base,427sizeof(*sa_state), DMA_TO_DEVICE);428429return ret;430}431432/*433* With map_data true, we map the sa_record and sa_state. This is needed434* for finup() as the they are mapped before calling update()435*/436static int __eip93_hash_final(struct ahash_request *req, bool map_dma)437{438struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);439struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);440struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);441struct crypto_async_request *async = &req->base;442struct sa_record *sa_record = &rctx->sa_record;443struct sa_state *sa_state = &rctx->sa_state;444struct eip93_device *eip93 = ctx->eip93;445int ret;446447/* EIP93 can't handle zero bytes hash */448if (!rctx->len && !IS_HMAC(ctx->flags)) {449switch ((ctx->flags & EIP93_HASH_MASK)) {450case EIP93_HASH_SHA256:451memcpy(req->result, sha256_zero_message_hash,452SHA256_DIGEST_SIZE);453break;454case EIP93_HASH_SHA224:455memcpy(req->result, sha224_zero_message_hash,456SHA224_DIGEST_SIZE);457break;458case EIP93_HASH_SHA1:459memcpy(req->result, sha1_zero_message_hash,460SHA1_DIGEST_SIZE);461break;462case EIP93_HASH_MD5:463memcpy(req->result, md5_zero_message_hash,464MD5_DIGEST_SIZE);465break;466default: /* Impossible */467return -EINVAL;468}469470return 0;471}472473/* Signal interrupt from engine is for last block */474rctx->finalize = true;475476if (map_dma) {477rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,478sizeof(*sa_state),479DMA_TO_DEVICE);480ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);481if (ret)482return ret;483484rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,485sizeof(*sa_record),486DMA_TO_DEVICE);487ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);488if (ret)489goto free_sa_state;490}491492/* Send last block */493ret = eip93_send_hash_req(async, rctx->data, &rctx->data_dma,494rctx->data_used, true);495if (ret)496goto free_blocks;497498return -EINPROGRESS;499500free_blocks:501eip93_hash_free_data_blocks(req);502503dma_unmap_single(eip93->dev, rctx->sa_record_base,504sizeof(*sa_record), DMA_TO_DEVICE);505506free_sa_state:507dma_unmap_single(eip93->dev, rctx->sa_state_base,508sizeof(*sa_state), DMA_TO_DEVICE);509510return ret;511}512513static int eip93_hash_final(struct ahash_request *req)514{515return __eip93_hash_final(req, true);516}517518static int eip93_hash_finup(struct ahash_request *req)519{520struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);521struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);522struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);523struct sa_record *sa_record = &rctx->sa_record;524struct sa_state *sa_state = &rctx->sa_state;525struct eip93_device *eip93 = ctx->eip93;526int ret;527528if (rctx->len + req->nbytes || IS_HMAC(ctx->flags)) {529rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,530sizeof(*sa_state),531DMA_TO_DEVICE);532ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);533if (ret)534return ret;535536rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,537sizeof(*sa_record),538DMA_TO_DEVICE);539ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);540if (ret)541goto free_sa_state;542543ret = __eip93_hash_update(req, false);544if (ret)545goto free_sa_record;546}547548return __eip93_hash_final(req, false);549550free_sa_record:551dma_unmap_single(eip93->dev, rctx->sa_record_base,552sizeof(*sa_record), DMA_TO_DEVICE);553free_sa_state:554dma_unmap_single(eip93->dev, rctx->sa_state_base,555sizeof(*sa_state), DMA_TO_DEVICE);556557return ret;558}559560static int eip93_hash_hmac_setkey(struct crypto_ahash *ahash, const u8 *key,561u32 keylen)562{563unsigned int digestsize = crypto_ahash_digestsize(ahash);564struct crypto_tfm *tfm = crypto_ahash_tfm(ahash);565struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm);566567return eip93_hmac_setkey(ctx->flags, key, keylen, digestsize,568ctx->ipad, ctx->opad, true);569}570571static int eip93_hash_cra_init(struct crypto_tfm *tfm)572{573struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm);574struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,575struct eip93_alg_template, alg.ahash.halg.base);576577crypto_ahash_set_reqsize_dma(__crypto_ahash_cast(tfm),578sizeof(struct eip93_hash_reqctx));579580ctx->eip93 = tmpl->eip93;581ctx->flags = tmpl->flags;582583return 0;584}585586static int eip93_hash_digest(struct ahash_request *req)587{588int ret;589590ret = eip93_hash_init(req);591if (ret)592return ret;593594return eip93_hash_finup(req);595}596597static int eip93_hash_import(struct ahash_request *req, const void *in)598{599struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);600const struct eip93_hash_export_state *state = in;601struct sa_state *sa_state = &rctx->sa_state;602603memcpy(sa_state->state_byte_cnt, state->state_len, sizeof(u32) * 2);604memcpy(sa_state->state_i_digest, state->state_hash, SHA256_DIGEST_SIZE);605606__eip93_hash_init(req);607608rctx->len = state->len;609rctx->data_used = state->data_used;610611/* Skip copying data if we have nothing to copy */612if (rctx->len)613memcpy(rctx->data, state->data, rctx->data_used);614615return 0;616}617618static int eip93_hash_export(struct ahash_request *req, void *out)619{620struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);621struct eip93_hash_export_state *state = out;622623/* Save the first block in state data */624if (rctx->len)625memcpy(state->data, rctx->data, rctx->data_used);626627eip93_hash_export_sa_state(req, state);628629return 0;630}631632struct eip93_alg_template eip93_alg_md5 = {633.type = EIP93_ALG_TYPE_HASH,634.flags = EIP93_HASH_MD5,635.alg.ahash = {636.init = eip93_hash_init,637.update = eip93_hash_update,638.final = eip93_hash_final,639.finup = eip93_hash_finup,640.digest = eip93_hash_digest,641.export = eip93_hash_export,642.import = eip93_hash_import,643.halg = {644.digestsize = MD5_DIGEST_SIZE,645.statesize = sizeof(struct eip93_hash_export_state),646.base = {647.cra_name = "md5",648.cra_driver_name = "md5-eip93",649.cra_priority = 300,650.cra_flags = CRYPTO_ALG_ASYNC |651CRYPTO_ALG_KERN_DRIVER_ONLY |652CRYPTO_ALG_ALLOCATES_MEMORY,653.cra_blocksize = MD5_HMAC_BLOCK_SIZE,654.cra_ctxsize = sizeof(struct eip93_hash_ctx),655.cra_init = eip93_hash_cra_init,656.cra_module = THIS_MODULE,657},658},659},660};661662struct eip93_alg_template eip93_alg_sha1 = {663.type = EIP93_ALG_TYPE_HASH,664.flags = EIP93_HASH_SHA1,665.alg.ahash = {666.init = eip93_hash_init,667.update = eip93_hash_update,668.final = eip93_hash_final,669.finup = eip93_hash_finup,670.digest = eip93_hash_digest,671.export = eip93_hash_export,672.import = eip93_hash_import,673.halg = {674.digestsize = SHA1_DIGEST_SIZE,675.statesize = sizeof(struct eip93_hash_export_state),676.base = {677.cra_name = "sha1",678.cra_driver_name = "sha1-eip93",679.cra_priority = 300,680.cra_flags = CRYPTO_ALG_ASYNC |681CRYPTO_ALG_KERN_DRIVER_ONLY |682CRYPTO_ALG_ALLOCATES_MEMORY,683.cra_blocksize = SHA1_BLOCK_SIZE,684.cra_ctxsize = sizeof(struct eip93_hash_ctx),685.cra_init = eip93_hash_cra_init,686.cra_module = THIS_MODULE,687},688},689},690};691692struct eip93_alg_template eip93_alg_sha224 = {693.type = EIP93_ALG_TYPE_HASH,694.flags = EIP93_HASH_SHA224,695.alg.ahash = {696.init = eip93_hash_init,697.update = eip93_hash_update,698.final = eip93_hash_final,699.finup = eip93_hash_finup,700.digest = eip93_hash_digest,701.export = eip93_hash_export,702.import = eip93_hash_import,703.halg = {704.digestsize = SHA224_DIGEST_SIZE,705.statesize = sizeof(struct eip93_hash_export_state),706.base = {707.cra_name = "sha224",708.cra_driver_name = "sha224-eip93",709.cra_priority = 300,710.cra_flags = CRYPTO_ALG_ASYNC |711CRYPTO_ALG_KERN_DRIVER_ONLY |712CRYPTO_ALG_ALLOCATES_MEMORY,713.cra_blocksize = SHA224_BLOCK_SIZE,714.cra_ctxsize = sizeof(struct eip93_hash_ctx),715.cra_init = eip93_hash_cra_init,716.cra_module = THIS_MODULE,717},718},719},720};721722struct eip93_alg_template eip93_alg_sha256 = {723.type = EIP93_ALG_TYPE_HASH,724.flags = EIP93_HASH_SHA256,725.alg.ahash = {726.init = eip93_hash_init,727.update = eip93_hash_update,728.final = eip93_hash_final,729.finup = eip93_hash_finup,730.digest = eip93_hash_digest,731.export = eip93_hash_export,732.import = eip93_hash_import,733.halg = {734.digestsize = SHA256_DIGEST_SIZE,735.statesize = sizeof(struct eip93_hash_export_state),736.base = {737.cra_name = "sha256",738.cra_driver_name = "sha256-eip93",739.cra_priority = 300,740.cra_flags = CRYPTO_ALG_ASYNC |741CRYPTO_ALG_KERN_DRIVER_ONLY |742CRYPTO_ALG_ALLOCATES_MEMORY,743.cra_blocksize = SHA256_BLOCK_SIZE,744.cra_ctxsize = sizeof(struct eip93_hash_ctx),745.cra_init = eip93_hash_cra_init,746.cra_module = THIS_MODULE,747},748},749},750};751752struct eip93_alg_template eip93_alg_hmac_md5 = {753.type = EIP93_ALG_TYPE_HASH,754.flags = EIP93_HASH_HMAC | EIP93_HASH_MD5,755.alg.ahash = {756.init = eip93_hash_init,757.update = eip93_hash_update,758.final = eip93_hash_final,759.finup = eip93_hash_finup,760.digest = eip93_hash_digest,761.setkey = eip93_hash_hmac_setkey,762.export = eip93_hash_export,763.import = eip93_hash_import,764.halg = {765.digestsize = MD5_DIGEST_SIZE,766.statesize = sizeof(struct eip93_hash_export_state),767.base = {768.cra_name = "hmac(md5)",769.cra_driver_name = "hmac(md5-eip93)",770.cra_priority = 300,771.cra_flags = CRYPTO_ALG_ASYNC |772CRYPTO_ALG_KERN_DRIVER_ONLY |773CRYPTO_ALG_ALLOCATES_MEMORY,774.cra_blocksize = MD5_HMAC_BLOCK_SIZE,775.cra_ctxsize = sizeof(struct eip93_hash_ctx),776.cra_init = eip93_hash_cra_init,777.cra_module = THIS_MODULE,778},779},780},781};782783struct eip93_alg_template eip93_alg_hmac_sha1 = {784.type = EIP93_ALG_TYPE_HASH,785.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA1,786.alg.ahash = {787.init = eip93_hash_init,788.update = eip93_hash_update,789.final = eip93_hash_final,790.finup = eip93_hash_finup,791.digest = eip93_hash_digest,792.setkey = eip93_hash_hmac_setkey,793.export = eip93_hash_export,794.import = eip93_hash_import,795.halg = {796.digestsize = SHA1_DIGEST_SIZE,797.statesize = sizeof(struct eip93_hash_export_state),798.base = {799.cra_name = "hmac(sha1)",800.cra_driver_name = "hmac(sha1-eip93)",801.cra_priority = 300,802.cra_flags = CRYPTO_ALG_ASYNC |803CRYPTO_ALG_KERN_DRIVER_ONLY |804CRYPTO_ALG_ALLOCATES_MEMORY,805.cra_blocksize = SHA1_BLOCK_SIZE,806.cra_ctxsize = sizeof(struct eip93_hash_ctx),807.cra_init = eip93_hash_cra_init,808.cra_module = THIS_MODULE,809},810},811},812};813814struct eip93_alg_template eip93_alg_hmac_sha224 = {815.type = EIP93_ALG_TYPE_HASH,816.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA224,817.alg.ahash = {818.init = eip93_hash_init,819.update = eip93_hash_update,820.final = eip93_hash_final,821.finup = eip93_hash_finup,822.digest = eip93_hash_digest,823.setkey = eip93_hash_hmac_setkey,824.export = eip93_hash_export,825.import = eip93_hash_import,826.halg = {827.digestsize = SHA224_DIGEST_SIZE,828.statesize = sizeof(struct eip93_hash_export_state),829.base = {830.cra_name = "hmac(sha224)",831.cra_driver_name = "hmac(sha224-eip93)",832.cra_priority = 300,833.cra_flags = CRYPTO_ALG_ASYNC |834CRYPTO_ALG_KERN_DRIVER_ONLY |835CRYPTO_ALG_ALLOCATES_MEMORY,836.cra_blocksize = SHA224_BLOCK_SIZE,837.cra_ctxsize = sizeof(struct eip93_hash_ctx),838.cra_init = eip93_hash_cra_init,839.cra_module = THIS_MODULE,840},841},842},843};844845struct eip93_alg_template eip93_alg_hmac_sha256 = {846.type = EIP93_ALG_TYPE_HASH,847.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA256,848.alg.ahash = {849.init = eip93_hash_init,850.update = eip93_hash_update,851.final = eip93_hash_final,852.finup = eip93_hash_finup,853.digest = eip93_hash_digest,854.setkey = eip93_hash_hmac_setkey,855.export = eip93_hash_export,856.import = eip93_hash_import,857.halg = {858.digestsize = SHA256_DIGEST_SIZE,859.statesize = sizeof(struct eip93_hash_export_state),860.base = {861.cra_name = "hmac(sha256)",862.cra_driver_name = "hmac(sha256-eip93)",863.cra_priority = 300,864.cra_flags = CRYPTO_ALG_ASYNC |865CRYPTO_ALG_KERN_DRIVER_ONLY |866CRYPTO_ALG_ALLOCATES_MEMORY,867.cra_blocksize = SHA256_BLOCK_SIZE,868.cra_ctxsize = sizeof(struct eip93_hash_ctx),869.cra_init = eip93_hash_cra_init,870.cra_module = THIS_MODULE,871},872},873},874};875876877