| 
<?phpnamespace 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());
 }
 }
 
 |