test_check_cardano.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. // https://github.com/input-output-hk/cardano-crypto/blob/master/tests/goldens/cardano/crypto/wallet/BIP39-128
  2. START_TEST(test_ed25519_cardano_sign_vectors) {
  3. ed25519_public_key public_key;
  4. ed25519_secret_key secret_key;
  5. ed25519_secret_key secret_key_extension;
  6. ed25519_signature signature;
  7. static const char *vectors[] = {
  8. "6065a956b1b34145c4416fdc3ba3276801850e91a77a31a7be782463288aea5"
  9. "3", // private key
  10. "60ba6e25b1a02157fb69c5d1d7b96c4619736e545447069a6a6f0ba90844bc8"
  11. "e", // private key extension
  12. "64b20fa082b3143d6b5eed42c6ef63f99599d0888afe060620abc1b319935fe"
  13. "1", // public key
  14. "45b1a75fe3119e13c6f60ab9ba674b42f946fdc558e07c83dfa0751c2eba69c7"
  15. "9331bd8a4a975662b23628a438a0eba76367e44c12ca91b39ec59063f860f10"
  16. "d", // signature
  17. "e7d27516538403a53a8b041656a3f570909df641a0ab811fe7d87c9ba02a830"
  18. "c", // private key
  19. "794a2c54ad8b525b781773c87d38cbf4197636bc427a9d551368286fe4c294a"
  20. "4", // private key extension
  21. "95bb82ffd5707716bc65170ab4e8dafeed90fbe0ce9258713b7751e962d931d"
  22. "f", // public key
  23. "f2c9171782e7df7665126ac545ae53b05964b0160536efdb545e2460dbbec2b1"
  24. "9ec6b338b8f1bf4dfee94360ed024b115e37b1d7e6f3f9ae4beb79539428560"
  25. "f", // signature
  26. "9b5a3d9a4c60bcd49bb64b72c082b164314d0f61d842f2575fd1d4fb30a28a0"
  27. "c", // private key
  28. "b093e376f41eb7bf80abcd0073a52455d25b5d21815bc758e5f6f81536aedeb"
  29. "b", // private key extension
  30. "79fc8154554b97e4c56ef2f9dbb4c1421ff19509688931a1e964bda5dec0f19"
  31. "f", // public key
  32. "2ba1439ae648a7e8da7c9ab1ee6da94fd4ebe37abd0978306e8fba2afa8f111a"
  33. "88a993dbf008bedae9167f4f68409e4c9ddaf02cba12418447b1848907ad800"
  34. "f", // signature
  35. "52e0c98aa600cfdcd1ff28fcda5227ed87063f4a98547a78b771052cf102b40"
  36. "c", // private key
  37. "6c18d9f8075b1a6a1833540607479bd58b7beb8a83d2bb01ca7ae02452a2580"
  38. "3", // private key extension
  39. "dc907c7c06e6314eedd9e18c9f6c6f9cc4e205fb1c70da608234c319f1f7b0d"
  40. "6", // public key
  41. "0cd34f84e0d2fcb1800bdb0e869b9041349955ced66aedbe6bda187ebe8d36a6"
  42. "2a05b39647e92fcc42aa7a7368174240afba08b8c81f981a22f942d6bd78160"
  43. "2", // signature
  44. "11fd6462a3a92b35c22703f6f1c124ddcf36b7c2b09cc2784f320e1cfa12ec0"
  45. "4", // private key
  46. "c2785803c61c46aeca192a1bb1b7b20a8c4cc7fa01db57fc5d1d8a547340235"
  47. "2", // private key extension
  48. "839775a41876e328986aa26168958bba1176e67819b357eea84afceab8b1db7"
  49. "8", // public key
  50. "e41f73db2f8d2896a687802b2be76b7cabb73dfbb4891494883a0cbd9bbb9e5f"
  51. "9d3e14d2d0b06c6674333508496db660936737c0efd9511514147dac79fa490"
  52. "5", // signature
  53. "5b1e5cad02274ba461f4708d8598d3497faf8fe3e894a379573aa6ac3a03e50"
  54. "5", // private key
  55. "ba179d2e3c67aabb486c48d16002b51ad32eab434c738a1550962313b07098c"
  56. "d", // private key extension
  57. "75eb8d197ec8627c85af88e66aa1e49065dd8ac98ed8991db52ece01635dfb7"
  58. "6", // public key
  59. "631015357cee3051116b4c2ff4d1c5beb13b6e5023635aa1eeb0563cadf0d4fb"
  60. "c10bd5e31b4a4220c67875558c41b5cc0328104ae39cc7ff20ff0c2bda59890"
  61. "6", // signature
  62. "624b47150f58dfa44284fbc63c9f99b9b79f808c4955a461f0e2be44eb0be50"
  63. "d", // private key
  64. "097aa006d694b165ef37cf23562e5967c96e49255d2f20faae478dee83aa5b0"
  65. "2", // private key extension
  66. "0588589cd9b51dfc028cf225674069cbe52e0e70deb02dc45b79b26ee3548b0"
  67. "0", // public key
  68. "1de1d275428ba9491a433cd473cd076c027f61e7a8b5391df9dea5cb4bc88d8a"
  69. "57b095906a30b13e68259851a8dd3f57b6f0ffa37a5d3ffc171240f2d404f90"
  70. "1", // signature
  71. 0,
  72. 0,
  73. };
  74. const char **test_data;
  75. test_data = vectors;
  76. while (*test_data) {
  77. memcpy(secret_key, fromhex(*test_data), 32);
  78. MARK_SECRET_DATA(secret_key, sizeof(secret_key));
  79. memcpy(secret_key_extension, fromhex(*(test_data + 1)), 32);
  80. MARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
  81. ed25519_publickey_ext(secret_key, public_key);
  82. UNMARK_SECRET_DATA(public_key, sizeof(public_key));
  83. ck_assert_mem_eq(public_key, fromhex(*(test_data + 2)), 32);
  84. const uint8_t *message = (const uint8_t *)"Hello World";
  85. ed25519_sign_ext(message, 11, secret_key, secret_key_extension, signature);
  86. UNMARK_SECRET_DATA(signature, sizeof(signature));
  87. ck_assert_mem_eq(signature, fromhex(*(test_data + 3)), 64);
  88. UNMARK_SECRET_DATA(secret_key, sizeof(secret_key));
  89. UNMARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
  90. test_data += 4;
  91. }
  92. }
  93. END_TEST
  94. START_TEST(test_bip32_cardano_hdnode_vector_1) {
  95. HDNode node;
  96. uint8_t mnemonic_bits[66];
  97. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  98. int mnemonic_bits_len = mnemonic_to_bits(
  99. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  100. "junk",
  101. mnemonic_bits);
  102. ck_assert_int_eq(mnemonic_bits_len, 132);
  103. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  104. mnemonic_bits_len / 8, cardano_secret,
  105. NULL);
  106. hdnode_from_secret_cardano(cardano_secret, &node);
  107. ck_assert_mem_eq(
  108. cardano_secret,
  109. fromhex(
  110. "08a14df748e477a69d21c97c56db151fc19e2521f31dd0ac5360f269e5b6ea46"
  111. "daeb991f2d2128e2525415c56a07f4366baa26c1e48572a5e073934b6de35fbc"
  112. "affbc325d9027c0f2d9f925b1dcf6c12bf5c1dd08904474066a4f2c00db56173"),
  113. 96);
  114. ck_assert_mem_eq(
  115. node.chain_code,
  116. fromhex(
  117. "affbc325d9027c0f2d9f925b1dcf6c12bf5c1dd08904474066a4f2c00db56173"),
  118. 32);
  119. ck_assert_mem_eq(
  120. node.private_key,
  121. fromhex(
  122. "08a14df748e477a69d21c97c56db151fc19e2521f31dd0ac5360f269e5b6ea46"),
  123. 32);
  124. ck_assert_mem_eq(
  125. node.private_key_extension,
  126. fromhex(
  127. "daeb991f2d2128e2525415c56a07f4366baa26c1e48572a5e073934b6de35fbc"),
  128. 32);
  129. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  130. ck_assert_mem_eq(
  131. node.public_key + 1,
  132. fromhex(
  133. "9a1d04808b4c0682816961cf666e82a7fd35949658aba5354c517eccf12aacb4"),
  134. 32);
  135. }
  136. END_TEST
  137. START_TEST(test_bip32_cardano_hdnode_vector_2) {
  138. HDNode node;
  139. uint8_t mnemonic_bits[66];
  140. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  141. int mnemonic_bits_len = mnemonic_to_bits(
  142. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  143. "junk",
  144. mnemonic_bits);
  145. ck_assert_int_eq(mnemonic_bits_len, 132);
  146. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  147. mnemonic_bits_len / 8, cardano_secret,
  148. NULL);
  149. hdnode_from_secret_cardano(cardano_secret, &node);
  150. hdnode_private_ckd(&node, 0x80000000);
  151. ck_assert_mem_eq(
  152. node.chain_code,
  153. fromhex(
  154. "104c6a0736e501c9bfe2966ba3773f5320495b19c3f2ed222234850af2ccd5b1"),
  155. 32);
  156. ck_assert_mem_eq(
  157. node.private_key,
  158. fromhex(
  159. "6064bf06b2e981d7c9792b1482eeecd40ec3cfa12143f4a1f149d48ce8b6ea46"),
  160. 32);
  161. ck_assert_mem_eq(
  162. node.private_key_extension,
  163. fromhex(
  164. "64aa9a16331f14c981b769efcf96addcc4c6db44047fe7a7feae0be23d33bf54"),
  165. 32);
  166. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  167. ck_assert_mem_eq(
  168. node.public_key + 1,
  169. fromhex(
  170. "c651c14a13c2311fc30a7acf244add1fdac3683e7ba89b4571e4cbcab509b915"),
  171. 32);
  172. }
  173. END_TEST
  174. START_TEST(test_bip32_cardano_hdnode_vector_3) {
  175. HDNode node;
  176. uint8_t mnemonic_bits[66];
  177. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  178. int mnemonic_bits_len = mnemonic_to_bits(
  179. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  180. "junk",
  181. mnemonic_bits);
  182. ck_assert_int_eq(mnemonic_bits_len, 132);
  183. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  184. mnemonic_bits_len / 8, cardano_secret,
  185. NULL);
  186. hdnode_from_secret_cardano(cardano_secret, &node);
  187. hdnode_private_ckd(&node, 0x80000001);
  188. ck_assert_mem_eq(
  189. node.chain_code,
  190. fromhex(
  191. "da99870d7e69de2a76f255ba8c7ed22428c7e5b0a8df978753c707c95ec3d4ca"),
  192. 32);
  193. ck_assert_mem_eq(
  194. node.private_key,
  195. fromhex(
  196. "c85fa69f4a1891fd98d1d1fc5f0cf9b1d6e44b0e6906744ab23ea766edb6ea46"),
  197. 32);
  198. ck_assert_mem_eq(
  199. node.private_key_extension,
  200. fromhex(
  201. "b4fc241feffe840b8a54a26ab447f5a5caa31032db3a8091fca14f38b86ed539"),
  202. 32);
  203. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  204. ck_assert_mem_eq(
  205. node.public_key + 1,
  206. fromhex(
  207. "5a5b0c92530cd366f05cf072509c806f904262c259e79a0080bbd5ee35706bb1"),
  208. 32);
  209. }
  210. END_TEST
  211. START_TEST(test_bip32_cardano_hdnode_vector_4) {
  212. HDNode node;
  213. uint8_t mnemonic_bits[66];
  214. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  215. int mnemonic_bits_len = mnemonic_to_bits(
  216. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  217. "junk",
  218. mnemonic_bits);
  219. ck_assert_int_eq(mnemonic_bits_len, 132);
  220. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  221. mnemonic_bits_len / 8, cardano_secret,
  222. NULL);
  223. hdnode_from_secret_cardano(cardano_secret, &node);
  224. hdnode_private_ckd(&node, 0x80000000);
  225. hdnode_private_ckd(&node, 0x80000001);
  226. ck_assert_mem_eq(
  227. node.chain_code,
  228. fromhex(
  229. "b40c44dfd9be08591b62be7f9991c85f812d8196927f3c824d9fcb17d275089e"),
  230. 32);
  231. ck_assert_mem_eq(
  232. node.private_key,
  233. fromhex(
  234. "d064dcf1449d9c3e47f5b422680343561989035bf2e4e23fc34cb61fedb6ea46"),
  235. 32);
  236. ck_assert_mem_eq(
  237. node.private_key_extension,
  238. fromhex(
  239. "a3071959013af95aaecf78a7a2e1b9838bbbc4864d6a8a2295243782078345cd"),
  240. 32);
  241. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  242. ck_assert_mem_eq(
  243. node.public_key + 1,
  244. fromhex(
  245. "aaaca5e7adc69a03ef1f5c017ed02879e8ca871df028461ed9bf19fb8fa15038"),
  246. 32);
  247. }
  248. END_TEST
  249. START_TEST(test_bip32_cardano_hdnode_vector_5) {
  250. HDNode node;
  251. uint8_t mnemonic_bits[66];
  252. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  253. int mnemonic_bits_len = mnemonic_to_bits(
  254. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  255. "junk",
  256. mnemonic_bits);
  257. ck_assert_int_eq(mnemonic_bits_len, 132);
  258. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  259. mnemonic_bits_len / 8, cardano_secret,
  260. NULL);
  261. hdnode_from_secret_cardano(cardano_secret, &node);
  262. hdnode_private_ckd(&node, 0x80000000);
  263. hdnode_private_ckd(&node, 0x80000001);
  264. hdnode_private_ckd(&node, 0x80000002);
  265. ck_assert_mem_eq(
  266. node.chain_code,
  267. fromhex(
  268. "2593896baf92f6ab2c0f253787ab16be0244ba95e0d48ba09da1a7fd3f926c72"),
  269. 32);
  270. ck_assert_mem_eq(
  271. node.private_key,
  272. fromhex(
  273. "0811b6d5d6f7120cb05d4ce5453d6ce42825c2a8e53b6d370a6b05ccf4b6ea46"),
  274. 32);
  275. ck_assert_mem_eq(
  276. node.private_key_extension,
  277. fromhex(
  278. "5bebf1eea68acd04932653d944b064b10baaf5886dd73c185cc285059bf93363"),
  279. 32);
  280. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  281. ck_assert_mem_eq(
  282. node.public_key + 1,
  283. fromhex(
  284. "1c87a32c5babad2fe33e0586bdc523574c6126f8368bc76598e17ea46201f980"),
  285. 32);
  286. }
  287. END_TEST
  288. START_TEST(test_bip32_cardano_hdnode_vector_6) {
  289. HDNode node;
  290. uint8_t mnemonic_bits[66];
  291. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  292. int mnemonic_bits_len = mnemonic_to_bits(
  293. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  294. "junk",
  295. mnemonic_bits);
  296. ck_assert_int_eq(mnemonic_bits_len, 132);
  297. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  298. mnemonic_bits_len / 8, cardano_secret,
  299. NULL);
  300. hdnode_from_secret_cardano(cardano_secret, &node);
  301. hdnode_private_ckd(&node, 0x80000000);
  302. hdnode_private_ckd(&node, 0x80000001);
  303. hdnode_private_ckd(&node, 0x80000002);
  304. hdnode_private_ckd(&node, 0x80000002);
  305. ck_assert_mem_eq(
  306. node.chain_code,
  307. fromhex(
  308. "fe8c6c2ab1e30385513fcffb49dcfe3e7805260425ea76b3b72b9f5bbe3b3d40"),
  309. 32);
  310. ck_assert_mem_eq(
  311. node.private_key,
  312. fromhex(
  313. "6019b9f5ef6ca530b657bcdb500de5455db8d51afb951fa045b6fbb3f6b6ea46"),
  314. 32);
  315. ck_assert_mem_eq(
  316. node.private_key_extension,
  317. fromhex(
  318. "466332cb097934b43008701e7e27044aa56c7859019e4eba18d91a3bea23dff7"),
  319. 32);
  320. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  321. ck_assert_mem_eq(
  322. node.public_key + 1,
  323. fromhex(
  324. "0b8f04755481ced76b4e5795aaafdb3cbd757c10fe60e9c58f48cf29a7ec3575"),
  325. 32);
  326. }
  327. END_TEST
  328. START_TEST(test_bip32_cardano_hdnode_vector_7) {
  329. HDNode node;
  330. uint8_t mnemonic_bits[66];
  331. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  332. int mnemonic_bits_len = mnemonic_to_bits(
  333. "ring crime symptom enough erupt lady behave ramp apart settle citizen "
  334. "junk",
  335. mnemonic_bits);
  336. ck_assert_int_eq(mnemonic_bits_len, 132);
  337. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  338. mnemonic_bits_len / 8, cardano_secret,
  339. NULL);
  340. hdnode_from_secret_cardano(cardano_secret, &node);
  341. hdnode_private_ckd(&node, 0x80000000);
  342. hdnode_private_ckd(&node, 0x80000001);
  343. hdnode_private_ckd(&node, 0x80000002);
  344. hdnode_private_ckd(&node, 0x80000002);
  345. hdnode_private_ckd(&node, 0xBB9ACA00);
  346. ck_assert_mem_eq(
  347. node.chain_code,
  348. fromhex(
  349. "ff77c08d37471c1d4cedd3fae2642c009324d9712492efc74dedab09c9bf973c"),
  350. 32);
  351. ck_assert_mem_eq(
  352. node.private_key,
  353. fromhex(
  354. "488f34840bba516f7920f91676b8681d0dd833b4ce14468e0810b255f9b6ea46"),
  355. 32);
  356. ck_assert_mem_eq(
  357. node.private_key_extension,
  358. fromhex(
  359. "01eccef768a79859f824a1d3c3e35e131184e2940c3fca9a4c9b307741f65363"),
  360. 32);
  361. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  362. ck_assert_mem_eq(
  363. node.public_key + 1,
  364. fromhex(
  365. "148605be54585773b44ba87e79265149ae444c4cc37cb1f8db8c08482fba293b"),
  366. 32);
  367. }
  368. END_TEST
  369. START_TEST(test_bip32_cardano_hdnode_vector_8) {
  370. HDNode node;
  371. uint8_t mnemonic_bits[66];
  372. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  373. int mnemonic_bits_len = mnemonic_to_bits(
  374. "found differ bulb shadow wrist blue bind vessel deposit tip pelican "
  375. "action surprise weapon check fiction muscle this",
  376. mnemonic_bits);
  377. ck_assert_int_eq(mnemonic_bits_len, 198);
  378. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  379. mnemonic_bits_len / 8, cardano_secret,
  380. NULL);
  381. hdnode_from_secret_cardano(cardano_secret, &node);
  382. hdnode_private_ckd(&node, 0x80000000);
  383. hdnode_private_ckd(&node, 0x80000001);
  384. hdnode_private_ckd(&node, 0x80000002);
  385. hdnode_private_ckd(&node, 0x80000002);
  386. hdnode_private_ckd(&node, 0xBB9ACA00);
  387. ck_assert_mem_eq(
  388. node.chain_code,
  389. fromhex(
  390. "6fb22a4531ad79e828c4907c5fff3ecf686c16cb195f81243f1f0330173380e4"),
  391. 32);
  392. ck_assert_mem_eq(
  393. node.private_key,
  394. fromhex(
  395. "a0baa34e4e24f0500ed6e5e90ab41984b965b7464b0b28640528778dd8a6b854"),
  396. 32);
  397. ck_assert_mem_eq(
  398. node.private_key_extension,
  399. fromhex(
  400. "170e0d3b65ba8d71f27a6db60d0ac26dcb16e52e08cc259db72066f206b258d5"),
  401. 32);
  402. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  403. ck_assert_mem_eq(
  404. node.public_key + 1,
  405. fromhex(
  406. "3dae0c06d87db618d73ee808425898cdd882f9eb43bf139c6b3a4760551ee89f"),
  407. 32);
  408. }
  409. END_TEST
  410. START_TEST(test_bip32_cardano_hdnode_vector_9) {
  411. HDNode node;
  412. uint8_t mnemonic_bits[66];
  413. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  414. int mnemonic_bits_len = mnemonic_to_bits(
  415. "balance exotic ranch knife glory slow tape favorite yard gym awake "
  416. "ill exist useless parent aim pig stay effort into square gasp credit "
  417. "butter",
  418. mnemonic_bits);
  419. ck_assert_int_eq(mnemonic_bits_len, 264);
  420. secret_from_entropy_cardano_icarus((const uint8_t *)"", 0, mnemonic_bits,
  421. mnemonic_bits_len / 8, cardano_secret,
  422. NULL);
  423. hdnode_from_secret_cardano(cardano_secret, &node);
  424. hdnode_private_ckd(&node, 0x80000000);
  425. hdnode_private_ckd(&node, 0x80000001);
  426. hdnode_private_ckd(&node, 0x80000002);
  427. hdnode_private_ckd(&node, 0x80000002);
  428. hdnode_private_ckd(&node, 0xBB9ACA00);
  429. ck_assert_mem_eq(
  430. node.chain_code,
  431. fromhex(
  432. "9b226add79f90086ea18b260da633089fe121db758aa31284ad1affaf3c9bb68"),
  433. 32);
  434. ck_assert_mem_eq(
  435. node.private_key,
  436. fromhex(
  437. "38eb2a79486e516cb6658700503a3e2c870c03e9d1aec731f780aa6fb7f7de44"),
  438. 32);
  439. ck_assert_mem_eq(
  440. node.private_key_extension,
  441. fromhex(
  442. "80d2c677638e5dbd4395cdec279bf2a42077f2797c9e887949d37cdb317fce6a"),
  443. 32);
  444. ck_assert_int_eq(hdnode_fill_public_key(&node), 0);
  445. ck_assert_mem_eq(
  446. node.public_key + 1,
  447. fromhex(
  448. "115a365b2aad1d8eba7d379de518f1fa8553855110af24e5695011c32ce9a300"),
  449. 32);
  450. }
  451. END_TEST
  452. START_TEST(test_cardano_ledger_vector_1) {
  453. uint8_t seed[512 / 8];
  454. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  455. const char *mnemonic =
  456. "recall grace sport punch exhibit mad harbor stand obey "
  457. "short width stem awkward used stairs wool ugly "
  458. "trap season stove worth toward congress jaguar";
  459. mnemonic_to_seed(mnemonic, "", seed, NULL);
  460. const int res =
  461. secret_from_seed_cardano_ledger(seed, sizeof(seed), cardano_secret);
  462. ck_assert_int_eq(res, 1);
  463. ck_assert_mem_eq(
  464. cardano_secret,
  465. fromhex(
  466. "a08cf85b564ecf3b947d8d4321fb96d70ee7bb760877e371899b14e2ccf88658"
  467. "104b884682b57efd97decbb318a45c05a527b9cc5c2f64f7352935a049ceea60"
  468. "680d52308194ccef2a18e6812b452a5815fbd7f5babc083856919aaf668fe7e4"),
  469. CARDANO_SECRET_LENGTH);
  470. }
  471. END_TEST
  472. START_TEST(test_cardano_ledger_vector_2) {
  473. uint8_t seed[512 / 8];
  474. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  475. const char *mnemonic =
  476. "correct cherry mammal bubble want mandate polar hazard "
  477. "crater better craft exotic choice fun tourist census "
  478. "gap lottery neglect address glow carry old business";
  479. mnemonic_to_seed(mnemonic, "", seed, NULL);
  480. const int res =
  481. secret_from_seed_cardano_ledger(seed, sizeof(seed), cardano_secret);
  482. ck_assert_int_eq(res, 1);
  483. ck_assert_mem_eq(
  484. cardano_secret,
  485. fromhex(
  486. "587c6774357ecbf840d4db6404ff7af016dace0400769751ad2abfc77b9a3844"
  487. "cc71702520ef1a4d1b68b91187787a9b8faab0a9bb6b160de541b6ee62469901"
  488. "fc0beda0975fe4763beabd83b7051a5fd5cbce5b88e82c4bbaca265014e524bd"),
  489. CARDANO_SECRET_LENGTH);
  490. }
  491. END_TEST
  492. START_TEST(test_cardano_ledger_vector_3) {
  493. uint8_t seed[512 / 8];
  494. uint8_t cardano_secret[CARDANO_SECRET_LENGTH];
  495. const char *mnemonic =
  496. "abandon abandon abandon abandon abandon abandon abandon abandon "
  497. "abandon abandon abandon abandon abandon abandon abandon abandon "
  498. "abandon abandon abandon abandon abandon abandon abandon art";
  499. mnemonic_to_seed(mnemonic, "foo", seed, NULL);
  500. const int res =
  501. secret_from_seed_cardano_ledger(seed, sizeof(seed), cardano_secret);
  502. ck_assert_int_eq(res, 1);
  503. ck_assert_mem_eq(
  504. cardano_secret,
  505. fromhex(
  506. "f053a1e752de5c26197b60f032a4809f08bb3e5d90484fe42024be31efcba757"
  507. "8d914d3ff992e21652fee6a4d99f6091006938fac2c0c0f9d2de0ba64b754e92"
  508. "a4f3723f23472077aa4cd4dd8a8a175dba07ea1852dad1cf268c61a2679c3890"),
  509. CARDANO_SECRET_LENGTH);
  510. }
  511. END_TEST