- * @param string $Der der formatted string
- * @param bool $Private key type optional, default false
- * @return string
- */
- private static function DerToPem($Der, $Private = false)
- {
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 65);
- $body = implode("\n", $lines);
- //Get title:
- $title = $Private ? 'RSA PRIVATE KEY' : 'PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
- }
-
- /**
- * @param string $Der der formatted string
- * @return string
- */
- private static function DerToRsa($Der)
- {
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 64);
- $body = implode("\n", $lines);
- //Get title:
- $title = 'RSA PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
- }
-
- /**
- * @param string $Modulus modulo
- * @param string $PublicExponent exponent
- * @return string
- */
- private static function pkcs8Encode($Modulus, $PublicExponent)
- {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = [$modulus, $publicExponent];
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte
- $bitString = new ASNValue(ASNValue::TAG_BITSTRING);
- $bitString->Value = $bitStringValue;
- //Encode body
- $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode();
- $body = new ASNValue(ASNValue::TAG_SEQUENCE);
- $body->Value = $bodyValue;
- //Get DER encoded public key:
- $PublicDER = $body->Encode();
- return $PublicDER;
- }
-
- /**
- * @param string $Modulus modulo
- * @param string $PublicExponent exponent
- * @return string
- */
- private static function pkcs1Encode($Modulus, $PublicExponent)
- {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = [$modulus, $publicExponent];
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- return $bitStringValue;
- }
-
- /**
- * @param string $m modulo
- * @param string $e exponent
- * @return string
- */
- public static function meToPem($m, $e)
- {
- $der = self::pkcs8Encode($m, $e);
- $key = self::DerToPem($der, false);
- return $key;
- }
-
- /**
- * @param string $key key
- * @param string $m modulo reference
- * @param object $e exponent reference
- * @return void
- * @throws \Exception
- */
- private static function pubRsaToMe($key, &$m, &$e)
- {
- $lines = explode("\n", $key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('', $lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = Strings::base64UrlDecode($r[0]->asnData[0]->asnData);
- $e = Strings::base64UrlDecode($r[0]->asnData[1]->asnData);
- }
-
- /**
- * @param string $key key
- * @return string
- * @throws \Exception
- */
- public static function rsaToPem($key)
- {
- self::pubRsaToMe($key, $m, $e);
- return self::meToPem($m, $e);
- }
-
- /**
- * @param string $key key
- * @return string
- * @throws \Exception
- */
- private static function pemToRsa($key)
- {
- self::pemToMe($key, $m, $e);
- return self::meToRsa($m, $e);
- }
-
- /**
- * @param string $key key
- * @param string $m modulo reference
- * @param string $e exponent reference
- * @return void
- * @throws \Exception
- */
- public static function pemToMe($key, &$m, &$e)
- {
- $lines = explode("\n", $key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('', $lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = Strings::base64UrlDecode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
- $e = Strings::base64UrlDecode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
- }
-
- /**
- * @param string $m modulo
- * @param string $e exponent
- * @return string