test_ecdh.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */
  2. #include "uECC.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #if LPC11XX
  6. #include "/Projects/lpc11xx/peripherals/uart.h"
  7. #include "/Projects/lpc11xx/peripherals/time.h"
  8. static uint64_t g_rand = 88172645463325252ull;
  9. int fake_rng(uint8_t *dest, unsigned size) {
  10. while (size) {
  11. g_rand ^= (g_rand << 13);
  12. g_rand ^= (g_rand >> 7);
  13. g_rand ^= (g_rand << 17);
  14. unsigned amount = (size > 8 ? 8 : size);
  15. memcpy(dest, &g_rand, amount);
  16. dest += amount;
  17. size -= amount;
  18. }
  19. return 1;
  20. }
  21. #endif
  22. void vli_print(uint8_t *vli, unsigned int size) {
  23. while (size) {
  24. printf("%02X ", (unsigned)vli[size - 1]);
  25. --size;
  26. }
  27. }
  28. int main() {
  29. #if LPC11XX
  30. uartInit(BAUD_115200);
  31. initTime();
  32. uECC_set_rng(&fake_rng);
  33. #endif
  34. int i;
  35. uint8_t private1[uECC_BYTES];
  36. uint8_t private2[uECC_BYTES];
  37. uint8_t public1[uECC_BYTES * 2];
  38. uint8_t public2[uECC_BYTES * 2];
  39. uint8_t secret1[uECC_BYTES];
  40. uint8_t secret2[uECC_BYTES];
  41. printf("Testing 256 random private key pairs\n");
  42. for (i = 0; i < 256; ++i) {
  43. printf(".");
  44. #if !LPC11XX
  45. fflush(stdout);
  46. #endif
  47. if (!uECC_make_key(public1, private1) || !uECC_make_key(public2, private2)) {
  48. printf("uECC_make_key() failed\n");
  49. return 1;
  50. }
  51. if (!uECC_shared_secret(public2, private1, secret1)) {
  52. printf("shared_secret() failed (1)\n");
  53. return 1;
  54. }
  55. if (!uECC_shared_secret(public1, private2, secret2)) {
  56. printf("shared_secret() failed (2)\n");
  57. return 1;
  58. }
  59. if (memcmp(secret1, secret2, sizeof(secret1)) != 0) {
  60. printf("Shared secrets are not identical!\n");
  61. printf("Shared secret 1 = ");
  62. vli_print(secret1, uECC_BYTES);
  63. printf("\n");
  64. printf("Shared secret 2 = ");
  65. vli_print(secret2, uECC_BYTES);
  66. printf("\n");
  67. printf("Private key 1 = ");
  68. vli_print(private1, uECC_BYTES);
  69. printf("\n");
  70. printf("Private key 2 = ");
  71. vli_print(private2, uECC_BYTES);
  72. printf("\n");
  73. }
  74. }
  75. printf("\n");
  76. return 0;
  77. }