sm9test.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /*
  2. * Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the License); you may
  5. * not use this file except in compliance with the License.
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <gmssl/sm9.h>
  13. #include <gmssl/error.h>
  14. #include <gmssl/rand.h>
  15. static int sm9_bn_equ_hex(const sm9_bn_t a, const char *hex)
  16. {
  17. sm9_bn_t b;
  18. sm9_bn_from_hex(b, hex);
  19. return (sm9_bn_cmp(a, b) == 0);
  20. }
  21. #define hex_iv "123456789abcdef00fedcba987654321123456789abcdef00fedcba987654321"
  22. #define hex_fp_add "114efe24536598809df494ff7657484edff1812d51c3955b7d869149aa123d31"
  23. #define hex_fp_sub "43cee97c9abed9be3efe7ffffc9d30abe1d643b9b27ea351460aabb2239d3fd4"
  24. #define hex_fp_nsub "7271168367e4cd3397052b4ff8f19699401c4f9167fc4b8a9f64ef75bfb405a9"
  25. #define hex_fp_dbl "551de7a0ee24723edcf314ff72f478fac1c7c4e7044238acc3913cfbcdaf7d05"
  26. #define hex_fp_tri "248cdb7163e4d7e5606ac9d731a751d591b25db4f925dd9532a20de5c2de98c9"
  27. #define hex_fp_div2 "9df779e83d83d9c517bf85bbd4e833b289e7dfb214ecc1501cf8039cdde8d35f"
  28. #define hex_fp_neg "30910c2f8a3f9a597c884b28414d2725301567320b1c5b1790ef2f160ad0e43c"
  29. #define hex_fp_mul "9e4d19bb5d94a47352e6f53f4116b2a71b16a1113dc789b26528ee19f46b72e0"
  30. #define hex_fp_sqr "46dc2a5b8853234b341d9c57f9c4ca5709e95bbfef25356812e884e4f38cd0d6"
  31. #define hex_fp_pow "5679a8f0a46ada5b9d48008cde0b8b7a233f882c08afe8f08a36a20ac845bb1a"
  32. #define hex_fp_inv "7d404b0027a93e3fa8f8bc7ee367a96814c42a3b69feb1845093406948a34753"
  33. int test_sm9_fp() {
  34. const SM9_TWIST_POINT _P2 = {
  35. {{0xAF82D65B, 0xF9B7213B, 0xD19C17AB, 0xEE265948, 0xD34EC120, 0xD2AAB97F, 0x92130B08, 0x37227552},
  36. {0xD8806141, 0x54806C11, 0x0F5E93C4, 0xF1DD2C19, 0xB441A01F, 0x597B6027, 0x78640C98, 0x85AEF3D0}},
  37. {{0xC999A7C7, 0x6215BBA5, 0xA71A0811, 0x47EFBA98, 0x3D278FF2, 0x5F317015, 0x19BE3DA6, 0xA7CF28D5},
  38. {0x84EBEB96, 0x856DC76B, 0xA347C8BD, 0x0736A96F, 0x2CBEE6ED, 0x66BA0D26, 0x2E845C12, 0x17509B09}},
  39. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  40. };
  41. const SM9_TWIST_POINT *P2 = &_P2;
  42. const SM9_TWIST_POINT _Ppubs = {
  43. {{0x96EA5E32, 0x8F14D656, 0x386A92DD, 0x414D2177, 0x24A3B573, 0x6CE843ED, 0x152D1F78, 0x29DBA116},
  44. {0x1B94C408, 0x0AB1B679, 0x5E392CFB, 0x1CE0711C, 0x41B56501, 0xE48AFF4B, 0x3084F733, 0x9F64080B}},
  45. {{0xB4E3216D, 0x0E75C05F, 0x5CDFF073, 0x1006E85F, 0xB7A46F74, 0x1A7CE027, 0xDDA532DA, 0x41E00A53},
  46. {0xD0EF1C25, 0xE89E1408, 0x1A77F335, 0xAD3E2FDB, 0x47E3A0CB, 0xB57329F4, 0xABEA0112, 0x69850938}},
  47. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  48. };
  49. const SM9_TWIST_POINT *Ppubs = &_Ppubs;
  50. sm9_fp_t x;
  51. sm9_fp_t y;
  52. sm9_fp_t r;
  53. int j = 1;
  54. sm9_bn_copy(x, P2->X[1]);
  55. sm9_bn_copy(y, Ppubs->Y[0]);
  56. sm9_fp_t iv = {0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678, 0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678};
  57. sm9_bn_from_hex(r, hex_iv); if (sm9_bn_cmp(r, iv) != 0) goto err; ++j;
  58. sm9_fp_add(r, x, y); if (!sm9_bn_equ_hex(r, hex_fp_add)) goto err; ++j;
  59. sm9_fp_sub(r, x, y); if (!sm9_bn_equ_hex(r, hex_fp_sub)) goto err; ++j;
  60. sm9_fp_sub(r, y, x); if (!sm9_bn_equ_hex(r, hex_fp_nsub)) goto err; ++j;
  61. sm9_fp_dbl(r, x); if (!sm9_bn_equ_hex(r, hex_fp_dbl)) goto err; ++j;
  62. sm9_fp_tri(r, x); if (!sm9_bn_equ_hex(r, hex_fp_tri)) goto err; ++j;
  63. sm9_fp_div2(r, x); if (!sm9_bn_equ_hex(r, hex_fp_div2)) goto err; ++j;
  64. sm9_fp_neg(r, x); if (!sm9_bn_equ_hex(r, hex_fp_neg)) goto err; ++j;
  65. sm9_fp_mul(r, x, y); if (!sm9_bn_equ_hex(r, hex_fp_mul)) goto err; ++j;
  66. sm9_fp_sqr(r, x); if (!sm9_bn_equ_hex(r, hex_fp_sqr)) goto err; ++j;
  67. sm9_fp_pow(r, x, y); if (!sm9_bn_equ_hex(r, hex_fp_pow)) goto err; ++j;
  68. sm9_fp_inv(r, x); if (!sm9_bn_equ_hex(r, hex_fp_inv)) goto err; ++j;
  69. printf("%s() ok\n", __FUNCTION__);
  70. return 1;
  71. err:
  72. printf("%s() test %d failed\n", __FUNCTION__, j);
  73. error_print();
  74. return -1;
  75. }
  76. #define hex_x "483f336f119053cba8c0e738cabc2bfdbf047caf7e1aaa92526fa48041ceea2b"
  77. #define hex_y "3220b45276e3692a387faa7bf3cd46e390608f2f4298cce467bf2b7fda091edb"
  78. #define hex_fn_add "7a5fe7c18873bcf5e14091b4be8972e14f650bdec0b37776ba2ed0001bd80906"
  79. #define hex_fn_sub "161e7f1c9aaceaa170413cbcd6eee51a2ea3ed803b81ddadeab0790067c5cb50"
  80. #define hex_fn_nsub "a02180e367f6bc5065c26e931e9fe22a1b4ea5cadd68ae40fabe689c6ed903d5"
  81. #define hex_fn_mul "25c528484b65755b1ff57b47b77f2b32e20467be1dde566ede4264b2e092d223"
  82. #define hex_fn_pow "445cb9b76f27e9d03a2c30fbabb59b0ea6d7b06259b0c8a1b30f21b9b274a055"
  83. #define hex_fn_inv "3e3e849c2144c3596d9c79cb1f8ee7c60828787e298b06cc341a9a165191bc5e"
  84. int test_sm9_fn() {
  85. sm9_fn_t x;
  86. sm9_fn_t y;
  87. sm9_fn_t r;
  88. int j = 1;
  89. sm9_bn_from_hex(x, hex_x);
  90. sm9_bn_from_hex(y, hex_y);
  91. sm9_fn_t iv = {0, 0, 0, 0, 0, 0, 0, 0}; if (!sm9_fn_is_zero(iv)) goto err; ++j;
  92. sm9_fn_add(r, x, y); if (!sm9_bn_equ_hex(r, hex_fn_add)) goto err; ++j;
  93. sm9_fn_sub(r, x, y); if (!sm9_bn_equ_hex(r, hex_fn_sub)) goto err; ++j;
  94. sm9_fn_sub(r, y, x); if (!sm9_bn_equ_hex(r, hex_fn_nsub)) goto err; ++j;
  95. sm9_fn_mul(r, x, y); if (!sm9_bn_equ_hex(r, hex_fn_mul)) goto err; ++j;
  96. sm9_fn_pow(r, x, y); if (!sm9_bn_equ_hex(r, hex_fn_pow)) goto err; ++j;
  97. sm9_fn_inv(r, x); if (!sm9_bn_equ_hex(r, hex_fn_inv)) goto err; ++j;
  98. printf("%s() ok\n", __FUNCTION__);
  99. return 1;
  100. err:
  101. printf("%s test %d failed\n", __FUNCTION__, j);
  102. error_print();
  103. return -1;
  104. }
  105. #define hex_iv2 "123456789abcdef00fedcba987654321123456789abcdef00fedcba987654321-a39654024e243d806e492768664a2b72d632457dd14f49a9f1fdd299c9bb073c"
  106. #define hex_fp2_add "0074a3145c65ac547541612178e584a902248740e70606dcaaafe2bcbd2f6a21-1b6ac9eb2c47b62cf61608b26c3c7e20674a48c4c509ac130bbaf6d47d32c07c"
  107. #define hex_fp2_dbl "2ea136125d08b824cd741a4c597dcdda0e6d52df468f917b0adb8ed709d7d72c-995e51aa30d8d45ae85f34da84c0589f6dece1e633b92146debbdc23afe20a11"
  108. #define hex_fp2_tri "45f1d11b8b8d1437342e2772863cb4c715a3fc4ee9d75a38904956428ec3c2c2-8aed7a7f47f36b0f718cf99fcc59214c93ea0933c0583a7c5b61fca1962a6c5b"
  109. #define hex_fp2_sub "2e2c92fe00a30bd05832b92ae09849310c48cb9e5f898a9e602bac1a4ca86d0b-7df387bf04911e2df2492c281883da7f06a299216eaf7533d300e54f32af4995"
  110. #define hex_fp2_neg "9eef64f6d41f4adf6f499e29c8cfe0581abbe9db7733261e6001d3bc5e6559e7-0e70d72ae8e5694b76d23b3ab8673752da02d8b27360e6ca8359df8219b79db6"
  111. #define hex_fp2_mul "192eb5c3350a03e4baf23dd035b8804af8d5189c710adda53edd9cc0633f2d67-27fe3a559abcc3e1b1fc3f1eb35b4bd5e465f0ef2bcb9997b36e3548637456b6"
  112. #define hex_fp2_mul_u "27fe3a559abcc3e1b1fc3f1eb35b4bd5e465f0ef2bcb9997b36e3548637456b6-83e29479988f9f28601f2faf8a1dc6af304862123865339167b461a71cd2eaaf"
  113. #define hex_fp2_mul_fp "546e5945201b73c6ae44053114761efe351d5884c737301cfc7d2376d349a616-3c2f6327ef1c5aa1d06e8cebc4100f0758c04476f40e8a0facb0a0bf09a9dd42"
  114. #define hex_fp2_sqr "8896d4306fb19d0e4a0e09899240e35cafed70bebb3ad56cf7b07964fefdfb93-16bd622a907d7a92e475ed336e8ebca2cc1e38dd2ae69aaf2a96208eba0ee06e"
  115. #define hex_fp2_sqr_u "16bd622a907d7a92e475ed336e8ebca2cc1e38dd2ae69aaf2a96208eba0ee06e-5b52579f25e413c717eb438cc69bc7d0e40a4518be8032dddb7e4385c8a693d4"
  116. #define hex_fp2_inv "93ceda7dddd537eb9307a06313598e650a568d931d16ab98ca0a7483c3b502e2-6face8b958e2bdc0771fd9d700f2703f881ef0d13509f16937f0a0c344647175"
  117. #define hex_fp2_div "ad68ff7c507f2d4e1cc6cd973c6b821906b9f5937a04fdedc84af1f75f97d00b-8a84a35da11d401c8dca50a572ce7a8c99e7117c45d251f57a2418613dab16bb"
  118. #define hex_fp2_div2 "0ba84d8497422e09335d0693165f7376839b54b7d1a3e45ec2b6e3b5c275f5cb-af07946a8e30f24c1a9a8db2995b2b9bb4f126f1e0ca7b76a3c2ab66d67576a2"
  119. int test_sm9_fp2() {
  120. const SM9_TWIST_POINT _P2 = {
  121. {{0xAF82D65B, 0xF9B7213B, 0xD19C17AB, 0xEE265948, 0xD34EC120, 0xD2AAB97F, 0x92130B08, 0x37227552},
  122. {0xD8806141, 0x54806C11, 0x0F5E93C4, 0xF1DD2C19, 0xB441A01F, 0x597B6027, 0x78640C98, 0x85AEF3D0}},
  123. {{0xC999A7C7, 0x6215BBA5, 0xA71A0811, 0x47EFBA98, 0x3D278FF2, 0x5F317015, 0x19BE3DA6, 0xA7CF28D5},
  124. {0x84EBEB96, 0x856DC76B, 0xA347C8BD, 0x0736A96F, 0x2CBEE6ED, 0x66BA0D26, 0x2E845C12, 0x17509B09}},
  125. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  126. };
  127. const SM9_TWIST_POINT *P2 = &_P2;
  128. const SM9_TWIST_POINT _Ppubs = {
  129. {{0x96EA5E32, 0x8F14D656, 0x386A92DD, 0x414D2177, 0x24A3B573, 0x6CE843ED, 0x152D1F78, 0x29DBA116},
  130. {0x1B94C408, 0x0AB1B679, 0x5E392CFB, 0x1CE0711C, 0x41B56501, 0xE48AFF4B, 0x3084F733, 0x9F64080B}},
  131. {{0xB4E3216D, 0x0E75C05F, 0x5CDFF073, 0x1006E85F, 0xB7A46F74, 0x1A7CE027, 0xDDA532DA, 0x41E00A53},
  132. {0xD0EF1C25, 0xE89E1408, 0x1A77F335, 0xAD3E2FDB, 0x47E3A0CB, 0xB57329F4, 0xABEA0112, 0x69850938}},
  133. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  134. };
  135. const SM9_TWIST_POINT *Ppubs = &_Ppubs;
  136. sm9_fp2_t x;
  137. sm9_fp2_t y;
  138. sm9_fp2_t r;
  139. sm9_fp2_t s;
  140. sm9_fp_t k;
  141. int j = 1;
  142. sm9_fp2_copy(x, P2->Y);
  143. sm9_fp2_copy(y, Ppubs->X);
  144. sm9_bn_from_hex(k, hex_iv);
  145. sm9_fp2_t iv2 = {{0xc9bb073c, 0xf1fdd299, 0xd14f49a9, 0xd632457d, 0x664a2b72, 0x6e492768, 0x4e243d80, 0xa3965402},
  146. {0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678, 0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678}};
  147. sm9_fp2_from_hex(r, hex_iv2); if (!sm9_fp2_equ(r, iv2)) goto err; ++j;
  148. sm9_fp2_add(r, x, y); sm9_fp2_from_hex(s, hex_fp2_add); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  149. sm9_fp2_dbl(r, x); sm9_fp2_from_hex(s, hex_fp2_dbl); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  150. sm9_fp2_tri(r, x); sm9_fp2_from_hex(s, hex_fp2_tri); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  151. sm9_fp2_sub(r, x, y); sm9_fp2_from_hex(s, hex_fp2_sub); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  152. sm9_fp2_neg(r, x); sm9_fp2_from_hex(s, hex_fp2_neg); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  153. sm9_fp2_mul(r, x, y); sm9_fp2_from_hex(s, hex_fp2_mul); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  154. sm9_fp2_mul_u(r, x, y); sm9_fp2_from_hex(s, hex_fp2_mul_u); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  155. sm9_fp2_mul_fp(r, x, k); sm9_fp2_from_hex(s, hex_fp2_mul_fp); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  156. sm9_fp2_sqr(r, x); sm9_fp2_from_hex(s, hex_fp2_sqr); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  157. sm9_fp2_sqr_u(r, x); sm9_fp2_from_hex(s, hex_fp2_sqr_u); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  158. sm9_fp2_inv(r, x); sm9_fp2_from_hex(s, hex_fp2_inv); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  159. sm9_fp2_div(r, x, y); sm9_fp2_from_hex(s, hex_fp2_div); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  160. sm9_fp2_div2(r, x); sm9_fp2_from_hex(s, hex_fp2_div2); if (!sm9_fp2_equ(r, s)) goto err; ++j;
  161. printf("%s() ok\n", __FUNCTION__);
  162. return 1;
  163. err:
  164. printf("%s test %d failed\n", __FUNCTION__, j);
  165. error_print();
  166. return -1;
  167. }
  168. #define hex_iv4 \
  169. "123456789abcdef00fedcba987654321123456789abcdef00fedcba987654321\n" \
  170. "a39654024e243d806e492768664a2b72d632457dd14f49a9f1fdd299c9bb073c\n" \
  171. "123456789abcdef00fedcba987654321123456789abcdef00fedcba987654321\n" \
  172. "a39654024e243d806e492768664a2b72d632457dd14f49a9f1fdd299c9bb073c"
  173. #define hex_fp4_mul \
  174. "11d8f3dc2c4a7cd3ff4d557d86871210cff65187190711430b2d898affd61cda\n" \
  175. "960ee85c0aaacd6cc805053293a4955245ba973c9972b6767d0c68450a905ee7\n" \
  176. "ac9891b21d82827f6ccc2cd8524179b833239019c0b66cad89d7d8735ee03782\n" \
  177. "8f456b1cee442d189d01fc42fff7fd8481173dae8dc547d85c01a843005a063e"
  178. #define hex_fp4_mul_fp \
  179. "413b76fe8748ab9130dc2907a55c15da925b496395c2cd82d6311863a4d9cfa8\n" \
  180. "5cc754d5318f3ed489db7e53f94f3878a527053693983f4d4a61b30f6ea74984\n" \
  181. "6769891769934201aa8d6de63cc012ec2b722d7b0ad9c9039246a3eea6f3d479\n" \
  182. "408d33e58a4d3bfaf1d84a7ddad4e4026ca41f2aaa179611d9894584baed89d0"
  183. #define hex_fp4_mul_fp2 \
  184. "242956015bdff53db568b970d64a7de56a0506309e1309b283317134dd52d53e\n" \
  185. "5333c472d44677df131eeb1180badb3e1e9f88ba58190d16a92d95f939efb2c3\n" \
  186. "0ccdaa76a6876ff69de6792161b614ca720bfcee2d5521533fbb28179ec0e31e\n" \
  187. "2a2d6b832e919c313920f2e13e822795e2ceda8c0d8f4abe78220e4e00aeb6fd"
  188. #define hex_fp4_mul_v \
  189. "ac9891b21d82827f6ccc2cd8524179b833239019c0b66cad89d7d8735ee03782\n" \
  190. "8f456b1cee442d189d01fc42fff7fd8481173dae8dc547d85c01a843005a063e\n" \
  191. "960ee85c0aaacd6cc805053293a4955245ba973c9972b6767d0c68450a905ee7\n" \
  192. "928e1847aa0ead49d7690054e880a3238205f03ce86ccc55cf148811e3a50bc9"
  193. #define hex_fp4_sqr \
  194. "8d3bc7848d4ad61017a7cb4efc280103bfe558e240c46c5765f1a4e2ec2e8c54\n" \
  195. "2f0f2ef9dd3979c7018b67837ba6e73938ba88ae66a101aaa0cf27ee449835ec\n" \
  196. "93838cbf9e5be34562c5bc031e27357d206f783837a6a921cbf4829292b69441\n" \
  197. "3681ecc58b68ffc15af31c5b1f1e10e1f3c60bdabb329c0dc7ffb2cc3925f005"
  198. #define hex_fp4_sqr_v \
  199. "93838cbf9e5be34562c5bc031e27357d206f783837a6a921cbf4829292b69441\n" \
  200. "3681ecc58b68ffc15af31c5b1f1e10e1f3c60bdabb329c0dc7ffb2cc3925f005\n" \
  201. "2f0f2ef9dd3979c7018b67837ba6e73938ba88ae66a101aaa0cf27ee449835ec\n" \
  202. "520870f6eab1a1c37cb7c001f2cd8c82c41a74d1b36d0508fefbec89ee457252"
  203. #define hex_fp4_inv \
  204. "1ec69309f84c5ad450750826fc804b72fb89fb48474222ba05be08bb1765f1d6\n" \
  205. "3f16de331f77f510a3ec06e79319e3be5b3777471f79cd53404652b485133e99\n" \
  206. "1cbf7f3bb04e2389184eade12de2752711cbff452363d2dfaf2bfef40618cebc\n" \
  207. "3a70e829b83dc311970bc8d3e3e652f88a1ecd49b4672aa18c1c613c9a97d86f"
  208. int test_sm9_fp4() {
  209. const SM9_TWIST_POINT _Ppubs = {
  210. {{0x96EA5E32, 0x8F14D656, 0x386A92DD, 0x414D2177, 0x24A3B573, 0x6CE843ED, 0x152D1F78, 0x29DBA116},
  211. {0x1B94C408, 0x0AB1B679, 0x5E392CFB, 0x1CE0711C, 0x41B56501, 0xE48AFF4B, 0x3084F733, 0x9F64080B}},
  212. {{0xB4E3216D, 0x0E75C05F, 0x5CDFF073, 0x1006E85F, 0xB7A46F74, 0x1A7CE027, 0xDDA532DA, 0x41E00A53},
  213. {0xD0EF1C25, 0xE89E1408, 0x1A77F335, 0xAD3E2FDB, 0x47E3A0CB, 0xB57329F4, 0xABEA0112, 0x69850938}},
  214. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  215. };
  216. const SM9_TWIST_POINT *Ppubs = &_Ppubs;
  217. sm9_fp4_t x;
  218. sm9_fp4_t y;
  219. sm9_fp4_t r;
  220. sm9_fp4_t s;
  221. sm9_fp2_t q;
  222. sm9_fp_t k;
  223. int j = 1;
  224. sm9_fp2_from_hex(x[0], hex_fp2_mul_fp);
  225. sm9_fp2_from_hex(x[1], hex_fp2_sqr);
  226. sm9_fp2_from_hex(y[0], hex_fp2_add);
  227. sm9_fp2_from_hex(y[1], hex_fp2_tri);
  228. sm9_bn_from_hex(k, hex_iv);
  229. sm9_fp2_copy(q, Ppubs->X);
  230. sm9_fp4_t iv4 = {{{0xc9bb073c, 0xf1fdd299, 0xd14f49a9, 0xd632457d, 0x664a2b72, 0x6e492768, 0x4e243d80, 0xa3965402},
  231. {0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678, 0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678}},
  232. {{0xc9bb073c, 0xf1fdd299, 0xd14f49a9, 0xd632457d, 0x664a2b72, 0x6e492768, 0x4e243d80, 0xa3965402},
  233. {0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678, 0x87654321, 0x0fedcba9, 0x9abcdef0, 0x12345678}}};
  234. sm9_fp4_from_hex(r, hex_iv4); if (!sm9_fp4_equ(r, iv4)) goto err; ++j;
  235. sm9_fp4_mul(r, x, y); sm9_fp4_from_hex(s, hex_fp4_mul); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  236. sm9_fp4_mul_fp(r, x, k); sm9_fp4_from_hex(s, hex_fp4_mul_fp); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  237. sm9_fp4_mul_fp2(r, x, q); sm9_fp4_from_hex(s, hex_fp4_mul_fp2); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  238. sm9_fp4_mul_v(r, x, y); sm9_fp4_from_hex(s, hex_fp4_mul_v); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  239. sm9_fp4_sqr(r, x); sm9_fp4_from_hex(s, hex_fp4_sqr); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  240. sm9_fp4_sqr_v(r, x); sm9_fp4_from_hex(s, hex_fp4_sqr_v); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  241. sm9_fp4_inv(r, x); sm9_fp4_from_hex(s, hex_fp4_inv); if (!sm9_fp4_equ(r, s)) goto err; ++j;
  242. printf("%s() ok\n", __FUNCTION__);
  243. return 1;
  244. err:
  245. printf("%s test %d failed\n", __FUNCTION__, j);
  246. error_print();
  247. return -1;
  248. }
  249. #define hex_fp12_mul \
  250. "058d43459faee14ba2b6a69ff2d8c3ad933a1253e1764dedf5419b144a2ab82b\n" \
  251. "20ef84805ba02ef92a48fb2ae8086e566a644ab0639249f175268f18d8091ad4\n" \
  252. "83cc3be54a699ae24d8f920c87baa395befb424a6dcad1dcdfc2a006765ef8d5\n" \
  253. "1d705169165d9c2386c3bc673df3fa84975afa955a7be27f1b362000a96b8c2c\n" \
  254. "22b910d826f02961ff0fed439beb1e91f45193f87c2cdd9562da539290846ace\n" \
  255. "2c618991ae82d35063cfed629ff7d930b8070ba07d0652ba092f046e133e3491\n" \
  256. "137bc78a9aa182330bd71fb8859314422dd36f5e3c1f6fd36d6c9685fc39419f\n" \
  257. "8d83e7380abe10a2f3677864c2dbbcdad7ae5434e92043a2da3b71f3f9cedd8c\n" \
  258. "850c0562ac08996c05d22ea466cf4b1fa7a7064d4653b5fa725d623254bf7125\n" \
  259. "6dc41016b3ab9b44a4841aa8037e3b4d331cc7c8313abee0c5111a9be5915e90\n" \
  260. "6d1a15e5b765c4b139bf5c6c4a87214c269b26fb709ff5de885c053f405cf626\n" \
  261. "8d4d853489a4a5d809fa77e35627a5351651b926f001e1ee46e95808f9001d24"
  262. #define hex_fp12_sqr \
  263. "3592cba3482fb39756b2ed1d3d756685caa005bd5e8288bc92841d29276aa321\n" \
  264. "8e3a49919e6de83b1ab1a5bb9eb993c3bbd68e8d305aed5c0b88cef0ef41c47f\n" \
  265. "3d3d9cc8e07619efd21745f6938a26f7cb0a83ad4aa3a9d066e18ad99833e3ac\n" \
  266. "25195ec7af551c42d7d37a0b120607d4adba6b9377299688b92a8393f3b8c20f\n" \
  267. "76f676d5d2cb8d1a2cc237fc78c8d544bef1cd560e654236f502aed0d8c9148c\n" \
  268. "6cde174a5e9d117175a4a163f041b65f868dffa05b5f3474f729b87f92493f2c\n" \
  269. "667a86d73e8f88a81306f7f0cd28789a55bf7e9cbe155fc6abb300ad027d8801\n" \
  270. "a49a66d48ec2ef72a9929413a40e316a8aee1d6236a1db8c56496524f1c23f11\n" \
  271. "1684bc9679aaba4afe35ec8c0852e438f41e15ab37620d9661018f90fe7415f1\n" \
  272. "8d37fb8b7edf942885b3009cf7e295bea89444d34091fc57380c778395b7c4e4\n" \
  273. "278b9d9ea61b6b2758e758ed9a64034576b520e65a9d276a0c82f079501a226e\n" \
  274. "01a333fa4177601de7cd8ed49ea4906f30e23988dcb7cde173da48499fce3ee5"
  275. #define hex_fp12_inv \
  276. "47ae900b90945e31afde7fe09f0b69640c468a1648ee52070584a5d13af22bb9\n" \
  277. "8f273655182c3a9f184dc30421161ecdd50655c36a9266c7df1016e410f34102\n" \
  278. "a26e789013203804b5f8f1c5a51dd3fb50176d41108b235d6e66712721060252\n" \
  279. "090aaed5cb83068a0376c6eaca210007744d00c8b4ce53279a67cc069cc519e7\n" \
  280. "80ab89aa446df59ffe2f29cdb917b760d740ceb634c731b93bf1661aa5868b54\n" \
  281. "1e13ab51b3198619cc0016599562ed4d266d1481d0d273d3f97cffe5f8e0dd21\n" \
  282. "5aeb8ed89aafc971a857b8d02f3e3c37ef15ba0e3220e3a7c13c9da8af0c393b\n" \
  283. "518c338b1430e3129c2555650e5d5634d89513f694ba3a5f2aeb444c540f125a\n" \
  284. "aba8c5682695f3feee64772d0e49b432c96470e7d663098e9c271a91d4fc991a\n" \
  285. "0ed800dabe29af5fb41a41cc49fd4084deb02442e8e66f88186607f46395e533\n" \
  286. "a31b642cd5453c7bb16c82bc67bd3b66fa4db58b8e9aa45f9b579860f18d402c\n" \
  287. "798b84002e95753e3b07027a8d68b0a7ab2ac40328fc7ca3ea40780b3428dbc1"
  288. #define hex_fp12_pow \
  289. "43291d68970ec9c00ed4616b8fa4b2b332c15a6e4ed833a4b1d68db20a06896c\n" \
  290. "48f861508cb878a1f1f806a486f3aa6889571bd5fb1010d73933550d219afd14\n" \
  291. "34b20766a4cc466efe1ee0d48206d683890494aec331d5b345e9a9adb5c5845a\n" \
  292. "0e3edea737b3db1083b776eb48e7bfaa4256a8d37d7ab13a370d7682daaf794d\n" \
  293. "9808adfd960da7837736fca5acb13a84d56962a21af424e48c0aa52c77dfd157\n" \
  294. "a8aa94ea4f3026eed8fa99ab9a793468db12bb7256c50570e72e375f981861a1\n" \
  295. "3fd308b4cdcec640fa4f17aac455b2f3daed3fb86a850b47c301c3941dbd6c4c\n" \
  296. "11b99f09fa20368e840c3d76e706939e4a3e8367165bb802de43acc83ae622d5\n" \
  297. "a5e97a50168650cae7b02b4c2511eeb194cd5ea5ff02a0284abd5961b46d47e4\n" \
  298. "b52a91d96353ef501bdbe6424ea26414faeeb930b9e618c2882a85d1fdeea3d0\n" \
  299. "6c78632b7dbbbdbf347a3f5fd6935a9f9b425125b7ac106e3586a7fbee3f2f20\n" \
  300. "6b35df1d1153684f1363fce020088a797802e18959df4f006bc5d7f4a632e9f9"
  301. int test_sm9_fp12() {
  302. sm9_fp12_t x;
  303. sm9_fp12_t y;
  304. sm9_fp12_t r;
  305. sm9_fp12_t s;
  306. sm9_bn_t k;
  307. int j = 1;
  308. sm9_fp4_from_hex(x[0], hex_fp4_mul);
  309. sm9_fp4_from_hex(x[1], hex_fp4_mul_fp);
  310. sm9_fp4_from_hex(x[2], hex_fp4_mul_fp2);
  311. sm9_fp4_from_hex(y[0], hex_fp4_mul_v);
  312. sm9_fp4_from_hex(y[1], hex_fp4_sqr);
  313. sm9_fp4_from_hex(y[2], hex_fp4_inv);
  314. sm9_bn_from_hex(k, hex_iv);
  315. sm9_fp12_mul(r, x, y); sm9_fp12_from_hex(s, hex_fp12_mul); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  316. sm9_fp12_sqr(r, x); sm9_fp12_from_hex(s, hex_fp12_sqr); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  317. sm9_fp12_inv(r, x); sm9_fp12_from_hex(s, hex_fp12_inv); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  318. sm9_fp12_pow(r, x, k); sm9_fp12_from_hex(s, hex_fp12_pow); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  319. printf("%s() ok\n", __FUNCTION__);
  320. return 1;
  321. err:
  322. printf("%s test %d failed\n", __FUNCTION__, j);
  323. error_print();
  324. return -1;
  325. }
  326. #define hex_point1 "917be49d159184fba140f4dfc5d653464e94f718fe195b226b3f715829e6e768-288578d9505d462867a50acee40ee143b896e72505be10e8ce4c6b0c945b642b"
  327. #define hex_point2 "593417680f252445fd0522383e23c77a54b11fe222de4a886eabc26e16bffa3c-38e8fc9a8b60f5ba0c6c411f721c117044435a833757d8fee65828511b8b245d"
  328. #define hex_point_dbl "268def7968f1e8c51635e277425403df88355fb2ecf16f7920f112eb2a7e50c9-5c596b534bbaa85c1d3aecf436e61ff1bfd9f70856f0309c2a63d8248205d84e"
  329. #define hex_point_add "056610cb69f8d5659ea94e4a67bbf3b93fb0bd449672d7ca2525ec3b68c894d1-88f3f99ce78ed3ffe6ca1cface5242570cb5d053f16a8e0baae10414babd86a7"
  330. #define hex_point_neg "917be49d159184fba140f4dfc5d653464e94f718fe195b226b3f715829e6e768-8dba8726b24660c96e5ea081117fe601695bac2614bcddf31723301b4ef5e152"
  331. #define hex_point_sub "29e4a54cad98da9939b95f677784bff3b1dd9334c83d93e351e0f8f7c4ce2dc5-4473eba3b8ff990b8456c41ec0727b76cb2b0f960495b144949f70bf95643b82"
  332. #define hex_point_mul "997fcff625adbae62566f684f9e89181713f972c5a9cd9ce6764636761ba87d1-8142a28d1bd109501452a649e2d68f012e265460e0c7d3da743fb036eb23b03b"
  333. #define hex_point_mul_g "7cf689748f3714490d7a19eae0e7bfad0e0182498b7bcd8a6998dfd00f59be51-4e2e98d190e9d775e0caa943196bfb066d9c30818b2d768fb5299e7135830a6f"
  334. int test_sm9_point() {
  335. SM9_POINT p;
  336. SM9_POINT q;
  337. SM9_POINT r;
  338. SM9_POINT s;
  339. sm9_bn_t k;
  340. int j = 1;
  341. uint8_t buf[65];
  342. sm9_bn_from_hex(k, hex_iv);
  343. sm9_point_from_hex(&p, hex_point1); if (!sm9_point_is_on_curve(&p)) goto err; ++j;
  344. sm9_point_from_hex(&q, hex_point2); if (!sm9_point_is_on_curve(&q)) goto err; ++j;
  345. sm9_point_dbl(&r, &p); sm9_point_from_hex(&s, hex_point_dbl); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  346. sm9_point_add(&r, &p, &q); sm9_point_from_hex(&s, hex_point_add); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  347. sm9_point_neg(&r, &p); sm9_point_from_hex(&s, hex_point_neg); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  348. sm9_point_sub(&r, &p, &q); sm9_point_from_hex(&s, hex_point_sub); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  349. sm9_point_mul(&r, k, &p); sm9_point_from_hex(&s, hex_point_mul); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  350. sm9_point_mul_generator(&r, k); sm9_point_from_hex(&s, hex_point_mul_g); if (!sm9_point_equ(&r, &s)) goto err; ++j;
  351. sm9_point_to_uncompressed_octets(&p, buf);
  352. sm9_point_from_uncompressed_octets(&q, buf);
  353. if (!sm9_point_equ(&p, &q)) {
  354. error_print();
  355. return -1;
  356. }
  357. printf("%s() ok\n", __FUNCTION__);
  358. return 1;
  359. err:
  360. printf("%s test %d failed\n", __FUNCTION__, j);
  361. error_print();
  362. return -1;
  363. }
  364. #define hex_tpoint1 \
  365. "83f6a65d85d51ec72eacf19bc38384e0369eb22a134a725a0191faa6e4f192ef\n" \
  366. "9a79bfd491ef1cb32d9b57f7d0590ccff6b1cfe63dd15c0823d692fafbe96dbc\n" \
  367. "9ed11c499291db0454d738555af0ce8a1df960056ee7425a6bf296eae60a5037\n" \
  368. "849d4434eb7113fc9fb3809b51d54064fa2f20503423d256bc044905b1eba3fb"
  369. #define hex_tpoint2 \
  370. "a36232a9713f69157b7cdceef54aa0237b3ba0642a80dbb597af8935aea2c130\n" \
  371. "624b19114e49f00281e2aee1f1b9d4f0a081a135868f8bbdb7b7a7b7da5fd6bc\n" \
  372. "77966917ec1c5a294dd836c34691ab5e891f8c9f017443902c0a73ec54d449d8\n" \
  373. "1be45454b6fa085a53744b22fd398238e400c3e031c8796e59e1bd6222048af0"
  374. #define hex_tpoint_neg \
  375. "83f6a65d85d51ec72eacf19bc38384e0369eb22a134a725a0191faa6e4f192ef\n" \
  376. "9a79bfd491ef1cb32d9b57f7d0590ccff6b1cfe63dd15c0823d692fafbe96dbc\n" \
  377. "176ee3b67011cbed812c72fa9a9df8bb03f93345ab93ac81797d043cfd46f546\n" \
  378. "31a2bbcb173292f536502ab4a3b986e027c372fae6571c85296b52223165a182"
  379. #define hex_tpoint_dbl \
  380. "73cbced58a8e76ef5235b480050a74e906e4d27185bd85d7ebdcd43ad24475fd\n" \
  381. "58400f0eb23000d814f5b5d0706749a72909795b7b04f26d6d58b2cf478ad9c9\n" \
  382. "19b460e09ac9ddbb380d6441e078a47bfcaa7d4c3d60b3a6c0d05f896472dc3c\n" \
  383. "1d69f785f47d6f25cb901b131612c37edc5e89ee9ba2dac8c401ced40e340a39"
  384. #define hex_tpoint_add \
  385. "5f443752a19e368f404b89abae20a386d2b534c424b93ededdbfd04d4c569e6b\n" \
  386. "a411bbd84ee92a6ee53e5ca9cb81bacc192c6ba406f6fdcb2b04d0ab9c42ae44\n" \
  387. "6a3dadfcaac134e8353dd3abf37d487b206ca28dfab1e0a9376649df748f1605\n" \
  388. "4fa25e5e6100a023d4923df385dd236749c6a7f8e68db55e0bd1e2263fc04d28"
  389. #define hex_tpoint_sub \
  390. "3cbbf5fcc6c11a3579036e617bbf0b2861c53979f01e37f59fc4a10d991ccde7\n" \
  391. "1e9c3c99524c7867c9dbc4f52fdc938cf5aa4a980d3905cc91a5b91331235290\n" \
  392. "44027c5d814bab73ad93d14b564303aab153ad7355bcfbf8a8bed7cb577e7fd8\n" \
  393. "47a4037d1d6f6d2014aa04292fa91cf07b1f4331a85d4b66a6e048226ddfc43e"
  394. #define hex_tpoint_mul \
  395. "5d704de3261290dbba39dbd14e6bc416025240fd1ed65ec982efed685ae41e8b\n" \
  396. "705c9ca4b5ef465c4e5db80ca4880627a6d9d6bcefd4756496baba9d5eaa3304\n" \
  397. "4e96eb3543aabf1e9a65cae24177b9d13b0f7fae9472145ba7ae2b14bb447aef\n" \
  398. "5d7ba50d7eac49a00b18fee2069afd3cc9719993fa78271e66b7a3efed46ac8b"
  399. #define hex_tpoint_mulg \
  400. "920ef6fb3a2acff52aa0c004c18feca149dfd33d98086f8f402ea9e0de303c49\n" \
  401. "1f97dd359f2b065d63e0987f5bea2f3dc865c2cc112d7d161b46b83451716fd8\n" \
  402. "614881d4d05fef3173a4990465876c5200f58c5015e13354b23ae401c20c4aef\n" \
  403. "18a22e02b7d395a49f0646a79438e79cd37c32f163fe8923c13d56bab668e8a7"
  404. int test_sm9_twist_point() {
  405. SM9_TWIST_POINT p;
  406. SM9_TWIST_POINT q;
  407. SM9_TWIST_POINT r;
  408. SM9_TWIST_POINT s;
  409. sm9_bn_t k;
  410. int j = 1;
  411. sm9_bn_from_hex(k, hex_iv);
  412. sm9_twist_point_from_hex(&p, hex_tpoint1); if (!sm9_twist_point_is_on_curve(&p)) goto err; ++j;
  413. sm9_twist_point_from_hex(&q, hex_tpoint2); if (!sm9_twist_point_is_on_curve(&q)) goto err; ++j;
  414. sm9_twist_point_neg(&r, &p); sm9_twist_point_from_hex(&s, hex_tpoint_neg); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  415. sm9_twist_point_dbl(&r, &p); sm9_twist_point_from_hex(&s, hex_tpoint_dbl); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  416. sm9_twist_point_add(&r, &p, &q); sm9_twist_point_from_hex(&s, hex_tpoint_add); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  417. sm9_twist_point_add_full(&r, &p, &q); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  418. sm9_twist_point_sub(&r, &p, &q); sm9_twist_point_from_hex(&s, hex_tpoint_sub); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  419. sm9_twist_point_mul(&r, k, &p); sm9_twist_point_from_hex(&s, hex_tpoint_mul); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  420. sm9_twist_point_mul_generator(&r, k); sm9_twist_point_from_hex(&s, hex_tpoint_mulg); if (!sm9_twist_point_equ(&r, &s)) goto err; ++j;
  421. printf("%s() ok\n", __FUNCTION__);
  422. return 1;
  423. err:
  424. printf("%s test %d failed\n", __FUNCTION__, j);
  425. error_print();
  426. return -1;
  427. }
  428. #define hex_pairing1 \
  429. "4e378fb5561cd0668f906b731ac58fee25738edf09cadc7a29c0abc0177aea6d\n" \
  430. "28b3404a61908f5d6198815c99af1990c8af38655930058c28c21bb539ce0000\n" \
  431. "38bffe40a22d529a0c66124b2c308dac9229912656f62b4facfced408e02380f\n" \
  432. "a01f2c8bee81769609462c69c96aa923fd863e209d3ce26dd889b55e2e3873db\n" \
  433. "67e0e0c2eed7a6993dce28fe9aa2ef56834307860839677f96685f2b44d0911f\n" \
  434. "5a1ae172102efd95df7338dbc577c66d8d6c15e0a0158c7507228efb078f42a6\n" \
  435. "1604a3fcfa9783e667ce9fcb1062c2a5c6685c316dda62de0548baa6ba30038b\n" \
  436. "93634f44fa13af76169f3cc8fbea880adaff8475d5fd28a75deb83c44362b439\n" \
  437. "b3129a75d31d17194675a1bc56947920898fbf390a5bf5d931ce6cbb3340f66d\n" \
  438. "4c744e69c4a2e1c8ed72f796d151a17ce2325b943260fc460b9f73cb57c9014b\n" \
  439. "84b87422330d7936eaba1109fa5a7a7181ee16f2438b0aeb2f38fd5f7554e57a\n" \
  440. "aab9f06a4eeba4323a7833db202e4e35639d93fa3305af73f0f071d7d284fcfb"
  441. #define hex_RA \
  442. "7CBA5B19069EE66AA79D490413D11846B9BA76DD22567F809CF23B6D964BB265\n" \
  443. "A9760C99CB6F706343FED05637085864958D6C90902ABA7D405FBEDF7B781599"
  444. #define hex_deB \
  445. "74CCC3AC9C383C60AF083972B96D05C75F12C8907D128A17ADAFBAB8C5A4ACF7\n" \
  446. "01092FF4DE89362670C21711B6DBE52DCD5F8E40C6654B3DECE573C2AB3D29B2\n" \
  447. "44B0294AA04290E1524FF3E3DA8CFD432BB64DE3A8040B5B88D1B5FC86A4EBC1\n" \
  448. "8CFC48FB4FF37F1E27727464F3C34E2153861AD08E972D1625FC1A7BD18D5539"
  449. #define hex_pairing2 \
  450. "28542FB6954C84BE6A5F2988A31CB6817BA0781966FA83D9673A9577D3C0C134\n" \
  451. "5E27C19FC02ED9AE37F5BB7BE9C03C2B87DE027539CCF03E6B7D36DE4AB45CD1\n" \
  452. "A1ABFCD30C57DB0F1A838E3A8F2BF823479C978BD137230506EA6249C891049E\n" \
  453. "3497477913AB89F5E2960F382B1B5C8EE09DE0FA498BA95C4409D630D343DA40\n" \
  454. "4FEC93472DA33A4DB6599095C0CF895E3A7B993EE5E4EBE3B9AB7D7D5FF2A3D1\n" \
  455. "647BA154C3E8E185DFC33657C1F128D480F3F7E3F16801208029E19434C733BB\n" \
  456. "73F21693C66FC23724DB26380C526223C705DAF6BA18B763A68623C86A632B05\n" \
  457. "0F63A071A6D62EA45B59A1942DFF5335D1A232C9C5664FAD5D6AF54C11418B0D\n" \
  458. "8C8E9D8D905780D50E779067F2C4B1C8F83A8B59D735BB52AF35F56730BDE5AC\n" \
  459. "861CCD9978617267CE4AD9789F77739E62F2E57B48C2FF26D2E90A79A1D86B93\n" \
  460. "9B1CA08F64712E33AEDA3F44BD6CB633E0F722211E344D73EC9BBEBC92142765\n" \
  461. "6BA584CE742A2A3AB41C15D3EF94EDEB8EF74A2BDCDAAECC09ABA567981F6437"
  462. #define hex_Ppube \
  463. "9174542668E8F14AB273C0945C3690C66E5DD09678B86F734C4350567ED06283\n" \
  464. "54E598C6BF749A3DACC9FFFEDD9DB6866C50457CFC7AA2A4AD65C3168FF74210"
  465. #define rB "00018B98C44BEF9F8537FB7D071B2C928B3BC65BD3D69E1EEE213564905634FE"
  466. #define hex_pairing3 \
  467. "1052D6E9D13E381909DFF7B2B41E13C987D0A9068423B769480DACCE6A06F492\n" \
  468. "5FFEB92AD870F97DC0893114DA22A44DBC9E7A8B6CA31A0CF0467265A1FB48C7\n" \
  469. "2C5C3B37E4F2FF83DB33D98C0317BCBBBBF4AC6DF6B89ECA58268B280045E612\n" \
  470. "6CED9E2D7C9CD3D5AD630DEFAB0B831506218037EE0F861CF9B43C78434AEC38\n" \
  471. "0AE7BF3E1AEC0CB67A03440906C7DFB3BCD4B6EEEBB7E371F0094AD4A816088D\n" \
  472. "98DBC791D0671CACA12236CDF8F39E15AEB96FAEB39606D5B04AC581746A663D\n" \
  473. "00DD2B7416BAA91172E89D5309D834F78C1E31B4483BB97185931BAD7BE1B9B5\n" \
  474. "7EBAC0349F8544469E60C32F6075FB0468A68147FF013537DF792FFCE024F857\n" \
  475. "10CC2B561A62B62DA36AEFD60850714F49170FD94A0010C6D4B651B64F3A3A5E\n" \
  476. "58C9687BEDDCD9E4FEDAB16B884D1FE6DFA117B2AB821F74E0BF7ACDA2269859\n" \
  477. "2A430968F16086061904CE201847934B11CA0F9E9528F5A9D0CE8F015C9AEA79\n" \
  478. "934FDDA6D3AB48C8571CE2354B79742AA498CB8CDDE6BD1FA5946345A1A652F6"
  479. int test_sm9_pairing()
  480. {
  481. const SM9_POINT _P1 = {
  482. {0x7c66dddd, 0xe8c4e481, 0x09dc3280, 0xe1e40869, 0x487d01d6, 0xf5ed0704, 0x62bf718f, 0x93de051d},
  483. {0x0a3ea616, 0x0c464cd7, 0xfa602435, 0x1c1c00cb, 0x5c395bbc, 0x63106512, 0x4f21e607, 0x21fe8dda},
  484. {1,0,0,0,0,0,0,0}
  485. };
  486. const SM9_POINT *P1 = &_P1;
  487. const SM9_TWIST_POINT _P2 = {
  488. {{0xAF82D65B, 0xF9B7213B, 0xD19C17AB, 0xEE265948, 0xD34EC120, 0xD2AAB97F, 0x92130B08, 0x37227552},
  489. {0xD8806141, 0x54806C11, 0x0F5E93C4, 0xF1DD2C19, 0xB441A01F, 0x597B6027, 0x78640C98, 0x85AEF3D0}},
  490. {{0xC999A7C7, 0x6215BBA5, 0xA71A0811, 0x47EFBA98, 0x3D278FF2, 0x5F317015, 0x19BE3DA6, 0xA7CF28D5},
  491. {0x84EBEB96, 0x856DC76B, 0xA347C8BD, 0x0736A96F, 0x2CBEE6ED, 0x66BA0D26, 0x2E845C12, 0x17509B09}},
  492. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  493. };
  494. const SM9_TWIST_POINT *P2 = &_P2;
  495. const SM9_TWIST_POINT _Ppubs = {
  496. {{0x96EA5E32, 0x8F14D656, 0x386A92DD, 0x414D2177, 0x24A3B573, 0x6CE843ED, 0x152D1F78, 0x29DBA116},
  497. {0x1B94C408, 0x0AB1B679, 0x5E392CFB, 0x1CE0711C, 0x41B56501, 0xE48AFF4B, 0x3084F733, 0x9F64080B}},
  498. {{0xB4E3216D, 0x0E75C05F, 0x5CDFF073, 0x1006E85F, 0xB7A46F74, 0x1A7CE027, 0xDDA532DA, 0x41E00A53},
  499. {0xD0EF1C25, 0xE89E1408, 0x1A77F335, 0xAD3E2FDB, 0x47E3A0CB, 0xB57329F4, 0xABEA0112, 0x69850938}},
  500. {{1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}},
  501. };
  502. const SM9_TWIST_POINT *Ppubs = &_Ppubs;
  503. SM9_TWIST_POINT p;
  504. SM9_POINT q;
  505. sm9_fp12_t r;
  506. sm9_fp12_t s;
  507. sm9_bn_t k;
  508. int j = 1;
  509. sm9_pairing(r, Ppubs, P1); sm9_fp12_from_hex(s, hex_pairing1); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  510. sm9_twist_point_from_hex(&p, hex_deB); sm9_point_from_hex(&q, hex_RA);
  511. sm9_pairing(r, &p, &q); sm9_fp12_from_hex(s, hex_pairing2); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  512. sm9_bn_from_hex(k, rB); sm9_point_from_hex(&q, hex_Ppube);
  513. sm9_pairing(r, P2, &q); sm9_fp12_pow(r, r, k); sm9_fp12_from_hex(s, hex_pairing3); if (!sm9_fp12_equ(r, s)) goto err; ++j;
  514. printf("%s() ok\n", __FUNCTION__);
  515. return 1;
  516. err:
  517. printf("%s test %d failed\n", __FUNCTION__, j);
  518. error_print();
  519. return -1;
  520. }
  521. #define hex_ks "000130E78459D78545CB54C587E02CF480CE0B66340F319F348A1D5B1F2DC5F4"
  522. #define hex_ds "A5702F05CF1315305E2D6EB64B0DEB923DB1A0BCF0CAFF90523AC8754AA69820-78559A844411F9825C109F5EE3F52D720DD01785392A727BB1556952B2B013D3"
  523. int test_sm9_sign() {
  524. SM9_SIGN_CTX ctx;
  525. SM9_SIGN_KEY key;
  526. SM9_SIGN_MASTER_KEY mpk;
  527. SM9_POINT ds;
  528. uint8_t sig[1000] = {0};
  529. size_t siglen = 0;
  530. int j = 1;
  531. uint8_t data[20] = {0x43, 0x68, 0x69, 0x6E, 0x65, 0x73, 0x65, 0x20, 0x49, 0x42, 0x53, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64};
  532. uint8_t IDA[5] = {0x41, 0x6C, 0x69, 0x63, 0x65};
  533. sm9_bn_from_hex(mpk.ks, hex_ks); sm9_twist_point_mul_generator(&(mpk.Ppubs), mpk.ks);
  534. if (sm9_sign_master_key_extract_key(&mpk, (char *)IDA, sizeof(IDA), &key) < 0) goto err; ++j;
  535. sm9_point_from_hex(&ds, hex_ds); if (!sm9_point_equ(&(key.ds), &ds)) goto err; ++j;
  536. sm9_sign_init(&ctx);
  537. sm9_sign_update(&ctx, data, sizeof(data));
  538. if (sm9_sign_finish(&ctx, &key, sig, &siglen) < 0) goto err; ++j;
  539. sm9_verify_init(&ctx);
  540. sm9_verify_update(&ctx, data, sizeof(data));
  541. if (sm9_verify_finish(&ctx, sig, siglen, &mpk, (char *)IDA, sizeof(IDA)) != 1) goto err; ++j;
  542. printf("%s() ok\n", __FUNCTION__);
  543. return 1;
  544. err:
  545. printf("%s test %d failed\n", __FUNCTION__, j);
  546. error_print();
  547. return -1;
  548. }
  549. #define hex_ke "0001EDEE3778F441F8DEA3D9FA0ACC4E07EE36C93F9A08618AF4AD85CEDE1C22"
  550. #define hex_de \
  551. "94736ACD2C8C8796CC4785E938301A139A059D3537B6414140B2D31EECF41683\n" \
  552. "115BAE85F5D8BC6C3DBD9E5342979ACCCF3C2F4F28420B1CB4F8C0B59A19B158\n" \
  553. "7AA5E47570DA7600CD760A0CF7BEAF71C447F3844753FE74FA7BA92CA7D3B55F\n" \
  554. "27538A62E7F7BFB51DCE08704796D94C9D56734F119EA44732B50E31CDEB75C1"
  555. int test_sm9_ciphertext()
  556. {
  557. const SM9_POINT _P1 = {
  558. {0x7c66dddd, 0xe8c4e481, 0x09dc3280, 0xe1e40869, 0x487d01d6, 0xf5ed0704, 0x62bf718f, 0x93de051d},
  559. {0x0a3ea616, 0x0c464cd7, 0xfa602435, 0x1c1c00cb, 0x5c395bbc, 0x63106512, 0x4f21e607, 0x21fe8dda},
  560. {1,0,0,0,0,0,0,0}
  561. };
  562. const SM9_POINT *P1 = &_P1;
  563. SM9_POINT C1;
  564. uint8_t c2[SM9_MAX_PLAINTEXT_SIZE];
  565. uint8_t c3[SM3_HMAC_SIZE];
  566. uint8_t buf[1024];
  567. uint8_t *p = buf;
  568. size_t len = 0;
  569. sm9_point_copy(&C1, P1);
  570. if (sm9_ciphertext_to_der(&C1, c2, sizeof(c2), c3, &p, &len) != 1) {
  571. error_print();
  572. return -1;
  573. }
  574. //printf("SM9_MAX_CIPHERTEXT_SIZE %zu\n", len);
  575. return 1;
  576. }
  577. int test_sm9_encrypt() {
  578. SM9_ENC_MASTER_KEY msk;
  579. SM9_ENC_KEY key;
  580. SM9_TWIST_POINT de;
  581. uint8_t out[1000] = {0};
  582. size_t outlen = 0;
  583. int j = 1;
  584. uint8_t data[20] = {0x43, 0x68, 0x69, 0x6E, 0x65, 0x73, 0x65, 0x20, 0x49, 0x42, 0x53, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64};
  585. uint8_t dec[20] = {0};
  586. size_t declen = 20;
  587. uint8_t IDB[3] = {0x42, 0x6F, 0x62};
  588. sm9_bn_from_hex(msk.ke, hex_ke);
  589. sm9_point_mul_generator(&(msk.Ppube), msk.ke);
  590. if (sm9_enc_master_key_extract_key(&msk, (char *)IDB, sizeof(IDB), &key) < 0) goto err; ++j;
  591. sm9_twist_point_from_hex(&de, hex_de); if (!sm9_twist_point_equ(&(key.de), &de)) goto err; ++j;
  592. if (sm9_encrypt(&msk, (char *)IDB, sizeof(IDB), data, sizeof(data), out, &outlen) < 0) goto err; ++j;
  593. if (sm9_decrypt(&key, (char *)IDB, sizeof(IDB), out, outlen, dec, &declen) < 0) goto err; ++j;
  594. if (memcmp(data, dec, sizeof(data)) != 0) goto err; ++j;
  595. printf("%s() ok\n", __FUNCTION__);
  596. return 1;
  597. err:
  598. printf("%s test %d failed\n", __FUNCTION__, j);
  599. error_print();
  600. return -1;
  601. }
  602. int main(void) {
  603. if (test_sm9_fp() != 1) goto err;
  604. if (test_sm9_fn() != 1) goto err;
  605. if (test_sm9_fp2() != 1) goto err;
  606. if (test_sm9_fp4() != 1) goto err;
  607. if (test_sm9_fp12() != 1) goto err;
  608. if (test_sm9_point() != 1) goto err;
  609. if (test_sm9_twist_point() != 1) goto err;
  610. if (test_sm9_pairing() != 1) goto err;
  611. if (test_sm9_sign() != 1) goto err;
  612. if (test_sm9_ciphertext() != 1) goto err;
  613. if (test_sm9_encrypt() != 1) goto err;
  614. printf("%s all tests passed\n", __FILE__);
  615. return 0;
  616. err:
  617. error_print();
  618. return -1;
  619. }