Example #1
0
 /**
  * @expectedException \LengthException
  */
 public function testSmallModulo()
 {
     $plaintext = 'x';
     $n = new BigInteger(base64_decode('272435F22706FA96DE26E980D22DFF67'), 256);
     $e = new BigInteger(base64_decode('158753FF2AF4D1E5BBAB574D5AE6B54D'), 256);
     $rsa = new RSA();
     $rsa->load(array('n' => $n, 'e' => $e));
     $rsa->encrypt($plaintext);
 }
Example #2
0
    /**
     * @group github768
     */
    public function testPSSSigs()
    {
        $rsa = new RSA();
        $rsa->load('-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVx
wTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFnc
CzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0T
p0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----');
        $sig = pack('H*', '1bd29a1d704a906cd7f726370ce1c63d8fb7b9a620871a05f3141a311c0d6e75fefb5d36dfb50d3ea2d37cd67992471419bfadd35da6e13b494' . '058ddc9b568d4cfea13ddc3c62b86a6256f5f296980d1131d3eaec6089069a3de79983f73eae20198a18721338b4a66e9cfe80e4f8e4fcef7a5bead5cbb' . 'b8ac4c76adffbc178c');
        $this->assertTrue($rsa->verify('zzzz', $sig));
    }
Example #3
0
    /**
     * @group github705
     */
    public function testSaveNullRSAParam()
    {
        $privKey = new RSA();
        $privKey->load('-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDMswfEpAgnUDWA74zZw5XcPsWh1ly1Vk99tsqwoFDkLF7jvXy1
dDLHYfuquvfxCgcp8k/4fQhx4ubR8bbGgEq9B05YRnViK0R0iBB5Ui4IaxWYYhKE
8xqAEH2fL+/7nsqqNFKkEN9KeFwc7WbMY49U2adlMrpBdRjk1DqIEW3QTwIDAQAB
AoGBAJ+83cT/1DUJjJcPWLTeweVbPtJp+3Ku5d1OdaGbmURVs764scbP5Ihe2AuF
V9LLZoe/RdS9jYeB72nJ3D3PA4JVYYgqMOnJ8nlUMNQ+p0yGl5TqQk6EKLI8MbX5
kQEazNqFXsiWVQXubAd5wjtb6g0n0KD3zoT/pWLES7dtUFexAkEA89h5+vbIIl2P
H/NnkPie2NWYDZ1YiMGHFYxPDwsd9KCZMSbrLwAhPg9bPgqIeVNfpwxrzeksS6D9
P98tJt335QJBANbnCe+LhDSrkpHMy9aOG2IdbLGG63MSRUCPz8v2gKPq3kYXDxq6
Y1iqF8N5g0k5iirHD2qlWV5Q+nuGvFTafCMCQQC1wQiC0IkyXEw/Q31RqI82Dlcs
5rhEDwQyQof3LZEhcsdcxKaOPOmKSYX4A3/f9w4YBIEiVQfoQ1Ig1qfgDZklAkAT
TQDJcOBY0qgBTEFqbazr7PScJR/0X8m0eLYS/XqkPi3kYaHLpr3RcsVbmwg9hVtx
aBtsWpliLSex/HHhtRW9AkBGcq67zKmEpJ9kXcYLEjJii3flFS+Ct/rNm+Hhm1l7
4vca9v/F2hGVJuHIMJ8mguwYlNYzh2NqoIDJTtgOkBmt
-----END RSA PRIVATE KEY-----');
        $pubKey = new RSA();
        $pubKey->load($privKey->getPublicKey());
        $pubKey->setPublicKey();
        $subject = new X509();
        $subject->setDNProp('id-at-organizationName', 'phpseclib demo cert');
        $subject->setPublicKey($pubKey);
        $issuer = new X509();
        $issuer->setPrivateKey($privKey);
        $issuer->setDN($subject->getDN());
        $x509 = new X509();
        $result = $x509->sign($issuer, $subject);
        $cert = $x509->saveX509($result);
        $cert = $x509->loadX509($cert);
        $this->assertArrayHasKey('parameters', $cert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']);
        $this->assertArrayHasKey('parameters', $cert['signatureAlgorithm']);
        $this->assertArrayHasKey('parameters', $cert['tbsCertificate']['signature']);
    }
Example #4
0
 /**
  * Request Identities
  *
  * See "2.5.2 Requesting a list of protocol 2 keys"
  * Returns an array containing zero or more \phpseclib\System\SSH\Agent\Identity objects
  *
  * @return array
  * @throws \RuntimeException on receipt of unexpected packets
  * @access public
  */
 function requestIdentities()
 {
     if (!$this->fsock) {
         return array();
     }
     $packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES);
     if (strlen($packet) != fputs($this->fsock, $packet)) {
         throw new \RuntimeException('Connection closed while requesting identities');
     }
     $length = current(unpack('N', fread($this->fsock, 4)));
     $type = ord(fread($this->fsock, 1));
     if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) {
         throw new \RuntimeException('Unable to request identities');
     }
     $identities = array();
     $keyCount = current(unpack('N', fread($this->fsock, 4)));
     for ($i = 0; $i < $keyCount; $i++) {
         $length = current(unpack('N', fread($this->fsock, 4)));
         $key_blob = fread($this->fsock, $length);
         $length = current(unpack('N', fread($this->fsock, 4)));
         if ($length) {
             $key_comment = fread($this->fsock, $length);
         }
         $length = current(unpack('N', substr($key_blob, 0, 4)));
         $key_type = substr($key_blob, 4, $length);
         switch ($key_type) {
             case 'ssh-rsa':
                 $key = new RSA();
                 $key->load('ssh-rsa ' . base64_encode($key_blob) . ' ' . $key_comment);
                 break;
             case 'ssh-dss':
                 // not currently supported
                 break;
         }
         // resources are passed by reference by default
         if (isset($key)) {
             $identity = new Identity($this->fsock);
             $identity->setPublicKey($key);
             $identity->setPublicKeyBlob($key_blob);
             $identities[] = $identity;
             unset($key);
         }
     }
     return $identities;
 }
Example #5
0
 /**
  * Compute a public key identifier.
  *
  * Although key identifiers may be set to any unique value, this function
  * computes key identifiers from public key according to the two
  * recommended methods (4.2.1.2 RFC 3280).
  * Highly polymorphic: try to accept all possible forms of key:
  * - Key object
  * - \phpseclib\File\X509 object with public or private key defined
  * - Certificate or CSR array
  * - \phpseclib\File\ASN1\Element object
  * - PEM or DER string
  *
  * @param mixed $key optional
  * @param int $method optional
  * @access public
  * @return string binary key identifier
  */
 function computeKeyIdentifier($key = null, $method = 1)
 {
     if (is_null($key)) {
         $key = $this;
     }
     switch (true) {
         case is_string($key):
             break;
         case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']):
             return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method);
         case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']):
             return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method);
         case !is_object($key):
             return false;
         case $key instanceof Element:
             // Assume the element is a bitstring-packed key.
             $asn1 = new ASN1();
             $decoded = $asn1->decodeBER($key->element);
             if (empty($decoded)) {
                 return false;
             }
             $raw = $asn1->asn1map($decoded[0], array('type' => ASN1::TYPE_BIT_STRING));
             if (empty($raw)) {
                 return false;
             }
             $raw = Base64::decode($raw);
             // If the key is private, compute identifier from its corresponding public key.
             $key = new RSA();
             if (!$key->load($raw)) {
                 return false;
                 // Not an unencrypted RSA key.
             }
             if ($key->getPrivateKey() !== false) {
                 // If private.
                 return $this->computeKeyIdentifier($key, $method);
             }
             $key = $raw;
             // Is a public key.
             break;
         case $key instanceof X509:
             if (isset($key->publicKey)) {
                 return $this->computeKeyIdentifier($key->publicKey, $method);
             }
             if (isset($key->privateKey)) {
                 return $this->computeKeyIdentifier($key->privateKey, $method);
             }
             if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) {
                 return $this->computeKeyIdentifier($key->currentCert, $method);
             }
             return false;
         default:
             // Should be a key object (i.e.: \phpseclib\Crypt\RSA).
             $key = $key->getPublicKey('PKCS1');
             break;
     }
     // If in PEM format, convert to binary.
     $key = $this->_extractBER($key);
     // Now we have the key string: compute its sha-1 sum.
     $hash = new Hash('sha1');
     $hash = $hash->hash($key);
     if ($method == 2) {
         $hash = substr($hash, -8);
         $hash[0] = chr(ord($hash[0]) & 0xf | 0x40);
     }
     return $hash;
 }
Example #6
0
    /**
     * @group github468
     */
    public function testSignedPKCS1()
    {
        $rsa = new RSA();
        $key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/k7FwSDE9R9rvTU2nGdJwKaVG
RvBIYGJNahseQhZkQH4CVFMdpWhmD8PyXpjNHtV1CJ0bqAX6e5QyNjvl0FeBj9dz
JWrQdxx/WNN+ABG426rgYYbeGcIlWLZCw6Bx/1HtN5ef6nVEoiGNChYKIRB4QFOi
01smFxps1w8ZIQnD6wIDAQAB
-----END PUBLIC KEY-----';
        $rsa->load($key);
        $rsa->setPublicKey();
        $newkey = $rsa->getPublicKey();
        $this->assertSame(preg_replace('#\\s#', '', $key), preg_replace('#\\s#', '', $newkey));
    }
Example #7
0
 /**
  * __clone() magic method
  *
  * @access public
  * @return \phpseclib\Crypt\RSA
  */
 function __clone()
 {
     $key = new RSA();
     $key->load($this);
     return $key;
 }
Example #8
0
    public function testPuttyPublicKey()
    {
        $key = '---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20151023"
AAAAB3NzaC1yc2EAAAABJQAAAIEAhC/CSqJ+8vgeQ4H7fJru29h/McqAC9zdGzw0
9QsifLQ7s5MvXCavhjUPYIfV0KsdLQydNPLJcbKpXmpVD9azo61zLXwsYr8d1eHr
C/EwUYl8b0fAwEsEF3myb+ryzgA9ihY08Zs9NZdmt1Maa+I7lQcLX9F/65YdcAch
ILaEujU=
---- END SSH2 PUBLIC KEY ----';
        $rsa = new RSA();
        $rsa->load($key);
        $this->assertSame($rsa->getLoadedFormat(), 'PuTTY');
        $this->assertGreaterThanOrEqual(1, strlen("{$rsa}"));
    }