1414use Adapik \CMS \Certificate ;
1515use Adapik \CMS \CMSBase ;
1616use Adapik \CMS \Exception \FormatException ;
17- use Adapik \CMS \Signature ;
1817use Exception ;
1918use FG \ASN1 \Exception \ParserException ;
2019use FG \ASN1 \ExplicitlyTaggedObject ;
20+ use FG \ASN1 \Universal \BitString ;
2121use FG \ASN1 \Universal \Integer ;
2222use FG \ASN1 \Universal \NullObject ;
2323use FG \ASN1 \Universal \ObjectIdentifier ;
@@ -46,7 +46,7 @@ class OCSPRequest extends CMSBase
4646 * @return OCSPRequest
4747 * @throws FormatException
4848 */
49- public static function createFromContent (string $ content ): self
49+ public static function createFromContent (string $ content ): CMSBase
5050 {
5151 return new self (self ::makeFromContent ($ content , Maps \OCSPRequest::class, Sequence::class));
5252 }
@@ -58,6 +58,7 @@ public static function createFromContent(string $content): self
5858 *
5959 * @return OCSPRequest
6060 * @throws FormatException
61+ * @throws ParserException
6162 */
6263 public static function createSimple (Certificate $ publicCertificate , Certificate $ intermediateCertificate , string $ hashAlgorithmOID = Algorithm::OID_SHA1 ): self
6364 {
@@ -86,10 +87,9 @@ public static function createSimple(Certificate $publicCertificate, Certificate
8687 ]
8788 ),
8889 # issuerNameHash
89- Algorithm:: hashValue ( $ hashAlgorithmOID , $ intermediateCertificate-> getSubject ()-> getBinary ( )),
90+ OctetString:: createFromString ( self :: getNameHash ( $ hashAlgorithmOID , $ intermediateCertificate )),
9091 # issuerKeyHash
91- Algorithm::hashValue ($ hashAlgorithmOID , $ intermediateCertificate ->getPublicKey ()->getKey ()->getBinary ()),
92- # serialNumber
92+ OctetString::createFromString (self ::getKeyHash ($ hashAlgorithmOID , $ intermediateCertificate )), # serialNumber
9393 Integer::create ($ publicCertificate ->getSerial ())
9494 ]
9595 )
@@ -148,4 +148,48 @@ public function getOptionalSignature(): ?Signature
148148
149149 return null ;
150150 }
151+
152+ /**
153+ * @param string $algorithmOID
154+ * @param Certificate $certificate
155+ * @return string
156+ * @throws FormatException
157+ * @throws ParserException
158+ */
159+ private static function getNameHash (string $ algorithmOID , Certificate $ certificate ): string
160+ {
161+ $ binary = $ certificate ->getBinary ();
162+ /** @var Sequence $certificate */
163+ $ certificate = Sequence::fromBinary ($ binary );
164+ return Algorithm::hashValue ($ algorithmOID , self ::_getTBSCertificate ($ certificate )->getChildren ()[5 ]->getBinary ());
165+ }
166+
167+ /**
168+ * @param string $algorithmOID
169+ * @param Certificate $certificate
170+ * @return string
171+ * @throws FormatException
172+ * @throws ParserException
173+ */
174+ private static function getKeyHash (string $ algorithmOID , Certificate $ certificate ): string
175+ {
176+ $ binary = $ certificate ->getBinary ();
177+ /** @var Sequence $certificate */
178+ $ certificate = Sequence::fromBinary ($ binary );
179+ $ child = self ::_getTBSCertificate ($ certificate )->getChildren ()[6 ];
180+ /** @var BitString $octet */
181+ $ octet = $ child ->findChildrenByType (BitString::class)[0 ];
182+
183+ return Algorithm::hashValue ($ algorithmOID , hex2bin ($ octet ->getStringValue ()));
184+ }
185+
186+ /**
187+ * @param Sequence $certificate
188+ * @return Sequence
189+ * @throws Exception
190+ */
191+ private static function _getTBSCertificate (Sequence $ certificate ): Sequence
192+ {
193+ return $ certificate ->findChildrenByType (Sequence::class)[0 ];
194+ }
151195}
0 commit comments