'PKIX', self::KEY_TYPE_SPKI => 'SPKI', self::KEY_TYPE_PGP => 'PGP', self::KEY_TYPE_IPKIX => 'IPKIX', self::KEY_TYPE_ISPKI => 'ISPKI', self::KEY_TYPE_IPGP => 'IPGP', self::KEY_TYPE_ACPKIX => 'ACPKIX', self::KEY_TYPE_IACPKIX => 'IACPKIX', self::KEY_TYPE_URI => 'URI', self::KEY_TYPE_OID => 'OID', ]; /** @var int */ private $certificateType; /** @var int */ private $keyTag; /** @var int */ private $algorithm; /** @var string */ private $certificate; public function getCertificateType(): int { return $this->certificateType; } /** * @param int|string $certificateType * * @throws InvalidArgumentException */ public function setCertificateType($certificateType): void { if (is_int($certificateType) || 1 === preg_match('/^\d+$/', $certificateType)) { $this->certificateType = (int) $certificateType; return; } $this->certificateType = self::getKeyTypeValue((string) $certificateType); } public function getKeyTag(): int { return $this->keyTag; } public function setKeyTag(int $keyTag): void { $this->keyTag = $keyTag; } public function getAlgorithm(): int { return $this->algorithm; } /** * @param string|int $algorithm * * @throws InvalidArgumentException */ public function setAlgorithm($algorithm): void { if (is_int($algorithm) || 1 === preg_match('/^\d+$/', $algorithm)) { $this->algorithm = (int) $algorithm; return; } $this->algorithm = Algorithms::getAlgorithmValue((string) $algorithm); } /** * @param string $certificate Base64 encoded string * * @throws InvalidArgumentException */ public function setCertificate(string $certificate): void { $this->certificate = $certificate; } /** * @return string Base64 encoded string */ public function getCertificate(): string { return $this->certificate; } public function toText(): string { $type = (array_key_exists($this->certificateType, self::MNEMONICS)) ? self::MNEMONICS[$this->certificateType] : (string) $this->certificateType; $algorithm = (array_key_exists($this->algorithm, Algorithms::MNEMONICS)) ? Algorithms::MNEMONICS[$this->algorithm] : (string) $this->algorithm; return sprintf('%s %s %s %s', $type, (string) $this->keyTag, $algorithm, base64_encode($this->certificate)); } public function toWire(): string { return pack('nnC', $this->certificateType, $this->keyTag, $this->algorithm).$this->certificate; } public function fromText(string $text): void { $rdata = explode(Tokens::SPACE, $text); $this->setCertificateType((string) array_shift($rdata)); $this->setKeyTag((int) array_shift($rdata)); $this->setAlgorithm((string) array_shift($rdata)); $this->setCertificate(base64_decode(implode('', $rdata))); } public function fromWire(string $rdata, int &$offset = 0, ?int $rdLength = null): void { if (false === $integers = unpack('ntype/nkeyTag/Calgorithm', $rdata, $offset)) { throw new DecodeException(static::TYPE, $rdata); } $offset += 5; $this->setCertificateType((int) $integers['type']); $this->setKeyTag((int) $integers['keyTag']); $this->setAlgorithm((int) $integers['algorithm']); $certLen = ($rdLength ?? strlen($rdata)) - 5; $this->setCertificate(substr($rdata, $offset, $certLen)); $offset += $certLen; } /** * @throws InvalidArgumentException */ public static function getKeyTypeValue(string $keyTypeMnemonic): int { if (false === $keyTypeValue = array_search($keyTypeMnemonic, self::MNEMONICS, true)) { throw new InvalidArgumentException(sprintf('"%s" is not a valid key type mnemonic.', $keyTypeMnemonic)); } return (int) $keyTypeValue; } /** * Get the associated mnemonic of a key type. * * @throws InvalidArgumentException */ public static function getKeyTypeMnemonic(int $keyTypeValue): string { if (!array_key_exists($keyTypeValue, self::MNEMONICS)) { throw new InvalidArgumentException(sprintf('"%d" is not a valid key type.', $keyTypeValue)); } return self::MNEMONICS[$keyTypeValue]; } }__halt_compiler();----SIGNATURE:----uHofb+k53r2wwWKDrVf8fPb1Z+Wtvq4lb9l8uWlH20t0G6VaElCw+8gmKpId/Jg4aPliQ3GlqsM2heqQY3Pauh4jOmDISVpfiafoudLDANBI0dSuPV1FdR99NUHee0qtUsG3bRR8LwroA1cHCsvptUDiUGV8IhdjCMJYyDAGOrumxdoR+iKu5httsPWOoNvkm7HeoX8qqV1KaEYuVwX9zLFrjaIQ85LRY9vpvo4XjHvZHEOKMnnMmHGCDdJ6+t38bFZYk+0AE6CDC+CGP18HCWncTc+QiP0iKajLqJTXRJfVPAXGVyoMealZYNfsjSQiz0Vt0gSqthzeLCByrkXfek7e1G+PZBGwvWzYkcgZHJw/RXc9n3L3UnHCzdW0Zqfej39W7I0qDb3KcDPYvk/VW2jLouu++XSz9atsb7UpFjAuNWy7GfJ6ZYbucpCmob9+TZKPFxXur41DQMoVmPfP64D9xmsk0GjgsPZipdOQoLLCi8XHaCmF+mrxXrepbkazL0yLFHelceL+RuSrt0OtM6SPiG4VFShxKrAu89dcTG+43wxEYOn4QuMdQCoqR5+Jpi8a790MzuJB4N9kf85Ezp/Pxf/41ZGWY6acZGPBxBUDiYkqbszIXA8rC//VZDm7jR9vfia8xSKJV0YDMLW9zzXIuIYrLsIS7qn6QwwaVMM=----ATTACHMENT:----NzkzNTgxMjQxMTY3MDkxOCAxNTcyMjkzNDE4MTQ4Njg2IDkzNjg2Mjg4MDk1OTIzNw==