pssht  latest
SSH server library written in PHP
Curve.php
1 <?php
2 
3 /*
4 * This file is part of pssht.
5 *
6 * (c) François Poirotte <clicky@erebot.net>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 
12 namespace fpoirotte\Pssht\ECC;
13 
17 class Curve
18 {
20  protected $name;
21 
23  protected $p;
24 
26  protected $a;
27 
29  protected $b;
30 
32  protected $G;
33 
35  protected $n;
36 
38  protected $h;
39 
41  protected static $curves = array();
42 
43  public function __construct($name, $p, $a, $b, \fpoirotte\Pssht\ECC\Point $G, $n, $h)
44  {
45  $this->name = $name;
46  $this->p = $p;
47  $this->a = $a;
48  $this->b = $b;
49  $this->G = $G;
50  $this->n = $n;
51  $this->h = $h;
52  }
53 
54  public static function initialize()
55  {
56  if (count(static::$curves) !== 0) {
57  return;
58  }
59 
60  # (name, p_XXX, a, b, (xG, yG), n, h)
61  static::$curves['nistp256'] = new static(
62  'nistp256',
63  gmp_init('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),
64  gmp_init('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),
65  gmp_init('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),
66  new \fpoirotte\Pssht\ECC\Point(
67  '0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296',
68  '0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'
69  ),
70  gmp_init('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),
71  1
72  );
73  static::$curves['nistp384'] = new static(
74  'nistp384',
75  gmp_init(
76  '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
77  'FFFFFFEFFFFFFFF0000000000000000FFFFFFFF'
78  ),
79  gmp_init(
80  '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
81  'FFFFFFEFFFFFFFF0000000000000000FFFFFFFC'
82  ),
83  gmp_init(
84  '0xB3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5' .
85  '013875AC656398D8A2ED19D2A85C8EDD3EC2AEF'
86  ),
87  new \fpoirotte\Pssht\ECC\Point(
88  '0xAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E08' .
89  '2542A385502F25DBF55296C3A545E3872760AB7',
90  '0x3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B' .
91  '5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F'
92  ),
93  gmp_init(
94  '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F' .
95  '4372DDF581A0DB248B0A77AECEC196ACCC52973'
96  ),
97  1
98  );
99  static::$curves['nistp521'] = new static(
100  'nistp521',
101  gmp_init(
102  '0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
103  'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
104  'FFFFFFFFFFFFFFFF'
105  ),
106  gmp_init(
107  '0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
108  'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
109  'FFFFFFFFFFFFFFFC'
110  ),
111  gmp_init(
112  '0x0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B48' .
113  '9918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1' .
114  'EF451FD46B503F00'
115  ),
116  new \fpoirotte\Pssht\ECC\Point(
117  '0x00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828A' .
118  'F606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429B' .
119  'F97E7E31C2E5BD66',
120  '0x011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFB' .
121  'D17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C240' .
122  '88BE94769FD16650'
123  ),
124  gmp_init(
125  '0x01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' .
126  'FFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AE' .
127  'BB6FB71E91386409'
128  ),
129  1
130  );
131  }
132 
133  public static function getCurve($name)
134  {
135  if (!isset(static::$curves[$name])) {
136  throw new \InvalidArgumentException();
137  }
138  return static::$curves[$name];
139  }
140 
141  public function getName()
142  {
143  return $this->name;
144  }
145 
146  public function getModulus()
147  {
148  return $this->p;
149  }
150 
151  public function getA()
152  {
153  return $this->a;
154  }
155 
156  public function getB()
157  {
158  return $this->b;
159  }
160 
161  public function getGenerator()
162  {
163  return $this->G;
164  }
165 
166  public function getOrder()
167  {
168  return $this->n;
169  }
170 
171  public function getCofactor()
172  {
173  return $this->h;
174  }
175 }
$n
Curve order.
Definition: Curve.php:35
static $curves
Array with standard curves.
Definition: Curve.php:41
$G
Generator point.
Definition: Curve.php:32
$h
Curve co-factor.
Definition: Curve.php:38
$a
"a" value from the elliptic curve equation.
Definition: Curve.php:26
$b
"b" value from the elliptic curve equation.
Definition: Curve.php:29