summaryrefslogtreecommitdiff
path: root/firmware/2lib/2sha256_x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2sha256_x86.c')
-rw-r--r--firmware/2lib/2sha256_x86.c100
1 files changed, 8 insertions, 92 deletions
diff --git a/firmware/2lib/2sha256_x86.c b/firmware/2lib/2sha256_x86.c
index 9e745585..f0b37363 100644
--- a/firmware/2lib/2sha256_x86.c
+++ b/firmware/2lib/2sha256_x86.c
@@ -13,7 +13,7 @@
#include "2sha_private.h"
#include "2api.h"
-static struct vb2_sha256_context sha_ctx;
+const uint32_t vb2_hash_seq[8] = {3, 2, 7, 6, 1, 0, 5, 4};
typedef int vb2_m128i __attribute__ ((vector_size(16)));
@@ -114,8 +114,8 @@ static void vb2_sha256_transform_x86ext(const uint8_t *message,
int i;
const vb2_m128i shuf_mask = {0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f};
- state0 = vb2_loadu_si128((vb2_m128i *)&sha_ctx.h[0]);
- state1 = vb2_loadu_si128((vb2_m128i *)&sha_ctx.h[4]);
+ state0 = vb2_loadu_si128((vb2_m128i *)&vb2_sha_ctx.h[0]);
+ state1 = vb2_loadu_si128((vb2_m128i *)&vb2_sha_ctx.h[4]);
for (i = 0; i < (int) block_nb; i++) {
abef_save = state0;
cdgh_save = state1;
@@ -160,96 +160,12 @@ static void vb2_sha256_transform_x86ext(const uint8_t *message,
}
- vb2_storeu_si128((vb2_m128i *)&sha_ctx.h[0], state0);
- vb2_storeu_si128((vb2_m128i *)&sha_ctx.h[4], state1);
+ vb2_storeu_si128((vb2_m128i *)&vb2_sha_ctx.h[0], state0);
+ vb2_storeu_si128((vb2_m128i *)&vb2_sha_ctx.h[4], state1);
}
-vb2_error_t vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
- uint32_t data_size)
+void vb2_sha256_transform_hwcrypto(const uint8_t *message,
+ unsigned int block_nb)
{
- if (hash_alg != VB2_HASH_SHA256)
- return VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED;
-
- sha_ctx.h[0] = vb2_sha256_h0[5];
- sha_ctx.h[1] = vb2_sha256_h0[4];
- sha_ctx.h[2] = vb2_sha256_h0[1];
- sha_ctx.h[3] = vb2_sha256_h0[0];
- sha_ctx.h[4] = vb2_sha256_h0[7];
- sha_ctx.h[5] = vb2_sha256_h0[6];
- sha_ctx.h[6] = vb2_sha256_h0[3];
- sha_ctx.h[7] = vb2_sha256_h0[2];
- sha_ctx.size = 0;
- sha_ctx.total_size = 0;
- memset(sha_ctx.block, 0, sizeof(sha_ctx.block));
-
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_hwcrypto_digest_extend(const uint8_t *buf, uint32_t size)
-{
- unsigned int remaining_blocks;
- unsigned int new_size, rem_size, tmp_size;
- const uint8_t *shifted_data;
-
- tmp_size = VB2_SHA256_BLOCK_SIZE - sha_ctx.size;
- rem_size = size < tmp_size ? size : tmp_size;
-
- memcpy(&sha_ctx.block[sha_ctx.size], buf, rem_size);
-
- if (sha_ctx.size + size < VB2_SHA256_BLOCK_SIZE) {
- sha_ctx.size += size;
- return VB2_SUCCESS;
- }
-
- new_size = size - rem_size;
- remaining_blocks = new_size / VB2_SHA256_BLOCK_SIZE;
-
- shifted_data = buf + rem_size;
-
- vb2_sha256_transform_x86ext(sha_ctx.block, 1);
- vb2_sha256_transform_x86ext(shifted_data, remaining_blocks);
-
- rem_size = new_size % VB2_SHA256_BLOCK_SIZE;
-
- memcpy(sha_ctx.block, &shifted_data[remaining_blocks * VB2_SHA256_BLOCK_SIZE],
- rem_size);
-
- sha_ctx.size = rem_size;
- sha_ctx.total_size += (remaining_blocks + 1) * VB2_SHA256_BLOCK_SIZE;
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
- uint32_t digest_size)
-{
- unsigned int block_nb;
- unsigned int pm_size;
- unsigned int size_b;
- unsigned int block_rem_size = sha_ctx.size % VB2_SHA256_BLOCK_SIZE;
- if (digest_size != VB2_SHA256_DIGEST_SIZE) {
- VB2_DEBUG("ERROR: Digest size does not match expected length.\n");
- return VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE;
- }
-
- block_nb = (1 + ((VB2_SHA256_BLOCK_SIZE - SHA256_MIN_PAD_LEN)
- < block_rem_size));
-
- size_b = (sha_ctx.total_size + sha_ctx.size) * 8;
- pm_size = block_nb * VB2_SHA256_BLOCK_SIZE;
-
- memset(sha_ctx.block + sha_ctx.size, 0, pm_size - sha_ctx.size);
- sha_ctx.block[sha_ctx.size] = SHA256_PAD_BEGIN;
- UNPACK32(size_b, sha_ctx.block + pm_size - 4);
-
- vb2_sha256_transform_x86ext(sha_ctx.block, block_nb);
-
- UNPACK32(sha_ctx.h[3], &digest[ 0]);
- UNPACK32(sha_ctx.h[2], &digest[ 4]);
- UNPACK32(sha_ctx.h[7], &digest[ 8]);
- UNPACK32(sha_ctx.h[6], &digest[12]);
- UNPACK32(sha_ctx.h[1], &digest[16]);
- UNPACK32(sha_ctx.h[0], &digest[20]);
- UNPACK32(sha_ctx.h[5], &digest[24]);
- UNPACK32(sha_ctx.h[4], &digest[28]);
- return VB2_SUCCESS;
+ vb2_sha256_transform_x86ext(message, block_nb);
}