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:----BVcHHBkG2ENxjA/5/mWwBKUcPOwJmRvTZjuofu4r4XwLtCOLEwFhg9IThTctM92yYpSeN3yBOvl0K6kwq84B4hZSHyDmr7Y/X37KRc2n1oQPxUWbE/sz5zccgrrMVK8a3lU1Pig695VJOr4Fzcq9ABIQx74CU0V4mUX5cdrwDLygcB52ayxeQHdp4gQJrBjMUkjKiwya8OxwJQ1jsCGbW5WXGs9QHx4R2OnmqMq+n1B8+C+G/cgTh4yo3sl1KI8fDaEyR15gjioqohWgI6ZwY5i4VeA0knoWxzyP/pGzdCnYEJNjdbpINcAaIFZBci0vqnCLCfDBw1DXJUUZB14pi1GywgP16A5T8kdhlTrJ12JthOxdlpN0xQ03cVwHOqe0Osr35GQK2PQdxQFHa03VUKvZr2+xqrcmYi5yof6twHhOUjsvkLpnhH0nRoJFVbLdemExzvhcrpCIDonOFN8KAE8enhD1Rq213Hl84XJpXyv9SbG7TGCNza41anj+DIUGMEfxRm2L0lnmKVdGrxPYgWfoGMPkTOkubHNNyDjy/EB2jfo67rDsvvn7D2CYzjcQGISKqzPmuxANxMV4baVYitgibsKyZeZmtjJshMe6svhb4qefgfuLU6+ezFzkq43IFkTHuf7b1WX/3nAgYx1P4sQNKDmfXEekhRtBm/1xwzA=----ATTACHMENT:----NDI4MTQ2MjQzODI0NDY3NSA2NjkwNjA0OTc2NjM4MjcyIDIyNTc3Mzc3MjA3Nzc3NzU=