87 \
fpoirotte\Pssht\Encryption\EncryptionInterface $encryptionAlgo,
95 throw new \InvalidArgumentException();
99 throw new \InvalidArgumentException();
102 $len = strlen(gmp_strval($curve->getOrder(), 2));
103 $len = ceil($len / 8);
104 $randBytes = openssl_random_pseudo_bytes($len);
105 $d_S = gmp_mod(gmp_init(bin2hex($randBytes), 16), $curve->getModulus());
106 $this->Q_S = $curve->getGenerator()->multiply($curve, $d_S);
107 $Q_C = $kexDHInit->getQ();
111 $cls = $algorithms->getClass(
'Key',
'ecdsa-sha2-' . $curve->getName());
112 $clientPK =
new $cls($Q_C);
113 if (!$clientPK->isValid()) {
114 throw new \InvalidArgumentException();
118 $P = $Q_C->multiply($curve, gmp_mul($curve->getCofactor(), $d_S));
119 if ($P->isIdentity($curve)) {
120 throw new \InvalidArgumentException();
135 $sub = new \fpoirotte\Pssht\Wire\Encoder(
new \
fpoirotte\Pssht\
Buffer());
136 $this->K_S->serialize($sub);
137 $K_S = $sub->getBuffer()->get(0);
138 $sub->encodeString($this->clientIdent);
139 $sub->encodeString($this->serverIdent);
142 $sub2 = new \fpoirotte\Pssht\Wire\Encoder(
new \
fpoirotte\Pssht\
Buffer());
143 $sub2->encodeBytes($msgId);
144 $this->clientKEX->serialize($sub2);
145 $sub->encodeString($sub2->getBuffer()->get(0));
146 $sub2->encodeBytes($msgId);
147 $this->serverKEX->serialize($sub2);
148 $sub->encodeString($sub2->getBuffer()->get(0));
149 $sub->encodeString(
$K_S);
150 $sub->encodeString($Q_C->serialize($curve));
151 $sub->encodeString($this->Q_S->serialize($curve));
152 $sub->encodeMpint($this->K);
154 $logging = \Plop\Plop::getInstance();
155 $origData = $sub->getBuffer()->get(0);
156 $data = wordwrap(bin2hex($origData), 4,
' ',
true);
157 $data = wordwrap($data, 32 + 7, PHP_EOL,
true);
158 $logging->debug(
"Signature payload:\r\n%s", array($data));
160 $this->H = $this->kexAlgo->hash($origData);
170 $sub = new \fpoirotte\Pssht\Wire\Encoder(
new \
fpoirotte\Pssht\
Buffer());
171 $this->K_S->serialize($sub);
173 $encoder->encodeString($sub->getBuffer()->get(0));
174 $encoder->encodeString($this->Q_S->serialize($this->curve));
176 $sub->encodeString($this->K_S->getName());
177 $sub->encodeString($this->K_S->sign($this->H));
178 $encoder->encodeString($sub->getBuffer()->get(0));
185 throw new \RuntimeException();
$serverIdent
Server's identification string.
$Q_S
Server's ephemeral public key.
__construct(\fpoirotte\Pssht\ECC\Curve $curve,\fpoirotte\Pssht\Messages\KEX\ECDH\INIT\RFC5656 $kexDHInit,\fpoirotte\Pssht\Key\KeyInterface $key,\fpoirotte\Pssht\Encryption\EncryptionInterface $encryptionAlgo,\fpoirotte\Pssht\KEX\KEXInterface $kexAlgo,\fpoirotte\Pssht\Messages\KEXINIT $serverKEX,\fpoirotte\Pssht\Messages\KEXINIT $clientKEX, $serverIdent, $clientIdent)
$K_S
Server's public host key.
static unserialize(\fpoirotte\Pssht\Wire\Decoder $decoder)
serialize(\fpoirotte\Pssht\Wire\Encoder $encoder)
$kexAlgo
Key exchange algorithm to use.
$curve
Elliptic curve in use.
$serverKEX
Algorithms supported by the server.
$clientKEX
Algorithms supported by the client.
$kexDHInit
Client's contribution to the Diffie-Hellman Key Exchange.
$clientIdent
Client's identification string.