xmr.c 4.7 KB

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