curves.js 6.3 KB

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