PageRenderTime 26ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/secp256k1/src/secp256k1.c

https://gitlab.com/Ltaimao/bitcoin
C | 328 lines | 283 code | 40 blank | 5 comment | 73 complexity | abeca2399db43ac4ee97321cee71d25d MD5 | raw file
  1. /**********************************************************************
  2. * Copyright (c) 2013, 2014 Pieter Wuille *
  3. * Distributed under the MIT software license, see the accompanying *
  4. * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
  5. **********************************************************************/
  6. #define SECP256K1_BUILD (1)
  7. #include "include/secp256k1.h"
  8. #include "util.h"
  9. #include "num_impl.h"
  10. #include "field_impl.h"
  11. #include "scalar_impl.h"
  12. #include "group_impl.h"
  13. #include "ecmult_impl.h"
  14. #include "ecmult_gen_impl.h"
  15. #include "ecdsa_impl.h"
  16. #include "eckey_impl.h"
  17. void secp256k1_start(unsigned int flags) {
  18. secp256k1_fe_start();
  19. secp256k1_ge_start();
  20. secp256k1_scalar_start();
  21. secp256k1_ecdsa_start();
  22. if (flags & SECP256K1_START_SIGN) {
  23. secp256k1_ecmult_gen_start();
  24. }
  25. if (flags & SECP256K1_START_VERIFY) {
  26. secp256k1_ecmult_start();
  27. }
  28. }
  29. void secp256k1_stop(void) {
  30. secp256k1_ecmult_stop();
  31. secp256k1_ecmult_gen_stop();
  32. secp256k1_ecdsa_stop();
  33. secp256k1_scalar_stop();
  34. secp256k1_ge_stop();
  35. secp256k1_fe_stop();
  36. }
  37. int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) {
  38. DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
  39. DEBUG_CHECK(msg != NULL);
  40. DEBUG_CHECK(msglen <= 32);
  41. DEBUG_CHECK(sig != NULL);
  42. DEBUG_CHECK(pubkey != NULL);
  43. unsigned char msg32[32] = {0};
  44. memcpy(msg32 + 32 - msglen, msg, msglen);
  45. int ret = -3;
  46. secp256k1_scalar_t m;
  47. secp256k1_ecdsa_sig_t s;
  48. secp256k1_ge_t q;
  49. secp256k1_scalar_set_b32(&m, msg32, NULL);
  50. if (!secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) {
  51. ret = -1;
  52. goto end;
  53. }
  54. if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) {
  55. ret = -2;
  56. goto end;
  57. }
  58. if (!secp256k1_ecdsa_sig_verify(&s, &q, &m)) {
  59. ret = 0;
  60. goto end;
  61. }
  62. ret = 1;
  63. end:
  64. return ret;
  65. }
  66. int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned char *signature, int *signaturelen, const unsigned char *seckey, const unsigned char *nonce) {
  67. DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
  68. DEBUG_CHECK(message != NULL);
  69. DEBUG_CHECK(messagelen <= 32);
  70. DEBUG_CHECK(signature != NULL);
  71. DEBUG_CHECK(signaturelen != NULL);
  72. DEBUG_CHECK(seckey != NULL);
  73. DEBUG_CHECK(nonce != NULL);
  74. secp256k1_scalar_t sec, non, msg;
  75. secp256k1_scalar_set_b32(&sec, seckey, NULL);
  76. int overflow = 0;
  77. secp256k1_scalar_set_b32(&non, nonce, &overflow);
  78. {
  79. unsigned char c[32] = {0};
  80. memcpy(c + 32 - messagelen, message, messagelen);
  81. secp256k1_scalar_set_b32(&msg, c, NULL);
  82. memset(c, 0, 32);
  83. }
  84. int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
  85. secp256k1_ecdsa_sig_t sig;
  86. if (ret) {
  87. ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, NULL);
  88. }
  89. if (ret) {
  90. secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig);
  91. }
  92. secp256k1_scalar_clear(&msg);
  93. secp256k1_scalar_clear(&non);
  94. secp256k1_scalar_clear(&sec);
  95. return ret;
  96. }
  97. int secp256k1_ecdsa_sign_compact(const unsigned char *message, int messagelen, unsigned char *sig64, const unsigned char *seckey, const unsigned char *nonce, int *recid) {
  98. DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
  99. DEBUG_CHECK(message != NULL);
  100. DEBUG_CHECK(messagelen <= 32);
  101. DEBUG_CHECK(sig64 != NULL);
  102. DEBUG_CHECK(seckey != NULL);
  103. DEBUG_CHECK(nonce != NULL);
  104. secp256k1_scalar_t sec, non, msg;
  105. secp256k1_scalar_set_b32(&sec, seckey, NULL);
  106. int overflow = 0;
  107. secp256k1_scalar_set_b32(&non, nonce, &overflow);
  108. {
  109. unsigned char c[32] = {0};
  110. memcpy(c + 32 - messagelen, message, messagelen);
  111. secp256k1_scalar_set_b32(&msg, c, NULL);
  112. memset(c, 0, 32);
  113. }
  114. int ret = !secp256k1_scalar_is_zero(&non) && !overflow;
  115. secp256k1_ecdsa_sig_t sig;
  116. if (ret) {
  117. ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, recid);
  118. }
  119. if (ret) {
  120. secp256k1_scalar_get_b32(sig64, &sig.r);
  121. secp256k1_scalar_get_b32(sig64 + 32, &sig.s);
  122. }
  123. secp256k1_scalar_clear(&msg);
  124. secp256k1_scalar_clear(&non);
  125. secp256k1_scalar_clear(&sec);
  126. return ret;
  127. }
  128. int secp256k1_ecdsa_recover_compact(const unsigned char *msg, int msglen, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) {
  129. DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
  130. DEBUG_CHECK(msg != NULL);
  131. DEBUG_CHECK(msglen <= 32);
  132. DEBUG_CHECK(sig64 != NULL);
  133. DEBUG_CHECK(pubkey != NULL);
  134. DEBUG_CHECK(pubkeylen != NULL);
  135. DEBUG_CHECK(recid >= 0 && recid <= 3);
  136. int ret = 0;
  137. unsigned char msg32[32] = {0};
  138. memcpy(msg32 + 32 - msglen, msg, msglen);
  139. secp256k1_scalar_t m;
  140. secp256k1_ecdsa_sig_t sig;
  141. int overflow = 0;
  142. secp256k1_scalar_set_b32(&sig.r, sig64, &overflow);
  143. if (overflow) {
  144. return 0;
  145. }
  146. secp256k1_scalar_set_b32(&sig.s, sig64 + 32, &overflow);
  147. if (overflow) {
  148. return 0;
  149. }
  150. secp256k1_scalar_set_b32(&m, msg32, NULL);
  151. secp256k1_ge_t q;
  152. if (secp256k1_ecdsa_sig_recover(&sig, &q, &m, recid)) {
  153. ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed);
  154. }
  155. return ret;
  156. }
  157. int secp256k1_ec_seckey_verify(const unsigned char *seckey) {
  158. DEBUG_CHECK(seckey != NULL);
  159. secp256k1_scalar_t sec;
  160. int overflow;
  161. secp256k1_scalar_set_b32(&sec, seckey, &overflow);
  162. int ret = !secp256k1_scalar_is_zero(&sec) && !overflow;
  163. secp256k1_scalar_clear(&sec);
  164. return ret;
  165. }
  166. int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen) {
  167. DEBUG_CHECK(pubkey != NULL);
  168. secp256k1_ge_t q;
  169. return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen);
  170. }
  171. int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) {
  172. DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
  173. DEBUG_CHECK(pubkey != NULL);
  174. DEBUG_CHECK(pubkeylen != NULL);
  175. DEBUG_CHECK(seckey != NULL);
  176. secp256k1_scalar_t sec;
  177. secp256k1_scalar_set_b32(&sec, seckey, NULL);
  178. secp256k1_gej_t pj;
  179. secp256k1_ecmult_gen(&pj, &sec);
  180. secp256k1_scalar_clear(&sec);
  181. secp256k1_ge_t p;
  182. secp256k1_ge_set_gej(&p, &pj);
  183. return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed);
  184. }
  185. int secp256k1_ec_pubkey_decompress(unsigned char *pubkey, int *pubkeylen) {
  186. DEBUG_CHECK(pubkey != NULL);
  187. DEBUG_CHECK(pubkeylen != NULL);
  188. secp256k1_ge_t p;
  189. if (!secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen))
  190. return 0;
  191. return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0);
  192. }
  193. int secp256k1_ec_privkey_tweak_add(unsigned char *seckey, const unsigned char *tweak) {
  194. DEBUG_CHECK(seckey != NULL);
  195. DEBUG_CHECK(tweak != NULL);
  196. secp256k1_scalar_t term;
  197. int overflow = 0;
  198. secp256k1_scalar_set_b32(&term, tweak, &overflow);
  199. secp256k1_scalar_t sec;
  200. secp256k1_scalar_set_b32(&sec, seckey, NULL);
  201. int ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow;
  202. if (ret) {
  203. secp256k1_scalar_get_b32(seckey, &sec);
  204. }
  205. secp256k1_scalar_clear(&sec);
  206. secp256k1_scalar_clear(&term);
  207. return ret;
  208. }
  209. int secp256k1_ec_pubkey_tweak_add(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
  210. DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
  211. DEBUG_CHECK(pubkey != NULL);
  212. DEBUG_CHECK(tweak != NULL);
  213. secp256k1_scalar_t term;
  214. int overflow = 0;
  215. secp256k1_scalar_set_b32(&term, tweak, &overflow);
  216. if (overflow) {
  217. return 0;
  218. }
  219. secp256k1_ge_t p;
  220. int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
  221. if (ret) {
  222. ret = secp256k1_eckey_pubkey_tweak_add(&p, &term);
  223. }
  224. if (ret) {
  225. int oldlen = pubkeylen;
  226. ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33);
  227. VERIFY_CHECK(pubkeylen == oldlen);
  228. }
  229. return ret;
  230. }
  231. int secp256k1_ec_privkey_tweak_mul(unsigned char *seckey, const unsigned char *tweak) {
  232. DEBUG_CHECK(seckey != NULL);
  233. DEBUG_CHECK(tweak != NULL);
  234. secp256k1_scalar_t factor;
  235. int overflow = 0;
  236. secp256k1_scalar_set_b32(&factor, tweak, &overflow);
  237. secp256k1_scalar_t sec;
  238. secp256k1_scalar_set_b32(&sec, seckey, NULL);
  239. int ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow;
  240. if (ret) {
  241. secp256k1_scalar_get_b32(seckey, &sec);
  242. }
  243. secp256k1_scalar_clear(&sec);
  244. secp256k1_scalar_clear(&factor);
  245. return ret;
  246. }
  247. int secp256k1_ec_pubkey_tweak_mul(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
  248. DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
  249. DEBUG_CHECK(pubkey != NULL);
  250. DEBUG_CHECK(tweak != NULL);
  251. secp256k1_scalar_t factor;
  252. int overflow = 0;
  253. secp256k1_scalar_set_b32(&factor, tweak, &overflow);
  254. if (overflow) {
  255. return 0;
  256. }
  257. secp256k1_ge_t p;
  258. int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
  259. if (ret) {
  260. ret = secp256k1_eckey_pubkey_tweak_mul(&p, &factor);
  261. }
  262. if (ret) {
  263. int oldlen = pubkeylen;
  264. ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33);
  265. VERIFY_CHECK(pubkeylen == oldlen);
  266. }
  267. return ret;
  268. }
  269. int secp256k1_ec_privkey_export(const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) {
  270. DEBUG_CHECK(seckey != NULL);
  271. DEBUG_CHECK(privkey != NULL);
  272. DEBUG_CHECK(privkeylen != NULL);
  273. secp256k1_scalar_t key;
  274. secp256k1_scalar_set_b32(&key, seckey, NULL);
  275. int ret = secp256k1_eckey_privkey_serialize(privkey, privkeylen, &key, compressed);
  276. secp256k1_scalar_clear(&key);
  277. return ret;
  278. }
  279. int secp256k1_ec_privkey_import(unsigned char *seckey, const unsigned char *privkey, int privkeylen) {
  280. DEBUG_CHECK(seckey != NULL);
  281. DEBUG_CHECK(privkey != NULL);
  282. secp256k1_scalar_t key;
  283. int ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen);
  284. if (ret)
  285. secp256k1_scalar_get_b32(seckey, &key);
  286. secp256k1_scalar_clear(&key);
  287. return ret;
  288. }