Skip to content

Commit be19f22

Browse files
committed
moving requests to template
1 parent 498acae commit be19f22

3 files changed

Lines changed: 149 additions & 120 deletions

File tree

src/OCSPRequest.php

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -51,80 +51,6 @@ public static function createFromContent(string $content): CMSBase
5151
return new self(self::makeFromContent($content, Maps\OCSPRequest::class, Sequence::class));
5252
}
5353

54-
/**
55-
* @param Certificate $publicCertificate
56-
* @param Certificate $intermediateCertificate
57-
* @param string $hashAlgorithmOID
58-
*
59-
* @return OCSPRequest
60-
* @throws FormatException
61-
* @throws ParserException
62-
*/
63-
public static function createSimple(Certificate $publicCertificate, Certificate $intermediateCertificate, string $hashAlgorithmOID = Algorithm::OID_SHA1): self
64-
{
65-
/** @see Maps\TBSRequest */
66-
$tbsRequest = Sequence::create([
67-
// потомки TBSRequest
68-
# -- version
69-
# -- requestorName
70-
# requestList
71-
Sequence::create([
72-
/** @see Request */
73-
Sequence::create([
74-
// потомки Request
75-
# reqCert
76-
/** @see CertID */
77-
Sequence::create([
78-
// потомки CertID
79-
# hashAlgorithm
80-
/** @see AlgorithmIdentifier */
81-
Sequence::create([
82-
// потомки AlgorithmIdentifier
83-
# algorithm
84-
ObjectIdentifier::create($hashAlgorithmOID),
85-
# parameters
86-
NullObject::create()
87-
]
88-
),
89-
# issuerNameHash
90-
OctetString::createFromString(self::getNameHash($hashAlgorithmOID, $intermediateCertificate)),
91-
# issuerKeyHash
92-
OctetString::createFromString(self::getKeyHash($hashAlgorithmOID, $intermediateCertificate)), # serialNumber
93-
Integer::create($publicCertificate->getSerial())
94-
]
95-
)
96-
# singleRequestExtensions
97-
]
98-
)
99-
]
100-
),
101-
# requestExtensions
102-
ExplicitlyTaggedObject::create(2,
103-
Sequence::create([
104-
Sequence::create([
105-
ObjectIdentifier::create(self::OID_OCSPNonce),
106-
OctetString::createFromString(OctetString::createFromString((string)self::generateNonce())->getBinary())
107-
]
108-
)
109-
]
110-
)
111-
)
112-
]
113-
);
114-
115-
return new self(Sequence::create([$tbsRequest/*, $optionalSignature*/]));
116-
}
117-
118-
/**
119-
* @param int|null $length
120-
* @return string
121-
* @throws Exception
122-
*/
123-
protected static function generateNonce(int $length = null): string
124-
{
125-
return random_bytes($length ?? self::OCSP_DEFAULT_NONCE_LENGTH);
126-
}
127-
12854
/**
12955
* @return TBSRequest
13056
*/
@@ -148,48 +74,4 @@ public function getOptionalSignature(): ?Signature
14874

14975
return null;
15076
}
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-
}
19577
}

src/Template.php

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
<?php
2+
/**
3+
* EncapsulatedContentInfo
4+
*
5+
* @author Nurlan Mukhanov <nurike@gmail.com>
6+
* @copyright 2020 Nurlan Mukhanov
7+
* @license https://en.wikipedia.org/wiki/MIT_License MIT License
8+
* @link https://github.com/Falseclock/AdvancedCMS
9+
*/
10+
11+
namespace Falseclock\AdvancedCMS;
12+
13+
use Adapik\CMS\Algorithm;
14+
use Adapik\CMS\Certificate;
15+
use Adapik\CMS\Exception\FormatException;
16+
use Exception;
17+
use FG\ASN1\Exception\ParserException;
18+
use FG\ASN1\ExplicitlyTaggedObject;
19+
use FG\ASN1\Universal\BitString;
20+
use FG\ASN1\Universal\Integer;
21+
use FG\ASN1\Universal\NullObject;
22+
use FG\ASN1\Universal\ObjectIdentifier;
23+
use FG\ASN1\Universal\OctetString;
24+
use FG\ASN1\Universal\Sequence;
25+
26+
class Template
27+
{
28+
/**
29+
* @param Certificate $publicCertificate
30+
* @param Certificate $intermediateCertificate
31+
* @param string $hashAlgorithmOID
32+
* @return OCSPRequest
33+
* @throws FormatException
34+
* @throws ParserException
35+
*/
36+
public static function OCSPRequest(Certificate $publicCertificate, Certificate $intermediateCertificate, string $hashAlgorithmOID = Algorithm::OID_SHA1): OCSPRequest
37+
{
38+
/** @see Maps\TBSRequest */
39+
$tbsRequest = Sequence::create([
40+
// потомки TBSRequest
41+
# -- version
42+
# -- requestorName
43+
# requestList
44+
Sequence::create([
45+
/** @see Request */
46+
Sequence::create([
47+
// потомки Request
48+
# reqCert
49+
/** @see CertID */
50+
Sequence::create([
51+
// потомки CertID
52+
# hashAlgorithm
53+
/** @see AlgorithmIdentifier */
54+
Sequence::create([
55+
// потомки AlgorithmIdentifier
56+
# algorithm
57+
ObjectIdentifier::create($hashAlgorithmOID),
58+
# parameters
59+
NullObject::create()
60+
]
61+
),
62+
# issuerNameHash
63+
OctetString::createFromString(self::getNameHash($hashAlgorithmOID, $intermediateCertificate)),
64+
# issuerKeyHash
65+
OctetString::createFromString(self::getKeyHash($hashAlgorithmOID, $intermediateCertificate)), # serialNumber
66+
Integer::create($publicCertificate->getSerial())
67+
]
68+
)
69+
# singleRequestExtensions
70+
]
71+
)
72+
]
73+
),
74+
# requestExtensions
75+
ExplicitlyTaggedObject::create(2,
76+
Sequence::create([
77+
Sequence::create([
78+
ObjectIdentifier::create(OCSPRequest::OID_OCSPNonce),
79+
OctetString::createFromString(OctetString::createFromString((string)self::generateNonce())->getBinary())
80+
]
81+
)
82+
]
83+
)
84+
)
85+
]
86+
);
87+
88+
return new OCSPRequest(Sequence::create([$tbsRequest/*, $optionalSignature*/]));
89+
}
90+
91+
92+
/**
93+
* @param int|null $length
94+
* @return string
95+
* @throws Exception
96+
*/
97+
private static function generateNonce(int $length = null): string
98+
{
99+
return random_bytes($length ?? OCSPRequest::OCSP_DEFAULT_NONCE_LENGTH);
100+
}
101+
102+
103+
/**
104+
* @param string $algorithmOID
105+
* @param Certificate $certificate
106+
* @return string
107+
* @throws FormatException
108+
* @throws ParserException
109+
*/
110+
private static function getNameHash(string $algorithmOID, Certificate $certificate): string
111+
{
112+
$binary = $certificate->getBinary();
113+
/** @var Sequence $certificate */
114+
$certificate = Sequence::fromBinary($binary);
115+
return Algorithm::hashValue($algorithmOID, self::_getTBSCertificate($certificate)->getChildren()[5]->getBinary());
116+
}
117+
118+
/**
119+
* @param string $algorithmOID
120+
* @param Certificate $certificate
121+
* @return string
122+
* @throws FormatException
123+
* @throws ParserException
124+
*/
125+
public static function getKeyHash(string $algorithmOID, Certificate $certificate): string
126+
{
127+
$binary = $certificate->getBinary();
128+
/** @var Sequence $certificate */
129+
$certificate = Sequence::fromBinary($binary);
130+
$child = self::_getTBSCertificate($certificate)->getChildren()[6];
131+
/** @var BitString $octet */
132+
$octet = $child->findChildrenByType(BitString::class)[0];
133+
134+
return Algorithm::hashValue($algorithmOID, hex2bin($octet->getStringValue()));
135+
}
136+
137+
/**
138+
* @param Sequence $certificate
139+
* @return Sequence
140+
* @throws Exception
141+
*/
142+
private static function _getTBSCertificate(Sequence $certificate): Sequence
143+
{
144+
return $certificate->findChildrenByType(Sequence::class)[0];
145+
}
146+
}

tests/OCSPRequestTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Falseclock\AdvancedCMS\Signature;
1313
use Falseclock\AdvancedCMS\SignedData;
1414
use Falseclock\AdvancedCMS\TBSRequest;
15+
use Falseclock\AdvancedCMS\Template;
1516
use FG\ASN1\Universal\BitString;
1617

1718
class OCSPRequestTest extends MainTest
@@ -29,7 +30,7 @@ public function testRevoked()
2930
{
3031
$certificate = Certificate::createFromContent($this->getRevokedCertificate());
3132
$intermediateCertificate = Certificate::createFromContent($this->getIntermediateCertificate());
32-
$OCSPRequest = OCSPRequest::createSimple($certificate, $intermediateCertificate, Algorithm::OID_SHA256);
33+
$OCSPRequest = Template::OCSPRequest($certificate, $intermediateCertificate, Algorithm::OID_SHA256);
3334

3435
foreach ($certificate->getOcspUris() as $url) {
3536
$result = $this->curlRequest($url, $OCSPRequest->getBinary(), OCSPRequest::CONTENT_TYPE, OCSPResponse::CONTENT_TYPE);
@@ -58,7 +59,7 @@ public function testSimple()
5859

5960
$intermediateCertificate = Certificate::createFromContent($this->getIntermediateCertificate());
6061

61-
$OCSPRequest = OCSPRequest::createSimple($certificate, $intermediateCertificate, Algorithm::OID_SHA256);
62+
$OCSPRequest = Template::OCSPRequest($certificate, $intermediateCertificate, Algorithm::OID_SHA256);
6263

6364
self::assertInstanceOf(TBSRequest::class, $OCSPRequest->getTBSRequest());
6465
self::assertNull($OCSPRequest->getOptionalSignature());

0 commit comments

Comments
 (0)