PageRenderTime 38ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/src/secp256k1/src/scalar_impl.h

https://gitlab.com/Ltaimao/bitcoin
C Header | 336 lines | 261 code | 32 blank | 43 comment | 44 complexity | 189bbadcca1f4c66331e39b28ec635d6 MD5 | raw file
  1. /**********************************************************************
  2. * Copyright (c) 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. #ifndef _SECP256K1_SCALAR_IMPL_H_
  7. #define _SECP256K1_SCALAR_IMPL_H_
  8. #include <string.h>
  9. #include "group.h"
  10. #include "scalar.h"
  11. #if defined HAVE_CONFIG_H
  12. #include "libsecp256k1-config.h"
  13. #endif
  14. #if defined(USE_SCALAR_4X64)
  15. #include "scalar_4x64_impl.h"
  16. #elif defined(USE_SCALAR_8X32)
  17. #include "scalar_8x32_impl.h"
  18. #else
  19. #error "Please select scalar implementation"
  20. #endif
  21. typedef struct {
  22. #ifndef USE_NUM_NONE
  23. secp256k1_num_t order;
  24. #endif
  25. #ifdef USE_ENDOMORPHISM
  26. secp256k1_scalar_t minus_lambda, minus_b1, minus_b2, g1, g2;
  27. #endif
  28. } secp256k1_scalar_consts_t;
  29. static const secp256k1_scalar_consts_t *secp256k1_scalar_consts = NULL;
  30. static void secp256k1_scalar_start(void) {
  31. if (secp256k1_scalar_consts != NULL)
  32. return;
  33. /* Allocate. */
  34. secp256k1_scalar_consts_t *ret = (secp256k1_scalar_consts_t*)malloc(sizeof(secp256k1_scalar_consts_t));
  35. #ifndef USE_NUM_NONE
  36. static const unsigned char secp256k1_scalar_consts_order[] = {
  37. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  38. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  39. 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
  40. 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
  41. };
  42. secp256k1_num_set_bin(&ret->order, secp256k1_scalar_consts_order, sizeof(secp256k1_scalar_consts_order));
  43. #endif
  44. #ifdef USE_ENDOMORPHISM
  45. /**
  46. * Lambda is a scalar which has the property for secp256k1 that point multiplication by
  47. * it is efficiently computable (see secp256k1_gej_mul_lambda). */
  48. static const unsigned char secp256k1_scalar_consts_lambda[32] = {
  49. 0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,
  50. 0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a,
  51. 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,
  52. 0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72
  53. };
  54. /**
  55. * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm
  56. * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1
  57. * and k2 have a small size.
  58. * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are:
  59. *
  60. * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
  61. * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3}
  62. * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8}
  63. * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
  64. *
  65. * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives
  66. * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and
  67. * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2.
  68. *
  69. * g1, g2 are precomputed constants used to replace division with a rounded multiplication
  70. * when decomposing the scalar for an endomorphism-based point multiplication.
  71. *
  72. * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve
  73. * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5.
  74. *
  75. * The derivation is described in the paper "Efficient Software Implementation of Public-Key
  76. * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez),
  77. * Section 4.3 (here we use a somewhat higher-precision estimate):
  78. * d = a1*b2 - b1*a2
  79. * g1 = round((2^272)*b2/d)
  80. * g2 = round((2^272)*b1/d)
  81. *
  82. * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found
  83. * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda').
  84. */
  85. static const unsigned char secp256k1_scalar_consts_minus_b1[32] = {
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,
  89. 0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3
  90. };
  91. static const unsigned char secp256k1_scalar_consts_b2[32] = {
  92. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  94. 0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,
  95. 0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15
  96. };
  97. static const unsigned char secp256k1_scalar_consts_g1[32] = {
  98. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  99. 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x86,
  100. 0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,
  101. 0x90,0xe4,0x92,0x84,0xeb,0x15,0x3d,0xab
  102. };
  103. static const unsigned char secp256k1_scalar_consts_g2[32] = {
  104. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  105. 0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x43,
  106. 0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,
  107. 0x7f,0xa9,0x0a,0xbf,0xe4,0xc4,0x22,0x12
  108. };
  109. secp256k1_scalar_set_b32(&ret->minus_lambda, secp256k1_scalar_consts_lambda, NULL);
  110. secp256k1_scalar_negate(&ret->minus_lambda, &ret->minus_lambda);
  111. secp256k1_scalar_set_b32(&ret->minus_b1, secp256k1_scalar_consts_minus_b1, NULL);
  112. secp256k1_scalar_set_b32(&ret->minus_b2, secp256k1_scalar_consts_b2, NULL);
  113. secp256k1_scalar_negate(&ret->minus_b2, &ret->minus_b2);
  114. secp256k1_scalar_set_b32(&ret->g1, secp256k1_scalar_consts_g1, NULL);
  115. secp256k1_scalar_set_b32(&ret->g2, secp256k1_scalar_consts_g2, NULL);
  116. #endif
  117. /* Set the global pointer. */
  118. secp256k1_scalar_consts = ret;
  119. }
  120. static void secp256k1_scalar_stop(void) {
  121. if (secp256k1_scalar_consts == NULL)
  122. return;
  123. secp256k1_scalar_consts_t *c = (secp256k1_scalar_consts_t*)secp256k1_scalar_consts;
  124. secp256k1_scalar_consts = NULL;
  125. free(c);
  126. }
  127. #ifndef USE_NUM_NONE
  128. static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) {
  129. unsigned char c[32];
  130. secp256k1_scalar_get_b32(c, a);
  131. secp256k1_num_set_bin(r, c, 32);
  132. }
  133. static void secp256k1_scalar_order_get_num(secp256k1_num_t *r) {
  134. *r = secp256k1_scalar_consts->order;
  135. }
  136. #endif
  137. static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) {
  138. /* First compute x ^ (2^N - 1) for some values of N. */
  139. secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127;
  140. secp256k1_scalar_sqr(&x2, x);
  141. secp256k1_scalar_mul(&x2, &x2, x);
  142. secp256k1_scalar_sqr(&x3, &x2);
  143. secp256k1_scalar_mul(&x3, &x3, x);
  144. secp256k1_scalar_sqr(&x4, &x3);
  145. secp256k1_scalar_mul(&x4, &x4, x);
  146. secp256k1_scalar_sqr(&x6, &x4);
  147. secp256k1_scalar_sqr(&x6, &x6);
  148. secp256k1_scalar_mul(&x6, &x6, &x2);
  149. secp256k1_scalar_sqr(&x7, &x6);
  150. secp256k1_scalar_mul(&x7, &x7, x);
  151. secp256k1_scalar_sqr(&x8, &x7);
  152. secp256k1_scalar_mul(&x8, &x8, x);
  153. secp256k1_scalar_sqr(&x15, &x8);
  154. for (int i=0; i<6; i++)
  155. secp256k1_scalar_sqr(&x15, &x15);
  156. secp256k1_scalar_mul(&x15, &x15, &x7);
  157. secp256k1_scalar_sqr(&x30, &x15);
  158. for (int i=0; i<14; i++)
  159. secp256k1_scalar_sqr(&x30, &x30);
  160. secp256k1_scalar_mul(&x30, &x30, &x15);
  161. secp256k1_scalar_sqr(&x60, &x30);
  162. for (int i=0; i<29; i++)
  163. secp256k1_scalar_sqr(&x60, &x60);
  164. secp256k1_scalar_mul(&x60, &x60, &x30);
  165. secp256k1_scalar_sqr(&x120, &x60);
  166. for (int i=0; i<59; i++)
  167. secp256k1_scalar_sqr(&x120, &x120);
  168. secp256k1_scalar_mul(&x120, &x120, &x60);
  169. secp256k1_scalar_sqr(&x127, &x120);
  170. for (int i=0; i<6; i++)
  171. secp256k1_scalar_sqr(&x127, &x127);
  172. secp256k1_scalar_mul(&x127, &x127, &x7);
  173. /* Then accumulate the final result (t starts at x127). */
  174. secp256k1_scalar_t *t = &x127;
  175. for (int i=0; i<2; i++) /* 0 */
  176. secp256k1_scalar_sqr(t, t);
  177. secp256k1_scalar_mul(t, t, x); /* 1 */
  178. for (int i=0; i<4; i++) /* 0 */
  179. secp256k1_scalar_sqr(t, t);
  180. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  181. for (int i=0; i<2; i++) /* 0 */
  182. secp256k1_scalar_sqr(t, t);
  183. secp256k1_scalar_mul(t, t, x); /* 1 */
  184. for (int i=0; i<2; i++) /* 0 */
  185. secp256k1_scalar_sqr(t, t);
  186. secp256k1_scalar_mul(t, t, x); /* 1 */
  187. for (int i=0; i<2; i++) /* 0 */
  188. secp256k1_scalar_sqr(t, t);
  189. secp256k1_scalar_mul(t, t, x); /* 1 */
  190. for (int i=0; i<4; i++) /* 0 */
  191. secp256k1_scalar_sqr(t, t);
  192. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  193. for (int i=0; i<3; i++) /* 0 */
  194. secp256k1_scalar_sqr(t, t);
  195. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  196. for (int i=0; i<4; i++) /* 0 */
  197. secp256k1_scalar_sqr(t, t);
  198. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  199. for (int i=0; i<5; i++) /* 00 */
  200. secp256k1_scalar_sqr(t, t);
  201. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  202. for (int i=0; i<4; i++) /* 00 */
  203. secp256k1_scalar_sqr(t, t);
  204. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  205. for (int i=0; i<2; i++) /* 0 */
  206. secp256k1_scalar_sqr(t, t);
  207. secp256k1_scalar_mul(t, t, x); /* 1 */
  208. for (int i=0; i<2; i++) /* 0 */
  209. secp256k1_scalar_sqr(t, t);
  210. secp256k1_scalar_mul(t, t, x); /* 1 */
  211. for (int i=0; i<5; i++) /* 0 */
  212. secp256k1_scalar_sqr(t, t);
  213. secp256k1_scalar_mul(t, t, &x4); /* 1111 */
  214. for (int i=0; i<2; i++) /* 0 */
  215. secp256k1_scalar_sqr(t, t);
  216. secp256k1_scalar_mul(t, t, x); /* 1 */
  217. for (int i=0; i<3; i++) /* 00 */
  218. secp256k1_scalar_sqr(t, t);
  219. secp256k1_scalar_mul(t, t, x); /* 1 */
  220. for (int i=0; i<4; i++) /* 000 */
  221. secp256k1_scalar_sqr(t, t);
  222. secp256k1_scalar_mul(t, t, x); /* 1 */
  223. for (int i=0; i<2; i++) /* 0 */
  224. secp256k1_scalar_sqr(t, t);
  225. secp256k1_scalar_mul(t, t, x); /* 1 */
  226. for (int i=0; i<10; i++) /* 0000000 */
  227. secp256k1_scalar_sqr(t, t);
  228. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  229. for (int i=0; i<4; i++) /* 0 */
  230. secp256k1_scalar_sqr(t, t);
  231. secp256k1_scalar_mul(t, t, &x3); /* 111 */
  232. for (int i=0; i<9; i++) /* 0 */
  233. secp256k1_scalar_sqr(t, t);
  234. secp256k1_scalar_mul(t, t, &x8); /* 11111111 */
  235. for (int i=0; i<2; i++) /* 0 */
  236. secp256k1_scalar_sqr(t, t);
  237. secp256k1_scalar_mul(t, t, x); /* 1 */
  238. for (int i=0; i<3; i++) /* 00 */
  239. secp256k1_scalar_sqr(t, t);
  240. secp256k1_scalar_mul(t, t, x); /* 1 */
  241. for (int i=0; i<3; i++) /* 00 */
  242. secp256k1_scalar_sqr(t, t);
  243. secp256k1_scalar_mul(t, t, x); /* 1 */
  244. for (int i=0; i<5; i++) /* 0 */
  245. secp256k1_scalar_sqr(t, t);
  246. secp256k1_scalar_mul(t, t, &x4); /* 1111 */
  247. for (int i=0; i<2; i++) /* 0 */
  248. secp256k1_scalar_sqr(t, t);
  249. secp256k1_scalar_mul(t, t, x); /* 1 */
  250. for (int i=0; i<5; i++) /* 000 */
  251. secp256k1_scalar_sqr(t, t);
  252. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  253. for (int i=0; i<4; i++) /* 00 */
  254. secp256k1_scalar_sqr(t, t);
  255. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  256. for (int i=0; i<2; i++) /* 0 */
  257. secp256k1_scalar_sqr(t, t);
  258. secp256k1_scalar_mul(t, t, x); /* 1 */
  259. for (int i=0; i<8; i++) /* 000000 */
  260. secp256k1_scalar_sqr(t, t);
  261. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  262. for (int i=0; i<3; i++) /* 0 */
  263. secp256k1_scalar_sqr(t, t);
  264. secp256k1_scalar_mul(t, t, &x2); /* 11 */
  265. for (int i=0; i<3; i++) /* 00 */
  266. secp256k1_scalar_sqr(t, t);
  267. secp256k1_scalar_mul(t, t, x); /* 1 */
  268. for (int i=0; i<6; i++) /* 00000 */
  269. secp256k1_scalar_sqr(t, t);
  270. secp256k1_scalar_mul(t, t, x); /* 1 */
  271. for (int i=0; i<8; i++) /* 00 */
  272. secp256k1_scalar_sqr(t, t);
  273. secp256k1_scalar_mul(r, t, &x6); /* 111111 */
  274. }
  275. static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) {
  276. #if defined(USE_SCALAR_INV_BUILTIN)
  277. secp256k1_scalar_inverse(r, x);
  278. #elif defined(USE_SCALAR_INV_NUM)
  279. unsigned char b[32];
  280. secp256k1_scalar_get_b32(b, x);
  281. secp256k1_num_t n;
  282. secp256k1_num_set_bin(&n, b, 32);
  283. secp256k1_num_mod_inverse(&n, &n, &secp256k1_scalar_consts->order);
  284. secp256k1_num_get_bin(b, 32, &n);
  285. secp256k1_scalar_set_b32(r, b, NULL);
  286. #else
  287. #error "Please select scalar inverse implementation"
  288. #endif
  289. }
  290. #ifdef USE_ENDOMORPHISM
  291. static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) {
  292. VERIFY_CHECK(r1 != a);
  293. VERIFY_CHECK(r2 != a);
  294. secp256k1_scalar_t c1, c2;
  295. secp256k1_scalar_mul_shift_var(&c1, a, &secp256k1_scalar_consts->g1, 272);
  296. secp256k1_scalar_mul_shift_var(&c2, a, &secp256k1_scalar_consts->g2, 272);
  297. secp256k1_scalar_mul(&c1, &c1, &secp256k1_scalar_consts->minus_b1);
  298. secp256k1_scalar_mul(&c2, &c2, &secp256k1_scalar_consts->minus_b2);
  299. secp256k1_scalar_add(r2, &c1, &c2);
  300. secp256k1_scalar_mul(r1, r2, &secp256k1_scalar_consts->minus_lambda);
  301. secp256k1_scalar_add(r1, r1, a);
  302. }
  303. #endif
  304. #endif