// // simple driver to test "ecdsa256" core in hardware // // // note, that the test program needs a custom bitstream where // the core is located at offset 0 (without the core selector) // // stm32 headers #include "stm-init.h" #include "stm-led.h" #include "stm-fmc.h" // locations of core registers #define CORE_ADDR_NAME0 (0x00 << 2) #define CORE_ADDR_NAME1 (0x01 << 2) #define CORE_ADDR_VERSION (0x02 << 2) #define CORE_ADDR_CONTROL (0x08 << 2) #define CORE_ADDR_STATUS (0x09 << 2) // locations of data buffers #define CORE_ADDR_BUF_K (0x20 << 2) #define CORE_ADDR_BUF_X (0x28 << 2) #define CORE_ADDR_BUF_Y (0x30 << 2) // bit maps #define CORE_CONTROL_BIT_NEXT 0x00000002 #define CORE_STATUS_BIT_READY 0x00000002 // curve selection #define USE_CURVE 1 #include "ecdsa_test_vector_nsa.h" #include "ecdsa_test_vector_randomized.h" #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_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_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_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 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]; // // prototypes // void toggle_yellow_led(void); int test_p256_multiplier(const uint32_t *k, const uint32_t *px, const uint32_t *py); // // test routine // int main() { int ok; stm_init(); fmc_init(); led_on(LED_GREEN); led_off(LED_RED); led_off(LED_YELLOW); led_off(LED_BLUE); 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_VERSION, &core_version); // "ecds", "a256" if ((core_name0 != 0x65636473) || (core_name1 != 0x61323536)) { led_off(LED_GREEN); led_on(LED_RED); while (1); } // prepare more numbers size_t w; for (w=0; w