1<?php 2 3/** 4 * Montgomery Public Key Handler 5 * 6 * PHP version 5 7 * 8 * @category Crypt 9 * @package EC 10 * @author Jim Wigginton <terrafrost@php.net> 11 * @copyright 2015 Jim Wigginton 12 * @license http://www.opensource.org/licenses/mit-license.html MIT License 13 * @link http://phpseclib.sourceforge.net 14 */ 15 16namespace phpseclib3\Crypt\EC\Formats\Keys; 17 18use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; 19use phpseclib3\Crypt\EC\Curves\Curve25519; 20use phpseclib3\Crypt\EC\Curves\Curve448; 21use phpseclib3\Math\BigInteger; 22 23/** 24 * Montgomery Public Key Handler 25 * 26 * @package EC 27 * @author Jim Wigginton <terrafrost@php.net> 28 * @access public 29 */ 30abstract class MontgomeryPublic 31{ 32 /** 33 * Is invisible flag 34 * 35 * @access private 36 */ 37 const IS_INVISIBLE = true; 38 39 /** 40 * Break a public or private key down into its constituent components 41 * 42 * @access public 43 * @param string $key 44 * @param string $password optional 45 * @return array 46 */ 47 public static function load($key, $password = '') 48 { 49 switch (strlen($key)) { 50 case 32: 51 $curve = new Curve25519(); 52 break; 53 case 56: 54 $curve = new Curve448(); 55 break; 56 default: 57 throw new \LengthException('The only supported lengths are 32 and 56'); 58 } 59 60 $components = ['curve' => $curve]; 61 $components['QA'] = [$components['curve']->convertInteger(new BigInteger(strrev($key), 256))]; 62 63 return $components; 64 } 65 66 /** 67 * Convert an EC public key to the appropriate format 68 * 69 * @access public 70 * @param \phpseclib3\Crypt\EC\BaseCurves\Montgomery $curve 71 * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey 72 * @return string 73 */ 74 public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) 75 { 76 return strrev($publicKey[0]->toBytes()); 77 } 78} 79