Lines Matching +full:sha3 +full:- +full:512

1 // SPDX-License-Identifier: GPL-2.0
5 * Antoine Tenart <antoine.tenart@free-electrons.com>
13 #include <crypto/sha3.h>
18 #include <linux/dma-mapping.h>
72 return req->len - req->processed; in safexcel_queued_len()
80 (struct safexcel_token *)cdesc->control_data.token; in safexcel_hash_token()
90 token[1].packet_length = 16 - input_length; in safexcel_hash_token()
112 struct safexcel_crypto_priv *priv = ctx->base.priv; in safexcel_context_control()
115 cdesc->control_data.control0 = ctx->alg; in safexcel_context_control()
116 cdesc->control_data.control1 = 0; in safexcel_context_control()
123 if (unlikely(req->digest == CONTEXT_CONTROL_DIGEST_XCM)) { in safexcel_context_control()
124 if (req->xcbcmac) in safexcel_context_control()
125 memcpy(ctx->base.ctxr->data, &ctx->base.ipad, ctx->key_sz); in safexcel_context_control()
127 memcpy(ctx->base.ctxr->data, req->state, req->state_sz); in safexcel_context_control()
129 if (!req->finish && req->xcbcmac) in safexcel_context_control()
130 cdesc->control_data.control0 |= in safexcel_context_control()
134 CONTEXT_CONTROL_SIZE(req->state_sz / in safexcel_context_control()
137 cdesc->control_data.control0 |= in safexcel_context_control()
140 CONTEXT_CONTROL_SIZE(req->state_sz / in safexcel_context_control()
143 } else if (!req->processed) { in safexcel_context_control()
144 /* First - and possibly only - block of basic hash only */ in safexcel_context_control()
145 if (req->finish) in safexcel_context_control()
146 cdesc->control_data.control0 |= req->digest | in safexcel_context_control()
152 cdesc->control_data.control0 |= req->digest | in safexcel_context_control()
162 memcpy(ctx->base.ctxr->data, req->state, req->state_sz); in safexcel_context_control()
164 if (req->finish) { in safexcel_context_control()
166 if ((req->digest == CONTEXT_CONTROL_DIGEST_PRECOMPUTED) || in safexcel_context_control()
167 req->hmac_zlen || (req->processed != req->block_sz)) { in safexcel_context_control()
168 count = req->processed / EIP197_COUNTER_BLOCK_SIZE; in safexcel_context_control()
176 dev_warn(priv->dev, in safexcel_context_control()
182 if ((req->digest == CONTEXT_CONTROL_DIGEST_PRECOMPUTED) || in safexcel_context_control()
184 req->hmac_zlen || in safexcel_context_control()
186 (req->processed != req->block_sz)) { in safexcel_context_control()
188 cdesc->control_data.control0 |= in safexcel_context_control()
189 CONTEXT_CONTROL_SIZE((req->state_sz >> 2) + 1) | in safexcel_context_control()
192 /* For zero-len HMAC, don't finalize, already padded! */ in safexcel_context_control()
193 if (req->hmac_zlen) in safexcel_context_control()
194 cdesc->control_data.control0 |= in safexcel_context_control()
196 cdesc->control_data.control1 |= in safexcel_context_control()
198 ctx->base.ctxr->data[req->state_sz >> 2] = in safexcel_context_control()
200 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_context_control()
202 /* Clear zero-length HMAC flag for next operation! */ in safexcel_context_control()
203 req->hmac_zlen = false; in safexcel_context_control()
206 memcpy(ctx->base.ctxr->data + (req->state_sz >> 2), in safexcel_context_control()
207 &ctx->base.opad, req->state_sz); in safexcel_context_control()
209 /* Single pass HMAC - no digest count */ in safexcel_context_control()
210 cdesc->control_data.control0 |= in safexcel_context_control()
211 CONTEXT_CONTROL_SIZE(req->state_sz >> 1) | in safexcel_context_control()
216 cdesc->control_data.control0 |= in safexcel_context_control()
217 CONTEXT_CONTROL_SIZE(req->state_sz >> 2) | in safexcel_context_control()
240 rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); in safexcel_handle_req_result()
242 dev_err(priv->dev, in safexcel_handle_req_result()
251 if (sreq->nents) { in safexcel_handle_req_result()
252 dma_unmap_sg(priv->dev, areq->src, sreq->nents, DMA_TO_DEVICE); in safexcel_handle_req_result()
253 sreq->nents = 0; in safexcel_handle_req_result()
256 if (sreq->result_dma) { in safexcel_handle_req_result()
257 dma_unmap_single(priv->dev, sreq->result_dma, sreq->digest_sz, in safexcel_handle_req_result()
259 sreq->result_dma = 0; in safexcel_handle_req_result()
262 if (sreq->cache_dma) { in safexcel_handle_req_result()
263 dma_unmap_single(priv->dev, sreq->cache_dma, sreq->cache_sz, in safexcel_handle_req_result()
265 sreq->cache_dma = 0; in safexcel_handle_req_result()
266 sreq->cache_sz = 0; in safexcel_handle_req_result()
269 if (sreq->finish) { in safexcel_handle_req_result()
270 if (sreq->hmac && in safexcel_handle_req_result()
271 (sreq->digest != CONTEXT_CONTROL_DIGEST_HMAC)) { in safexcel_handle_req_result()
272 /* Faking HMAC using hash - need to do outer hash */ in safexcel_handle_req_result()
273 memcpy(sreq->cache, sreq->state, in safexcel_handle_req_result()
276 memcpy(sreq->state, &ctx->base.opad, sreq->digest_sz); in safexcel_handle_req_result()
278 sreq->len = sreq->block_sz + in safexcel_handle_req_result()
280 sreq->processed = sreq->block_sz; in safexcel_handle_req_result()
281 sreq->hmac = 0; in safexcel_handle_req_result()
283 if (priv->flags & EIP197_TRC_CACHE) in safexcel_handle_req_result()
284 ctx->base.needs_inv = true; in safexcel_handle_req_result()
285 areq->nbytes = 0; in safexcel_handle_req_result()
292 if (unlikely(sreq->digest == CONTEXT_CONTROL_DIGEST_XCM && in safexcel_handle_req_result()
293 ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_CRC32)) { in safexcel_handle_req_result()
295 *(__le32 *)areq->result = ~sreq->state[0]; in safexcel_handle_req_result()
297 memcpy(areq->result, sreq->state, in safexcel_handle_req_result()
304 memcpy(sreq->cache, sreq->cache_next, cache_len); in safexcel_handle_req_result()
317 struct safexcel_crypto_priv *priv = ctx->base.priv; in safexcel_ahash_send_req()
329 cache_len = queued - areq->nbytes; in safexcel_ahash_send_req()
331 if (!req->finish && !req->last_req) { in safexcel_ahash_send_req()
335 extra = queued & (HASH_CACHE_SIZE - 1); in safexcel_ahash_send_req()
343 sg_pcopy_to_buffer(areq->src, sg_nents(areq->src), in safexcel_ahash_send_req()
344 req->cache_next, extra, in safexcel_ahash_send_req()
345 areq->nbytes - extra); in safexcel_ahash_send_req()
347 queued -= extra; in safexcel_ahash_send_req()
358 if (unlikely(req->xcbcmac && req->processed > AES_BLOCK_SIZE)) { in safexcel_ahash_send_req()
363 extra = AES_BLOCK_SIZE - cache_len; in safexcel_ahash_send_req()
366 u64 tmp = queued - cache_len; in safexcel_ahash_send_req()
369 sg_pcopy_to_buffer(areq->src, in safexcel_ahash_send_req()
370 sg_nents(areq->src), in safexcel_ahash_send_req()
371 req->cache + cache_len, in safexcel_ahash_send_req()
374 extra -= skip; in safexcel_ahash_send_req()
375 memset(req->cache + cache_len + skip, 0, extra); in safexcel_ahash_send_req()
376 if (!ctx->cbcmac && extra) { in safexcel_ahash_send_req()
377 // 10- padding for XCBCMAC & CMAC in safexcel_ahash_send_req()
378 req->cache[cache_len + skip] = 0x80; in safexcel_ahash_send_req()
379 // HW will use K2 iso K3 - compensate! in safexcel_ahash_send_req()
381 u32 *cache = (void *)req->cache; in safexcel_ahash_send_req()
382 u32 *ipad = ctx->base.ipad.word; in safexcel_ahash_send_req()
394 crypto_xor(req->cache, (const u8 *)req->state, AES_BLOCK_SIZE); in safexcel_ahash_send_req()
400 req->cache_dma = dma_map_single(priv->dev, req->cache, in safexcel_ahash_send_req()
402 if (dma_mapping_error(priv->dev, req->cache_dma)) in safexcel_ahash_send_req()
403 return -EINVAL; in safexcel_ahash_send_req()
405 req->cache_sz = cache_len; in safexcel_ahash_send_req()
408 req->cache_dma, cache_len, in safexcel_ahash_send_req()
409 len, ctx->base.ctxr_dma, in safexcel_ahash_send_req()
417 queued -= cache_len; in safexcel_ahash_send_req()
423 req->nents = dma_map_sg(priv->dev, areq->src, in safexcel_ahash_send_req()
424 sg_nents_for_len(areq->src, in safexcel_ahash_send_req()
425 areq->nbytes), in safexcel_ahash_send_req()
427 if (!req->nents) { in safexcel_ahash_send_req()
428 ret = -ENOMEM; in safexcel_ahash_send_req()
432 for_each_sg(areq->src, sg, req->nents, i) { in safexcel_ahash_send_req()
436 skip -= sglen; in safexcel_ahash_send_req()
444 sglen -= skip; in safexcel_ahash_send_req()
447 !(queued - sglen), in safexcel_ahash_send_req()
449 len, ctx->base.ctxr_dma, &dmmy); in safexcel_ahash_send_req()
459 queued -= sglen; in safexcel_ahash_send_req()
470 safexcel_hash_token(first_cdesc, len, req->digest_sz, ctx->cbcmac); in safexcel_ahash_send_req()
472 req->result_dma = dma_map_single(priv->dev, req->state, req->digest_sz, in safexcel_ahash_send_req()
474 if (dma_mapping_error(priv->dev, req->result_dma)) { in safexcel_ahash_send_req()
475 ret = -EINVAL; in safexcel_ahash_send_req()
480 rdesc = safexcel_add_rdesc(priv, ring, 1, 1, req->result_dma, in safexcel_ahash_send_req()
481 req->digest_sz); in safexcel_ahash_send_req()
487 safexcel_rdr_req_set(priv, ring, rdesc, &areq->base); in safexcel_ahash_send_req()
489 req->processed += len - extra; in safexcel_ahash_send_req()
496 dma_unmap_single(priv->dev, req->result_dma, req->digest_sz, in safexcel_ahash_send_req()
499 if (req->nents) { in safexcel_ahash_send_req()
500 dma_unmap_sg(priv->dev, areq->src, req->nents, DMA_TO_DEVICE); in safexcel_ahash_send_req()
501 req->nents = 0; in safexcel_ahash_send_req()
505 safexcel_ring_rollback_wptr(priv, &priv->ring[ring].cdr); in safexcel_ahash_send_req()
507 if (req->cache_dma) { in safexcel_ahash_send_req()
508 dma_unmap_single(priv->dev, req->cache_dma, req->cache_sz, in safexcel_ahash_send_req()
510 req->cache_dma = 0; in safexcel_ahash_send_req()
511 req->cache_sz = 0; in safexcel_ahash_send_req()
530 rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); in safexcel_handle_inv_result()
532 dev_err(priv->dev, in safexcel_handle_inv_result()
541 if (ctx->base.exit_inv) { in safexcel_handle_inv_result()
542 dma_pool_free(priv->context_pool, ctx->base.ctxr, in safexcel_handle_inv_result()
543 ctx->base.ctxr_dma); in safexcel_handle_inv_result()
550 ctx->base.ring = ring; in safexcel_handle_inv_result()
552 spin_lock_bh(&priv->ring[ring].queue_lock); in safexcel_handle_inv_result()
553 enq_ret = crypto_enqueue_request(&priv->ring[ring].queue, async); in safexcel_handle_inv_result()
554 spin_unlock_bh(&priv->ring[ring].queue_lock); in safexcel_handle_inv_result()
556 if (enq_ret != -EINPROGRESS) in safexcel_handle_inv_result()
559 queue_work(priv->ring[ring].workqueue, in safexcel_handle_inv_result()
560 &priv->ring[ring].work_data.work); in safexcel_handle_inv_result()
575 BUG_ON(!(priv->flags & EIP197_TRC_CACHE) && req->needs_inv); in safexcel_handle_result()
577 if (req->needs_inv) { in safexcel_handle_result()
578 req->needs_inv = false; in safexcel_handle_result()
596 ret = safexcel_invalidate_cache(async, ctx->base.priv, in safexcel_ahash_send_inv()
597 ctx->base.ctxr_dma, ring); in safexcel_ahash_send_inv()
614 if (req->needs_inv) in safexcel_ahash_send()
625 struct safexcel_crypto_priv *priv = ctx->base.priv; in safexcel_ahash_exit_inv()
629 int ring = ctx->base.ring; in safexcel_ahash_exit_inv()
640 ctx = crypto_tfm_ctx(req->base.tfm); in safexcel_ahash_exit_inv()
641 ctx->base.exit_inv = true; in safexcel_ahash_exit_inv()
642 rctx->needs_inv = true; in safexcel_ahash_exit_inv()
644 spin_lock_bh(&priv->ring[ring].queue_lock); in safexcel_ahash_exit_inv()
645 crypto_enqueue_request(&priv->ring[ring].queue, &req->base); in safexcel_ahash_exit_inv()
646 spin_unlock_bh(&priv->ring[ring].queue_lock); in safexcel_ahash_exit_inv()
648 queue_work(priv->ring[ring].workqueue, in safexcel_ahash_exit_inv()
649 &priv->ring[ring].work_data.work); in safexcel_ahash_exit_inv()
651 err = crypto_wait_req(-EINPROGRESS, &result); in safexcel_ahash_exit_inv()
654 dev_warn(priv->dev, "hash: completion error (%d)\n", err); in safexcel_ahash_exit_inv()
670 * tot sz handled by update() - last req sz - tot sz handled by send() in safexcel_ahash_cache()
678 if (cache_len + areq->nbytes <= HASH_CACHE_SIZE) { in safexcel_ahash_cache()
679 sg_pcopy_to_buffer(areq->src, sg_nents(areq->src), in safexcel_ahash_cache()
680 req->cache + cache_len, in safexcel_ahash_cache()
681 areq->nbytes, 0); in safexcel_ahash_cache()
686 return -E2BIG; in safexcel_ahash_cache()
693 struct safexcel_crypto_priv *priv = ctx->base.priv; in safexcel_ahash_enqueue()
696 req->needs_inv = false; in safexcel_ahash_enqueue()
698 if (ctx->base.ctxr) { in safexcel_ahash_enqueue()
699 if (priv->flags & EIP197_TRC_CACHE && !ctx->base.needs_inv && in safexcel_ahash_enqueue()
700 /* invalidate for *any* non-XCBC continuation */ in safexcel_ahash_enqueue()
701 ((req->not_first && !req->xcbcmac) || in safexcel_ahash_enqueue()
703 memcmp(ctx->base.ctxr->data, req->state, req->state_sz) || in safexcel_ahash_enqueue()
705 (req->finish && req->hmac && in safexcel_ahash_enqueue()
706 memcmp(ctx->base.ctxr->data + (req->state_sz>>2), in safexcel_ahash_enqueue()
707 &ctx->base.opad, req->state_sz)))) in safexcel_ahash_enqueue()
714 ctx->base.needs_inv = true; in safexcel_ahash_enqueue()
716 if (ctx->base.needs_inv) { in safexcel_ahash_enqueue()
717 ctx->base.needs_inv = false; in safexcel_ahash_enqueue()
718 req->needs_inv = true; in safexcel_ahash_enqueue()
721 ctx->base.ring = safexcel_select_ring(priv); in safexcel_ahash_enqueue()
722 ctx->base.ctxr = dma_pool_zalloc(priv->context_pool, in safexcel_ahash_enqueue()
723 EIP197_GFP_FLAGS(areq->base), in safexcel_ahash_enqueue()
724 &ctx->base.ctxr_dma); in safexcel_ahash_enqueue()
725 if (!ctx->base.ctxr) in safexcel_ahash_enqueue()
726 return -ENOMEM; in safexcel_ahash_enqueue()
728 req->not_first = true; in safexcel_ahash_enqueue()
730 ring = ctx->base.ring; in safexcel_ahash_enqueue()
732 spin_lock_bh(&priv->ring[ring].queue_lock); in safexcel_ahash_enqueue()
733 ret = crypto_enqueue_request(&priv->ring[ring].queue, &areq->base); in safexcel_ahash_enqueue()
734 spin_unlock_bh(&priv->ring[ring].queue_lock); in safexcel_ahash_enqueue()
736 queue_work(priv->ring[ring].workqueue, in safexcel_ahash_enqueue()
737 &priv->ring[ring].work_data.work); in safexcel_ahash_enqueue()
748 if (!areq->nbytes) in safexcel_ahash_update()
755 req->len += areq->nbytes; in safexcel_ahash_update()
761 if ((ret && !req->finish) || req->last_req) in safexcel_ahash_update()
772 req->finish = true; in safexcel_ahash_final()
774 if (unlikely(!req->len && !areq->nbytes)) { in safexcel_ahash_final()
780 if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_MD5) in safexcel_ahash_final()
781 memcpy(areq->result, md5_zero_message_hash, in safexcel_ahash_final()
783 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SHA1) in safexcel_ahash_final()
784 memcpy(areq->result, sha1_zero_message_hash, in safexcel_ahash_final()
786 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SHA224) in safexcel_ahash_final()
787 memcpy(areq->result, sha224_zero_message_hash, in safexcel_ahash_final()
789 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SHA256) in safexcel_ahash_final()
790 memcpy(areq->result, sha256_zero_message_hash, in safexcel_ahash_final()
792 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SHA384) in safexcel_ahash_final()
793 memcpy(areq->result, sha384_zero_message_hash, in safexcel_ahash_final()
795 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SHA512) in safexcel_ahash_final()
796 memcpy(areq->result, sha512_zero_message_hash, in safexcel_ahash_final()
798 else if (ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_SM3) { in safexcel_ahash_final()
799 memcpy(areq->result, in safexcel_ahash_final()
804 } else if (unlikely(req->digest == CONTEXT_CONTROL_DIGEST_XCM && in safexcel_ahash_final()
805 ctx->alg == CONTEXT_CONTROL_CRYPTO_ALG_MD5 && in safexcel_ahash_final()
806 req->len == sizeof(u32) && !areq->nbytes)) { in safexcel_ahash_final()
808 memcpy(areq->result, &ctx->base.ipad, sizeof(u32)); in safexcel_ahash_final()
810 } else if (unlikely(ctx->cbcmac && req->len == AES_BLOCK_SIZE && in safexcel_ahash_final()
811 !areq->nbytes)) { in safexcel_ahash_final()
813 memset(areq->result, 0, AES_BLOCK_SIZE); in safexcel_ahash_final()
815 } else if (unlikely(req->xcbcmac && req->len == AES_BLOCK_SIZE && in safexcel_ahash_final()
816 !areq->nbytes)) { in safexcel_ahash_final()
821 u32 *result = (void *)areq->result; in safexcel_ahash_final()
824 result[i] = swab32(ctx->base.ipad.word[i + 4]); in safexcel_ahash_final()
826 areq->result[0] ^= 0x80; // 10- padding in safexcel_ahash_final()
827 aes_encrypt(ctx->aes, areq->result, areq->result); in safexcel_ahash_final()
829 } else if (unlikely(req->hmac && in safexcel_ahash_final()
830 (req->len == req->block_sz) && in safexcel_ahash_final()
831 !areq->nbytes)) { in safexcel_ahash_final()
840 memset(req->cache, 0, req->block_sz); in safexcel_ahash_final()
842 req->cache[0] = 0x80; in safexcel_ahash_final()
844 if (req->len_is_le) { in safexcel_ahash_final()
846 req->cache[req->block_sz-8] = (req->block_sz << 3) & in safexcel_ahash_final()
848 req->cache[req->block_sz-7] = (req->block_sz >> 5); in safexcel_ahash_final()
851 req->cache[req->block_sz-2] = (req->block_sz >> 5); in safexcel_ahash_final()
852 req->cache[req->block_sz-1] = (req->block_sz << 3) & in safexcel_ahash_final()
856 req->len += req->block_sz; /* plus 1 hash block */ in safexcel_ahash_final()
858 /* Set special zero-length HMAC flag */ in safexcel_ahash_final()
859 req->hmac_zlen = true; in safexcel_ahash_final()
862 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_ahash_final()
863 } else if (req->hmac) { in safexcel_ahash_final()
865 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_ahash_final()
875 req->finish = true; in safexcel_ahash_finup()
886 export->len = req->len; in safexcel_ahash_export()
887 export->processed = req->processed; in safexcel_ahash_export()
889 export->digest = req->digest; in safexcel_ahash_export()
891 memcpy(export->state, req->state, req->state_sz); in safexcel_ahash_export()
892 memcpy(export->cache, req->cache, HASH_CACHE_SIZE); in safexcel_ahash_export()
907 req->len = export->len; in safexcel_ahash_import()
908 req->processed = export->processed; in safexcel_ahash_import()
910 req->digest = export->digest; in safexcel_ahash_import()
912 memcpy(req->cache, export->cache, HASH_CACHE_SIZE); in safexcel_ahash_import()
913 memcpy(req->state, export->state, req->state_sz); in safexcel_ahash_import()
922 container_of(__crypto_ahash_alg(tfm->__crt_alg), in safexcel_ahash_cra_init()
925 ctx->base.priv = tmpl->priv; in safexcel_ahash_cra_init()
926 ctx->base.send = safexcel_ahash_send; in safexcel_ahash_cra_init()
927 ctx->base.handle_result = safexcel_handle_result; in safexcel_ahash_cra_init()
928 ctx->fb_do_setkey = false; in safexcel_ahash_cra_init()
942 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA1; in safexcel_sha1_init()
943 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sha1_init()
944 req->state_sz = SHA1_DIGEST_SIZE; in safexcel_sha1_init()
945 req->digest_sz = SHA1_DIGEST_SIZE; in safexcel_sha1_init()
946 req->block_sz = SHA1_BLOCK_SIZE; in safexcel_sha1_init()
964 struct safexcel_crypto_priv *priv = ctx->base.priv; in safexcel_ahash_cra_exit()
968 if (!ctx->base.ctxr) in safexcel_ahash_cra_exit()
971 if (priv->flags & EIP197_TRC_CACHE) { in safexcel_ahash_cra_exit()
974 dev_warn(priv->dev, "hash: invalidation error %d\n", ret); in safexcel_ahash_cra_exit()
976 dma_pool_free(priv->context_pool, ctx->base.ctxr, in safexcel_ahash_cra_exit()
977 ctx->base.ctxr_dma); in safexcel_ahash_cra_exit()
997 .cra_driver_name = "safexcel-sha1",
1020 memcpy(req->state, &ctx->base.ipad, SHA1_DIGEST_SIZE); in safexcel_hmac_sha1_init()
1022 req->len = SHA1_BLOCK_SIZE; in safexcel_hmac_sha1_init()
1023 req->processed = SHA1_BLOCK_SIZE; in safexcel_hmac_sha1_init()
1025 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA1; in safexcel_hmac_sha1_init()
1026 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sha1_init()
1027 req->state_sz = SHA1_DIGEST_SIZE; in safexcel_hmac_sha1_init()
1028 req->digest_sz = SHA1_DIGEST_SIZE; in safexcel_hmac_sha1_init()
1029 req->block_sz = SHA1_BLOCK_SIZE; in safexcel_hmac_sha1_init()
1030 req->hmac = true; in safexcel_hmac_sha1_init()
1059 return -ENOMEM; in safexcel_hmac_init_pad()
1078 memset(ipad + keylen, 0, blocksize - keylen); in safexcel_hmac_init_pad()
1107 req->hmac = true; in safexcel_hmac_init_iv()
1108 req->last_req = true; in safexcel_hmac_init_iv()
1132 ret = -ENOMEM; in __safexcel_hmac_setkey()
1141 ret = -ENOMEM; in __safexcel_hmac_setkey()
1171 struct safexcel_crypto_priv *priv = base->priv; in safexcel_hmac_setkey()
1179 if (priv->flags & EIP197_TRC_CACHE && base->ctxr && in safexcel_hmac_setkey()
1180 (memcmp(&base->ipad, istate.state, state_sz) || in safexcel_hmac_setkey()
1181 memcmp(&base->opad, ostate.state, state_sz))) in safexcel_hmac_setkey()
1182 base->needs_inv = true; in safexcel_hmac_setkey()
1184 memcpy(&base->ipad, &istate.state, state_sz); in safexcel_hmac_setkey()
1185 memcpy(&base->opad, &ostate.state, state_sz); in safexcel_hmac_setkey()
1196 return safexcel_hmac_setkey(&ctx->base, key, keylen, alg, state_sz); in safexcel_hmac_alg_setkey()
1202 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sha1", in safexcel_hmac_sha1_setkey()
1223 .cra_driver_name = "safexcel-hmac-sha1",
1245 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA256; in safexcel_sha256_init()
1246 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sha256_init()
1247 req->state_sz = SHA256_DIGEST_SIZE; in safexcel_sha256_init()
1248 req->digest_sz = SHA256_DIGEST_SIZE; in safexcel_sha256_init()
1249 req->block_sz = SHA256_BLOCK_SIZE; in safexcel_sha256_init()
1280 .cra_driver_name = "safexcel-sha256",
1302 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA224; in safexcel_sha224_init()
1303 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sha224_init()
1304 req->state_sz = SHA256_DIGEST_SIZE; in safexcel_sha224_init()
1305 req->digest_sz = SHA256_DIGEST_SIZE; in safexcel_sha224_init()
1306 req->block_sz = SHA256_BLOCK_SIZE; in safexcel_sha224_init()
1337 .cra_driver_name = "safexcel-sha224",
1355 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sha224", in safexcel_hmac_sha224_setkey()
1367 memcpy(req->state, &ctx->base.ipad, SHA256_DIGEST_SIZE); in safexcel_hmac_sha224_init()
1369 req->len = SHA256_BLOCK_SIZE; in safexcel_hmac_sha224_init()
1370 req->processed = SHA256_BLOCK_SIZE; in safexcel_hmac_sha224_init()
1372 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA224; in safexcel_hmac_sha224_init()
1373 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sha224_init()
1374 req->state_sz = SHA256_DIGEST_SIZE; in safexcel_hmac_sha224_init()
1375 req->digest_sz = SHA256_DIGEST_SIZE; in safexcel_hmac_sha224_init()
1376 req->block_sz = SHA256_BLOCK_SIZE; in safexcel_hmac_sha224_init()
1377 req->hmac = true; in safexcel_hmac_sha224_init()
1409 .cra_driver_name = "safexcel-hmac-sha224",
1427 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sha256", in safexcel_hmac_sha256_setkey()
1439 memcpy(req->state, &ctx->base.ipad, SHA256_DIGEST_SIZE); in safexcel_hmac_sha256_init()
1441 req->len = SHA256_BLOCK_SIZE; in safexcel_hmac_sha256_init()
1442 req->processed = SHA256_BLOCK_SIZE; in safexcel_hmac_sha256_init()
1444 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA256; in safexcel_hmac_sha256_init()
1445 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sha256_init()
1446 req->state_sz = SHA256_DIGEST_SIZE; in safexcel_hmac_sha256_init()
1447 req->digest_sz = SHA256_DIGEST_SIZE; in safexcel_hmac_sha256_init()
1448 req->block_sz = SHA256_BLOCK_SIZE; in safexcel_hmac_sha256_init()
1449 req->hmac = true; in safexcel_hmac_sha256_init()
1481 .cra_driver_name = "safexcel-hmac-sha256",
1503 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA512; in safexcel_sha512_init()
1504 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sha512_init()
1505 req->state_sz = SHA512_DIGEST_SIZE; in safexcel_sha512_init()
1506 req->digest_sz = SHA512_DIGEST_SIZE; in safexcel_sha512_init()
1507 req->block_sz = SHA512_BLOCK_SIZE; in safexcel_sha512_init()
1538 .cra_driver_name = "safexcel-sha512",
1560 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA384; in safexcel_sha384_init()
1561 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sha384_init()
1562 req->state_sz = SHA512_DIGEST_SIZE; in safexcel_sha384_init()
1563 req->digest_sz = SHA512_DIGEST_SIZE; in safexcel_sha384_init()
1564 req->block_sz = SHA512_BLOCK_SIZE; in safexcel_sha384_init()
1595 .cra_driver_name = "safexcel-sha384",
1613 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sha512", in safexcel_hmac_sha512_setkey()
1625 memcpy(req->state, &ctx->base.ipad, SHA512_DIGEST_SIZE); in safexcel_hmac_sha512_init()
1627 req->len = SHA512_BLOCK_SIZE; in safexcel_hmac_sha512_init()
1628 req->processed = SHA512_BLOCK_SIZE; in safexcel_hmac_sha512_init()
1630 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA512; in safexcel_hmac_sha512_init()
1631 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sha512_init()
1632 req->state_sz = SHA512_DIGEST_SIZE; in safexcel_hmac_sha512_init()
1633 req->digest_sz = SHA512_DIGEST_SIZE; in safexcel_hmac_sha512_init()
1634 req->block_sz = SHA512_BLOCK_SIZE; in safexcel_hmac_sha512_init()
1635 req->hmac = true; in safexcel_hmac_sha512_init()
1667 .cra_driver_name = "safexcel-hmac-sha512",
1685 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sha384", in safexcel_hmac_sha384_setkey()
1697 memcpy(req->state, &ctx->base.ipad, SHA512_DIGEST_SIZE); in safexcel_hmac_sha384_init()
1699 req->len = SHA512_BLOCK_SIZE; in safexcel_hmac_sha384_init()
1700 req->processed = SHA512_BLOCK_SIZE; in safexcel_hmac_sha384_init()
1702 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA384; in safexcel_hmac_sha384_init()
1703 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sha384_init()
1704 req->state_sz = SHA512_DIGEST_SIZE; in safexcel_hmac_sha384_init()
1705 req->digest_sz = SHA512_DIGEST_SIZE; in safexcel_hmac_sha384_init()
1706 req->block_sz = SHA512_BLOCK_SIZE; in safexcel_hmac_sha384_init()
1707 req->hmac = true; in safexcel_hmac_sha384_init()
1739 .cra_driver_name = "safexcel-hmac-sha384",
1761 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_MD5; in safexcel_md5_init()
1762 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_md5_init()
1763 req->state_sz = MD5_DIGEST_SIZE; in safexcel_md5_init()
1764 req->digest_sz = MD5_DIGEST_SIZE; in safexcel_md5_init()
1765 req->block_sz = MD5_HMAC_BLOCK_SIZE; in safexcel_md5_init()
1796 .cra_driver_name = "safexcel-md5",
1819 memcpy(req->state, &ctx->base.ipad, MD5_DIGEST_SIZE); in safexcel_hmac_md5_init()
1821 req->len = MD5_HMAC_BLOCK_SIZE; in safexcel_hmac_md5_init()
1822 req->processed = MD5_HMAC_BLOCK_SIZE; in safexcel_hmac_md5_init()
1824 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_MD5; in safexcel_hmac_md5_init()
1825 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_md5_init()
1826 req->state_sz = MD5_DIGEST_SIZE; in safexcel_hmac_md5_init()
1827 req->digest_sz = MD5_DIGEST_SIZE; in safexcel_hmac_md5_init()
1828 req->block_sz = MD5_HMAC_BLOCK_SIZE; in safexcel_hmac_md5_init()
1829 req->len_is_le = true; /* MD5 is little endian! ... */ in safexcel_hmac_md5_init()
1830 req->hmac = true; in safexcel_hmac_md5_init()
1838 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-md5", in safexcel_hmac_md5_setkey()
1869 .cra_driver_name = "safexcel-hmac-md5",
1890 memset(&ctx->base.ipad, 0, sizeof(u32)); in safexcel_crc32_cra_init()
1902 req->state[0] = cpu_to_le32(~ctx->base.ipad.word[0]); in safexcel_crc32_init()
1903 /* Set processed to non-zero to enable invalidation detection */ in safexcel_crc32_init()
1904 req->len = sizeof(u32); in safexcel_crc32_init()
1905 req->processed = sizeof(u32); in safexcel_crc32_init()
1907 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_CRC32; in safexcel_crc32_init()
1908 req->digest = CONTEXT_CONTROL_DIGEST_XCM; in safexcel_crc32_init()
1909 req->state_sz = sizeof(u32); in safexcel_crc32_init()
1910 req->digest_sz = sizeof(u32); in safexcel_crc32_init()
1911 req->block_sz = sizeof(u32); in safexcel_crc32_init()
1922 return -EINVAL; in safexcel_crc32_setkey()
1924 memcpy(&ctx->base.ipad, key, sizeof(u32)); in safexcel_crc32_setkey()
1950 .cra_driver_name = "safexcel-crc32",
1974 memcpy(req->state, &ctx->base.ipad, ctx->key_sz); in safexcel_cbcmac_init()
1975 /* Set processed to non-zero to enable invalidation detection */ in safexcel_cbcmac_init()
1976 req->len = AES_BLOCK_SIZE; in safexcel_cbcmac_init()
1977 req->processed = AES_BLOCK_SIZE; in safexcel_cbcmac_init()
1979 req->digest = CONTEXT_CONTROL_DIGEST_XCM; in safexcel_cbcmac_init()
1980 req->state_sz = ctx->key_sz; in safexcel_cbcmac_init()
1981 req->digest_sz = AES_BLOCK_SIZE; in safexcel_cbcmac_init()
1982 req->block_sz = AES_BLOCK_SIZE; in safexcel_cbcmac_init()
1983 req->xcbcmac = true; in safexcel_cbcmac_init()
1999 memset(&ctx->base.ipad, 0, 2 * AES_BLOCK_SIZE); in safexcel_cbcmac_setkey()
2001 ctx->base.ipad.be[i + 8] = cpu_to_be32(aes.key_enc[i]); in safexcel_cbcmac_setkey()
2004 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC192; in safexcel_cbcmac_setkey()
2005 ctx->key_sz = AES_MAX_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cbcmac_setkey()
2007 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC256; in safexcel_cbcmac_setkey()
2008 ctx->key_sz = AES_MAX_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cbcmac_setkey()
2010 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128; in safexcel_cbcmac_setkey()
2011 ctx->key_sz = AES_MIN_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cbcmac_setkey()
2013 ctx->cbcmac = true; in safexcel_cbcmac_setkey()
2041 .cra_driver_name = "safexcel-cbcmac-aes",
2063 ret = aes_expandkey(ctx->aes, key, len); in safexcel_xcbcmac_setkey()
2068 aes_encrypt(ctx->aes, (u8 *)key_tmp + 2 * AES_BLOCK_SIZE, in safexcel_xcbcmac_setkey()
2070 aes_encrypt(ctx->aes, (u8 *)key_tmp, in safexcel_xcbcmac_setkey()
2072 aes_encrypt(ctx->aes, (u8 *)key_tmp + AES_BLOCK_SIZE, in safexcel_xcbcmac_setkey()
2075 ctx->base.ipad.word[i] = swab32(key_tmp[i]); in safexcel_xcbcmac_setkey()
2077 ret = aes_expandkey(ctx->aes, in safexcel_xcbcmac_setkey()
2083 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128; in safexcel_xcbcmac_setkey()
2084 ctx->key_sz = AES_MIN_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_xcbcmac_setkey()
2085 ctx->cbcmac = false; in safexcel_xcbcmac_setkey()
2095 ctx->aes = kmalloc(sizeof(*ctx->aes), GFP_KERNEL); in safexcel_xcbcmac_cra_init()
2096 return ctx->aes == NULL ? -ENOMEM : 0; in safexcel_xcbcmac_cra_init()
2103 kfree(ctx->aes); in safexcel_xcbcmac_cra_exit()
2124 .cra_driver_name = "safexcel-xcbc-aes",
2149 ret = aes_expandkey(ctx->aes, key, len); in safexcel_cmac_setkey()
2154 ctx->base.ipad.word[i + 8] = swab32(ctx->aes->key_enc[i]); in safexcel_cmac_setkey()
2159 aes_encrypt(ctx->aes, (u8 *)consts, (u8 *)consts); in safexcel_cmac_setkey()
2165 /* gf(2^128) multiply zero-ciphertext with u and u^2 */ in safexcel_cmac_setkey()
2177 ctx->base.ipad.be[i] = cpu_to_be32(((u32 *)consts)[i]); in safexcel_cmac_setkey()
2180 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC192; in safexcel_cmac_setkey()
2181 ctx->key_sz = AES_MAX_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cmac_setkey()
2183 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC256; in safexcel_cmac_setkey()
2184 ctx->key_sz = AES_MAX_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cmac_setkey()
2186 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128; in safexcel_cmac_setkey()
2187 ctx->key_sz = AES_MIN_KEY_SIZE + 2 * AES_BLOCK_SIZE; in safexcel_cmac_setkey()
2189 ctx->cbcmac = false; in safexcel_cmac_setkey()
2211 .cra_driver_name = "safexcel-cmac-aes",
2233 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SM3; in safexcel_sm3_init()
2234 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_sm3_init()
2235 req->state_sz = SM3_DIGEST_SIZE; in safexcel_sm3_init()
2236 req->digest_sz = SM3_DIGEST_SIZE; in safexcel_sm3_init()
2237 req->block_sz = SM3_BLOCK_SIZE; in safexcel_sm3_init()
2268 .cra_driver_name = "safexcel-sm3",
2286 return safexcel_hmac_alg_setkey(tfm, key, keylen, "safexcel-sm3", in safexcel_hmac_sm3_setkey()
2298 memcpy(req->state, &ctx->base.ipad, SM3_DIGEST_SIZE); in safexcel_hmac_sm3_init()
2300 req->len = SM3_BLOCK_SIZE; in safexcel_hmac_sm3_init()
2301 req->processed = SM3_BLOCK_SIZE; in safexcel_hmac_sm3_init()
2303 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SM3; in safexcel_hmac_sm3_init()
2304 req->digest = CONTEXT_CONTROL_DIGEST_PRECOMPUTED; in safexcel_hmac_sm3_init()
2305 req->state_sz = SM3_DIGEST_SIZE; in safexcel_hmac_sm3_init()
2306 req->digest_sz = SM3_DIGEST_SIZE; in safexcel_hmac_sm3_init()
2307 req->block_sz = SM3_BLOCK_SIZE; in safexcel_hmac_sm3_init()
2308 req->hmac = true; in safexcel_hmac_sm3_init()
2340 .cra_driver_name = "safexcel-hmac-sm3",
2363 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_224; in safexcel_sha3_224_init()
2364 req->digest = CONTEXT_CONTROL_DIGEST_INITIAL; in safexcel_sha3_224_init()
2365 req->state_sz = SHA3_224_DIGEST_SIZE; in safexcel_sha3_224_init()
2366 req->digest_sz = SHA3_224_DIGEST_SIZE; in safexcel_sha3_224_init()
2367 req->block_sz = SHA3_224_BLOCK_SIZE; in safexcel_sha3_224_init()
2368 ctx->do_fallback = false; in safexcel_sha3_224_init()
2369 ctx->fb_init_done = false; in safexcel_sha3_224_init()
2380 if (ctx->do_fallback) { in safexcel_sha3_fbcheck()
2381 ahash_request_set_tfm(subreq, ctx->fback); in safexcel_sha3_fbcheck()
2382 ahash_request_set_callback(subreq, req->base.flags, in safexcel_sha3_fbcheck()
2383 req->base.complete, req->base.data); in safexcel_sha3_fbcheck()
2384 ahash_request_set_crypt(subreq, req->src, req->result, in safexcel_sha3_fbcheck()
2385 req->nbytes); in safexcel_sha3_fbcheck()
2386 if (!ctx->fb_init_done) { in safexcel_sha3_fbcheck()
2387 if (ctx->fb_do_setkey) { in safexcel_sha3_fbcheck()
2391 memcpy(key, &ctx->base.ipad, in safexcel_sha3_fbcheck()
2392 crypto_ahash_blocksize(ctx->fback) / 2); in safexcel_sha3_fbcheck()
2394 crypto_ahash_blocksize(ctx->fback) / 2, in safexcel_sha3_fbcheck()
2395 &ctx->base.opad, in safexcel_sha3_fbcheck()
2396 crypto_ahash_blocksize(ctx->fback) / 2); in safexcel_sha3_fbcheck()
2397 ret = crypto_ahash_setkey(ctx->fback, key, in safexcel_sha3_fbcheck()
2398 crypto_ahash_blocksize(ctx->fback)); in safexcel_sha3_fbcheck()
2400 crypto_ahash_blocksize(ctx->fback)); in safexcel_sha3_fbcheck()
2401 ctx->fb_do_setkey = false; in safexcel_sha3_fbcheck()
2404 ctx->fb_init_done = true; in safexcel_sha3_fbcheck()
2416 ctx->do_fallback = true; in safexcel_sha3_update()
2426 ctx->do_fallback = true; in safexcel_sha3_final()
2436 ctx->do_fallback |= !req->nbytes; in safexcel_sha3_finup()
2437 if (ctx->do_fallback) in safexcel_sha3_finup()
2451 ctx->do_fallback = true; in safexcel_sha3_digest_fallback()
2452 ctx->fb_init_done = false; in safexcel_sha3_digest_fallback()
2458 if (req->nbytes) in safexcel_sha3_224_digest()
2471 ctx->do_fallback = true; in safexcel_sha3_export()
2481 ctx->do_fallback = true; in safexcel_sha3_import()
2494 ctx->fback = crypto_alloc_ahash(crypto_tfm_alg_name(tfm), 0, in safexcel_sha3_cra_init()
2497 if (IS_ERR(ctx->fback)) in safexcel_sha3_cra_init()
2498 return PTR_ERR(ctx->fback); in safexcel_sha3_cra_init()
2501 crypto_hash_alg_common(ahash)->statesize = in safexcel_sha3_cra_init()
2502 crypto_ahash_statesize(ctx->fback); in safexcel_sha3_cra_init()
2506 crypto_ahash_reqsize(ctx->fback))); in safexcel_sha3_cra_init()
2514 crypto_free_ahash(ctx->fback); in safexcel_sha3_cra_exit()
2533 .cra_name = "sha3-224",
2534 .cra_driver_name = "safexcel-sha3-224",
2557 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_256; in safexcel_sha3_256_init()
2558 req->digest = CONTEXT_CONTROL_DIGEST_INITIAL; in safexcel_sha3_256_init()
2559 req->state_sz = SHA3_256_DIGEST_SIZE; in safexcel_sha3_256_init()
2560 req->digest_sz = SHA3_256_DIGEST_SIZE; in safexcel_sha3_256_init()
2561 req->block_sz = SHA3_256_BLOCK_SIZE; in safexcel_sha3_256_init()
2562 ctx->do_fallback = false; in safexcel_sha3_256_init()
2563 ctx->fb_init_done = false; in safexcel_sha3_256_init()
2569 if (req->nbytes) in safexcel_sha3_256_digest()
2591 .cra_name = "sha3-256",
2592 .cra_driver_name = "safexcel-sha3-256",
2615 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_384; in safexcel_sha3_384_init()
2616 req->digest = CONTEXT_CONTROL_DIGEST_INITIAL; in safexcel_sha3_384_init()
2617 req->state_sz = SHA3_384_DIGEST_SIZE; in safexcel_sha3_384_init()
2618 req->digest_sz = SHA3_384_DIGEST_SIZE; in safexcel_sha3_384_init()
2619 req->block_sz = SHA3_384_BLOCK_SIZE; in safexcel_sha3_384_init()
2620 ctx->do_fallback = false; in safexcel_sha3_384_init()
2621 ctx->fb_init_done = false; in safexcel_sha3_384_init()
2627 if (req->nbytes) in safexcel_sha3_384_digest()
2649 .cra_name = "sha3-384",
2650 .cra_driver_name = "safexcel-sha3-384",
2673 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_512; in safexcel_sha3_512_init()
2674 req->digest = CONTEXT_CONTROL_DIGEST_INITIAL; in safexcel_sha3_512_init()
2675 req->state_sz = SHA3_512_DIGEST_SIZE; in safexcel_sha3_512_init()
2676 req->digest_sz = SHA3_512_DIGEST_SIZE; in safexcel_sha3_512_init()
2677 req->block_sz = SHA3_512_BLOCK_SIZE; in safexcel_sha3_512_init()
2678 ctx->do_fallback = false; in safexcel_sha3_512_init()
2679 ctx->fb_init_done = false; in safexcel_sha3_512_init()
2685 if (req->nbytes) in safexcel_sha3_512_digest()
2707 .cra_name = "sha3-512",
2708 .cra_driver_name = "safexcel-sha3-512",
2733 ctx->shpre = crypto_alloc_shash(alg, 0, CRYPTO_ALG_NEED_FALLBACK); in safexcel_hmac_sha3_cra_init()
2734 if (IS_ERR(ctx->shpre)) in safexcel_hmac_sha3_cra_init()
2735 return PTR_ERR(ctx->shpre); in safexcel_hmac_sha3_cra_init()
2737 ctx->shdesc = kmalloc(sizeof(*ctx->shdesc) + in safexcel_hmac_sha3_cra_init()
2738 crypto_shash_descsize(ctx->shpre), GFP_KERNEL); in safexcel_hmac_sha3_cra_init()
2739 if (!ctx->shdesc) { in safexcel_hmac_sha3_cra_init()
2740 crypto_free_shash(ctx->shpre); in safexcel_hmac_sha3_cra_init()
2741 return -ENOMEM; in safexcel_hmac_sha3_cra_init()
2743 ctx->shdesc->tfm = ctx->shpre; in safexcel_hmac_sha3_cra_init()
2751 crypto_free_ahash(ctx->fback); in safexcel_hmac_sha3_cra_exit()
2752 crypto_free_shash(ctx->shpre); in safexcel_hmac_sha3_cra_exit()
2753 kfree(ctx->shdesc); in safexcel_hmac_sha3_cra_exit()
2768 ret = crypto_shash_digest(ctx->shdesc, key, keylen, in safexcel_hmac_sha3_setkey()
2769 ctx->base.ipad.byte); in safexcel_hmac_sha3_setkey()
2770 keylen = crypto_shash_digestsize(ctx->shpre); in safexcel_hmac_sha3_setkey()
2778 memmove(&ctx->base.opad, in safexcel_hmac_sha3_setkey()
2779 ctx->base.ipad.byte + in safexcel_hmac_sha3_setkey()
2781 keylen - crypto_ahash_blocksize(tfm) / 2); in safexcel_hmac_sha3_setkey()
2789 memcpy(&ctx->base.ipad, key, keylen); in safexcel_hmac_sha3_setkey()
2791 memcpy(&ctx->base.ipad, key, in safexcel_hmac_sha3_setkey()
2793 memcpy(&ctx->base.opad, in safexcel_hmac_sha3_setkey()
2795 keylen - crypto_ahash_blocksize(tfm) / 2); in safexcel_hmac_sha3_setkey()
2801 memset(ctx->base.ipad.byte + keylen, 0, in safexcel_hmac_sha3_setkey()
2802 crypto_ahash_blocksize(tfm) / 2 - keylen); in safexcel_hmac_sha3_setkey()
2803 memset(&ctx->base.opad, 0, crypto_ahash_blocksize(tfm) / 2); in safexcel_hmac_sha3_setkey()
2805 memset(ctx->base.opad.byte + keylen - in safexcel_hmac_sha3_setkey()
2807 crypto_ahash_blocksize(tfm) - keylen); in safexcel_hmac_sha3_setkey()
2811 ctx->fb_do_setkey = true; in safexcel_hmac_sha3_setkey()
2824 memcpy(req->state, &ctx->base.ipad, SHA3_224_BLOCK_SIZE / 2); in safexcel_hmac_sha3_224_init()
2826 req->len = SHA3_224_BLOCK_SIZE; in safexcel_hmac_sha3_224_init()
2827 req->processed = SHA3_224_BLOCK_SIZE; in safexcel_hmac_sha3_224_init()
2828 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_224; in safexcel_hmac_sha3_224_init()
2829 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_hmac_sha3_224_init()
2830 req->state_sz = SHA3_224_BLOCK_SIZE / 2; in safexcel_hmac_sha3_224_init()
2831 req->digest_sz = SHA3_224_DIGEST_SIZE; in safexcel_hmac_sha3_224_init()
2832 req->block_sz = SHA3_224_BLOCK_SIZE; in safexcel_hmac_sha3_224_init()
2833 req->hmac = true; in safexcel_hmac_sha3_224_init()
2834 ctx->do_fallback = false; in safexcel_hmac_sha3_224_init()
2835 ctx->fb_init_done = false; in safexcel_hmac_sha3_224_init()
2841 if (req->nbytes) in safexcel_hmac_sha3_224_digest()
2851 return safexcel_hmac_sha3_cra_init(tfm, "sha3-224"); in safexcel_hmac_sha3_224_cra_init()
2870 .cra_name = "hmac(sha3-224)",
2871 .cra_driver_name = "safexcel-hmac-sha3-224",
2895 memcpy(req->state, &ctx->base.ipad, SHA3_256_BLOCK_SIZE / 2); in safexcel_hmac_sha3_256_init()
2897 req->len = SHA3_256_BLOCK_SIZE; in safexcel_hmac_sha3_256_init()
2898 req->processed = SHA3_256_BLOCK_SIZE; in safexcel_hmac_sha3_256_init()
2899 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_256; in safexcel_hmac_sha3_256_init()
2900 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_hmac_sha3_256_init()
2901 req->state_sz = SHA3_256_BLOCK_SIZE / 2; in safexcel_hmac_sha3_256_init()
2902 req->digest_sz = SHA3_256_DIGEST_SIZE; in safexcel_hmac_sha3_256_init()
2903 req->block_sz = SHA3_256_BLOCK_SIZE; in safexcel_hmac_sha3_256_init()
2904 req->hmac = true; in safexcel_hmac_sha3_256_init()
2905 ctx->do_fallback = false; in safexcel_hmac_sha3_256_init()
2906 ctx->fb_init_done = false; in safexcel_hmac_sha3_256_init()
2912 if (req->nbytes) in safexcel_hmac_sha3_256_digest()
2922 return safexcel_hmac_sha3_cra_init(tfm, "sha3-256"); in safexcel_hmac_sha3_256_cra_init()
2941 .cra_name = "hmac(sha3-256)",
2942 .cra_driver_name = "safexcel-hmac-sha3-256",
2966 memcpy(req->state, &ctx->base.ipad, SHA3_384_BLOCK_SIZE / 2); in safexcel_hmac_sha3_384_init()
2968 req->len = SHA3_384_BLOCK_SIZE; in safexcel_hmac_sha3_384_init()
2969 req->processed = SHA3_384_BLOCK_SIZE; in safexcel_hmac_sha3_384_init()
2970 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_384; in safexcel_hmac_sha3_384_init()
2971 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_hmac_sha3_384_init()
2972 req->state_sz = SHA3_384_BLOCK_SIZE / 2; in safexcel_hmac_sha3_384_init()
2973 req->digest_sz = SHA3_384_DIGEST_SIZE; in safexcel_hmac_sha3_384_init()
2974 req->block_sz = SHA3_384_BLOCK_SIZE; in safexcel_hmac_sha3_384_init()
2975 req->hmac = true; in safexcel_hmac_sha3_384_init()
2976 ctx->do_fallback = false; in safexcel_hmac_sha3_384_init()
2977 ctx->fb_init_done = false; in safexcel_hmac_sha3_384_init()
2983 if (req->nbytes) in safexcel_hmac_sha3_384_digest()
2993 return safexcel_hmac_sha3_cra_init(tfm, "sha3-384"); in safexcel_hmac_sha3_384_cra_init()
3012 .cra_name = "hmac(sha3-384)",
3013 .cra_driver_name = "safexcel-hmac-sha3-384",
3037 memcpy(req->state, &ctx->base.ipad, SHA3_512_BLOCK_SIZE / 2); in safexcel_hmac_sha3_512_init()
3039 req->len = SHA3_512_BLOCK_SIZE; in safexcel_hmac_sha3_512_init()
3040 req->processed = SHA3_512_BLOCK_SIZE; in safexcel_hmac_sha3_512_init()
3041 ctx->alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA3_512; in safexcel_hmac_sha3_512_init()
3042 req->digest = CONTEXT_CONTROL_DIGEST_HMAC; in safexcel_hmac_sha3_512_init()
3043 req->state_sz = SHA3_512_BLOCK_SIZE / 2; in safexcel_hmac_sha3_512_init()
3044 req->digest_sz = SHA3_512_DIGEST_SIZE; in safexcel_hmac_sha3_512_init()
3045 req->block_sz = SHA3_512_BLOCK_SIZE; in safexcel_hmac_sha3_512_init()
3046 req->hmac = true; in safexcel_hmac_sha3_512_init()
3047 ctx->do_fallback = false; in safexcel_hmac_sha3_512_init()
3048 ctx->fb_init_done = false; in safexcel_hmac_sha3_512_init()
3054 if (req->nbytes) in safexcel_hmac_sha3_512_digest()
3064 return safexcel_hmac_sha3_cra_init(tfm, "sha3-512"); in safexcel_hmac_sha3_512_cra_init()
3082 .cra_name = "hmac(sha3-512)",
3083 .cra_driver_name = "safexcel-hmac-sha3-512",