[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 <?php 2 /* 3 * This file is part of the PHPASN1 library. 4 * 5 * Copyright © Friedrich Große <[email protected]> 6 * 7 * For the full copyright and license information, please view the LICENSE 8 * file that was distributed with this source code. 9 */ 10 11 namespace FG\ASN1\Universal; 12 13 use Exception; 14 use FG\ASN1\Base128; 15 use FG\ASN1\OID; 16 use FG\ASN1\ASNObject; 17 use FG\ASN1\Parsable; 18 use FG\ASN1\Identifier; 19 use FG\ASN1\Exception\ParserException; 20 21 class ObjectIdentifier extends ASNObject implements Parsable 22 { 23 protected $subIdentifiers; 24 protected $value; 25 26 public function __construct($value) 27 { 28 $this->subIdentifiers = explode('.', $value); 29 $nrOfSubIdentifiers = count($this->subIdentifiers); 30 31 for ($i = 0; $i < $nrOfSubIdentifiers; $i++) { 32 if (is_numeric($this->subIdentifiers[$i])) { 33 // enforce the integer type 34 $this->subIdentifiers[$i] = intval($this->subIdentifiers[$i]); 35 } else { 36 throw new Exception("[{$value}] is no valid object identifier (sub identifier ".($i + 1).' is not numeric)!'); 37 } 38 } 39 40 // Merge the first to arcs of the OID registration tree (per ASN definition!) 41 if ($nrOfSubIdentifiers >= 2) { 42 $this->subIdentifiers[1] = ($this->subIdentifiers[0] * 40) + $this->subIdentifiers[1]; 43 unset($this->subIdentifiers[0]); 44 } 45 46 $this->value = $value; 47 } 48 49 public function getContent() 50 { 51 return $this->value; 52 } 53 54 public function getType() 55 { 56 return Identifier::OBJECT_IDENTIFIER; 57 } 58 59 protected function calculateContentLength() 60 { 61 $length = 0; 62 foreach ($this->subIdentifiers as $subIdentifier) { 63 do { 64 $subIdentifier = $subIdentifier >> 7; 65 $length++; 66 } while ($subIdentifier > 0); 67 } 68 69 return $length; 70 } 71 72 protected function getEncodedValue() 73 { 74 $encodedValue = ''; 75 foreach ($this->subIdentifiers as $subIdentifier) { 76 $encodedValue .= Base128::encode($subIdentifier); 77 } 78 79 return $encodedValue; 80 } 81 82 public function __toString() 83 { 84 return OID::getName($this->value); 85 } 86 87 public static function fromBinary(&$binaryData, &$offsetIndex = 0) 88 { 89 self::parseIdentifier($binaryData[$offsetIndex], Identifier::OBJECT_IDENTIFIER, $offsetIndex++); 90 $contentLength = self::parseContentLength($binaryData, $offsetIndex, 1); 91 92 $firstOctet = ord($binaryData[$offsetIndex++]); 93 $oidString = floor($firstOctet / 40).'.'.($firstOctet % 40); 94 $oidString .= '.'.self::parseOid($binaryData, $offsetIndex, $contentLength - 1); 95 96 $parsedObject = new self($oidString); 97 $parsedObject->setContentLength($contentLength); 98 99 return $parsedObject; 100 } 101 102 /** 103 * Parses an object identifier except for the first octet, which is parsed 104 * differently. This way relative object identifiers can also be parsed 105 * using this. 106 * 107 * @param $binaryData 108 * @param $offsetIndex 109 * @param $octetsToRead 110 * 111 * @throws ParserException 112 * 113 * @return string 114 */ 115 protected static function parseOid(&$binaryData, &$offsetIndex, $octetsToRead) 116 { 117 $oid = ''; 118 119 while ($octetsToRead > 0) { 120 $octets = ''; 121 122 do { 123 if (0 === $octetsToRead) { 124 throw new ParserException('Malformed ASN.1 Object Identifier', $offsetIndex - 1); 125 } 126 127 $octetsToRead--; 128 $octet = $binaryData[$offsetIndex++]; 129 $octets .= $octet; 130 } while (ord($octet) & 0x80); 131 132 $oid .= sprintf('%d.', Base128::decode($octets)); 133 } 134 135 // Remove trailing '.' 136 return substr($oid, 0, -1) ?: ''; 137 } 138 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |