GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( da62d3...8abb02 )
by Joni
02:44
created
lib/X509/Certificate/Time.php 1 patch
Indentation   +92 added lines, -92 removed lines patch added patch discarded remove patch
@@ -17,104 +17,104 @@
 block discarded – undo
17 17
  */
18 18
 class Time
19 19
 {
20
-    use DateTimeHelper;
20
+	use DateTimeHelper;
21 21
     
22
-    /**
23
-     * Datetime.
24
-     *
25
-     * @var \DateTimeImmutable $_dt
26
-     */
27
-    protected $_dt;
22
+	/**
23
+	 * Datetime.
24
+	 *
25
+	 * @var \DateTimeImmutable $_dt
26
+	 */
27
+	protected $_dt;
28 28
     
29
-    /**
30
-     * Time ASN.1 type tag.
31
-     *
32
-     * @var int $_type
33
-     */
34
-    protected $_type;
29
+	/**
30
+	 * Time ASN.1 type tag.
31
+	 *
32
+	 * @var int $_type
33
+	 */
34
+	protected $_type;
35 35
     
36
-    /**
37
-     * Constructor.
38
-     *
39
-     * @param \DateTimeImmutable $dt
40
-     */
41
-    public function __construct(\DateTimeImmutable $dt)
42
-    {
43
-        $this->_dt = $dt;
44
-        $this->_type = self::_determineType($dt);
45
-    }
36
+	/**
37
+	 * Constructor.
38
+	 *
39
+	 * @param \DateTimeImmutable $dt
40
+	 */
41
+	public function __construct(\DateTimeImmutable $dt)
42
+	{
43
+		$this->_dt = $dt;
44
+		$this->_type = self::_determineType($dt);
45
+	}
46 46
     
47
-    /**
48
-     * Initialize from ASN.1.
49
-     *
50
-     * @param TimeType $el
51
-     * @return self
52
-     */
53
-    public static function fromASN1(TimeType $el): self
54
-    {
55
-        $obj = new self($el->dateTime());
56
-        $obj->_type = $el->tag();
57
-        return $obj;
58
-    }
47
+	/**
48
+	 * Initialize from ASN.1.
49
+	 *
50
+	 * @param TimeType $el
51
+	 * @return self
52
+	 */
53
+	public static function fromASN1(TimeType $el): self
54
+	{
55
+		$obj = new self($el->dateTime());
56
+		$obj->_type = $el->tag();
57
+		return $obj;
58
+	}
59 59
     
60
-    /**
61
-     * Initialize from date string.
62
-     *
63
-     * @param string|null $time
64
-     * @param string|null $tz
65
-     * @return self
66
-     */
67
-    public static function fromString($time, $tz = null): self
68
-    {
69
-        return new self(self::_createDateTime($time, $tz));
70
-    }
60
+	/**
61
+	 * Initialize from date string.
62
+	 *
63
+	 * @param string|null $time
64
+	 * @param string|null $tz
65
+	 * @return self
66
+	 */
67
+	public static function fromString($time, $tz = null): self
68
+	{
69
+		return new self(self::_createDateTime($time, $tz));
70
+	}
71 71
     
72
-    /**
73
-     * Get datetime.
74
-     *
75
-     * @return \DateTimeImmutable
76
-     */
77
-    public function dateTime(): \DateTimeImmutable
78
-    {
79
-        return $this->_dt;
80
-    }
72
+	/**
73
+	 * Get datetime.
74
+	 *
75
+	 * @return \DateTimeImmutable
76
+	 */
77
+	public function dateTime(): \DateTimeImmutable
78
+	{
79
+		return $this->_dt;
80
+	}
81 81
     
82
-    /**
83
-     * Generate ASN.1.
84
-     *
85
-     * @throws \UnexpectedValueException
86
-     * @return TimeType
87
-     */
88
-    public function toASN1(): TimeType
89
-    {
90
-        $dt = $this->_dt;
91
-        switch ($this->_type) {
92
-            case Element::TYPE_UTC_TIME:
93
-                return new UTCTime($dt);
94
-            case Element::TYPE_GENERALIZED_TIME:
95
-                // GeneralizedTime must not contain fractional seconds
96
-                // (rfc5280 4.1.2.5.2)
97
-                if ($dt->format("u") != 0) {
98
-                    // remove fractional seconds (round down)
99
-                    $dt = self::_roundDownFractionalSeconds($dt);
100
-                }
101
-                return new GeneralizedTime($dt);
102
-        }
103
-        throw new \UnexpectedValueException(
104
-            "Time type " . Element::tagToName($this->_type) . " not supported.");
105
-    }
82
+	/**
83
+	 * Generate ASN.1.
84
+	 *
85
+	 * @throws \UnexpectedValueException
86
+	 * @return TimeType
87
+	 */
88
+	public function toASN1(): TimeType
89
+	{
90
+		$dt = $this->_dt;
91
+		switch ($this->_type) {
92
+			case Element::TYPE_UTC_TIME:
93
+				return new UTCTime($dt);
94
+			case Element::TYPE_GENERALIZED_TIME:
95
+				// GeneralizedTime must not contain fractional seconds
96
+				// (rfc5280 4.1.2.5.2)
97
+				if ($dt->format("u") != 0) {
98
+					// remove fractional seconds (round down)
99
+					$dt = self::_roundDownFractionalSeconds($dt);
100
+				}
101
+				return new GeneralizedTime($dt);
102
+		}
103
+		throw new \UnexpectedValueException(
104
+			"Time type " . Element::tagToName($this->_type) . " not supported.");
105
+	}
106 106
     
107
-    /**
108
-     * Determine whether to use UTCTime or GeneralizedTime ASN.1 type.
109
-     *
110
-     * @param \DateTimeImmutable $dt
111
-     * @return int Type tag
112
-     */
113
-    protected static function _determineType(\DateTimeImmutable $dt): int
114
-    {
115
-        if ($dt->format("Y") >= 2050) {
116
-            return Element::TYPE_GENERALIZED_TIME;
117
-        }
118
-        return Element::TYPE_UTC_TIME;
119
-    }
107
+	/**
108
+	 * Determine whether to use UTCTime or GeneralizedTime ASN.1 type.
109
+	 *
110
+	 * @param \DateTimeImmutable $dt
111
+	 * @return int Type tag
112
+	 */
113
+	protected static function _determineType(\DateTimeImmutable $dt): int
114
+	{
115
+		if ($dt->format("Y") >= 2050) {
116
+			return Element::TYPE_GENERALIZED_TIME;
117
+		}
118
+		return Element::TYPE_UTC_TIME;
119
+	}
120 120
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Certificate.php 1 patch
Indentation   +231 added lines, -231 removed lines patch added patch discarded remove patch
@@ -19,235 +19,235 @@
 block discarded – undo
19 19
  */
20 20
 class Certificate
21 21
 {
22
-    /**
23
-     * "To be signed" certificate information.
24
-     *
25
-     * @var TBSCertificate $_tbsCertificate
26
-     */
27
-    protected $_tbsCertificate;
28
-    
29
-    /**
30
-     * Signature algorithm.
31
-     *
32
-     * @var SignatureAlgorithmIdentifier $_signatureAlgorithm
33
-     */
34
-    protected $_signatureAlgorithm;
35
-    
36
-    /**
37
-     * Signature value.
38
-     *
39
-     * @var Signature $_signatureValue
40
-     */
41
-    protected $_signatureValue;
42
-    
43
-    /**
44
-     * Constructor.
45
-     *
46
-     * @param TBSCertificate $tbsCert
47
-     * @param SignatureAlgorithmIdentifier $algo
48
-     * @param Signature $signature
49
-     */
50
-    public function __construct(TBSCertificate $tbsCert,
51
-        SignatureAlgorithmIdentifier $algo, Signature $signature)
52
-    {
53
-        $this->_tbsCertificate = $tbsCert;
54
-        $this->_signatureAlgorithm = $algo;
55
-        $this->_signatureValue = $signature;
56
-    }
57
-    
58
-    /**
59
-     * Initialize from ASN.1.
60
-     *
61
-     * @param Sequence $seq
62
-     * @return self
63
-     */
64
-    public static function fromASN1(Sequence $seq): self
65
-    {
66
-        $tbsCert = TBSCertificate::fromASN1($seq->at(0)->asSequence());
67
-        $algo = AlgorithmIdentifier::fromASN1($seq->at(1)->asSequence());
68
-        if (!$algo instanceof SignatureAlgorithmIdentifier) {
69
-            throw new \UnexpectedValueException(
70
-                "Unsupported signature algorithm " . $algo->oid() . ".");
71
-        }
72
-        $signature = Signature::fromSignatureData(
73
-            $seq->at(2)
74
-                ->asBitString()
75
-                ->string(), $algo);
76
-        return new self($tbsCert, $algo, $signature);
77
-    }
78
-    
79
-    /**
80
-     * Initialize from DER.
81
-     *
82
-     * @param string $data
83
-     * @return self
84
-     */
85
-    public static function fromDER(string $data): self
86
-    {
87
-        return self::fromASN1(Sequence::fromDER($data));
88
-    }
89
-    
90
-    /**
91
-     * Initialize from PEM.
92
-     *
93
-     * @param PEM $pem
94
-     * @throws \UnexpectedValueException
95
-     * @return self
96
-     */
97
-    public static function fromPEM(PEM $pem): self
98
-    {
99
-        if ($pem->type() != PEM::TYPE_CERTIFICATE) {
100
-            throw new \UnexpectedValueException("Invalid PEM type.");
101
-        }
102
-        return self::fromDER($pem->data());
103
-    }
104
-    
105
-    /**
106
-     * Get certificate information.
107
-     *
108
-     * @return TBSCertificate
109
-     */
110
-    public function tbsCertificate(): TBSCertificate
111
-    {
112
-        return $this->_tbsCertificate;
113
-    }
114
-    
115
-    /**
116
-     * Get signature algorithm.
117
-     *
118
-     * @return SignatureAlgorithmIdentifier
119
-     */
120
-    public function signatureAlgorithm(): SignatureAlgorithmIdentifier
121
-    {
122
-        return $this->_signatureAlgorithm;
123
-    }
124
-    
125
-    /**
126
-     * Get signature value.
127
-     *
128
-     * @return Signature
129
-     */
130
-    public function signatureValue(): Signature
131
-    {
132
-        return $this->_signatureValue;
133
-    }
134
-    
135
-    /**
136
-     * Check whether certificate is self-issued.
137
-     *
138
-     * @return bool
139
-     */
140
-    public function isSelfIssued(): bool
141
-    {
142
-        return $this->_tbsCertificate->subject()->equals(
143
-            $this->_tbsCertificate->issuer());
144
-    }
145
-    
146
-    /**
147
-     * Check whether certificate is semantically equal to another.
148
-     *
149
-     * @param Certificate $cert Certificate to compare to
150
-     * @return bool
151
-     */
152
-    public function equals(Certificate $cert): bool
153
-    {
154
-        return $this->_hasEqualSerialNumber($cert) &&
155
-             $this->_hasEqualPublicKey($cert) && $this->_hasEqualSubject($cert);
156
-    }
157
-    
158
-    /**
159
-     * Check whether certificate has serial number equal to another.
160
-     *
161
-     * @param Certificate $cert
162
-     * @return bool
163
-     */
164
-    private function _hasEqualSerialNumber(Certificate $cert): bool
165
-    {
166
-        $sn1 = $this->_tbsCertificate->serialNumber();
167
-        $sn2 = $cert->_tbsCertificate->serialNumber();
168
-        return $sn1 == $sn2;
169
-    }
170
-    
171
-    /**
172
-     * Check whether certificate has public key equal to another.
173
-     *
174
-     * @param Certificate $cert
175
-     * @return bool
176
-     */
177
-    private function _hasEqualPublicKey(Certificate $cert): bool
178
-    {
179
-        $kid1 = $this->_tbsCertificate->subjectPublicKeyInfo()->keyIdentifier();
180
-        $kid2 = $cert->_tbsCertificate->subjectPublicKeyInfo()->keyIdentifier();
181
-        return $kid1 == $kid2;
182
-    }
183
-    
184
-    /**
185
-     * Check whether certificate has subject equal to another.
186
-     *
187
-     * @param Certificate $cert
188
-     * @return bool
189
-     */
190
-    private function _hasEqualSubject(Certificate $cert): bool
191
-    {
192
-        $dn1 = $this->_tbsCertificate->subject();
193
-        $dn2 = $cert->_tbsCertificate->subject();
194
-        return $dn1->equals($dn2);
195
-    }
196
-    
197
-    /**
198
-     * Generate ASN.1 structure.
199
-     *
200
-     * @return Sequence
201
-     */
202
-    public function toASN1(): Sequence
203
-    {
204
-        return new Sequence($this->_tbsCertificate->toASN1(),
205
-            $this->_signatureAlgorithm->toASN1(),
206
-            $this->_signatureValue->bitString());
207
-    }
208
-    
209
-    /**
210
-     * Get certificate as a DER.
211
-     *
212
-     * @return string
213
-     */
214
-    public function toDER(): string
215
-    {
216
-        return $this->toASN1()->toDER();
217
-    }
218
-    
219
-    /**
220
-     * Get certificate as a PEM.
221
-     *
222
-     * @return PEM
223
-     */
224
-    public function toPEM(): PEM
225
-    {
226
-        return new PEM(PEM::TYPE_CERTIFICATE, $this->toDER());
227
-    }
228
-    
229
-    /**
230
-     * Verify certificate signature.
231
-     *
232
-     * @param PublicKeyInfo $pubkey_info Issuer's public key
233
-     * @param Crypto|null $crypto Crypto engine, use default if not set
234
-     * @return bool True if certificate signature is valid
235
-     */
236
-    public function verify(PublicKeyInfo $pubkey_info, Crypto $crypto = null): bool
237
-    {
238
-        $crypto = $crypto ?: Crypto::getDefault();
239
-        $data = $this->_tbsCertificate->toASN1()->toDER();
240
-        return $crypto->verify($data, $this->_signatureValue, $pubkey_info,
241
-            $this->_signatureAlgorithm);
242
-    }
243
-    
244
-    /**
245
-     * Get certificate as a PEM formatted string.
246
-     *
247
-     * @return string
248
-     */
249
-    public function __toString()
250
-    {
251
-        return $this->toPEM()->string();
252
-    }
22
+	/**
23
+	 * "To be signed" certificate information.
24
+	 *
25
+	 * @var TBSCertificate $_tbsCertificate
26
+	 */
27
+	protected $_tbsCertificate;
28
+    
29
+	/**
30
+	 * Signature algorithm.
31
+	 *
32
+	 * @var SignatureAlgorithmIdentifier $_signatureAlgorithm
33
+	 */
34
+	protected $_signatureAlgorithm;
35
+    
36
+	/**
37
+	 * Signature value.
38
+	 *
39
+	 * @var Signature $_signatureValue
40
+	 */
41
+	protected $_signatureValue;
42
+    
43
+	/**
44
+	 * Constructor.
45
+	 *
46
+	 * @param TBSCertificate $tbsCert
47
+	 * @param SignatureAlgorithmIdentifier $algo
48
+	 * @param Signature $signature
49
+	 */
50
+	public function __construct(TBSCertificate $tbsCert,
51
+		SignatureAlgorithmIdentifier $algo, Signature $signature)
52
+	{
53
+		$this->_tbsCertificate = $tbsCert;
54
+		$this->_signatureAlgorithm = $algo;
55
+		$this->_signatureValue = $signature;
56
+	}
57
+    
58
+	/**
59
+	 * Initialize from ASN.1.
60
+	 *
61
+	 * @param Sequence $seq
62
+	 * @return self
63
+	 */
64
+	public static function fromASN1(Sequence $seq): self
65
+	{
66
+		$tbsCert = TBSCertificate::fromASN1($seq->at(0)->asSequence());
67
+		$algo = AlgorithmIdentifier::fromASN1($seq->at(1)->asSequence());
68
+		if (!$algo instanceof SignatureAlgorithmIdentifier) {
69
+			throw new \UnexpectedValueException(
70
+				"Unsupported signature algorithm " . $algo->oid() . ".");
71
+		}
72
+		$signature = Signature::fromSignatureData(
73
+			$seq->at(2)
74
+				->asBitString()
75
+				->string(), $algo);
76
+		return new self($tbsCert, $algo, $signature);
77
+	}
78
+    
79
+	/**
80
+	 * Initialize from DER.
81
+	 *
82
+	 * @param string $data
83
+	 * @return self
84
+	 */
85
+	public static function fromDER(string $data): self
86
+	{
87
+		return self::fromASN1(Sequence::fromDER($data));
88
+	}
89
+    
90
+	/**
91
+	 * Initialize from PEM.
92
+	 *
93
+	 * @param PEM $pem
94
+	 * @throws \UnexpectedValueException
95
+	 * @return self
96
+	 */
97
+	public static function fromPEM(PEM $pem): self
98
+	{
99
+		if ($pem->type() != PEM::TYPE_CERTIFICATE) {
100
+			throw new \UnexpectedValueException("Invalid PEM type.");
101
+		}
102
+		return self::fromDER($pem->data());
103
+	}
104
+    
105
+	/**
106
+	 * Get certificate information.
107
+	 *
108
+	 * @return TBSCertificate
109
+	 */
110
+	public function tbsCertificate(): TBSCertificate
111
+	{
112
+		return $this->_tbsCertificate;
113
+	}
114
+    
115
+	/**
116
+	 * Get signature algorithm.
117
+	 *
118
+	 * @return SignatureAlgorithmIdentifier
119
+	 */
120
+	public function signatureAlgorithm(): SignatureAlgorithmIdentifier
121
+	{
122
+		return $this->_signatureAlgorithm;
123
+	}
124
+    
125
+	/**
126
+	 * Get signature value.
127
+	 *
128
+	 * @return Signature
129
+	 */
130
+	public function signatureValue(): Signature
131
+	{
132
+		return $this->_signatureValue;
133
+	}
134
+    
135
+	/**
136
+	 * Check whether certificate is self-issued.
137
+	 *
138
+	 * @return bool
139
+	 */
140
+	public function isSelfIssued(): bool
141
+	{
142
+		return $this->_tbsCertificate->subject()->equals(
143
+			$this->_tbsCertificate->issuer());
144
+	}
145
+    
146
+	/**
147
+	 * Check whether certificate is semantically equal to another.
148
+	 *
149
+	 * @param Certificate $cert Certificate to compare to
150
+	 * @return bool
151
+	 */
152
+	public function equals(Certificate $cert): bool
153
+	{
154
+		return $this->_hasEqualSerialNumber($cert) &&
155
+			 $this->_hasEqualPublicKey($cert) && $this->_hasEqualSubject($cert);
156
+	}
157
+    
158
+	/**
159
+	 * Check whether certificate has serial number equal to another.
160
+	 *
161
+	 * @param Certificate $cert
162
+	 * @return bool
163
+	 */
164
+	private function _hasEqualSerialNumber(Certificate $cert): bool
165
+	{
166
+		$sn1 = $this->_tbsCertificate->serialNumber();
167
+		$sn2 = $cert->_tbsCertificate->serialNumber();
168
+		return $sn1 == $sn2;
169
+	}
170
+    
171
+	/**
172
+	 * Check whether certificate has public key equal to another.
173
+	 *
174
+	 * @param Certificate $cert
175
+	 * @return bool
176
+	 */
177
+	private function _hasEqualPublicKey(Certificate $cert): bool
178
+	{
179
+		$kid1 = $this->_tbsCertificate->subjectPublicKeyInfo()->keyIdentifier();
180
+		$kid2 = $cert->_tbsCertificate->subjectPublicKeyInfo()->keyIdentifier();
181
+		return $kid1 == $kid2;
182
+	}
183
+    
184
+	/**
185
+	 * Check whether certificate has subject equal to another.
186
+	 *
187
+	 * @param Certificate $cert
188
+	 * @return bool
189
+	 */
190
+	private function _hasEqualSubject(Certificate $cert): bool
191
+	{
192
+		$dn1 = $this->_tbsCertificate->subject();
193
+		$dn2 = $cert->_tbsCertificate->subject();
194
+		return $dn1->equals($dn2);
195
+	}
196
+    
197
+	/**
198
+	 * Generate ASN.1 structure.
199
+	 *
200
+	 * @return Sequence
201
+	 */
202
+	public function toASN1(): Sequence
203
+	{
204
+		return new Sequence($this->_tbsCertificate->toASN1(),
205
+			$this->_signatureAlgorithm->toASN1(),
206
+			$this->_signatureValue->bitString());
207
+	}
208
+    
209
+	/**
210
+	 * Get certificate as a DER.
211
+	 *
212
+	 * @return string
213
+	 */
214
+	public function toDER(): string
215
+	{
216
+		return $this->toASN1()->toDER();
217
+	}
218
+    
219
+	/**
220
+	 * Get certificate as a PEM.
221
+	 *
222
+	 * @return PEM
223
+	 */
224
+	public function toPEM(): PEM
225
+	{
226
+		return new PEM(PEM::TYPE_CERTIFICATE, $this->toDER());
227
+	}
228
+    
229
+	/**
230
+	 * Verify certificate signature.
231
+	 *
232
+	 * @param PublicKeyInfo $pubkey_info Issuer's public key
233
+	 * @param Crypto|null $crypto Crypto engine, use default if not set
234
+	 * @return bool True if certificate signature is valid
235
+	 */
236
+	public function verify(PublicKeyInfo $pubkey_info, Crypto $crypto = null): bool
237
+	{
238
+		$crypto = $crypto ?: Crypto::getDefault();
239
+		$data = $this->_tbsCertificate->toASN1()->toDER();
240
+		return $crypto->verify($data, $this->_signatureValue, $pubkey_info,
241
+			$this->_signatureAlgorithm);
242
+	}
243
+    
244
+	/**
245
+	 * Get certificate as a PEM formatted string.
246
+	 *
247
+	 * @return string
248
+	 */
249
+	public function __toString()
250
+	{
251
+		return $this->toPEM()->string();
252
+	}
253 253
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/TBSCertificate.php 1 patch
Indentation   +606 added lines, -606 removed lines patch added patch discarded remove patch
@@ -27,610 +27,610 @@
 block discarded – undo
27 27
  */
28 28
 class TBSCertificate
29 29
 {
30
-    // Certificate version enumerations
31
-    const VERSION_1 = 0;
32
-    const VERSION_2 = 1;
33
-    const VERSION_3 = 2;
34
-    
35
-    /**
36
-     * Certificate version.
37
-     *
38
-     * @var int|null
39
-     */
40
-    protected $_version;
41
-    
42
-    /**
43
-     * Serial number.
44
-     *
45
-     * @var string|null
46
-     */
47
-    protected $_serialNumber;
48
-    
49
-    /**
50
-     * Signature algorithm.
51
-     *
52
-     * @var SignatureAlgorithmIdentifier|null
53
-     */
54
-    protected $_signature;
55
-    
56
-    /**
57
-     * Certificate issuer.
58
-     *
59
-     * @var Name $_issuer
60
-     */
61
-    protected $_issuer;
62
-    
63
-    /**
64
-     * Certificate validity period.
65
-     *
66
-     * @var Validity $_validity
67
-     */
68
-    protected $_validity;
69
-    
70
-    /**
71
-     * Certificate subject.
72
-     *
73
-     * @var Name $_subject
74
-     */
75
-    protected $_subject;
76
-    
77
-    /**
78
-     * Subject public key.
79
-     *
80
-     * @var PublicKeyInfo $_subjectPublicKeyInfo
81
-     */
82
-    protected $_subjectPublicKeyInfo;
83
-    
84
-    /**
85
-     * Issuer unique identifier.
86
-     *
87
-     * @var UniqueIdentifier|null $_issuerUniqueID
88
-     */
89
-    protected $_issuerUniqueID;
90
-    
91
-    /**
92
-     * Subject unique identifier.
93
-     *
94
-     * @var UniqueIdentifier|null $_subjectUniqueID
95
-     */
96
-    protected $_subjectUniqueID;
97
-    
98
-    /**
99
-     * Extensions.
100
-     *
101
-     * @var Extensions $_extensions
102
-     */
103
-    protected $_extensions;
104
-    
105
-    /**
106
-     * Constructor.
107
-     *
108
-     * @param Name $subject Certificate subject
109
-     * @param PublicKeyInfo $pki Subject public key
110
-     * @param Name $issuer Certificate issuer
111
-     * @param Validity $validity Validity period
112
-     */
113
-    public function __construct(Name $subject, PublicKeyInfo $pki, Name $issuer,
114
-        Validity $validity)
115
-    {
116
-        $this->_subject = $subject;
117
-        $this->_subjectPublicKeyInfo = $pki;
118
-        $this->_issuer = $issuer;
119
-        $this->_validity = $validity;
120
-        $this->_extensions = new Extensions();
121
-    }
122
-    
123
-    /**
124
-     * Initialize from ASN.1.
125
-     *
126
-     * @param Sequence $seq
127
-     * @return self
128
-     */
129
-    public static function fromASN1(Sequence $seq): self
130
-    {
131
-        $idx = 0;
132
-        if ($seq->hasTagged(0)) {
133
-            $idx++;
134
-            $version = $seq->getTagged(0)
135
-                ->asExplicit()
136
-                ->asInteger()
137
-                ->intNumber();
138
-        } else {
139
-            $version = self::VERSION_1;
140
-        }
141
-        $serial = $seq->at($idx++)
142
-            ->asInteger()
143
-            ->number();
144
-        $algo = AlgorithmIdentifier::fromASN1($seq->at($idx++)->asSequence());
145
-        if (!$algo instanceof SignatureAlgorithmIdentifier) {
146
-            throw new \UnexpectedValueException(
147
-                "Unsupported signature algorithm " . $algo->name() . ".");
148
-        }
149
-        $issuer = Name::fromASN1($seq->at($idx++)->asSequence());
150
-        $validity = Validity::fromASN1($seq->at($idx++)->asSequence());
151
-        $subject = Name::fromASN1($seq->at($idx++)->asSequence());
152
-        $pki = PublicKeyInfo::fromASN1($seq->at($idx++)->asSequence());
153
-        $tbs_cert = new self($subject, $pki, $issuer, $validity);
154
-        $tbs_cert->_version = $version;
155
-        $tbs_cert->_serialNumber = $serial;
156
-        $tbs_cert->_signature = $algo;
157
-        if ($seq->hasTagged(1)) {
158
-            $tbs_cert->_issuerUniqueID = UniqueIdentifier::fromASN1(
159
-                $seq->getTagged(1)
160
-                    ->asImplicit(Element::TYPE_BIT_STRING)
161
-                    ->asBitString());
162
-        }
163
-        if ($seq->hasTagged(2)) {
164
-            $tbs_cert->_subjectUniqueID = UniqueIdentifier::fromASN1(
165
-                $seq->getTagged(2)
166
-                    ->asImplicit(Element::TYPE_BIT_STRING)
167
-                    ->asBitString());
168
-        }
169
-        if ($seq->hasTagged(3)) {
170
-            $tbs_cert->_extensions = Extensions::fromASN1(
171
-                $seq->getTagged(3)
172
-                    ->asExplicit()
173
-                    ->asSequence());
174
-        }
175
-        return $tbs_cert;
176
-    }
177
-    
178
-    /**
179
-     * Initialize from certification request.
180
-     *
181
-     * Note that signature is not verified and must be done by the caller.
182
-     *
183
-     * @param CertificationRequest $cr
184
-     * @return self
185
-     */
186
-    public static function fromCSR(CertificationRequest $cr): self
187
-    {
188
-        $cri = $cr->certificationRequestInfo();
189
-        $tbs_cert = new self($cri->subject(), $cri->subjectPKInfo(), new Name(),
190
-            Validity::fromStrings(null, null));
191
-        // if CSR has Extension Request attribute
192
-        if ($cri->hasAttributes()) {
193
-            $attribs = $cri->attributes();
194
-            if ($attribs->hasExtensionRequest()) {
195
-                $tbs_cert = $tbs_cert->withExtensions(
196
-                    $attribs->extensionRequest()
197
-                        ->extensions());
198
-            }
199
-        }
200
-        // add Subject Key Identifier extension
201
-        $tbs_cert = $tbs_cert->withAdditionalExtensions(
202
-            new SubjectKeyIdentifierExtension(false,
203
-                $cri->subjectPKInfo()
204
-                    ->keyIdentifier()));
205
-        return $tbs_cert;
206
-    }
207
-    
208
-    /**
209
-     * Get self with fields set from the issuer's certificate.
210
-     *
211
-     * Issuer shall be set to issuing certificate's subject.
212
-     * Authority key identifier extensions shall be added with a key identifier
213
-     * set to issuing certificate's public key identifier.
214
-     *
215
-     * @param Certificate $cert Issuing party's certificate
216
-     * @return self
217
-     */
218
-    public function withIssuerCertificate(Certificate $cert): self
219
-    {
220
-        $obj = clone $this;
221
-        // set issuer DN from cert's subject
222
-        $obj->_issuer = $cert->tbsCertificate()->subject();
223
-        // add authority key identifier extension
224
-        $key_id = $cert->tbsCertificate()
225
-            ->subjectPublicKeyInfo()
226
-            ->keyIdentifier();
227
-        $obj->_extensions = $obj->_extensions->withExtensions(
228
-            new AuthorityKeyIdentifierExtension(false, $key_id));
229
-        return $obj;
230
-    }
231
-    
232
-    /**
233
-     * Get self with given version.
234
-     *
235
-     * If version is not set, appropriate version is automatically
236
-     * determined during signing.
237
-     *
238
-     * @param int $version
239
-     * @return self
240
-     */
241
-    public function withVersion(int $version): self
242
-    {
243
-        $obj = clone $this;
244
-        $obj->_version = $version;
245
-        return $obj;
246
-    }
247
-    
248
-    /**
249
-     * Get self with given serial number.
250
-     *
251
-     * @param int|string $serial Base 10 number
252
-     * @return self
253
-     */
254
-    public function withSerialNumber($serial): self
255
-    {
256
-        $obj = clone $this;
257
-        $obj->_serialNumber = strval($serial);
258
-        return $obj;
259
-    }
260
-    
261
-    /**
262
-     * Get self with random positive serial number.
263
-     *
264
-     * @param int $size Number of random bytes
265
-     * @return self
266
-     */
267
-    public function withRandomSerialNumber(int $size = 16): self
268
-    {
269
-        // ensure that first byte is always non-zero and having first bit unset
270
-        $num = gmp_init(mt_rand(1, 0x7f), 10);
271
-        for ($i = 1; $i < $size; ++$i) {
272
-            $num <<= 8;
273
-            $num += mt_rand(0, 0xff);
274
-        }
275
-        return $this->withSerialNumber(gmp_strval($num, 10));
276
-    }
277
-    
278
-    /**
279
-     * Get self with given signature algorithm.
280
-     *
281
-     * @param SignatureAlgorithmIdentifier $algo
282
-     * @return self
283
-     */
284
-    public function withSignature(SignatureAlgorithmIdentifier $algo): self
285
-    {
286
-        $obj = clone $this;
287
-        $obj->_signature = $algo;
288
-        return $obj;
289
-    }
290
-    
291
-    /**
292
-     * Get self with given issuer.
293
-     *
294
-     * @param Name $issuer
295
-     * @return self
296
-     */
297
-    public function withIssuer(Name $issuer): self
298
-    {
299
-        $obj = clone $this;
300
-        $obj->_issuer = $issuer;
301
-        return $obj;
302
-    }
303
-    
304
-    /**
305
-     * Get self with given validity.
306
-     *
307
-     * @param Validity $validity
308
-     * @return self
309
-     */
310
-    public function withValidity(Validity $validity): self
311
-    {
312
-        $obj = clone $this;
313
-        $obj->_validity = $validity;
314
-        return $obj;
315
-    }
316
-    
317
-    /**
318
-     * Get self with given subject.
319
-     *
320
-     * @param Name $subject
321
-     * @return self
322
-     */
323
-    public function withSubject(Name $subject): self
324
-    {
325
-        $obj = clone $this;
326
-        $obj->_subject = $subject;
327
-        return $obj;
328
-    }
329
-    
330
-    /**
331
-     * Get self with given subject public key info.
332
-     *
333
-     * @param PublicKeyInfo $pub_key_info
334
-     * @return self
335
-     */
336
-    public function withSubjectPublicKeyInfo(PublicKeyInfo $pub_key_info): self
337
-    {
338
-        $obj = clone $this;
339
-        $obj->_subjectPublicKeyInfo = $pub_key_info;
340
-        return $obj;
341
-    }
342
-    
343
-    /**
344
-     * Get self with issuer unique ID.
345
-     *
346
-     * @param UniqueIdentifier $id
347
-     * @return self
348
-     */
349
-    public function withIssuerUniqueID(UniqueIdentifier $id): self
350
-    {
351
-        $obj = clone $this;
352
-        $obj->_issuerUniqueID = $id;
353
-        return $obj;
354
-    }
355
-    
356
-    /**
357
-     * Get self with subject unique ID.
358
-     *
359
-     * @param UniqueIdentifier $id
360
-     * @return self
361
-     */
362
-    public function withSubjectUniqueID(UniqueIdentifier $id): self
363
-    {
364
-        $obj = clone $this;
365
-        $obj->_subjectUniqueID = $id;
366
-        return $obj;
367
-    }
368
-    
369
-    /**
370
-     * Get self with given extensions.
371
-     *
372
-     * @param Extensions $extensions
373
-     * @return self
374
-     */
375
-    public function withExtensions(Extensions $extensions): self
376
-    {
377
-        $obj = clone $this;
378
-        $obj->_extensions = $extensions;
379
-        return $obj;
380
-    }
381
-    
382
-    /**
383
-     * Get self with extensions added.
384
-     *
385
-     * @param Extension ...$exts One or more Extension objects
386
-     * @return self
387
-     */
388
-    public function withAdditionalExtensions(Extension ...$exts): self
389
-    {
390
-        $obj = clone $this;
391
-        $obj->_extensions = $obj->_extensions->withExtensions(...$exts);
392
-        return $obj;
393
-    }
394
-    
395
-    /**
396
-     * Check whether version is set.
397
-     *
398
-     * @return bool
399
-     */
400
-    public function hasVersion(): bool
401
-    {
402
-        return isset($this->_version);
403
-    }
404
-    
405
-    /**
406
-     * Get certificate version.
407
-     *
408
-     * @return int
409
-     */
410
-    public function version(): int
411
-    {
412
-        if (!$this->hasVersion()) {
413
-            throw new \LogicException("version not set.");
414
-        }
415
-        return $this->_version;
416
-    }
417
-    
418
-    /**
419
-     * Check whether serial number is set.
420
-     *
421
-     * @return bool
422
-     */
423
-    public function hasSerialNumber(): bool
424
-    {
425
-        return isset($this->_serialNumber);
426
-    }
427
-    
428
-    /**
429
-     * Get serial number.
430
-     *
431
-     * @return string Base 10 integer
432
-     */
433
-    public function serialNumber(): string
434
-    {
435
-        if (!$this->hasSerialNumber()) {
436
-            throw new \LogicException("serialNumber not set.");
437
-        }
438
-        return $this->_serialNumber;
439
-    }
440
-    
441
-    /**
442
-     * Check whether signature algorithm is set.
443
-     *
444
-     * @return bool
445
-     */
446
-    public function hasSignature(): bool
447
-    {
448
-        return isset($this->_signature);
449
-    }
450
-    
451
-    /**
452
-     * Get signature algorithm.
453
-     *
454
-     * @return SignatureAlgorithmIdentifier
455
-     */
456
-    public function signature(): SignatureAlgorithmIdentifier
457
-    {
458
-        if (!$this->hasSignature()) {
459
-            throw new \LogicException("signature not set.");
460
-        }
461
-        return $this->_signature;
462
-    }
463
-    
464
-    /**
465
-     * Get issuer.
466
-     *
467
-     * @return Name
468
-     */
469
-    public function issuer(): Name
470
-    {
471
-        return $this->_issuer;
472
-    }
473
-    
474
-    /**
475
-     * Get validity period.
476
-     *
477
-     * @return Validity
478
-     */
479
-    public function validity(): Validity
480
-    {
481
-        return $this->_validity;
482
-    }
483
-    
484
-    /**
485
-     * Get subject.
486
-     *
487
-     * @return Name
488
-     */
489
-    public function subject(): Name
490
-    {
491
-        return $this->_subject;
492
-    }
493
-    
494
-    /**
495
-     * Get subject public key.
496
-     *
497
-     * @return PublicKeyInfo
498
-     */
499
-    public function subjectPublicKeyInfo(): PublicKeyInfo
500
-    {
501
-        return $this->_subjectPublicKeyInfo;
502
-    }
503
-    
504
-    /**
505
-     * Whether issuer unique identifier is present.
506
-     *
507
-     * @return bool
508
-     */
509
-    public function hasIssuerUniqueID(): bool
510
-    {
511
-        return isset($this->_issuerUniqueID);
512
-    }
513
-    
514
-    /**
515
-     * Get issuerUniqueID.
516
-     *
517
-     * @return UniqueIdentifier
518
-     */
519
-    public function issuerUniqueID(): UniqueIdentifier
520
-    {
521
-        if (!$this->hasIssuerUniqueID()) {
522
-            throw new \LogicException("issuerUniqueID not set.");
523
-        }
524
-        return $this->_issuerUniqueID;
525
-    }
526
-    
527
-    /**
528
-     * Whether subject unique identifier is present.
529
-     *
530
-     * @return bool
531
-     */
532
-    public function hasSubjectUniqueID(): bool
533
-    {
534
-        return isset($this->_subjectUniqueID);
535
-    }
536
-    
537
-    /**
538
-     * Get subjectUniqueID.
539
-     *
540
-     * @return UniqueIdentifier
541
-     */
542
-    public function subjectUniqueID(): UniqueIdentifier
543
-    {
544
-        if (!$this->hasSubjectUniqueID()) {
545
-            throw new \LogicException("subjectUniqueID not set.");
546
-        }
547
-        return $this->_subjectUniqueID;
548
-    }
549
-    
550
-    /**
551
-     * Get extensions.
552
-     *
553
-     * @return Extensions
554
-     */
555
-    public function extensions(): Extensions
556
-    {
557
-        return $this->_extensions;
558
-    }
559
-    
560
-    /**
561
-     * Generate ASN.1 structure.
562
-     *
563
-     * @return Sequence
564
-     */
565
-    public function toASN1(): Sequence
566
-    {
567
-        $elements = array();
568
-        $version = $this->version();
569
-        // if version is not default
570
-        if ($version != self::VERSION_1) {
571
-            $elements[] = new ExplicitlyTaggedType(0, new Integer($version));
572
-        }
573
-        $serial = $this->serialNumber();
574
-        $signature = $this->signature();
575
-        // add required elements
576
-        array_push($elements, new Integer($serial), $signature->toASN1(),
577
-            $this->_issuer->toASN1(), $this->_validity->toASN1(),
578
-            $this->_subject->toASN1(), $this->_subjectPublicKeyInfo->toASN1());
579
-        if (isset($this->_issuerUniqueID)) {
580
-            $elements[] = new ImplicitlyTaggedType(1,
581
-                $this->_issuerUniqueID->toASN1());
582
-        }
583
-        if (isset($this->_subjectUniqueID)) {
584
-            $elements[] = new ImplicitlyTaggedType(2,
585
-                $this->_subjectUniqueID->toASN1());
586
-        }
587
-        if (count($this->_extensions)) {
588
-            $elements[] = new ExplicitlyTaggedType(3,
589
-                $this->_extensions->toASN1());
590
-        }
591
-        return new Sequence(...$elements);
592
-    }
593
-    
594
-    /**
595
-     * Create signed certificate.
596
-     *
597
-     * @param SignatureAlgorithmIdentifier $algo Algorithm used for signing
598
-     * @param PrivateKeyInfo $privkey_info Private key used for signing
599
-     * @param Crypto|null $crypto Crypto engine, use default if not set
600
-     * @return Certificate
601
-     */
602
-    public function sign(SignatureAlgorithmIdentifier $algo,
603
-        PrivateKeyInfo $privkey_info, Crypto $crypto = null): Certificate
604
-    {
605
-        $crypto = $crypto ?: Crypto::getDefault();
606
-        $tbs_cert = clone $this;
607
-        if (!isset($tbs_cert->_version)) {
608
-            $tbs_cert->_version = $tbs_cert->_determineVersion();
609
-        }
610
-        if (!isset($tbs_cert->_serialNumber)) {
611
-            $tbs_cert->_serialNumber = strval(0);
612
-        }
613
-        $tbs_cert->_signature = $algo;
614
-        $data = $tbs_cert->toASN1()->toDER();
615
-        $signature = $crypto->sign($data, $privkey_info, $algo);
616
-        return new Certificate($tbs_cert, $algo, $signature);
617
-    }
618
-    
619
-    /**
620
-     * Determine minimum version for the certificate.
621
-     *
622
-     * @return int
623
-     */
624
-    protected function _determineVersion(): int
625
-    {
626
-        // if extensions are present
627
-        if (count($this->_extensions)) {
628
-            return self::VERSION_3;
629
-        }
630
-        // if UniqueIdentifier is present
631
-        if (isset($this->_issuerUniqueID) || isset($this->_subjectUniqueID)) {
632
-            return self::VERSION_2;
633
-        }
634
-        return self::VERSION_1;
635
-    }
30
+	// Certificate version enumerations
31
+	const VERSION_1 = 0;
32
+	const VERSION_2 = 1;
33
+	const VERSION_3 = 2;
34
+    
35
+	/**
36
+	 * Certificate version.
37
+	 *
38
+	 * @var int|null
39
+	 */
40
+	protected $_version;
41
+    
42
+	/**
43
+	 * Serial number.
44
+	 *
45
+	 * @var string|null
46
+	 */
47
+	protected $_serialNumber;
48
+    
49
+	/**
50
+	 * Signature algorithm.
51
+	 *
52
+	 * @var SignatureAlgorithmIdentifier|null
53
+	 */
54
+	protected $_signature;
55
+    
56
+	/**
57
+	 * Certificate issuer.
58
+	 *
59
+	 * @var Name $_issuer
60
+	 */
61
+	protected $_issuer;
62
+    
63
+	/**
64
+	 * Certificate validity period.
65
+	 *
66
+	 * @var Validity $_validity
67
+	 */
68
+	protected $_validity;
69
+    
70
+	/**
71
+	 * Certificate subject.
72
+	 *
73
+	 * @var Name $_subject
74
+	 */
75
+	protected $_subject;
76
+    
77
+	/**
78
+	 * Subject public key.
79
+	 *
80
+	 * @var PublicKeyInfo $_subjectPublicKeyInfo
81
+	 */
82
+	protected $_subjectPublicKeyInfo;
83
+    
84
+	/**
85
+	 * Issuer unique identifier.
86
+	 *
87
+	 * @var UniqueIdentifier|null $_issuerUniqueID
88
+	 */
89
+	protected $_issuerUniqueID;
90
+    
91
+	/**
92
+	 * Subject unique identifier.
93
+	 *
94
+	 * @var UniqueIdentifier|null $_subjectUniqueID
95
+	 */
96
+	protected $_subjectUniqueID;
97
+    
98
+	/**
99
+	 * Extensions.
100
+	 *
101
+	 * @var Extensions $_extensions
102
+	 */
103
+	protected $_extensions;
104
+    
105
+	/**
106
+	 * Constructor.
107
+	 *
108
+	 * @param Name $subject Certificate subject
109
+	 * @param PublicKeyInfo $pki Subject public key
110
+	 * @param Name $issuer Certificate issuer
111
+	 * @param Validity $validity Validity period
112
+	 */
113
+	public function __construct(Name $subject, PublicKeyInfo $pki, Name $issuer,
114
+		Validity $validity)
115
+	{
116
+		$this->_subject = $subject;
117
+		$this->_subjectPublicKeyInfo = $pki;
118
+		$this->_issuer = $issuer;
119
+		$this->_validity = $validity;
120
+		$this->_extensions = new Extensions();
121
+	}
122
+    
123
+	/**
124
+	 * Initialize from ASN.1.
125
+	 *
126
+	 * @param Sequence $seq
127
+	 * @return self
128
+	 */
129
+	public static function fromASN1(Sequence $seq): self
130
+	{
131
+		$idx = 0;
132
+		if ($seq->hasTagged(0)) {
133
+			$idx++;
134
+			$version = $seq->getTagged(0)
135
+				->asExplicit()
136
+				->asInteger()
137
+				->intNumber();
138
+		} else {
139
+			$version = self::VERSION_1;
140
+		}
141
+		$serial = $seq->at($idx++)
142
+			->asInteger()
143
+			->number();
144
+		$algo = AlgorithmIdentifier::fromASN1($seq->at($idx++)->asSequence());
145
+		if (!$algo instanceof SignatureAlgorithmIdentifier) {
146
+			throw new \UnexpectedValueException(
147
+				"Unsupported signature algorithm " . $algo->name() . ".");
148
+		}
149
+		$issuer = Name::fromASN1($seq->at($idx++)->asSequence());
150
+		$validity = Validity::fromASN1($seq->at($idx++)->asSequence());
151
+		$subject = Name::fromASN1($seq->at($idx++)->asSequence());
152
+		$pki = PublicKeyInfo::fromASN1($seq->at($idx++)->asSequence());
153
+		$tbs_cert = new self($subject, $pki, $issuer, $validity);
154
+		$tbs_cert->_version = $version;
155
+		$tbs_cert->_serialNumber = $serial;
156
+		$tbs_cert->_signature = $algo;
157
+		if ($seq->hasTagged(1)) {
158
+			$tbs_cert->_issuerUniqueID = UniqueIdentifier::fromASN1(
159
+				$seq->getTagged(1)
160
+					->asImplicit(Element::TYPE_BIT_STRING)
161
+					->asBitString());
162
+		}
163
+		if ($seq->hasTagged(2)) {
164
+			$tbs_cert->_subjectUniqueID = UniqueIdentifier::fromASN1(
165
+				$seq->getTagged(2)
166
+					->asImplicit(Element::TYPE_BIT_STRING)
167
+					->asBitString());
168
+		}
169
+		if ($seq->hasTagged(3)) {
170
+			$tbs_cert->_extensions = Extensions::fromASN1(
171
+				$seq->getTagged(3)
172
+					->asExplicit()
173
+					->asSequence());
174
+		}
175
+		return $tbs_cert;
176
+	}
177
+    
178
+	/**
179
+	 * Initialize from certification request.
180
+	 *
181
+	 * Note that signature is not verified and must be done by the caller.
182
+	 *
183
+	 * @param CertificationRequest $cr
184
+	 * @return self
185
+	 */
186
+	public static function fromCSR(CertificationRequest $cr): self
187
+	{
188
+		$cri = $cr->certificationRequestInfo();
189
+		$tbs_cert = new self($cri->subject(), $cri->subjectPKInfo(), new Name(),
190
+			Validity::fromStrings(null, null));
191
+		// if CSR has Extension Request attribute
192
+		if ($cri->hasAttributes()) {
193
+			$attribs = $cri->attributes();
194
+			if ($attribs->hasExtensionRequest()) {
195
+				$tbs_cert = $tbs_cert->withExtensions(
196
+					$attribs->extensionRequest()
197
+						->extensions());
198
+			}
199
+		}
200
+		// add Subject Key Identifier extension
201
+		$tbs_cert = $tbs_cert->withAdditionalExtensions(
202
+			new SubjectKeyIdentifierExtension(false,
203
+				$cri->subjectPKInfo()
204
+					->keyIdentifier()));
205
+		return $tbs_cert;
206
+	}
207
+    
208
+	/**
209
+	 * Get self with fields set from the issuer's certificate.
210
+	 *
211
+	 * Issuer shall be set to issuing certificate's subject.
212
+	 * Authority key identifier extensions shall be added with a key identifier
213
+	 * set to issuing certificate's public key identifier.
214
+	 *
215
+	 * @param Certificate $cert Issuing party's certificate
216
+	 * @return self
217
+	 */
218
+	public function withIssuerCertificate(Certificate $cert): self
219
+	{
220
+		$obj = clone $this;
221
+		// set issuer DN from cert's subject
222
+		$obj->_issuer = $cert->tbsCertificate()->subject();
223
+		// add authority key identifier extension
224
+		$key_id = $cert->tbsCertificate()
225
+			->subjectPublicKeyInfo()
226
+			->keyIdentifier();
227
+		$obj->_extensions = $obj->_extensions->withExtensions(
228
+			new AuthorityKeyIdentifierExtension(false, $key_id));
229
+		return $obj;
230
+	}
231
+    
232
+	/**
233
+	 * Get self with given version.
234
+	 *
235
+	 * If version is not set, appropriate version is automatically
236
+	 * determined during signing.
237
+	 *
238
+	 * @param int $version
239
+	 * @return self
240
+	 */
241
+	public function withVersion(int $version): self
242
+	{
243
+		$obj = clone $this;
244
+		$obj->_version = $version;
245
+		return $obj;
246
+	}
247
+    
248
+	/**
249
+	 * Get self with given serial number.
250
+	 *
251
+	 * @param int|string $serial Base 10 number
252
+	 * @return self
253
+	 */
254
+	public function withSerialNumber($serial): self
255
+	{
256
+		$obj = clone $this;
257
+		$obj->_serialNumber = strval($serial);
258
+		return $obj;
259
+	}
260
+    
261
+	/**
262
+	 * Get self with random positive serial number.
263
+	 *
264
+	 * @param int $size Number of random bytes
265
+	 * @return self
266
+	 */
267
+	public function withRandomSerialNumber(int $size = 16): self
268
+	{
269
+		// ensure that first byte is always non-zero and having first bit unset
270
+		$num = gmp_init(mt_rand(1, 0x7f), 10);
271
+		for ($i = 1; $i < $size; ++$i) {
272
+			$num <<= 8;
273
+			$num += mt_rand(0, 0xff);
274
+		}
275
+		return $this->withSerialNumber(gmp_strval($num, 10));
276
+	}
277
+    
278
+	/**
279
+	 * Get self with given signature algorithm.
280
+	 *
281
+	 * @param SignatureAlgorithmIdentifier $algo
282
+	 * @return self
283
+	 */
284
+	public function withSignature(SignatureAlgorithmIdentifier $algo): self
285
+	{
286
+		$obj = clone $this;
287
+		$obj->_signature = $algo;
288
+		return $obj;
289
+	}
290
+    
291
+	/**
292
+	 * Get self with given issuer.
293
+	 *
294
+	 * @param Name $issuer
295
+	 * @return self
296
+	 */
297
+	public function withIssuer(Name $issuer): self
298
+	{
299
+		$obj = clone $this;
300
+		$obj->_issuer = $issuer;
301
+		return $obj;
302
+	}
303
+    
304
+	/**
305
+	 * Get self with given validity.
306
+	 *
307
+	 * @param Validity $validity
308
+	 * @return self
309
+	 */
310
+	public function withValidity(Validity $validity): self
311
+	{
312
+		$obj = clone $this;
313
+		$obj->_validity = $validity;
314
+		return $obj;
315
+	}
316
+    
317
+	/**
318
+	 * Get self with given subject.
319
+	 *
320
+	 * @param Name $subject
321
+	 * @return self
322
+	 */
323
+	public function withSubject(Name $subject): self
324
+	{
325
+		$obj = clone $this;
326
+		$obj->_subject = $subject;
327
+		return $obj;
328
+	}
329
+    
330
+	/**
331
+	 * Get self with given subject public key info.
332
+	 *
333
+	 * @param PublicKeyInfo $pub_key_info
334
+	 * @return self
335
+	 */
336
+	public function withSubjectPublicKeyInfo(PublicKeyInfo $pub_key_info): self
337
+	{
338
+		$obj = clone $this;
339
+		$obj->_subjectPublicKeyInfo = $pub_key_info;
340
+		return $obj;
341
+	}
342
+    
343
+	/**
344
+	 * Get self with issuer unique ID.
345
+	 *
346
+	 * @param UniqueIdentifier $id
347
+	 * @return self
348
+	 */
349
+	public function withIssuerUniqueID(UniqueIdentifier $id): self
350
+	{
351
+		$obj = clone $this;
352
+		$obj->_issuerUniqueID = $id;
353
+		return $obj;
354
+	}
355
+    
356
+	/**
357
+	 * Get self with subject unique ID.
358
+	 *
359
+	 * @param UniqueIdentifier $id
360
+	 * @return self
361
+	 */
362
+	public function withSubjectUniqueID(UniqueIdentifier $id): self
363
+	{
364
+		$obj = clone $this;
365
+		$obj->_subjectUniqueID = $id;
366
+		return $obj;
367
+	}
368
+    
369
+	/**
370
+	 * Get self with given extensions.
371
+	 *
372
+	 * @param Extensions $extensions
373
+	 * @return self
374
+	 */
375
+	public function withExtensions(Extensions $extensions): self
376
+	{
377
+		$obj = clone $this;
378
+		$obj->_extensions = $extensions;
379
+		return $obj;
380
+	}
381
+    
382
+	/**
383
+	 * Get self with extensions added.
384
+	 *
385
+	 * @param Extension ...$exts One or more Extension objects
386
+	 * @return self
387
+	 */
388
+	public function withAdditionalExtensions(Extension ...$exts): self
389
+	{
390
+		$obj = clone $this;
391
+		$obj->_extensions = $obj->_extensions->withExtensions(...$exts);
392
+		return $obj;
393
+	}
394
+    
395
+	/**
396
+	 * Check whether version is set.
397
+	 *
398
+	 * @return bool
399
+	 */
400
+	public function hasVersion(): bool
401
+	{
402
+		return isset($this->_version);
403
+	}
404
+    
405
+	/**
406
+	 * Get certificate version.
407
+	 *
408
+	 * @return int
409
+	 */
410
+	public function version(): int
411
+	{
412
+		if (!$this->hasVersion()) {
413
+			throw new \LogicException("version not set.");
414
+		}
415
+		return $this->_version;
416
+	}
417
+    
418
+	/**
419
+	 * Check whether serial number is set.
420
+	 *
421
+	 * @return bool
422
+	 */
423
+	public function hasSerialNumber(): bool
424
+	{
425
+		return isset($this->_serialNumber);
426
+	}
427
+    
428
+	/**
429
+	 * Get serial number.
430
+	 *
431
+	 * @return string Base 10 integer
432
+	 */
433
+	public function serialNumber(): string
434
+	{
435
+		if (!$this->hasSerialNumber()) {
436
+			throw new \LogicException("serialNumber not set.");
437
+		}
438
+		return $this->_serialNumber;
439
+	}
440
+    
441
+	/**
442
+	 * Check whether signature algorithm is set.
443
+	 *
444
+	 * @return bool
445
+	 */
446
+	public function hasSignature(): bool
447
+	{
448
+		return isset($this->_signature);
449
+	}
450
+    
451
+	/**
452
+	 * Get signature algorithm.
453
+	 *
454
+	 * @return SignatureAlgorithmIdentifier
455
+	 */
456
+	public function signature(): SignatureAlgorithmIdentifier
457
+	{
458
+		if (!$this->hasSignature()) {
459
+			throw new \LogicException("signature not set.");
460
+		}
461
+		return $this->_signature;
462
+	}
463
+    
464
+	/**
465
+	 * Get issuer.
466
+	 *
467
+	 * @return Name
468
+	 */
469
+	public function issuer(): Name
470
+	{
471
+		return $this->_issuer;
472
+	}
473
+    
474
+	/**
475
+	 * Get validity period.
476
+	 *
477
+	 * @return Validity
478
+	 */
479
+	public function validity(): Validity
480
+	{
481
+		return $this->_validity;
482
+	}
483
+    
484
+	/**
485
+	 * Get subject.
486
+	 *
487
+	 * @return Name
488
+	 */
489
+	public function subject(): Name
490
+	{
491
+		return $this->_subject;
492
+	}
493
+    
494
+	/**
495
+	 * Get subject public key.
496
+	 *
497
+	 * @return PublicKeyInfo
498
+	 */
499
+	public function subjectPublicKeyInfo(): PublicKeyInfo
500
+	{
501
+		return $this->_subjectPublicKeyInfo;
502
+	}
503
+    
504
+	/**
505
+	 * Whether issuer unique identifier is present.
506
+	 *
507
+	 * @return bool
508
+	 */
509
+	public function hasIssuerUniqueID(): bool
510
+	{
511
+		return isset($this->_issuerUniqueID);
512
+	}
513
+    
514
+	/**
515
+	 * Get issuerUniqueID.
516
+	 *
517
+	 * @return UniqueIdentifier
518
+	 */
519
+	public function issuerUniqueID(): UniqueIdentifier
520
+	{
521
+		if (!$this->hasIssuerUniqueID()) {
522
+			throw new \LogicException("issuerUniqueID not set.");
523
+		}
524
+		return $this->_issuerUniqueID;
525
+	}
526
+    
527
+	/**
528
+	 * Whether subject unique identifier is present.
529
+	 *
530
+	 * @return bool
531
+	 */
532
+	public function hasSubjectUniqueID(): bool
533
+	{
534
+		return isset($this->_subjectUniqueID);
535
+	}
536
+    
537
+	/**
538
+	 * Get subjectUniqueID.
539
+	 *
540
+	 * @return UniqueIdentifier
541
+	 */
542
+	public function subjectUniqueID(): UniqueIdentifier
543
+	{
544
+		if (!$this->hasSubjectUniqueID()) {
545
+			throw new \LogicException("subjectUniqueID not set.");
546
+		}
547
+		return $this->_subjectUniqueID;
548
+	}
549
+    
550
+	/**
551
+	 * Get extensions.
552
+	 *
553
+	 * @return Extensions
554
+	 */
555
+	public function extensions(): Extensions
556
+	{
557
+		return $this->_extensions;
558
+	}
559
+    
560
+	/**
561
+	 * Generate ASN.1 structure.
562
+	 *
563
+	 * @return Sequence
564
+	 */
565
+	public function toASN1(): Sequence
566
+	{
567
+		$elements = array();
568
+		$version = $this->version();
569
+		// if version is not default
570
+		if ($version != self::VERSION_1) {
571
+			$elements[] = new ExplicitlyTaggedType(0, new Integer($version));
572
+		}
573
+		$serial = $this->serialNumber();
574
+		$signature = $this->signature();
575
+		// add required elements
576
+		array_push($elements, new Integer($serial), $signature->toASN1(),
577
+			$this->_issuer->toASN1(), $this->_validity->toASN1(),
578
+			$this->_subject->toASN1(), $this->_subjectPublicKeyInfo->toASN1());
579
+		if (isset($this->_issuerUniqueID)) {
580
+			$elements[] = new ImplicitlyTaggedType(1,
581
+				$this->_issuerUniqueID->toASN1());
582
+		}
583
+		if (isset($this->_subjectUniqueID)) {
584
+			$elements[] = new ImplicitlyTaggedType(2,
585
+				$this->_subjectUniqueID->toASN1());
586
+		}
587
+		if (count($this->_extensions)) {
588
+			$elements[] = new ExplicitlyTaggedType(3,
589
+				$this->_extensions->toASN1());
590
+		}
591
+		return new Sequence(...$elements);
592
+	}
593
+    
594
+	/**
595
+	 * Create signed certificate.
596
+	 *
597
+	 * @param SignatureAlgorithmIdentifier $algo Algorithm used for signing
598
+	 * @param PrivateKeyInfo $privkey_info Private key used for signing
599
+	 * @param Crypto|null $crypto Crypto engine, use default if not set
600
+	 * @return Certificate
601
+	 */
602
+	public function sign(SignatureAlgorithmIdentifier $algo,
603
+		PrivateKeyInfo $privkey_info, Crypto $crypto = null): Certificate
604
+	{
605
+		$crypto = $crypto ?: Crypto::getDefault();
606
+		$tbs_cert = clone $this;
607
+		if (!isset($tbs_cert->_version)) {
608
+			$tbs_cert->_version = $tbs_cert->_determineVersion();
609
+		}
610
+		if (!isset($tbs_cert->_serialNumber)) {
611
+			$tbs_cert->_serialNumber = strval(0);
612
+		}
613
+		$tbs_cert->_signature = $algo;
614
+		$data = $tbs_cert->toASN1()->toDER();
615
+		$signature = $crypto->sign($data, $privkey_info, $algo);
616
+		return new Certificate($tbs_cert, $algo, $signature);
617
+	}
618
+    
619
+	/**
620
+	 * Determine minimum version for the certificate.
621
+	 *
622
+	 * @return int
623
+	 */
624
+	protected function _determineVersion(): int
625
+	{
626
+		// if extensions are present
627
+		if (count($this->_extensions)) {
628
+			return self::VERSION_3;
629
+		}
630
+		// if UniqueIdentifier is present
631
+		if (isset($this->_issuerUniqueID) || isset($this->_subjectUniqueID)) {
632
+			return self::VERSION_2;
633
+		}
634
+		return self::VERSION_1;
635
+	}
636 636
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/SubjectKeyIdentifierExtension.php 1 patch
Indentation   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -13,52 +13,52 @@
 block discarded – undo
13 13
  */
14 14
 class SubjectKeyIdentifierExtension extends Extension
15 15
 {
16
-    /**
17
-     * Key identifier.
18
-     *
19
-     * @var string $_keyIdentifier
20
-     */
21
-    protected $_keyIdentifier;
16
+	/**
17
+	 * Key identifier.
18
+	 *
19
+	 * @var string $_keyIdentifier
20
+	 */
21
+	protected $_keyIdentifier;
22 22
     
23
-    /**
24
-     * Constructor.
25
-     *
26
-     * @param bool $critical
27
-     * @param string $keyIdentifier
28
-     */
29
-    public function __construct(bool $critical, string $keyIdentifier)
30
-    {
31
-        parent::__construct(self::OID_SUBJECT_KEY_IDENTIFIER, $critical);
32
-        $this->_keyIdentifier = $keyIdentifier;
33
-    }
23
+	/**
24
+	 * Constructor.
25
+	 *
26
+	 * @param bool $critical
27
+	 * @param string $keyIdentifier
28
+	 */
29
+	public function __construct(bool $critical, string $keyIdentifier)
30
+	{
31
+		parent::__construct(self::OID_SUBJECT_KEY_IDENTIFIER, $critical);
32
+		$this->_keyIdentifier = $keyIdentifier;
33
+	}
34 34
     
35
-    /**
36
-     *
37
-     * {@inheritdoc}
38
-     * @return self
39
-     */
40
-    protected static function _fromDER(string $data, bool $critical): self
41
-    {
42
-        return new self($critical, OctetString::fromDER($data)->string());
43
-    }
35
+	/**
36
+	 *
37
+	 * {@inheritdoc}
38
+	 * @return self
39
+	 */
40
+	protected static function _fromDER(string $data, bool $critical): self
41
+	{
42
+		return new self($critical, OctetString::fromDER($data)->string());
43
+	}
44 44
     
45
-    /**
46
-     * Get key identifier.
47
-     *
48
-     * @return string
49
-     */
50
-    public function keyIdentifier(): string
51
-    {
52
-        return $this->_keyIdentifier;
53
-    }
45
+	/**
46
+	 * Get key identifier.
47
+	 *
48
+	 * @return string
49
+	 */
50
+	public function keyIdentifier(): string
51
+	{
52
+		return $this->_keyIdentifier;
53
+	}
54 54
     
55
-    /**
56
-     *
57
-     * {@inheritdoc}
58
-     * @return OctetString
59
-     */
60
-    protected function _valueASN1(): OctetString
61
-    {
62
-        return new OctetString($this->_keyIdentifier);
63
-    }
55
+	/**
56
+	 *
57
+	 * {@inheritdoc}
58
+	 * @return OctetString
59
+	 */
60
+	protected function _valueASN1(): OctetString
61
+	{
62
+		return new OctetString($this->_keyIdentifier);
63
+	}
64 64
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/PolicyConstraintsExtension.php 1 patch
Indentation   +113 added lines, -113 removed lines patch added patch discarded remove patch
@@ -16,125 +16,125 @@
 block discarded – undo
16 16
  */
17 17
 class PolicyConstraintsExtension extends Extension
18 18
 {
19
-    /**
20
-     *
21
-     * @var int $_requireExplicitPolicy
22
-     */
23
-    protected $_requireExplicitPolicy;
19
+	/**
20
+	 *
21
+	 * @var int $_requireExplicitPolicy
22
+	 */
23
+	protected $_requireExplicitPolicy;
24 24
     
25
-    /**
26
-     *
27
-     * @var int $_inhibitPolicyMapping
28
-     */
29
-    protected $_inhibitPolicyMapping;
25
+	/**
26
+	 *
27
+	 * @var int $_inhibitPolicyMapping
28
+	 */
29
+	protected $_inhibitPolicyMapping;
30 30
     
31
-    /**
32
-     * Constructor.
33
-     *
34
-     * @param bool $critical
35
-     * @param int|null $require_explicit_policy
36
-     * @param int|null $inhibit_policy_mapping
37
-     */
38
-    public function __construct(bool $critical, $require_explicit_policy = null,
39
-        $inhibit_policy_mapping = null)
40
-    {
41
-        parent::__construct(self::OID_POLICY_CONSTRAINTS, $critical);
42
-        $this->_requireExplicitPolicy = isset($require_explicit_policy) ? intval(
43
-            $require_explicit_policy) : null;
44
-        $this->_inhibitPolicyMapping = isset($inhibit_policy_mapping) ? intval(
45
-            $inhibit_policy_mapping) : null;
46
-    }
31
+	/**
32
+	 * Constructor.
33
+	 *
34
+	 * @param bool $critical
35
+	 * @param int|null $require_explicit_policy
36
+	 * @param int|null $inhibit_policy_mapping
37
+	 */
38
+	public function __construct(bool $critical, $require_explicit_policy = null,
39
+		$inhibit_policy_mapping = null)
40
+	{
41
+		parent::__construct(self::OID_POLICY_CONSTRAINTS, $critical);
42
+		$this->_requireExplicitPolicy = isset($require_explicit_policy) ? intval(
43
+			$require_explicit_policy) : null;
44
+		$this->_inhibitPolicyMapping = isset($inhibit_policy_mapping) ? intval(
45
+			$inhibit_policy_mapping) : null;
46
+	}
47 47
     
48
-    /**
49
-     *
50
-     * {@inheritdoc}
51
-     * @return self
52
-     */
53
-    protected static function _fromDER(string $data, bool $critical): self
54
-    {
55
-        $seq = Sequence::fromDER($data);
56
-        $require_explicit_policy = null;
57
-        $inhibit_policy_mapping = null;
58
-        if ($seq->hasTagged(0)) {
59
-            $require_explicit_policy = $seq->getTagged(0)
60
-                ->asImplicit(Element::TYPE_INTEGER)
61
-                ->asInteger()
62
-                ->intNumber();
63
-        }
64
-        if ($seq->hasTagged(1)) {
65
-            $inhibit_policy_mapping = $seq->getTagged(1)
66
-                ->asImplicit(Element::TYPE_INTEGER)
67
-                ->asInteger()
68
-                ->intNumber();
69
-        }
70
-        return new self($critical, $require_explicit_policy,
71
-            $inhibit_policy_mapping);
72
-    }
48
+	/**
49
+	 *
50
+	 * {@inheritdoc}
51
+	 * @return self
52
+	 */
53
+	protected static function _fromDER(string $data, bool $critical): self
54
+	{
55
+		$seq = Sequence::fromDER($data);
56
+		$require_explicit_policy = null;
57
+		$inhibit_policy_mapping = null;
58
+		if ($seq->hasTagged(0)) {
59
+			$require_explicit_policy = $seq->getTagged(0)
60
+				->asImplicit(Element::TYPE_INTEGER)
61
+				->asInteger()
62
+				->intNumber();
63
+		}
64
+		if ($seq->hasTagged(1)) {
65
+			$inhibit_policy_mapping = $seq->getTagged(1)
66
+				->asImplicit(Element::TYPE_INTEGER)
67
+				->asInteger()
68
+				->intNumber();
69
+		}
70
+		return new self($critical, $require_explicit_policy,
71
+			$inhibit_policy_mapping);
72
+	}
73 73
     
74
-    /**
75
-     * Whether requireExplicitPolicy is present.
76
-     *
77
-     * @return bool
78
-     */
79
-    public function hasRequireExplicitPolicy(): bool
80
-    {
81
-        return isset($this->_requireExplicitPolicy);
82
-    }
74
+	/**
75
+	 * Whether requireExplicitPolicy is present.
76
+	 *
77
+	 * @return bool
78
+	 */
79
+	public function hasRequireExplicitPolicy(): bool
80
+	{
81
+		return isset($this->_requireExplicitPolicy);
82
+	}
83 83
     
84
-    /**
85
-     * Get requireExplicitPolicy.
86
-     *
87
-     * @throws \LogicException
88
-     * @return int
89
-     */
90
-    public function requireExplicitPolicy(): int
91
-    {
92
-        if (!$this->hasRequireExplicitPolicy()) {
93
-            throw new \LogicException("requireExplicitPolicy not set.");
94
-        }
95
-        return $this->_requireExplicitPolicy;
96
-    }
84
+	/**
85
+	 * Get requireExplicitPolicy.
86
+	 *
87
+	 * @throws \LogicException
88
+	 * @return int
89
+	 */
90
+	public function requireExplicitPolicy(): int
91
+	{
92
+		if (!$this->hasRequireExplicitPolicy()) {
93
+			throw new \LogicException("requireExplicitPolicy not set.");
94
+		}
95
+		return $this->_requireExplicitPolicy;
96
+	}
97 97
     
98
-    /**
99
-     * Whether inhibitPolicyMapping is present.
100
-     *
101
-     * @return bool
102
-     */
103
-    public function hasInhibitPolicyMapping(): bool
104
-    {
105
-        return isset($this->_inhibitPolicyMapping);
106
-    }
98
+	/**
99
+	 * Whether inhibitPolicyMapping is present.
100
+	 *
101
+	 * @return bool
102
+	 */
103
+	public function hasInhibitPolicyMapping(): bool
104
+	{
105
+		return isset($this->_inhibitPolicyMapping);
106
+	}
107 107
     
108
-    /**
109
-     * Get inhibitPolicyMapping.
110
-     *
111
-     * @throws \LogicException
112
-     * @return int
113
-     */
114
-    public function inhibitPolicyMapping(): int
115
-    {
116
-        if (!$this->hasInhibitPolicyMapping()) {
117
-            throw new \LogicException("inhibitPolicyMapping not set.");
118
-        }
119
-        return $this->_inhibitPolicyMapping;
120
-    }
108
+	/**
109
+	 * Get inhibitPolicyMapping.
110
+	 *
111
+	 * @throws \LogicException
112
+	 * @return int
113
+	 */
114
+	public function inhibitPolicyMapping(): int
115
+	{
116
+		if (!$this->hasInhibitPolicyMapping()) {
117
+			throw new \LogicException("inhibitPolicyMapping not set.");
118
+		}
119
+		return $this->_inhibitPolicyMapping;
120
+	}
121 121
     
122
-    /**
123
-     *
124
-     * {@inheritdoc}
125
-     * @return Sequence
126
-     */
127
-    protected function _valueASN1(): Sequence
128
-    {
129
-        $elements = array();
130
-        if (isset($this->_requireExplicitPolicy)) {
131
-            $elements[] = new ImplicitlyTaggedType(0,
132
-                new Integer($this->_requireExplicitPolicy));
133
-        }
134
-        if (isset($this->_inhibitPolicyMapping)) {
135
-            $elements[] = new ImplicitlyTaggedType(1,
136
-                new Integer($this->_inhibitPolicyMapping));
137
-        }
138
-        return new Sequence(...$elements);
139
-    }
122
+	/**
123
+	 *
124
+	 * {@inheritdoc}
125
+	 * @return Sequence
126
+	 */
127
+	protected function _valueASN1(): Sequence
128
+	{
129
+		$elements = array();
130
+		if (isset($this->_requireExplicitPolicy)) {
131
+			$elements[] = new ImplicitlyTaggedType(0,
132
+				new Integer($this->_requireExplicitPolicy));
133
+		}
134
+		if (isset($this->_inhibitPolicyMapping)) {
135
+			$elements[] = new ImplicitlyTaggedType(1,
136
+				new Integer($this->_inhibitPolicyMapping));
137
+		}
138
+		return new Sequence(...$elements);
139
+	}
140 140
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/CertificatePoliciesExtension.php 1 patch
Indentation   +122 added lines, -122 removed lines patch added patch discarded remove patch
@@ -14,136 +14,136 @@
 block discarded – undo
14 14
  * @link https://tools.ietf.org/html/rfc5280#section-4.2.1.4
15 15
  */
16 16
 class CertificatePoliciesExtension extends Extension implements 
17
-    \Countable,
18
-    \IteratorAggregate
17
+	\Countable,
18
+	\IteratorAggregate
19 19
 {
20
-    /**
21
-     * Policy information terms.
22
-     *
23
-     * @var PolicyInformation[] $_policies
24
-     */
25
-    protected $_policies;
20
+	/**
21
+	 * Policy information terms.
22
+	 *
23
+	 * @var PolicyInformation[] $_policies
24
+	 */
25
+	protected $_policies;
26 26
     
27
-    /**
28
-     * Constructor.
29
-     *
30
-     * @param bool $critical
31
-     * @param PolicyInformation ...$policies
32
-     */
33
-    public function __construct(bool $critical, PolicyInformation ...$policies)
34
-    {
35
-        parent::__construct(Extension::OID_CERTIFICATE_POLICIES, $critical);
36
-        $this->_policies = [];
37
-        foreach ($policies as $policy) {
38
-            $this->_policies[$policy->oid()] = $policy;
39
-        }
40
-    }
27
+	/**
28
+	 * Constructor.
29
+	 *
30
+	 * @param bool $critical
31
+	 * @param PolicyInformation ...$policies
32
+	 */
33
+	public function __construct(bool $critical, PolicyInformation ...$policies)
34
+	{
35
+		parent::__construct(Extension::OID_CERTIFICATE_POLICIES, $critical);
36
+		$this->_policies = [];
37
+		foreach ($policies as $policy) {
38
+			$this->_policies[$policy->oid()] = $policy;
39
+		}
40
+	}
41 41
     
42
-    /**
43
-     *
44
-     * {@inheritdoc}
45
-     * @return self
46
-     */
47
-    protected static function _fromDER(string $data, bool $critical): self
48
-    {
49
-        $policies = array_map(
50
-            function (UnspecifiedType $el) {
51
-                return PolicyInformation::fromASN1($el->asSequence());
52
-            }, Sequence::fromDER($data)->elements());
53
-        if (!count($policies)) {
54
-            throw new \UnexpectedValueException(
55
-                "certificatePolicies must contain" .
56
-                     " at least one PolicyInformation.");
57
-        }
58
-        return new self($critical, ...$policies);
59
-    }
42
+	/**
43
+	 *
44
+	 * {@inheritdoc}
45
+	 * @return self
46
+	 */
47
+	protected static function _fromDER(string $data, bool $critical): self
48
+	{
49
+		$policies = array_map(
50
+			function (UnspecifiedType $el) {
51
+				return PolicyInformation::fromASN1($el->asSequence());
52
+			}, Sequence::fromDER($data)->elements());
53
+		if (!count($policies)) {
54
+			throw new \UnexpectedValueException(
55
+				"certificatePolicies must contain" .
56
+					 " at least one PolicyInformation.");
57
+		}
58
+		return new self($critical, ...$policies);
59
+	}
60 60
     
61
-    /**
62
-     * Check whether policy information by OID is present.
63
-     *
64
-     * @param string $oid
65
-     * @return bool
66
-     */
67
-    public function has(string $oid): bool
68
-    {
69
-        return isset($this->_policies[$oid]);
70
-    }
61
+	/**
62
+	 * Check whether policy information by OID is present.
63
+	 *
64
+	 * @param string $oid
65
+	 * @return bool
66
+	 */
67
+	public function has(string $oid): bool
68
+	{
69
+		return isset($this->_policies[$oid]);
70
+	}
71 71
     
72
-    /**
73
-     * Get policy information by OID.
74
-     *
75
-     * @param string $oid
76
-     * @throws \LogicException
77
-     * @return PolicyInformation
78
-     */
79
-    public function get(string $oid): PolicyInformation
80
-    {
81
-        if (!$this->has($oid)) {
82
-            throw new \LogicException("Not certificate policy by OID $oid.");
83
-        }
84
-        return $this->_policies[$oid];
85
-    }
72
+	/**
73
+	 * Get policy information by OID.
74
+	 *
75
+	 * @param string $oid
76
+	 * @throws \LogicException
77
+	 * @return PolicyInformation
78
+	 */
79
+	public function get(string $oid): PolicyInformation
80
+	{
81
+		if (!$this->has($oid)) {
82
+			throw new \LogicException("Not certificate policy by OID $oid.");
83
+		}
84
+		return $this->_policies[$oid];
85
+	}
86 86
     
87
-    /**
88
-     * Check whether anyPolicy is present.
89
-     *
90
-     * @return bool
91
-     */
92
-    public function hasAnyPolicy(): bool
93
-    {
94
-        return $this->has(PolicyInformation::OID_ANY_POLICY);
95
-    }
87
+	/**
88
+	 * Check whether anyPolicy is present.
89
+	 *
90
+	 * @return bool
91
+	 */
92
+	public function hasAnyPolicy(): bool
93
+	{
94
+		return $this->has(PolicyInformation::OID_ANY_POLICY);
95
+	}
96 96
     
97
-    /**
98
-     * Get anyPolicy information.
99
-     *
100
-     * @throws \LogicException If anyPolicy is not present.
101
-     * @return PolicyInformation
102
-     */
103
-    public function anyPolicy(): PolicyInformation
104
-    {
105
-        if (!$this->hasAnyPolicy()) {
106
-            throw new \LogicException("No anyPolicy.");
107
-        }
108
-        return $this->get(PolicyInformation::OID_ANY_POLICY);
109
-    }
97
+	/**
98
+	 * Get anyPolicy information.
99
+	 *
100
+	 * @throws \LogicException If anyPolicy is not present.
101
+	 * @return PolicyInformation
102
+	 */
103
+	public function anyPolicy(): PolicyInformation
104
+	{
105
+		if (!$this->hasAnyPolicy()) {
106
+			throw new \LogicException("No anyPolicy.");
107
+		}
108
+		return $this->get(PolicyInformation::OID_ANY_POLICY);
109
+	}
110 110
     
111
-    /**
112
-     *
113
-     * {@inheritdoc}
114
-     * @return Sequence
115
-     */
116
-    protected function _valueASN1(): Sequence
117
-    {
118
-        if (!count($this->_policies)) {
119
-            throw new \LogicException("No policies.");
120
-        }
121
-        $elements = array_map(
122
-            function (PolicyInformation $pi) {
123
-                return $pi->toASN1();
124
-            }, array_values($this->_policies));
125
-        return new Sequence(...$elements);
126
-    }
111
+	/**
112
+	 *
113
+	 * {@inheritdoc}
114
+	 * @return Sequence
115
+	 */
116
+	protected function _valueASN1(): Sequence
117
+	{
118
+		if (!count($this->_policies)) {
119
+			throw new \LogicException("No policies.");
120
+		}
121
+		$elements = array_map(
122
+			function (PolicyInformation $pi) {
123
+				return $pi->toASN1();
124
+			}, array_values($this->_policies));
125
+		return new Sequence(...$elements);
126
+	}
127 127
     
128
-    /**
129
-     * Get the number of policies.
130
-     *
131
-     * @see \Countable::count()
132
-     * @return int
133
-     */
134
-    public function count(): int
135
-    {
136
-        return count($this->_policies);
137
-    }
128
+	/**
129
+	 * Get the number of policies.
130
+	 *
131
+	 * @see \Countable::count()
132
+	 * @return int
133
+	 */
134
+	public function count(): int
135
+	{
136
+		return count($this->_policies);
137
+	}
138 138
     
139
-    /**
140
-     * Get iterator for policy information terms.
141
-     *
142
-     * @see \IteratorAggregate::getIterator()
143
-     * @return \ArrayIterator
144
-     */
145
-    public function getIterator(): \ArrayIterator
146
-    {
147
-        return new \ArrayIterator($this->_policies);
148
-    }
139
+	/**
140
+	 * Get iterator for policy information terms.
141
+	 *
142
+	 * @see \IteratorAggregate::getIterator()
143
+	 * @return \ArrayIterator
144
+	 */
145
+	public function getIterator(): \ArrayIterator
146
+	{
147
+		return new \ArrayIterator($this->_policies);
148
+	}
149 149
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/KeyUsageExtension.php 1 patch
Indentation   +137 added lines, -137 removed lines patch added patch discarded remove patch
@@ -14,155 +14,155 @@
 block discarded – undo
14 14
  */
15 15
 class KeyUsageExtension extends Extension
16 16
 {
17
-    const DIGITAL_SIGNATURE = 0x100;
18
-    const NON_REPUDIATION = 0x080;
19
-    const KEY_ENCIPHERMENT = 0x040;
20
-    const DATA_ENCIPHERMENT = 0x020;
21
-    const KEY_AGREEMENT = 0x010;
22
-    const KEY_CERT_SIGN = 0x008;
23
-    const CRL_SIGN = 0x004;
24
-    const ENCIPHER_ONLY = 0x002;
25
-    const DECIPHER_ONLY = 0x001;
17
+	const DIGITAL_SIGNATURE = 0x100;
18
+	const NON_REPUDIATION = 0x080;
19
+	const KEY_ENCIPHERMENT = 0x040;
20
+	const DATA_ENCIPHERMENT = 0x020;
21
+	const KEY_AGREEMENT = 0x010;
22
+	const KEY_CERT_SIGN = 0x008;
23
+	const CRL_SIGN = 0x004;
24
+	const ENCIPHER_ONLY = 0x002;
25
+	const DECIPHER_ONLY = 0x001;
26 26
     
27
-    /**
28
-     * Key usage flags.
29
-     *
30
-     * @var int $_keyUsage
31
-     */
32
-    protected $_keyUsage;
27
+	/**
28
+	 * Key usage flags.
29
+	 *
30
+	 * @var int $_keyUsage
31
+	 */
32
+	protected $_keyUsage;
33 33
     
34
-    /**
35
-     * Constructor.
36
-     *
37
-     * @param bool $critical
38
-     * @param int $keyUsage
39
-     */
40
-    public function __construct(bool $critical, int $keyUsage)
41
-    {
42
-        parent::__construct(self::OID_KEY_USAGE, $critical);
43
-        $this->_keyUsage = $keyUsage;
44
-    }
34
+	/**
35
+	 * Constructor.
36
+	 *
37
+	 * @param bool $critical
38
+	 * @param int $keyUsage
39
+	 */
40
+	public function __construct(bool $critical, int $keyUsage)
41
+	{
42
+		parent::__construct(self::OID_KEY_USAGE, $critical);
43
+		$this->_keyUsage = $keyUsage;
44
+	}
45 45
     
46
-    /**
47
-     *
48
-     * {@inheritdoc}
49
-     * @return self
50
-     */
51
-    protected static function _fromDER(string $data, bool $critical): self
52
-    {
53
-        return new self($critical,
54
-            Flags::fromBitString(BitString::fromDER($data), 9)->intNumber());
55
-    }
46
+	/**
47
+	 *
48
+	 * {@inheritdoc}
49
+	 * @return self
50
+	 */
51
+	protected static function _fromDER(string $data, bool $critical): self
52
+	{
53
+		return new self($critical,
54
+			Flags::fromBitString(BitString::fromDER($data), 9)->intNumber());
55
+	}
56 56
     
57
-    /**
58
-     * Check whether digitalSignature flag is set.
59
-     *
60
-     * @return bool
61
-     */
62
-    public function isDigitalSignature(): bool
63
-    {
64
-        return $this->_flagSet(self::DIGITAL_SIGNATURE);
65
-    }
57
+	/**
58
+	 * Check whether digitalSignature flag is set.
59
+	 *
60
+	 * @return bool
61
+	 */
62
+	public function isDigitalSignature(): bool
63
+	{
64
+		return $this->_flagSet(self::DIGITAL_SIGNATURE);
65
+	}
66 66
     
67
-    /**
68
-     * Check whether nonRepudiation/contentCommitment flag is set.
69
-     *
70
-     * @return bool
71
-     */
72
-    public function isNonRepudiation(): bool
73
-    {
74
-        return $this->_flagSet(self::NON_REPUDIATION);
75
-    }
67
+	/**
68
+	 * Check whether nonRepudiation/contentCommitment flag is set.
69
+	 *
70
+	 * @return bool
71
+	 */
72
+	public function isNonRepudiation(): bool
73
+	{
74
+		return $this->_flagSet(self::NON_REPUDIATION);
75
+	}
76 76
     
77
-    /**
78
-     * Check whether keyEncipherment flag is set.
79
-     *
80
-     * @return bool
81
-     */
82
-    public function isKeyEncipherment(): bool
83
-    {
84
-        return $this->_flagSet(self::KEY_ENCIPHERMENT);
85
-    }
77
+	/**
78
+	 * Check whether keyEncipherment flag is set.
79
+	 *
80
+	 * @return bool
81
+	 */
82
+	public function isKeyEncipherment(): bool
83
+	{
84
+		return $this->_flagSet(self::KEY_ENCIPHERMENT);
85
+	}
86 86
     
87
-    /**
88
-     * Check whether dataEncipherment flag is set.
89
-     *
90
-     * @return bool
91
-     */
92
-    public function isDataEncipherment(): bool
93
-    {
94
-        return $this->_flagSet(self::DATA_ENCIPHERMENT);
95
-    }
87
+	/**
88
+	 * Check whether dataEncipherment flag is set.
89
+	 *
90
+	 * @return bool
91
+	 */
92
+	public function isDataEncipherment(): bool
93
+	{
94
+		return $this->_flagSet(self::DATA_ENCIPHERMENT);
95
+	}
96 96
     
97
-    /**
98
-     * Check whether keyAgreement flag is set.
99
-     *
100
-     * @return bool
101
-     */
102
-    public function isKeyAgreement(): bool
103
-    {
104
-        return $this->_flagSet(self::KEY_AGREEMENT);
105
-    }
97
+	/**
98
+	 * Check whether keyAgreement flag is set.
99
+	 *
100
+	 * @return bool
101
+	 */
102
+	public function isKeyAgreement(): bool
103
+	{
104
+		return $this->_flagSet(self::KEY_AGREEMENT);
105
+	}
106 106
     
107
-    /**
108
-     * Check whether keyCertSign flag is set.
109
-     *
110
-     * @return bool
111
-     */
112
-    public function isKeyCertSign(): bool
113
-    {
114
-        return $this->_flagSet(self::KEY_CERT_SIGN);
115
-    }
107
+	/**
108
+	 * Check whether keyCertSign flag is set.
109
+	 *
110
+	 * @return bool
111
+	 */
112
+	public function isKeyCertSign(): bool
113
+	{
114
+		return $this->_flagSet(self::KEY_CERT_SIGN);
115
+	}
116 116
     
117
-    /**
118
-     * Check whether cRLSign flag is set.
119
-     *
120
-     * @return bool
121
-     */
122
-    public function isCRLSign(): bool
123
-    {
124
-        return $this->_flagSet(self::CRL_SIGN);
125
-    }
117
+	/**
118
+	 * Check whether cRLSign flag is set.
119
+	 *
120
+	 * @return bool
121
+	 */
122
+	public function isCRLSign(): bool
123
+	{
124
+		return $this->_flagSet(self::CRL_SIGN);
125
+	}
126 126
     
127
-    /**
128
-     * Check whether encipherOnly flag is set.
129
-     *
130
-     * @return bool
131
-     */
132
-    public function isEncipherOnly(): bool
133
-    {
134
-        return $this->_flagSet(self::ENCIPHER_ONLY);
135
-    }
127
+	/**
128
+	 * Check whether encipherOnly flag is set.
129
+	 *
130
+	 * @return bool
131
+	 */
132
+	public function isEncipherOnly(): bool
133
+	{
134
+		return $this->_flagSet(self::ENCIPHER_ONLY);
135
+	}
136 136
     
137
-    /**
138
-     * Check whether decipherOnly flag is set.
139
-     *
140
-     * @return bool
141
-     */
142
-    public function isDecipherOnly(): bool
143
-    {
144
-        return $this->_flagSet(self::DECIPHER_ONLY);
145
-    }
137
+	/**
138
+	 * Check whether decipherOnly flag is set.
139
+	 *
140
+	 * @return bool
141
+	 */
142
+	public function isDecipherOnly(): bool
143
+	{
144
+		return $this->_flagSet(self::DECIPHER_ONLY);
145
+	}
146 146
     
147
-    /**
148
-     * Check whether given flag is set.
149
-     *
150
-     * @param int $flag
151
-     * @return boolean
152
-     */
153
-    protected function _flagSet(int $flag): bool
154
-    {
155
-        return (bool) ($this->_keyUsage & $flag);
156
-    }
147
+	/**
148
+	 * Check whether given flag is set.
149
+	 *
150
+	 * @param int $flag
151
+	 * @return boolean
152
+	 */
153
+	protected function _flagSet(int $flag): bool
154
+	{
155
+		return (bool) ($this->_keyUsage & $flag);
156
+	}
157 157
     
158
-    /**
159
-     *
160
-     * {@inheritdoc}
161
-     * @return BitString
162
-     */
163
-    protected function _valueASN1(): BitString
164
-    {
165
-        $flags = new Flags($this->_keyUsage, 9);
166
-        return $flags->bitString()->withoutTrailingZeroes();
167
-    }
158
+	/**
159
+	 *
160
+	 * {@inheritdoc}
161
+	 * @return BitString
162
+	 */
163
+	protected function _valueASN1(): BitString
164
+	{
165
+		$flags = new Flags($this->_keyUsage, 9);
166
+		return $flags->bitString()->withoutTrailingZeroes();
167
+	}
168 168
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/Target/TargetGroup.php 1 patch
Indentation   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -15,60 +15,60 @@
 block discarded – undo
15 15
  */
16 16
 class TargetGroup extends Target
17 17
 {
18
-    /**
19
-     * Group name.
20
-     *
21
-     * @var GeneralName $_name
22
-     */
23
-    protected $_name;
18
+	/**
19
+	 * Group name.
20
+	 *
21
+	 * @var GeneralName $_name
22
+	 */
23
+	protected $_name;
24 24
     
25
-    /**
26
-     * Constructor.
27
-     *
28
-     * @param GeneralName $name
29
-     */
30
-    public function __construct(GeneralName $name)
31
-    {
32
-        $this->_name = $name;
33
-        $this->_type = self::TYPE_GROUP;
34
-    }
25
+	/**
26
+	 * Constructor.
27
+	 *
28
+	 * @param GeneralName $name
29
+	 */
30
+	public function __construct(GeneralName $name)
31
+	{
32
+		$this->_name = $name;
33
+		$this->_type = self::TYPE_GROUP;
34
+	}
35 35
     
36
-    /**
37
-     *
38
-     * @param TaggedType $el
39
-     * @return self
40
-     */
41
-    public static function fromChosenASN1(TaggedType $el): self
42
-    {
43
-        return new self(GeneralName::fromASN1($el));
44
-    }
36
+	/**
37
+	 *
38
+	 * @param TaggedType $el
39
+	 * @return self
40
+	 */
41
+	public static function fromChosenASN1(TaggedType $el): self
42
+	{
43
+		return new self(GeneralName::fromASN1($el));
44
+	}
45 45
     
46
-    /**
47
-     *
48
-     * {@inheritdoc}
49
-     */
50
-    public function string(): string
51
-    {
52
-        return $this->_name->string();
53
-    }
46
+	/**
47
+	 *
48
+	 * {@inheritdoc}
49
+	 */
50
+	public function string(): string
51
+	{
52
+		return $this->_name->string();
53
+	}
54 54
     
55
-    /**
56
-     * Get group name.
57
-     *
58
-     * @return GeneralName
59
-     */
60
-    public function name(): GeneralName
61
-    {
62
-        return $this->_name;
63
-    }
55
+	/**
56
+	 * Get group name.
57
+	 *
58
+	 * @return GeneralName
59
+	 */
60
+	public function name(): GeneralName
61
+	{
62
+		return $this->_name;
63
+	}
64 64
     
65
-    /**
66
-     *
67
-     * {@inheritdoc}
68
-     * @return ExplicitlyTaggedType
69
-     */
70
-    public function toASN1(): TaggedType
71
-    {
72
-        return new ExplicitlyTaggedType($this->_type, $this->_name->toASN1());
73
-    }
65
+	/**
66
+	 *
67
+	 * {@inheritdoc}
68
+	 * @return ExplicitlyTaggedType
69
+	 */
70
+	public function toASN1(): TaggedType
71
+	{
72
+		return new ExplicitlyTaggedType($this->_type, $this->_name->toASN1());
73
+	}
74 74
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Extension/Target/Targets.php 1 patch
Indentation   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -14,131 +14,131 @@
 block discarded – undo
14 14
  */
15 15
 class Targets implements \Countable, \IteratorAggregate
16 16
 {
17
-    /**
18
-     * Target elements.
19
-     *
20
-     * @var Target[] $_targets
21
-     */
22
-    protected $_targets;
17
+	/**
18
+	 * Target elements.
19
+	 *
20
+	 * @var Target[] $_targets
21
+	 */
22
+	protected $_targets;
23 23
     
24
-    /**
25
-     * Constructor.
26
-     *
27
-     * @param Target ...$targets
28
-     */
29
-    public function __construct(Target ...$targets)
30
-    {
31
-        $this->_targets = $targets;
32
-    }
24
+	/**
25
+	 * Constructor.
26
+	 *
27
+	 * @param Target ...$targets
28
+	 */
29
+	public function __construct(Target ...$targets)
30
+	{
31
+		$this->_targets = $targets;
32
+	}
33 33
     
34
-    /**
35
-     * Initialize from ASN.1.
36
-     *
37
-     * @param Sequence $seq
38
-     * @return self
39
-     */
40
-    public static function fromASN1(Sequence $seq): self
41
-    {
42
-        $targets = array_map(
43
-            function (UnspecifiedType $el) {
44
-                return Target::fromASN1($el->asTagged());
45
-            }, $seq->elements());
46
-        return new self(...$targets);
47
-    }
34
+	/**
35
+	 * Initialize from ASN.1.
36
+	 *
37
+	 * @param Sequence $seq
38
+	 * @return self
39
+	 */
40
+	public static function fromASN1(Sequence $seq): self
41
+	{
42
+		$targets = array_map(
43
+			function (UnspecifiedType $el) {
44
+				return Target::fromASN1($el->asTagged());
45
+			}, $seq->elements());
46
+		return new self(...$targets);
47
+	}
48 48
     
49
-    /**
50
-     * Get all targets.
51
-     *
52
-     * @return Target[]
53
-     */
54
-    public function all(): array
55
-    {
56
-        return $this->_targets;
57
-    }
49
+	/**
50
+	 * Get all targets.
51
+	 *
52
+	 * @return Target[]
53
+	 */
54
+	public function all(): array
55
+	{
56
+		return $this->_targets;
57
+	}
58 58
     
59
-    /**
60
-     * Get all targets of given type.
61
-     *
62
-     * @param int $type
63
-     * @return Target[]
64
-     */
65
-    protected function _allOfType(int $type): array
66
-    {
67
-        return array_values(
68
-            array_filter($this->_targets,
69
-                function (Target $target) use ($type) {
70
-                    return $target->type() == $type;
71
-                }));
72
-    }
59
+	/**
60
+	 * Get all targets of given type.
61
+	 *
62
+	 * @param int $type
63
+	 * @return Target[]
64
+	 */
65
+	protected function _allOfType(int $type): array
66
+	{
67
+		return array_values(
68
+			array_filter($this->_targets,
69
+				function (Target $target) use ($type) {
70
+					return $target->type() == $type;
71
+				}));
72
+	}
73 73
     
74
-    /**
75
-     * Get all name targets.
76
-     *
77
-     * @return Target[]
78
-     */
79
-    public function nameTargets(): array
80
-    {
81
-        return $this->_allOfType(Target::TYPE_NAME);
82
-    }
74
+	/**
75
+	 * Get all name targets.
76
+	 *
77
+	 * @return Target[]
78
+	 */
79
+	public function nameTargets(): array
80
+	{
81
+		return $this->_allOfType(Target::TYPE_NAME);
82
+	}
83 83
     
84
-    /**
85
-     * Get all group targets.
86
-     *
87
-     * @return Target[]
88
-     */
89
-    public function groupTargets(): array
90
-    {
91
-        return $this->_allOfType(Target::TYPE_GROUP);
92
-    }
84
+	/**
85
+	 * Get all group targets.
86
+	 *
87
+	 * @return Target[]
88
+	 */
89
+	public function groupTargets(): array
90
+	{
91
+		return $this->_allOfType(Target::TYPE_GROUP);
92
+	}
93 93
     
94
-    /**
95
-     * Check whether given target is present.
96
-     *
97
-     * @param Target $target
98
-     * @return boolean
99
-     */
100
-    public function hasTarget(Target $target): bool
101
-    {
102
-        foreach ($this->_allOfType($target->type()) as $t) {
103
-            if ($target->equals($t)) {
104
-                return true;
105
-            }
106
-        }
107
-        return false;
108
-    }
94
+	/**
95
+	 * Check whether given target is present.
96
+	 *
97
+	 * @param Target $target
98
+	 * @return boolean
99
+	 */
100
+	public function hasTarget(Target $target): bool
101
+	{
102
+		foreach ($this->_allOfType($target->type()) as $t) {
103
+			if ($target->equals($t)) {
104
+				return true;
105
+			}
106
+		}
107
+		return false;
108
+	}
109 109
     
110
-    /**
111
-     * Generate ASN.1 structure.
112
-     *
113
-     * @return Sequence
114
-     */
115
-    public function toASN1(): Sequence
116
-    {
117
-        $elements = array_map(
118
-            function (Target $target) {
119
-                return $target->toASN1();
120
-            }, $this->_targets);
121
-        return new Sequence(...$elements);
122
-    }
110
+	/**
111
+	 * Generate ASN.1 structure.
112
+	 *
113
+	 * @return Sequence
114
+	 */
115
+	public function toASN1(): Sequence
116
+	{
117
+		$elements = array_map(
118
+			function (Target $target) {
119
+				return $target->toASN1();
120
+			}, $this->_targets);
121
+		return new Sequence(...$elements);
122
+	}
123 123
     
124
-    /**
125
-     *
126
-     * @see \Countable::count()
127
-     * @return int
128
-     */
129
-    public function count(): int
130
-    {
131
-        return count($this->_targets);
132
-    }
124
+	/**
125
+	 *
126
+	 * @see \Countable::count()
127
+	 * @return int
128
+	 */
129
+	public function count(): int
130
+	{
131
+		return count($this->_targets);
132
+	}
133 133
     
134
-    /**
135
-     * Get iterator for targets.
136
-     *
137
-     * @see \IteratorAggregate::getIterator()
138
-     * @return \ArrayIterator
139
-     */
140
-    public function getIterator(): \ArrayIterator
141
-    {
142
-        return new \ArrayIterator($this->_targets);
143
-    }
134
+	/**
135
+	 * Get iterator for targets.
136
+	 *
137
+	 * @see \IteratorAggregate::getIterator()
138
+	 * @return \ArrayIterator
139
+	 */
140
+	public function getIterator(): \ArrayIterator
141
+	{
142
+		return new \ArrayIterator($this->_targets);
143
+	}
144 144
 }
Please login to merge, or discard this patch.