curves.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. 'use strict';
  2. var curves = exports;
  3. var hash = require('hash.js');
  4. var curve = require('./curve');
  5. var utils = require('./utils');
  6. var assert = utils.assert;
  7. function PresetCurve(options) {
  8. if (options.type === 'short')
  9. this.curve = new curve.short(options);
  10. else if (options.type === 'edwards')
  11. this.curve = new curve.edwards(options);
  12. else
  13. this.curve = new curve.mont(options);
  14. this.g = this.curve.g;
  15. this.n = this.curve.n;
  16. this.hash = options.hash;
  17. assert(this.g.validate(), 'Invalid curve');
  18. assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O');
  19. }
  20. curves.PresetCurve = PresetCurve;
  21. function defineCurve(name, options) {
  22. Object.defineProperty(curves, name, {
  23. configurable: true,
  24. enumerable: true,
  25. get: function() {
  26. var curve = new PresetCurve(options);
  27. Object.defineProperty(curves, name, {
  28. configurable: true,
  29. enumerable: true,
  30. value: curve,
  31. });
  32. return curve;
  33. },
  34. });
  35. }
  36. defineCurve('p192', {
  37. type: 'short',
  38. prime: 'p192',
  39. p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',
  40. a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',
  41. b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',
  42. n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',
  43. hash: hash.sha256,
  44. gRed: false,
  45. g: [
  46. '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',
  47. '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811',
  48. ],
  49. });
  50. defineCurve('p224', {
  51. type: 'short',
  52. prime: 'p224',
  53. p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',
  54. a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',
  55. b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',
  56. n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',
  57. hash: hash.sha256,
  58. gRed: false,
  59. g: [
  60. 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',
  61. 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34',
  62. ],
  63. });
  64. defineCurve('p256', {
  65. type: 'short',
  66. prime: null,
  67. p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',
  68. a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',
  69. b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',
  70. n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',
  71. hash: hash.sha256,
  72. gRed: false,
  73. g: [
  74. '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',
  75. '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5',
  76. ],
  77. });
  78. defineCurve('p384', {
  79. type: 'short',
  80. prime: null,
  81. p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  82. 'fffffffe ffffffff 00000000 00000000 ffffffff',
  83. a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  84. 'fffffffe ffffffff 00000000 00000000 fffffffc',
  85. b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +
  86. '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',
  87. n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +
  88. 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',
  89. hash: hash.sha384,
  90. gRed: false,
  91. g: [
  92. 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +
  93. '5502f25d bf55296c 3a545e38 72760ab7',
  94. '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +
  95. '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f',
  96. ],
  97. });
  98. defineCurve('p521', {
  99. type: 'short',
  100. prime: null,
  101. p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  102. 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  103. 'ffffffff ffffffff ffffffff ffffffff ffffffff',
  104. a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  105. 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  106. 'ffffffff ffffffff ffffffff ffffffff fffffffc',
  107. b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +
  108. '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +
  109. '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',
  110. n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
  111. 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +
  112. 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',
  113. hash: hash.sha512,
  114. gRed: false,
  115. g: [
  116. '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +
  117. '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +
  118. 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',
  119. '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +
  120. '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +
  121. '3fad0761 353c7086 a272c240 88be9476 9fd16650',
  122. ],
  123. });
  124. defineCurve('curve25519', {
  125. type: 'mont',
  126. prime: 'p25519',
  127. p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
  128. a: '76d06',
  129. b: '1',
  130. n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
  131. hash: hash.sha256,
  132. gRed: false,
  133. g: [
  134. '9',
  135. ],
  136. });
  137. defineCurve('ed25519', {
  138. type: 'edwards',
  139. prime: 'p25519',
  140. p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
  141. a: '-1',
  142. c: '1',
  143. // -121665 * (121666^(-1)) (mod P)
  144. d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',
  145. n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
  146. hash: hash.sha256,
  147. gRed: false,
  148. g: [
  149. '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',
  150. // 4/5
  151. '6666666666666666666666666666666666666666666666666666666666666658',
  152. ],
  153. });
  154. var pre;
  155. try {
  156. pre = require('./precomputed/secp256k1');
  157. } catch (e) {
  158. pre = undefined;
  159. }
  160. defineCurve('secp256k1', {
  161. type: 'short',
  162. prime: 'k256',
  163. p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',
  164. a: '0',
  165. b: '7',
  166. n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',
  167. h: '1',
  168. hash: hash.sha256,
  169. // Precomputed endomorphism
  170. beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',
  171. lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',
  172. basis: [
  173. {
  174. a: '3086d221a7d46bcde86c90e49284eb15',
  175. b: '-e4437ed6010e88286f547fa90abfe4c3',
  176. },
  177. {
  178. a: '114ca50f7a8e2f3f657c1108d9d44cfd8',
  179. b: '3086d221a7d46bcde86c90e49284eb15',
  180. },
  181. ],
  182. gRed: false,
  183. g: [
  184. '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
  185. '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
  186. pre,
  187. ],
  188. });