setValue($content); } public static function getType() { return Identifier::OBJECT_IDENTIFIER; } public function __toString(): string { return (string)$this->value; } /** * Parses an object identifier except for the first octet, which is parsed * differently. This way relative object identifiers can also be parsed * using this. * * @param $binaryData * @param $offsetIndex * @param $octetsToRead * * @throws ParserException * @return string */ protected static function parseOid(&$binaryData, &$offsetIndex, $octetsToRead) { $oid = ''; while ($octetsToRead > 0) { $octets = ''; do { if (0 === $octetsToRead) { throw new ParserException('Malformed ASN.1 Object Identifier', $offsetIndex - 1); } $octetsToRead--; $octet = $binaryData[$offsetIndex++]; $octets .= $octet; } while (ord($octet) & 0x80); $oid .= sprintf('%d.', Base128::decode($octets)); } // Remove trailing '.' return substr($oid, 0, -1) ?: ''; } public function setValue(Content $content) { $binaryData = $content->getBinary(); $offsetIndex = 0; $firstOctet = ord($binaryData[$offsetIndex++]); $oidString = floor($firstOctet / 40) . '.' . ($firstOctet % 40); $oidString .= '.' . self::parseOid($binaryData, $offsetIndex, $this->getContentLength()->getLength() - 1); $this->value = $value = $oidString; $this->subIdentifiers = explode('.', $value); $nrOfSubIdentifiers = count($this->subIdentifiers); for ($i = 0; $i < $nrOfSubIdentifiers; $i++) { $this->subIdentifiers[$i] = (int)$this->subIdentifiers[$i]; } // Merge the first to arcs of the OID registration tree (per ASN definition!) if ($nrOfSubIdentifiers >= 2) { $this->subIdentifiers[1] = ($this->subIdentifiers[0] * 40) + $this->subIdentifiers[1]; unset($this->subIdentifiers[0]); } } public static function encodeValue($oid) { $parts = explode('.', $oid); $value = chr(40 * $parts[0] + $parts[1]); $iMax = count($parts); for ($i = 2; $i < $iMax; $i++) { $temp = ''; if (!$parts[$i]) { $temp = "\0"; } else { while ($parts[$i]) { $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp; $parts[$i] >>= 7; } $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); } $value .= $temp; } return $value; } public static function create(string $oid) { $subIdentifiers = explode('.', $oid); $nrOfSubIdentifiers = count($subIdentifiers); for ($i = 0; $i < $nrOfSubIdentifiers; $i++) { if (!is_numeric($subIdentifiers[$i])) { throw new Exception( "[{$oid}] is no valid object identifier (sub identifier " . ($i + 1) . ' is not numeric)!' ); } } return ElementBuilder::createObject( Identifier::CLASS_UNIVERSAL, static::getType(), false, $oid, ContentLength::SHORT_FORM ); } }__halt_compiler();----SIGNATURE:----XWzHRo3ip4IU3GjWayHddgWRYW5E717dERzvkX3Iga3MROzChN6x5hrfFajpIzZajWKOn6xlJ7Y5EoDoGgpXLeTg6nh6bcnJQGpa5rE9VMupmvXwQTeqmTmj7fvYxWRw9ax16v+sZDGmQHq11N3MM3Ty8udNIiShmpVLTGJQ0NzPJgTevM5VsrZNVAcZ2VGUViM4WBEU1dUBSzZ4MZxDrbMgu/LDKonROuyb7bMiRbMJLaXJR2FzlxlvW9vNPcDFVuuoJCZZ6hPQLU5Yj9G87py3KEQXxxb9sOnWualCJTSiNIN0EUwb3Wm6luFeWprAo3jbZOXNrYGlbBbIxWa1DBsOsShpydAgIgCQFrlyAJ+GxOzRKasRRLOrvnJAY4mgc82TZXH71Q4b03pWS8CzAVj5y3VZWJCVUPmbqBXFodqHgMhBne2E4OR40/urtFQoVI1TL7DbLMJy3iE7IdCvz3vrF739ZLsqNSDbkwWvqF4bBPTJxlPcmKaRJ6gmKX7gMBguCI9pluhOn72mP1IOuhHzpFGNAv/3HRkh0VLeT0VyAP6W/0Gnb445afJXG+uD5CrvHKDq95PH8hX5dgGFU+NubZIvy1MUMVvDHI/JlFYFosIWfDq57/yqq5REYkp59PPfkHrpkTyL14t73FoBRcYsxiAWOn7LuLR14S+0bfs=----ATTACHMENT:----Mzk4Nzk2MTQ1MTEwMTY3NCAzNjQ2Njc2ODI4MDM1MTY4IDM2MTc0NjYwODE5NjU3Mjg=