xmr.c 4.9 KB

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