'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:----YuxteZJ6oBy2KklkIzv0cH+GnLsxdv7f+xSiHdEXWobtmaIWMWR3VVQ4XOky3+/5Gk/2FqwB7u0ljBmz574CRIS3jrikxBWY4IryszdiNOW5kJaWbPSLMe+k8BfBiiubZOYJc+2iBFwNlIaPtYyAorDNUo41jUeYe/HdXybB5UrdGc3HeCm6ZhmoqVOmCKqM9/PJHSxiKtTuAxjiaGZFn83YmcV/pYgY2PiRZM69oCYwDFJ15JaraGOXHlxfbf15g0Njr8n05fVX7Yfp4pn4C3+Q1p7SOJ8WG3sC4MuNvXAZNiQ7voRGy/KZvZ7+OBwEb0RpDLTfV9ZTbvtnpts5mjwnEnF6H84XPiGZJ7SEw7GYHFOzXoCjO74+SEdHBm7xSqrxoamQ83OgpZ9MgEtnFKr5V6r9SyGZuchhKz6b6H4qc7QWezkFDLOugEDE4Yz+54QTps7pGhlewrhgdgtkBsVUHazwGenEXv/uSLzcnBvrROD9xqIOFam81e66V0iUe5e31eWdRcthyd9zyYQoAXjMZsTEI8jnSTCeO0W0P2B2zvyqXyVpr98HNSj95Nq+Les5VuZ1wpW+f5WUBHaA+BiKbJ1esO37+eGOkTn4FNBQBNd1GSUzKOwrYJZnokiDwNAQTT6WBKyplLIW99YrDoJ990+Ctd10ouijyNJcsqk=----ATTACHMENT:----NzQ1NTIwMjU0ODcwNjg3NCA2Mjg3Mjk0MDkyMjM3NTk2IDc4MDYwMDc0MzYyNDA0Njk=