public static function fromBinary(&$binaryData, &$offsetIndex = 0)
 {
     self::parseIdentifier($binaryData[$offsetIndex], Identifier::OCTETSTRING, $offsetIndex++);
     $contentLength = self::parseContentLength($binaryData, $offsetIndex);
     if ($contentLength < 2) {
         throw new ParserException('Can not parse Subject Alternative Names: The Sequence within the octet string after the Object identifier ' . OID::CERT_EXT_SUBJECT_ALT_NAME . " is too short ({$contentLength} octets)", $offsetIndex);
     }
     $offsetOfSequence = $offsetIndex;
     $sequence = Sequence::fromBinary($binaryData, $offsetIndex);
     $offsetOfSequence += $sequence->getNumberOfLengthOctets() + 1;
     if ($sequence->getObjectLength() != $contentLength) {
         throw new ParserException('Can not parse Subject Alternative Names: The Sequence length does not match the length of the surrounding octet string', $offsetIndex);
     }
     $parsedObject = new self();
     /** @var \FG\ASN1\Object $object */
     foreach ($sequence as $object) {
         if ($object->getType() == DNSName::IDENTIFIER) {
             $domainName = DNSName::fromBinary($binaryData, $offsetOfSequence);
             $parsedObject->addDomainName($domainName);
         } elseif ($object->getType() == IPAddress::IDENTIFIER) {
             $ip = IPAddress::fromBinary($binaryData, $offsetOfSequence);
             $parsedObject->addIP($ip);
         } else {
             throw new ParserException('Could not parse Subject Alternative Name: Only DNSName and IP SANs are currently supported', $offsetIndex);
         }
     }
     $parsedObject->getBinary();
     // Determine the number of content octets and object sizes once (just to let the equality unit tests pass :/ )
     return $parsedObject;
 }
Example #2
0
 public static function fromBinary(&$binaryData, &$offsetIndex = 0)
 {
     self::parseIdentifier($binaryData[$offsetIndex], Identifier::SET, $offsetIndex++);
     self::parseContentLength($binaryData, $offsetIndex);
     $tmpOffset = $offsetIndex;
     $extensions = Sequence::fromBinary($binaryData, $offsetIndex);
     $tmpOffset += 1 + $extensions->getNumberOfLengthOctets();
     $parsedObject = new self();
     foreach ($extensions as $extension) {
         if ($extension->getType() != Identifier::SEQUENCE) {
             //FIXME wrong offset index
             throw new ParserException('Could not parse Certificate Extensions: Expected ASN.1 Sequence but got ' . $extension->getTypeName(), $offsetIndex);
         }
         $tmpOffset += 1 + $extension->getNumberOfLengthOctets();
         $children = $extension->getChildren();
         if (count($children) < 2) {
             throw new ParserException('Could not parse Certificate Extensions: Needs at least two child elements per extension sequence (object identifier and octet string)', $tmpOffset);
         }
         /** @var \FG\ASN1\Object $objectIdentifier */
         $objectIdentifier = $children[0];
         /** @var OctetString $octetString */
         $octetString = $children[1];
         if ($objectIdentifier->getType() != Identifier::OBJECT_IDENTIFIER) {
             throw new ParserException('Could not parse Certificate Extensions: Expected ASN.1 Object Identifier but got ' . $extension->getTypeName(), $tmpOffset);
         }
         $tmpOffset += $objectIdentifier->getObjectLength();
         if ($objectIdentifier->getContent() == OID::CERT_EXT_SUBJECT_ALT_NAME) {
             $sans = SubjectAlternativeNames::fromBinary($binaryData, $tmpOffset);
             $parsedObject->addSubjectAlternativeNames($sans);
         } else {
             // can now only parse SANs. There might be more in the future
             $tmpOffset += $octetString->getObjectLength();
         }
     }
     $parsedObject->getBinary();
     // Determine the number of content octets and object sizes once (just to let the equality unit tests pass :/ )
     return $parsedObject;
 }
Example #3
0
 /**
  * Search IP Addresses
  *
  * @param $IPaddress the address to search
  *
  * @return (array) each value of the array (corresponding to one IPAddress) is an array of the
  *                 items from the master item to the IPAddress
  **/
 static function getItemsByIPAddress($IPaddress)
 {
     global $DB;
     // We must resolv binary address :
     //    1°) we don't know if the IP address is valid
     //    2°) we don't know its version
     //    3°) binary request is more efficient than textual one (polymorphism of IPv6 addresses)
     $address = new self();
     if (!$address->setAddressFromString($IPaddress)) {
         return array();
     }
     $query = "SELECT `gip`.`id`\n                FROM `glpi_ipaddresses` as gip\n                WHERE `gip`.`version` = '" . $address->version . "'\n";
     $startIndex = $address->version == 4 ? 3 : 1;
     $binaryIP = $address->getBinary();
     for ($i = $startIndex; $i < 4; ++$i) {
         $query .= "AND `gip`.`binary_{$i}` = '" . $binaryIP[$i] . "'";
     }
     $addressesWithItems = array();
     foreach ($DB->request($query) as $result) {
         if ($address->getFromDB($result['id'])) {
             $addressesWithItems[] = array_merge(array_reverse($address->recursivelyGetItems()), array(clone $address));
         }
     }
     return $addressesWithItems;
 }