19739f5f9SChristian Marangi // SPDX-License-Identifier: GPL-2.0 29739f5f9SChristian Marangi /* 39739f5f9SChristian Marangi * Copyright (C) 2024 49739f5f9SChristian Marangi * 59739f5f9SChristian Marangi * Christian Marangi <ansuelsmth@gmail.com 69739f5f9SChristian Marangi */ 79739f5f9SChristian Marangi 89739f5f9SChristian Marangi #include <crypto/sha1.h> 99739f5f9SChristian Marangi #include <crypto/sha2.h> 109739f5f9SChristian Marangi #include <crypto/md5.h> 119739f5f9SChristian Marangi #include <crypto/hmac.h> 129739f5f9SChristian Marangi #include <linux/dma-mapping.h> 139739f5f9SChristian Marangi #include <linux/delay.h> 149739f5f9SChristian Marangi 159739f5f9SChristian Marangi #include "eip93-cipher.h" 169739f5f9SChristian Marangi #include "eip93-hash.h" 179739f5f9SChristian Marangi #include "eip93-main.h" 189739f5f9SChristian Marangi #include "eip93-common.h" 199739f5f9SChristian Marangi #include "eip93-regs.h" 209739f5f9SChristian Marangi 219739f5f9SChristian Marangi static void eip93_hash_free_data_blocks(struct ahash_request *req) 229739f5f9SChristian Marangi { 239739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 249739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 259739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 269739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 279739f5f9SChristian Marangi struct mkt_hash_block *block, *tmp; 289739f5f9SChristian Marangi 299739f5f9SChristian Marangi list_for_each_entry_safe(block, tmp, &rctx->blocks, list) { 309739f5f9SChristian Marangi dma_unmap_single(eip93->dev, block->data_dma, 319739f5f9SChristian Marangi SHA256_BLOCK_SIZE, DMA_TO_DEVICE); 329739f5f9SChristian Marangi kfree(block); 339739f5f9SChristian Marangi } 349739f5f9SChristian Marangi if (!list_empty(&rctx->blocks)) 359739f5f9SChristian Marangi INIT_LIST_HEAD(&rctx->blocks); 369739f5f9SChristian Marangi 379739f5f9SChristian Marangi if (rctx->finalize) 389739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->data_dma, 399739f5f9SChristian Marangi rctx->data_used, 409739f5f9SChristian Marangi DMA_TO_DEVICE); 419739f5f9SChristian Marangi } 429739f5f9SChristian Marangi 439739f5f9SChristian Marangi static void eip93_hash_free_sa_record(struct ahash_request *req) 449739f5f9SChristian Marangi { 459739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 469739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 479739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 489739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 499739f5f9SChristian Marangi 509739f5f9SChristian Marangi if (IS_HMAC(ctx->flags)) 519739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_record_hmac_base, 529739f5f9SChristian Marangi sizeof(rctx->sa_record_hmac), DMA_TO_DEVICE); 539739f5f9SChristian Marangi 549739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_record_base, 559739f5f9SChristian Marangi sizeof(rctx->sa_record), DMA_TO_DEVICE); 569739f5f9SChristian Marangi } 579739f5f9SChristian Marangi 589739f5f9SChristian Marangi void eip93_hash_handle_result(struct crypto_async_request *async, int err) 599739f5f9SChristian Marangi { 609739f5f9SChristian Marangi struct ahash_request *req = ahash_request_cast(async); 619739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 629739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 639739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 649739f5f9SChristian Marangi int digestsize = crypto_ahash_digestsize(ahash); 659739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 669739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 679739f5f9SChristian Marangi int i; 689739f5f9SChristian Marangi 699739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_state_base, 709739f5f9SChristian Marangi sizeof(*sa_state), DMA_FROM_DEVICE); 719739f5f9SChristian Marangi 729739f5f9SChristian Marangi /* 739739f5f9SChristian Marangi * With partial_hash assume SHA256_DIGEST_SIZE buffer is passed. 749739f5f9SChristian Marangi * This is to handle SHA224 that have a 32 byte intermediate digest. 759739f5f9SChristian Marangi */ 769739f5f9SChristian Marangi if (rctx->partial_hash) 779739f5f9SChristian Marangi digestsize = SHA256_DIGEST_SIZE; 789739f5f9SChristian Marangi 799739f5f9SChristian Marangi if (rctx->finalize || rctx->partial_hash) { 809739f5f9SChristian Marangi /* bytes needs to be swapped for req->result */ 819739f5f9SChristian Marangi if (!IS_HASH_MD5(ctx->flags)) { 829739f5f9SChristian Marangi for (i = 0; i < digestsize / sizeof(u32); i++) { 839739f5f9SChristian Marangi u32 *digest = (u32 *)sa_state->state_i_digest; 849739f5f9SChristian Marangi 859739f5f9SChristian Marangi digest[i] = be32_to_cpu((__be32 __force)digest[i]); 869739f5f9SChristian Marangi } 879739f5f9SChristian Marangi } 889739f5f9SChristian Marangi 899739f5f9SChristian Marangi memcpy(req->result, sa_state->state_i_digest, digestsize); 909739f5f9SChristian Marangi } 919739f5f9SChristian Marangi 929739f5f9SChristian Marangi eip93_hash_free_sa_record(req); 939739f5f9SChristian Marangi eip93_hash_free_data_blocks(req); 949739f5f9SChristian Marangi 959739f5f9SChristian Marangi ahash_request_complete(req, err); 969739f5f9SChristian Marangi } 979739f5f9SChristian Marangi 989739f5f9SChristian Marangi static void eip93_hash_init_sa_state_digest(u32 hash, u8 *digest) 999739f5f9SChristian Marangi { 100*83366bccSColin Ian King static const u32 sha256_init[] = { 101*83366bccSColin Ian King SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3, 102*83366bccSColin Ian King SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7 103*83366bccSColin Ian King }; 104*83366bccSColin Ian King static const u32 sha224_init[] = { 105*83366bccSColin Ian King SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3, 106*83366bccSColin Ian King SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7 107*83366bccSColin Ian King }; 108*83366bccSColin Ian King static const u32 sha1_init[] = { 109*83366bccSColin Ian King SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4 110*83366bccSColin Ian King }; 111*83366bccSColin Ian King static const u32 md5_init[] = { 112*83366bccSColin Ian King MD5_H0, MD5_H1, MD5_H2, MD5_H3 113*83366bccSColin Ian King }; 1149739f5f9SChristian Marangi 1159739f5f9SChristian Marangi /* Init HASH constant */ 1169739f5f9SChristian Marangi switch (hash) { 1179739f5f9SChristian Marangi case EIP93_HASH_SHA256: 1189739f5f9SChristian Marangi memcpy(digest, sha256_init, sizeof(sha256_init)); 1199739f5f9SChristian Marangi return; 1209739f5f9SChristian Marangi case EIP93_HASH_SHA224: 1219739f5f9SChristian Marangi memcpy(digest, sha224_init, sizeof(sha224_init)); 1229739f5f9SChristian Marangi return; 1239739f5f9SChristian Marangi case EIP93_HASH_SHA1: 1249739f5f9SChristian Marangi memcpy(digest, sha1_init, sizeof(sha1_init)); 1259739f5f9SChristian Marangi return; 1269739f5f9SChristian Marangi case EIP93_HASH_MD5: 1279739f5f9SChristian Marangi memcpy(digest, md5_init, sizeof(md5_init)); 1289739f5f9SChristian Marangi return; 1299739f5f9SChristian Marangi default: /* Impossible */ 1309739f5f9SChristian Marangi return; 1319739f5f9SChristian Marangi } 1329739f5f9SChristian Marangi } 1339739f5f9SChristian Marangi 1349739f5f9SChristian Marangi static void eip93_hash_export_sa_state(struct ahash_request *req, 1359739f5f9SChristian Marangi struct eip93_hash_export_state *state) 1369739f5f9SChristian Marangi { 1379739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 1389739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 1399739f5f9SChristian Marangi 1409739f5f9SChristian Marangi /* 1419739f5f9SChristian Marangi * EIP93 have special handling for state_byte_cnt in sa_state. 1429739f5f9SChristian Marangi * Even if a zero packet is passed (and a BADMSG is returned), 1439739f5f9SChristian Marangi * state_byte_cnt is incremented to the digest handled (with the hash 1449739f5f9SChristian Marangi * primitive). This is problematic with export/import as EIP93 1459739f5f9SChristian Marangi * expect 0 state_byte_cnt for the very first iteration. 1469739f5f9SChristian Marangi */ 1479739f5f9SChristian Marangi if (!rctx->len) 1489739f5f9SChristian Marangi memset(state->state_len, 0, sizeof(u32) * 2); 1499739f5f9SChristian Marangi else 1509739f5f9SChristian Marangi memcpy(state->state_len, sa_state->state_byte_cnt, 1519739f5f9SChristian Marangi sizeof(u32) * 2); 1529739f5f9SChristian Marangi memcpy(state->state_hash, sa_state->state_i_digest, 1539739f5f9SChristian Marangi SHA256_DIGEST_SIZE); 1549739f5f9SChristian Marangi state->len = rctx->len; 1559739f5f9SChristian Marangi state->data_used = rctx->data_used; 1569739f5f9SChristian Marangi } 1579739f5f9SChristian Marangi 1589739f5f9SChristian Marangi static void __eip93_hash_init(struct ahash_request *req) 1599739f5f9SChristian Marangi { 1609739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 1619739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 1629739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 1639739f5f9SChristian Marangi struct sa_record *sa_record = &rctx->sa_record; 1649739f5f9SChristian Marangi int digestsize; 1659739f5f9SChristian Marangi 1669739f5f9SChristian Marangi digestsize = crypto_ahash_digestsize(ahash); 1679739f5f9SChristian Marangi 1689739f5f9SChristian Marangi eip93_set_sa_record(sa_record, 0, ctx->flags); 1699739f5f9SChristian Marangi sa_record->sa_cmd0_word |= EIP93_SA_CMD_HASH_FROM_STATE; 1709739f5f9SChristian Marangi sa_record->sa_cmd0_word |= EIP93_SA_CMD_SAVE_HASH; 1719739f5f9SChristian Marangi sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_OPCODE; 1729739f5f9SChristian Marangi sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_OPCODE, 1739739f5f9SChristian Marangi EIP93_SA_CMD_OPCODE_BASIC_OUT_HASH); 1749739f5f9SChristian Marangi sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_DIGEST_LENGTH; 1759739f5f9SChristian Marangi sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_DIGEST_LENGTH, 1769739f5f9SChristian Marangi digestsize / sizeof(u32)); 1779739f5f9SChristian Marangi 1789739f5f9SChristian Marangi /* 1799739f5f9SChristian Marangi * HMAC special handling 1809739f5f9SChristian Marangi * Enabling CMD_HMAC force the inner hash to be always finalized. 1819739f5f9SChristian Marangi * This cause problems on handling message > 64 byte as we 1829739f5f9SChristian Marangi * need to produce intermediate inner hash on sending intermediate 1839739f5f9SChristian Marangi * 64 bytes blocks. 1849739f5f9SChristian Marangi * 1859739f5f9SChristian Marangi * To handle this, enable CMD_HMAC only on the last block. 1869739f5f9SChristian Marangi * We make a duplicate of sa_record and on the last descriptor, 1879739f5f9SChristian Marangi * we pass a dedicated sa_record with CMD_HMAC enabled to make 1889739f5f9SChristian Marangi * EIP93 apply the outer hash. 1899739f5f9SChristian Marangi */ 1909739f5f9SChristian Marangi if (IS_HMAC(ctx->flags)) { 1919739f5f9SChristian Marangi struct sa_record *sa_record_hmac = &rctx->sa_record_hmac; 1929739f5f9SChristian Marangi 1939739f5f9SChristian Marangi memcpy(sa_record_hmac, sa_record, sizeof(*sa_record)); 1949739f5f9SChristian Marangi /* Copy pre-hashed opad for HMAC */ 1959739f5f9SChristian Marangi memcpy(sa_record_hmac->sa_o_digest, ctx->opad, SHA256_DIGEST_SIZE); 1969739f5f9SChristian Marangi 1979739f5f9SChristian Marangi /* Disable HMAC for hash normal sa_record */ 1989739f5f9SChristian Marangi sa_record->sa_cmd1_word &= ~EIP93_SA_CMD_HMAC; 1999739f5f9SChristian Marangi } 2009739f5f9SChristian Marangi 2019739f5f9SChristian Marangi rctx->len = 0; 2029739f5f9SChristian Marangi rctx->data_used = 0; 2039739f5f9SChristian Marangi rctx->partial_hash = false; 2049739f5f9SChristian Marangi rctx->finalize = false; 2059739f5f9SChristian Marangi INIT_LIST_HEAD(&rctx->blocks); 2069739f5f9SChristian Marangi } 2079739f5f9SChristian Marangi 2089739f5f9SChristian Marangi static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data, 2099739f5f9SChristian Marangi dma_addr_t *data_dma, u32 len, bool last) 2109739f5f9SChristian Marangi { 2119739f5f9SChristian Marangi struct ahash_request *req = ahash_request_cast(async); 2129739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 2139739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 2149739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 2159739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 2169739f5f9SChristian Marangi struct eip93_descriptor cdesc = { }; 2179739f5f9SChristian Marangi dma_addr_t src_addr; 2189739f5f9SChristian Marangi int ret; 2199739f5f9SChristian Marangi 2209739f5f9SChristian Marangi /* Map block data to DMA */ 2219739f5f9SChristian Marangi src_addr = dma_map_single(eip93->dev, data, len, DMA_TO_DEVICE); 2229739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, src_addr); 2239739f5f9SChristian Marangi if (ret) 2249739f5f9SChristian Marangi return ret; 2259739f5f9SChristian Marangi 2269739f5f9SChristian Marangi cdesc.pe_ctrl_stat_word = FIELD_PREP(EIP93_PE_CTRL_PE_READY_DES_TRING_OWN, 2279739f5f9SChristian Marangi EIP93_PE_CTRL_HOST_READY); 2289739f5f9SChristian Marangi cdesc.sa_addr = rctx->sa_record_base; 2299739f5f9SChristian Marangi cdesc.arc4_addr = 0; 2309739f5f9SChristian Marangi 2319739f5f9SChristian Marangi cdesc.state_addr = rctx->sa_state_base; 2329739f5f9SChristian Marangi cdesc.src_addr = src_addr; 2339739f5f9SChristian Marangi cdesc.pe_length_word = FIELD_PREP(EIP93_PE_LENGTH_HOST_PE_READY, 2349739f5f9SChristian Marangi EIP93_PE_LENGTH_HOST_READY); 2359739f5f9SChristian Marangi cdesc.pe_length_word |= FIELD_PREP(EIP93_PE_LENGTH_LENGTH, 2369739f5f9SChristian Marangi len); 2379739f5f9SChristian Marangi 2389739f5f9SChristian Marangi cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_HASH); 2399739f5f9SChristian Marangi 2409739f5f9SChristian Marangi if (last) { 2419739f5f9SChristian Marangi int crypto_async_idr; 2429739f5f9SChristian Marangi 2439739f5f9SChristian Marangi if (rctx->finalize && !rctx->partial_hash) { 2449739f5f9SChristian Marangi /* For last block, pass sa_record with CMD_HMAC enabled */ 2459739f5f9SChristian Marangi if (IS_HMAC(ctx->flags)) { 2469739f5f9SChristian Marangi struct sa_record *sa_record_hmac = &rctx->sa_record_hmac; 2479739f5f9SChristian Marangi 2489739f5f9SChristian Marangi rctx->sa_record_hmac_base = dma_map_single(eip93->dev, 2499739f5f9SChristian Marangi sa_record_hmac, 2509739f5f9SChristian Marangi sizeof(*sa_record_hmac), 2519739f5f9SChristian Marangi DMA_TO_DEVICE); 2529739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_record_hmac_base); 2539739f5f9SChristian Marangi if (ret) 2549739f5f9SChristian Marangi return ret; 2559739f5f9SChristian Marangi 2569739f5f9SChristian Marangi cdesc.sa_addr = rctx->sa_record_hmac_base; 2579739f5f9SChristian Marangi } 2589739f5f9SChristian Marangi 2599739f5f9SChristian Marangi cdesc.pe_ctrl_stat_word |= EIP93_PE_CTRL_PE_HASH_FINAL; 2609739f5f9SChristian Marangi } 2619739f5f9SChristian Marangi 2629739f5f9SChristian Marangi scoped_guard(spinlock_bh, &eip93->ring->idr_lock) 2639739f5f9SChristian Marangi crypto_async_idr = idr_alloc(&eip93->ring->crypto_async_idr, async, 0, 2649739f5f9SChristian Marangi EIP93_RING_NUM - 1, GFP_ATOMIC); 2659739f5f9SChristian Marangi 2669739f5f9SChristian Marangi cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, (u16)crypto_async_idr) | 2679739f5f9SChristian Marangi FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_LAST); 2689739f5f9SChristian Marangi } 2699739f5f9SChristian Marangi 2709739f5f9SChristian Marangi again: 27112e0b15bSChristian Marangi scoped_guard(spinlock_irqsave, &eip93->ring->write_lock) 2729739f5f9SChristian Marangi ret = eip93_put_descriptor(eip93, &cdesc); 2739739f5f9SChristian Marangi if (ret) { 2749739f5f9SChristian Marangi usleep_range(EIP93_RING_BUSY_DELAY, 2759739f5f9SChristian Marangi EIP93_RING_BUSY_DELAY * 2); 2769739f5f9SChristian Marangi goto again; 2779739f5f9SChristian Marangi } 2789739f5f9SChristian Marangi 2799739f5f9SChristian Marangi /* Writing new descriptor count starts DMA action */ 2809739f5f9SChristian Marangi writel(1, eip93->base + EIP93_REG_PE_CD_COUNT); 2819739f5f9SChristian Marangi 2829739f5f9SChristian Marangi *data_dma = src_addr; 2839739f5f9SChristian Marangi return 0; 2849739f5f9SChristian Marangi } 2859739f5f9SChristian Marangi 2869739f5f9SChristian Marangi static int eip93_hash_init(struct ahash_request *req) 2879739f5f9SChristian Marangi { 2889739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 2899739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 2909739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 2919739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 2929739f5f9SChristian Marangi 2939739f5f9SChristian Marangi memset(sa_state->state_byte_cnt, 0, sizeof(u32) * 2); 2949739f5f9SChristian Marangi eip93_hash_init_sa_state_digest(ctx->flags & EIP93_HASH_MASK, 2959739f5f9SChristian Marangi sa_state->state_i_digest); 2969739f5f9SChristian Marangi 2979739f5f9SChristian Marangi __eip93_hash_init(req); 2989739f5f9SChristian Marangi 2999739f5f9SChristian Marangi /* For HMAC setup the initial block for ipad */ 3009739f5f9SChristian Marangi if (IS_HMAC(ctx->flags)) { 3019739f5f9SChristian Marangi memcpy(rctx->data, ctx->ipad, SHA256_BLOCK_SIZE); 3029739f5f9SChristian Marangi 3039739f5f9SChristian Marangi rctx->data_used = SHA256_BLOCK_SIZE; 3049739f5f9SChristian Marangi rctx->len += SHA256_BLOCK_SIZE; 3059739f5f9SChristian Marangi } 3069739f5f9SChristian Marangi 3079739f5f9SChristian Marangi return 0; 3089739f5f9SChristian Marangi } 3099739f5f9SChristian Marangi 3109739f5f9SChristian Marangi /* 3119739f5f9SChristian Marangi * With complete_req true, we wait for the engine to consume all the block in list, 3129739f5f9SChristian Marangi * else we just queue the block to the engine as final() will wait. This is useful 3139739f5f9SChristian Marangi * for finup(). 3149739f5f9SChristian Marangi */ 3159739f5f9SChristian Marangi static int __eip93_hash_update(struct ahash_request *req, bool complete_req) 3169739f5f9SChristian Marangi { 3179739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 3189739f5f9SChristian Marangi struct crypto_async_request *async = &req->base; 3199739f5f9SChristian Marangi unsigned int read, to_consume = req->nbytes; 3209739f5f9SChristian Marangi unsigned int max_read, consumed = 0; 3219739f5f9SChristian Marangi struct mkt_hash_block *block; 3229739f5f9SChristian Marangi bool wait_req = false; 3239739f5f9SChristian Marangi int offset; 3249739f5f9SChristian Marangi int ret; 3259739f5f9SChristian Marangi 3269739f5f9SChristian Marangi /* Get the offset and available space to fill req data */ 3279739f5f9SChristian Marangi offset = rctx->data_used; 3289739f5f9SChristian Marangi max_read = SHA256_BLOCK_SIZE - offset; 3299739f5f9SChristian Marangi 3309739f5f9SChristian Marangi /* Consume req in block of SHA256_BLOCK_SIZE. 3319739f5f9SChristian Marangi * to_read is initially set to space available in the req data 3329739f5f9SChristian Marangi * and then reset to SHA256_BLOCK_SIZE. 3339739f5f9SChristian Marangi */ 3349739f5f9SChristian Marangi while (to_consume > max_read) { 3359739f5f9SChristian Marangi block = kzalloc(sizeof(*block), GFP_ATOMIC); 3369739f5f9SChristian Marangi if (!block) { 3379739f5f9SChristian Marangi ret = -ENOMEM; 3389739f5f9SChristian Marangi goto free_blocks; 3399739f5f9SChristian Marangi } 3409739f5f9SChristian Marangi 3419739f5f9SChristian Marangi read = sg_pcopy_to_buffer(req->src, sg_nents(req->src), 3429739f5f9SChristian Marangi block->data + offset, 3439739f5f9SChristian Marangi max_read, consumed); 3449739f5f9SChristian Marangi 3459739f5f9SChristian Marangi /* 3469739f5f9SChristian Marangi * For first iteration only, copy req data to block 3479739f5f9SChristian Marangi * and reset offset and max_read for next iteration. 3489739f5f9SChristian Marangi */ 3499739f5f9SChristian Marangi if (offset > 0) { 3509739f5f9SChristian Marangi memcpy(block->data, rctx->data, offset); 3519739f5f9SChristian Marangi offset = 0; 3529739f5f9SChristian Marangi max_read = SHA256_BLOCK_SIZE; 3539739f5f9SChristian Marangi } 3549739f5f9SChristian Marangi 3559739f5f9SChristian Marangi list_add(&block->list, &rctx->blocks); 3569739f5f9SChristian Marangi to_consume -= read; 3579739f5f9SChristian Marangi consumed += read; 3589739f5f9SChristian Marangi } 3599739f5f9SChristian Marangi 3609739f5f9SChristian Marangi /* Write the remaining data to req data */ 3619739f5f9SChristian Marangi read = sg_pcopy_to_buffer(req->src, sg_nents(req->src), 3629739f5f9SChristian Marangi rctx->data + offset, to_consume, 3639739f5f9SChristian Marangi consumed); 3649739f5f9SChristian Marangi rctx->data_used = offset + read; 3659739f5f9SChristian Marangi 3669739f5f9SChristian Marangi /* Update counter with processed bytes */ 3679739f5f9SChristian Marangi rctx->len += read + consumed; 3689739f5f9SChristian Marangi 3699739f5f9SChristian Marangi /* Consume all the block added to list */ 3709739f5f9SChristian Marangi list_for_each_entry_reverse(block, &rctx->blocks, list) { 3719739f5f9SChristian Marangi wait_req = complete_req && 3729739f5f9SChristian Marangi list_is_first(&block->list, &rctx->blocks); 3739739f5f9SChristian Marangi 3749739f5f9SChristian Marangi ret = eip93_send_hash_req(async, block->data, 3759739f5f9SChristian Marangi &block->data_dma, 3769739f5f9SChristian Marangi SHA256_BLOCK_SIZE, wait_req); 3779739f5f9SChristian Marangi if (ret) 3789739f5f9SChristian Marangi goto free_blocks; 3799739f5f9SChristian Marangi } 3809739f5f9SChristian Marangi 3819739f5f9SChristian Marangi return wait_req ? -EINPROGRESS : 0; 3829739f5f9SChristian Marangi 3839739f5f9SChristian Marangi free_blocks: 3849739f5f9SChristian Marangi eip93_hash_free_data_blocks(req); 3859739f5f9SChristian Marangi 3869739f5f9SChristian Marangi return ret; 3879739f5f9SChristian Marangi } 3889739f5f9SChristian Marangi 3899739f5f9SChristian Marangi static int eip93_hash_update(struct ahash_request *req) 3909739f5f9SChristian Marangi { 3919739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 3929739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 3939739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 3949739f5f9SChristian Marangi struct sa_record *sa_record = &rctx->sa_record; 3959739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 3969739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 3979739f5f9SChristian Marangi int ret; 3989739f5f9SChristian Marangi 3999739f5f9SChristian Marangi if (!req->nbytes) 4009739f5f9SChristian Marangi return 0; 4019739f5f9SChristian Marangi 4029739f5f9SChristian Marangi rctx->sa_state_base = dma_map_single(eip93->dev, sa_state, 4039739f5f9SChristian Marangi sizeof(*sa_state), 4049739f5f9SChristian Marangi DMA_TO_DEVICE); 4059739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_state_base); 4069739f5f9SChristian Marangi if (ret) 4079739f5f9SChristian Marangi return ret; 4089739f5f9SChristian Marangi 4099739f5f9SChristian Marangi rctx->sa_record_base = dma_map_single(eip93->dev, sa_record, 4109739f5f9SChristian Marangi sizeof(*sa_record), 4119739f5f9SChristian Marangi DMA_TO_DEVICE); 4129739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_record_base); 4139739f5f9SChristian Marangi if (ret) 4149739f5f9SChristian Marangi goto free_sa_state; 4159739f5f9SChristian Marangi 4169739f5f9SChristian Marangi ret = __eip93_hash_update(req, true); 4179739f5f9SChristian Marangi if (ret && ret != -EINPROGRESS) 4189739f5f9SChristian Marangi goto free_sa_record; 4199739f5f9SChristian Marangi 4209739f5f9SChristian Marangi return ret; 4219739f5f9SChristian Marangi 4229739f5f9SChristian Marangi free_sa_record: 4239739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_record_base, 4249739f5f9SChristian Marangi sizeof(*sa_record), DMA_TO_DEVICE); 4259739f5f9SChristian Marangi 4269739f5f9SChristian Marangi free_sa_state: 4279739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_state_base, 4289739f5f9SChristian Marangi sizeof(*sa_state), DMA_TO_DEVICE); 4299739f5f9SChristian Marangi 4309739f5f9SChristian Marangi return ret; 4319739f5f9SChristian Marangi } 4329739f5f9SChristian Marangi 4339739f5f9SChristian Marangi /* 4349739f5f9SChristian Marangi * With map_data true, we map the sa_record and sa_state. This is needed 4359739f5f9SChristian Marangi * for finup() as the they are mapped before calling update() 4369739f5f9SChristian Marangi */ 4379739f5f9SChristian Marangi static int __eip93_hash_final(struct ahash_request *req, bool map_dma) 4389739f5f9SChristian Marangi { 4399739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 4409739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 4419739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 4429739f5f9SChristian Marangi struct crypto_async_request *async = &req->base; 4439739f5f9SChristian Marangi struct sa_record *sa_record = &rctx->sa_record; 4449739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 4459739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 4469739f5f9SChristian Marangi int ret; 4479739f5f9SChristian Marangi 4489739f5f9SChristian Marangi /* EIP93 can't handle zero bytes hash */ 4499739f5f9SChristian Marangi if (!rctx->len && !IS_HMAC(ctx->flags)) { 4509739f5f9SChristian Marangi switch ((ctx->flags & EIP93_HASH_MASK)) { 4519739f5f9SChristian Marangi case EIP93_HASH_SHA256: 4529739f5f9SChristian Marangi memcpy(req->result, sha256_zero_message_hash, 4539739f5f9SChristian Marangi SHA256_DIGEST_SIZE); 4549739f5f9SChristian Marangi break; 4559739f5f9SChristian Marangi case EIP93_HASH_SHA224: 4569739f5f9SChristian Marangi memcpy(req->result, sha224_zero_message_hash, 4579739f5f9SChristian Marangi SHA224_DIGEST_SIZE); 4589739f5f9SChristian Marangi break; 4599739f5f9SChristian Marangi case EIP93_HASH_SHA1: 4609739f5f9SChristian Marangi memcpy(req->result, sha1_zero_message_hash, 4619739f5f9SChristian Marangi SHA1_DIGEST_SIZE); 4629739f5f9SChristian Marangi break; 4639739f5f9SChristian Marangi case EIP93_HASH_MD5: 4649739f5f9SChristian Marangi memcpy(req->result, md5_zero_message_hash, 4659739f5f9SChristian Marangi MD5_DIGEST_SIZE); 4669739f5f9SChristian Marangi break; 4679739f5f9SChristian Marangi default: /* Impossible */ 4689739f5f9SChristian Marangi return -EINVAL; 4699739f5f9SChristian Marangi } 4709739f5f9SChristian Marangi 4719739f5f9SChristian Marangi return 0; 4729739f5f9SChristian Marangi } 4739739f5f9SChristian Marangi 4749739f5f9SChristian Marangi /* Signal interrupt from engine is for last block */ 4759739f5f9SChristian Marangi rctx->finalize = true; 4769739f5f9SChristian Marangi 4779739f5f9SChristian Marangi if (map_dma) { 4789739f5f9SChristian Marangi rctx->sa_state_base = dma_map_single(eip93->dev, sa_state, 4799739f5f9SChristian Marangi sizeof(*sa_state), 4809739f5f9SChristian Marangi DMA_TO_DEVICE); 4819739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_state_base); 4829739f5f9SChristian Marangi if (ret) 4839739f5f9SChristian Marangi return ret; 4849739f5f9SChristian Marangi 4859739f5f9SChristian Marangi rctx->sa_record_base = dma_map_single(eip93->dev, sa_record, 4869739f5f9SChristian Marangi sizeof(*sa_record), 4879739f5f9SChristian Marangi DMA_TO_DEVICE); 4889739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_record_base); 4899739f5f9SChristian Marangi if (ret) 4909739f5f9SChristian Marangi goto free_sa_state; 4919739f5f9SChristian Marangi } 4929739f5f9SChristian Marangi 4939739f5f9SChristian Marangi /* Send last block */ 4949739f5f9SChristian Marangi ret = eip93_send_hash_req(async, rctx->data, &rctx->data_dma, 4959739f5f9SChristian Marangi rctx->data_used, true); 4969739f5f9SChristian Marangi if (ret) 4979739f5f9SChristian Marangi goto free_blocks; 4989739f5f9SChristian Marangi 4999739f5f9SChristian Marangi return -EINPROGRESS; 5009739f5f9SChristian Marangi 5019739f5f9SChristian Marangi free_blocks: 5029739f5f9SChristian Marangi eip93_hash_free_data_blocks(req); 5039739f5f9SChristian Marangi 5049739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_record_base, 5059739f5f9SChristian Marangi sizeof(*sa_record), DMA_TO_DEVICE); 5069739f5f9SChristian Marangi 5079739f5f9SChristian Marangi free_sa_state: 5089739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_state_base, 5099739f5f9SChristian Marangi sizeof(*sa_state), DMA_TO_DEVICE); 5109739f5f9SChristian Marangi 5119739f5f9SChristian Marangi return ret; 5129739f5f9SChristian Marangi } 5139739f5f9SChristian Marangi 5149739f5f9SChristian Marangi static int eip93_hash_final(struct ahash_request *req) 5159739f5f9SChristian Marangi { 5169739f5f9SChristian Marangi return __eip93_hash_final(req, true); 5179739f5f9SChristian Marangi } 5189739f5f9SChristian Marangi 5199739f5f9SChristian Marangi static int eip93_hash_finup(struct ahash_request *req) 5209739f5f9SChristian Marangi { 5219739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 5229739f5f9SChristian Marangi struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 5239739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash); 5249739f5f9SChristian Marangi struct sa_record *sa_record = &rctx->sa_record; 5259739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 5269739f5f9SChristian Marangi struct eip93_device *eip93 = ctx->eip93; 5279739f5f9SChristian Marangi int ret; 5289739f5f9SChristian Marangi 5299739f5f9SChristian Marangi if (rctx->len + req->nbytes || IS_HMAC(ctx->flags)) { 5309739f5f9SChristian Marangi rctx->sa_state_base = dma_map_single(eip93->dev, sa_state, 5319739f5f9SChristian Marangi sizeof(*sa_state), 5329739f5f9SChristian Marangi DMA_TO_DEVICE); 5339739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_state_base); 5349739f5f9SChristian Marangi if (ret) 5359739f5f9SChristian Marangi return ret; 5369739f5f9SChristian Marangi 5379739f5f9SChristian Marangi rctx->sa_record_base = dma_map_single(eip93->dev, sa_record, 5389739f5f9SChristian Marangi sizeof(*sa_record), 5399739f5f9SChristian Marangi DMA_TO_DEVICE); 5409739f5f9SChristian Marangi ret = dma_mapping_error(eip93->dev, rctx->sa_record_base); 5419739f5f9SChristian Marangi if (ret) 5429739f5f9SChristian Marangi goto free_sa_state; 5439739f5f9SChristian Marangi 5449739f5f9SChristian Marangi ret = __eip93_hash_update(req, false); 5459739f5f9SChristian Marangi if (ret) 5469739f5f9SChristian Marangi goto free_sa_record; 5479739f5f9SChristian Marangi } 5489739f5f9SChristian Marangi 5499739f5f9SChristian Marangi return __eip93_hash_final(req, false); 5509739f5f9SChristian Marangi 5519739f5f9SChristian Marangi free_sa_record: 5529739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_record_base, 5539739f5f9SChristian Marangi sizeof(*sa_record), DMA_TO_DEVICE); 5549739f5f9SChristian Marangi free_sa_state: 5559739f5f9SChristian Marangi dma_unmap_single(eip93->dev, rctx->sa_state_base, 5569739f5f9SChristian Marangi sizeof(*sa_state), DMA_TO_DEVICE); 5579739f5f9SChristian Marangi 5589739f5f9SChristian Marangi return ret; 5599739f5f9SChristian Marangi } 5609739f5f9SChristian Marangi 5619739f5f9SChristian Marangi static int eip93_hash_hmac_setkey(struct crypto_ahash *ahash, const u8 *key, 5629739f5f9SChristian Marangi u32 keylen) 5639739f5f9SChristian Marangi { 5649739f5f9SChristian Marangi unsigned int digestsize = crypto_ahash_digestsize(ahash); 5659739f5f9SChristian Marangi struct crypto_tfm *tfm = crypto_ahash_tfm(ahash); 5669739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm); 5679739f5f9SChristian Marangi 5689739f5f9SChristian Marangi return eip93_hmac_setkey(ctx->flags, key, keylen, digestsize, 5699739f5f9SChristian Marangi ctx->ipad, ctx->opad, true); 5709739f5f9SChristian Marangi } 5719739f5f9SChristian Marangi 5729739f5f9SChristian Marangi static int eip93_hash_cra_init(struct crypto_tfm *tfm) 5739739f5f9SChristian Marangi { 5749739f5f9SChristian Marangi struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm); 5759739f5f9SChristian Marangi struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg, 5769739f5f9SChristian Marangi struct eip93_alg_template, alg.ahash.halg.base); 5779739f5f9SChristian Marangi 5789739f5f9SChristian Marangi crypto_ahash_set_reqsize_dma(__crypto_ahash_cast(tfm), 5799739f5f9SChristian Marangi sizeof(struct eip93_hash_reqctx)); 5809739f5f9SChristian Marangi 5819739f5f9SChristian Marangi ctx->eip93 = tmpl->eip93; 5829739f5f9SChristian Marangi ctx->flags = tmpl->flags; 5839739f5f9SChristian Marangi 5849739f5f9SChristian Marangi return 0; 5859739f5f9SChristian Marangi } 5869739f5f9SChristian Marangi 5879739f5f9SChristian Marangi static int eip93_hash_digest(struct ahash_request *req) 5889739f5f9SChristian Marangi { 5899739f5f9SChristian Marangi int ret; 5909739f5f9SChristian Marangi 5919739f5f9SChristian Marangi ret = eip93_hash_init(req); 5929739f5f9SChristian Marangi if (ret) 5939739f5f9SChristian Marangi return ret; 5949739f5f9SChristian Marangi 5959739f5f9SChristian Marangi return eip93_hash_finup(req); 5969739f5f9SChristian Marangi } 5979739f5f9SChristian Marangi 5989739f5f9SChristian Marangi static int eip93_hash_import(struct ahash_request *req, const void *in) 5999739f5f9SChristian Marangi { 6009739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 6019739f5f9SChristian Marangi const struct eip93_hash_export_state *state = in; 6029739f5f9SChristian Marangi struct sa_state *sa_state = &rctx->sa_state; 6039739f5f9SChristian Marangi 6049739f5f9SChristian Marangi memcpy(sa_state->state_byte_cnt, state->state_len, sizeof(u32) * 2); 6059739f5f9SChristian Marangi memcpy(sa_state->state_i_digest, state->state_hash, SHA256_DIGEST_SIZE); 6069739f5f9SChristian Marangi 6079739f5f9SChristian Marangi __eip93_hash_init(req); 6089739f5f9SChristian Marangi 6099739f5f9SChristian Marangi rctx->len = state->len; 6109739f5f9SChristian Marangi rctx->data_used = state->data_used; 6119739f5f9SChristian Marangi 6129739f5f9SChristian Marangi /* Skip copying data if we have nothing to copy */ 6139739f5f9SChristian Marangi if (rctx->len) 6149739f5f9SChristian Marangi memcpy(rctx->data, state->data, rctx->data_used); 6159739f5f9SChristian Marangi 6169739f5f9SChristian Marangi return 0; 6179739f5f9SChristian Marangi } 6189739f5f9SChristian Marangi 6199739f5f9SChristian Marangi static int eip93_hash_export(struct ahash_request *req, void *out) 6209739f5f9SChristian Marangi { 6219739f5f9SChristian Marangi struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req); 6229739f5f9SChristian Marangi struct eip93_hash_export_state *state = out; 6239739f5f9SChristian Marangi 6249739f5f9SChristian Marangi /* Save the first block in state data */ 6259739f5f9SChristian Marangi if (rctx->len) 6269739f5f9SChristian Marangi memcpy(state->data, rctx->data, rctx->data_used); 6279739f5f9SChristian Marangi 6289739f5f9SChristian Marangi eip93_hash_export_sa_state(req, state); 6299739f5f9SChristian Marangi 6309739f5f9SChristian Marangi return 0; 6319739f5f9SChristian Marangi } 6329739f5f9SChristian Marangi 6339739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_md5 = { 6349739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 6359739f5f9SChristian Marangi .flags = EIP93_HASH_MD5, 6369739f5f9SChristian Marangi .alg.ahash = { 6379739f5f9SChristian Marangi .init = eip93_hash_init, 6389739f5f9SChristian Marangi .update = eip93_hash_update, 6399739f5f9SChristian Marangi .final = eip93_hash_final, 6409739f5f9SChristian Marangi .finup = eip93_hash_finup, 6419739f5f9SChristian Marangi .digest = eip93_hash_digest, 6429739f5f9SChristian Marangi .export = eip93_hash_export, 6439739f5f9SChristian Marangi .import = eip93_hash_import, 6449739f5f9SChristian Marangi .halg = { 6459739f5f9SChristian Marangi .digestsize = MD5_DIGEST_SIZE, 6469739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 6479739f5f9SChristian Marangi .base = { 6489739f5f9SChristian Marangi .cra_name = "md5", 6499739f5f9SChristian Marangi .cra_driver_name = "md5-eip93", 6509739f5f9SChristian Marangi .cra_priority = 300, 6519739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 6529739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 6539739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 6549739f5f9SChristian Marangi .cra_blocksize = MD5_HMAC_BLOCK_SIZE, 6559739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 6569739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 6579739f5f9SChristian Marangi .cra_module = THIS_MODULE, 6589739f5f9SChristian Marangi }, 6599739f5f9SChristian Marangi }, 6609739f5f9SChristian Marangi }, 6619739f5f9SChristian Marangi }; 6629739f5f9SChristian Marangi 6639739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha1 = { 6649739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 6659739f5f9SChristian Marangi .flags = EIP93_HASH_SHA1, 6669739f5f9SChristian Marangi .alg.ahash = { 6679739f5f9SChristian Marangi .init = eip93_hash_init, 6689739f5f9SChristian Marangi .update = eip93_hash_update, 6699739f5f9SChristian Marangi .final = eip93_hash_final, 6709739f5f9SChristian Marangi .finup = eip93_hash_finup, 6719739f5f9SChristian Marangi .digest = eip93_hash_digest, 6729739f5f9SChristian Marangi .export = eip93_hash_export, 6739739f5f9SChristian Marangi .import = eip93_hash_import, 6749739f5f9SChristian Marangi .halg = { 6759739f5f9SChristian Marangi .digestsize = SHA1_DIGEST_SIZE, 6769739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 6779739f5f9SChristian Marangi .base = { 6789739f5f9SChristian Marangi .cra_name = "sha1", 6799739f5f9SChristian Marangi .cra_driver_name = "sha1-eip93", 6809739f5f9SChristian Marangi .cra_priority = 300, 6819739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 6829739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 6839739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 6849739f5f9SChristian Marangi .cra_blocksize = SHA1_BLOCK_SIZE, 6859739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 6869739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 6879739f5f9SChristian Marangi .cra_module = THIS_MODULE, 6889739f5f9SChristian Marangi }, 6899739f5f9SChristian Marangi }, 6909739f5f9SChristian Marangi }, 6919739f5f9SChristian Marangi }; 6929739f5f9SChristian Marangi 6939739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha224 = { 6949739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 6959739f5f9SChristian Marangi .flags = EIP93_HASH_SHA224, 6969739f5f9SChristian Marangi .alg.ahash = { 6979739f5f9SChristian Marangi .init = eip93_hash_init, 6989739f5f9SChristian Marangi .update = eip93_hash_update, 6999739f5f9SChristian Marangi .final = eip93_hash_final, 7009739f5f9SChristian Marangi .finup = eip93_hash_finup, 7019739f5f9SChristian Marangi .digest = eip93_hash_digest, 7029739f5f9SChristian Marangi .export = eip93_hash_export, 7039739f5f9SChristian Marangi .import = eip93_hash_import, 7049739f5f9SChristian Marangi .halg = { 7059739f5f9SChristian Marangi .digestsize = SHA224_DIGEST_SIZE, 7069739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 7079739f5f9SChristian Marangi .base = { 7089739f5f9SChristian Marangi .cra_name = "sha224", 7099739f5f9SChristian Marangi .cra_driver_name = "sha224-eip93", 7109739f5f9SChristian Marangi .cra_priority = 300, 7119739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 7129739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 7139739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 7149739f5f9SChristian Marangi .cra_blocksize = SHA224_BLOCK_SIZE, 7159739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 7169739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 7179739f5f9SChristian Marangi .cra_module = THIS_MODULE, 7189739f5f9SChristian Marangi }, 7199739f5f9SChristian Marangi }, 7209739f5f9SChristian Marangi }, 7219739f5f9SChristian Marangi }; 7229739f5f9SChristian Marangi 7239739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha256 = { 7249739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 7259739f5f9SChristian Marangi .flags = EIP93_HASH_SHA256, 7269739f5f9SChristian Marangi .alg.ahash = { 7279739f5f9SChristian Marangi .init = eip93_hash_init, 7289739f5f9SChristian Marangi .update = eip93_hash_update, 7299739f5f9SChristian Marangi .final = eip93_hash_final, 7309739f5f9SChristian Marangi .finup = eip93_hash_finup, 7319739f5f9SChristian Marangi .digest = eip93_hash_digest, 7329739f5f9SChristian Marangi .export = eip93_hash_export, 7339739f5f9SChristian Marangi .import = eip93_hash_import, 7349739f5f9SChristian Marangi .halg = { 7359739f5f9SChristian Marangi .digestsize = SHA256_DIGEST_SIZE, 7369739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 7379739f5f9SChristian Marangi .base = { 7389739f5f9SChristian Marangi .cra_name = "sha256", 7399739f5f9SChristian Marangi .cra_driver_name = "sha256-eip93", 7409739f5f9SChristian Marangi .cra_priority = 300, 7419739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 7429739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 7439739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 7449739f5f9SChristian Marangi .cra_blocksize = SHA256_BLOCK_SIZE, 7459739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 7469739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 7479739f5f9SChristian Marangi .cra_module = THIS_MODULE, 7489739f5f9SChristian Marangi }, 7499739f5f9SChristian Marangi }, 7509739f5f9SChristian Marangi }, 7519739f5f9SChristian Marangi }; 7529739f5f9SChristian Marangi 7539739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_md5 = { 7549739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 7559739f5f9SChristian Marangi .flags = EIP93_HASH_HMAC | EIP93_HASH_MD5, 7569739f5f9SChristian Marangi .alg.ahash = { 7579739f5f9SChristian Marangi .init = eip93_hash_init, 7589739f5f9SChristian Marangi .update = eip93_hash_update, 7599739f5f9SChristian Marangi .final = eip93_hash_final, 7609739f5f9SChristian Marangi .finup = eip93_hash_finup, 7619739f5f9SChristian Marangi .digest = eip93_hash_digest, 7629739f5f9SChristian Marangi .setkey = eip93_hash_hmac_setkey, 7639739f5f9SChristian Marangi .export = eip93_hash_export, 7649739f5f9SChristian Marangi .import = eip93_hash_import, 7659739f5f9SChristian Marangi .halg = { 7669739f5f9SChristian Marangi .digestsize = MD5_DIGEST_SIZE, 7679739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 7689739f5f9SChristian Marangi .base = { 7699739f5f9SChristian Marangi .cra_name = "hmac(md5)", 7709739f5f9SChristian Marangi .cra_driver_name = "hmac(md5-eip93)", 7719739f5f9SChristian Marangi .cra_priority = 300, 7729739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 7739739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 7749739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 7759739f5f9SChristian Marangi .cra_blocksize = MD5_HMAC_BLOCK_SIZE, 7769739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 7779739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 7789739f5f9SChristian Marangi .cra_module = THIS_MODULE, 7799739f5f9SChristian Marangi }, 7809739f5f9SChristian Marangi }, 7819739f5f9SChristian Marangi }, 7829739f5f9SChristian Marangi }; 7839739f5f9SChristian Marangi 7849739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha1 = { 7859739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 7869739f5f9SChristian Marangi .flags = EIP93_HASH_HMAC | EIP93_HASH_SHA1, 7879739f5f9SChristian Marangi .alg.ahash = { 7889739f5f9SChristian Marangi .init = eip93_hash_init, 7899739f5f9SChristian Marangi .update = eip93_hash_update, 7909739f5f9SChristian Marangi .final = eip93_hash_final, 7919739f5f9SChristian Marangi .finup = eip93_hash_finup, 7929739f5f9SChristian Marangi .digest = eip93_hash_digest, 7939739f5f9SChristian Marangi .setkey = eip93_hash_hmac_setkey, 7949739f5f9SChristian Marangi .export = eip93_hash_export, 7959739f5f9SChristian Marangi .import = eip93_hash_import, 7969739f5f9SChristian Marangi .halg = { 7979739f5f9SChristian Marangi .digestsize = SHA1_DIGEST_SIZE, 7989739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 7999739f5f9SChristian Marangi .base = { 8009739f5f9SChristian Marangi .cra_name = "hmac(sha1)", 8019739f5f9SChristian Marangi .cra_driver_name = "hmac(sha1-eip93)", 8029739f5f9SChristian Marangi .cra_priority = 300, 8039739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 8049739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 8059739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 8069739f5f9SChristian Marangi .cra_blocksize = SHA1_BLOCK_SIZE, 8079739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 8089739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 8099739f5f9SChristian Marangi .cra_module = THIS_MODULE, 8109739f5f9SChristian Marangi }, 8119739f5f9SChristian Marangi }, 8129739f5f9SChristian Marangi }, 8139739f5f9SChristian Marangi }; 8149739f5f9SChristian Marangi 8159739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha224 = { 8169739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 8179739f5f9SChristian Marangi .flags = EIP93_HASH_HMAC | EIP93_HASH_SHA224, 8189739f5f9SChristian Marangi .alg.ahash = { 8199739f5f9SChristian Marangi .init = eip93_hash_init, 8209739f5f9SChristian Marangi .update = eip93_hash_update, 8219739f5f9SChristian Marangi .final = eip93_hash_final, 8229739f5f9SChristian Marangi .finup = eip93_hash_finup, 8239739f5f9SChristian Marangi .digest = eip93_hash_digest, 8249739f5f9SChristian Marangi .setkey = eip93_hash_hmac_setkey, 8259739f5f9SChristian Marangi .export = eip93_hash_export, 8269739f5f9SChristian Marangi .import = eip93_hash_import, 8279739f5f9SChristian Marangi .halg = { 8289739f5f9SChristian Marangi .digestsize = SHA224_DIGEST_SIZE, 8299739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 8309739f5f9SChristian Marangi .base = { 8319739f5f9SChristian Marangi .cra_name = "hmac(sha224)", 8329739f5f9SChristian Marangi .cra_driver_name = "hmac(sha224-eip93)", 8339739f5f9SChristian Marangi .cra_priority = 300, 8349739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 8359739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 8369739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 8379739f5f9SChristian Marangi .cra_blocksize = SHA224_BLOCK_SIZE, 8389739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 8399739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 8409739f5f9SChristian Marangi .cra_module = THIS_MODULE, 8419739f5f9SChristian Marangi }, 8429739f5f9SChristian Marangi }, 8439739f5f9SChristian Marangi }, 8449739f5f9SChristian Marangi }; 8459739f5f9SChristian Marangi 8469739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha256 = { 8479739f5f9SChristian Marangi .type = EIP93_ALG_TYPE_HASH, 8489739f5f9SChristian Marangi .flags = EIP93_HASH_HMAC | EIP93_HASH_SHA256, 8499739f5f9SChristian Marangi .alg.ahash = { 8509739f5f9SChristian Marangi .init = eip93_hash_init, 8519739f5f9SChristian Marangi .update = eip93_hash_update, 8529739f5f9SChristian Marangi .final = eip93_hash_final, 8539739f5f9SChristian Marangi .finup = eip93_hash_finup, 8549739f5f9SChristian Marangi .digest = eip93_hash_digest, 8559739f5f9SChristian Marangi .setkey = eip93_hash_hmac_setkey, 8569739f5f9SChristian Marangi .export = eip93_hash_export, 8579739f5f9SChristian Marangi .import = eip93_hash_import, 8589739f5f9SChristian Marangi .halg = { 8599739f5f9SChristian Marangi .digestsize = SHA256_DIGEST_SIZE, 8609739f5f9SChristian Marangi .statesize = sizeof(struct eip93_hash_export_state), 8619739f5f9SChristian Marangi .base = { 8629739f5f9SChristian Marangi .cra_name = "hmac(sha256)", 8639739f5f9SChristian Marangi .cra_driver_name = "hmac(sha256-eip93)", 8649739f5f9SChristian Marangi .cra_priority = 300, 8659739f5f9SChristian Marangi .cra_flags = CRYPTO_ALG_ASYNC | 8669739f5f9SChristian Marangi CRYPTO_ALG_KERN_DRIVER_ONLY | 8679739f5f9SChristian Marangi CRYPTO_ALG_ALLOCATES_MEMORY, 8689739f5f9SChristian Marangi .cra_blocksize = SHA256_BLOCK_SIZE, 8699739f5f9SChristian Marangi .cra_ctxsize = sizeof(struct eip93_hash_ctx), 8709739f5f9SChristian Marangi .cra_init = eip93_hash_cra_init, 8719739f5f9SChristian Marangi .cra_module = THIS_MODULE, 8729739f5f9SChristian Marangi }, 8739739f5f9SChristian Marangi }, 8749739f5f9SChristian Marangi }, 8759739f5f9SChristian Marangi }; 876