test_check_cashaddr.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "cash_addr.h"
  2. static const char* valid_cashchecksum[] = {
  3. "prefix:x64nx6hz",
  4. "p:gpf8m4h7",
  5. "bitcoincash:qpzry9x8gf2tvdw0s3jn54khce6mua7lcw20ayyn",
  6. "bchtest:testnetaddress4d6njnut",
  7. "bchreg:555555555555555555555555555555555555555555555udxmlmrz",
  8. };
  9. struct valid_cashaddr_data {
  10. const char* legacy;
  11. const char* cashaddress;
  12. };
  13. static struct valid_cashaddr_data valid_cashaddr[] = {
  14. {"1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu",
  15. "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"},
  16. {"1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR",
  17. "bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy"},
  18. {"16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb",
  19. "bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r"},
  20. {"3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC",
  21. "bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq"},
  22. {"3LDsS579y7sruadqu11beEJoTjdFiFCdX4",
  23. "bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e"},
  24. {"31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw",
  25. "bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37"}};
  26. START_TEST(test_cashaddr) {
  27. size_t i;
  28. for (i = 0; i < sizeof(valid_cashchecksum) / sizeof(valid_cashchecksum[0]);
  29. ++i) {
  30. uint8_t data[82];
  31. char rebuild[92];
  32. char hrp[84];
  33. size_t data_len;
  34. int res = cash_decode(hrp, data, &data_len, valid_cashchecksum[i]);
  35. ck_assert_int_eq(res, 1);
  36. res = cash_encode(rebuild, hrp, data, data_len);
  37. ck_assert_int_eq(res, 1);
  38. ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashchecksum[i], 92), 0);
  39. }
  40. for (i = 0; i < sizeof(valid_cashaddr) / sizeof(valid_cashaddr[0]); ++i) {
  41. uint8_t prog[65];
  42. size_t prog_len;
  43. const char* hrp = "bitcoincash";
  44. uint8_t rawdata[65];
  45. size_t rawdata_len;
  46. char rebuild[93];
  47. int ret =
  48. cash_addr_decode(prog, &prog_len, hrp, valid_cashaddr[i].cashaddress);
  49. ck_assert_int_eq(ret, 1);
  50. ck_assert_uint_eq(prog_len, 21);
  51. rawdata_len = base58_decode_check(valid_cashaddr[i].legacy, HASHER_SHA2D,
  52. rawdata, sizeof(rawdata));
  53. ck_assert_uint_eq(rawdata_len, 21);
  54. int addr_type = -1;
  55. if (rawdata[0] == 0) {
  56. addr_type = 0x00; // P2PKH
  57. } else if (rawdata[0] == 5) {
  58. addr_type = 0x08; // P2SH
  59. } else {
  60. ck_abort();
  61. }
  62. ck_assert_uint_eq(prog[0], addr_type);
  63. ck_assert_int_eq(memcmp(rawdata + 1, prog + 1, 20), 0);
  64. ret = cash_addr_encode(rebuild, hrp, prog, 21);
  65. ck_assert_int_eq(ret, 1);
  66. ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashaddr[i].cashaddress, 92),
  67. 0);
  68. }
  69. }
  70. END_TEST