test_check_monero.h 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. #if USE_MONERO
  2. START_TEST(test_xmr_base58) {
  3. static const struct {
  4. uint64_t tag;
  5. char *v1;
  6. char *v2;
  7. } tests[] = {
  8. {0x12,
  9. "3bec484c5d7f0246af520aab550452b5b6013733feabebd681c4a60d457b7fc12d5918e"
  10. "31d3c003da3c778592c07b398ad6f961a67082a75fd49394d51e69bbe",
  11. "43tpGG9PKbwCpjRvNLn1jwXPpnacw2uVUcszAtgmDiVcZK4VgHwjJT9BJz1WGF9eMxSYASp"
  12. "8yNMkuLjeQfWqJn3CNWdWfzV"},
  13. {0x12,
  14. "639050436fa36c8288706771412c5972461578d564188cd7fc6f81d6973d064fa461afe"
  15. "66fb23879936d7225051bebbf7f3ae0c801a90bb99fbb346b2fd4d702",
  16. "45PwgoUKaDHNqLL8o3okzLL7biv7GqPVmd8LTcTrYVrMEKdSYwFcyJfMLSRpfU3nh8Z2m81"
  17. "FJD4sUY3nXCdGe61k1HAp8T1"},
  18. {53,
  19. "5a10cca900ee47a7f412cd661b29f5ab356d6a1951884593bb170b5ec8b6f2e83b1da41"
  20. "1527d062c9fedeb2dad669f2f5585a00a88462b8c95c809a630e5734c",
  21. "9vacMKaj8JJV6MnwDzh2oNVdwTLJfTDyNRiB6NzV9TT7fqvzLivH2dB8Tv7VYR3ncn8vCb3"
  22. "KdNMJzQWrPAF1otYJ9cPKpkr"},
  23. {0x12, "", "35EMFRj"},
  24. {53, "d910642d8b3372fe72676dbc925277974d0401d387e4024",
  25. "A1PkB4pLAiVjZTJpWewswLSJor6eEYDHj35UiF7"},
  26. };
  27. uint8_t rawn[512];
  28. char strn[512];
  29. int r;
  30. uint64_t tag;
  31. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  32. const char *raw = tests[i].v1;
  33. const char *str = tests[i].v2;
  34. const size_t len = strlen(raw) / 2;
  35. memcpy(rawn, fromhex(raw), len);
  36. r = xmr_base58_addr_encode_check(tests[i].tag, rawn, len, strn,
  37. sizeof(strn));
  38. ck_assert_uint_eq((size_t)r, strlen(str));
  39. ck_assert_mem_eq(strn, str, r);
  40. r = xmr_base58_addr_decode_check(strn, r, &tag, rawn, len);
  41. ck_assert_uint_eq((size_t)r, len);
  42. ck_assert_mem_eq(rawn, fromhex(raw), len);
  43. }
  44. }
  45. END_TEST
  46. START_TEST(test_xmr_getset256_modm) {
  47. static const struct {
  48. uint64_t val;
  49. int r;
  50. char *a;
  51. } tests[] = {
  52. {0x0, 1,
  53. "0000000000000000000000000000000000000000000000000000000000000000"},
  54. {0x7fffffffULL, 1,
  55. "ffffff7f00000000000000000000000000000000000000000000000000000000"},
  56. {0x7fffffffffffffffULL, 1,
  57. "ffffffffffffff7f000000000000000000000000000000000000000000000000"},
  58. {0xdeadc0deULL, 1,
  59. "dec0adde00000000000000000000000000000000000000000000000000000000"},
  60. {0x0, 0,
  61. "dec0adde000000000000000000000000000000000000000000000000000000ff"},
  62. {0x0, 0,
  63. "ffffffffffffffffff0000000000000000000000000000000000000000000000"},
  64. };
  65. uint8_t rawn[32];
  66. uint64_t v1;
  67. bignum256modm a1 = {0};
  68. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  69. int get_res = tests[i].r;
  70. if (get_res) {
  71. set256_modm(a1, tests[i].val);
  72. ck_assert_int_eq(get256_modm(&v1, a1), 1);
  73. ck_assert(v1 == tests[i].val);
  74. contract256_modm(rawn, a1);
  75. ck_assert_mem_eq(rawn, fromhex(tests[i].a), 32);
  76. } else {
  77. expand256_modm(a1, fromhex(tests[i].a), 32);
  78. ck_assert_int_eq(get256_modm(&v1, a1), 0);
  79. }
  80. }
  81. }
  82. END_TEST
  83. START_TEST(test_xmr_cmp256_modm) {
  84. static const struct {
  85. char *a;
  86. char *b;
  87. int res_eq;
  88. int res_cmp;
  89. int res_is_zero_a;
  90. } tests[] = {
  91. {"0000000000000000000000000000000000000000000000000000000000000000",
  92. "0000000000000000000000000000000000000000000000000000000000000000", 1, 0,
  93. 1},
  94. {"0000000000000000000000000000000000000000000000000000000000000000",
  95. "0100000000000000000000000000000000000000000000000000000000000000", 0,
  96. -1, 1},
  97. {"dec0adde00000000000000000000000000000000000000000000000000000000",
  98. "dec0adde00000000000000000000000000000000000000000000000000000000", 1, 0,
  99. 0},
  100. {"863346d8863c461cde2ec7c2759352c2b952228f33a86ca06bb79574bbe5c30d",
  101. "3ddbd65a6d3ba5e2ab120603685a353a27ce3fd21dfdbea7952d2dd26f1ca00a", 0, 1,
  102. 0},
  103. {"f7667f392edbea6e224b1aa9fbf2a3b238b4f977fb4a8f39130cc45f49b5c40a",
  104. "b41b9b1e7e80be71cf290ed4bded58924086b8ac6bdfa1faa0c80c255f074d07", 0, 1,
  105. 0},
  106. {"0e4005c7826de8f9978749903f40efd140e4ae6d3bed09e558fcce8367b27501",
  107. "0e4005c7826de8f9978749903f40efd140e4ae6d3bed09e558fcce8367b27504", 0,
  108. -1, 0},
  109. {"0e4005c7826de8f9978749903f40efd140e4ae6d3bed09e558fcce8367b27504",
  110. "0e4005c7826de8f9978749903f40efd140e4ae6d3bed09e558fcce8367b27504", 1, 0,
  111. 0},
  112. {"0e4005c7826de8f9978749903f40efd140e4ae6d3bed09e558fcce8367b27504",
  113. "0e4005c7826de8f9978749903f41efd140e4ae6d3bed09e558fcce8367b27504", 0,
  114. -1, 0},
  115. };
  116. bignum256modm a1 = {0}, a2 = {0};
  117. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  118. expand256_modm(a1, fromhex(tests[i].a), 32);
  119. expand256_modm(a2, fromhex(tests[i].b), 32);
  120. ck_assert_int_eq(eq256_modm(a1, a2), tests[i].res_eq);
  121. ck_assert_int_eq(cmp256_modm(a1, a2), tests[i].res_cmp);
  122. ck_assert_int_eq(iszero256_modm(a1), tests[i].res_is_zero_a);
  123. }
  124. }
  125. END_TEST
  126. START_TEST(test_xmr_copy_check_modm) {
  127. static const struct {
  128. int check;
  129. char *a;
  130. } tests[] = {
  131. {0, "0000000000000000000000000000000000000000000000000000000000000000"},
  132. {1, "ffffff7f00000000000000000000000000000000000000000000000000000000"},
  133. {1, "ffffffffffffff7f000000000000000000000000000000000000000000000000"},
  134. {1, "dec0adde00000000000000000000000000000000000000000000000000000000"},
  135. {0, "dec0adde000000000000000000000fffffffffffffffffffffffffffffffffff"},
  136. };
  137. bignum256modm a1 = {0}, a2 = {0};
  138. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  139. expand_raw256_modm(a1, fromhex(tests[i].a));
  140. copy256_modm(a2, a1);
  141. ck_assert_int_eq(eq256_modm(a1, a2), 1);
  142. ck_assert_int_eq(check256_modm(a1), tests[i].check);
  143. }
  144. }
  145. END_TEST
  146. START_TEST(test_xmr_mulsub256_modm) {
  147. static const struct {
  148. char *a;
  149. char *b;
  150. char *c;
  151. char *r;
  152. } tests[] = {
  153. {
  154. "713c199348cf7d14b67ae6265ea49c02c8647f07afcbcb6f8d3254b3db972e02",
  155. "4e48a7b7a03ab1106fdfa9441a03c97c644395a12ac4b8effac7344e0719c200",
  156. "1a5711b8c43bcab0161a620368d82727e1d027dc248f420d9bb4db2486c16405",
  157. "6edcc08aa6ec3a5b3d333b5f826be7de9c268be8aaf9521586fbcccbed3b1c0c",
  158. },
  159. {
  160. "d4ade2c62d34af8cfd9daec6f46bf7e57962a8aa46935cb11fab64fa599b4700",
  161. "22ea7989a9f4d34cd8c9442e03b5062dfe8493757cd18a63411cb1a25e44960f",
  162. "772053e613f0859387badcefeb7fbe551a05b00b9337539c8d72661de5929806",
  163. "a5063258df4520b33e97c0a46d80feeace5c251fc7ef7a938d160b8f25795106",
  164. },
  165. {
  166. "01fd2ef25c8221277a2b6daf1f1642bacb8d6ac0dd4f62731cdd73e26eb77900",
  167. "0611b9357530aa638428002769ce0ad553421e971bea1f10d7009bf26d9af805",
  168. "dfece232068b2f8059ca569f345baaed13ab464eb3bebb99de5625dc90a8cf03",
  169. "85752e62bd8085c7c02d5edeb74969d22f1a5bb34349258d2e96de300176bb07",
  170. },
  171. };
  172. bignum256modm a = {0}, b = {0}, c = {0}, r = {0}, r2 = {0};
  173. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  174. expand256_modm(a, fromhex(tests[i].a), 32);
  175. expand256_modm(b, fromhex(tests[i].b), 32);
  176. expand256_modm(c, fromhex(tests[i].c), 32);
  177. expand256_modm(r, fromhex(tests[i].r), 32);
  178. mulsub256_modm(r2, a, b, c);
  179. ck_assert_int_eq(eq256_modm(r, r2), 1);
  180. }
  181. }
  182. END_TEST
  183. START_TEST(test_xmr_muladd256_modm) {
  184. static const struct {
  185. char *a;
  186. char *b;
  187. char *c;
  188. char *r;
  189. } tests[] = {
  190. {
  191. "7c3fd8abfbe2be3739d91679ac8dbda086961b941e0d4a00561f758927d8aa09",
  192. "ac2d8d37e4f344aa4040d0f0fc29d45423ab7e69ecacb94ca9fc36819e0e990e",
  193. "2f03f1bac09bc7d002848b68be069dc98b2db028390ae37e13a5166fcae08105",
  194. "dce113add3392f08e3b38b7d31e237eba5066e5a95a1fdbf755b92d05e1ec70b",
  195. },
  196. {
  197. "6979b70f6198d043f4b14e2069f7b89cc9f09e3465e71d472946443989e0e80c",
  198. "8dd5177bc8d7c5bd58c0be74b336952a73ac259ebb812ac8cd755773c6aab807",
  199. "d7658e508a7454ccfb29e2890d6156ac10e18ebe6e00cc5a2d2d87a5080c7f06",
  200. "51b33f6263772781cdbab26ef48870eaf94899894a437dac39496f15b9d0ae00",
  201. },
  202. {
  203. "ebfdb4eabedb1fb9a45b3204735b0511871e20358392fa16a851c519e3a29b09",
  204. "59d98831e9f9e24260158986c4d4035438de9b8876cc11bdcf4c364c75f72908",
  205. "93bce4764eee97dc67f2e37da40bc5641f2cdc637285d273287a3d4383b68f02",
  206. "21547ca6855c85d5adcd673b9d801d0cb0f10dced8f8b68a8c2f74163defde0e",
  207. },
  208. };
  209. bignum256modm a = {0}, b = {0}, c = {0}, r = {0}, r2 = {0};
  210. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  211. expand256_modm(a, fromhex(tests[i].a), 32);
  212. expand256_modm(b, fromhex(tests[i].b), 32);
  213. expand256_modm(c, fromhex(tests[i].c), 32);
  214. expand256_modm(r, fromhex(tests[i].r), 32);
  215. muladd256_modm(r2, a, b, c);
  216. ck_assert_int_eq(eq256_modm(r, r2), 1);
  217. }
  218. }
  219. END_TEST
  220. START_TEST(test_xmr_curve25519_set) {
  221. static const struct {
  222. uint32_t val;
  223. char *a;
  224. } tests[] = {
  225. {0x0, "0000000000000000000000000000000000000000000000000000000000000000"},
  226. {0x1, "0100000000000000000000000000000000000000000000000000000000000000"},
  227. {0xdeadc0deUL,
  228. "dec0adde00000000000000000000000000000000000000000000000000000000"},
  229. };
  230. unsigned char buff[32];
  231. bignum25519 a = {0};
  232. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  233. curve25519_set(a, tests[i].val);
  234. curve25519_contract(buff, a);
  235. ck_assert_mem_eq(buff, fromhex(tests[i].a), 32);
  236. }
  237. }
  238. END_TEST
  239. START_TEST(test_xmr_curve25519_consts) {
  240. char *d = "a3785913ca4deb75abd841414d0a700098e879777940c78c73fe6f2bee6c0352";
  241. char *d2 = "59f1b226949bd6eb56b183829a14e00030d1f3eef2808e19e7fcdf56dcd90624";
  242. char *sqrtneg1 =
  243. "b0a00e4a271beec478e42fad0618432fa7d7fb3d99004d2b0bdfc14f8024832b";
  244. unsigned char buff[32];
  245. bignum25519 a = {0};
  246. curve25519_set_d(a);
  247. curve25519_contract(buff, a);
  248. ck_assert_mem_eq(buff, fromhex(d), 32);
  249. curve25519_set_2d(a);
  250. curve25519_contract(buff, a);
  251. ck_assert_mem_eq(buff, fromhex(d2), 32);
  252. curve25519_set_sqrtneg1(a);
  253. curve25519_contract(buff, a);
  254. ck_assert_mem_eq(buff, fromhex(sqrtneg1), 32);
  255. }
  256. END_TEST
  257. START_TEST(test_xmr_curve25519_tests) {
  258. static const struct {
  259. char *a;
  260. int res_neg;
  261. int res_nonzero;
  262. } tests[] = {
  263. {
  264. "0000000000000000000000000000000000000000000000000000000000000000",
  265. 0,
  266. 0,
  267. },
  268. {
  269. "0100000000000000000000000000000000000000000000000000000000000000",
  270. 1,
  271. 1,
  272. },
  273. {
  274. "05737aa6100ee54283dc0d483b8e39e61846f6b3736908243d0c824d250b3139",
  275. 1,
  276. 1,
  277. },
  278. {
  279. "95587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bc15",
  280. 1,
  281. 1,
  282. },
  283. {
  284. "02587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bc15",
  285. 0,
  286. 1,
  287. },
  288. };
  289. bignum25519 a = {0};
  290. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  291. curve25519_expand(a, fromhex(tests[i].a));
  292. ck_assert_int_eq(curve25519_isnegative(a), tests[i].res_neg);
  293. ck_assert_int_eq(curve25519_isnonzero(a), tests[i].res_nonzero);
  294. }
  295. }
  296. END_TEST
  297. START_TEST(test_xmr_curve25519_expand_reduce) {
  298. static const struct {
  299. char *a;
  300. char *b;
  301. } tests[] = {
  302. {"dec0adde00000000000000000000000000000000000000000000000000000000",
  303. "dec0adde00000000000000000000000000000000000000000000000000000000"},
  304. {"95587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bc15",
  305. "95587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bc15"},
  306. {"95587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bcff",
  307. "a8587a5ef6900fa8e32d6a41bd8090b1e33e694284323d1d1f02d69865f2bc7f"},
  308. {"95587a5ef6900fa8e32d6affbd8090b1e33e694284323fffff02d69865f2bcff",
  309. "a8587a5ef6900fa8e32d6affbd8090b1e33e694284323fffff02d69865f2bc7f"},
  310. };
  311. unsigned char buff[32];
  312. bignum25519 a = {0};
  313. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  314. curve25519_expand_reduce(a, fromhex(tests[i].a));
  315. curve25519_contract(buff, a);
  316. ck_assert_mem_eq(buff, fromhex(tests[i].b), 32);
  317. }
  318. }
  319. END_TEST
  320. START_TEST(test_xmr_ge25519_base) {
  321. unsigned char buff[32];
  322. char *base =
  323. "5866666666666666666666666666666666666666666666666666666666666666";
  324. ge25519 b;
  325. ge25519_set_base(&b);
  326. ge25519_pack(buff, &b);
  327. ck_assert_mem_eq(buff, fromhex(base), 32);
  328. }
  329. END_TEST
  330. START_TEST(test_xmr_ge25519_check) {
  331. static const struct {
  332. char *x;
  333. char *y;
  334. char *z;
  335. char *t;
  336. int r;
  337. } tests[] = {
  338. {"4ff97748221f954414f836d84e8e7e207786bcd20eb67044756dca307e792c60",
  339. "2c7be86ab07488ba43e8e03d85a67625cfbf98c8544de4c877241b7aaafc7f63",
  340. "0100000000000000000000000000000000000000000000000000000000000000",
  341. "3ec65b03954ce7432525b9b3f4a9f5747f57b40903d1bf8892527366325fe036", 1},
  342. {"358fd25e4b84397d207e23cf3a75819bd6b2254cabc990b31ad63873cc38fc7c",
  343. "ca48045f790145a1eec3946dfd73747fde0fdb4238607e0a203f8ef5bef90e0e",
  344. "0100000000000000000000000000000000000000000000000000000000000000",
  345. "6c5e5cbae4b05e149d0aca50bf7b4112acbbe6233ace9c8bd5bcedf34df9ce0b", 1},
  346. {"4ff97748221f954414f836d84e8e7e207786bcd20eb6704475ffca307e792c60",
  347. "2c7be86ab07488ba43e8e03d85a67625cfbf98c8544de4c877241b7aaafc7f63",
  348. "0100000000000000000000000000000000000000000000000000000000000000",
  349. "3ec65b03954ce7432525b9b3f4a9f5747f57b40903d1bf8892527366325fe036", 0},
  350. {"358fd25e4b84397d207e23cf3a75819bd6b2254cabc990b31ad63873cc38fc7c",
  351. "ca48045f790145a1eec3946dfd73747fdfffdb4238607e0a203f8ef5bef90e0e",
  352. "0100000000000000000000000000000000000000000000000000000000000000",
  353. "6c5e5cbae4b05e149d0aca50bf7b4112acbbe6233ace9c8bd5bcedf34df9ce0b", 0},
  354. {"358fd25e4b84397d207e23cf3a75819bd6b2254cabc990b31ad63873cc38fc7c",
  355. "ca48045f790145a1eec3946dfd73747fdfffdb4238607e0a203f8ef5bef90e0e",
  356. "0100000000000000000000000000000000000000000000000000000000000000",
  357. "6c5e5ffae4b05e149d0aca50bf7b4112acbbe6233ace9c8bd5bcedf34df9ce0b", 0},
  358. };
  359. struct ge25519_t p;
  360. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  361. curve25519_expand_reduce(p.x, fromhex(tests[i].x));
  362. curve25519_expand_reduce(p.y, fromhex(tests[i].y));
  363. curve25519_expand_reduce(p.z, fromhex(tests[i].z));
  364. curve25519_expand_reduce(p.t, fromhex(tests[i].t));
  365. ck_assert_int_eq(ge25519_check(&p), tests[i].r);
  366. }
  367. }
  368. END_TEST
  369. START_TEST(test_xmr_ge25519_scalarmult_base_wrapper) {
  370. static const struct {
  371. char *sc;
  372. char *pt;
  373. } tests[] = {
  374. {
  375. "40be740e26bd1c84f5a8fec737c0ed30e87bd45adfcd91e320f8dfb68b1a870e",
  376. "b7a8b2f3dbfd41b38d20aec733a316dbfc2633503799cd36f38570cafc8ea887",
  377. },
  378. {
  379. "1b3746add992215d427e43a58354c11ff9e6dfa1c187250938f7f9334fa41d05",
  380. "e2a1bfbe38a9749fe6ede79d923b778fa4c89393473d633bec01fa68617d0828",
  381. },
  382. {
  383. "69af25c54090a9746d3f6043348452429ffd53c1530fa114fd0055b70d61020f",
  384. "6bf1783b0a7495d5f6c36605dca95e723ca120a306c255084787f09b12771124",
  385. },
  386. {
  387. "0000000000000000000000000000000000000000000000000000000000000000",
  388. "0100000000000000000000000000000000000000000000000000000000000000",
  389. },
  390. {
  391. "0100000000000000000000000000000000000000000000000000000000000000",
  392. "5866666666666666666666666666666666666666666666666666666666666666",
  393. },
  394. {
  395. "0800000000000000000000000000000000000000000000000000000000000000",
  396. "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321",
  397. },
  398. {
  399. "ffffffffffffffff000000000000000000000000000000000000000000000000",
  400. "e185757a3fdc6519a6e7bebd97aa52bdc999e4c87d5c3aad0d995763ab6c6985",
  401. },
  402. };
  403. ge25519 pt, pt2;
  404. bignum256modm sc;
  405. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  406. expand256_modm(sc, fromhex(tests[i].sc), 32);
  407. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  408. ge25519_scalarmult_base_wrapper(&pt2, sc);
  409. ck_assert_int_eq(ge25519_eq(&pt, &pt2), 1);
  410. }
  411. }
  412. END_TEST
  413. START_TEST(test_xmr_ge25519_scalarmult) {
  414. static const struct {
  415. char *sc;
  416. char *pt;
  417. char *pt2;
  418. } tests[] = {
  419. {
  420. "0000000000000000000000000000000000000000000000000000000000000000",
  421. "5cbb3b2784c16f0e7eb4f2a7f93288552bb24ec51c5e01504c1e6885cfbca6d0",
  422. "0100000000000000000000000000000000000000000000000000000000000000",
  423. },
  424. {
  425. "0100000000000000000000000000000000000000000000000000000000000000",
  426. "f39b6770008d069acb92eb95329dec2cb0054da024e437a1bdf1ae06527deff6",
  427. "f39b6770008d069acb92eb95329dec2cb0054da024e437a1bdf1ae06527deff6",
  428. },
  429. {
  430. "3930000000000000000000000000000000000000000000000000000000000000",
  431. "2835b3983e3cc01a640fd188bf6bbbafbf997a3344d800eed22e4e82a412941c",
  432. "2fe8b2dd0f23e02fca6989e170135584d684583c0a44f6a7d3ebd964685d36c7",
  433. },
  434. {
  435. "ffffffffffffffff000000000000000000000000000000000000000000000000",
  436. "bb8af7a53a8f1b477c810e833a84cdc789a6b81a6b6417be4f97ffd9ae0fe0b8",
  437. "3a5c9a7dacca9dd8827881f38c36aad7d402a5efc2cab58c7553b903876e1491",
  438. },
  439. {
  440. "864203a09e1c788a482685c739af07355ebb2c840b7de6af87eff5f19ee3b807",
  441. "d404a9bbf351e7320ea6d11cdeeccaf505f706731cb5e5d839b950edb7ba6286",
  442. "11e09c89e0be7663e0e2d4a01fb05d6a3fd84a78a6fa4fd7daaacf2d19311a38",
  443. },
  444. {
  445. "3e01f05920a238e33766814d10f0c3a3e975072399ad90a823d4808db1d85209",
  446. "52a2d35798a0ac209b8fa194fe398b869aba5f20d80ee3d8ca77759a8e0bae0d",
  447. "4256addc2f036150f3fdc0a7905f01285239d6dd4eecc4be8e3b134eef4639fe",
  448. },
  449. {
  450. "ad63d591716a9e89a024a074bc6ce661268d1bb3665f91e8b981f189b1a49507",
  451. "3928bde7a92e1341c3dfee35a66fa5639204f5b9747963278af430145028648d",
  452. "9c959003ba91004956df98800a5024d94031db5ac659675b26350657d93c34f9",
  453. },
  454. };
  455. ge25519 pt, pt2, pt3;
  456. bignum256modm sc;
  457. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  458. expand256_modm(sc, fromhex(tests[i].sc), 32);
  459. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  460. ge25519_unpack_vartime(&pt2, fromhex(tests[i].pt2));
  461. ge25519_scalarmult(&pt3, &pt, sc);
  462. ck_assert_int_eq(ge25519_eq(&pt3, &pt2), 1);
  463. }
  464. }
  465. END_TEST
  466. START_TEST(test_xmr_ge25519_ops) {
  467. int tests[] = {1, 2, 7, 8, 637, 9912, 12345};
  468. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  469. struct ge25519_t a, b, c, d;
  470. bignum256modm s1 = {0}, s2 = {0}, s3 = {0}, s4 = {0};
  471. set256_modm(s1, tests[i]);
  472. set256_modm(s2, 8 * tests[i]);
  473. set256_modm(s3, 8);
  474. set256_modm(s4, 2);
  475. ge25519_scalarmult_base_niels(&a, ge25519_niels_base_multiples, s1);
  476. ge25519_scalarmult_base_niels(&b, ge25519_niels_base_multiples, s2);
  477. ge25519_scalarmult(&c, &a, s4);
  478. ge25519_scalarmult(&c, &c, s4);
  479. ge25519_scalarmult(&c, &c, s4);
  480. ck_assert_int_eq(ge25519_eq(&c, &b), 1);
  481. ck_assert_int_eq(ge25519_eq(&a, &b), 0);
  482. ge25519_scalarmult_base_wrapper(&a, s1);
  483. ge25519_mul8(&b, &a);
  484. ge25519_scalarmult_base_wrapper(&c, s2);
  485. ck_assert_int_eq(ge25519_eq(&b, &c), 1);
  486. ge25519_scalarmult(&d, &a, s3);
  487. ck_assert_int_eq(ge25519_eq(&d, &c), 1);
  488. ge25519_copy(&a, &b);
  489. ge25519_neg_full(&b);
  490. ck_assert_int_eq(ge25519_eq(&b, &c), 0);
  491. ge25519_add(&c, &a, &b, 0);
  492. set256_modm(s2, 0);
  493. ge25519_scalarmult_base_wrapper(&a, s2);
  494. ck_assert_int_eq(ge25519_eq(&a, &c), 1);
  495. }
  496. }
  497. END_TEST
  498. START_TEST(test_xmr_check_point) {
  499. static const struct {
  500. char *p;
  501. bool on;
  502. } tests[] = {
  503. {"001000a93e0e6937b4feaf079e418a028ca85459aa39ac3871b94076f88ca608",
  504. true},
  505. {"54863a0464c008acc99cffb179bc6cf34eb1bbdf6c29f7a070a7c6376ae30ab5",
  506. true},
  507. {"bebe3c84092c0f7a92704cafb16562cc45c47f45e84baec8d4bba3559d1c1808",
  508. true},
  509. {"00000000000000c60073ec000000000000ff0000000000000000000000000080",
  510. false},
  511. {"00000000000000004e0000000000000000000000000000000000000000000000",
  512. false},
  513. {"0000008b0000000000000000b200000000000000000000000000000000000080",
  514. false},
  515. {"a0953eebe2f676256c37af4f6f84f32d397aaf3b73606e96c5ddfcecbb1ceec8",
  516. false},
  517. {"a82cd837efee505ec8425769ea925bee869ec3c78a57708c64c2ef2bd6ad3b88",
  518. false},
  519. {"031c56cfc99758f6f025630e77c6dea0b853c3ab0bf6cf8c8dab03d1a4618178",
  520. false},
  521. };
  522. ge25519 tmp;
  523. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  524. int res = ge25519_unpack_negative_vartime(&tmp, fromhex(tests[i].p));
  525. ck_assert_int_eq(ge25519_check(&tmp), tests[i].on);
  526. ck_assert_int_eq(res, tests[i].on);
  527. }
  528. }
  529. END_TEST
  530. START_TEST(test_xmr_h) {
  531. char *H = "8b655970153799af2aeadc9ff1add0ea6c7251d54154cfa92c173a0dd39c1f94";
  532. ge25519 H2, Z;
  533. ge25519_p1p1 P_11;
  534. ge25519_pniels P_ni;
  535. uint8_t buff[32] = {0};
  536. ge25519_pack(buff, &xmr_h);
  537. ck_assert_mem_eq(buff, fromhex(H), 32);
  538. int res = ge25519_unpack_vartime(&H2, buff);
  539. ck_assert_int_eq(res, 1);
  540. ck_assert_int_eq(ge25519_eq(&xmr_h, &xmr_h), 1);
  541. ck_assert_int_eq(ge25519_eq(&H2, &xmr_h), 1);
  542. res = ge25519_unpack_negative_vartime(&H2, buff);
  543. ck_assert_int_eq(res, 1);
  544. ck_assert_int_eq(ge25519_eq(&H2, &xmr_h), 0);
  545. ge25519_neg_full(&H2);
  546. ck_assert_int_eq(ge25519_eq(&H2, &xmr_h), 1);
  547. ge25519_full_to_pniels(&P_ni, &xmr_h);
  548. ge25519_pnielsadd_p1p1(&P_11, &H2, &P_ni, 1);
  549. ge25519_p1p1_to_full(&H2, &P_11);
  550. ge25519_set_neutral(&Z);
  551. ck_assert_int_eq(ge25519_eq(&Z, &H2), 1);
  552. }
  553. END_TEST
  554. START_TEST(test_xmr_fast_hash) {
  555. uint8_t hash[32];
  556. char tests[][2][65] = {
  557. {"", "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"},
  558. {"00",
  559. "bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a"},
  560. {"000102",
  561. "f84a97f1f0a956e738abd85c2e0a5026f8874e3ec09c8f012159dfeeaab2b156"},
  562. {"000102030405",
  563. "51e8babe8b42352100dffa7f7b3843c95245d3d545c6cbf5052e80258ae80627"},
  564. {"000102030406",
  565. "74e7a0111ee2390dc68269a549a76dcfb553ca1260035eae982d669ff6494f32"},
  566. {"000102030407",
  567. "3a81c5d02a87786343f88414aae150a09f6933b1d3bb660d0a9ac54e12e5cd86"},
  568. {"259ef2aba8feb473cf39058a0fe30b9ff6d245b42b6826687ebd6b63128aff64",
  569. "7fb4d1c8e32f7414fe8c7b2774ec05bff6845e4278565d17f95559513a244da2"},
  570. {"44caa1c26187afe8dacc5d91cb8a51282334d9308a818fe4d3607275e2a61f05",
  571. "2998fe52f8b9883149babd9c546912c3edfbd3cd98896a0e57b1b5929fa5ff7b"},
  572. };
  573. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  574. xmr_fast_hash(hash, fromhex(tests[i][0]), strlen(tests[i][0]) / 2);
  575. ck_assert_mem_eq(hash, fromhex(tests[i][1]), 32);
  576. }
  577. }
  578. END_TEST
  579. START_TEST(test_xmr_hasher) {
  580. Hasher hasher;
  581. uint8_t hash[32];
  582. static const struct {
  583. char *chunk[3];
  584. char *hash;
  585. } tests[] = {
  586. {{"00", "01", "02"},
  587. "f84a97f1f0a956e738abd85c2e0a5026f8874e3ec09c8f012159dfeeaab2b156"},
  588. {{"001122334455667788", "00", ""},
  589. "72a228ee8d0d01c815f112ce315cfc215a0594abcec24162304ae0ffda139d9e"},
  590. {{"001000a93e0e6937b4feaf079e418a028ca85459aa39ac3871b94076f88ca608", "",
  591. "00112233445566"},
  592. "c3deafd96ff10cc190c6024548c344f6401cfe5151ab2fcd40df7cc501147e01"},
  593. };
  594. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  595. xmr_hasher_init(&hasher);
  596. for (int j = 0; j < 3; j++) {
  597. xmr_hasher_update(&hasher, fromhex(tests[i].chunk[j]),
  598. strlen(tests[i].chunk[j]) / 2);
  599. }
  600. xmr_hasher_final(&hasher, hash);
  601. ck_assert_mem_eq(hash, fromhex(tests[i].hash), 32);
  602. }
  603. }
  604. END_TEST
  605. START_TEST(test_xmr_hash_to_scalar) {
  606. bignum256modm a1;
  607. unsigned char out[32];
  608. char tests[][2][65] = {
  609. {"", "4a078e76cd41a3d3b534b83dc6f2ea2de500b653ca82273b7bfad8045d85a400"},
  610. {"00",
  611. "5497c9b6a7059553835f85118dc089d66512f7b477d66591ff96a9e064bcc90a"},
  612. {"000102",
  613. "5727ca206dbafa2e099b022ed528f5bdf7874e3ec09c8f012159dfeeaab2b106"},
  614. {"000102030405",
  615. "7740cf04577c107153a50b3abe44859f5245d3d545c6cbf5052e80258ae80607"},
  616. {"000102030406",
  617. "ad6bbffaceb8020543ac82bcadb9d090b553ca1260035eae982d669ff6494f02"},
  618. {"000102030407",
  619. "d2e116e9576ee5a29011c8fcb41259f99e6933b1d3bb660d0a9ac54e12e5cd06"},
  620. {"259ef2aba8feb473cf39058a0fe30b9ff6d245b42b6826687ebd6b63128aff64",
  621. "3d6d3727dc50bca39e6ccfc9c12950eef5845e4278565d17f95559513a244d02"},
  622. {"44caa1c26187afe8dacc5d91cb8a51282334d9308a818fe4d3607275e2a61f05",
  623. "aecc45c83f0408c96c70f8273e94f930edfbd3cd98896a0e57b1b5929fa5ff0b"},
  624. };
  625. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  626. xmr_hash_to_scalar(a1, fromhex(tests[i][0]), strlen(tests[i][0]) / 2);
  627. contract256_modm(out, a1);
  628. ck_assert_mem_eq(out, fromhex(tests[i][1]), 32);
  629. }
  630. }
  631. END_TEST
  632. START_TEST(test_xmr_hash_to_ec) {
  633. ge25519 p1;
  634. unsigned char out[32];
  635. char tests[][2][65] = {
  636. {"", "d6d7d783ab18e1be65586adb7902a4175b737ef0b902875e1d1d5c5cf0478c0b"},
  637. {"00",
  638. "8e2fecb36320bc4e192e10ef54afc7c83fbeb0c38b7debd4fea51301f0bd4f3d"},
  639. {"000102",
  640. "73b233e2e75d81b9657a857e38e7ab2bc3600e5c56622b9fe4b976ff312220fa"},
  641. {"000102030405",
  642. "bebe3c84092c0f7a92704cafb16562cc45c47f45e84baec8d4bba3559d1c1808"},
  643. {"000102030406",
  644. "525567a6a40a94f2d916bc1efea234bbd3b9162403ec2faba871a90f8d0d487e"},
  645. {"000102030407",
  646. "99b1be2a92cbd22b24b48fb7a9daadd4d13a56915c4f6ed696f271ad5bdbc149"},
  647. {"42f6835bf83114a1f5f6076fe79bdfa0bd67c74b88f127d54572d3910dd09201",
  648. "54863a0464c008acc99cffb179bc6cf34eb1bbdf6c29f7a070a7c6376ae30ab5"},
  649. {"44caa1c26187afe8dacc5d91cb8a51282334d9308a818fe4d3607275e2a61f05",
  650. "001000a93e0e6937b4feaf079e418a028ca85459aa39ac3871b94076f88ca608"},
  651. };
  652. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  653. xmr_hash_to_ec(&p1, fromhex(tests[i][0]), strlen(tests[i][0]) / 2);
  654. ge25519_pack(out, &p1);
  655. ck_assert_mem_eq(out, fromhex(tests[i][1]), 32);
  656. }
  657. }
  658. END_TEST
  659. START_TEST(test_xmr_derivation_to_scalar) {
  660. static const struct {
  661. char *pt;
  662. uint32_t idx;
  663. char *sc;
  664. } tests[] = {
  665. {
  666. "c655b2d9d2670a1c9f26f7586b6d6b1ec5173b8b33bca64c3d305a42d66738b1",
  667. 0,
  668. "ca7ce31b273dd1ac00dc3553e654fb66036804800e27c826bd2b78649243900b",
  669. },
  670. {
  671. "2b1dbd7a007dcc4d729fa8359705595599737fcef60afb36b379fe033095dca7",
  672. 1,
  673. "60afd5a63b14845d3b92d16eac386713e4ff617fdc5c1a07c3212098c1f5610c",
  674. },
  675. {
  676. "a48ed3797225dab4b4316b5e40107b6bd63e5f4dc517ba602774d703576ec771",
  677. 24,
  678. "fe81804091e50a5c2233faa6277360fbe1948ea15dddbae62c1d40bbd1918606",
  679. },
  680. {
  681. "fa27b5b39741f5341b4e89269e3a05ff7e76ec7739843872468fc4bec8475410",
  682. 65537,
  683. "1ba36841f57aa8b799c4dd02b39d53e5fb7780d3f09f91a57a86dcb418d8d506",
  684. },
  685. };
  686. ge25519 pt;
  687. bignum256modm sc, sc2;
  688. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  689. expand256_modm(sc, fromhex(tests[i].sc), 32);
  690. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  691. xmr_derivation_to_scalar(sc2, &pt, tests[i].idx);
  692. ck_assert_int_eq(eq256_modm(sc, sc2), 1);
  693. xmr_derivation_to_scalar(sc2, &pt, tests[i].idx + 1);
  694. ck_assert_int_eq(eq256_modm(sc, sc2), 0);
  695. }
  696. }
  697. END_TEST
  698. START_TEST(test_xmr_generate_key_derivation) {
  699. static const struct {
  700. char *pt;
  701. char *sc;
  702. char *r;
  703. } tests[] = {
  704. {
  705. "38f94f27c8037aff025e365275ed1029fd636dda5f69e5f98fdcf92e0a28f31a",
  706. "8f1c73ee5327a43264a7b60b9e7882312b582f33e89846a8694dbf094bb3a90a",
  707. "1fbfe4dcc8c824c274649545f297fa320cd4c1689b1d0ff4887567c4d4a75649",
  708. },
  709. {
  710. "26785c3941a32f194228eb659c5ee305e63868896defc50ee6c4e0e92d1e246a",
  711. "dbbffec4686ba8ab25e2f1b04c0e7ae51c5143c91353bfb5998430ebe365a609",
  712. "cca34db8dd682ec164d8973b555253934596b77849ef7709d9321121c25aba02",
  713. },
  714. {
  715. "43505a8ce7248f70d3aae4f57fb59c254ce2b2a0cc2bcf50f2344e51d59b36b3",
  716. "19a802e35f6ff94efe96ec016effe04e635bbd9c1ce2612d5ba2ee4659456b06",
  717. "fc6c93a93f77ff89c18b9abf95b28ec8591ab97eee8e4afee93aa766a4bd3934",
  718. },
  719. };
  720. ge25519 pt, pt2, pt3;
  721. bignum256modm sc;
  722. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  723. expand256_modm(sc, fromhex(tests[i].sc), 32);
  724. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  725. ge25519_unpack_vartime(&pt2, fromhex(tests[i].r));
  726. xmr_generate_key_derivation(&pt3, &pt, sc);
  727. ck_assert_int_eq(ge25519_eq(&pt3, &pt2), 1);
  728. ck_assert_int_eq(ge25519_eq(&pt3, &pt), 0);
  729. }
  730. }
  731. END_TEST
  732. START_TEST(test_xmr_derive_private_key) {
  733. static const struct {
  734. char *pt;
  735. uint32_t idx;
  736. char *base;
  737. char *r;
  738. } tests[] = {
  739. {
  740. "0541d8f069e5e80a892e39bbf1944ef578008cf9ecf1d100760a05858c1b709e",
  741. 0,
  742. "76967eeb0a3d181bb0b384be71c680a4287599f27b2ddbd07f8e06ab6f2c880e",
  743. "45728c5cb658e470790f124a01699d2126832b7e5c6b7760b6f11119b96ad603",
  744. },
  745. {
  746. "fc6e0bd785a84e62c9ac8a97e0e604a79494bc2cf7b3b38ef8af7791c87b5bb8",
  747. 1,
  748. "32fbe149562b7ccb34bc4105b87b2a834024799336c8eea5e94df77f1ae9a807",
  749. "64508e83bbadf63f8ecfae4d9dcdd39a4ba23508a545e1a37026f0fa2539d601",
  750. },
  751. {
  752. "f6bd7a72dc9444dc7e09a0eb4d312d36fe173693d6405b132a5b090297a04ea9",
  753. 65537,
  754. "333a8fcce6726457e4222a87b9b475c1fcf985f756c2029fcb39184c0a5c4804",
  755. "37c16a22da4c0082ebf4bf807403b169f75142a9bd8560ed45f3f9347218260e",
  756. },
  757. };
  758. ge25519 pt;
  759. bignum256modm base, res, res_exp;
  760. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  761. expand256_modm(base, fromhex(tests[i].base), 32);
  762. expand256_modm(res_exp, fromhex(tests[i].r), 32);
  763. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  764. xmr_derive_private_key(res, &pt, tests[i].idx, base);
  765. ck_assert_int_eq(eq256_modm(res, res_exp), 1);
  766. ck_assert_int_eq(eq256_modm(res, base), 0);
  767. }
  768. }
  769. END_TEST
  770. START_TEST(test_xmr_derive_public_key) {
  771. static const struct {
  772. char *pt;
  773. uint32_t idx;
  774. char *base;
  775. char *r;
  776. } tests[] = {
  777. {
  778. "653f03e7766d472826aa49793bc0cfde698e6745ae5e4217980ba307739f2ed9",
  779. 0,
  780. "2a393f0858732970ac8dea003b17e1ce9371f0a045bd9b7af0d998262739f4cc",
  781. "f7a3db27c45f265f6a68a30137ca44289a6cf1a6db2cf482c59ebfb0142ad419",
  782. },
  783. {
  784. "338e93f61e6470a5cc71c07b8caedd1a9a28da037aab65c1ca5538501b012c81",
  785. 1,
  786. "af3a1d39397d778731c4510110fd117dc02f756e390713d58f94a06203ce39eb",
  787. "779e2a043c881f06aba1952741fd753098615c4fafa8f62748467ab9bac43241",
  788. },
  789. {
  790. "7735e9476440927b89b18d7a1e0645b218a1a6d28c642aebb16c1dba0926d5e4",
  791. 65537,
  792. "62c3eed062bd602f7f2164c69ad0b5a8eb3ea560c930f6b41abfc1c4839ea432",
  793. "6da4ebd29498d16c4e813abb3e328c83f9b01a7ba1da6e818071f8ec563626c8",
  794. },
  795. };
  796. ge25519 pt, base, res, res_exp;
  797. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  798. ge25519_unpack_vartime(&pt, fromhex(tests[i].pt));
  799. ge25519_unpack_vartime(&base, fromhex(tests[i].base));
  800. ge25519_unpack_vartime(&res_exp, fromhex(tests[i].r));
  801. xmr_derive_public_key(&res, &pt, tests[i].idx, &base);
  802. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  803. ck_assert_int_eq(ge25519_eq(&res, &base), 0);
  804. }
  805. }
  806. END_TEST
  807. START_TEST(test_xmr_add_keys2) {
  808. static const struct {
  809. char *a;
  810. char *b;
  811. char *B;
  812. char *r;
  813. } tests[] = {
  814. {
  815. "631238da9578d7cb8db16fc4322671bfcb251cc5228b060664800ec1895be608",
  816. "f9a73fca0be058415a148f9e2871be59e1fc7ae6f6193199125237e0d7c1630f",
  817. "ef5ca4fc90f330e825adcdc953da0b3becd853aa819219842790bb39775f2255",
  818. "06623fd0e7a3d787a4d224f6ca2fdab2dcd9d1221578515974b9c4dee65fdcf5",
  819. },
  820. {
  821. "dac2e629e5c75c312253b19d1d3a0a423158fdd9cdcf4c7a7bf2717d0b748602",
  822. "0483d98d750d4977b499cefd558a0a61580823a37da2b011501e24718e6c7f0a",
  823. "51fd3cd2f1a603ec7be3b35da9c105d91c4304e6a63facf48d7730712cedc0ee",
  824. "f7a5d645ba01a5b7ccbe9636d14422bb587fc529317b23761f0e39222b783b87",
  825. },
  826. {
  827. "817c4d2fd3e841d860bdab6b7ccf098f3e637eca468d0a3825c50b71f61d0e0c",
  828. "1f6c4795d7fb0d53b5775874ac4c0963607d2b7bd11a7c5d10735badc4a27207",
  829. "bef0e0ed09d602bbe1dd38358b5f8fca27fcad60a69440f104441c3fc68df9c7",
  830. "bc0fc824d74eca0e10eacd0bc2f3322e0bcb02a44ce53f2f5f1fc472f99be8d2",
  831. },
  832. };
  833. bignum256modm a, b;
  834. ge25519 B, res, res_exp;
  835. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  836. expand256_modm(a, fromhex(tests[i].a), 32);
  837. expand256_modm(b, fromhex(tests[i].b), 32);
  838. ge25519_unpack_vartime(&B, fromhex(tests[i].B));
  839. ge25519_unpack_vartime(&res_exp, fromhex(tests[i].r));
  840. xmr_add_keys2(&res, a, b, &B);
  841. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  842. ck_assert_int_eq(ge25519_eq(&res, &B), 0);
  843. xmr_add_keys2_vartime(&res, a, b, &B);
  844. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  845. ck_assert_int_eq(ge25519_eq(&res, &B), 0);
  846. }
  847. }
  848. END_TEST
  849. START_TEST(test_xmr_add_keys3) {
  850. static const struct {
  851. char *a;
  852. char *A;
  853. char *b;
  854. char *B;
  855. char *r;
  856. } tests[] = {
  857. {
  858. "7048b8c4603ae194c502fa458b0e11a4c7a330852bbef66b7c1d67e9f919f509",
  859. "9167c5b182758699baeb421e7f1200272fc775e4c7c7c183cc47261dccbb569f",
  860. "c2cb2bc0249fc7be8eb9b3bed7d37aa6f2c3f433abb3a4a00b13bed64b61f30b",
  861. "b3ec53b07a1be70ac8d0fa365b86f0d6d4cbf98641e7704b3d684558e2ea59ef",
  862. "4dc016d702d599bde5eaeb2bf0c2d0d3f6b9cede961bc539bcb369c3b3086358",
  863. },
  864. {
  865. "e9794a6652940474958936f07f3904d514228553247633cfb7ae8ffa9fa0f406",
  866. "0e51cea6df2f6f56a9935689364f0d295a7c89f51d40efb2518c17d1b9db792b",
  867. "c132e7be08afdd93984c52c6e1c596edc6b8fc8f1faed95f55e2f819ee806706",
  868. "1a0e03c6858f6cf1b43f4b8456c03144af553bbbd050e152834fd1615b577cb3",
  869. "088f19c6727f8704373d391a36c230395d386f69edb4151ecf8afcd27793fff5",
  870. },
  871. {
  872. "88920b0c96b15cc04e879f53a76f85f3c7a2a5f275b2772b5b74ee83372aea00",
  873. "e95731ab61a98fedcded475cf21b4ecf2ef9f1adecefba8fdc476a5bb1cf60f9",
  874. "c86026b66c1045fb69e4f24ff6c15d4fad4d565e646938a2ffb7db37ccb4100d",
  875. "d80cbf2986c12e4c7ebac1e55abbdfc4212c00aec8bc90c965becf863262a074",
  876. "047cebaeb3ec2132e7386ba52531b04070206ba1106565c0fbd7d7280694568a",
  877. },
  878. };
  879. bignum256modm a, b;
  880. ge25519 A, B, res, res_exp;
  881. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  882. expand256_modm(a, fromhex(tests[i].a), 32);
  883. expand256_modm(b, fromhex(tests[i].b), 32);
  884. ge25519_unpack_vartime(&A, fromhex(tests[i].A));
  885. ge25519_unpack_vartime(&B, fromhex(tests[i].B));
  886. ge25519_unpack_vartime(&res_exp, fromhex(tests[i].r));
  887. xmr_add_keys3(&res, a, &A, b, &B);
  888. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  889. ck_assert_int_eq(ge25519_eq(&res, &B), 0);
  890. xmr_add_keys3_vartime(&res, a, &A, b, &B);
  891. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  892. ck_assert_int_eq(ge25519_eq(&res, &B), 0);
  893. }
  894. }
  895. END_TEST
  896. START_TEST(test_xmr_get_subaddress_secret_key) {
  897. static const struct {
  898. uint32_t major, minor;
  899. char *m;
  900. char *r;
  901. } tests[] = {
  902. {
  903. 0,
  904. 0,
  905. "36fad9f7bff465c15a755f1482fb2ecc3a4e434303df906882234e42b5813207",
  906. "8a510a9fe1824b49abbae05958084f9c9098775f29e15427309177882471cf01",
  907. },
  908. {
  909. 0,
  910. 1,
  911. "36fad9f7bff465c15a755f1482fb2ecc3a4e434303df906882234e42b5813207",
  912. "2bbc9366c04abb0523e2b2d6e709670ffe6645bacedfee968d9c6bc8eefe9c0f",
  913. },
  914. {
  915. 100,
  916. 100,
  917. "36fad9f7bff465c15a755f1482fb2ecc3a4e434303df906882234e42b5813207",
  918. "c3837d41fedeaed126cf4fc1a5ea47b8b7f38f6a64aa534e3dd45a3c93f37600",
  919. },
  920. };
  921. bignum256modm m, res, res_exp;
  922. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  923. expand256_modm(m, fromhex(tests[i].m), 32);
  924. expand256_modm(res_exp, fromhex(tests[i].r), 32);
  925. xmr_get_subaddress_secret_key(res, tests[i].major, tests[i].minor, m);
  926. ck_assert_int_eq(eq256_modm(res, res_exp), 1);
  927. ck_assert_int_eq(eq256_modm(res, m), 0);
  928. }
  929. }
  930. END_TEST
  931. START_TEST(test_xmr_gen_c) {
  932. static const struct {
  933. char *a;
  934. uint64_t amount;
  935. char *r;
  936. } tests[] = {
  937. {
  938. "e3e6558c291bbb98aa691d068b67d59dc520afb23fdd51bf65283626fc2ad903",
  939. 0,
  940. "ef19d73bdf3749240b80ee7695f53ad7c2fc2cf868a93209799f41212d099750",
  941. },
  942. {
  943. "6788c9579c377f3228680bd0e6d01b1ee0c763b35ed39d36fa2146cc2ee16e0e",
  944. 1,
  945. "4913b9af4f2725d87a4404c22cf366597d1c1e6a1f510ae14081d8b7c5a9de77",
  946. },
  947. {
  948. "ad9e89d67012935540427c241756d6a9d260c5e134603c41d31e24f8651bef08",
  949. 65537,
  950. "f005721da08f24e68314abed3ddfd94165e4be3813398fb126e3f366820b9c90",
  951. },
  952. {
  953. "fdbb70ff07be24d98de3bffa0a33756646497224318fb7fe136f0e7789d12607",
  954. 0xffffffffffffffffULL,
  955. "a9c38927f299c5f14c98a1a9c9981e59c606ff597274b9b709e1356f12e1498c",
  956. },
  957. };
  958. bignum256modm a;
  959. ge25519 res, res_exp;
  960. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  961. expand256_modm(a, fromhex(tests[i].a), 32);
  962. ge25519_unpack_vartime(&res_exp, fromhex(tests[i].r));
  963. xmr_gen_c(&res, a, tests[i].amount);
  964. ck_assert_int_eq(ge25519_eq(&res, &res_exp), 1);
  965. }
  966. }
  967. END_TEST
  968. START_TEST(test_xmr_varint) {
  969. static const struct {
  970. uint64_t x;
  971. char *r;
  972. } tests[] = {
  973. {
  974. 0,
  975. "00",
  976. },
  977. {
  978. 24,
  979. "18",
  980. },
  981. {
  982. 65535,
  983. "ffff03",
  984. },
  985. {
  986. 65537,
  987. "818004",
  988. },
  989. {
  990. 0x7fffffffULL,
  991. "ffffffff07",
  992. },
  993. {
  994. 0xffffffffULL,
  995. "ffffffff0f",
  996. },
  997. {
  998. 0xffffffffffffffffULL,
  999. "ffffffffffffffffff01",
  1000. },
  1001. {
  1002. 0xdeadc0deULL,
  1003. "de81b7f50d",
  1004. },
  1005. };
  1006. uint64_t val;
  1007. unsigned char buff[64];
  1008. for (size_t i = 0; i < (sizeof(tests) / sizeof(*tests)); i++) {
  1009. int s1 = xmr_size_varint(tests[i].x);
  1010. int written = 0;
  1011. int read = 0;
  1012. ck_assert_uint_eq((size_t)s1, strlen(tests[i].r) / 2);
  1013. written = xmr_write_varint(buff, sizeof(buff), tests[i].x);
  1014. ck_assert_int_eq(s1, written);
  1015. ck_assert_mem_eq(buff, fromhex(tests[i].r), strlen(tests[i].r) / 2);
  1016. read = xmr_read_varint(buff, sizeof(buff), &val);
  1017. ck_assert_int_eq(read, written);
  1018. ck_assert(tests[i].x == val);
  1019. }
  1020. }
  1021. END_TEST
  1022. #endif