'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:----QGXaK+r5o88nldhUeI0U8TUA19B1+pvxnAdHoC+p8UIAUV1us8erPBjGlFGSVoKlhyGE1uGXIdtmLktDRbQs/sbOu3buTSL7ifrxOxxnYuS6hJ6fQUL7su6cm2knhjrzc+4bKbehsgUf7/Ixm3DrpNLAvYkIoYqCDxJF14JVTSKjCwtB9xXqOrZP2CZtP7+1Jg0Be/+k4bfYTv44t5UQl/+r/j3g7Up3lPJnGJzlpQT/uHS9G7Ea1WpNza2rHaRuLiwb7ZkKevBCs8mUs2VUCJRP4AcrL2mGVRSPqtKHc6qw21PqX6NButJ24jA2mkqpL2/VS4S37DpOui+u0hHU2W97S3TiWX8ZjG8mJPL9thfAu2RyJM18aRO9vNM81jlj8kFwlSiVqPGlYuuiiopEnztM6p3+DLeZOSR9PD7kWIEWQjk3v4ZFcLhcIBDkkU7+mZocpxqJxU6XmiFx0hd1YmMqBErZzi6oQh8tWRcH7lQ+kcGCm9EnLjv0zbnIEWlj09ekvnauToacUggWlR52kL+23FfbSXx+Am5WE9xVJfeQ4wg3IRKM3s6dSlOyEzQ2mmKBHU1LMrhe1YbJnONApnRKxFIxDWToWqwZiV2eFdVmgzqglhgkp9OjUpQ8MA+m7cT6lpMd4TqQKhlnoyFoOAZtnZC01YZ6OeL57YAovCk=----ATTACHMENT:----NDczNTU1NjM2NDE0MTc3MSA3MzE2MjM2ODU2MjY1OTEgNzU0MTQxMTY2NDQ3NTgzNA==