Passed
Push — php72 ( a3eac9...46ea07 )
by Joni
02:06
created
lib/X501/ASN1/Feature/TypedAttribute.php 2 patches
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -11,30 +11,30 @@
 block discarded – undo
11 11
  */
12 12
 trait TypedAttribute
13 13
 {
14
-    /**
15
-     * Attribute type.
16
-     *
17
-     * @var AttributeType
18
-     */
19
-    protected $_type;
14
+	/**
15
+	 * Attribute type.
16
+	 *
17
+	 * @var AttributeType
18
+	 */
19
+	protected $_type;
20 20
 
21
-    /**
22
-     * Get attribute type.
23
-     *
24
-     * @return AttributeType
25
-     */
26
-    public function type(): AttributeType
27
-    {
28
-        return $this->_type;
29
-    }
21
+	/**
22
+	 * Get attribute type.
23
+	 *
24
+	 * @return AttributeType
25
+	 */
26
+	public function type(): AttributeType
27
+	{
28
+		return $this->_type;
29
+	}
30 30
 
31
-    /**
32
-     * Get OID of the attribute.
33
-     *
34
-     * @return string
35
-     */
36
-    public function oid(): string
37
-    {
38
-        return $this->_type->oid();
39
-    }
31
+	/**
32
+	 * Get OID of the attribute.
33
+	 *
34
+	 * @return string
35
+	 */
36
+	public function oid(): string
37
+	{
38
+		return $this->_type->oid();
39
+	}
40 40
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\ASN1\Feature;
6 6
 
Please login to merge, or discard this patch.
lib/X501/ASN1/RDN.php 2 patches
Indentation   +158 added lines, -158 removed lines patch added patch discarded remove patch
@@ -15,173 +15,173 @@
 block discarded – undo
15 15
  */
16 16
 class RDN implements \Countable, \IteratorAggregate
17 17
 {
18
-    /**
19
-     * Attributes.
20
-     *
21
-     * @var AttributeTypeAndValue[]
22
-     */
23
-    protected $_attribs;
18
+	/**
19
+	 * Attributes.
20
+	 *
21
+	 * @var AttributeTypeAndValue[]
22
+	 */
23
+	protected $_attribs;
24 24
 
25
-    /**
26
-     * Constructor.
27
-     *
28
-     * @param AttributeTypeAndValue ...$attribs One or more attributes
29
-     */
30
-    public function __construct(AttributeTypeAndValue ...$attribs)
31
-    {
32
-        if (!count($attribs)) {
33
-            throw new \UnexpectedValueException(
34
-                'RDN must have at least one AttributeTypeAndValue.');
35
-        }
36
-        $this->_attribs = $attribs;
37
-    }
25
+	/**
26
+	 * Constructor.
27
+	 *
28
+	 * @param AttributeTypeAndValue ...$attribs One or more attributes
29
+	 */
30
+	public function __construct(AttributeTypeAndValue ...$attribs)
31
+	{
32
+		if (!count($attribs)) {
33
+			throw new \UnexpectedValueException(
34
+				'RDN must have at least one AttributeTypeAndValue.');
35
+		}
36
+		$this->_attribs = $attribs;
37
+	}
38 38
 
39
-    /**
40
-     * @return string
41
-     */
42
-    public function __toString()
43
-    {
44
-        return $this->toString();
45
-    }
39
+	/**
40
+	 * @return string
41
+	 */
42
+	public function __toString()
43
+	{
44
+		return $this->toString();
45
+	}
46 46
 
47
-    /**
48
-     * Convenience method to initialize RDN from AttributeValue objects.
49
-     *
50
-     * @param AttributeValue ...$values One or more attributes
51
-     *
52
-     * @return self
53
-     */
54
-    public static function fromAttributeValues(AttributeValue ...$values): self
55
-    {
56
-        $attribs = array_map(
57
-            function (AttributeValue $value) {
58
-                return new AttributeTypeAndValue(
59
-                    new AttributeType($value->oid()), $value);
60
-            }, $values);
61
-        return new self(...$attribs);
62
-    }
47
+	/**
48
+	 * Convenience method to initialize RDN from AttributeValue objects.
49
+	 *
50
+	 * @param AttributeValue ...$values One or more attributes
51
+	 *
52
+	 * @return self
53
+	 */
54
+	public static function fromAttributeValues(AttributeValue ...$values): self
55
+	{
56
+		$attribs = array_map(
57
+			function (AttributeValue $value) {
58
+				return new AttributeTypeAndValue(
59
+					new AttributeType($value->oid()), $value);
60
+			}, $values);
61
+		return new self(...$attribs);
62
+	}
63 63
 
64
-    /**
65
-     * Initialize from ASN.1.
66
-     *
67
-     * @param Set $set
68
-     *
69
-     * @return self
70
-     */
71
-    public static function fromASN1(Set $set): self
72
-    {
73
-        $attribs = array_map(
74
-            function (UnspecifiedType $el) {
75
-                return AttributeTypeAndValue::fromASN1($el->asSequence());
76
-            }, $set->elements());
77
-        return new self(...$attribs);
78
-    }
64
+	/**
65
+	 * Initialize from ASN.1.
66
+	 *
67
+	 * @param Set $set
68
+	 *
69
+	 * @return self
70
+	 */
71
+	public static function fromASN1(Set $set): self
72
+	{
73
+		$attribs = array_map(
74
+			function (UnspecifiedType $el) {
75
+				return AttributeTypeAndValue::fromASN1($el->asSequence());
76
+			}, $set->elements());
77
+		return new self(...$attribs);
78
+	}
79 79
 
80
-    /**
81
-     * Generate ASN.1 structure.
82
-     *
83
-     * @return Set
84
-     */
85
-    public function toASN1(): Set
86
-    {
87
-        $elements = array_map(
88
-            function (AttributeTypeAndValue $tv) {
89
-                return $tv->toASN1();
90
-            }, $this->_attribs);
91
-        $set = new Set(...$elements);
92
-        return $set->sortedSetOf();
93
-    }
80
+	/**
81
+	 * Generate ASN.1 structure.
82
+	 *
83
+	 * @return Set
84
+	 */
85
+	public function toASN1(): Set
86
+	{
87
+		$elements = array_map(
88
+			function (AttributeTypeAndValue $tv) {
89
+				return $tv->toASN1();
90
+			}, $this->_attribs);
91
+		$set = new Set(...$elements);
92
+		return $set->sortedSetOf();
93
+	}
94 94
 
95
-    /**
96
-     * Get name-component string conforming to RFC 2253.
97
-     *
98
-     * @see https://tools.ietf.org/html/rfc2253#section-2.2
99
-     *
100
-     * @return string
101
-     */
102
-    public function toString(): string
103
-    {
104
-        $parts = array_map(
105
-            function (AttributeTypeAndValue $tv) {
106
-                return $tv->toString();
107
-            }, $this->_attribs);
108
-        return implode('+', $parts);
109
-    }
95
+	/**
96
+	 * Get name-component string conforming to RFC 2253.
97
+	 *
98
+	 * @see https://tools.ietf.org/html/rfc2253#section-2.2
99
+	 *
100
+	 * @return string
101
+	 */
102
+	public function toString(): string
103
+	{
104
+		$parts = array_map(
105
+			function (AttributeTypeAndValue $tv) {
106
+				return $tv->toString();
107
+			}, $this->_attribs);
108
+		return implode('+', $parts);
109
+	}
110 110
 
111
-    /**
112
-     * Check whether RDN is semantically equal to other.
113
-     *
114
-     * @param RDN $other Object to compare to
115
-     *
116
-     * @return bool
117
-     */
118
-    public function equals(RDN $other): bool
119
-    {
120
-        // if attribute count doesn't match
121
-        if (count($this) != count($other)) {
122
-            return false;
123
-        }
124
-        $attribs1 = $this->_attribs;
125
-        $attribs2 = $other->_attribs;
126
-        // if there's multiple attributes, sort using SET OF rules
127
-        if (count($attribs1) > 1) {
128
-            $attribs1 = self::fromASN1($this->toASN1())->_attribs;
129
-            $attribs2 = self::fromASN1($other->toASN1())->_attribs;
130
-        }
131
-        for ($i = count($attribs1) - 1; $i >= 0; --$i) {
132
-            $tv1 = $attribs1[$i];
133
-            $tv2 = $attribs2[$i];
134
-            if (!$tv1->equals($tv2)) {
135
-                return false;
136
-            }
137
-        }
138
-        return true;
139
-    }
111
+	/**
112
+	 * Check whether RDN is semantically equal to other.
113
+	 *
114
+	 * @param RDN $other Object to compare to
115
+	 *
116
+	 * @return bool
117
+	 */
118
+	public function equals(RDN $other): bool
119
+	{
120
+		// if attribute count doesn't match
121
+		if (count($this) != count($other)) {
122
+			return false;
123
+		}
124
+		$attribs1 = $this->_attribs;
125
+		$attribs2 = $other->_attribs;
126
+		// if there's multiple attributes, sort using SET OF rules
127
+		if (count($attribs1) > 1) {
128
+			$attribs1 = self::fromASN1($this->toASN1())->_attribs;
129
+			$attribs2 = self::fromASN1($other->toASN1())->_attribs;
130
+		}
131
+		for ($i = count($attribs1) - 1; $i >= 0; --$i) {
132
+			$tv1 = $attribs1[$i];
133
+			$tv2 = $attribs2[$i];
134
+			if (!$tv1->equals($tv2)) {
135
+				return false;
136
+			}
137
+		}
138
+		return true;
139
+	}
140 140
 
141
-    /**
142
-     * Get all AttributeTypeAndValue objects.
143
-     *
144
-     * @return AttributeTypeAndValue[]
145
-     */
146
-    public function all(): array
147
-    {
148
-        return $this->_attribs;
149
-    }
141
+	/**
142
+	 * Get all AttributeTypeAndValue objects.
143
+	 *
144
+	 * @return AttributeTypeAndValue[]
145
+	 */
146
+	public function all(): array
147
+	{
148
+		return $this->_attribs;
149
+	}
150 150
 
151
-    /**
152
-     * Get all AttributeTypeAndValue objects of the given attribute type.
153
-     *
154
-     * @param string $name Attribute OID or name
155
-     *
156
-     * @return AttributeTypeAndValue[]
157
-     */
158
-    public function allOf(string $name): array
159
-    {
160
-        $oid = AttributeType::attrNameToOID($name);
161
-        $attribs = array_filter($this->_attribs,
162
-            function (AttributeTypeAndValue $tv) use ($oid) {
163
-                return $tv->oid() == $oid;
164
-            });
165
-        return array_values($attribs);
166
-    }
151
+	/**
152
+	 * Get all AttributeTypeAndValue objects of the given attribute type.
153
+	 *
154
+	 * @param string $name Attribute OID or name
155
+	 *
156
+	 * @return AttributeTypeAndValue[]
157
+	 */
158
+	public function allOf(string $name): array
159
+	{
160
+		$oid = AttributeType::attrNameToOID($name);
161
+		$attribs = array_filter($this->_attribs,
162
+			function (AttributeTypeAndValue $tv) use ($oid) {
163
+				return $tv->oid() == $oid;
164
+			});
165
+		return array_values($attribs);
166
+	}
167 167
 
168
-    /**
169
-     * @see \Countable::count()
170
-     *
171
-     * @return int
172
-     */
173
-    public function count(): int
174
-    {
175
-        return count($this->_attribs);
176
-    }
168
+	/**
169
+	 * @see \Countable::count()
170
+	 *
171
+	 * @return int
172
+	 */
173
+	public function count(): int
174
+	{
175
+		return count($this->_attribs);
176
+	}
177 177
 
178
-    /**
179
-     * @see \IteratorAggregate::getIterator()
180
-     *
181
-     * @return \ArrayIterator
182
-     */
183
-    public function getIterator(): \ArrayIterator
184
-    {
185
-        return new \ArrayIterator($this->_attribs);
186
-    }
178
+	/**
179
+	 * @see \IteratorAggregate::getIterator()
180
+	 *
181
+	 * @return \ArrayIterator
182
+	 */
183
+	public function getIterator(): \ArrayIterator
184
+	{
185
+		return new \ArrayIterator($this->_attribs);
186
+	}
187 187
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\ASN1;
6 6
 
@@ -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 new AttributeTypeAndValue(
59 59
                     new AttributeType($value->oid()), $value);
60 60
             }, $values);
@@ -71,7 +71,7 @@  discard block
 block discarded – undo
71 71
     public static function fromASN1(Set $set): self
72 72
     {
73 73
         $attribs = array_map(
74
-            function (UnspecifiedType $el) {
74
+            function(UnspecifiedType $el) {
75 75
                 return AttributeTypeAndValue::fromASN1($el->asSequence());
76 76
             }, $set->elements());
77 77
         return new self(...$attribs);
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
     public function toASN1(): Set
86 86
     {
87 87
         $elements = array_map(
88
-            function (AttributeTypeAndValue $tv) {
88
+            function(AttributeTypeAndValue $tv) {
89 89
                 return $tv->toASN1();
90 90
             }, $this->_attribs);
91 91
         $set = new Set(...$elements);
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
     public function toString(): string
103 103
     {
104 104
         $parts = array_map(
105
-            function (AttributeTypeAndValue $tv) {
105
+            function(AttributeTypeAndValue $tv) {
106 106
                 return $tv->toString();
107 107
             }, $this->_attribs);
108 108
         return implode('+', $parts);
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
     {
160 160
         $oid = AttributeType::attrNameToOID($name);
161 161
         $attribs = array_filter($this->_attribs,
162
-            function (AttributeTypeAndValue $tv) use ($oid) {
162
+            function(AttributeTypeAndValue $tv) use ($oid) {
163 163
                 return $tv->oid() == $oid;
164 164
             });
165 165
         return array_values($attribs);
Please login to merge, or discard this patch.
lib/X501/MatchingRule/BinaryMatch.php 2 patches
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -11,11 +11,11 @@
 block discarded – undo
11 11
  */
12 12
 class BinaryMatch extends MatchingRule
13 13
 {
14
-    /**
15
-     * {@inheritdoc}
16
-     */
17
-    public function compare($assertion, $value): ?bool
18
-    {
19
-        return 0 == strcmp($assertion, $value);
20
-    }
14
+	/**
15
+	 * {@inheritdoc}
16
+	 */
17
+	public function compare($assertion, $value): ?bool
18
+	{
19
+		return 0 == strcmp($assertion, $value);
20
+	}
21 21
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\MatchingRule;
6 6
 
Please login to merge, or discard this patch.
lib/X501/MatchingRule/MatchingRule.php 2 patches
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -11,14 +11,14 @@
 block discarded – undo
11 11
  */
12 12
 abstract class MatchingRule
13 13
 {
14
-    /**
15
-     * Compare attribute value to assertion.
16
-     *
17
-     * @param mixed $assertion Value to assert
18
-     * @param mixed $value     Attribute value
19
-     *
20
-     * @return null|bool True if value matches. Null shall be returned if match
21
-     *                   evaluates to Undefined.
22
-     */
23
-    abstract public function compare($assertion, $value): ?bool;
14
+	/**
15
+	 * Compare attribute value to assertion.
16
+	 *
17
+	 * @param mixed $assertion Value to assert
18
+	 * @param mixed $value     Attribute value
19
+	 *
20
+	 * @return null|bool True if value matches. Null shall be returned if match
21
+	 *                   evaluates to Undefined.
22
+	 */
23
+	abstract public function compare($assertion, $value): ?bool;
24 24
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\MatchingRule;
6 6
 
Please login to merge, or discard this patch.
lib/X501/MatchingRule/StringPrepMatchingRule.php 2 patches
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -11,30 +11,30 @@
 block discarded – undo
11 11
  */
12 12
 abstract class StringPrepMatchingRule extends MatchingRule
13 13
 {
14
-    /**
15
-     * String preparer.
16
-     *
17
-     * @var StringPreparer
18
-     */
19
-    protected $_prep;
14
+	/**
15
+	 * String preparer.
16
+	 *
17
+	 * @var StringPreparer
18
+	 */
19
+	protected $_prep;
20 20
 
21
-    /**
22
-     * Constructor.
23
-     *
24
-     * @param StringPreparer $preparer
25
-     */
26
-    public function __construct(StringPreparer $preparer)
27
-    {
28
-        $this->_prep = $preparer;
29
-    }
21
+	/**
22
+	 * Constructor.
23
+	 *
24
+	 * @param StringPreparer $preparer
25
+	 */
26
+	public function __construct(StringPreparer $preparer)
27
+	{
28
+		$this->_prep = $preparer;
29
+	}
30 30
 
31
-    /**
32
-     * {@inheritdoc}
33
-     */
34
-    public function compare($assertion, $value): ?bool
35
-    {
36
-        $assertion = $this->_prep->prepare($assertion);
37
-        $value = $this->_prep->prepare($value);
38
-        return 0 == strcmp($assertion, $value);
39
-    }
31
+	/**
32
+	 * {@inheritdoc}
33
+	 */
34
+	public function compare($assertion, $value): ?bool
35
+	{
36
+		$assertion = $this->_prep->prepare($assertion);
37
+		$value = $this->_prep->prepare($value);
38
+		return 0 == strcmp($assertion, $value);
39
+	}
40 40
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\MatchingRule;
6 6
 
Please login to merge, or discard this patch.
lib/X501/DN/DNParser.php 2 patches
Indentation   +393 added lines, -393 removed lines patch added patch discarded remove patch
@@ -15,414 +15,414 @@
 block discarded – undo
15 15
  */
16 16
 class DNParser
17 17
 {
18
-    /**
19
-     * RFC 2253 special characters.
20
-     *
21
-     * @var string
22
-     */
23
-    const SPECIAL_CHARS = ',=+<>#;';
18
+	/**
19
+	 * RFC 2253 special characters.
20
+	 *
21
+	 * @var string
22
+	 */
23
+	const SPECIAL_CHARS = ',=+<>#;';
24 24
 
25
-    /**
26
-     * DN string.
27
-     *
28
-     * @var string
29
-     */
30
-    private $_dn;
25
+	/**
26
+	 * DN string.
27
+	 *
28
+	 * @var string
29
+	 */
30
+	private $_dn;
31 31
 
32
-    /**
33
-     * DN string length.
34
-     *
35
-     * @var int
36
-     */
37
-    private $_len;
32
+	/**
33
+	 * DN string length.
34
+	 *
35
+	 * @var int
36
+	 */
37
+	private $_len;
38 38
 
39
-    /**
40
-     * Constructor.
41
-     *
42
-     * @param string $dn Distinguised name
43
-     */
44
-    protected function __construct(string $dn)
45
-    {
46
-        $this->_dn = $dn;
47
-        $this->_len = strlen($dn);
48
-    }
39
+	/**
40
+	 * Constructor.
41
+	 *
42
+	 * @param string $dn Distinguised name
43
+	 */
44
+	protected function __construct(string $dn)
45
+	{
46
+		$this->_dn = $dn;
47
+		$this->_len = strlen($dn);
48
+	}
49 49
 
50
-    /**
51
-     * Parse distinguished name string to name-components.
52
-     *
53
-     * @param string $dn
54
-     *
55
-     * @return array
56
-     */
57
-    public static function parseString(string $dn): array
58
-    {
59
-        $parser = new self($dn);
60
-        return $parser->parse();
61
-    }
50
+	/**
51
+	 * Parse distinguished name string to name-components.
52
+	 *
53
+	 * @param string $dn
54
+	 *
55
+	 * @return array
56
+	 */
57
+	public static function parseString(string $dn): array
58
+	{
59
+		$parser = new self($dn);
60
+		return $parser->parse();
61
+	}
62 62
 
63
-    /**
64
-     * Escape a AttributeValue string conforming to RFC 2253.
65
-     *
66
-     * @see https://tools.ietf.org/html/rfc2253#section-2.4
67
-     *
68
-     * @param string $str
69
-     *
70
-     * @return string
71
-     */
72
-    public static function escapeString(string $str): string
73
-    {
74
-        // one of the characters ",", "+", """, "\", "<", ">" or ";"
75
-        $str = preg_replace('/([,\+"\\\<\>;])/u', '\\\\$1', $str);
76
-        // a space character occurring at the end of the string
77
-        $str = preg_replace('/( )$/u', '\\\\$1', $str);
78
-        // a space or "#" character occurring at the beginning of the string
79
-        $str = preg_replace('/^([ #])/u', '\\\\$1', $str);
80
-        // implementation specific special characters
81
-        $str = preg_replace_callback('/([\pC])/u',
82
-            function ($m) {
83
-                $octets = str_split(bin2hex($m[1]), 2);
84
-                return implode('',
85
-                    array_map(
86
-                        function ($octet) {
87
-                            return '\\' . strtoupper($octet);
88
-                        }, $octets));
89
-            }, $str);
90
-        return $str;
91
-    }
63
+	/**
64
+	 * Escape a AttributeValue string conforming to RFC 2253.
65
+	 *
66
+	 * @see https://tools.ietf.org/html/rfc2253#section-2.4
67
+	 *
68
+	 * @param string $str
69
+	 *
70
+	 * @return string
71
+	 */
72
+	public static function escapeString(string $str): string
73
+	{
74
+		// one of the characters ",", "+", """, "\", "<", ">" or ";"
75
+		$str = preg_replace('/([,\+"\\\<\>;])/u', '\\\\$1', $str);
76
+		// a space character occurring at the end of the string
77
+		$str = preg_replace('/( )$/u', '\\\\$1', $str);
78
+		// a space or "#" character occurring at the beginning of the string
79
+		$str = preg_replace('/^([ #])/u', '\\\\$1', $str);
80
+		// implementation specific special characters
81
+		$str = preg_replace_callback('/([\pC])/u',
82
+			function ($m) {
83
+				$octets = str_split(bin2hex($m[1]), 2);
84
+				return implode('',
85
+					array_map(
86
+						function ($octet) {
87
+							return '\\' . strtoupper($octet);
88
+						}, $octets));
89
+			}, $str);
90
+		return $str;
91
+	}
92 92
 
93
-    /**
94
-     * Parse DN to name-components.
95
-     *
96
-     * @throws \RuntimeException
97
-     *
98
-     * @return array
99
-     */
100
-    protected function parse(): array
101
-    {
102
-        $offset = 0;
103
-        $name = $this->_parseName($offset);
104
-        if ($offset < $this->_len) {
105
-            $remains = substr($this->_dn, $offset);
106
-            throw new \UnexpectedValueException(
107
-                'Parser finished before the end of string' .
108
-                     ", remaining: '{$remains}'.");
109
-        }
110
-        return $name;
111
-    }
93
+	/**
94
+	 * Parse DN to name-components.
95
+	 *
96
+	 * @throws \RuntimeException
97
+	 *
98
+	 * @return array
99
+	 */
100
+	protected function parse(): array
101
+	{
102
+		$offset = 0;
103
+		$name = $this->_parseName($offset);
104
+		if ($offset < $this->_len) {
105
+			$remains = substr($this->_dn, $offset);
106
+			throw new \UnexpectedValueException(
107
+				'Parser finished before the end of string' .
108
+					 ", remaining: '{$remains}'.");
109
+		}
110
+		return $name;
111
+	}
112 112
 
113
-    /**
114
-     * Parse 'name'.
115
-     *
116
-     * name-component *("," name-component)
117
-     *
118
-     * @param int $offset
119
-     *
120
-     * @return array Array of name-components
121
-     */
122
-    private function _parseName(int &$offset): array
123
-    {
124
-        $idx = $offset;
125
-        $names = [];
126
-        while ($idx < $this->_len) {
127
-            $names[] = $this->_parseNameComponent($idx);
128
-            if ($idx >= $this->_len) {
129
-                break;
130
-            }
131
-            $this->_skipWs($idx);
132
-            if (',' != $this->_dn[$idx] && ';' != $this->_dn[$idx]) {
133
-                break;
134
-            }
135
-            ++$idx;
136
-            $this->_skipWs($idx);
137
-        }
138
-        $offset = $idx;
139
-        return array_reverse($names);
140
-    }
113
+	/**
114
+	 * Parse 'name'.
115
+	 *
116
+	 * name-component *("," name-component)
117
+	 *
118
+	 * @param int $offset
119
+	 *
120
+	 * @return array Array of name-components
121
+	 */
122
+	private function _parseName(int &$offset): array
123
+	{
124
+		$idx = $offset;
125
+		$names = [];
126
+		while ($idx < $this->_len) {
127
+			$names[] = $this->_parseNameComponent($idx);
128
+			if ($idx >= $this->_len) {
129
+				break;
130
+			}
131
+			$this->_skipWs($idx);
132
+			if (',' != $this->_dn[$idx] && ';' != $this->_dn[$idx]) {
133
+				break;
134
+			}
135
+			++$idx;
136
+			$this->_skipWs($idx);
137
+		}
138
+		$offset = $idx;
139
+		return array_reverse($names);
140
+	}
141 141
 
142
-    /**
143
-     * Parse 'name-component'.
144
-     *
145
-     * attributeTypeAndValue *("+" attributeTypeAndValue)
146
-     *
147
-     * @param int $offset
148
-     *
149
-     * @return array Array of [type, value] tuples
150
-     */
151
-    private function _parseNameComponent(int &$offset): array
152
-    {
153
-        $idx = $offset;
154
-        $tvpairs = [];
155
-        while ($idx < $this->_len) {
156
-            $tvpairs[] = $this->_parseAttrTypeAndValue($idx);
157
-            $this->_skipWs($idx);
158
-            if ($idx >= $this->_len || '+' != $this->_dn[$idx]) {
159
-                break;
160
-            }
161
-            ++$idx;
162
-            $this->_skipWs($idx);
163
-        }
164
-        $offset = $idx;
165
-        return $tvpairs;
166
-    }
142
+	/**
143
+	 * Parse 'name-component'.
144
+	 *
145
+	 * attributeTypeAndValue *("+" attributeTypeAndValue)
146
+	 *
147
+	 * @param int $offset
148
+	 *
149
+	 * @return array Array of [type, value] tuples
150
+	 */
151
+	private function _parseNameComponent(int &$offset): array
152
+	{
153
+		$idx = $offset;
154
+		$tvpairs = [];
155
+		while ($idx < $this->_len) {
156
+			$tvpairs[] = $this->_parseAttrTypeAndValue($idx);
157
+			$this->_skipWs($idx);
158
+			if ($idx >= $this->_len || '+' != $this->_dn[$idx]) {
159
+				break;
160
+			}
161
+			++$idx;
162
+			$this->_skipWs($idx);
163
+		}
164
+		$offset = $idx;
165
+		return $tvpairs;
166
+	}
167 167
 
168
-    /**
169
-     * Parse 'attributeTypeAndValue'.
170
-     *
171
-     * attributeType "=" attributeValue
172
-     *
173
-     * @param int $offset
174
-     *
175
-     * @throws \UnexpectedValueException
176
-     *
177
-     * @return array A tuple of [type, value]. Value may be either a string or
178
-     *               an Element, if it's encoded as hexstring.
179
-     */
180
-    private function _parseAttrTypeAndValue(int &$offset): array
181
-    {
182
-        $idx = $offset;
183
-        $type = $this->_parseAttrType($idx);
184
-        $this->_skipWs($idx);
185
-        if ($idx >= $this->_len || '=' != $this->_dn[$idx++]) {
186
-            throw new \UnexpectedValueException('Invalid type and value pair.');
187
-        }
188
-        $this->_skipWs($idx);
189
-        // hexstring
190
-        if ($idx < $this->_len && '#' == $this->_dn[$idx]) {
191
-            ++$idx;
192
-            $data = $this->_parseAttrHexValue($idx);
193
-            try {
194
-                $value = Element::fromDER($data);
195
-            } catch (DecodeException $e) {
196
-                throw new \UnexpectedValueException(
197
-                    'Invalid DER encoding from hexstring.', 0, $e);
198
-            }
199
-        } else {
200
-            $value = $this->_parseAttrStringValue($idx);
201
-        }
202
-        $offset = $idx;
203
-        return [$type, $value];
204
-    }
168
+	/**
169
+	 * Parse 'attributeTypeAndValue'.
170
+	 *
171
+	 * attributeType "=" attributeValue
172
+	 *
173
+	 * @param int $offset
174
+	 *
175
+	 * @throws \UnexpectedValueException
176
+	 *
177
+	 * @return array A tuple of [type, value]. Value may be either a string or
178
+	 *               an Element, if it's encoded as hexstring.
179
+	 */
180
+	private function _parseAttrTypeAndValue(int &$offset): array
181
+	{
182
+		$idx = $offset;
183
+		$type = $this->_parseAttrType($idx);
184
+		$this->_skipWs($idx);
185
+		if ($idx >= $this->_len || '=' != $this->_dn[$idx++]) {
186
+			throw new \UnexpectedValueException('Invalid type and value pair.');
187
+		}
188
+		$this->_skipWs($idx);
189
+		// hexstring
190
+		if ($idx < $this->_len && '#' == $this->_dn[$idx]) {
191
+			++$idx;
192
+			$data = $this->_parseAttrHexValue($idx);
193
+			try {
194
+				$value = Element::fromDER($data);
195
+			} catch (DecodeException $e) {
196
+				throw new \UnexpectedValueException(
197
+					'Invalid DER encoding from hexstring.', 0, $e);
198
+			}
199
+		} else {
200
+			$value = $this->_parseAttrStringValue($idx);
201
+		}
202
+		$offset = $idx;
203
+		return [$type, $value];
204
+	}
205 205
 
206
-    /**
207
-     * Parse 'attributeType'.
208
-     *
209
-     * (ALPHA 1*keychar) / oid
210
-     *
211
-     * @param int $offset
212
-     *
213
-     * @throws \UnexpectedValueException
214
-     *
215
-     * @return string
216
-     */
217
-    private function _parseAttrType(int &$offset): string
218
-    {
219
-        $idx = $offset;
220
-        // dotted OID
221
-        $type = $this->_regexMatch('/^(?:oid\.)?([0-9]+(?:\.[0-9]+)*)/i', $idx);
222
-        if (null === $type) {
223
-            // name
224
-            $type = $this->_regexMatch('/^[a-z][a-z0-9\-]*/i', $idx);
225
-            if (null === $type) {
226
-                throw new \UnexpectedValueException('Invalid attribute type.');
227
-            }
228
-        }
229
-        $offset = $idx;
230
-        return $type;
231
-    }
206
+	/**
207
+	 * Parse 'attributeType'.
208
+	 *
209
+	 * (ALPHA 1*keychar) / oid
210
+	 *
211
+	 * @param int $offset
212
+	 *
213
+	 * @throws \UnexpectedValueException
214
+	 *
215
+	 * @return string
216
+	 */
217
+	private function _parseAttrType(int &$offset): string
218
+	{
219
+		$idx = $offset;
220
+		// dotted OID
221
+		$type = $this->_regexMatch('/^(?:oid\.)?([0-9]+(?:\.[0-9]+)*)/i', $idx);
222
+		if (null === $type) {
223
+			// name
224
+			$type = $this->_regexMatch('/^[a-z][a-z0-9\-]*/i', $idx);
225
+			if (null === $type) {
226
+				throw new \UnexpectedValueException('Invalid attribute type.');
227
+			}
228
+		}
229
+		$offset = $idx;
230
+		return $type;
231
+	}
232 232
 
233
-    /**
234
-     * Parse 'attributeValue' of string type.
235
-     *
236
-     * @param int $offset
237
-     *
238
-     * @throws \UnexpectedValueException
239
-     *
240
-     * @return string
241
-     */
242
-    private function _parseAttrStringValue(int &$offset): string
243
-    {
244
-        $idx = $offset;
245
-        if ($idx >= $this->_len) {
246
-            return '';
247
-        }
248
-        if ('"' == $this->_dn[$idx]) { // quoted string
249
-            $val = $this->_parseQuotedAttrString($idx);
250
-        } else { // string
251
-            $val = $this->_parseAttrString($idx);
252
-        }
253
-        $offset = $idx;
254
-        return $val;
255
-    }
233
+	/**
234
+	 * Parse 'attributeValue' of string type.
235
+	 *
236
+	 * @param int $offset
237
+	 *
238
+	 * @throws \UnexpectedValueException
239
+	 *
240
+	 * @return string
241
+	 */
242
+	private function _parseAttrStringValue(int &$offset): string
243
+	{
244
+		$idx = $offset;
245
+		if ($idx >= $this->_len) {
246
+			return '';
247
+		}
248
+		if ('"' == $this->_dn[$idx]) { // quoted string
249
+			$val = $this->_parseQuotedAttrString($idx);
250
+		} else { // string
251
+			$val = $this->_parseAttrString($idx);
252
+		}
253
+		$offset = $idx;
254
+		return $val;
255
+	}
256 256
 
257
-    /**
258
-     * Parse plain 'attributeValue' string.
259
-     *
260
-     * @param int $offset
261
-     *
262
-     * @throws \UnexpectedValueException
263
-     *
264
-     * @return string
265
-     */
266
-    private function _parseAttrString(int &$offset): string
267
-    {
268
-        $idx = $offset;
269
-        $val = '';
270
-        $wsidx = null;
271
-        while ($idx < $this->_len) {
272
-            $c = $this->_dn[$idx];
273
-            // pair (escape sequence)
274
-            if ('\\' == $c) {
275
-                ++$idx;
276
-                $val .= $this->_parsePairAfterSlash($idx);
277
-                $wsidx = null;
278
-                continue;
279
-            }
280
-            if ('"' == $c) {
281
-                throw new \UnexpectedValueException('Unexpected quotation.');
282
-            }
283
-            if (false !== strpos(self::SPECIAL_CHARS, $c)) {
284
-                break;
285
-            }
286
-            // keep track of the first consecutive whitespace
287
-            if (' ' == $c) {
288
-                if (null === $wsidx) {
289
-                    $wsidx = $idx;
290
-                }
291
-            } else {
292
-                $wsidx = null;
293
-            }
294
-            // stringchar
295
-            $val .= $c;
296
-            ++$idx;
297
-        }
298
-        // if there was non-escaped whitespace in the end of the value
299
-        if (null !== $wsidx) {
300
-            $val = substr($val, 0, -($idx - $wsidx));
301
-        }
302
-        $offset = $idx;
303
-        return $val;
304
-    }
257
+	/**
258
+	 * Parse plain 'attributeValue' string.
259
+	 *
260
+	 * @param int $offset
261
+	 *
262
+	 * @throws \UnexpectedValueException
263
+	 *
264
+	 * @return string
265
+	 */
266
+	private function _parseAttrString(int &$offset): string
267
+	{
268
+		$idx = $offset;
269
+		$val = '';
270
+		$wsidx = null;
271
+		while ($idx < $this->_len) {
272
+			$c = $this->_dn[$idx];
273
+			// pair (escape sequence)
274
+			if ('\\' == $c) {
275
+				++$idx;
276
+				$val .= $this->_parsePairAfterSlash($idx);
277
+				$wsidx = null;
278
+				continue;
279
+			}
280
+			if ('"' == $c) {
281
+				throw new \UnexpectedValueException('Unexpected quotation.');
282
+			}
283
+			if (false !== strpos(self::SPECIAL_CHARS, $c)) {
284
+				break;
285
+			}
286
+			// keep track of the first consecutive whitespace
287
+			if (' ' == $c) {
288
+				if (null === $wsidx) {
289
+					$wsidx = $idx;
290
+				}
291
+			} else {
292
+				$wsidx = null;
293
+			}
294
+			// stringchar
295
+			$val .= $c;
296
+			++$idx;
297
+		}
298
+		// if there was non-escaped whitespace in the end of the value
299
+		if (null !== $wsidx) {
300
+			$val = substr($val, 0, -($idx - $wsidx));
301
+		}
302
+		$offset = $idx;
303
+		return $val;
304
+	}
305 305
 
306
-    /**
307
-     * Parse quoted 'attributeValue' string.
308
-     *
309
-     * @param int $offset Offset to starting quote
310
-     *
311
-     * @throws \UnexpectedValueException
312
-     *
313
-     * @return string
314
-     */
315
-    private function _parseQuotedAttrString(int &$offset): string
316
-    {
317
-        $idx = $offset + 1;
318
-        $val = '';
319
-        while ($idx < $this->_len) {
320
-            $c = $this->_dn[$idx];
321
-            if ('\\' == $c) { // pair
322
-                ++$idx;
323
-                $val .= $this->_parsePairAfterSlash($idx);
324
-                continue;
325
-            }
326
-            if ('"' == $c) {
327
-                ++$idx;
328
-                break;
329
-            }
330
-            $val .= $c;
331
-            ++$idx;
332
-        }
333
-        $offset = $idx;
334
-        return $val;
335
-    }
306
+	/**
307
+	 * Parse quoted 'attributeValue' string.
308
+	 *
309
+	 * @param int $offset Offset to starting quote
310
+	 *
311
+	 * @throws \UnexpectedValueException
312
+	 *
313
+	 * @return string
314
+	 */
315
+	private function _parseQuotedAttrString(int &$offset): string
316
+	{
317
+		$idx = $offset + 1;
318
+		$val = '';
319
+		while ($idx < $this->_len) {
320
+			$c = $this->_dn[$idx];
321
+			if ('\\' == $c) { // pair
322
+				++$idx;
323
+				$val .= $this->_parsePairAfterSlash($idx);
324
+				continue;
325
+			}
326
+			if ('"' == $c) {
327
+				++$idx;
328
+				break;
329
+			}
330
+			$val .= $c;
331
+			++$idx;
332
+		}
333
+		$offset = $idx;
334
+		return $val;
335
+	}
336 336
 
337
-    /**
338
-     * Parse 'attributeValue' of binary type.
339
-     *
340
-     * @param int $offset
341
-     *
342
-     * @throws \UnexpectedValueException
343
-     *
344
-     * @return string
345
-     */
346
-    private function _parseAttrHexValue(int &$offset): string
347
-    {
348
-        $idx = $offset;
349
-        $hexstr = $this->_regexMatch('/^(?:[0-9a-f]{2})+/i', $idx);
350
-        if (null === $hexstr) {
351
-            throw new \UnexpectedValueException('Invalid hexstring.');
352
-        }
353
-        $data = hex2bin($hexstr);
354
-        $offset = $idx;
355
-        return $data;
356
-    }
337
+	/**
338
+	 * Parse 'attributeValue' of binary type.
339
+	 *
340
+	 * @param int $offset
341
+	 *
342
+	 * @throws \UnexpectedValueException
343
+	 *
344
+	 * @return string
345
+	 */
346
+	private function _parseAttrHexValue(int &$offset): string
347
+	{
348
+		$idx = $offset;
349
+		$hexstr = $this->_regexMatch('/^(?:[0-9a-f]{2})+/i', $idx);
350
+		if (null === $hexstr) {
351
+			throw new \UnexpectedValueException('Invalid hexstring.');
352
+		}
353
+		$data = hex2bin($hexstr);
354
+		$offset = $idx;
355
+		return $data;
356
+	}
357 357
 
358
-    /**
359
-     * Parse 'pair' after leading slash.
360
-     *
361
-     * @param int $offset
362
-     *
363
-     * @throws \UnexpectedValueException
364
-     *
365
-     * @return string
366
-     */
367
-    private function _parsePairAfterSlash(int &$offset): string
368
-    {
369
-        $idx = $offset;
370
-        if ($idx >= $this->_len) {
371
-            throw new \UnexpectedValueException(
372
-                'Unexpected end of escape sequence.');
373
-        }
374
-        $c = $this->_dn[$idx++];
375
-        // special | \ | " | SPACE
376
-        if (false !== strpos(self::SPECIAL_CHARS . '\\" ', $c)) {
377
-            $val = $c;
378
-        } else { // hexpair
379
-            if ($idx >= $this->_len) {
380
-                throw new \UnexpectedValueException('Unexpected end of hexpair.');
381
-            }
382
-            $val = @hex2bin($c . $this->_dn[$idx++]);
383
-            if (false === $val) {
384
-                throw new \UnexpectedValueException('Invalid hexpair.');
385
-            }
386
-        }
387
-        $offset = $idx;
388
-        return $val;
389
-    }
358
+	/**
359
+	 * Parse 'pair' after leading slash.
360
+	 *
361
+	 * @param int $offset
362
+	 *
363
+	 * @throws \UnexpectedValueException
364
+	 *
365
+	 * @return string
366
+	 */
367
+	private function _parsePairAfterSlash(int &$offset): string
368
+	{
369
+		$idx = $offset;
370
+		if ($idx >= $this->_len) {
371
+			throw new \UnexpectedValueException(
372
+				'Unexpected end of escape sequence.');
373
+		}
374
+		$c = $this->_dn[$idx++];
375
+		// special | \ | " | SPACE
376
+		if (false !== strpos(self::SPECIAL_CHARS . '\\" ', $c)) {
377
+			$val = $c;
378
+		} else { // hexpair
379
+			if ($idx >= $this->_len) {
380
+				throw new \UnexpectedValueException('Unexpected end of hexpair.');
381
+			}
382
+			$val = @hex2bin($c . $this->_dn[$idx++]);
383
+			if (false === $val) {
384
+				throw new \UnexpectedValueException('Invalid hexpair.');
385
+			}
386
+		}
387
+		$offset = $idx;
388
+		return $val;
389
+	}
390 390
 
391
-    /**
392
-     * Match DN to pattern and extract the last capture group.
393
-     *
394
-     * Updates offset to fully matched pattern.
395
-     *
396
-     * @param string $pattern
397
-     * @param int    $offset
398
-     *
399
-     * @return null|string Null if pattern doesn't match
400
-     */
401
-    private function _regexMatch(string $pattern, int &$offset): ?string
402
-    {
403
-        $idx = $offset;
404
-        if (!preg_match($pattern, substr($this->_dn, $idx), $match)) {
405
-            return null;
406
-        }
407
-        $idx += strlen($match[0]);
408
-        $offset = $idx;
409
-        return end($match);
410
-    }
391
+	/**
392
+	 * Match DN to pattern and extract the last capture group.
393
+	 *
394
+	 * Updates offset to fully matched pattern.
395
+	 *
396
+	 * @param string $pattern
397
+	 * @param int    $offset
398
+	 *
399
+	 * @return null|string Null if pattern doesn't match
400
+	 */
401
+	private function _regexMatch(string $pattern, int &$offset): ?string
402
+	{
403
+		$idx = $offset;
404
+		if (!preg_match($pattern, substr($this->_dn, $idx), $match)) {
405
+			return null;
406
+		}
407
+		$idx += strlen($match[0]);
408
+		$offset = $idx;
409
+		return end($match);
410
+	}
411 411
 
412
-    /**
413
-     * Skip consecutive spaces.
414
-     *
415
-     * @param int $offset
416
-     */
417
-    private function _skipWs(int &$offset): void
418
-    {
419
-        $idx = $offset;
420
-        while ($idx < $this->_len) {
421
-            if (' ' != $this->_dn[$idx]) {
422
-                break;
423
-            }
424
-            ++$idx;
425
-        }
426
-        $offset = $idx;
427
-    }
412
+	/**
413
+	 * Skip consecutive spaces.
414
+	 *
415
+	 * @param int $offset
416
+	 */
417
+	private function _skipWs(int &$offset): void
418
+	{
419
+		$idx = $offset;
420
+		while ($idx < $this->_len) {
421
+			if (' ' != $this->_dn[$idx]) {
422
+				break;
423
+			}
424
+			++$idx;
425
+		}
426
+		$offset = $idx;
427
+	}
428 428
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\DN;
6 6
 
@@ -79,11 +79,11 @@  discard block
 block discarded – undo
79 79
         $str = preg_replace('/^([ #])/u', '\\\\$1', $str);
80 80
         // implementation specific special characters
81 81
         $str = preg_replace_callback('/([\pC])/u',
82
-            function ($m) {
82
+            function($m) {
83 83
                 $octets = str_split(bin2hex($m[1]), 2);
84 84
                 return implode('',
85 85
                     array_map(
86
-                        function ($octet) {
86
+                        function($octet) {
87 87
                             return '\\' . strtoupper($octet);
88 88
                         }, $octets));
89 89
             }, $str);
Please login to merge, or discard this patch.
lib/X501/ASN1/Name.php 2 patches
Indentation   +204 added lines, -204 removed lines patch added patch discarded remove patch
@@ -20,208 +20,208 @@
 block discarded – undo
20 20
  */
21 21
 class Name implements \Countable, \IteratorAggregate
22 22
 {
23
-    /**
24
-     * Relative distinguished name components.
25
-     *
26
-     * @var RDN[]
27
-     */
28
-    protected $_rdns;
29
-
30
-    /**
31
-     * Constructor.
32
-     *
33
-     * @param RDN ...$rdns RDN components
34
-     */
35
-    public function __construct(RDN ...$rdns)
36
-    {
37
-        $this->_rdns = $rdns;
38
-    }
39
-
40
-    /**
41
-     * @return string
42
-     */
43
-    public function __toString()
44
-    {
45
-        return $this->toString();
46
-    }
47
-
48
-    /**
49
-     * Initialize from ASN.1.
50
-     *
51
-     * @param Sequence $seq
52
-     *
53
-     * @return self
54
-     */
55
-    public static function fromASN1(Sequence $seq): self
56
-    {
57
-        $rdns = array_map(
58
-            function (UnspecifiedType $el) {
59
-                return RDN::fromASN1($el->asSet());
60
-            }, $seq->elements());
61
-        return new self(...$rdns);
62
-    }
63
-
64
-    /**
65
-     * Initialize from distinguished name string.
66
-     *
67
-     * @see https://tools.ietf.org/html/rfc1779
68
-     *
69
-     * @param string $str
70
-     *
71
-     * @return self
72
-     */
73
-    public static function fromString(string $str): self
74
-    {
75
-        $rdns = [];
76
-        foreach (DNParser::parseString($str) as $nameComponent) {
77
-            $attribs = [];
78
-            foreach ($nameComponent as [$name, $val]) {
79
-                $type = AttributeType::fromName($name);
80
-                // hexstrings are parsed to ASN.1 elements
81
-                if ($val instanceof Element) {
82
-                    $el = $val;
83
-                } else {
84
-                    $el = AttributeType::asn1StringForType($type->oid(), $val);
85
-                }
86
-                $value = AttributeValue::fromASN1ByOID($type->oid(),
87
-                    $el->asUnspecified());
88
-                $attribs[] = new AttributeTypeAndValue($type, $value);
89
-            }
90
-            $rdns[] = new RDN(...$attribs);
91
-        }
92
-        return new self(...$rdns);
93
-    }
94
-
95
-    /**
96
-     * Generate ASN.1 structure.
97
-     *
98
-     * @return Sequence
99
-     */
100
-    public function toASN1(): Sequence
101
-    {
102
-        $elements = array_map(
103
-            function (RDN $rdn) {
104
-                return $rdn->toASN1();
105
-            }, $this->_rdns);
106
-        return new Sequence(...$elements);
107
-    }
108
-
109
-    /**
110
-     * Get distinguised name string conforming to RFC 2253.
111
-     *
112
-     * @see https://tools.ietf.org/html/rfc2253#section-2.1
113
-     *
114
-     * @return string
115
-     */
116
-    public function toString(): string
117
-    {
118
-        $parts = array_map(
119
-            function (RDN $rdn) {
120
-                return $rdn->toString();
121
-            }, array_reverse($this->_rdns));
122
-        return implode(',', $parts);
123
-    }
124
-
125
-    /**
126
-     * Whether name is semantically equal to other.
127
-     *
128
-     * Comparison conforms to RFC 4518 string preparation algorithm.
129
-     *
130
-     * @see https://tools.ietf.org/html/rfc4518
131
-     *
132
-     * @param Name $other Object to compare to
133
-     *
134
-     * @return bool
135
-     */
136
-    public function equals(Name $other): bool
137
-    {
138
-        // if RDN count doesn't match
139
-        if (count($this) != count($other)) {
140
-            return false;
141
-        }
142
-        for ($i = count($this) - 1; $i >= 0; --$i) {
143
-            $rdn1 = $this->_rdns[$i];
144
-            $rdn2 = $other->_rdns[$i];
145
-            if (!$rdn1->equals($rdn2)) {
146
-                return false;
147
-            }
148
-        }
149
-        return true;
150
-    }
151
-
152
-    /**
153
-     * Get all RDN objects.
154
-     *
155
-     * @return RDN[]
156
-     */
157
-    public function all(): array
158
-    {
159
-        return $this->_rdns;
160
-    }
161
-
162
-    /**
163
-     * Get the first AttributeValue of given type.
164
-     *
165
-     * Relative name components shall be traversed in encoding order, which is
166
-     * reversed in regards to the string representation.
167
-     * Multi-valued RDN with multiple attributes of the requested type is
168
-     * ambiguous and shall throw an exception.
169
-     *
170
-     * @param string $name Attribute OID or name
171
-     *
172
-     * @throws \RuntimeException If attribute cannot be resolved
173
-     *
174
-     * @return AttributeValue
175
-     */
176
-    public function firstValueOf(string $name): AttributeValue
177
-    {
178
-        $oid = AttributeType::attrNameToOID($name);
179
-        foreach ($this->_rdns as $rdn) {
180
-            $tvs = $rdn->allOf($oid);
181
-            if (count($tvs) > 1) {
182
-                throw new \RangeException("RDN with multiple {$name} attributes.");
183
-            }
184
-            if (1 == count($tvs)) {
185
-                return $tvs[0]->value();
186
-            }
187
-        }
188
-        throw new \RangeException("Attribute {$name} not found.");
189
-    }
190
-
191
-    /**
192
-     * @see \Countable::count()
193
-     *
194
-     * @return int
195
-     */
196
-    public function count(): int
197
-    {
198
-        return count($this->_rdns);
199
-    }
200
-
201
-    /**
202
-     * Get the number of attributes of given type.
203
-     *
204
-     * @param string $name Attribute OID or name
205
-     *
206
-     * @return int
207
-     */
208
-    public function countOfType(string $name): int
209
-    {
210
-        $oid = AttributeType::attrNameToOID($name);
211
-        return (int) array_sum(
212
-            array_map(
213
-                function (RDN $rdn) use ($oid): int {
214
-                    return count($rdn->allOf($oid));
215
-                }, $this->_rdns));
216
-    }
217
-
218
-    /**
219
-     * @see \IteratorAggregate::getIterator()
220
-     *
221
-     * @return \ArrayIterator
222
-     */
223
-    public function getIterator(): \ArrayIterator
224
-    {
225
-        return new \ArrayIterator($this->_rdns);
226
-    }
23
+	/**
24
+	 * Relative distinguished name components.
25
+	 *
26
+	 * @var RDN[]
27
+	 */
28
+	protected $_rdns;
29
+
30
+	/**
31
+	 * Constructor.
32
+	 *
33
+	 * @param RDN ...$rdns RDN components
34
+	 */
35
+	public function __construct(RDN ...$rdns)
36
+	{
37
+		$this->_rdns = $rdns;
38
+	}
39
+
40
+	/**
41
+	 * @return string
42
+	 */
43
+	public function __toString()
44
+	{
45
+		return $this->toString();
46
+	}
47
+
48
+	/**
49
+	 * Initialize from ASN.1.
50
+	 *
51
+	 * @param Sequence $seq
52
+	 *
53
+	 * @return self
54
+	 */
55
+	public static function fromASN1(Sequence $seq): self
56
+	{
57
+		$rdns = array_map(
58
+			function (UnspecifiedType $el) {
59
+				return RDN::fromASN1($el->asSet());
60
+			}, $seq->elements());
61
+		return new self(...$rdns);
62
+	}
63
+
64
+	/**
65
+	 * Initialize from distinguished name string.
66
+	 *
67
+	 * @see https://tools.ietf.org/html/rfc1779
68
+	 *
69
+	 * @param string $str
70
+	 *
71
+	 * @return self
72
+	 */
73
+	public static function fromString(string $str): self
74
+	{
75
+		$rdns = [];
76
+		foreach (DNParser::parseString($str) as $nameComponent) {
77
+			$attribs = [];
78
+			foreach ($nameComponent as [$name, $val]) {
79
+				$type = AttributeType::fromName($name);
80
+				// hexstrings are parsed to ASN.1 elements
81
+				if ($val instanceof Element) {
82
+					$el = $val;
83
+				} else {
84
+					$el = AttributeType::asn1StringForType($type->oid(), $val);
85
+				}
86
+				$value = AttributeValue::fromASN1ByOID($type->oid(),
87
+					$el->asUnspecified());
88
+				$attribs[] = new AttributeTypeAndValue($type, $value);
89
+			}
90
+			$rdns[] = new RDN(...$attribs);
91
+		}
92
+		return new self(...$rdns);
93
+	}
94
+
95
+	/**
96
+	 * Generate ASN.1 structure.
97
+	 *
98
+	 * @return Sequence
99
+	 */
100
+	public function toASN1(): Sequence
101
+	{
102
+		$elements = array_map(
103
+			function (RDN $rdn) {
104
+				return $rdn->toASN1();
105
+			}, $this->_rdns);
106
+		return new Sequence(...$elements);
107
+	}
108
+
109
+	/**
110
+	 * Get distinguised name string conforming to RFC 2253.
111
+	 *
112
+	 * @see https://tools.ietf.org/html/rfc2253#section-2.1
113
+	 *
114
+	 * @return string
115
+	 */
116
+	public function toString(): string
117
+	{
118
+		$parts = array_map(
119
+			function (RDN $rdn) {
120
+				return $rdn->toString();
121
+			}, array_reverse($this->_rdns));
122
+		return implode(',', $parts);
123
+	}
124
+
125
+	/**
126
+	 * Whether name is semantically equal to other.
127
+	 *
128
+	 * Comparison conforms to RFC 4518 string preparation algorithm.
129
+	 *
130
+	 * @see https://tools.ietf.org/html/rfc4518
131
+	 *
132
+	 * @param Name $other Object to compare to
133
+	 *
134
+	 * @return bool
135
+	 */
136
+	public function equals(Name $other): bool
137
+	{
138
+		// if RDN count doesn't match
139
+		if (count($this) != count($other)) {
140
+			return false;
141
+		}
142
+		for ($i = count($this) - 1; $i >= 0; --$i) {
143
+			$rdn1 = $this->_rdns[$i];
144
+			$rdn2 = $other->_rdns[$i];
145
+			if (!$rdn1->equals($rdn2)) {
146
+				return false;
147
+			}
148
+		}
149
+		return true;
150
+	}
151
+
152
+	/**
153
+	 * Get all RDN objects.
154
+	 *
155
+	 * @return RDN[]
156
+	 */
157
+	public function all(): array
158
+	{
159
+		return $this->_rdns;
160
+	}
161
+
162
+	/**
163
+	 * Get the first AttributeValue of given type.
164
+	 *
165
+	 * Relative name components shall be traversed in encoding order, which is
166
+	 * reversed in regards to the string representation.
167
+	 * Multi-valued RDN with multiple attributes of the requested type is
168
+	 * ambiguous and shall throw an exception.
169
+	 *
170
+	 * @param string $name Attribute OID or name
171
+	 *
172
+	 * @throws \RuntimeException If attribute cannot be resolved
173
+	 *
174
+	 * @return AttributeValue
175
+	 */
176
+	public function firstValueOf(string $name): AttributeValue
177
+	{
178
+		$oid = AttributeType::attrNameToOID($name);
179
+		foreach ($this->_rdns as $rdn) {
180
+			$tvs = $rdn->allOf($oid);
181
+			if (count($tvs) > 1) {
182
+				throw new \RangeException("RDN with multiple {$name} attributes.");
183
+			}
184
+			if (1 == count($tvs)) {
185
+				return $tvs[0]->value();
186
+			}
187
+		}
188
+		throw new \RangeException("Attribute {$name} not found.");
189
+	}
190
+
191
+	/**
192
+	 * @see \Countable::count()
193
+	 *
194
+	 * @return int
195
+	 */
196
+	public function count(): int
197
+	{
198
+		return count($this->_rdns);
199
+	}
200
+
201
+	/**
202
+	 * Get the number of attributes of given type.
203
+	 *
204
+	 * @param string $name Attribute OID or name
205
+	 *
206
+	 * @return int
207
+	 */
208
+	public function countOfType(string $name): int
209
+	{
210
+		$oid = AttributeType::attrNameToOID($name);
211
+		return (int) array_sum(
212
+			array_map(
213
+				function (RDN $rdn) use ($oid): int {
214
+					return count($rdn->allOf($oid));
215
+				}, $this->_rdns));
216
+	}
217
+
218
+	/**
219
+	 * @see \IteratorAggregate::getIterator()
220
+	 *
221
+	 * @return \ArrayIterator
222
+	 */
223
+	public function getIterator(): \ArrayIterator
224
+	{
225
+		return new \ArrayIterator($this->_rdns);
226
+	}
227 227
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-declare(strict_types = 1);
3
+declare(strict_types=1);
4 4
 
5 5
 namespace Sop\X501\ASN1;
6 6
 
@@ -55,7 +55,7 @@  discard block
 block discarded – undo
55 55
     public static function fromASN1(Sequence $seq): self
56 56
     {
57 57
         $rdns = array_map(
58
-            function (UnspecifiedType $el) {
58
+            function(UnspecifiedType $el) {
59 59
                 return RDN::fromASN1($el->asSet());
60 60
             }, $seq->elements());
61 61
         return new self(...$rdns);
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
     public function toASN1(): Sequence
101 101
     {
102 102
         $elements = array_map(
103
-            function (RDN $rdn) {
103
+            function(RDN $rdn) {
104 104
                 return $rdn->toASN1();
105 105
             }, $this->_rdns);
106 106
         return new Sequence(...$elements);
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
     public function toString(): string
117 117
     {
118 118
         $parts = array_map(
119
-            function (RDN $rdn) {
119
+            function(RDN $rdn) {
120 120
                 return $rdn->toString();
121 121
             }, array_reverse($this->_rdns));
122 122
         return implode(',', $parts);
@@ -210,7 +210,7 @@  discard block
 block discarded – undo
210 210
         $oid = AttributeType::attrNameToOID($name);
211 211
         return (int) array_sum(
212 212
             array_map(
213
-                function (RDN $rdn) use ($oid): int {
213
+                function(RDN $rdn) use ($oid): int {
214 214
                     return count($rdn->allOf($oid));
215 215
                 }, $this->_rdns));
216 216
     }
Please login to merge, or discard this patch.