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.
Passed
Push — master ( f7ba31...da62d3 )
by Joni
02:58
created
lib/X509/Certificate/Extension/FreshestCRLExtension.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -13,16 +13,16 @@
 block discarded – undo
13 13
  */
14 14
 class FreshestCRLExtension extends CRLDistributionPointsExtension
15 15
 {
16
-    /**
17
-     * Constructor.
18
-     *
19
-     * @param bool $critical
20
-     * @param DistributionPoint ...$distribution_points
21
-     */
22
-    public function __construct(bool $critical,
23
-        DistributionPoint ...$distribution_points)
24
-    {
25
-        Extension::__construct(self::OID_FRESHEST_CRL, $critical);
26
-        $this->_distributionPoints = $distribution_points;
27
-    }
16
+	/**
17
+	 * Constructor.
18
+	 *
19
+	 * @param bool $critical
20
+	 * @param DistributionPoint ...$distribution_points
21
+	 */
22
+	public function __construct(bool $critical,
23
+		DistributionPoint ...$distribution_points)
24
+	{
25
+		Extension::__construct(self::OID_FRESHEST_CRL, $critical);
26
+		$this->_distributionPoints = $distribution_points;
27
+	}
28 28
 }
Please login to merge, or discard this patch.
lib/X509/Certificate/Time.php 2 patches
Switch Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -89,16 +89,16 @@
 block discarded – undo
89 89
     {
90 90
         $dt = $this->_dt;
91 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);
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 102
         }
103 103
         throw new \UnexpectedValueException(
104 104
             "Time type " . Element::tagToName($this->_type) . " not supported.");
Please login to merge, or discard this 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/CertificationPath/PathValidation/PathValidationResult.php 1 patch
Indentation   +74 added lines, -74 removed lines patch added patch discarded remove patch
@@ -16,85 +16,85 @@
 block discarded – undo
16 16
  */
17 17
 class PathValidationResult
18 18
 {
19
-    /**
20
-     * Certificates in a certification path.
21
-     *
22
-     * @var \X509\Certificate\Certificate[] $_certificates
23
-     */
24
-    protected $_certificates;
19
+	/**
20
+	 * Certificates in a certification path.
21
+	 *
22
+	 * @var \X509\Certificate\Certificate[] $_certificates
23
+	 */
24
+	protected $_certificates;
25 25
     
26
-    /**
27
-     * Valid policy tree.
28
-     *
29
-     * @var \X509\CertificationPath\Policy\PolicyTree|null $_policyTree
30
-     */
31
-    protected $_policyTree;
26
+	/**
27
+	 * Valid policy tree.
28
+	 *
29
+	 * @var \X509\CertificationPath\Policy\PolicyTree|null $_policyTree
30
+	 */
31
+	protected $_policyTree;
32 32
     
33
-    /**
34
-     * End-entity certificate's public key.
35
-     *
36
-     * @var PublicKeyInfo
37
-     */
38
-    protected $_publicKeyInfo;
33
+	/**
34
+	 * End-entity certificate's public key.
35
+	 *
36
+	 * @var PublicKeyInfo
37
+	 */
38
+	protected $_publicKeyInfo;
39 39
     
40
-    /**
41
-     * Public key algorithm.
42
-     *
43
-     * @var AlgorithmIdentifierType
44
-     */
45
-    protected $_publicKeyAlgo;
40
+	/**
41
+	 * Public key algorithm.
42
+	 *
43
+	 * @var AlgorithmIdentifierType
44
+	 */
45
+	protected $_publicKeyAlgo;
46 46
     
47
-    /**
48
-     * Public key parameters.
49
-     *
50
-     * @var Element|null $_publicKeyParameters
51
-     */
52
-    protected $_publicKeyParameters;
47
+	/**
48
+	 * Public key parameters.
49
+	 *
50
+	 * @var Element|null $_publicKeyParameters
51
+	 */
52
+	protected $_publicKeyParameters;
53 53
     
54
-    /**
55
-     * Constructor.
56
-     *
57
-     * @param \X509\Certificate\Certificate[] $certificates Certificates in a
58
-     *        certification path
59
-     * @param \X509\CertificationPath\Policy\PolicyTree|null $policy_tree Valid
60
-     *        policy tree
61
-     * @param PublicKeyInfo $pubkey_info Public key of the end-entity
62
-     *        certificate
63
-     * @param AlgorithmIdentifierType $algo Public key algorithm of the
64
-     *        end-entity certificate
65
-     * @param Element|null $params Algorithm parameters
66
-     */
67
-    public function __construct(array $certificates, $policy_tree,
68
-        PublicKeyInfo $pubkey_info, AlgorithmIdentifierType $algo,
69
-        Element $params = null)
70
-    {
71
-        $this->_certificates = array_values($certificates);
72
-        $this->_policyTree = $policy_tree;
73
-        $this->_publicKeyInfo = $pubkey_info;
74
-        $this->_publicKeyAlgo = $algo;
75
-        $this->_publicKeyParameters = $params;
76
-    }
54
+	/**
55
+	 * Constructor.
56
+	 *
57
+	 * @param \X509\Certificate\Certificate[] $certificates Certificates in a
58
+	 *        certification path
59
+	 * @param \X509\CertificationPath\Policy\PolicyTree|null $policy_tree Valid
60
+	 *        policy tree
61
+	 * @param PublicKeyInfo $pubkey_info Public key of the end-entity
62
+	 *        certificate
63
+	 * @param AlgorithmIdentifierType $algo Public key algorithm of the
64
+	 *        end-entity certificate
65
+	 * @param Element|null $params Algorithm parameters
66
+	 */
67
+	public function __construct(array $certificates, $policy_tree,
68
+		PublicKeyInfo $pubkey_info, AlgorithmIdentifierType $algo,
69
+		Element $params = null)
70
+	{
71
+		$this->_certificates = array_values($certificates);
72
+		$this->_policyTree = $policy_tree;
73
+		$this->_publicKeyInfo = $pubkey_info;
74
+		$this->_publicKeyAlgo = $algo;
75
+		$this->_publicKeyParameters = $params;
76
+	}
77 77
     
78
-    /**
79
-     * Get end-entity certificate.
80
-     *
81
-     * @return \X509\Certificate\Certificate
82
-     */
83
-    public function certificate(): Certificate
84
-    {
85
-        return $this->_certificates[count($this->_certificates) - 1];
86
-    }
78
+	/**
79
+	 * Get end-entity certificate.
80
+	 *
81
+	 * @return \X509\Certificate\Certificate
82
+	 */
83
+	public function certificate(): Certificate
84
+	{
85
+		return $this->_certificates[count($this->_certificates) - 1];
86
+	}
87 87
     
88
-    /**
89
-     * Get certificate policies of the end-entity certificate.
90
-     *
91
-     * @return \X509\Certificate\Extension\CertificatePolicy\PolicyInformation[]
92
-     */
93
-    public function policies(): array
94
-    {
95
-        if (!$this->_policyTree) {
96
-            return array();
97
-        }
98
-        return $this->_policyTree->policiesAtDepth(count($this->_certificates));
99
-    }
88
+	/**
89
+	 * Get certificate policies of the end-entity certificate.
90
+	 *
91
+	 * @return \X509\Certificate\Extension\CertificatePolicy\PolicyInformation[]
92
+	 */
93
+	public function policies(): array
94
+	{
95
+		if (!$this->_policyTree) {
96
+			return array();
97
+		}
98
+		return $this->_policyTree->policiesAtDepth(count($this->_certificates));
99
+	}
100 100
 }
Please login to merge, or discard this patch.
lib/X509/AttributeCertificate/AttributeCertificateInfo.php 2 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -273,6 +273,7 @@
 block discarded – undo
273 273
      * Get self with extensions added.
274 274
      *
275 275
      * @param Extension ...$exts One or more Extension objects
276
+     * @param Extension[] $exts
276 277
      * @return self
277 278
      */
278 279
     public function withAdditionalExtensions(Extension ...$exts): self
Please login to merge, or discard this patch.
Indentation   +431 added lines, -431 removed lines patch added patch discarded remove patch
@@ -22,435 +22,435 @@
 block discarded – undo
22 22
  */
23 23
 class AttributeCertificateInfo
24 24
 {
25
-    const VERSION_2 = 1;
26
-    
27
-    /**
28
-     * AC version.
29
-     *
30
-     * @var int $_version
31
-     */
32
-    protected $_version;
33
-    
34
-    /**
35
-     * AC holder.
36
-     *
37
-     * @var Holder $_holder
38
-     */
39
-    protected $_holder;
40
-    
41
-    /**
42
-     * AC issuer.
43
-     *
44
-     * @var AttCertIssuer $_issuer
45
-     */
46
-    protected $_issuer;
47
-    
48
-    /**
49
-     * Signature algorithm identifier.
50
-     *
51
-     * @var SignatureAlgorithmIdentifier $_signature
52
-     */
53
-    protected $_signature;
54
-    
55
-    /**
56
-     * AC serial number.
57
-     *
58
-     * @var string $_serialNumber
59
-     */
60
-    protected $_serialNumber;
61
-    
62
-    /**
63
-     * Validity period.
64
-     *
65
-     * @var AttCertValidityPeriod $_attrCertValidityPeriod
66
-     */
67
-    protected $_attrCertValidityPeriod;
68
-    
69
-    /**
70
-     * Attributes.
71
-     *
72
-     * @var Attributes $_attributes
73
-     */
74
-    protected $_attributes;
75
-    
76
-    /**
77
-     * Issuer unique identifier.
78
-     *
79
-     * @var UniqueIdentifier|null $_issuerUniqueID
80
-     */
81
-    protected $_issuerUniqueID;
82
-    
83
-    /**
84
-     * Extensions.
85
-     *
86
-     * @var Extensions $_extensions
87
-     */
88
-    protected $_extensions;
89
-    
90
-    /**
91
-     * Constructor.
92
-     *
93
-     * @param Holder $holder AC holder
94
-     * @param AttCertIssuer $issuer AC issuer
95
-     * @param AttCertValidityPeriod $validity Validity
96
-     * @param Attributes $attribs Attributes
97
-     */
98
-    public function __construct(Holder $holder, AttCertIssuer $issuer,
99
-        AttCertValidityPeriod $validity, Attributes $attribs)
100
-    {
101
-        $this->_version = self::VERSION_2;
102
-        $this->_holder = $holder;
103
-        $this->_issuer = $issuer;
104
-        $this->_attrCertValidityPeriod = $validity;
105
-        $this->_attributes = $attribs;
106
-        $this->_extensions = new Extensions();
107
-    }
108
-    
109
-    /**
110
-     * Initialize from ASN.1.
111
-     *
112
-     * @param Sequence $seq
113
-     * @throws \UnexpectedValueException
114
-     * @return self
115
-     */
116
-    public static function fromASN1(Sequence $seq): self
117
-    {
118
-        $version = $seq->at(0)
119
-            ->asInteger()
120
-            ->intNumber();
121
-        if ($version != self::VERSION_2) {
122
-            throw new \UnexpectedValueException("Version must be 2.");
123
-        }
124
-        $holder = Holder::fromASN1($seq->at(1)->asSequence());
125
-        $issuer = AttCertIssuer::fromASN1($seq->at(2));
126
-        $signature = AlgorithmIdentifier::fromASN1($seq->at(3)->asSequence());
127
-        if (!$signature instanceof SignatureAlgorithmIdentifier) {
128
-            throw new \UnexpectedValueException(
129
-                "Unsupported signature algorithm " . $signature->oid() . ".");
130
-        }
131
-        $serial = $seq->at(4)
132
-            ->asInteger()
133
-            ->number();
134
-        $validity = AttCertValidityPeriod::fromASN1($seq->at(5)->asSequence());
135
-        $attribs = Attributes::fromASN1($seq->at(6)->asSequence());
136
-        $obj = new self($holder, $issuer, $validity, $attribs);
137
-        $obj->_signature = $signature;
138
-        $obj->_serialNumber = $serial;
139
-        $idx = 7;
140
-        if ($seq->has($idx, Element::TYPE_BIT_STRING)) {
141
-            $obj->_issuerUniqueID = UniqueIdentifier::fromASN1(
142
-                $seq->at($idx++)->asBitString());
143
-        }
144
-        if ($seq->has($idx, Element::TYPE_SEQUENCE)) {
145
-            $obj->_extensions = Extensions::fromASN1(
146
-                $seq->at($idx++)->asSequence());
147
-        }
148
-        return $obj;
149
-    }
150
-    
151
-    /**
152
-     * Get self with holder.
153
-     *
154
-     * @param Holder $holder
155
-     * @return self
156
-     */
157
-    public function withHolder(Holder $holder): self
158
-    {
159
-        $obj = clone $this;
160
-        $obj->_holder = $holder;
161
-        return $obj;
162
-    }
163
-    
164
-    /**
165
-     * Get self with issuer.
166
-     *
167
-     * @param AttCertIssuer $issuer
168
-     * @return self
169
-     */
170
-    public function withIssuer(AttCertIssuer $issuer): self
171
-    {
172
-        $obj = clone $this;
173
-        $obj->_issuer = $issuer;
174
-        return $obj;
175
-    }
176
-    
177
-    /**
178
-     * Get self with signature algorithm identifier.
179
-     *
180
-     * @param SignatureAlgorithmIdentifier $algo
181
-     * @return self
182
-     */
183
-    public function withSignature(SignatureAlgorithmIdentifier $algo): self
184
-    {
185
-        $obj = clone $this;
186
-        $obj->_signature = $algo;
187
-        return $obj;
188
-    }
189
-    
190
-    /**
191
-     * Get self with serial number.
192
-     *
193
-     * @param int|string $serial
194
-     * @return self
195
-     */
196
-    public function withSerialNumber($serial): self
197
-    {
198
-        $obj = clone $this;
199
-        $obj->_serialNumber = strval($serial);
200
-        return $obj;
201
-    }
202
-    
203
-    /**
204
-     * Get self with random positive serial number.
205
-     *
206
-     * @param int $size Number of random bytes
207
-     * @return self
208
-     */
209
-    public function withRandomSerialNumber(int $size = 16): self
210
-    {
211
-        // ensure that first byte is always non-zero and having first bit unset
212
-        $num = gmp_init(mt_rand(1, 0x7f), 10);
213
-        for ($i = 1; $i < $size; ++$i) {
214
-            $num <<= 8;
215
-            $num += mt_rand(0, 0xff);
216
-        }
217
-        return $this->withSerialNumber(gmp_strval($num, 10));
218
-    }
219
-    
220
-    /**
221
-     * Get self with validity period.
222
-     *
223
-     * @param AttCertValidityPeriod $validity
224
-     * @return self
225
-     */
226
-    public function withValidity(AttCertValidityPeriod $validity): self
227
-    {
228
-        $obj = clone $this;
229
-        $obj->_attrCertValidityPeriod = $validity;
230
-        return $obj;
231
-    }
232
-    
233
-    /**
234
-     * Get self with attributes.
235
-     *
236
-     * @param Attributes $attribs
237
-     * @return self
238
-     */
239
-    public function withAttributes(Attributes $attribs): self
240
-    {
241
-        $obj = clone $this;
242
-        $obj->_attributes = $attribs;
243
-        return $obj;
244
-    }
245
-    
246
-    /**
247
-     * Get self with issuer unique identifier.
248
-     *
249
-     * @param UniqueIdentifier $uid
250
-     * @return self
251
-     */
252
-    public function withIssuerUniqueID(UniqueIdentifier $uid): self
253
-    {
254
-        $obj = clone $this;
255
-        $obj->_issuerUniqueID = $uid;
256
-        return $obj;
257
-    }
258
-    
259
-    /**
260
-     * Get self with extensions.
261
-     *
262
-     * @param Extensions $extensions
263
-     * @return self
264
-     */
265
-    public function withExtensions(Extensions $extensions): self
266
-    {
267
-        $obj = clone $this;
268
-        $obj->_extensions = $extensions;
269
-        return $obj;
270
-    }
271
-    
272
-    /**
273
-     * Get self with extensions added.
274
-     *
275
-     * @param Extension ...$exts One or more Extension objects
276
-     * @return self
277
-     */
278
-    public function withAdditionalExtensions(Extension ...$exts): self
279
-    {
280
-        $obj = clone $this;
281
-        $obj->_extensions = $obj->_extensions->withExtensions(...$exts);
282
-        return $obj;
283
-    }
284
-    
285
-    /**
286
-     * Get version.
287
-     *
288
-     * @return int
289
-     */
290
-    public function version(): int
291
-    {
292
-        return $this->_version;
293
-    }
294
-    
295
-    /**
296
-     * Get AC holder.
297
-     *
298
-     * @return Holder
299
-     */
300
-    public function holder(): Holder
301
-    {
302
-        return $this->_holder;
303
-    }
304
-    
305
-    /**
306
-     * Get AC issuer.
307
-     *
308
-     * @return AttCertIssuer
309
-     */
310
-    public function issuer(): AttCertIssuer
311
-    {
312
-        return $this->_issuer;
313
-    }
314
-    
315
-    /**
316
-     * Check whether signature is set.
317
-     *
318
-     * @return bool
319
-     */
320
-    public function hasSignature(): bool
321
-    {
322
-        return isset($this->_signature);
323
-    }
324
-    
325
-    /**
326
-     * Get signature algorithm identifier.
327
-     *
328
-     * @return SignatureAlgorithmIdentifier
329
-     */
330
-    public function signature(): SignatureAlgorithmIdentifier
331
-    {
332
-        if (!$this->hasSignature()) {
333
-            throw new \LogicException("signature not set.");
334
-        }
335
-        return $this->_signature;
336
-    }
337
-    
338
-    /**
339
-     * Check whether serial number is present.
340
-     *
341
-     * @return bool
342
-     */
343
-    public function hasSerialNumber(): bool
344
-    {
345
-        return isset($this->_serialNumber);
346
-    }
347
-    
348
-    /**
349
-     * Get AC serial number.
350
-     *
351
-     * @return string
352
-     */
353
-    public function serialNumber(): string
354
-    {
355
-        if (!$this->hasSerialNumber()) {
356
-            throw new \LogicException("serialNumber not set.");
357
-        }
358
-        return $this->_serialNumber;
359
-    }
360
-    
361
-    /**
362
-     * Get validity period.
363
-     *
364
-     * @return AttCertValidityPeriod
365
-     */
366
-    public function validityPeriod(): AttCertValidityPeriod
367
-    {
368
-        return $this->_attrCertValidityPeriod;
369
-    }
370
-    
371
-    /**
372
-     * Get attributes.
373
-     *
374
-     * @return Attributes
375
-     */
376
-    public function attributes(): Attributes
377
-    {
378
-        return $this->_attributes;
379
-    }
380
-    
381
-    /**
382
-     * Check whether issuer unique identifier is present.
383
-     *
384
-     * @return bool
385
-     */
386
-    public function hasIssuerUniqueID(): bool
387
-    {
388
-        return isset($this->_issuerUniqueID);
389
-    }
390
-    
391
-    /**
392
-     * Get issuer unique identifier.
393
-     *
394
-     * @return UniqueIdentifier
395
-     */
396
-    public function issuerUniqueID(): UniqueIdentifier
397
-    {
398
-        if (!$this->hasIssuerUniqueID()) {
399
-            throw new \LogicException("issuerUniqueID not set.");
400
-        }
401
-        return $this->_issuerUniqueID;
402
-    }
403
-    
404
-    /**
405
-     * Get extensions.
406
-     *
407
-     * @return Extensions
408
-     */
409
-    public function extensions(): Extensions
410
-    {
411
-        return $this->_extensions;
412
-    }
413
-    
414
-    /**
415
-     * Get ASN.1 structure.
416
-     *
417
-     * @return Sequence
418
-     */
419
-    public function toASN1(): Sequence
420
-    {
421
-        $elements = array(new Integer($this->_version), $this->_holder->toASN1(),
422
-            $this->_issuer->toASN1(), $this->signature()->toASN1(),
423
-            new Integer($this->serialNumber()),
424
-            $this->_attrCertValidityPeriod->toASN1(),
425
-            $this->_attributes->toASN1());
426
-        if (isset($this->_issuerUniqueID)) {
427
-            $elements[] = $this->_issuerUniqueID->toASN1();
428
-        }
429
-        if (count($this->_extensions)) {
430
-            $elements[] = $this->_extensions->toASN1();
431
-        }
432
-        return new Sequence(...$elements);
433
-    }
434
-    
435
-    /**
436
-     * Create signed attribute certificate.
437
-     *
438
-     * @param SignatureAlgorithmIdentifier $algo Signature algorithm
439
-     * @param PrivateKeyInfo $privkey_info Private key
440
-     * @param Crypto|null $crypto Crypto engine, use default if not set
441
-     * @return AttributeCertificate
442
-     */
443
-    public function sign(SignatureAlgorithmIdentifier $algo,
444
-        PrivateKeyInfo $privkey_info, Crypto $crypto = null): AttributeCertificate
445
-    {
446
-        $crypto = $crypto ?: Crypto::getDefault();
447
-        $aci = clone $this;
448
-        if (!isset($aci->_serialNumber)) {
449
-            $aci->_serialNumber = "0";
450
-        }
451
-        $aci->_signature = $algo;
452
-        $data = $aci->toASN1()->toDER();
453
-        $signature = $crypto->sign($data, $privkey_info, $algo);
454
-        return new AttributeCertificate($aci, $algo, $signature);
455
-    }
25
+	const VERSION_2 = 1;
26
+    
27
+	/**
28
+	 * AC version.
29
+	 *
30
+	 * @var int $_version
31
+	 */
32
+	protected $_version;
33
+    
34
+	/**
35
+	 * AC holder.
36
+	 *
37
+	 * @var Holder $_holder
38
+	 */
39
+	protected $_holder;
40
+    
41
+	/**
42
+	 * AC issuer.
43
+	 *
44
+	 * @var AttCertIssuer $_issuer
45
+	 */
46
+	protected $_issuer;
47
+    
48
+	/**
49
+	 * Signature algorithm identifier.
50
+	 *
51
+	 * @var SignatureAlgorithmIdentifier $_signature
52
+	 */
53
+	protected $_signature;
54
+    
55
+	/**
56
+	 * AC serial number.
57
+	 *
58
+	 * @var string $_serialNumber
59
+	 */
60
+	protected $_serialNumber;
61
+    
62
+	/**
63
+	 * Validity period.
64
+	 *
65
+	 * @var AttCertValidityPeriod $_attrCertValidityPeriod
66
+	 */
67
+	protected $_attrCertValidityPeriod;
68
+    
69
+	/**
70
+	 * Attributes.
71
+	 *
72
+	 * @var Attributes $_attributes
73
+	 */
74
+	protected $_attributes;
75
+    
76
+	/**
77
+	 * Issuer unique identifier.
78
+	 *
79
+	 * @var UniqueIdentifier|null $_issuerUniqueID
80
+	 */
81
+	protected $_issuerUniqueID;
82
+    
83
+	/**
84
+	 * Extensions.
85
+	 *
86
+	 * @var Extensions $_extensions
87
+	 */
88
+	protected $_extensions;
89
+    
90
+	/**
91
+	 * Constructor.
92
+	 *
93
+	 * @param Holder $holder AC holder
94
+	 * @param AttCertIssuer $issuer AC issuer
95
+	 * @param AttCertValidityPeriod $validity Validity
96
+	 * @param Attributes $attribs Attributes
97
+	 */
98
+	public function __construct(Holder $holder, AttCertIssuer $issuer,
99
+		AttCertValidityPeriod $validity, Attributes $attribs)
100
+	{
101
+		$this->_version = self::VERSION_2;
102
+		$this->_holder = $holder;
103
+		$this->_issuer = $issuer;
104
+		$this->_attrCertValidityPeriod = $validity;
105
+		$this->_attributes = $attribs;
106
+		$this->_extensions = new Extensions();
107
+	}
108
+    
109
+	/**
110
+	 * Initialize from ASN.1.
111
+	 *
112
+	 * @param Sequence $seq
113
+	 * @throws \UnexpectedValueException
114
+	 * @return self
115
+	 */
116
+	public static function fromASN1(Sequence $seq): self
117
+	{
118
+		$version = $seq->at(0)
119
+			->asInteger()
120
+			->intNumber();
121
+		if ($version != self::VERSION_2) {
122
+			throw new \UnexpectedValueException("Version must be 2.");
123
+		}
124
+		$holder = Holder::fromASN1($seq->at(1)->asSequence());
125
+		$issuer = AttCertIssuer::fromASN1($seq->at(2));
126
+		$signature = AlgorithmIdentifier::fromASN1($seq->at(3)->asSequence());
127
+		if (!$signature instanceof SignatureAlgorithmIdentifier) {
128
+			throw new \UnexpectedValueException(
129
+				"Unsupported signature algorithm " . $signature->oid() . ".");
130
+		}
131
+		$serial = $seq->at(4)
132
+			->asInteger()
133
+			->number();
134
+		$validity = AttCertValidityPeriod::fromASN1($seq->at(5)->asSequence());
135
+		$attribs = Attributes::fromASN1($seq->at(6)->asSequence());
136
+		$obj = new self($holder, $issuer, $validity, $attribs);
137
+		$obj->_signature = $signature;
138
+		$obj->_serialNumber = $serial;
139
+		$idx = 7;
140
+		if ($seq->has($idx, Element::TYPE_BIT_STRING)) {
141
+			$obj->_issuerUniqueID = UniqueIdentifier::fromASN1(
142
+				$seq->at($idx++)->asBitString());
143
+		}
144
+		if ($seq->has($idx, Element::TYPE_SEQUENCE)) {
145
+			$obj->_extensions = Extensions::fromASN1(
146
+				$seq->at($idx++)->asSequence());
147
+		}
148
+		return $obj;
149
+	}
150
+    
151
+	/**
152
+	 * Get self with holder.
153
+	 *
154
+	 * @param Holder $holder
155
+	 * @return self
156
+	 */
157
+	public function withHolder(Holder $holder): self
158
+	{
159
+		$obj = clone $this;
160
+		$obj->_holder = $holder;
161
+		return $obj;
162
+	}
163
+    
164
+	/**
165
+	 * Get self with issuer.
166
+	 *
167
+	 * @param AttCertIssuer $issuer
168
+	 * @return self
169
+	 */
170
+	public function withIssuer(AttCertIssuer $issuer): self
171
+	{
172
+		$obj = clone $this;
173
+		$obj->_issuer = $issuer;
174
+		return $obj;
175
+	}
176
+    
177
+	/**
178
+	 * Get self with signature algorithm identifier.
179
+	 *
180
+	 * @param SignatureAlgorithmIdentifier $algo
181
+	 * @return self
182
+	 */
183
+	public function withSignature(SignatureAlgorithmIdentifier $algo): self
184
+	{
185
+		$obj = clone $this;
186
+		$obj->_signature = $algo;
187
+		return $obj;
188
+	}
189
+    
190
+	/**
191
+	 * Get self with serial number.
192
+	 *
193
+	 * @param int|string $serial
194
+	 * @return self
195
+	 */
196
+	public function withSerialNumber($serial): self
197
+	{
198
+		$obj = clone $this;
199
+		$obj->_serialNumber = strval($serial);
200
+		return $obj;
201
+	}
202
+    
203
+	/**
204
+	 * Get self with random positive serial number.
205
+	 *
206
+	 * @param int $size Number of random bytes
207
+	 * @return self
208
+	 */
209
+	public function withRandomSerialNumber(int $size = 16): self
210
+	{
211
+		// ensure that first byte is always non-zero and having first bit unset
212
+		$num = gmp_init(mt_rand(1, 0x7f), 10);
213
+		for ($i = 1; $i < $size; ++$i) {
214
+			$num <<= 8;
215
+			$num += mt_rand(0, 0xff);
216
+		}
217
+		return $this->withSerialNumber(gmp_strval($num, 10));
218
+	}
219
+    
220
+	/**
221
+	 * Get self with validity period.
222
+	 *
223
+	 * @param AttCertValidityPeriod $validity
224
+	 * @return self
225
+	 */
226
+	public function withValidity(AttCertValidityPeriod $validity): self
227
+	{
228
+		$obj = clone $this;
229
+		$obj->_attrCertValidityPeriod = $validity;
230
+		return $obj;
231
+	}
232
+    
233
+	/**
234
+	 * Get self with attributes.
235
+	 *
236
+	 * @param Attributes $attribs
237
+	 * @return self
238
+	 */
239
+	public function withAttributes(Attributes $attribs): self
240
+	{
241
+		$obj = clone $this;
242
+		$obj->_attributes = $attribs;
243
+		return $obj;
244
+	}
245
+    
246
+	/**
247
+	 * Get self with issuer unique identifier.
248
+	 *
249
+	 * @param UniqueIdentifier $uid
250
+	 * @return self
251
+	 */
252
+	public function withIssuerUniqueID(UniqueIdentifier $uid): self
253
+	{
254
+		$obj = clone $this;
255
+		$obj->_issuerUniqueID = $uid;
256
+		return $obj;
257
+	}
258
+    
259
+	/**
260
+	 * Get self with extensions.
261
+	 *
262
+	 * @param Extensions $extensions
263
+	 * @return self
264
+	 */
265
+	public function withExtensions(Extensions $extensions): self
266
+	{
267
+		$obj = clone $this;
268
+		$obj->_extensions = $extensions;
269
+		return $obj;
270
+	}
271
+    
272
+	/**
273
+	 * Get self with extensions added.
274
+	 *
275
+	 * @param Extension ...$exts One or more Extension objects
276
+	 * @return self
277
+	 */
278
+	public function withAdditionalExtensions(Extension ...$exts): self
279
+	{
280
+		$obj = clone $this;
281
+		$obj->_extensions = $obj->_extensions->withExtensions(...$exts);
282
+		return $obj;
283
+	}
284
+    
285
+	/**
286
+	 * Get version.
287
+	 *
288
+	 * @return int
289
+	 */
290
+	public function version(): int
291
+	{
292
+		return $this->_version;
293
+	}
294
+    
295
+	/**
296
+	 * Get AC holder.
297
+	 *
298
+	 * @return Holder
299
+	 */
300
+	public function holder(): Holder
301
+	{
302
+		return $this->_holder;
303
+	}
304
+    
305
+	/**
306
+	 * Get AC issuer.
307
+	 *
308
+	 * @return AttCertIssuer
309
+	 */
310
+	public function issuer(): AttCertIssuer
311
+	{
312
+		return $this->_issuer;
313
+	}
314
+    
315
+	/**
316
+	 * Check whether signature is set.
317
+	 *
318
+	 * @return bool
319
+	 */
320
+	public function hasSignature(): bool
321
+	{
322
+		return isset($this->_signature);
323
+	}
324
+    
325
+	/**
326
+	 * Get signature algorithm identifier.
327
+	 *
328
+	 * @return SignatureAlgorithmIdentifier
329
+	 */
330
+	public function signature(): SignatureAlgorithmIdentifier
331
+	{
332
+		if (!$this->hasSignature()) {
333
+			throw new \LogicException("signature not set.");
334
+		}
335
+		return $this->_signature;
336
+	}
337
+    
338
+	/**
339
+	 * Check whether serial number is present.
340
+	 *
341
+	 * @return bool
342
+	 */
343
+	public function hasSerialNumber(): bool
344
+	{
345
+		return isset($this->_serialNumber);
346
+	}
347
+    
348
+	/**
349
+	 * Get AC serial number.
350
+	 *
351
+	 * @return string
352
+	 */
353
+	public function serialNumber(): string
354
+	{
355
+		if (!$this->hasSerialNumber()) {
356
+			throw new \LogicException("serialNumber not set.");
357
+		}
358
+		return $this->_serialNumber;
359
+	}
360
+    
361
+	/**
362
+	 * Get validity period.
363
+	 *
364
+	 * @return AttCertValidityPeriod
365
+	 */
366
+	public function validityPeriod(): AttCertValidityPeriod
367
+	{
368
+		return $this->_attrCertValidityPeriod;
369
+	}
370
+    
371
+	/**
372
+	 * Get attributes.
373
+	 *
374
+	 * @return Attributes
375
+	 */
376
+	public function attributes(): Attributes
377
+	{
378
+		return $this->_attributes;
379
+	}
380
+    
381
+	/**
382
+	 * Check whether issuer unique identifier is present.
383
+	 *
384
+	 * @return bool
385
+	 */
386
+	public function hasIssuerUniqueID(): bool
387
+	{
388
+		return isset($this->_issuerUniqueID);
389
+	}
390
+    
391
+	/**
392
+	 * Get issuer unique identifier.
393
+	 *
394
+	 * @return UniqueIdentifier
395
+	 */
396
+	public function issuerUniqueID(): UniqueIdentifier
397
+	{
398
+		if (!$this->hasIssuerUniqueID()) {
399
+			throw new \LogicException("issuerUniqueID not set.");
400
+		}
401
+		return $this->_issuerUniqueID;
402
+	}
403
+    
404
+	/**
405
+	 * Get extensions.
406
+	 *
407
+	 * @return Extensions
408
+	 */
409
+	public function extensions(): Extensions
410
+	{
411
+		return $this->_extensions;
412
+	}
413
+    
414
+	/**
415
+	 * Get ASN.1 structure.
416
+	 *
417
+	 * @return Sequence
418
+	 */
419
+	public function toASN1(): Sequence
420
+	{
421
+		$elements = array(new Integer($this->_version), $this->_holder->toASN1(),
422
+			$this->_issuer->toASN1(), $this->signature()->toASN1(),
423
+			new Integer($this->serialNumber()),
424
+			$this->_attrCertValidityPeriod->toASN1(),
425
+			$this->_attributes->toASN1());
426
+		if (isset($this->_issuerUniqueID)) {
427
+			$elements[] = $this->_issuerUniqueID->toASN1();
428
+		}
429
+		if (count($this->_extensions)) {
430
+			$elements[] = $this->_extensions->toASN1();
431
+		}
432
+		return new Sequence(...$elements);
433
+	}
434
+    
435
+	/**
436
+	 * Create signed attribute certificate.
437
+	 *
438
+	 * @param SignatureAlgorithmIdentifier $algo Signature algorithm
439
+	 * @param PrivateKeyInfo $privkey_info Private key
440
+	 * @param Crypto|null $crypto Crypto engine, use default if not set
441
+	 * @return AttributeCertificate
442
+	 */
443
+	public function sign(SignatureAlgorithmIdentifier $algo,
444
+		PrivateKeyInfo $privkey_info, Crypto $crypto = null): AttributeCertificate
445
+	{
446
+		$crypto = $crypto ?: Crypto::getDefault();
447
+		$aci = clone $this;
448
+		if (!isset($aci->_serialNumber)) {
449
+			$aci->_serialNumber = "0";
450
+		}
451
+		$aci->_signature = $algo;
452
+		$data = $aci->toASN1()->toDER();
453
+		$signature = $crypto->sign($data, $privkey_info, $algo);
454
+		return new AttributeCertificate($aci, $algo, $signature);
455
+	}
456 456
 }
Please login to merge, or discard this patch.
lib/X509/CertificationPath/PathValidation/PathValidator.php 2 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -52,6 +52,7 @@
 block discarded – undo
52 52
      * @param PathValidationConfig $config Validation config
53 53
      * @param Certificate ...$certificates Certificates from the trust anchor to
54 54
      *        the end-entity certificate
55
+     * @param Certificate[] $certificates
55 56
      */
56 57
     public function __construct(Crypto $crypto, PathValidationConfig $config,
57 58
         Certificate ...$certificates)
Please login to merge, or discard this patch.
Indentation   +554 added lines, -554 removed lines patch added patch discarded remove patch
@@ -17,585 +17,585 @@
 block discarded – undo
17 17
  */
18 18
 class PathValidator
19 19
 {
20
-    /**
21
-     * Crypto engine.
22
-     *
23
-     * @var Crypto $_crypto
24
-     */
25
-    protected $_crypto;
20
+	/**
21
+	 * Crypto engine.
22
+	 *
23
+	 * @var Crypto $_crypto
24
+	 */
25
+	protected $_crypto;
26 26
     
27
-    /**
28
-     * Path validation configuration.
29
-     *
30
-     * @var PathValidationConfig $_config
31
-     */
32
-    protected $_config;
27
+	/**
28
+	 * Path validation configuration.
29
+	 *
30
+	 * @var PathValidationConfig $_config
31
+	 */
32
+	protected $_config;
33 33
     
34
-    /**
35
-     * Certification path.
36
-     *
37
-     * @var Certificate[] $_certificates
38
-     */
39
-    protected $_certificates;
34
+	/**
35
+	 * Certification path.
36
+	 *
37
+	 * @var Certificate[] $_certificates
38
+	 */
39
+	protected $_certificates;
40 40
     
41
-    /**
42
-     * Certification path trust anchor.
43
-     *
44
-     * @var Certificate $_trustAnchor
45
-     */
46
-    protected $_trustAnchor;
41
+	/**
42
+	 * Certification path trust anchor.
43
+	 *
44
+	 * @var Certificate $_trustAnchor
45
+	 */
46
+	protected $_trustAnchor;
47 47
     
48
-    /**
49
-     * Constructor.
50
-     *
51
-     * @param Crypto $crypto Crypto engine
52
-     * @param PathValidationConfig $config Validation config
53
-     * @param Certificate ...$certificates Certificates from the trust anchor to
54
-     *        the end-entity certificate
55
-     */
56
-    public function __construct(Crypto $crypto, PathValidationConfig $config,
57
-        Certificate ...$certificates)
58
-    {
59
-        if (!count($certificates)) {
60
-            throw new \LogicException("No certificates.");
61
-        }
62
-        $this->_crypto = $crypto;
63
-        $this->_config = $config;
64
-        $this->_certificates = $certificates;
65
-        // if trust anchor is explicitly given in configuration
66
-        if ($config->hasTrustAnchor()) {
67
-            $this->_trustAnchor = $config->trustAnchor();
68
-        } else {
69
-            $this->_trustAnchor = $certificates[0];
70
-        }
71
-    }
48
+	/**
49
+	 * Constructor.
50
+	 *
51
+	 * @param Crypto $crypto Crypto engine
52
+	 * @param PathValidationConfig $config Validation config
53
+	 * @param Certificate ...$certificates Certificates from the trust anchor to
54
+	 *        the end-entity certificate
55
+	 */
56
+	public function __construct(Crypto $crypto, PathValidationConfig $config,
57
+		Certificate ...$certificates)
58
+	{
59
+		if (!count($certificates)) {
60
+			throw new \LogicException("No certificates.");
61
+		}
62
+		$this->_crypto = $crypto;
63
+		$this->_config = $config;
64
+		$this->_certificates = $certificates;
65
+		// if trust anchor is explicitly given in configuration
66
+		if ($config->hasTrustAnchor()) {
67
+			$this->_trustAnchor = $config->trustAnchor();
68
+		} else {
69
+			$this->_trustAnchor = $certificates[0];
70
+		}
71
+	}
72 72
     
73
-    /**
74
-     * Validate certification path.
75
-     *
76
-     * @throws PathValidationException
77
-     * @return PathValidationResult
78
-     */
79
-    public function validate(): PathValidationResult
80
-    {
81
-        $n = count($this->_certificates);
82
-        $state = ValidatorState::initialize($this->_config, $this->_trustAnchor,
83
-            $n);
84
-        for ($i = 0; $i < $n; ++$i) {
85
-            $state = $state->withIndex($i + 1);
86
-            $cert = $this->_certificates[$i];
87
-            // process certificate (section 6.1.3.)
88
-            $state = $this->_processCertificate($state, $cert);
89
-            if (!$state->isFinal()) {
90
-                // prepare next certificate (section 6.1.4.)
91
-                $state = $this->_prepareNext($state, $cert);
92
-            }
93
-        }
94
-        if (!isset($cert)) {
95
-            throw new \LogicException("No certificates.");
96
-        }
97
-        // wrap-up (section 6.1.5.)
98
-        $state = $this->_wrapUp($state, $cert);
99
-        // return outputs
100
-        return $state->getResult($this->_certificates);
101
-    }
73
+	/**
74
+	 * Validate certification path.
75
+	 *
76
+	 * @throws PathValidationException
77
+	 * @return PathValidationResult
78
+	 */
79
+	public function validate(): PathValidationResult
80
+	{
81
+		$n = count($this->_certificates);
82
+		$state = ValidatorState::initialize($this->_config, $this->_trustAnchor,
83
+			$n);
84
+		for ($i = 0; $i < $n; ++$i) {
85
+			$state = $state->withIndex($i + 1);
86
+			$cert = $this->_certificates[$i];
87
+			// process certificate (section 6.1.3.)
88
+			$state = $this->_processCertificate($state, $cert);
89
+			if (!$state->isFinal()) {
90
+				// prepare next certificate (section 6.1.4.)
91
+				$state = $this->_prepareNext($state, $cert);
92
+			}
93
+		}
94
+		if (!isset($cert)) {
95
+			throw new \LogicException("No certificates.");
96
+		}
97
+		// wrap-up (section 6.1.5.)
98
+		$state = $this->_wrapUp($state, $cert);
99
+		// return outputs
100
+		return $state->getResult($this->_certificates);
101
+	}
102 102
     
103
-    /**
104
-     * Apply basic certificate processing according to RFC 5280 section 6.1.3.
105
-     *
106
-     * @link https://tools.ietf.org/html/rfc5280#section-6.1.3
107
-     * @param ValidatorState $state
108
-     * @param Certificate $cert
109
-     * @throws PathValidationException
110
-     * @return ValidatorState
111
-     */
112
-    private function _processCertificate(ValidatorState $state, Certificate $cert): ValidatorState
113
-    {
114
-        // (a.1) verify signature
115
-        $this->_verifySignature($state, $cert);
116
-        // (a.2) check validity period
117
-        $this->_checkValidity($cert);
118
-        // (a.3) check that certificate is not revoked
119
-        $this->_checkRevocation($cert);
120
-        // (a.4) check issuer
121
-        $this->_checkIssuer($state, $cert);
122
-        // (b)(c) if certificate is self-issued and it is not
123
-        // the final certificate in the path, skip this step
124
-        if (!($cert->isSelfIssued() && !$state->isFinal())) {
125
-            // (b) check permitted subtrees
126
-            $this->_checkPermittedSubtrees($state, $cert);
127
-            // (c) check excluded subtrees
128
-            $this->_checkExcludedSubtrees($state, $cert);
129
-        }
130
-        $extensions = $cert->tbsCertificate()->extensions();
131
-        if ($extensions->hasCertificatePolicies()) {
132
-            // (d) process policy information
133
-            if ($state->hasValidPolicyTree()) {
134
-                $state = $state->validPolicyTree()->processPolicies($state,
135
-                    $cert);
136
-            }
137
-        } else {
138
-            // (e) certificate policies extension not present,
139
-            // set the valid_policy_tree to NULL
140
-            $state = $state->withoutValidPolicyTree();
141
-        }
142
-        // (f) check that explicit_policy > 0 or valid_policy_tree is set
143
-        if (!($state->explicitPolicy() > 0 || $state->hasValidPolicyTree())) {
144
-            throw new PathValidationException("No valid policies.");
145
-        }
146
-        return $state;
147
-    }
103
+	/**
104
+	 * Apply basic certificate processing according to RFC 5280 section 6.1.3.
105
+	 *
106
+	 * @link https://tools.ietf.org/html/rfc5280#section-6.1.3
107
+	 * @param ValidatorState $state
108
+	 * @param Certificate $cert
109
+	 * @throws PathValidationException
110
+	 * @return ValidatorState
111
+	 */
112
+	private function _processCertificate(ValidatorState $state, Certificate $cert): ValidatorState
113
+	{
114
+		// (a.1) verify signature
115
+		$this->_verifySignature($state, $cert);
116
+		// (a.2) check validity period
117
+		$this->_checkValidity($cert);
118
+		// (a.3) check that certificate is not revoked
119
+		$this->_checkRevocation($cert);
120
+		// (a.4) check issuer
121
+		$this->_checkIssuer($state, $cert);
122
+		// (b)(c) if certificate is self-issued and it is not
123
+		// the final certificate in the path, skip this step
124
+		if (!($cert->isSelfIssued() && !$state->isFinal())) {
125
+			// (b) check permitted subtrees
126
+			$this->_checkPermittedSubtrees($state, $cert);
127
+			// (c) check excluded subtrees
128
+			$this->_checkExcludedSubtrees($state, $cert);
129
+		}
130
+		$extensions = $cert->tbsCertificate()->extensions();
131
+		if ($extensions->hasCertificatePolicies()) {
132
+			// (d) process policy information
133
+			if ($state->hasValidPolicyTree()) {
134
+				$state = $state->validPolicyTree()->processPolicies($state,
135
+					$cert);
136
+			}
137
+		} else {
138
+			// (e) certificate policies extension not present,
139
+			// set the valid_policy_tree to NULL
140
+			$state = $state->withoutValidPolicyTree();
141
+		}
142
+		// (f) check that explicit_policy > 0 or valid_policy_tree is set
143
+		if (!($state->explicitPolicy() > 0 || $state->hasValidPolicyTree())) {
144
+			throw new PathValidationException("No valid policies.");
145
+		}
146
+		return $state;
147
+	}
148 148
     
149
-    /**
150
-     * Apply preparation for the certificate i+1 according to rfc5280 section
151
-     * 6.1.4.
152
-     *
153
-     * @link https://tools.ietf.org/html/rfc5280#section-6.1.4
154
-     * @param ValidatorState $state
155
-     * @param Certificate $cert
156
-     * @return ValidatorState
157
-     */
158
-    private function _prepareNext(ValidatorState $state, Certificate $cert): ValidatorState
159
-    {
160
-        // (a)(b) if policy mappings extension is present
161
-        $state = $this->_preparePolicyMappings($state, $cert);
162
-        // (c) assign working_issuer_name
163
-        $state = $state->withWorkingIssuerName(
164
-            $cert->tbsCertificate()
165
-                ->subject());
166
-        // (d)(e)(f)
167
-        $state = $this->_setPublicKeyState($state, $cert);
168
-        // (g) if name constraints extension is present
169
-        $state = $this->_prepareNameConstraints($state, $cert);
170
-        // (h) if certificate is not self-issued
171
-        if (!$cert->isSelfIssued()) {
172
-            $state = $this->_prepareNonSelfIssued($state);
173
-        }
174
-        // (i) if policy constraints extension is present
175
-        $state = $this->_preparePolicyConstraints($state, $cert);
176
-        // (j) if inhibit any policy extension is present
177
-        $state = $this->_prepareInhibitAnyPolicy($state, $cert);
178
-        // (k) check basic constraints
179
-        $this->_processBasicContraints($cert);
180
-        // (l) verify max_path_length
181
-        $state = $this->_verifyMaxPathLength($state, $cert);
182
-        // (m) check pathLenContraint
183
-        $state = $this->_processPathLengthContraint($state, $cert);
184
-        // (n) check key usage
185
-        $this->_checkKeyUsage($cert);
186
-        // (o) process relevant extensions
187
-        $state = $this->_processExtensions($state, $cert);
188
-        return $state;
189
-    }
149
+	/**
150
+	 * Apply preparation for the certificate i+1 according to rfc5280 section
151
+	 * 6.1.4.
152
+	 *
153
+	 * @link https://tools.ietf.org/html/rfc5280#section-6.1.4
154
+	 * @param ValidatorState $state
155
+	 * @param Certificate $cert
156
+	 * @return ValidatorState
157
+	 */
158
+	private function _prepareNext(ValidatorState $state, Certificate $cert): ValidatorState
159
+	{
160
+		// (a)(b) if policy mappings extension is present
161
+		$state = $this->_preparePolicyMappings($state, $cert);
162
+		// (c) assign working_issuer_name
163
+		$state = $state->withWorkingIssuerName(
164
+			$cert->tbsCertificate()
165
+				->subject());
166
+		// (d)(e)(f)
167
+		$state = $this->_setPublicKeyState($state, $cert);
168
+		// (g) if name constraints extension is present
169
+		$state = $this->_prepareNameConstraints($state, $cert);
170
+		// (h) if certificate is not self-issued
171
+		if (!$cert->isSelfIssued()) {
172
+			$state = $this->_prepareNonSelfIssued($state);
173
+		}
174
+		// (i) if policy constraints extension is present
175
+		$state = $this->_preparePolicyConstraints($state, $cert);
176
+		// (j) if inhibit any policy extension is present
177
+		$state = $this->_prepareInhibitAnyPolicy($state, $cert);
178
+		// (k) check basic constraints
179
+		$this->_processBasicContraints($cert);
180
+		// (l) verify max_path_length
181
+		$state = $this->_verifyMaxPathLength($state, $cert);
182
+		// (m) check pathLenContraint
183
+		$state = $this->_processPathLengthContraint($state, $cert);
184
+		// (n) check key usage
185
+		$this->_checkKeyUsage($cert);
186
+		// (o) process relevant extensions
187
+		$state = $this->_processExtensions($state, $cert);
188
+		return $state;
189
+	}
190 190
     
191
-    /**
192
-     * Apply wrap-up procedure according to RFC 5280 section 6.1.5.
193
-     *
194
-     * @link https://tools.ietf.org/html/rfc5280#section-6.1.5
195
-     * @param ValidatorState $state
196
-     * @param Certificate $cert
197
-     * @throws PathValidationException
198
-     * @return ValidatorState
199
-     */
200
-    private function _wrapUp(ValidatorState $state, Certificate $cert): ValidatorState
201
-    {
202
-        $tbs_cert = $cert->tbsCertificate();
203
-        $extensions = $tbs_cert->extensions();
204
-        // (a)
205
-        if ($state->explicitPolicy() > 0) {
206
-            $state = $state->withExplicitPolicy($state->explicitPolicy() - 1);
207
-        }
208
-        // (b)
209
-        if ($extensions->hasPolicyConstraints()) {
210
-            $ext = $extensions->policyConstraints();
211
-            if ($ext->hasRequireExplicitPolicy() &&
212
-                 $ext->requireExplicitPolicy() == 0) {
213
-                $state = $state->withExplicitPolicy(0);
214
-            }
215
-        }
216
-        // (c)(d)(e)
217
-        $state = $this->_setPublicKeyState($state, $cert);
218
-        // (f) process relevant extensions
219
-        $state = $this->_processExtensions($state, $cert);
220
-        // (g) intersection of valid_policy_tree and the initial-policy-set
221
-        $state = $this->_calculatePolicyIntersection($state);
222
-        // check that explicit_policy > 0 or valid_policy_tree is set
223
-        if (!($state->explicitPolicy() > 0 || $state->hasValidPolicyTree())) {
224
-            throw new PathValidationException("No valid policies.");
225
-        }
226
-        // path validation succeeded
227
-        return $state;
228
-    }
191
+	/**
192
+	 * Apply wrap-up procedure according to RFC 5280 section 6.1.5.
193
+	 *
194
+	 * @link https://tools.ietf.org/html/rfc5280#section-6.1.5
195
+	 * @param ValidatorState $state
196
+	 * @param Certificate $cert
197
+	 * @throws PathValidationException
198
+	 * @return ValidatorState
199
+	 */
200
+	private function _wrapUp(ValidatorState $state, Certificate $cert): ValidatorState
201
+	{
202
+		$tbs_cert = $cert->tbsCertificate();
203
+		$extensions = $tbs_cert->extensions();
204
+		// (a)
205
+		if ($state->explicitPolicy() > 0) {
206
+			$state = $state->withExplicitPolicy($state->explicitPolicy() - 1);
207
+		}
208
+		// (b)
209
+		if ($extensions->hasPolicyConstraints()) {
210
+			$ext = $extensions->policyConstraints();
211
+			if ($ext->hasRequireExplicitPolicy() &&
212
+				 $ext->requireExplicitPolicy() == 0) {
213
+				$state = $state->withExplicitPolicy(0);
214
+			}
215
+		}
216
+		// (c)(d)(e)
217
+		$state = $this->_setPublicKeyState($state, $cert);
218
+		// (f) process relevant extensions
219
+		$state = $this->_processExtensions($state, $cert);
220
+		// (g) intersection of valid_policy_tree and the initial-policy-set
221
+		$state = $this->_calculatePolicyIntersection($state);
222
+		// check that explicit_policy > 0 or valid_policy_tree is set
223
+		if (!($state->explicitPolicy() > 0 || $state->hasValidPolicyTree())) {
224
+			throw new PathValidationException("No valid policies.");
225
+		}
226
+		// path validation succeeded
227
+		return $state;
228
+	}
229 229
     
230
-    /**
231
-     * Update working_public_key, working_public_key_parameters and
232
-     * working_public_key_algorithm state variables from certificate.
233
-     *
234
-     * @param ValidatorState $state
235
-     * @param Certificate $cert
236
-     * @return ValidatorState
237
-     */
238
-    private function _setPublicKeyState(ValidatorState $state, Certificate $cert): ValidatorState
239
-    {
240
-        $pk_info = $cert->tbsCertificate()->subjectPublicKeyInfo();
241
-        // assign working_public_key
242
-        $state = $state->withWorkingPublicKey($pk_info);
243
-        // assign working_public_key_parameters
244
-        $params = ValidatorState::getAlgorithmParameters(
245
-            $pk_info->algorithmIdentifier());
246
-        if (null !== $params) {
247
-            $state = $state->withWorkingPublicKeyParameters($params);
248
-        } else {
249
-            // if algorithms differ, set parameters to null
250
-            if ($pk_info->algorithmIdentifier()->oid() !==
251
-                 $state->workingPublicKeyAlgorithm()->oid()) {
252
-                $state = $state->withWorkingPublicKeyParameters(null);
253
-            }
254
-        }
255
-        // assign working_public_key_algorithm
256
-        $state = $state->withWorkingPublicKeyAlgorithm(
257
-            $pk_info->algorithmIdentifier());
258
-        return $state;
259
-    }
230
+	/**
231
+	 * Update working_public_key, working_public_key_parameters and
232
+	 * working_public_key_algorithm state variables from certificate.
233
+	 *
234
+	 * @param ValidatorState $state
235
+	 * @param Certificate $cert
236
+	 * @return ValidatorState
237
+	 */
238
+	private function _setPublicKeyState(ValidatorState $state, Certificate $cert): ValidatorState
239
+	{
240
+		$pk_info = $cert->tbsCertificate()->subjectPublicKeyInfo();
241
+		// assign working_public_key
242
+		$state = $state->withWorkingPublicKey($pk_info);
243
+		// assign working_public_key_parameters
244
+		$params = ValidatorState::getAlgorithmParameters(
245
+			$pk_info->algorithmIdentifier());
246
+		if (null !== $params) {
247
+			$state = $state->withWorkingPublicKeyParameters($params);
248
+		} else {
249
+			// if algorithms differ, set parameters to null
250
+			if ($pk_info->algorithmIdentifier()->oid() !==
251
+				 $state->workingPublicKeyAlgorithm()->oid()) {
252
+				$state = $state->withWorkingPublicKeyParameters(null);
253
+			}
254
+		}
255
+		// assign working_public_key_algorithm
256
+		$state = $state->withWorkingPublicKeyAlgorithm(
257
+			$pk_info->algorithmIdentifier());
258
+		return $state;
259
+	}
260 260
     
261
-    /**
262
-     * Verify certificate signature.
263
-     *
264
-     * @param ValidatorState $state
265
-     * @param Certificate $cert
266
-     * @throws PathValidationException
267
-     */
268
-    private function _verifySignature(ValidatorState $state, Certificate $cert)
269
-    {
270
-        try {
271
-            $valid = $cert->verify($state->workingPublicKey(), $this->_crypto);
272
-        } catch (\RuntimeException $e) {
273
-            throw new PathValidationException(
274
-                "Failed to verify signature: " . $e->getMessage(), 0, $e);
275
-        }
276
-        if (!$valid) {
277
-            throw new PathValidationException(
278
-                "Certificate signature doesn't match.");
279
-        }
280
-    }
261
+	/**
262
+	 * Verify certificate signature.
263
+	 *
264
+	 * @param ValidatorState $state
265
+	 * @param Certificate $cert
266
+	 * @throws PathValidationException
267
+	 */
268
+	private function _verifySignature(ValidatorState $state, Certificate $cert)
269
+	{
270
+		try {
271
+			$valid = $cert->verify($state->workingPublicKey(), $this->_crypto);
272
+		} catch (\RuntimeException $e) {
273
+			throw new PathValidationException(
274
+				"Failed to verify signature: " . $e->getMessage(), 0, $e);
275
+		}
276
+		if (!$valid) {
277
+			throw new PathValidationException(
278
+				"Certificate signature doesn't match.");
279
+		}
280
+	}
281 281
     
282
-    /**
283
-     * Check certificate validity.
284
-     *
285
-     * @param Certificate $cert
286
-     * @throws PathValidationException
287
-     */
288
-    private function _checkValidity(Certificate $cert)
289
-    {
290
-        $refdt = $this->_config->dateTime();
291
-        $validity = $cert->tbsCertificate()->validity();
292
-        if ($validity->notBefore()
293
-            ->dateTime()
294
-            ->diff($refdt)->invert) {
295
-            throw new PathValidationException(
296
-                "Certificate validity period has not started.");
297
-        }
298
-        if ($refdt->diff($validity->notAfter()
299
-            ->dateTime())->invert) {
300
-            throw new PathValidationException("Certificate has expired.");
301
-        }
302
-    }
282
+	/**
283
+	 * Check certificate validity.
284
+	 *
285
+	 * @param Certificate $cert
286
+	 * @throws PathValidationException
287
+	 */
288
+	private function _checkValidity(Certificate $cert)
289
+	{
290
+		$refdt = $this->_config->dateTime();
291
+		$validity = $cert->tbsCertificate()->validity();
292
+		if ($validity->notBefore()
293
+			->dateTime()
294
+			->diff($refdt)->invert) {
295
+			throw new PathValidationException(
296
+				"Certificate validity period has not started.");
297
+		}
298
+		if ($refdt->diff($validity->notAfter()
299
+			->dateTime())->invert) {
300
+			throw new PathValidationException("Certificate has expired.");
301
+		}
302
+	}
303 303
     
304
-    /**
305
-     * Check certificate revocation.
306
-     *
307
-     * @param Certificate $cert
308
-     */
309
-    private function _checkRevocation(Certificate $cert)
310
-    {
311
-        // @todo Implement CRL handling
312
-    }
304
+	/**
305
+	 * Check certificate revocation.
306
+	 *
307
+	 * @param Certificate $cert
308
+	 */
309
+	private function _checkRevocation(Certificate $cert)
310
+	{
311
+		// @todo Implement CRL handling
312
+	}
313 313
     
314
-    /**
315
-     * Check certificate issuer.
316
-     *
317
-     * @param ValidatorState $state
318
-     * @param Certificate $cert
319
-     * @throws PathValidationException
320
-     */
321
-    private function _checkIssuer(ValidatorState $state, Certificate $cert)
322
-    {
323
-        if (!$cert->tbsCertificate()
324
-            ->issuer()
325
-            ->equals($state->workingIssuerName())) {
326
-            throw new PathValidationException("Certification issuer mismatch.");
327
-        }
328
-    }
314
+	/**
315
+	 * Check certificate issuer.
316
+	 *
317
+	 * @param ValidatorState $state
318
+	 * @param Certificate $cert
319
+	 * @throws PathValidationException
320
+	 */
321
+	private function _checkIssuer(ValidatorState $state, Certificate $cert)
322
+	{
323
+		if (!$cert->tbsCertificate()
324
+			->issuer()
325
+			->equals($state->workingIssuerName())) {
326
+			throw new PathValidationException("Certification issuer mismatch.");
327
+		}
328
+	}
329 329
     
330
-    /**
331
-     *
332
-     * @param ValidatorState $state
333
-     * @param Certificate $cert
334
-     */
335
-    private function _checkPermittedSubtrees(ValidatorState $state,
336
-        Certificate $cert)
337
-    {
338
-        // @todo Implement
339
-        $state->permittedSubtrees();
340
-    }
330
+	/**
331
+	 *
332
+	 * @param ValidatorState $state
333
+	 * @param Certificate $cert
334
+	 */
335
+	private function _checkPermittedSubtrees(ValidatorState $state,
336
+		Certificate $cert)
337
+	{
338
+		// @todo Implement
339
+		$state->permittedSubtrees();
340
+	}
341 341
     
342
-    /**
343
-     *
344
-     * @param ValidatorState $state
345
-     * @param Certificate $cert
346
-     */
347
-    private function _checkExcludedSubtrees(ValidatorState $state,
348
-        Certificate $cert)
349
-    {
350
-        // @todo Implement
351
-        $state->excludedSubtrees();
352
-    }
342
+	/**
343
+	 *
344
+	 * @param ValidatorState $state
345
+	 * @param Certificate $cert
346
+	 */
347
+	private function _checkExcludedSubtrees(ValidatorState $state,
348
+		Certificate $cert)
349
+	{
350
+		// @todo Implement
351
+		$state->excludedSubtrees();
352
+	}
353 353
     
354
-    /**
355
-     * Apply policy mappings handling for the preparation step.
356
-     *
357
-     * @param ValidatorState $state
358
-     * @param Certificate $cert
359
-     * @throws PathValidationException
360
-     * @return ValidatorState
361
-     */
362
-    private function _preparePolicyMappings(ValidatorState $state,
363
-        Certificate $cert): ValidatorState
364
-    {
365
-        $extensions = $cert->tbsCertificate()->extensions();
366
-        if ($extensions->hasPolicyMappings()) {
367
-            // (a) verify that anyPolicy mapping is not used
368
-            if ($extensions->policyMappings()->hasAnyPolicyMapping()) {
369
-                throw new PathValidationException("anyPolicy mapping found.");
370
-            }
371
-            // (b) process policy mappings
372
-            if ($state->hasValidPolicyTree()) {
373
-                $state = $state->validPolicyTree()->processMappings($state,
374
-                    $cert);
375
-            }
376
-        }
377
-        return $state;
378
-    }
354
+	/**
355
+	 * Apply policy mappings handling for the preparation step.
356
+	 *
357
+	 * @param ValidatorState $state
358
+	 * @param Certificate $cert
359
+	 * @throws PathValidationException
360
+	 * @return ValidatorState
361
+	 */
362
+	private function _preparePolicyMappings(ValidatorState $state,
363
+		Certificate $cert): ValidatorState
364
+	{
365
+		$extensions = $cert->tbsCertificate()->extensions();
366
+		if ($extensions->hasPolicyMappings()) {
367
+			// (a) verify that anyPolicy mapping is not used
368
+			if ($extensions->policyMappings()->hasAnyPolicyMapping()) {
369
+				throw new PathValidationException("anyPolicy mapping found.");
370
+			}
371
+			// (b) process policy mappings
372
+			if ($state->hasValidPolicyTree()) {
373
+				$state = $state->validPolicyTree()->processMappings($state,
374
+					$cert);
375
+			}
376
+		}
377
+		return $state;
378
+	}
379 379
     
380
-    /**
381
-     * Apply name constraints handling for the preparation step.
382
-     *
383
-     * @param ValidatorState $state
384
-     * @param Certificate $cert
385
-     * @return ValidatorState
386
-     */
387
-    private function _prepareNameConstraints(ValidatorState $state,
388
-        Certificate $cert): ValidatorState
389
-    {
390
-        $extensions = $cert->tbsCertificate()->extensions();
391
-        if ($extensions->hasNameConstraints()) {
392
-            $state = $this->_processNameConstraints($state, $cert);
393
-        }
394
-        return $state;
395
-    }
380
+	/**
381
+	 * Apply name constraints handling for the preparation step.
382
+	 *
383
+	 * @param ValidatorState $state
384
+	 * @param Certificate $cert
385
+	 * @return ValidatorState
386
+	 */
387
+	private function _prepareNameConstraints(ValidatorState $state,
388
+		Certificate $cert): ValidatorState
389
+	{
390
+		$extensions = $cert->tbsCertificate()->extensions();
391
+		if ($extensions->hasNameConstraints()) {
392
+			$state = $this->_processNameConstraints($state, $cert);
393
+		}
394
+		return $state;
395
+	}
396 396
     
397
-    /**
398
-     * Apply preparation for a non-self-signed certificate.
399
-     *
400
-     * @param ValidatorState $state
401
-     * @return ValidatorState
402
-     */
403
-    private function _prepareNonSelfIssued(ValidatorState $state): ValidatorState
404
-    {
405
-        // (h.1)
406
-        if ($state->explicitPolicy() > 0) {
407
-            $state = $state->withExplicitPolicy($state->explicitPolicy() - 1);
408
-        }
409
-        // (h.2)
410
-        if ($state->policyMapping() > 0) {
411
-            $state = $state->withPolicyMapping($state->policyMapping() - 1);
412
-        }
413
-        // (h.3)
414
-        if ($state->inhibitAnyPolicy() > 0) {
415
-            $state = $state->withInhibitAnyPolicy(
416
-                $state->inhibitAnyPolicy() - 1);
417
-        }
418
-        return $state;
419
-    }
397
+	/**
398
+	 * Apply preparation for a non-self-signed certificate.
399
+	 *
400
+	 * @param ValidatorState $state
401
+	 * @return ValidatorState
402
+	 */
403
+	private function _prepareNonSelfIssued(ValidatorState $state): ValidatorState
404
+	{
405
+		// (h.1)
406
+		if ($state->explicitPolicy() > 0) {
407
+			$state = $state->withExplicitPolicy($state->explicitPolicy() - 1);
408
+		}
409
+		// (h.2)
410
+		if ($state->policyMapping() > 0) {
411
+			$state = $state->withPolicyMapping($state->policyMapping() - 1);
412
+		}
413
+		// (h.3)
414
+		if ($state->inhibitAnyPolicy() > 0) {
415
+			$state = $state->withInhibitAnyPolicy(
416
+				$state->inhibitAnyPolicy() - 1);
417
+		}
418
+		return $state;
419
+	}
420 420
     
421
-    /**
422
-     * Apply policy constraints handling for the preparation step.
423
-     *
424
-     * @param ValidatorState $state
425
-     * @param Certificate $cert
426
-     * @return ValidatorState
427
-     */
428
-    private function _preparePolicyConstraints(ValidatorState $state,
429
-        Certificate $cert): ValidatorState
430
-    {
431
-        $extensions = $cert->tbsCertificate()->extensions();
432
-        if (!$extensions->hasPolicyConstraints()) {
433
-            return $state;
434
-        }
435
-        $ext = $extensions->policyConstraints();
436
-        // (i.1)
437
-        if ($ext->hasRequireExplicitPolicy() &&
438
-             $ext->requireExplicitPolicy() < $state->explicitPolicy()) {
439
-            $state = $state->withExplicitPolicy($ext->requireExplicitPolicy());
440
-        }
441
-        // (i.2)
442
-        if ($ext->hasInhibitPolicyMapping() &&
443
-             $ext->inhibitPolicyMapping() < $state->policyMapping()) {
444
-            $state = $state->withPolicyMapping($ext->inhibitPolicyMapping());
445
-        }
446
-        return $state;
447
-    }
421
+	/**
422
+	 * Apply policy constraints handling for the preparation step.
423
+	 *
424
+	 * @param ValidatorState $state
425
+	 * @param Certificate $cert
426
+	 * @return ValidatorState
427
+	 */
428
+	private function _preparePolicyConstraints(ValidatorState $state,
429
+		Certificate $cert): ValidatorState
430
+	{
431
+		$extensions = $cert->tbsCertificate()->extensions();
432
+		if (!$extensions->hasPolicyConstraints()) {
433
+			return $state;
434
+		}
435
+		$ext = $extensions->policyConstraints();
436
+		// (i.1)
437
+		if ($ext->hasRequireExplicitPolicy() &&
438
+			 $ext->requireExplicitPolicy() < $state->explicitPolicy()) {
439
+			$state = $state->withExplicitPolicy($ext->requireExplicitPolicy());
440
+		}
441
+		// (i.2)
442
+		if ($ext->hasInhibitPolicyMapping() &&
443
+			 $ext->inhibitPolicyMapping() < $state->policyMapping()) {
444
+			$state = $state->withPolicyMapping($ext->inhibitPolicyMapping());
445
+		}
446
+		return $state;
447
+	}
448 448
     
449
-    /**
450
-     * Apply inhibit any-policy handling for the preparation step.
451
-     *
452
-     * @param ValidatorState $state
453
-     * @param Certificate $cert
454
-     * @return ValidatorState
455
-     */
456
-    private function _prepareInhibitAnyPolicy(ValidatorState $state,
457
-        Certificate $cert): ValidatorState
458
-    {
459
-        $extensions = $cert->tbsCertificate()->extensions();
460
-        if ($extensions->hasInhibitAnyPolicy()) {
461
-            $ext = $extensions->inhibitAnyPolicy();
462
-            if ($ext->skipCerts() < $state->inhibitAnyPolicy()) {
463
-                $state = $state->withInhibitAnyPolicy($ext->skipCerts());
464
-            }
465
-        }
466
-        return $state;
467
-    }
449
+	/**
450
+	 * Apply inhibit any-policy handling for the preparation step.
451
+	 *
452
+	 * @param ValidatorState $state
453
+	 * @param Certificate $cert
454
+	 * @return ValidatorState
455
+	 */
456
+	private function _prepareInhibitAnyPolicy(ValidatorState $state,
457
+		Certificate $cert): ValidatorState
458
+	{
459
+		$extensions = $cert->tbsCertificate()->extensions();
460
+		if ($extensions->hasInhibitAnyPolicy()) {
461
+			$ext = $extensions->inhibitAnyPolicy();
462
+			if ($ext->skipCerts() < $state->inhibitAnyPolicy()) {
463
+				$state = $state->withInhibitAnyPolicy($ext->skipCerts());
464
+			}
465
+		}
466
+		return $state;
467
+	}
468 468
     
469
-    /**
470
-     * Verify maximum certification path length for the preparation step.
471
-     *
472
-     * @param ValidatorState $state
473
-     * @param Certificate $cert
474
-     * @throws PathValidationException
475
-     * @return ValidatorState
476
-     */
477
-    private function _verifyMaxPathLength(ValidatorState $state,
478
-        Certificate $cert): ValidatorState
479
-    {
480
-        if (!$cert->isSelfIssued()) {
481
-            if ($state->maxPathLength() <= 0) {
482
-                throw new PathValidationException(
483
-                    "Certification path length exceeded.");
484
-            }
485
-            $state = $state->withMaxPathLength($state->maxPathLength() - 1);
486
-        }
487
-        return $state;
488
-    }
469
+	/**
470
+	 * Verify maximum certification path length for the preparation step.
471
+	 *
472
+	 * @param ValidatorState $state
473
+	 * @param Certificate $cert
474
+	 * @throws PathValidationException
475
+	 * @return ValidatorState
476
+	 */
477
+	private function _verifyMaxPathLength(ValidatorState $state,
478
+		Certificate $cert): ValidatorState
479
+	{
480
+		if (!$cert->isSelfIssued()) {
481
+			if ($state->maxPathLength() <= 0) {
482
+				throw new PathValidationException(
483
+					"Certification path length exceeded.");
484
+			}
485
+			$state = $state->withMaxPathLength($state->maxPathLength() - 1);
486
+		}
487
+		return $state;
488
+	}
489 489
     
490
-    /**
491
-     * Check key usage extension for the preparation step.
492
-     *
493
-     * @param Certificate $cert
494
-     * @throws PathValidationException
495
-     */
496
-    private function _checkKeyUsage(Certificate $cert)
497
-    {
498
-        $extensions = $cert->tbsCertificate()->extensions();
499
-        if ($extensions->hasKeyUsage()) {
500
-            $ext = $extensions->keyUsage();
501
-            if (!$ext->isKeyCertSign()) {
502
-                throw new PathValidationException("keyCertSign usage not set.");
503
-            }
504
-        }
505
-    }
490
+	/**
491
+	 * Check key usage extension for the preparation step.
492
+	 *
493
+	 * @param Certificate $cert
494
+	 * @throws PathValidationException
495
+	 */
496
+	private function _checkKeyUsage(Certificate $cert)
497
+	{
498
+		$extensions = $cert->tbsCertificate()->extensions();
499
+		if ($extensions->hasKeyUsage()) {
500
+			$ext = $extensions->keyUsage();
501
+			if (!$ext->isKeyCertSign()) {
502
+				throw new PathValidationException("keyCertSign usage not set.");
503
+			}
504
+		}
505
+	}
506 506
     
507
-    /**
508
-     *
509
-     * @param ValidatorState $state
510
-     * @param Certificate $cert
511
-     * @return ValidatorState
512
-     */
513
-    private function _processNameConstraints(ValidatorState $state,
514
-        Certificate $cert): ValidatorState
515
-    {
516
-        // @todo Implement
517
-        return $state;
518
-    }
507
+	/**
508
+	 *
509
+	 * @param ValidatorState $state
510
+	 * @param Certificate $cert
511
+	 * @return ValidatorState
512
+	 */
513
+	private function _processNameConstraints(ValidatorState $state,
514
+		Certificate $cert): ValidatorState
515
+	{
516
+		// @todo Implement
517
+		return $state;
518
+	}
519 519
     
520
-    /**
521
-     * Process basic constraints extension.
522
-     *
523
-     * @param Certificate $cert
524
-     * @throws PathValidationException
525
-     */
526
-    private function _processBasicContraints(Certificate $cert)
527
-    {
528
-        if ($cert->tbsCertificate()->version() == TBSCertificate::VERSION_3) {
529
-            $extensions = $cert->tbsCertificate()->extensions();
530
-            if (!$extensions->hasBasicConstraints()) {
531
-                throw new PathValidationException(
532
-                    "v3 certificate must have basicConstraints extension.");
533
-            }
534
-            // verify that cA is set to TRUE
535
-            if (!$extensions->basicConstraints()->isCA()) {
536
-                throw new PathValidationException(
537
-                    "Certificate is not a CA certificate.");
538
-            }
539
-        }
540
-    }
520
+	/**
521
+	 * Process basic constraints extension.
522
+	 *
523
+	 * @param Certificate $cert
524
+	 * @throws PathValidationException
525
+	 */
526
+	private function _processBasicContraints(Certificate $cert)
527
+	{
528
+		if ($cert->tbsCertificate()->version() == TBSCertificate::VERSION_3) {
529
+			$extensions = $cert->tbsCertificate()->extensions();
530
+			if (!$extensions->hasBasicConstraints()) {
531
+				throw new PathValidationException(
532
+					"v3 certificate must have basicConstraints extension.");
533
+			}
534
+			// verify that cA is set to TRUE
535
+			if (!$extensions->basicConstraints()->isCA()) {
536
+				throw new PathValidationException(
537
+					"Certificate is not a CA certificate.");
538
+			}
539
+		}
540
+	}
541 541
     
542
-    /**
543
-     * Process pathLenConstraint.
544
-     *
545
-     * @param ValidatorState $state
546
-     * @param Certificate $cert
547
-     * @return ValidatorState
548
-     */
549
-    private function _processPathLengthContraint(ValidatorState $state,
550
-        Certificate $cert): ValidatorState
551
-    {
552
-        $extensions = $cert->tbsCertificate()->extensions();
553
-        if ($extensions->hasBasicConstraints()) {
554
-            $ext = $extensions->basicConstraints();
555
-            if ($ext->hasPathLen()) {
556
-                if ($ext->pathLen() < $state->maxPathLength()) {
557
-                    $state = $state->withMaxPathLength($ext->pathLen());
558
-                }
559
-            }
560
-        }
561
-        return $state;
562
-    }
542
+	/**
543
+	 * Process pathLenConstraint.
544
+	 *
545
+	 * @param ValidatorState $state
546
+	 * @param Certificate $cert
547
+	 * @return ValidatorState
548
+	 */
549
+	private function _processPathLengthContraint(ValidatorState $state,
550
+		Certificate $cert): ValidatorState
551
+	{
552
+		$extensions = $cert->tbsCertificate()->extensions();
553
+		if ($extensions->hasBasicConstraints()) {
554
+			$ext = $extensions->basicConstraints();
555
+			if ($ext->hasPathLen()) {
556
+				if ($ext->pathLen() < $state->maxPathLength()) {
557
+					$state = $state->withMaxPathLength($ext->pathLen());
558
+				}
559
+			}
560
+		}
561
+		return $state;
562
+	}
563 563
     
564
-    /**
565
-     *
566
-     * @param ValidatorState $state
567
-     * @param Certificate $cert
568
-     * @return ValidatorState
569
-     */
570
-    private function _processExtensions(ValidatorState $state, Certificate $cert): ValidatorState
571
-    {
572
-        // @todo Implement
573
-        return $state;
574
-    }
564
+	/**
565
+	 *
566
+	 * @param ValidatorState $state
567
+	 * @param Certificate $cert
568
+	 * @return ValidatorState
569
+	 */
570
+	private function _processExtensions(ValidatorState $state, Certificate $cert): ValidatorState
571
+	{
572
+		// @todo Implement
573
+		return $state;
574
+	}
575 575
     
576
-    /**
577
-     *
578
-     * @param ValidatorState $state
579
-     * @return ValidatorState
580
-     */
581
-    private function _calculatePolicyIntersection(ValidatorState $state): ValidatorState
582
-    {
583
-        // (i) If the valid_policy_tree is NULL, the intersection is NULL
584
-        if (!$state->hasValidPolicyTree()) {
585
-            return $state;
586
-        }
587
-        // (ii) If the valid_policy_tree is not NULL and
588
-        // the user-initial-policy-set is any-policy, the intersection
589
-        // is the entire valid_policy_tree
590
-        $initial_policies = $this->_config->policySet();
591
-        if (in_array(PolicyInformation::OID_ANY_POLICY, $initial_policies)) {
592
-            return $state;
593
-        }
594
-        // (iii) If the valid_policy_tree is not NULL and the
595
-        // user-initial-policy-set is not any-policy, calculate
596
-        // the intersection of the valid_policy_tree and the
597
-        // user-initial-policy-set as follows
598
-        return $state->validPolicyTree()->calculateIntersection($state,
599
-            $initial_policies);
600
-    }
576
+	/**
577
+	 *
578
+	 * @param ValidatorState $state
579
+	 * @return ValidatorState
580
+	 */
581
+	private function _calculatePolicyIntersection(ValidatorState $state): ValidatorState
582
+	{
583
+		// (i) If the valid_policy_tree is NULL, the intersection is NULL
584
+		if (!$state->hasValidPolicyTree()) {
585
+			return $state;
586
+		}
587
+		// (ii) If the valid_policy_tree is not NULL and
588
+		// the user-initial-policy-set is any-policy, the intersection
589
+		// is the entire valid_policy_tree
590
+		$initial_policies = $this->_config->policySet();
591
+		if (in_array(PolicyInformation::OID_ANY_POLICY, $initial_policies)) {
592
+			return $state;
593
+		}
594
+		// (iii) If the valid_policy_tree is not NULL and the
595
+		// user-initial-policy-set is not any-policy, calculate
596
+		// the intersection of the valid_policy_tree and the
597
+		// user-initial-policy-set as follows
598
+		return $state->validPolicyTree()->calculateIntersection($state,
599
+			$initial_policies);
600
+	}
601 601
 }
Please login to merge, or discard this patch.
lib/X509/CertificationRequest/CertificationRequestInfo.php 1 patch
Indentation   +200 added lines, -200 removed lines patch added patch discarded remove patch
@@ -24,204 +24,204 @@
 block discarded – undo
24 24
  */
25 25
 class CertificationRequestInfo
26 26
 {
27
-    const VERSION_1 = 0;
28
-    
29
-    /**
30
-     * Version.
31
-     *
32
-     * @var int
33
-     */
34
-    protected $_version;
35
-    
36
-    /**
37
-     * Subject.
38
-     *
39
-     * @var Name $_subject
40
-     */
41
-    protected $_subject;
42
-    
43
-    /**
44
-     * Public key info.
45
-     *
46
-     * @var PublicKeyInfo $_subjectPKInfo
47
-     */
48
-    protected $_subjectPKInfo;
49
-    
50
-    /**
51
-     * Attributes.
52
-     *
53
-     * @var Attributes|null $_attributes
54
-     */
55
-    protected $_attributes;
56
-    
57
-    /**
58
-     * Constructor.
59
-     *
60
-     * @param Name $subject Subject
61
-     * @param PublicKeyInfo $pkinfo Public key info
62
-     */
63
-    public function __construct(Name $subject, PublicKeyInfo $pkinfo)
64
-    {
65
-        $this->_version = self::VERSION_1;
66
-        $this->_subject = $subject;
67
-        $this->_subjectPKInfo = $pkinfo;
68
-    }
69
-    
70
-    /**
71
-     * Initialize from ASN.1.
72
-     *
73
-     * @param Sequence $seq
74
-     * @throws \UnexpectedValueException
75
-     * @return self
76
-     */
77
-    public static function fromASN1(Sequence $seq): self
78
-    {
79
-        $version = $seq->at(0)
80
-            ->asInteger()
81
-            ->intNumber();
82
-        if ($version != self::VERSION_1) {
83
-            throw new \UnexpectedValueException(
84
-                "Version $version not supported.");
85
-        }
86
-        $subject = Name::fromASN1($seq->at(1)->asSequence());
87
-        $pkinfo = PublicKeyInfo::fromASN1($seq->at(2)->asSequence());
88
-        $obj = new self($subject, $pkinfo);
89
-        if ($seq->hasTagged(0)) {
90
-            $obj->_attributes = Attributes::fromASN1(
91
-                $seq->getTagged(0)
92
-                    ->asImplicit(Element::TYPE_SET)
93
-                    ->asSet());
94
-        }
95
-        return $obj;
96
-    }
97
-    
98
-    /**
99
-     * Get version.
100
-     *
101
-     * @return int
102
-     */
103
-    public function version(): int
104
-    {
105
-        return $this->_version;
106
-    }
107
-    
108
-    /**
109
-     * Get self with subject.
110
-     *
111
-     * @param Name $subject
112
-     * @return self
113
-     */
114
-    public function withSubject(Name $subject): self
115
-    {
116
-        $obj = clone $this;
117
-        $obj->_subject = $subject;
118
-        return $obj;
119
-    }
120
-    
121
-    /**
122
-     * Get subject.
123
-     *
124
-     * @return Name
125
-     */
126
-    public function subject(): Name
127
-    {
128
-        return $this->_subject;
129
-    }
130
-    
131
-    /**
132
-     * Get subject public key info.
133
-     *
134
-     * @return PublicKeyInfo
135
-     */
136
-    public function subjectPKInfo(): PublicKeyInfo
137
-    {
138
-        return $this->_subjectPKInfo;
139
-    }
140
-    
141
-    /**
142
-     * Whether certification request info has attributes.
143
-     *
144
-     * @return bool
145
-     */
146
-    public function hasAttributes(): bool
147
-    {
148
-        return isset($this->_attributes);
149
-    }
150
-    
151
-    /**
152
-     * Get attributes.
153
-     *
154
-     * @throws \LogicException
155
-     * @return Attributes
156
-     */
157
-    public function attributes(): Attributes
158
-    {
159
-        if (!$this->hasAttributes()) {
160
-            throw new \LogicException("No attributes.");
161
-        }
162
-        return $this->_attributes;
163
-    }
164
-    
165
-    /**
166
-     * Get instance of self with attributes.
167
-     *
168
-     * @param Attributes $attribs
169
-     */
170
-    public function withAttributes(Attributes $attribs): self
171
-    {
172
-        $obj = clone $this;
173
-        $obj->_attributes = $attribs;
174
-        return $obj;
175
-    }
176
-    
177
-    /**
178
-     * Get self with extension request attribute.
179
-     *
180
-     * @param Extensions $extensions Extensions to request
181
-     * @return self
182
-     */
183
-    public function withExtensionRequest(Extensions $extensions): self
184
-    {
185
-        $obj = clone $this;
186
-        if (!isset($obj->_attributes)) {
187
-            $obj->_attributes = new Attributes();
188
-        }
189
-        $obj->_attributes = $obj->_attributes->withUnique(
190
-            Attribute::fromAttributeValues(
191
-                new ExtensionRequestValue($extensions)));
192
-        return $obj;
193
-    }
194
-    
195
-    /**
196
-     * Generate ASN.1 structure.
197
-     *
198
-     * @return Sequence
199
-     */
200
-    public function toASN1(): Sequence
201
-    {
202
-        $elements = array(new Integer($this->_version),
203
-            $this->_subject->toASN1(), $this->_subjectPKInfo->toASN1());
204
-        if (isset($this->_attributes)) {
205
-            $elements[] = new ImplicitlyTaggedType(0,
206
-                $this->_attributes->toASN1());
207
-        }
208
-        return new Sequence(...$elements);
209
-    }
210
-    
211
-    /**
212
-     * Create signed CertificationRequest.
213
-     *
214
-     * @param SignatureAlgorithmIdentifier $algo Algorithm used for signing
215
-     * @param PrivateKeyInfo $privkey_info Private key used for signing
216
-     * @param Crypto|null $crypto Crypto engine, use default if not set
217
-     * @return CertificationRequest
218
-     */
219
-    public function sign(SignatureAlgorithmIdentifier $algo,
220
-        PrivateKeyInfo $privkey_info, Crypto $crypto = null): CertificationRequest
221
-    {
222
-        $crypto = $crypto ?: Crypto::getDefault();
223
-        $data = $this->toASN1()->toDER();
224
-        $signature = $crypto->sign($data, $privkey_info, $algo);
225
-        return new CertificationRequest($this, $algo, $signature);
226
-    }
27
+	const VERSION_1 = 0;
28
+    
29
+	/**
30
+	 * Version.
31
+	 *
32
+	 * @var int
33
+	 */
34
+	protected $_version;
35
+    
36
+	/**
37
+	 * Subject.
38
+	 *
39
+	 * @var Name $_subject
40
+	 */
41
+	protected $_subject;
42
+    
43
+	/**
44
+	 * Public key info.
45
+	 *
46
+	 * @var PublicKeyInfo $_subjectPKInfo
47
+	 */
48
+	protected $_subjectPKInfo;
49
+    
50
+	/**
51
+	 * Attributes.
52
+	 *
53
+	 * @var Attributes|null $_attributes
54
+	 */
55
+	protected $_attributes;
56
+    
57
+	/**
58
+	 * Constructor.
59
+	 *
60
+	 * @param Name $subject Subject
61
+	 * @param PublicKeyInfo $pkinfo Public key info
62
+	 */
63
+	public function __construct(Name $subject, PublicKeyInfo $pkinfo)
64
+	{
65
+		$this->_version = self::VERSION_1;
66
+		$this->_subject = $subject;
67
+		$this->_subjectPKInfo = $pkinfo;
68
+	}
69
+    
70
+	/**
71
+	 * Initialize from ASN.1.
72
+	 *
73
+	 * @param Sequence $seq
74
+	 * @throws \UnexpectedValueException
75
+	 * @return self
76
+	 */
77
+	public static function fromASN1(Sequence $seq): self
78
+	{
79
+		$version = $seq->at(0)
80
+			->asInteger()
81
+			->intNumber();
82
+		if ($version != self::VERSION_1) {
83
+			throw new \UnexpectedValueException(
84
+				"Version $version not supported.");
85
+		}
86
+		$subject = Name::fromASN1($seq->at(1)->asSequence());
87
+		$pkinfo = PublicKeyInfo::fromASN1($seq->at(2)->asSequence());
88
+		$obj = new self($subject, $pkinfo);
89
+		if ($seq->hasTagged(0)) {
90
+			$obj->_attributes = Attributes::fromASN1(
91
+				$seq->getTagged(0)
92
+					->asImplicit(Element::TYPE_SET)
93
+					->asSet());
94
+		}
95
+		return $obj;
96
+	}
97
+    
98
+	/**
99
+	 * Get version.
100
+	 *
101
+	 * @return int
102
+	 */
103
+	public function version(): int
104
+	{
105
+		return $this->_version;
106
+	}
107
+    
108
+	/**
109
+	 * Get self with subject.
110
+	 *
111
+	 * @param Name $subject
112
+	 * @return self
113
+	 */
114
+	public function withSubject(Name $subject): self
115
+	{
116
+		$obj = clone $this;
117
+		$obj->_subject = $subject;
118
+		return $obj;
119
+	}
120
+    
121
+	/**
122
+	 * Get subject.
123
+	 *
124
+	 * @return Name
125
+	 */
126
+	public function subject(): Name
127
+	{
128
+		return $this->_subject;
129
+	}
130
+    
131
+	/**
132
+	 * Get subject public key info.
133
+	 *
134
+	 * @return PublicKeyInfo
135
+	 */
136
+	public function subjectPKInfo(): PublicKeyInfo
137
+	{
138
+		return $this->_subjectPKInfo;
139
+	}
140
+    
141
+	/**
142
+	 * Whether certification request info has attributes.
143
+	 *
144
+	 * @return bool
145
+	 */
146
+	public function hasAttributes(): bool
147
+	{
148
+		return isset($this->_attributes);
149
+	}
150
+    
151
+	/**
152
+	 * Get attributes.
153
+	 *
154
+	 * @throws \LogicException
155
+	 * @return Attributes
156
+	 */
157
+	public function attributes(): Attributes
158
+	{
159
+		if (!$this->hasAttributes()) {
160
+			throw new \LogicException("No attributes.");
161
+		}
162
+		return $this->_attributes;
163
+	}
164
+    
165
+	/**
166
+	 * Get instance of self with attributes.
167
+	 *
168
+	 * @param Attributes $attribs
169
+	 */
170
+	public function withAttributes(Attributes $attribs): self
171
+	{
172
+		$obj = clone $this;
173
+		$obj->_attributes = $attribs;
174
+		return $obj;
175
+	}
176
+    
177
+	/**
178
+	 * Get self with extension request attribute.
179
+	 *
180
+	 * @param Extensions $extensions Extensions to request
181
+	 * @return self
182
+	 */
183
+	public function withExtensionRequest(Extensions $extensions): self
184
+	{
185
+		$obj = clone $this;
186
+		if (!isset($obj->_attributes)) {
187
+			$obj->_attributes = new Attributes();
188
+		}
189
+		$obj->_attributes = $obj->_attributes->withUnique(
190
+			Attribute::fromAttributeValues(
191
+				new ExtensionRequestValue($extensions)));
192
+		return $obj;
193
+	}
194
+    
195
+	/**
196
+	 * Generate ASN.1 structure.
197
+	 *
198
+	 * @return Sequence
199
+	 */
200
+	public function toASN1(): Sequence
201
+	{
202
+		$elements = array(new Integer($this->_version),
203
+			$this->_subject->toASN1(), $this->_subjectPKInfo->toASN1());
204
+		if (isset($this->_attributes)) {
205
+			$elements[] = new ImplicitlyTaggedType(0,
206
+				$this->_attributes->toASN1());
207
+		}
208
+		return new Sequence(...$elements);
209
+	}
210
+    
211
+	/**
212
+	 * Create signed CertificationRequest.
213
+	 *
214
+	 * @param SignatureAlgorithmIdentifier $algo Algorithm used for signing
215
+	 * @param PrivateKeyInfo $privkey_info Private key used for signing
216
+	 * @param Crypto|null $crypto Crypto engine, use default if not set
217
+	 * @return CertificationRequest
218
+	 */
219
+	public function sign(SignatureAlgorithmIdentifier $algo,
220
+		PrivateKeyInfo $privkey_info, Crypto $crypto = null): CertificationRequest
221
+	{
222
+		$crypto = $crypto ?: Crypto::getDefault();
223
+		$data = $this->toASN1()->toDER();
224
+		$signature = $crypto->sign($data, $privkey_info, $algo);
225
+		return new CertificationRequest($this, $algo, $signature);
226
+	}
227 227
 }
Please login to merge, or discard this patch.
lib/X509/CertificationRequest/CertificationRequest.php 1 patch
Indentation   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -18,172 +18,172 @@
 block discarded – undo
18 18
  */
19 19
 class CertificationRequest
20 20
 {
21
-    /**
22
-     * Certification request info.
23
-     *
24
-     * @var CertificationRequestInfo $_certificationRequestInfo
25
-     */
26
-    protected $_certificationRequestInfo;
21
+	/**
22
+	 * Certification request info.
23
+	 *
24
+	 * @var CertificationRequestInfo $_certificationRequestInfo
25
+	 */
26
+	protected $_certificationRequestInfo;
27 27
     
28
-    /**
29
-     * Signature algorithm.
30
-     *
31
-     * @var SignatureAlgorithmIdentifier $_signatureAlgorithm
32
-     */
33
-    protected $_signatureAlgorithm;
28
+	/**
29
+	 * Signature algorithm.
30
+	 *
31
+	 * @var SignatureAlgorithmIdentifier $_signatureAlgorithm
32
+	 */
33
+	protected $_signatureAlgorithm;
34 34
     
35
-    /**
36
-     * Signature.
37
-     *
38
-     * @var Signature $_signature
39
-     */
40
-    protected $_signature;
35
+	/**
36
+	 * Signature.
37
+	 *
38
+	 * @var Signature $_signature
39
+	 */
40
+	protected $_signature;
41 41
     
42
-    /**
43
-     * Constructor.
44
-     *
45
-     * @param CertificationRequestInfo $info
46
-     * @param SignatureAlgorithmIdentifier $algo
47
-     * @param Signature $signature
48
-     */
49
-    public function __construct(CertificationRequestInfo $info,
50
-        SignatureAlgorithmIdentifier $algo, Signature $signature)
51
-    {
52
-        $this->_certificationRequestInfo = $info;
53
-        $this->_signatureAlgorithm = $algo;
54
-        $this->_signature = $signature;
55
-    }
42
+	/**
43
+	 * Constructor.
44
+	 *
45
+	 * @param CertificationRequestInfo $info
46
+	 * @param SignatureAlgorithmIdentifier $algo
47
+	 * @param Signature $signature
48
+	 */
49
+	public function __construct(CertificationRequestInfo $info,
50
+		SignatureAlgorithmIdentifier $algo, Signature $signature)
51
+	{
52
+		$this->_certificationRequestInfo = $info;
53
+		$this->_signatureAlgorithm = $algo;
54
+		$this->_signature = $signature;
55
+	}
56 56
     
57
-    /**
58
-     * Initialize from ASN.1.
59
-     *
60
-     * @param Sequence $seq
61
-     * @return self
62
-     */
63
-    public static function fromASN1(Sequence $seq): self
64
-    {
65
-        $info = CertificationRequestInfo::fromASN1($seq->at(0)->asSequence());
66
-        $algo = AlgorithmIdentifier::fromASN1($seq->at(1)->asSequence());
67
-        if (!$algo instanceof SignatureAlgorithmIdentifier) {
68
-            throw new \UnexpectedValueException(
69
-                "Unsupported signature algorithm " . $algo->oid() . ".");
70
-        }
71
-        $signature = Signature::fromSignatureData(
72
-            $seq->at(2)
73
-                ->asBitString()
74
-                ->string(), $algo);
75
-        return new self($info, $algo, $signature);
76
-    }
57
+	/**
58
+	 * Initialize from ASN.1.
59
+	 *
60
+	 * @param Sequence $seq
61
+	 * @return self
62
+	 */
63
+	public static function fromASN1(Sequence $seq): self
64
+	{
65
+		$info = CertificationRequestInfo::fromASN1($seq->at(0)->asSequence());
66
+		$algo = AlgorithmIdentifier::fromASN1($seq->at(1)->asSequence());
67
+		if (!$algo instanceof SignatureAlgorithmIdentifier) {
68
+			throw new \UnexpectedValueException(
69
+				"Unsupported signature algorithm " . $algo->oid() . ".");
70
+		}
71
+		$signature = Signature::fromSignatureData(
72
+			$seq->at(2)
73
+				->asBitString()
74
+				->string(), $algo);
75
+		return new self($info, $algo, $signature);
76
+	}
77 77
     
78
-    /**
79
-     * Initialize from DER.
80
-     *
81
-     * @param string $data
82
-     * @return self
83
-     */
84
-    public static function fromDER(string $data): self
85
-    {
86
-        return self::fromASN1(Sequence::fromDER($data));
87
-    }
78
+	/**
79
+	 * Initialize from DER.
80
+	 *
81
+	 * @param string $data
82
+	 * @return self
83
+	 */
84
+	public static function fromDER(string $data): self
85
+	{
86
+		return self::fromASN1(Sequence::fromDER($data));
87
+	}
88 88
     
89
-    /**
90
-     * Initialize from PEM.
91
-     *
92
-     * @param PEM $pem
93
-     * @throws \UnexpectedValueException
94
-     * @return self
95
-     */
96
-    public static function fromPEM(PEM $pem): self
97
-    {
98
-        if ($pem->type() !== PEM::TYPE_CERTIFICATE_REQUEST) {
99
-            throw new \UnexpectedValueException("Invalid PEM type.");
100
-        }
101
-        return self::fromDER($pem->data());
102
-    }
89
+	/**
90
+	 * Initialize from PEM.
91
+	 *
92
+	 * @param PEM $pem
93
+	 * @throws \UnexpectedValueException
94
+	 * @return self
95
+	 */
96
+	public static function fromPEM(PEM $pem): self
97
+	{
98
+		if ($pem->type() !== PEM::TYPE_CERTIFICATE_REQUEST) {
99
+			throw new \UnexpectedValueException("Invalid PEM type.");
100
+		}
101
+		return self::fromDER($pem->data());
102
+	}
103 103
     
104
-    /**
105
-     * Get certification request info.
106
-     *
107
-     * @return CertificationRequestInfo
108
-     */
109
-    public function certificationRequestInfo(): CertificationRequestInfo
110
-    {
111
-        return $this->_certificationRequestInfo;
112
-    }
104
+	/**
105
+	 * Get certification request info.
106
+	 *
107
+	 * @return CertificationRequestInfo
108
+	 */
109
+	public function certificationRequestInfo(): CertificationRequestInfo
110
+	{
111
+		return $this->_certificationRequestInfo;
112
+	}
113 113
     
114
-    /**
115
-     * Get signature algorithm.
116
-     *
117
-     * @return SignatureAlgorithmIdentifier
118
-     */
119
-    public function signatureAlgorithm(): SignatureAlgorithmIdentifier
120
-    {
121
-        return $this->_signatureAlgorithm;
122
-    }
114
+	/**
115
+	 * Get signature algorithm.
116
+	 *
117
+	 * @return SignatureAlgorithmIdentifier
118
+	 */
119
+	public function signatureAlgorithm(): SignatureAlgorithmIdentifier
120
+	{
121
+		return $this->_signatureAlgorithm;
122
+	}
123 123
     
124
-    /**
125
-     * Get signature.
126
-     *
127
-     * @return Signature
128
-     */
129
-    public function signature(): Signature
130
-    {
131
-        return $this->_signature;
132
-    }
124
+	/**
125
+	 * Get signature.
126
+	 *
127
+	 * @return Signature
128
+	 */
129
+	public function signature(): Signature
130
+	{
131
+		return $this->_signature;
132
+	}
133 133
     
134
-    /**
135
-     * Generate ASN.1 structure.
136
-     *
137
-     * @return Sequence
138
-     */
139
-    public function toASN1(): Sequence
140
-    {
141
-        return new Sequence($this->_certificationRequestInfo->toASN1(),
142
-            $this->_signatureAlgorithm->toASN1(), $this->_signature->bitString());
143
-    }
134
+	/**
135
+	 * Generate ASN.1 structure.
136
+	 *
137
+	 * @return Sequence
138
+	 */
139
+	public function toASN1(): Sequence
140
+	{
141
+		return new Sequence($this->_certificationRequestInfo->toASN1(),
142
+			$this->_signatureAlgorithm->toASN1(), $this->_signature->bitString());
143
+	}
144 144
     
145
-    /**
146
-     * Get certification request as a DER.
147
-     *
148
-     * @return string
149
-     */
150
-    public function toDER(): string
151
-    {
152
-        return $this->toASN1()->toDER();
153
-    }
145
+	/**
146
+	 * Get certification request as a DER.
147
+	 *
148
+	 * @return string
149
+	 */
150
+	public function toDER(): string
151
+	{
152
+		return $this->toASN1()->toDER();
153
+	}
154 154
     
155
-    /**
156
-     * Get certification request as a PEM.
157
-     *
158
-     * @return PEM
159
-     */
160
-    public function toPEM(): PEM
161
-    {
162
-        return new PEM(PEM::TYPE_CERTIFICATE_REQUEST, $this->toDER());
163
-    }
155
+	/**
156
+	 * Get certification request as a PEM.
157
+	 *
158
+	 * @return PEM
159
+	 */
160
+	public function toPEM(): PEM
161
+	{
162
+		return new PEM(PEM::TYPE_CERTIFICATE_REQUEST, $this->toDER());
163
+	}
164 164
     
165
-    /**
166
-     * Verify certification request signature.
167
-     *
168
-     * @param Crypto|null $crypto Crypto engine, use default if not set
169
-     * @return bool True if signature matches
170
-     */
171
-    public function verify(Crypto $crypto = null): bool
172
-    {
173
-        $crypto = $crypto ?: Crypto::getDefault();
174
-        $data = $this->_certificationRequestInfo->toASN1()->toDER();
175
-        $pk_info = $this->_certificationRequestInfo->subjectPKInfo();
176
-        return $crypto->verify($data, $this->_signature, $pk_info,
177
-            $this->_signatureAlgorithm);
178
-    }
165
+	/**
166
+	 * Verify certification request signature.
167
+	 *
168
+	 * @param Crypto|null $crypto Crypto engine, use default if not set
169
+	 * @return bool True if signature matches
170
+	 */
171
+	public function verify(Crypto $crypto = null): bool
172
+	{
173
+		$crypto = $crypto ?: Crypto::getDefault();
174
+		$data = $this->_certificationRequestInfo->toASN1()->toDER();
175
+		$pk_info = $this->_certificationRequestInfo->subjectPKInfo();
176
+		return $crypto->verify($data, $this->_signature, $pk_info,
177
+			$this->_signatureAlgorithm);
178
+	}
179 179
     
180
-    /**
181
-     * Get certification request as a PEM formatted string.
182
-     *
183
-     * @return string
184
-     */
185
-    public function __toString()
186
-    {
187
-        return $this->toPEM()->string();
188
-    }
180
+	/**
181
+	 * Get certification request as a PEM formatted string.
182
+	 *
183
+	 * @return string
184
+	 */
185
+	public function __toString()
186
+	{
187
+		return $this->toPEM()->string();
188
+	}
189 189
 }
Please login to merge, or discard this patch.
lib/X509/CertificationRequest/Attribute/ExtensionRequestValue.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -17,94 +17,94 @@
 block discarded – undo
17 17
  */
18 18
 class ExtensionRequestValue extends AttributeValue
19 19
 {
20
-    const OID = "1.2.840.113549.1.9.14";
20
+	const OID = "1.2.840.113549.1.9.14";
21 21
     
22
-    /**
23
-     * Extensions.
24
-     *
25
-     * @var Extensions $_extensions
26
-     */
27
-    protected $_extensions;
22
+	/**
23
+	 * Extensions.
24
+	 *
25
+	 * @var Extensions $_extensions
26
+	 */
27
+	protected $_extensions;
28 28
     
29
-    /**
30
-     * Constructor.
31
-     *
32
-     * @param Extensions $extensions
33
-     */
34
-    public function __construct(Extensions $extensions)
35
-    {
36
-        $this->_extensions = $extensions;
37
-        $this->_oid = self::OID;
38
-    }
29
+	/**
30
+	 * Constructor.
31
+	 *
32
+	 * @param Extensions $extensions
33
+	 */
34
+	public function __construct(Extensions $extensions)
35
+	{
36
+		$this->_extensions = $extensions;
37
+		$this->_oid = self::OID;
38
+	}
39 39
     
40
-    /**
41
-     *
42
-     * @see \X501\ASN1\AttributeValue\AttributeValue::fromASN1()
43
-     * @param UnspecifiedType $el
44
-     * @return self
45
-     */
46
-    public static function fromASN1(UnspecifiedType $el): self
47
-    {
48
-        return new self(Extensions::fromASN1($el->asSequence()));
49
-    }
40
+	/**
41
+	 *
42
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::fromASN1()
43
+	 * @param UnspecifiedType $el
44
+	 * @return self
45
+	 */
46
+	public static function fromASN1(UnspecifiedType $el): self
47
+	{
48
+		return new self(Extensions::fromASN1($el->asSequence()));
49
+	}
50 50
     
51
-    /**
52
-     * Get requested extensions.
53
-     *
54
-     * @return Extensions
55
-     */
56
-    public function extensions(): Extensions
57
-    {
58
-        return $this->_extensions;
59
-    }
51
+	/**
52
+	 * Get requested extensions.
53
+	 *
54
+	 * @return Extensions
55
+	 */
56
+	public function extensions(): Extensions
57
+	{
58
+		return $this->_extensions;
59
+	}
60 60
     
61
-    /**
62
-     *
63
-     * @see \X501\ASN1\AttributeValue\AttributeValue::toASN1()
64
-     * @return Sequence
65
-     */
66
-    public function toASN1(): Sequence
67
-    {
68
-        return $this->_extensions->toASN1();
69
-    }
61
+	/**
62
+	 *
63
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::toASN1()
64
+	 * @return Sequence
65
+	 */
66
+	public function toASN1(): Sequence
67
+	{
68
+		return $this->_extensions->toASN1();
69
+	}
70 70
     
71
-    /**
72
-     *
73
-     * @see \X501\ASN1\AttributeValue\AttributeValue::stringValue()
74
-     * @return string
75
-     */
76
-    public function stringValue(): string
77
-    {
78
-        return "#" . bin2hex($this->toASN1()->toDER());
79
-    }
71
+	/**
72
+	 *
73
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::stringValue()
74
+	 * @return string
75
+	 */
76
+	public function stringValue(): string
77
+	{
78
+		return "#" . bin2hex($this->toASN1()->toDER());
79
+	}
80 80
     
81
-    /**
82
-     *
83
-     * @see \X501\ASN1\AttributeValue\AttributeValue::equalityMatchingRule()
84
-     * @return BinaryMatch
85
-     */
86
-    public function equalityMatchingRule(): BinaryMatch
87
-    {
88
-        return new BinaryMatch();
89
-    }
81
+	/**
82
+	 *
83
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::equalityMatchingRule()
84
+	 * @return BinaryMatch
85
+	 */
86
+	public function equalityMatchingRule(): BinaryMatch
87
+	{
88
+		return new BinaryMatch();
89
+	}
90 90
     
91
-    /**
92
-     *
93
-     * @see \X501\ASN1\AttributeValue\AttributeValue::rfc2253String()
94
-     * @return string
95
-     */
96
-    public function rfc2253String(): string
97
-    {
98
-        return $this->stringValue();
99
-    }
91
+	/**
92
+	 *
93
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::rfc2253String()
94
+	 * @return string
95
+	 */
96
+	public function rfc2253String(): string
97
+	{
98
+		return $this->stringValue();
99
+	}
100 100
     
101
-    /**
102
-     *
103
-     * @see \X501\ASN1\AttributeValue\AttributeValue::_transcodedString()
104
-     * @return string
105
-     */
106
-    protected function _transcodedString(): string
107
-    {
108
-        return $this->stringValue();
109
-    }
101
+	/**
102
+	 *
103
+	 * @see \X501\ASN1\AttributeValue\AttributeValue::_transcodedString()
104
+	 * @return string
105
+	 */
106
+	protected function _transcodedString(): string
107
+	{
108
+		return $this->stringValue();
109
+	}
110 110
 }
Please login to merge, or discard this patch.
lib/X509/CertificationRequest/Attributes.php 2 patches
Indentation   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -20,107 +20,107 @@
 block discarded – undo
20 20
  */
21 21
 class Attributes implements \Countable, \IteratorAggregate
22 22
 {
23
-    use AttributeContainer;
23
+	use AttributeContainer;
24 24
     
25
-    /**
26
-     * Mapping from OID to attribute value class name.
27
-     *
28
-     * @internal
29
-     *
30
-     * @var array
31
-     */
32
-    const MAP_OID_TO_CLASS = array(
33
-        /* @formatter:off */
34
-        ExtensionRequestValue::OID => ExtensionRequestValue::class
35
-        /* @formatter:on */
36
-    );
25
+	/**
26
+	 * Mapping from OID to attribute value class name.
27
+	 *
28
+	 * @internal
29
+	 *
30
+	 * @var array
31
+	 */
32
+	const MAP_OID_TO_CLASS = array(
33
+		/* @formatter:off */
34
+		ExtensionRequestValue::OID => ExtensionRequestValue::class
35
+		/* @formatter:on */
36
+	);
37 37
     
38
-    /**
39
-     * Constructor.
40
-     *
41
-     * @param Attribute ...$attribs Attribute objects
42
-     */
43
-    public function __construct(Attribute ...$attribs)
44
-    {
45
-        $this->_attributes = $attribs;
46
-    }
38
+	/**
39
+	 * Constructor.
40
+	 *
41
+	 * @param Attribute ...$attribs Attribute objects
42
+	 */
43
+	public function __construct(Attribute ...$attribs)
44
+	{
45
+		$this->_attributes = $attribs;
46
+	}
47 47
     
48
-    /**
49
-     * Initialize from attribute values.
50
-     *
51
-     * @param AttributeValue ...$values
52
-     * @return self
53
-     */
54
-    public static function fromAttributeValues(AttributeValue ...$values): self
55
-    {
56
-        $attribs = array_map(
57
-            function (AttributeValue $value) {
58
-                return $value->toAttribute();
59
-            }, $values);
60
-        return new self(...$attribs);
61
-    }
48
+	/**
49
+	 * Initialize from attribute values.
50
+	 *
51
+	 * @param AttributeValue ...$values
52
+	 * @return self
53
+	 */
54
+	public static function fromAttributeValues(AttributeValue ...$values): self
55
+	{
56
+		$attribs = array_map(
57
+			function (AttributeValue $value) {
58
+				return $value->toAttribute();
59
+			}, $values);
60
+		return new self(...$attribs);
61
+	}
62 62
     
63
-    /**
64
-     * Initialize from ASN.1.
65
-     *
66
-     * @param Set $set
67
-     * @return self
68
-     */
69
-    public static function fromASN1(Set $set): self
70
-    {
71
-        $attribs = array_map(
72
-            function (UnspecifiedType $el) {
73
-                return Attribute::fromASN1($el->asSequence());
74
-            }, $set->elements());
75
-        // cast attributes
76
-        $attribs = array_map(
77
-            function (Attribute $attr) {
78
-                $oid = $attr->oid();
79
-                if (array_key_exists($oid, self::MAP_OID_TO_CLASS)) {
80
-                    $cls = self::MAP_OID_TO_CLASS[$oid];
81
-                    return $attr->castValues($cls);
82
-                }
83
-                return $attr;
84
-            }, $attribs);
85
-        return new self(...$attribs);
86
-    }
63
+	/**
64
+	 * Initialize from ASN.1.
65
+	 *
66
+	 * @param Set $set
67
+	 * @return self
68
+	 */
69
+	public static function fromASN1(Set $set): self
70
+	{
71
+		$attribs = array_map(
72
+			function (UnspecifiedType $el) {
73
+				return Attribute::fromASN1($el->asSequence());
74
+			}, $set->elements());
75
+		// cast attributes
76
+		$attribs = array_map(
77
+			function (Attribute $attr) {
78
+				$oid = $attr->oid();
79
+				if (array_key_exists($oid, self::MAP_OID_TO_CLASS)) {
80
+					$cls = self::MAP_OID_TO_CLASS[$oid];
81
+					return $attr->castValues($cls);
82
+				}
83
+				return $attr;
84
+			}, $attribs);
85
+		return new self(...$attribs);
86
+	}
87 87
     
88
-    /**
89
-     * Check whether extension request attribute is present.
90
-     *
91
-     * @return bool
92
-     */
93
-    public function hasExtensionRequest(): bool
94
-    {
95
-        return $this->has(ExtensionRequestValue::OID);
96
-    }
88
+	/**
89
+	 * Check whether extension request attribute is present.
90
+	 *
91
+	 * @return bool
92
+	 */
93
+	public function hasExtensionRequest(): bool
94
+	{
95
+		return $this->has(ExtensionRequestValue::OID);
96
+	}
97 97
     
98
-    /**
99
-     * Get extension request attribute value.
100
-     *
101
-     * @throws \LogicException
102
-     * @return ExtensionRequestValue
103
-     */
104
-    public function extensionRequest(): ExtensionRequestValue
105
-    {
106
-        if (!$this->hasExtensionRequest()) {
107
-            throw new \LogicException("No extension request attribute.");
108
-        }
109
-        return $this->firstOf(ExtensionRequestValue::OID)->first();
110
-    }
98
+	/**
99
+	 * Get extension request attribute value.
100
+	 *
101
+	 * @throws \LogicException
102
+	 * @return ExtensionRequestValue
103
+	 */
104
+	public function extensionRequest(): ExtensionRequestValue
105
+	{
106
+		if (!$this->hasExtensionRequest()) {
107
+			throw new \LogicException("No extension request attribute.");
108
+		}
109
+		return $this->firstOf(ExtensionRequestValue::OID)->first();
110
+	}
111 111
     
112
-    /**
113
-     * Generate ASN.1 structure.
114
-     *
115
-     * @return Set
116
-     */
117
-    public function toASN1(): Set
118
-    {
119
-        $elements = array_map(
120
-            function (Attribute $attr) {
121
-                return $attr->toASN1();
122
-            }, array_values($this->_attributes));
123
-        $set = new Set(...$elements);
124
-        return $set->sortedSetOf();
125
-    }
112
+	/**
113
+	 * Generate ASN.1 structure.
114
+	 *
115
+	 * @return Set
116
+	 */
117
+	public function toASN1(): Set
118
+	{
119
+		$elements = array_map(
120
+			function (Attribute $attr) {
121
+				return $attr->toASN1();
122
+			}, array_values($this->_attributes));
123
+		$set = new Set(...$elements);
124
+		return $set->sortedSetOf();
125
+	}
126 126
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
     public static function fromAttributeValues(AttributeValue ...$values): self
55 55
     {
56 56
         $attribs = array_map(
57
-            function (AttributeValue $value) {
57
+            function(AttributeValue $value) {
58 58
                 return $value->toAttribute();
59 59
             }, $values);
60 60
         return new self(...$attribs);
@@ -69,12 +69,12 @@  discard block
 block discarded – undo
69 69
     public static function fromASN1(Set $set): self
70 70
     {
71 71
         $attribs = array_map(
72
-            function (UnspecifiedType $el) {
72
+            function(UnspecifiedType $el) {
73 73
                 return Attribute::fromASN1($el->asSequence());
74 74
             }, $set->elements());
75 75
         // cast attributes
76 76
         $attribs = array_map(
77
-            function (Attribute $attr) {
77
+            function(Attribute $attr) {
78 78
                 $oid = $attr->oid();
79 79
                 if (array_key_exists($oid, self::MAP_OID_TO_CLASS)) {
80 80
                     $cls = self::MAP_OID_TO_CLASS[$oid];
@@ -117,7 +117,7 @@  discard block
 block discarded – undo
117 117
     public function toASN1(): Set
118 118
     {
119 119
         $elements = array_map(
120
-            function (Attribute $attr) {
120
+            function(Attribute $attr) {
121 121
                 return $attr->toASN1();
122 122
             }, array_values($this->_attributes));
123 123
         $set = new Set(...$elements);
Please login to merge, or discard this patch.