ecc.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Copyright (c) 2016 Nordic Semiconductor. All Rights Reserved.
  3. *
  4. * The information contained herein is confidential property of Nordic Semiconductor. The use,
  5. * copying, transfer or disclosure of such information is prohibited except by express written
  6. * agreement with Nordic Semiconductor.
  7. *
  8. */
  9. /**
  10. * @brief Elliptic Curve Cryptography Interface
  11. *
  12. */
  13. #include <stdint.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include "nordic_common.h"
  17. #include "app_timer.h"
  18. #include "app_trace.h"
  19. #include "app_uart.h"
  20. #include "app_util.h"
  21. #include "nrf_log.h"
  22. #include "nrf_drv_rng.h"
  23. #include "ecc.h"
  24. #include "uECC.h"
  25. static int ecc_rng(uint8_t *dest, unsigned size)
  26. {
  27. uint32_t errcode;
  28. errcode = nrf_drv_rng_block_rand(dest, (uint32_t) size);
  29. return errcode == NRF_SUCCESS ? 1 : 0;
  30. }
  31. void ecc_init(void)
  32. {
  33. uECC_set_rng(ecc_rng);
  34. }
  35. ret_code_t ecc_p256_keypair_gen(uint8_t *p_le_sk, uint8_t *p_le_pk)
  36. {
  37. const struct uECC_Curve_t * p_curve;
  38. if(!p_le_sk || !p_le_pk)
  39. {
  40. return NRF_ERROR_NULL;
  41. }
  42. if(!is_word_aligned(p_le_sk) || !is_word_aligned(p_le_pk))
  43. {
  44. return NRF_ERROR_INVALID_ADDR;
  45. }
  46. p_curve = uECC_secp256r1();
  47. int ret = uECC_make_key((uint8_t *) p_le_pk, (uint8_t *) p_le_sk, p_curve);
  48. if(!ret)
  49. {
  50. return NRF_ERROR_INTERNAL;
  51. }
  52. return NRF_SUCCESS;
  53. }
  54. ret_code_t ecc_p256_public_key_compute(uint8_t const *p_le_sk, uint8_t *p_le_pk)
  55. {
  56. const struct uECC_Curve_t * p_curve;
  57. if(!p_le_sk || !p_le_pk)
  58. {
  59. return NRF_ERROR_NULL;
  60. }
  61. if(!is_word_aligned(p_le_sk) || !is_word_aligned(p_le_pk))
  62. {
  63. return NRF_ERROR_INVALID_ADDR;
  64. }
  65. p_curve = uECC_secp256r1();
  66. NRF_LOG_PRINTF("uECC_compute_public_key\n");
  67. int ret = uECC_compute_public_key((uint8_t *) p_le_sk, (uint8_t *) p_le_pk, p_curve);
  68. if(!ret)
  69. {
  70. return NRF_ERROR_INTERNAL;
  71. }
  72. NRF_LOG_PRINTF("uECC_compute_public_key complete: %d\n", ret);
  73. return NRF_SUCCESS;
  74. }
  75. ret_code_t ecc_p256_shared_secret_compute(uint8_t const *p_le_sk, uint8_t const *p_le_pk, uint8_t *p_le_ss)
  76. {
  77. const struct uECC_Curve_t * p_curve;
  78. if(!p_le_sk || !p_le_pk || !p_le_ss)
  79. {
  80. return NRF_ERROR_NULL;
  81. }
  82. if(!is_word_aligned(p_le_sk) || !is_word_aligned(p_le_pk) || !is_word_aligned(p_le_ss))
  83. {
  84. return NRF_ERROR_INVALID_ADDR;
  85. }
  86. p_curve = uECC_secp256r1();
  87. NRF_LOG_PRINTF("uECC_shared_secret\n");
  88. int ret = uECC_shared_secret((uint8_t *) p_le_pk, (uint8_t *) p_le_sk, p_le_ss, p_curve);
  89. if(!ret)
  90. {
  91. return NRF_ERROR_INTERNAL;
  92. }
  93. NRF_LOG_PRINTF("uECC_shared_secret complete: %d\n", ret);
  94. return NRF_SUCCESS;
  95. }