/** * @param Sequence $info * @return CertificateInfo */ public function parseCertificateInfo(Sequence $info) { if ($info->getNumberOfChildren() < 6) { throw new \InvalidArgumentException('Invalid data'); } $infoChildren = $info->getChildren(); // Parse SerialNo if (!$infoChildren[0] instanceof Integer) { throw new \InvalidArgumentException('Invalid data - serialNo'); } $serialNo = $infoChildren[0]->getContent(); // Parse Signature Algorithm if (!$infoChildren[1] instanceof Sequence || $infoChildren[1]->getNumberOfChildren() < 1 || !$infoChildren[1]->getChildren()[0] instanceof ObjectIdentifier) { throw new \InvalidArgumentException('Invalid data - sigalg'); } $sigAlgSet = $infoChildren[1]->getChildren(); /** @var ObjectIdentifier $sigAlgOid */ $sigAlgOid = $sigAlgSet[0]; $sigAlg = SigAlgorithmOidMapper::getKnownAlgorithmFromOid($sigAlgOid); // Parse Issuer if (!$infoChildren[2] instanceof Sequence) { throw new \InvalidArgumentException('Invalid data - Issuer'); } $issuer = $this->parseSubject($infoChildren[2]); // Parse Validity - array of UTCTime $validity = $infoChildren[3]; if (!$validity instanceof Sequence || $validity->getNumberOfChildren() !== 2) { throw new \InvalidArgumentException('Invalid Validity'); } $validityContents = $validity->getChildren(); if (!$validityContents[0] instanceof UTCTime || !$validityContents[1] instanceof UTCTime) { throw new \InvalidArgumentException('Invalid Validity'); } /** @var UTCTime $validityEnd */ /** @var UTCTime $validityStart */ list($validityStart, $validityEnd) = $validityContents; // Parse Subject if (!$infoChildren[4] instanceof Sequence) { throw new \InvalidArgumentException('Invalid data - Subject'); } $subject = $this->parseSubject($infoChildren[4]); // Parse Subject Public Key Info if (!$infoChildren[5] instanceof Sequence) { throw new \InvalidArgumentException('Invalid data - Subject Public Key'); } $subjectKey = $this->parseSubjectKeyInfo($infoChildren[5]); return new CertificateInfo($serialNo, $sigAlg, $issuer, $subject, $subjectKey, $validityStart->getContent(), $validityEnd->getContent()); }