From c617c0c711620f58eb3ead22edcdfe57fed06088 Mon Sep 17 00:00:00 2001 From: "Pavel V. Shatov (Meister)" Date: Wed, 19 Dec 2018 15:34:55 +0300 Subject: * Rewritten from scratch, uses the same hardware architecture as the Ed25519 core for better timing performance * Removed custom modular inversion sub-module, now uses micro-coded modular inversion routine based on Fermat's little theorem (~10% faster) * Uses math primitives from core/lib * Added randomized test vector (see user/shatov/ecdsa_fpga_model/test_vectors/) --- stm32_driver/ecdsa256_driver_sample.c | 100 ++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 40 deletions(-) (limited to 'stm32_driver') diff --git a/stm32_driver/ecdsa256_driver_sample.c b/stm32_driver/ecdsa256_driver_sample.c index 1950491..35f1525 100644 --- a/stm32_driver/ecdsa256_driver_sample.c +++ b/stm32_driver/ecdsa256_driver_sample.c @@ -31,34 +31,44 @@ // curve selection #define USE_CURVE 1 -#include "../../../user/shatov/ecdsa_fpga_model/ecdsa_model.h" +#include "ecdsa_test_vector_nsa.h" +#include "ecdsa_test_vector_randomized.h" -#define BUF_NUM_WORDS (OPERAND_WIDTH / (sizeof(uint32_t) << 3)) // 8 +#define bool uint32_t // very dirty hack, but works in this particular case +#include "ecdsa_fpga_lowlevel.h" +#include "ecdsa_fpga_multiword.h" +#include "ecdsa_fpga_curve.h" +#undef bool + +#define BUF_NUM_WORDS FPGA_OPERAND_NUM_WORDS // // test vectors // -static const uint32_t p256_d[BUF_NUM_WORDS] = ECDSA_D; -static const uint32_t p256_qx[BUF_NUM_WORDS] = ECDSA_Q_X; -static const uint32_t p256_qy[BUF_NUM_WORDS] = ECDSA_Q_Y; +static const uint32_t p256_d_nsa[BUF_NUM_WORDS] = ECDSA_P256_D_NSA_INIT; +static const uint32_t p256_qx_nsa[BUF_NUM_WORDS] = ECDSA_P256_QX_NSA_INIT; +static const uint32_t p256_qy_nsa[BUF_NUM_WORDS] = ECDSA_P256_QY_NSA_INIT; + +static const uint32_t p256_k_nsa[BUF_NUM_WORDS] = ECDSA_P256_K_NSA_INIT; +static const uint32_t p256_rx_nsa[BUF_NUM_WORDS] = ECDSA_P256_RX_NSA_INIT; +static const uint32_t p256_ry_nsa[BUF_NUM_WORDS] = ECDSA_P256_RY_NSA_INIT; -static const uint32_t p256_k[BUF_NUM_WORDS] = ECDSA_K; -static const uint32_t p256_rx[BUF_NUM_WORDS] = ECDSA_R_X; -static const uint32_t p256_ry[BUF_NUM_WORDS] = ECDSA_R_Y; +static const uint32_t p256_d_random[BUF_NUM_WORDS] = ECDSA_P256_D_RANDOM_INIT; +static const uint32_t p256_qx_random[BUF_NUM_WORDS] = ECDSA_P256_QX_RANDOM_INIT; +static const uint32_t p256_qy_random[BUF_NUM_WORDS] = ECDSA_P256_QY_RANDOM_INIT; -static const uint32_t p256_i[BUF_NUM_WORDS] = ECDSA_ONE; -static const uint32_t p256_gx[BUF_NUM_WORDS] = ECDSA_G_X; -static const uint32_t p256_gy[BUF_NUM_WORDS] = ECDSA_G_Y; -static const uint32_t p256_hx[BUF_NUM_WORDS] = ECDSA_H_X; -static const uint32_t p256_hy[BUF_NUM_WORDS] = ECDSA_H_Y; +static const uint32_t p256_gx[BUF_NUM_WORDS] = ECDSA_P256_GX_INIT; +static const uint32_t p256_gy[BUF_NUM_WORDS] = ECDSA_P256_GY_INIT; +static const uint32_t p256_hx[BUF_NUM_WORDS] = ECDSA_P256_HX_INIT; +static const uint32_t p256_hy[BUF_NUM_WORDS] = ECDSA_P256_HY_INIT; +static const uint32_t p256_n[BUF_NUM_WORDS] = ECDSA_P256_N_INIT; -static const uint32_t p256_z[BUF_NUM_WORDS] = ECDSA_ZERO; -static const uint32_t p256_n[BUF_NUM_WORDS] = ECDSA_N; +static uint32_t p256_zero[BUF_NUM_WORDS]; +static uint32_t p256_two [BUF_NUM_WORDS]; +static uint32_t p256_n1 [BUF_NUM_WORDS]; +static uint32_t p256_n2 [BUF_NUM_WORDS]; -static uint32_t p256_2[BUF_NUM_WORDS]; // 2 -static uint32_t p256_n1[BUF_NUM_WORDS]; // n + 1 -static uint32_t p256_n2[BUF_NUM_WORDS]; // n + 2 // // prototypes @@ -84,9 +94,11 @@ int main() uint32_t core_name0; uint32_t core_name1; + uint32_t core_version; - fmc_read_32(CORE_ADDR_NAME0, &core_name0); - fmc_read_32(CORE_ADDR_NAME1, &core_name1); + fmc_read_32(CORE_ADDR_NAME0, &core_name0); + fmc_read_32(CORE_ADDR_NAME1, &core_name1); + fmc_read_32(CORE_ADDR_VERSION, &core_version); // "ecds", "a256" if ((core_name0 != 0x65636473) || (core_name1 != 0x61323536)) { @@ -98,15 +110,15 @@ int main() // prepare more numbers size_t w; for (w=0; w