ed25519_convert.c 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #define TEST_NAME "ed25519_convert"
  2. #include "cmptest.h"
  3. static const unsigned char keypair_seed[crypto_sign_ed25519_SEEDBYTES] = {
  4. 0x42, 0x11, 0x51, 0xa4, 0x59, 0xfa, 0xea, 0xde, 0x3d, 0x24, 0x71,
  5. 0x15, 0xf9, 0x4a, 0xed, 0xae, 0x42, 0x31, 0x81, 0x24, 0x09, 0x5a,
  6. 0xfa, 0xbe, 0x4d, 0x14, 0x51, 0xa5, 0x59, 0xfa, 0xed, 0xee
  7. };
  8. int
  9. main(void)
  10. {
  11. unsigned char ed25519_pk[crypto_sign_ed25519_PUBLICKEYBYTES];
  12. unsigned char ed25519_skpk[crypto_sign_ed25519_SECRETKEYBYTES];
  13. unsigned char curve25519_pk[crypto_scalarmult_curve25519_BYTES];
  14. unsigned char curve25519_pk2[crypto_scalarmult_curve25519_BYTES];
  15. unsigned char curve25519_sk[crypto_scalarmult_curve25519_BYTES];
  16. char curve25519_pk_hex[crypto_scalarmult_curve25519_BYTES * 2 + 1];
  17. char curve25519_sk_hex[crypto_scalarmult_curve25519_BYTES * 2 + 1];
  18. unsigned char hseed[crypto_hash_sha512_BYTES];
  19. unsigned int i;
  20. assert(crypto_sign_ed25519_SEEDBYTES <= crypto_hash_sha512_BYTES);
  21. #ifdef ED25519_NONDETERMINISTIC
  22. crypto_hash_sha512(hseed, keypair_seed, crypto_sign_ed25519_SEEDBYTES);
  23. #else
  24. memcpy(hseed, keypair_seed, crypto_sign_ed25519_SEEDBYTES);
  25. #endif
  26. crypto_sign_ed25519_seed_keypair(ed25519_pk, ed25519_skpk, hseed);
  27. if (crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk) != 0) {
  28. printf("conversion failed\n");
  29. }
  30. crypto_sign_ed25519_sk_to_curve25519(curve25519_sk, ed25519_skpk);
  31. sodium_bin2hex(curve25519_pk_hex, sizeof curve25519_pk_hex, curve25519_pk,
  32. sizeof curve25519_pk);
  33. sodium_bin2hex(curve25519_sk_hex, sizeof curve25519_sk_hex, curve25519_sk,
  34. sizeof curve25519_sk);
  35. printf("curve25519 pk: [%s]\n", curve25519_pk_hex);
  36. printf("curve25519 sk: [%s]\n", curve25519_sk_hex);
  37. for (i = 0U; i < 500U; i++) {
  38. crypto_sign_ed25519_keypair(ed25519_pk, ed25519_skpk);
  39. if (crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk) !=
  40. 0) {
  41. printf("conversion failed\n");
  42. }
  43. crypto_sign_ed25519_sk_to_curve25519(curve25519_sk, ed25519_skpk);
  44. crypto_scalarmult_curve25519_base(curve25519_pk2, curve25519_sk);
  45. if (memcmp(curve25519_pk, curve25519_pk2, sizeof curve25519_pk) != 0) {
  46. printf("conversion failed\n");
  47. }
  48. }
  49. sodium_hex2bin(ed25519_pk, crypto_sign_ed25519_PUBLICKEYBYTES,
  50. "0000000000000000000000000000000000000000000000000000000000000000"
  51. "0000000000000000000000000000000000000000000000000000000000000000",
  52. 64, NULL, NULL, NULL);
  53. assert(crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk) == -1);
  54. sodium_hex2bin(ed25519_pk, crypto_sign_ed25519_PUBLICKEYBYTES,
  55. "0200000000000000000000000000000000000000000000000000000000000000"
  56. "0000000000000000000000000000000000000000000000000000000000000000",
  57. 64, NULL, NULL, NULL);
  58. assert(crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk) == -1);
  59. sodium_hex2bin(ed25519_pk, crypto_sign_ed25519_PUBLICKEYBYTES,
  60. "0500000000000000000000000000000000000000000000000000000000000000"
  61. "0000000000000000000000000000000000000000000000000000000000000000",
  62. 64, NULL, NULL, NULL);
  63. assert(crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk) == -1);
  64. printf("ok\n");
  65. return 0;
  66. }