11
11
class AnchorConverter
12
12
{
13
13
/**
14
- * Convert Protobuf Anchor to a map of oid -> Yoti Anchor
14
+ * Convert Protobuf Anchor to a map of oid -> Yoti Anchors
15
15
*
16
16
* @param Anchor $anchor
17
17
*
18
- * @return array|null
18
+ * @return array map of oid => YotiAnchor[]
19
19
*/
20
- public static function convert (Anchor $ protobufAnchor )
20
+ public static function convertAnchors (Anchor $ protobufAnchor )
21
21
{
22
- $ anchorMap = null ;
23
- $ ASN1 = new ASN1 ();
24
- $ X509 = new X509 ();
22
+ $ anchorMap = [];
25
23
$ anchorSubType = $ protobufAnchor ->getSubType ();
26
24
$ yotiSignedTimeStamp = self ::convertToYotiSignedTimestamp ($ protobufAnchor );
27
- $ X509CertsList = self ::convertCertsListToX509 ($ X509 , $ protobufAnchor ->getOriginServerCerts ());
28
- $ anchorTypesMap = self ::getAnchorTypesMap ();
25
+ $ X509CertsList = self ::convertCertsListToX509 ($ protobufAnchor ->getOriginServerCerts ());
29
26
30
27
foreach ($ X509CertsList as $ certX509Obj ) {
31
28
$ certExtsArr = $ certX509Obj ->tbsCertificate ->extensions ;
32
29
33
- foreach ($ anchorTypesMap as $ oid => $ anchorType ) {
34
- foreach ($ certExtsArr as $ extObj ) {
35
- $ extArr = (array ) $ extObj ;
36
- $ oidFound = array_search ($ oid , $ extArr , true );
37
- if ($ oidFound !== false && is_string ($ extArr ['extnValue ' ])) {
38
- $ extEncodedValue = $ extArr ['extnValue ' ];
39
-
40
- if ($ decodedAnchorValue = self ::decodeAnchorValue ($ ASN1 , $ X509 , $ extEncodedValue )) {
41
- $ yotiAnchor = self ::createYotiAnchor (
42
- $ decodedAnchorValue ,
43
- $ anchorType ,
44
- $ anchorSubType ,
45
- $ yotiSignedTimeStamp ,
46
- $ X509CertsList
47
- );
48
- $ anchorMap = [
49
- 'oid ' => $ oid ,
50
- 'yoti_anchor ' => $ yotiAnchor
51
- ];
52
- // We are only looking for one YotiAnchor from protobufAnchor
53
- return $ anchorMap ;
54
- }
55
- }
30
+ foreach ($ certExtsArr as $ extObj ) {
31
+ $ anchorType = self ::getAnchorTypeByOid ($ extObj ->extnId );
32
+ $ anchorValue = '' ;
33
+ if ($ anchorType !== YotiAnchor::TYPE_UNKNOWN_NAME ) {
34
+ $ anchorValue = self ::decodeAnchorValue ($ extObj ->extnValue );
56
35
}
36
+ $ yotiAnchor = self ::createYotiAnchor (
37
+ $ anchorValue ,
38
+ $ anchorType ,
39
+ $ anchorSubType ,
40
+ $ yotiSignedTimeStamp ,
41
+ $ X509CertsList
42
+ );
43
+ $ mapKey = self ::getAnchorTypeKey ($ anchorType );
44
+ $ anchorMap [$ mapKey ][] = $ yotiAnchor ;
57
45
}
58
46
}
59
47
return $ anchorMap ;
60
48
}
61
49
50
+ /**
51
+ * Convert Protobuf Anchor to a map of oid -> Yoti Anchor
52
+ *
53
+ * @deprecated no longer in use.
54
+ *
55
+ * @param Anchor $anchor
56
+ *
57
+ * @return array|null
58
+ */
59
+ public static function convert (Anchor $ protobufAnchor )
60
+ {
61
+ $ extensions = self ::convertAnchors ($ protobufAnchor );
62
+ foreach (array_keys (self ::getAnchorTypesMap ()) as $ oid ) {
63
+ if (isset ($ extensions [$ oid ][0 ])) {
64
+ return [
65
+ 'oid ' => $ oid ,
66
+ 'yoti_anchor ' => $ extensions [$ oid ][0 ],
67
+ ];
68
+ }
69
+ }
70
+ }
71
+
62
72
/**
63
73
* @param string $value
64
74
* @param string $type
@@ -80,14 +90,14 @@ private static function createYotiAnchor($value, $type, $subType, $signedTimesta
80
90
}
81
91
82
92
/**
83
- * @param ASN1 $ASN1
84
- * @param X509 $X509
85
93
* @param $extEncodedValue
86
94
*
87
95
* @return null|string
88
96
*/
89
- private static function decodeAnchorValue (ASN1 $ ASN1 , X509 $ X509 , $ extEncodedValue )
97
+ private static function decodeAnchorValue ($ extEncodedValue )
90
98
{
99
+ $ X509 = new X509 ();
100
+ $ ASN1 = new ASN1 ();
91
101
$ encodedBER = $ X509 ->_extractBER ($ extEncodedValue );
92
102
$ decodedValArr = $ ASN1 ->decodeBER ($ encodedBER );
93
103
if (isset ($ decodedValArr [0 ]['content ' ][0 ]['content ' ])) {
@@ -124,16 +134,15 @@ private static function convertToYotiSignedTimestamp(Anchor $anchor)
124
134
}
125
135
126
136
/**
127
- * @param X509 $X509
128
137
* @param Traversable $certificateList
129
138
*
130
139
* @return array
131
140
*/
132
- private static function convertCertsListToX509 (X509 $ X509 , Traversable $ certificateList )
141
+ private static function convertCertsListToX509 (Traversable $ certificateList )
133
142
{
134
143
$ certsList = [];
135
144
foreach ($ certificateList as $ certificate ) {
136
- if ($ X509CertObj = self ::convertCertToX509 ($ X509 , $ certificate )) {
145
+ if ($ X509CertObj = self ::convertCertToX509 ($ certificate )) {
137
146
$ certsList [] = $ X509CertObj ;
138
147
}
139
148
}
@@ -143,26 +152,39 @@ private static function convertCertsListToX509(X509 $X509, Traversable $certific
143
152
/**
144
153
* Return X509 Cert Object.
145
154
*
146
- * @param X509 $X509
147
155
* @param $certificate
148
156
*
149
157
* @return \stdClass
150
158
*/
151
- private static function convertCertToX509 (X509 $ X509 , $ certificate )
159
+ private static function convertCertToX509 ($ certificate )
152
160
{
161
+ $ X509 = new X509 ();
153
162
$ X509Data = $ X509 ->loadX509 ($ certificate );
154
163
return json_decode (json_encode ($ X509Data ), false );
155
164
}
156
165
157
166
/**
167
+ * Get anchor type by OID.
168
+ *
158
169
* @param string $oid
159
170
*
160
171
* @return string
161
172
*/
162
173
private static function getAnchorTypeByOid ($ oid )
163
174
{
164
- $ anchorTypesMap = self ::getAnchorTypesMap ();
165
- return isset ($ anchorTypesMap [$ oid ]) ? $ anchorTypesMap [$ oid ] : 'Unknown ' ;
175
+ return self ::getAnchorTypesMap ()[$ oid ] ?: YotiAnchor::TYPE_UNKNOWN_NAME ;
176
+ }
177
+
178
+ /**
179
+ * Get anchor type key by type.
180
+ *
181
+ * @param string $type
182
+ *
183
+ * @return string
184
+ */
185
+ private static function getAnchorTypeKey ($ type )
186
+ {
187
+ return array_flip (self ::getAnchorTypesMap ())[$ type ] ?: YotiAnchor::TYPE_UNKNOWN_NAME ;
166
188
}
167
189
168
190
/**
@@ -173,6 +195,7 @@ private static function getAnchorTypesMap()
173
195
return [
174
196
YotiAnchor::TYPE_SOURCE_OID => YotiAnchor::TYPE_SOURCE_NAME ,
175
197
YotiAnchor::TYPE_VERIFIER_OID => YotiAnchor::TYPE_VERIFIER_NAME ,
198
+ YotiAnchor::TYPE_UNKNOWN_OID => YotiAnchor::TYPE_UNKNOWN_NAME ,
176
199
];
177
200
}
178
201
}
0 commit comments