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