xmr.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // Created by Dusan Klinec on 10/05/2018.
  3. //
  4. #include "xmr.h"
  5. #include "../byte_order.h"
  6. #include "int-util.h"
  7. #include "../rand.h"
  8. #include "serialize.h"
  9. const ge25519 ALIGN(16) xmr_h = {
  10. {0x1861ec7, 0x1ceac77, 0x2f11626, 0x1f261d3, 0x346107c, 0x06d8c4a,
  11. 0x254201d, 0x1675c09, 0x1301c3f, 0x0211d73},
  12. {0x326feb4, 0x12e30cc, 0x0cf54b4, 0x1117305, 0x318f5d5, 0x06cf754,
  13. 0x2e578a1, 0x1daf058, 0x34430a1, 0x04410e9},
  14. {0x0fde4d2, 0x0774049, 0x22ca951, 0x05aec2b, 0x07a36a5, 0x1394f13,
  15. 0x3c5385c, 0x1adb924, 0x2b6c581, 0x0a55fa4},
  16. {0x24517f7, 0x05ee936, 0x3acf5d9, 0x14b08aa, 0x3363738, 0x1051745,
  17. 0x360601e, 0x0f3f2c9, 0x1ead2cd, 0x1d3e3df}};
  18. void ge25519_set_xmr_h(ge25519 *r) { ge25519_copy(r, &xmr_h); }
  19. void xmr_random_scalar(bignum256modm m) {
  20. unsigned char buff[32] = {0};
  21. random_buffer(buff, sizeof(buff));
  22. expand256_modm(m, buff, sizeof(buff));
  23. }
  24. void xmr_fast_hash(uint8_t *hash, const void *data, size_t length) {
  25. hasher_Raw(HASHER_SHA3K, data, length, hash);
  26. }
  27. void xmr_hasher_init(Hasher *hasher) { hasher_Init(hasher, HASHER_SHA3K); }
  28. void xmr_hasher_update(Hasher *hasher, const void *data, size_t length) {
  29. hasher_Update(hasher, data, length);
  30. }
  31. void xmr_hasher_final(Hasher *hasher, uint8_t *hash) {
  32. hasher_Final(hasher, hash);
  33. }
  34. void xmr_hasher_copy(Hasher *dst, const Hasher *src) {
  35. memcpy(dst, src, sizeof(Hasher));
  36. }
  37. void xmr_hash_to_scalar(bignum256modm r, const void *data, size_t length) {
  38. uint8_t hash[HASHER_DIGEST_LENGTH] = {0};
  39. hasher_Raw(HASHER_SHA3K, data, length, hash);
  40. expand256_modm(r, hash, HASHER_DIGEST_LENGTH);
  41. }
  42. void xmr_hash_to_ec(ge25519 *P, const void *data, size_t length) {
  43. ge25519 point2 = {0};
  44. uint8_t hash[HASHER_DIGEST_LENGTH] = {0};
  45. hasher_Raw(HASHER_SHA3K, data, length, hash);
  46. ge25519_fromfe_frombytes_vartime(&point2, hash);
  47. ge25519_mul8(P, &point2);
  48. }
  49. void xmr_derivation_to_scalar(bignum256modm s, const ge25519 *p,
  50. uint32_t output_index) {
  51. uint8_t buff[32 + 8] = {0};
  52. ge25519_pack(buff, p);
  53. int written = xmr_write_varint(buff + 32, 8, output_index);
  54. xmr_hash_to_scalar(s, buff, 32u + written);
  55. }
  56. void xmr_generate_key_derivation(ge25519 *r, const ge25519 *A,
  57. const bignum256modm b) {
  58. ge25519 bA = {0};
  59. ge25519_scalarmult(&bA, A, b);
  60. ge25519_mul8(r, &bA);
  61. }
  62. void xmr_derive_private_key(bignum256modm s, const ge25519 *deriv, uint32_t idx,
  63. const bignum256modm base) {
  64. xmr_derivation_to_scalar(s, deriv, idx);
  65. add256_modm(s, s, base);
  66. }
  67. void xmr_derive_public_key(ge25519 *r, const ge25519 *deriv, uint32_t idx,
  68. const ge25519 *base) {
  69. bignum256modm s = {0};
  70. ge25519 p2 = {0};
  71. xmr_derivation_to_scalar(s, deriv, idx);
  72. ge25519_scalarmult_base_niels(&p2, ge25519_niels_base_multiples, s);
  73. ge25519_add(r, base, &p2, 0);
  74. }
  75. void xmr_add_keys2(ge25519 *r, const bignum256modm a, const bignum256modm b,
  76. const ge25519 *B) {
  77. // aG + bB, G is basepoint
  78. ge25519 aG = {0}, bB = {0};
  79. ge25519_scalarmult_base_niels(&aG, ge25519_niels_base_multiples, a);
  80. ge25519_scalarmult(&bB, B, b);
  81. ge25519_add(r, &aG, &bB, 0);
  82. }
  83. void xmr_add_keys2_vartime(ge25519 *r, const bignum256modm a,
  84. const bignum256modm b, const ge25519 *B) {
  85. // aG + bB, G is basepoint
  86. ge25519_double_scalarmult_vartime(r, B, b, a);
  87. }
  88. void xmr_add_keys3(ge25519 *r, const bignum256modm a, const ge25519 *A,
  89. const bignum256modm b, const ge25519 *B) {
  90. // aA + bB
  91. ge25519 aA = {0}, bB = {0};
  92. ge25519_scalarmult(&aA, A, a);
  93. ge25519_scalarmult(&bB, B, b);
  94. ge25519_add(r, &aA, &bB, 0);
  95. }
  96. void xmr_add_keys3_vartime(ge25519 *r, const bignum256modm a, const ge25519 *A,
  97. const bignum256modm b, const ge25519 *B) {
  98. // aA + bB
  99. ge25519_double_scalarmult_vartime2(r, A, a, B, b);
  100. }
  101. void xmr_get_subaddress_secret_key(bignum256modm r, uint32_t major,
  102. uint32_t minor, const bignum256modm m) {
  103. const char prefix[] = "SubAddr";
  104. unsigned char buff[32] = {0};
  105. contract256_modm(buff, m);
  106. char data[sizeof(prefix) + sizeof(buff) + 2 * sizeof(uint32_t)] = {0};
  107. memcpy(data, prefix, sizeof(prefix));
  108. memcpy(data + sizeof(prefix), buff, sizeof(buff));
  109. #if BYTE_ORDER == BIG_ENDIAN
  110. REVERSE32(major, major);
  111. REVERSE32(minor, minor);
  112. #endif
  113. memcpy(data + sizeof(prefix) + sizeof(buff), &major, sizeof(uint32_t));
  114. memcpy(data + sizeof(prefix) + sizeof(buff) + sizeof(uint32_t), &minor,
  115. sizeof(uint32_t));
  116. xmr_hash_to_scalar(r, data, sizeof(data));
  117. }
  118. void xmr_gen_c(ge25519 *r, const bignum256modm a, uint64_t amount) {
  119. // C = aG + bH
  120. bignum256modm b = {0};
  121. set256_modm(b, amount);
  122. xmr_add_keys2(r, a, b, &xmr_h);
  123. }