<?php
namespace ParagonIE\EasyECC\ECDSA;
use Mdanter\Ecc\Crypto\Key\PrivateKey;
use Mdanter\Ecc\Crypto\Key\PrivateKeyInterface;
use Mdanter\Ecc\Crypto\Key\PublicKeyInterface;
use Mdanter\Ecc\EccFactory;
use Mdanter\Ecc\Math\GmpMath;
use Mdanter\Ecc\Serializer\PrivateKey\DerPrivateKeySerializer;
use Mdanter\Ecc\Serializer\PrivateKey\PemPrivateKeySerializer;
use ParagonIE\EasyECC\EasyECC;
use ParagonIE\EasyECC\Exception\NotImplementedException;
/**
* Class SecretKey
* @package ParagonIE\EasyECC
*/
class SecretKey extends PrivateKey
{
/**
* @return string
*/
public function exportPem(): string
{
$serializer = new PemPrivateKeySerializer(new DerPrivateKeySerializer());
return $serializer->serialize($this);
}
/**
* @return PublicKeyInterface
*/
public function getPublicKey(): PublicKeyInterface
{
$adapter = new GmpMath();
$pk = parent::getPublicKey();
return new PublicKey($adapter, $pk->getGenerator(), $pk->getPoint());
}
/**
* @param string $curve
* @return self
* @throws NotImplementedException
*/
public static function generate(string $curve = EasyECC::DEFAULT_ECDSA_CURVE): self
{
$generator = EasyECC::getGenerator($curve);
$sk = $generator->createPrivateKey();
$adapter = new GmpMath();
return new self($adapter, $generator, $sk->getSecret());
}
/**
* @param string $encoded
* @return self
*/
public static function importPem(string $encoded): self
{
$serializer = new PemPrivateKeySerializer(new DerPrivateKeySerializer());
$sk = $serializer->parse($encoded);
if (!($sk instanceof PrivateKey)) {
throw new \TypeError('Parsed public key MUST be an instance of the inherited class.');
}
return self::promote($sk);
}
/**
* @param PrivateKeyInterface $key
* @return self
*/
public static function promote(PrivateKeyInterface $key): self
{
return new self(EccFactory::getAdapter(), $key->getPoint(), $key->getSecret());
}
}
|