123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #include "sdk_config.h"
- #include "nordic_common.h"
- #if NRF_MODULE_ENABLED(NRF_CRYPTO) && NRF_MODULE_ENABLED(NRF_CRYPTO_BACKEND_MBEDTLS)
- #include <stdint.h>
- #include <stdbool.h>
- #include <string.h>
- #include "nrf_crypto_ecc.h"
- #include "nrf_crypto_ecdsa.h"
- #if !defined(MBEDTLS_CONFIG_FILE)
- #include "mbedtls/config.h"
- #else
- #include MBEDTLS_CONFIG_FILE
- #endif
- #include "mbedtls/ecp.h"
- #include "mbedtls/ecdsa.h"
- #include "mbedtls/sha256.h"
- #include "mbedtls/sha512.h"
- ret_code_t nrf_crypto_backend_mbedtls_sign(
- void * p_context,
- void const * p_private_key,
- uint8_t const * p_data,
- size_t data_size,
- uint8_t * p_signature)
- {
- int result;
- mbedtls_mpi r_mpi;
- mbedtls_mpi s_mpi;
- mbedtls_ecp_group group;
- nrf_crypto_backend_mbedtls_ecc_private_key_t const * p_prv =
- (nrf_crypto_backend_mbedtls_ecc_private_key_t const *)p_private_key;
- nrf_crypto_ecc_curve_info_t const * p_info = p_prv->header.p_info;
- if (!nrf_crypto_backend_mbedtls_ecc_group_load(&group, p_info))
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- mbedtls_mpi_init(&r_mpi);
- mbedtls_mpi_init(&s_mpi);
- result = mbedtls_ecdsa_sign(&group,
- &r_mpi,
- &s_mpi,
- &p_prv->key,
- p_data,
- data_size,
- nrf_crypto_backend_mbedtls_ecc_mbedtls_rng,
- NULL);
- mbedtls_ecp_group_free(&group);
- if (result == 0)
- {
- result = mbedtls_mpi_write_binary(&r_mpi, p_signature, p_info->raw_private_key_size);
- if (result == 0)
- {
- result = mbedtls_mpi_write_binary(&s_mpi,
- &p_signature[p_info->raw_private_key_size],
- p_info->raw_private_key_size);
- }
- }
- mbedtls_mpi_free(&r_mpi);
- mbedtls_mpi_free(&s_mpi);
- if (result != 0)
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- return NRF_SUCCESS;
- }
- ret_code_t nrf_crypto_backend_mbedtls_verify(
- void * p_context,
- void const * p_public_key,
- uint8_t const * p_data,
- size_t data_size,
- uint8_t const * p_signature)
- {
- int result;
- mbedtls_mpi r_mpi;
- mbedtls_mpi s_mpi;
- mbedtls_ecp_group group;
- nrf_crypto_backend_mbedtls_ecc_public_key_t const * p_pub =
- (nrf_crypto_backend_mbedtls_ecc_public_key_t const *)p_public_key;
- nrf_crypto_ecc_curve_info_t const * p_info = p_pub->header.p_info;
- if (!nrf_crypto_backend_mbedtls_ecc_group_load(&group, p_info))
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- mbedtls_mpi_init(&r_mpi);
- mbedtls_mpi_init(&s_mpi);
- result = mbedtls_mpi_read_binary(&r_mpi, p_signature, p_info->raw_private_key_size);
- if (result == 0)
- {
- result = mbedtls_mpi_read_binary(&s_mpi,
- &p_signature[p_info->raw_private_key_size],
- p_info->raw_private_key_size);
- if (result == 0)
- {
- result = mbedtls_ecdsa_verify(&group, p_data, data_size, &p_pub->key, &r_mpi, &s_mpi);
- }
- }
- mbedtls_ecp_group_free(&group);
- mbedtls_mpi_free(&r_mpi);
- mbedtls_mpi_free(&s_mpi);
- if (result == MBEDTLS_ERR_ECP_VERIFY_FAILED)
- {
- return NRF_ERROR_CRYPTO_ECDSA_INVALID_SIGNATURE;
- }
- else if (result != 0)
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- return NRF_SUCCESS;
- }
- #endif
|