Пример #1
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;
 }
Пример #2
0
 /**
  * @depends testFromBinary
  */
 public function testFromBinaryWithOffset()
 {
     $originalObject1 = new SubjectAlternativeNames();
     $originalObject1->addDomainName(new DNSName('corvespace.de'));
     $originalObject1->addIP(new IPAddress('192.168.0.1'));
     $originalObject1->addIP(new IPAddress('10.218.0.1'));
     $originalObject2 = new SubjectAlternativeNames();
     $originalObject2->addDomainName(new DNSName('google.com'));
     $binaryData = $originalObject1->getBinary();
     $binaryData .= $originalObject2->getBinary();
     $offset = 0;
     $parsedObject = SubjectAlternativeNames::fromBinary($binaryData, $offset);
     $this->assertEquals($originalObject1, $parsedObject);
     $this->assertEquals(31, $offset);
     $parsedObject = SubjectAlternativeNames::fromBinary($binaryData, $offset);
     $this->assertEquals($originalObject2, $parsedObject);
     $this->assertEquals(47, $offset);
 }