Subversion Repositories oidplus

Rev

Rev 846 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. /**
  4.  * "PKCS1" Formatted EC Key Handler
  5.  *
  6.  * PHP version 5
  7.  *
  8.  * Processes keys with the following headers:
  9.  *
  10.  * -----BEGIN DH PARAMETERS-----
  11.  *
  12.  * Technically, PKCS1 is for RSA keys, only, but we're using PKCS1 to describe
  13.  * DSA, whose format isn't really formally described anywhere, so might as well
  14.  * use it to describe this, too.
  15.  *
  16.  * @category  Crypt
  17.  * @package   DH
  18.  * @author    Jim Wigginton <terrafrost@php.net>
  19.  * @copyright 2015 Jim Wigginton
  20.  * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
  21.  * @link      http://phpseclib.sourceforge.net
  22.  */
  23.  
  24. namespace phpseclib3\Crypt\DH\Formats\Keys;
  25.  
  26. use phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor;
  27. use phpseclib3\File\ASN1;
  28. use phpseclib3\File\ASN1\Maps;
  29. use phpseclib3\Math\BigInteger;
  30.  
  31. /**
  32.  * "PKCS1" Formatted DH Key Handler
  33.  *
  34.  * @package DH
  35.  * @author  Jim Wigginton <terrafrost@php.net>
  36.  * @access  public
  37.  */
  38. abstract class PKCS1 extends Progenitor
  39. {
  40.     /**
  41.      * Break a public or private key down into its constituent components
  42.      *
  43.      * @access public
  44.      * @param string $key
  45.      * @param string $password optional
  46.      * @return array
  47.      */
  48.     public static function load($key, $password = '')
  49.     {
  50.         $key = parent::load($key, $password);
  51.  
  52.         $decoded = ASN1::decodeBER($key);
  53.         if (empty($decoded)) {
  54.             throw new \RuntimeException('Unable to decode BER');
  55.         }
  56.  
  57.         $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP);
  58.         if (!is_array($components)) {
  59.             throw new \RuntimeException('Unable to perform ASN1 mapping on parameters');
  60.         }
  61.  
  62.         return $components;
  63.     }
  64.  
  65.     /**
  66.      * Convert EC parameters to the appropriate format
  67.      *
  68.      * @access public
  69.      * @return string
  70.      */
  71.     public static function saveParameters(BigInteger $prime, BigInteger $base, array $options = [])
  72.     {
  73.         $params = [
  74.             'prime' => $prime,
  75.             'base' => $base
  76.         ];
  77.         $params = ASN1::encodeDER($params, Maps\DHParameter::MAP);
  78.  
  79.         return "-----BEGIN DH PARAMETERS-----\r\n" .
  80.                chunk_split(base64_encode($params), 64) .
  81.                "-----END DH PARAMETERS-----\r\n";
  82.     }
  83. }
  84.