Test Failed
Push — master ( cd42b5...841446 )
by
unknown
16:44 queued 06:09
created
plugins/smime/php/lib/Oids.php 1 patch
Indentation   +1959 added lines, -1959 removed lines patch added patch discarded remove patch
@@ -20,1963 +20,1963 @@
 block discarded – undo
20 20
 */
21 21
 
22 22
 class Oids {
23
-	public $oids = [
24
-		'0.2.262.1.10*' => 'Telesec',
25
-		'0.2.262.1.10.0*' => 'extension',
26
-		'0.2.262.1.10.1*' => 'mechanism',
27
-		'0.2.262.1.10.1.0*' => 'authentication',
28
-		'0.2.262.1.10.1.0.1*' => 'passwordAuthentication',
29
-		'0.2.262.1.10.1.0.2*' => 'protectedPasswordAuthentication',
30
-		'0.2.262.1.10.1.0.3*' => 'oneWayX509Authentication',
31
-		'0.2.262.1.10.1.0.4*' => 'twoWayX509Authentication',
32
-		'0.2.262.1.10.1.0.5*' => 'threeWayX509Authentication',
33
-		'0.2.262.1.10.1.0.6*' => 'oneWayISO9798Authentication',
34
-		'0.2.262.1.10.1.0.7*' => 'twoWayISO9798Authentication',
35
-		'0.2.262.1.10.1.0.8*' => 'telekomAuthentication',
36
-		'0.2.262.1.10.1.1*' => 'signature',
37
-		'0.2.262.1.10.1.1.1*' => 'md4WithRSAAndISO9697',
38
-		'0.2.262.1.10.1.1.2*' => 'md4WithRSAAndTelesecSignatureStandard',
39
-		'0.2.262.1.10.1.1.3*' => 'md5WithRSAAndISO9697',
40
-		'0.2.262.1.10.1.1.4*' => 'md5WithRSAAndTelesecSignatureStandard',
41
-		'0.2.262.1.10.1.1.5*' => 'ripemd160WithRSAAndTelekomSignatureStandard',
42
-		'0.2.262.1.10.1.1.9*' => 'hbciRsaSignature',
43
-		'0.2.262.1.10.1.2*' => 'encryption',
44
-		'0.2.262.1.10.1.2.0*' => 'none',
45
-		'0.2.262.1.10.1.2.1*' => 'rsaTelesec',
46
-		'0.2.262.1.10.1.2.2*' => 'des',
47
-		'0.2.262.1.10.1.2.2.1*' => 'desECB',
48
-		'0.2.262.1.10.1.2.2.2*' => 'desCBC',
49
-		'0.2.262.1.10.1.2.2.3*' => 'desOFB',
50
-		'0.2.262.1.10.1.2.2.4*' => 'desCFB8',
51
-		'0.2.262.1.10.1.2.2.5*' => 'desCFB64',
52
-		'0.2.262.1.10.1.2.3*' => 'des3',
53
-		'0.2.262.1.10.1.2.3.1*' => 'des3ECB',
54
-		'0.2.262.1.10.1.2.3.2*' => 'des3CBC',
55
-		'0.2.262.1.10.1.2.3.3*' => 'des3OFB',
56
-		'0.2.262.1.10.1.2.3.4*' => 'des3CFB8',
57
-		'0.2.262.1.10.1.2.3.5*' => 'des3CFB64',
58
-		'0.2.262.1.10.1.2.4*' => 'magenta',
59
-		'0.2.262.1.10.1.2.5*' => 'idea',
60
-		'0.2.262.1.10.1.2.5.1*' => 'ideaECB',
61
-		'0.2.262.1.10.1.2.5.2*' => 'ideaCBC',
62
-		'0.2.262.1.10.1.2.5.3*' => 'ideaOFB',
63
-		'0.2.262.1.10.1.2.5.4*' => 'ideaCFB8',
64
-		'0.2.262.1.10.1.2.5.5*' => 'ideaCFB64',
65
-		'0.2.262.1.10.1.3*' => 'oneWayFunction',
66
-		'0.2.262.1.10.1.3.1*' => 'md4',
67
-		'0.2.262.1.10.1.3.2*' => 'md5',
68
-		'0.2.262.1.10.1.3.3*' => 'sqModNX509',
69
-		'0.2.262.1.10.1.3.4*' => 'sqModNISO',
70
-		'0.2.262.1.10.1.3.5*' => 'ripemd128',
71
-		'0.2.262.1.10.1.3.6*' => 'hashUsingBlockCipher',
72
-		'0.2.262.1.10.1.3.7*' => 'mac',
73
-		'0.2.262.1.10.1.3.8*' => 'ripemd160',
74
-		'0.2.262.1.10.1.4*' => 'fecFunction',
75
-		'0.2.262.1.10.1.4.1*' => 'reedSolomon',
76
-		'0.2.262.1.10.2*' => 'module',
77
-		'0.2.262.1.10.2.0*' => 'algorithms',
78
-		'0.2.262.1.10.2.1*' => 'attributeTypes',
79
-		'0.2.262.1.10.2.2*' => 'certificateTypes',
80
-		'0.2.262.1.10.2.3*' => 'messageTypes',
81
-		'0.2.262.1.10.2.4*' => 'plProtocol',
82
-		'0.2.262.1.10.2.5*' => 'smeAndComponentsOfSme',
83
-		'0.2.262.1.10.2.6*' => 'fec',
84
-		'0.2.262.1.10.2.7*' => 'usefulDefinitions',
85
-		'0.2.262.1.10.2.8*' => 'stefiles',
86
-		'0.2.262.1.10.2.9*' => 'sadmib',
87
-		'0.2.262.1.10.2.10*' => 'electronicOrder',
88
-		'0.2.262.1.10.2.11*' => 'telesecTtpAsymmetricApplication',
89
-		'0.2.262.1.10.2.12*' => 'telesecTtpBasisApplication',
90
-		'0.2.262.1.10.2.13*' => 'telesecTtpMessages',
91
-		'0.2.262.1.10.2.14*' => 'telesecTtpTimeStampApplication',
92
-		'0.2.262.1.10.3*' => 'objectClass',
93
-		'0.2.262.1.10.3.0*' => 'telesecOtherName',
94
-		'0.2.262.1.10.3.1*' => 'directory',
95
-		'0.2.262.1.10.3.2*' => 'directoryType',
96
-		'0.2.262.1.10.3.3*' => 'directoryGroup',
97
-		'0.2.262.1.10.3.4*' => 'directoryUser',
98
-		'0.2.262.1.10.3.5*' => 'symmetricKeyEntry',
99
-		'0.2.262.1.10.4*' => 'package',
100
-		'0.2.262.1.10.5*' => 'parameter',
101
-		'0.2.262.1.10.6*' => 'nameBinding',
102
-		'0.2.262.1.10.7*' => 'attribute',
103
-		'0.2.262.1.10.7.0*' => 'applicationGroupIdentifier',
104
-		'0.2.262.1.10.7.1*' => 'certificateType',
105
-		'0.2.262.1.10.7.2*' => 'telesecCertificate',
106
-		'0.2.262.1.10.7.3*' => 'certificateNumber',
107
-		'0.2.262.1.10.7.4*' => 'certificateRevocationList',
108
-		'0.2.262.1.10.7.5*' => 'creationDate',
109
-		'0.2.262.1.10.7.6*' => 'issuer',
110
-		'0.2.262.1.10.7.7*' => 'namingAuthority',
111
-		'0.2.262.1.10.7.8*' => 'publicKeyDirectory',
112
-		'0.2.262.1.10.7.9*' => 'securityDomain',
113
-		'0.2.262.1.10.7.10*' => 'subject',
114
-		'0.2.262.1.10.7.11*' => 'timeOfRevocation',
115
-		'0.2.262.1.10.7.12*' => 'userGroupReference',
116
-		'0.2.262.1.10.7.13*' => 'validity',
117
-		'0.2.262.1.10.7.14*' => 'zert93',
118
-		'0.2.262.1.10.7.15*' => 'securityMessEnv',
119
-		'0.2.262.1.10.7.16*' => 'anonymizedPublicKeyDirectory',
120
-		'0.2.262.1.10.7.17*' => 'telesecGivenName',
121
-		'0.2.262.1.10.7.18*' => 'nameAdditions',
122
-		'0.2.262.1.10.7.19*' => 'telesecPostalCode',
123
-		'0.2.262.1.10.7.20*' => 'nameDistinguisher',
124
-		'0.2.262.1.10.7.21*' => 'telesecCertificateList',
125
-		'0.2.262.1.10.7.22*' => 'teletrustCertificateList',
126
-		'0.2.262.1.10.7.23*' => 'x509CertificateList',
127
-		'0.2.262.1.10.7.24*' => 'timeOfIssue',
128
-		'0.2.262.1.10.7.25*' => 'physicalCardNumber',
129
-		'0.2.262.1.10.7.26*' => 'fileType',
130
-		'0.2.262.1.10.7.27*' => 'ctlFileIsArchive',
131
-		'0.2.262.1.10.7.28*' => 'emailAddress',
132
-		'0.2.262.1.10.7.29*' => 'certificateTemplateList',
133
-		'0.2.262.1.10.7.30*' => 'directoryName',
134
-		'0.2.262.1.10.7.31*' => 'directoryTypeName',
135
-		'0.2.262.1.10.7.32*' => 'directoryGroupName',
136
-		'0.2.262.1.10.7.33*' => 'directoryUserName',
137
-		'0.2.262.1.10.7.34*' => 'revocationFlag',
138
-		'0.2.262.1.10.7.35*' => 'symmetricKeyEntryName',
139
-		'0.2.262.1.10.7.36*' => 'glNumber',
140
-		'0.2.262.1.10.7.37*' => 'goNumber',
141
-		'0.2.262.1.10.7.38*' => 'gKeyData',
142
-		'0.2.262.1.10.7.39*' => 'zKeyData',
143
-		'0.2.262.1.10.7.40*' => 'ktKeyData',
144
-		'0.2.262.1.10.7.41*' => 'ktKeyNumber',
145
-		'0.2.262.1.10.7.51*' => 'timeOfRevocationGen',
146
-		'0.2.262.1.10.7.52*' => 'liabilityText',
147
-		'0.2.262.1.10.8*' => 'attributeGroup',
148
-		'0.2.262.1.10.9*' => 'action',
149
-		'0.2.262.1.10.10*' => 'notification',
150
-		'0.2.262.1.10.11*' => 'snmp-mibs',
151
-		'0.2.262.1.10.11.1*' => 'securityApplication',
152
-		'0.2.262.1.10.12*' => 'certAndCrlExtensionDefinitions',
153
-		'0.2.262.1.10.12.0*' => 'liabilityLimitationFlag',
154
-		'0.2.262.1.10.12.1*' => 'telesecCertIdExt',
155
-		'0.2.262.1.10.12.2*' => 'Telesec policyIdentifier',
156
-		'0.2.262.1.10.12.3*' => 'telesecPolicyQualifierID',
157
-		'0.2.262.1.10.12.4*' => 'telesecCRLFilteredExt',
158
-		'0.2.262.1.10.12.5*' => 'telesecCRLFilterExt',
159
-		'0.2.262.1.10.12.6*' => 'telesecNamingAuthorityExt',
160
-		'0.4.0.127.0.7*' => 'bsi',
161
-		'0.4.0.127.0.7.1*' => 'bsiEcc',
162
-		'0.4.0.127.0.7.1.1*' => 'bsifieldType',
163
-		'0.4.0.127.0.7.1.1.1*' => 'bsiPrimeField',
164
-		'0.4.0.127.0.7.1.1.2*' => 'bsiCharacteristicTwoField',
165
-		'0.4.0.127.0.7.1.1.2.3*' => 'bsiCharacteristicTwoBasis',
166
-		'0.4.0.127.0.7.1.1.2.3.1*' => 'bsiGnBasis',
167
-		'0.4.0.127.0.7.1.1.2.3.2*' => 'bsiTpBasis',
168
-		'0.4.0.127.0.7.1.1.2.3.3*' => 'bsiPpBasis',
169
-		'0.4.0.127.0.7.1.1.4.1*' => 'bsiEcdsaSignatures',
170
-		'0.4.0.127.0.7.1.1.4.1.1*' => 'bsiEcdsaWithSHA1',
171
-		'0.4.0.127.0.7.1.1.4.1.2*' => 'bsiEcdsaWithSHA224',
172
-		'0.4.0.127.0.7.1.1.4.1.3*' => 'bsiEcdsaWithSHA256',
173
-		'0.4.0.127.0.7.1.1.4.1.4*' => 'bsiEcdsaWithSHA384',
174
-		'0.4.0.127.0.7.1.1.4.1.5*' => 'bsiEcdsaWithSHA512',
175
-		'0.4.0.127.0.7.1.1.4.1.6*' => 'bsiEcdsaWithRIPEMD160',
176
-		'0.4.0.127.0.7.1.2*' => 'bsiEcKeyType',
177
-		'0.4.0.127.0.7.1.2.1*' => 'bsiEcPublicKey',
178
-		'0.4.0.127.0.7.1.5.1*' => 'bsiKaeg',
179
-		'0.4.0.127.0.7.1.5.1.1*' => 'bsiKaegWithX963KDF',
180
-		'0.4.0.127.0.7.1.5.1.2*' => 'bsiKaegWith3DESKDF',
181
-		'0.4.0.127.0.7.2.2.1*' => 'bsiPK',
182
-		'0.4.0.127.0.7.2.2.1.1*' => 'bsiPK_DH',
183
-		'0.4.0.127.0.7.2.2.1.2*' => 'bsiPK_ECDH',
184
-		'0.4.0.127.0.7.2.2.2*' => 'bsiTA',
185
-		'0.4.0.127.0.7.2.2.2.1*' => 'bsiTA_RSA',
186
-		'0.4.0.127.0.7.2.2.2.1.1*' => 'bsiTA_RSAv1_5_SHA1',
187
-		'0.4.0.127.0.7.2.2.2.1.2*' => 'bsiTA_RSAv1_5_SHA256',
188
-		'0.4.0.127.0.7.2.2.2.1.3*' => 'bsiTA_RSAPSS_SHA1',
189
-		'0.4.0.127.0.7.2.2.2.1.4*' => 'bsiTA_RSAPSS_SHA256',
190
-		'0.4.0.127.0.7.2.2.2.2*' => 'bsiTA_ECDSA',
191
-		'0.4.0.127.0.7.2.2.2.2.1*' => 'bsiTA_ECDSA_SHA1',
192
-		'0.4.0.127.0.7.2.2.2.2.2*' => 'bsiTA_ECDSA_SHA224',
193
-		'0.4.0.127.0.7.2.2.2.2.3*' => 'bsiTA_ECDSA_SHA256',
194
-		'0.4.0.127.0.7.2.2.3*' => 'bsiCA',
195
-		'0.4.0.127.0.7.2.2.3.1*' => 'bsiCA_DH',
196
-		'0.4.0.127.0.7.2.2.3.2*' => 'bsiCA_ECDH',
197
-		'0.4.0.127.0.7.3.1.2.1*' => 'bsiRoleEAC',
198
-		'0.4.0.1862*' => 'etsiQcsProfile',
199
-		'0.4.0.1862.1*' => 'etsiQcs',
200
-		'0.4.0.1862.1.1*' => 'etsiQcsCompliance',
201
-		'0.4.0.1862.1.2*' => 'etsiQcsLimitValue',
202
-		'0.4.0.1862.1.3*' => 'etsiQcsRetentionPeriod',
203
-		'0.4.0.1862.1.4*' => 'etsiQcsQcSSCD',
204
-		'0.9.2342.19200300.100.1.1*' => 'userID',
205
-		'0.9.2342.19200300.100.1.3*' => 'rfc822Mailbox',
206
-		'0.9.2342.19200300.100.1.25*' => 'domainComponent',
207
-		'1.0.10118.3.0.49*' => 'ripemd160',
208
-		'1.0.10118.3.0.50*' => 'ripemd128',
209
-		'1.0.10118.3.0.55*' => 'whirlpool',
210
-		'1.2.36.1.3.1.1.1*' => 'qgpki',
211
-		'1.2.36.1.3.1.1.1.1*' => 'qgpkiPolicies',
212
-		'1.2.36.1.3.1.1.1.1.1*' => 'qgpkiMedIntermedCA',
213
-		'1.2.36.1.3.1.1.1.1.1.1*' => 'qgpkiMedIntermedIndividual',
214
-		'1.2.36.1.3.1.1.1.1.1.2*' => 'qgpkiMedIntermedDeviceControl',
215
-		'1.2.36.1.3.1.1.1.1.1.3*' => 'qgpkiMedIntermedDevice',
216
-		'1.2.36.1.3.1.1.1.1.1.4*' => 'qgpkiMedIntermedAuthorisedParty',
217
-		'1.2.36.1.3.1.1.1.1.1.5*' => 'qgpkiMedIntermedDeviceSystem',
218
-		'1.2.36.1.3.1.1.1.1.2*' => 'qgpkiMedIssuingCA',
219
-		'1.2.36.1.3.1.1.1.1.2.1*' => 'qgpkiMedIssuingIndividual',
220
-		'1.2.36.1.3.1.1.1.1.2.2*' => 'qgpkiMedIssuingDeviceControl',
221
-		'1.2.36.1.3.1.1.1.1.2.3*' => 'qgpkiMedIssuingDevice',
222
-		'1.2.36.1.3.1.1.1.1.2.4*' => 'qgpkiMedIssuingAuthorisedParty',
223
-		'1.2.36.1.3.1.1.1.1.2.5*' => 'qgpkiMedIssuingClientAuth',
224
-		'1.2.36.1.3.1.1.1.1.2.6*' => 'qgpkiMedIssuingServerAuth',
225
-		'1.2.36.1.3.1.1.1.1.2.7*' => 'qgpkiMedIssuingDataProt',
226
-		'1.2.36.1.3.1.1.1.1.2.8*' => 'qgpkiMedIssuingTokenAuth',
227
-		'1.2.36.1.3.1.1.1.1.3*' => 'qgpkiBasicIntermedCA',
228
-		'1.2.36.1.3.1.1.1.1.3.1*' => 'qgpkiBasicIntermedDeviceSystem',
229
-		'1.2.36.1.3.1.1.1.1.4*' => 'qgpkiBasicIssuingCA',
230
-		'1.2.36.1.3.1.1.1.1.4.1*' => 'qgpkiBasicIssuingClientAuth',
231
-		'1.2.36.1.3.1.1.1.1.4.2*' => 'qgpkiBasicIssuingServerAuth',
232
-		'1.2.36.1.3.1.1.1.1.4.3*' => 'qgpkiBasicIssuingDataSigning',
233
-		'1.2.36.1.3.1.1.1.2*' => 'qgpkiAssuranceLevel',
234
-		'1.2.36.1.3.1.1.1.2.1*' => 'qgpkiAssuranceRudimentary',
235
-		'1.2.36.1.3.1.1.1.2.2*' => 'qgpkiAssuranceBasic',
236
-		'1.2.36.1.3.1.1.1.2.3*' => 'qgpkiAssuranceMedium',
237
-		'1.2.36.1.3.1.1.1.2.4*' => 'qgpkiAssuranceHigh',
238
-		'1.2.36.1.3.1.1.1.3*' => 'qgpkiCertFunction',
239
-		'1.2.36.1.3.1.1.1.3.1*' => 'qgpkiFunctionIndividual',
240
-		'1.2.36.1.3.1.1.1.3.2*' => 'qgpkiFunctionDevice',
241
-		'1.2.36.1.3.1.1.1.3.3*' => 'qgpkiFunctionAuthorisedParty',
242
-		'1.2.36.1.3.1.1.1.3.4*' => 'qgpkiFunctionDeviceControl',
243
-		'1.2.36.1.3.1.2*' => 'qpspki',
244
-		'1.2.36.1.3.1.2.1*' => 'qpspkiPolicies',
245
-		'1.2.36.1.3.1.2.1.2*' => 'qpspkiPolicyBasic',
246
-		'1.2.36.1.3.1.2.1.3*' => 'qpspkiPolicyMedium',
247
-		'1.2.36.1.3.1.2.1.4*' => 'qpspkiPolicyHigh',
248
-		'1.2.36.1.3.1.3.2*' => 'qtmrpki',
249
-		'1.2.36.1.3.1.3.2.1*' => 'qtmrpkiPolicies',
250
-		'1.2.36.1.3.1.3.2.2*' => 'qtmrpkiPurpose',
251
-		'1.2.36.1.3.1.3.2.2.1*' => 'qtmrpkiIndividual',
252
-		'1.2.36.1.3.1.3.2.2.2*' => 'qtmrpkiDeviceControl',
253
-		'1.2.36.1.3.1.3.2.2.3*' => 'qtmrpkiDevice',
254
-		'1.2.36.1.3.1.3.2.2.4*' => 'qtmrpkiAuthorisedParty',
255
-		'1.2.36.1.3.1.3.2.2.5*' => 'qtmrpkiDeviceSystem',
256
-		'1.2.36.1.3.1.3.2.3*' => 'qtmrpkiDevice',
257
-		'1.2.36.1.3.1.3.2.3.1*' => 'qtmrpkiDriverLicense',
258
-		'1.2.36.1.3.1.3.2.3.2*' => 'qtmrpkiIndustryAuthority',
259
-		'1.2.36.1.3.1.3.2.3.3*' => 'qtmrpkiMarineLicense',
260
-		'1.2.36.1.3.1.3.2.3.4*' => 'qtmrpkiAdultProofOfAge',
261
-		'1.2.36.1.3.1.3.2.3.5*' => 'qtmrpkiSam',
262
-		'1.2.36.1.3.1.3.2.4*' => 'qtmrpkiAuthorisedParty',
263
-		'1.2.36.1.3.1.3.2.4.1*' => 'qtmrpkiTransportInspector',
264
-		'1.2.36.1.3.1.3.2.4.2*' => 'qtmrpkiPoliceOfficer',
265
-		'1.2.36.1.3.1.3.2.4.3*' => 'qtmrpkiSystem',
266
-		'1.2.36.1.3.1.3.2.4.4*' => 'qtmrpkiLiquorLicensingInspector',
267
-		'1.2.36.1.3.1.3.2.4.5*' => 'qtmrpkiMarineEnforcementOfficer',
268
-		'1.2.36.1.333.1*' => 'australianBusinessNumber',
269
-		'1.2.36.68980861.1.1.2*' => 'signetPersonal',
270
-		'1.2.36.68980861.1.1.3*' => 'signetBusiness',
271
-		'1.2.36.68980861.1.1.4*' => 'signetLegal',
272
-		'1.2.36.68980861.1.1.10*' => 'signetPilot',
273
-		'1.2.36.68980861.1.1.11*' => 'signetIntraNet',
274
-		'1.2.36.68980861.1.1.20*' => 'signetPolicy',
275
-		'1.2.36.75878867.1.100.1.1*' => 'certificatesAustraliaPolicy',
276
-		'1.2.392.200011.61.1.1.1*' => 'mitsubishiSecurityAlgorithm',
277
-		'1.2.392.200011.61.1.1.1.1*' => 'misty1-cbc',
278
-		'1.2.410.200004.1.4*' => 'seedCBC',
279
-		'1.2.410.200004.1.7*' => 'seedMAC',
280
-		'1.2.410.200004.1.15*' => 'pbeWithSHA1AndSEED-CBC',
281
-		'1.2.410.200046.1.1*' => 'aria1AlgorithmModes',
282
-		'1.2.410.200046.1.1.1*' => 'aria128-ecb',
283
-		'1.2.410.200046.1.1.2*' => 'aria128-cbc',
284
-		'1.2.410.200046.1.1.3*' => 'aria128-cfb',
285
-		'1.2.410.200046.1.1.4*' => 'aria128-ofb',
286
-		'1.2.410.200046.1.1.5*' => 'aria128-ctr',
287
-		'1.2.410.200046.1.1.6*' => 'aria192-ecb',
288
-		'1.2.410.200046.1.1.7*' => 'aria192-cbc',
289
-		'1.2.410.200046.1.1.8*' => 'aria192-cfb',
290
-		'1.2.410.200046.1.1.9*' => 'aria192-ofb',
291
-		'1.2.410.200046.1.1.10*' => 'aria192-ctr',
292
-		'1.2.410.200046.1.1.11*' => 'aria256-ecb',
293
-		'1.2.410.200046.1.1.12*' => 'aria256-cbc',
294
-		'1.2.410.200046.1.1.13*' => 'aria256-ctr',
295
-		'1.2.410.200046.1.1.21*' => 'aria128-cmac',
296
-		'1.2.410.200046.1.1.22*' => 'aria192-cmac',
297
-		'1.2.410.200046.1.1.23*' => 'aria256-cmac',
298
-		'1.2.410.200046.1.1.31*' => 'aria128-ocb2',
299
-		'1.2.410.200046.1.1.32*' => 'aria192-ocb2',
300
-		'1.2.410.200046.1.1.33*' => 'aria256-ocb2',
301
-		'1.2.410.200046.1.1.34*' => 'aria128-gcm',
302
-		'1.2.410.200046.1.1.35*' => 'aria192-gcm',
303
-		'1.2.410.200046.1.1.36*' => 'aria256-gcm',
304
-		'1.2.410.200046.1.1.37*' => 'aria128-ccm',
305
-		'1.2.410.200046.1.1.38*' => 'aria192-ccm',
306
-		'1.2.410.200046.1.1.39*' => 'aria256-ccm',
307
-		'1.2.410.200046.1.1.40*' => 'aria128-keywrap',
308
-		'1.2.410.200046.1.1.41*' => 'aria192-keywrap',
309
-		'1.2.410.200046.1.1.42*' => 'aria256-keywrap',
310
-		'1.2.410.200046.1.1.43*' => 'aria128-keywrapWithPad',
311
-		'1.2.410.200046.1.1.44*' => 'aria192-keywrapWithPad',
312
-		'1.2.410.200046.1.1.45*' => 'aria256-keywrapWithPad',
313
-		'1.2.643.2.2.3*' => 'gostSignature',
314
-		'1.2.643.2.2.4*' => 'gost94Signature',
315
-		'1.2.643.2.2.20*' => 'gost94PublicKey',
316
-		'1.2.643.2.2.19*' => 'gostPublicKey',
317
-		'1.2.643.2.2.21*' => 'gostCipher',
318
-		'1.2.643.2.2.31.0*' => 'testCipherParams',
319
-		'1.2.643.2.2.31.1*' => 'cryptoProCipherA',
320
-		'1.2.643.2.2.31.2*' => 'cryptoProCipherB',
321
-		'1.2.643.2.2.31.3*' => 'cryptoProCipherC',
322
-		'1.2.643.2.2.31.4*' => 'cryptoProCipherD',
323
-		'1.2.643.2.2.31.5*' => 'oscar11Cipher',
324
-		'1.2.643.2.2.31.6*' => 'oscar10Cipher',
325
-		'1.2.643.2.2.31.7*' => 'ric1Cipher',
326
-		'1.2.643.2.2.9*' => 'gostDigest',
327
-		'1.2.643.2.2.30.0*' => 'testDigestParams',
328
-		'1.2.643.2.2.30.1*' => 'cryptoProDigestA',
329
-		'1.2.643.2.2.35.0*' => 'testSignParams',
330
-		'1.2.643.2.2.35.1*' => 'cryptoProSignA',
331
-		'1.2.643.2.2.35.2*' => 'cryptoProSignB',
332
-		'1.2.643.2.2.35.3*' => 'cryptoProSignC',
333
-		'1.2.643.2.2.36.0*' => 'cryptoProSignXA',
334
-		'1.2.643.2.2.36.1*' => 'cryptoProSignXB',
335
-		'1.2.643.2.2.14.0*' => 'nullMeshing',
336
-		'1.2.643.2.2.14.1*' => 'cryptoProMeshing',
337
-		'1.2.643.2.2.10*' => 'hmacGost',
338
-		'1.2.643.2.2.13.0*' => 'gostWrap',
339
-		'1.2.643.2.2.13.1*' => 'cryptoProWrap',
340
-		'1.2.643.2.2.96*' => 'cryptoProECDHWrap',
341
-		'1.2.752.34.1*' => 'seis-cp',
342
-		'1.2.752.34.1.1*' => 'SEIS high-assurance policyIdentifier',
343
-		'1.2.752.34.1.2*' => 'SEIS GAK policyIdentifier',
344
-		'1.2.752.34.2*' => 'SEIS pe',
345
-		'1.2.752.34.3*' => 'SEIS at',
346
-		'1.2.752.34.3.1*' => 'SEIS at-personalIdentifier',
347
-		'1.2.840.10040.1*' => 'module',
348
-		'1.2.840.10040.1.1*' => 'x9f1-cert-mgmt',
349
-		'1.2.840.10040.2*' => 'holdinstruction',
350
-		'1.2.840.10040.2.1*' => 'holdinstruction-none',
351
-		'1.2.840.10040.2.2*' => 'callissuer',
352
-		'1.2.840.10040.2.3*' => 'reject',
353
-		'1.2.840.10040.2.4*' => 'pickupToken',
354
-		'1.2.840.10040.3*' => 'attribute',
355
-		'1.2.840.10040.3.1*' => 'countersignature',
356
-		'1.2.840.10040.3.2*' => 'attribute-cert',
357
-		'1.2.840.10040.4*' => 'algorithm',
358
-		'1.2.840.10040.4.1*' => 'dsa',
359
-		'1.2.840.10040.4.2*' => 'dsa-match',
360
-		'1.2.840.10040.4.3*' => 'dsaWithSha1',
361
-		'1.2.840.10045.1*' => 'fieldType',
362
-		'1.2.840.10045.1.1*' => 'prime-field',
363
-		'1.2.840.10045.1.2*' => 'characteristic-two-field',
364
-		'1.2.840.10045.1.2.3*' => 'characteristic-two-basis',
365
-		'1.2.840.10045.1.2.3.1*' => 'onBasis',
366
-		'1.2.840.10045.1.2.3.2*' => 'tpBasis',
367
-		'1.2.840.10045.1.2.3.3*' => 'ppBasis',
368
-		'1.2.840.10045.2*' => 'publicKeyType',
369
-		'1.2.840.10045.2.1*' => 'ecPublicKey',
370
-		'1.2.840.10045.3.0.1*' => 'c2pnb163v1',
371
-		'1.2.840.10045.3.0.2*' => 'c2pnb163v2',
372
-		'1.2.840.10045.3.0.3*' => 'c2pnb163v3',
373
-		'1.2.840.10045.3.0.5*' => 'c2tnb191v1',
374
-		'1.2.840.10045.3.0.6*' => 'c2tnb191v2',
375
-		'1.2.840.10045.3.0.7*' => 'c2tnb191v3',
376
-		'1.2.840.10045.3.0.10*' => 'c2pnb208w1',
377
-		'1.2.840.10045.3.0.11*' => 'c2tnb239v1',
378
-		'1.2.840.10045.3.0.12*' => 'c2tnb239v2',
379
-		'1.2.840.10045.3.0.13*' => 'c2tnb239v3',
380
-		'1.2.840.10045.3.0.16*' => 'c2pnb272w1',
381
-		'1.2.840.10045.3.0.18*' => 'c2tnb359v1',
382
-		'1.2.840.10045.3.0.19*' => 'c2pnb368w1',
383
-		'1.2.840.10045.3.0.20*' => 'c2tnb431r1',
384
-		'1.2.840.10045.3.1.1*' => 'ansiX9p192r1',
385
-		'1.2.840.10045.3.1.1.1*' => 'prime192v1',
386
-		'1.2.840.10045.3.1.1.2*' => 'prime192v2',
387
-		'1.2.840.10045.3.1.1.3*' => 'prime192v3',
388
-		'1.2.840.10045.3.1.1.4*' => 'prime239v1',
389
-		'1.2.840.10045.3.1.1.5*' => 'prime239v2',
390
-		'1.2.840.10045.3.1.1.6*' => 'prime239v3',
391
-		'1.2.840.10045.3.1.1.7*' => 'prime256v1',
392
-		'1.2.840.10045.3.1.7*' => 'ansiX9p256r1',
393
-		'1.2.840.10045.4.1*' => 'ecdsaWithSHA1',
394
-		'1.2.840.10045.4.2*' => 'ecdsaWithRecommended',
395
-		'1.2.840.10045.4.3*' => 'ecdsaWithSpecified',
396
-		'1.2.840.10045.4.3.1*' => 'ecdsaWithSHA224',
397
-		'1.2.840.10045.4.3.2*' => 'ecdsaWithSHA256',
398
-		'1.2.840.10045.4.3.3*' => 'ecdsaWithSHA384',
399
-		'1.2.840.10045.4.3.4*' => 'ecdsaWithSHA512',
400
-		'1.2.840.10046.1*' => 'fieldType',
401
-		'1.2.840.10046.1.1*' => 'gf-prime',
402
-		'1.2.840.10046.2*' => 'numberType',
403
-		'1.2.840.10046.2.1*' => 'dhPublicKey',
404
-		'1.2.840.10046.3*' => 'scheme',
405
-		'1.2.840.10046.3.1*' => 'dhStatic',
406
-		'1.2.840.10046.3.2*' => 'dhEphem',
407
-		'1.2.840.10046.3.3*' => 'dhHybrid1',
408
-		'1.2.840.10046.3.4*' => 'dhHybrid2',
409
-		'1.2.840.10046.3.5*' => 'mqv2',
410
-		'1.2.840.10046.3.6*' => 'mqv1',
411
-		'1.2.840.10065.2.2*' => '?',
412
-		'1.2.840.10065.2.3*' => 'healthcareLicense',
413
-		'1.2.840.10065.2.3.1.1*' => 'license?',
414
-		'1.2.840.113533.7*' => 'nsn',
415
-		'1.2.840.113533.7.65*' => 'nsn-ce',
416
-		'1.2.840.113533.7.65.0*' => 'entrustVersInfo',
417
-		'1.2.840.113533.7.66*' => 'nsn-alg',
418
-		'1.2.840.113533.7.66.3*' => 'cast3CBC',
419
-		'1.2.840.113533.7.66.10*' => 'cast5CBC',
420
-		'1.2.840.113533.7.66.11*' => 'cast5MAC',
421
-		'1.2.840.113533.7.66.12*' => 'pbeWithMD5AndCAST5-CBC',
422
-		'1.2.840.113533.7.66.13*' => 'passwordBasedMac',
423
-		'1.2.840.113533.7.67*' => 'nsn-oc',
424
-		'1.2.840.113533.7.67.0*' => 'entrustUser',
425
-		'1.2.840.113533.7.68*' => 'nsn-at',
426
-		'1.2.840.113533.7.68.0*' => 'entrustCAInfo',
427
-		'1.2.840.113533.7.68.10*' => 'attributeCertificate',
428
-		'1.2.840.113549.1.1*' => 'pkcs-1',
429
-		'1.2.840.113549.1.1.1*' => 'rsaEncryption',
430
-		'1.2.840.113549.1.1.2*' => 'md2WithRSAEncryption',
431
-		'1.2.840.113549.1.1.3*' => 'md4WithRSAEncryption',
432
-		'1.2.840.113549.1.1.4*' => 'md5WithRSAEncryption',
433
-		'1.2.840.113549.1.1.5*' => 'sha1WithRSAEncryption',
434
-		'1.2.840.113549.1.1.7*' => 'rsaOAEP',
435
-		'1.2.840.113549.1.1.8*' => 'pkcs1-MGF',
436
-		'1.2.840.113549.1.1.9*' => 'rsaOAEP-pSpecified',
437
-		'1.2.840.113549.1.1.10*' => 'rsaPSS',
438
-		'1.2.840.113549.1.1.11*' => 'sha256WithRSAEncryption',
439
-		'1.2.840.113549.1.1.12*' => 'sha384WithRSAEncryption',
440
-		'1.2.840.113549.1.1.13*' => 'sha512WithRSAEncryption',
441
-		'1.2.840.113549.1.1.14*' => 'sha224WithRSAEncryption',
442
-		'1.2.840.113549.1.1.6*' => 'rsaOAEPEncryptionSET',
443
-		'1.2.840.113549.1.2*' => 'bsafeRsaEncr',
444
-		'1.2.840.113549.1.3*' => 'pkcs-3',
445
-		'1.2.840.113549.1.3.1*' => 'dhKeyAgreement',
446
-		'1.2.840.113549.1.5*' => 'pkcs-5',
447
-		'1.2.840.113549.1.5.1*' => 'pbeWithMD2AndDES-CBC',
448
-		'1.2.840.113549.1.5.3*' => 'pbeWithMD5AndDES-CBC',
449
-		'1.2.840.113549.1.5.4*' => 'pbeWithMD2AndRC2-CBC',
450
-		'1.2.840.113549.1.5.6*' => 'pbeWithMD5AndRC2-CBC',
451
-		'1.2.840.113549.1.5.9*' => 'pbeWithMD5AndXOR',
452
-		'1.2.840.113549.1.5.10*' => 'pbeWithSHAAndDES-CBC',
453
-		'1.2.840.113549.1.5.12*' => 'pkcs5PBKDF2',
454
-		'1.2.840.113549.1.5.13*' => 'pkcs5PBES2',
455
-		'1.2.840.113549.1.5.14*' => 'pkcs5PBMAC1',
456
-		'1.2.840.113549.1.7*' => 'pkcs-7',
457
-		'1.2.840.113549.1.7.1*' => 'data',
458
-		'1.2.840.113549.1.7.2*' => 'signedData',
459
-		'1.2.840.113549.1.7.3*' => 'envelopedData',
460
-		'1.2.840.113549.1.7.4*' => 'signedAndEnvelopedData',
461
-		'1.2.840.113549.1.7.5*' => 'digestedData',
462
-		'1.2.840.113549.1.7.6*' => 'encryptedData',
463
-		'1.2.840.113549.1.7.7*' => 'dataWithAttributes',
464
-		'1.2.840.113549.1.7.8*' => 'encryptedPrivateKeyInfo',
465
-		'1.2.840.113549.1.9*' => 'pkcs-9',
466
-		'1.2.840.113549.1.9.1*' => 'emailAddress',
467
-		'1.2.840.113549.1.9.2*' => 'unstructuredName',
468
-		'1.2.840.113549.1.9.3*' => 'contentType',
469
-		'1.2.840.113549.1.9.4*' => 'messageDigest',
470
-		'1.2.840.113549.1.9.5*' => 'signingTime',
471
-		'1.2.840.113549.1.9.6*' => 'countersignature',
472
-		'1.2.840.113549.1.9.7*' => 'challengePassword',
473
-		'1.2.840.113549.1.9.8*' => 'unstructuredAddress',
474
-		'1.2.840.113549.1.9.9*' => 'extendedCertificateAttributes',
475
-		'1.2.840.113549.1.9.10*' => 'issuerAndSerialNumber',
476
-		'1.2.840.113549.1.9.11*' => 'passwordCheck',
477
-		'1.2.840.113549.1.9.12*' => 'publicKey',
478
-		'1.2.840.113549.1.9.13*' => 'signingDescription',
479
-		'1.2.840.113549.1.9.14*' => 'extensionRequest',
480
-		'1.2.840.113549.1.9.15*' => 'sMIMECapabilities',
481
-		'1.2.840.113549.1.9.15.1*' => 'preferSignedData',
482
-		'1.2.840.113549.1.9.15.2*' => 'canNotDecryptAny',
483
-		'1.2.840.113549.1.9.15.3*' => 'receiptRequest',
484
-		'1.2.840.113549.1.9.15.4*' => 'receipt',
485
-		'1.2.840.113549.1.9.15.5*' => 'contentHints',
486
-		'1.2.840.113549.1.9.15.6*' => 'mlExpansionHistory',
487
-		'1.2.840.113549.1.9.16*' => 'id-sMIME',
488
-		'1.2.840.113549.1.9.16.0*' => 'id-mod',
489
-		'1.2.840.113549.1.9.16.0.1*' => 'id-mod-cms',
490
-		'1.2.840.113549.1.9.16.0.2*' => 'id-mod-ess',
491
-		'1.2.840.113549.1.9.16.0.3*' => 'id-mod-oid',
492
-		'1.2.840.113549.1.9.16.0.4*' => 'id-mod-msg-v3',
493
-		'1.2.840.113549.1.9.16.0.5*' => 'id-mod-ets-eSignature-88',
494
-		'1.2.840.113549.1.9.16.0.6*' => 'id-mod-ets-eSignature-97',
495
-		'1.2.840.113549.1.9.16.0.7*' => 'id-mod-ets-eSigPolicy-88',
496
-		'1.2.840.113549.1.9.16.0.8*' => 'id-mod-ets-eSigPolicy-88',
497
-		'1.2.840.113549.1.9.16.1*' => 'contentType',
498
-		'1.2.840.113549.1.9.16.1.1*' => 'receipt',
499
-		'1.2.840.113549.1.9.16.1.2*' => 'authData',
500
-		'1.2.840.113549.1.9.16.1.3*' => 'publishCert',
501
-		'1.2.840.113549.1.9.16.1.4*' => 'tSTInfo',
502
-		'1.2.840.113549.1.9.16.1.5*' => 'tDTInfo',
503
-		'1.2.840.113549.1.9.16.1.6*' => 'contentInfo',
504
-		'1.2.840.113549.1.9.16.1.7*' => 'dVCSRequestData',
505
-		'1.2.840.113549.1.9.16.1.8*' => 'dVCSResponseData',
506
-		'1.2.840.113549.1.9.16.1.9*' => 'compressedData',
507
-		'1.2.840.113549.1.9.16.1.10*' => 'scvpCertValRequest',
508
-		'1.2.840.113549.1.9.16.1.11*' => 'scvpCertValResponse',
509
-		'1.2.840.113549.1.9.16.1.12*' => 'scvpValPolRequest',
510
-		'1.2.840.113549.1.9.16.1.13*' => 'scvpValPolResponse',
511
-		'1.2.840.113549.1.9.16.1.14*' => 'attrCertEncAttrs',
512
-		'1.2.840.113549.1.9.16.1.15*' => 'tSReq',
513
-		'1.2.840.113549.1.9.16.1.16*' => 'firmwarePackage',
514
-		'1.2.840.113549.1.9.16.1.17*' => 'firmwareLoadReceipt',
515
-		'1.2.840.113549.1.9.16.1.18*' => 'firmwareLoadError',
516
-		'1.2.840.113549.1.9.16.1.19*' => 'contentCollection',
517
-		'1.2.840.113549.1.9.16.1.20*' => 'contentWithAttrs',
518
-		'1.2.840.113549.1.9.16.1.21*' => 'encKeyWithID',
519
-		'1.2.840.113549.1.9.16.1.22*' => 'encPEPSI',
520
-		'1.2.840.113549.1.9.16.1.23*' => 'authEnvelopedData',
521
-		'1.2.840.113549.1.9.16.1.24*' => 'routeOriginAttest',
522
-		'1.2.840.113549.1.9.16.1.25*' => 'symmetricKeyPackage',
523
-		'1.2.840.113549.1.9.16.1.26*' => 'rpkiManifest',
524
-		'1.2.840.113549.1.9.16.1.27*' => 'asciiTextWithCRLF',
525
-		'1.2.840.113549.1.9.16.1.28*' => 'xml',
526
-		'1.2.840.113549.1.9.16.1.29*' => 'pdf',
527
-		'1.2.840.113549.1.9.16.1.30*' => 'postscript',
528
-		'1.2.840.113549.1.9.16.1.31*' => 'timestampedData',
529
-		'1.2.840.113549.1.9.16.1.32*' => 'asAdjacencyAttest',
530
-		'1.2.840.113549.1.9.16.1.33*' => 'rpkiTrustAnchor',
531
-		'1.2.840.113549.1.9.16.1.34*' => 'trustAnchorList',
532
-		'1.2.840.113549.1.9.16.2*' => 'authenticatedAttributes',
533
-		'1.2.840.113549.1.9.16.2.1*' => 'receiptRequest',
534
-		'1.2.840.113549.1.9.16.2.2*' => 'securityLabel',
535
-		'1.2.840.113549.1.9.16.2.3*' => 'mlExpandHistory',
536
-		'1.2.840.113549.1.9.16.2.4*' => 'contentHint',
537
-		'1.2.840.113549.1.9.16.2.5*' => 'msgSigDigest',
538
-		'1.2.840.113549.1.9.16.2.6*' => 'encapContentType',
539
-		'1.2.840.113549.1.9.16.2.7*' => 'contentIdentifier',
540
-		'1.2.840.113549.1.9.16.2.8*' => 'macValue',
541
-		'1.2.840.113549.1.9.16.2.9*' => 'equivalentLabels',
542
-		'1.2.840.113549.1.9.16.2.10*' => 'contentReference',
543
-		'1.2.840.113549.1.9.16.2.11*' => 'encrypKeyPref',
544
-		'1.2.840.113549.1.9.16.2.12*' => 'signingCertificate',
545
-		'1.2.840.113549.1.9.16.2.13*' => 'smimeEncryptCerts',
546
-		'1.2.840.113549.1.9.16.2.14*' => 'timeStampToken',
547
-		'1.2.840.113549.1.9.16.2.15*' => 'sigPolicyId',
548
-		'1.2.840.113549.1.9.16.2.16*' => 'commitmentType',
549
-		'1.2.840.113549.1.9.16.2.17*' => 'signerLocation',
550
-		'1.2.840.113549.1.9.16.2.18*' => 'signerAttr',
551
-		'1.2.840.113549.1.9.16.2.19*' => 'otherSigCert',
552
-		'1.2.840.113549.1.9.16.2.20*' => 'contentTimestamp',
553
-		'1.2.840.113549.1.9.16.2.21*' => 'certificateRefs',
554
-		'1.2.840.113549.1.9.16.2.22*' => 'revocationRefs',
555
-		'1.2.840.113549.1.9.16.2.23*' => 'certValues',
556
-		'1.2.840.113549.1.9.16.2.24*' => 'revocationValues',
557
-		'1.2.840.113549.1.9.16.2.25*' => 'escTimeStamp',
558
-		'1.2.840.113549.1.9.16.2.26*' => 'certCRLTimestamp',
559
-		'1.2.840.113549.1.9.16.2.27*' => 'archiveTimeStamp',
560
-		'1.2.840.113549.1.9.16.2.28*' => 'signatureType',
561
-		'1.2.840.113549.1.9.16.2.29*' => 'dvcsDvc',
562
-		'1.2.840.113549.1.9.16.2.30*' => 'cekReference',
563
-		'1.2.840.113549.1.9.16.2.31*' => 'maxCEKDecrypts',
564
-		'1.2.840.113549.1.9.16.2.32*' => 'kekDerivationAlg',
565
-		'1.2.840.113549.1.9.16.2.33*' => 'intendedRecipients',
566
-		'1.2.840.113549.1.9.16.2.34*' => 'cmcUnsignedData',
567
-		'1.2.840.113549.1.9.16.2.35*' => 'fwPackageID',
568
-		'1.2.840.113549.1.9.16.2.36*' => 'fwTargetHardwareIDs',
569
-		'1.2.840.113549.1.9.16.2.37*' => 'fwDecryptKeyID',
570
-		'1.2.840.113549.1.9.16.2.38*' => 'fwImplCryptAlgs',
571
-		'1.2.840.113549.1.9.16.2.39*' => 'fwWrappedFirmwareKey',
572
-		'1.2.840.113549.1.9.16.2.40*' => 'fwCommunityIdentifiers',
573
-		'1.2.840.113549.1.9.16.2.41*' => 'fwPkgMessageDigest',
574
-		'1.2.840.113549.1.9.16.2.42*' => 'fwPackageInfo',
575
-		'1.2.840.113549.1.9.16.2.43*' => 'fwImplCompressAlgs',
576
-		'1.2.840.113549.1.9.16.2.44*' => 'etsAttrCertificateRefs',
577
-		'1.2.840.113549.1.9.16.2.45*' => 'etsAttrRevocationRefs',
578
-		'1.2.840.113549.1.9.16.2.46*' => 'binarySigningTime',
579
-		'1.2.840.113549.1.9.16.2.47*' => 'signingCertificateV2',
580
-		'1.2.840.113549.1.9.16.2.48*' => 'etsArchiveTimeStampV2',
581
-		'1.2.840.113549.1.9.16.2.49*' => 'erInternal',
582
-		'1.2.840.113549.1.9.16.2.50*' => 'erExternal',
583
-		'1.2.840.113549.1.9.16.2.51*' => 'multipleSignatures',
584
-		'1.2.840.113549.1.9.16.3.1*' => 'esDHwith3DES',
585
-		'1.2.840.113549.1.9.16.3.2*' => 'esDHwithRC2',
586
-		'1.2.840.113549.1.9.16.3.3*' => '3desWrap',
587
-		'1.2.840.113549.1.9.16.3.4*' => 'rc2Wrap',
588
-		'1.2.840.113549.1.9.16.3.5*' => 'esDH',
589
-		'1.2.840.113549.1.9.16.3.6*' => 'cms3DESwrap',
590
-		'1.2.840.113549.1.9.16.3.7*' => 'cmsRC2wrap',
591
-		'1.2.840.113549.1.9.16.3.8*' => 'zlib',
592
-		'1.2.840.113549.1.9.16.3.9*' => 'pwriKEK',
593
-		'1.2.840.113549.1.9.16.3.10*' => 'ssDH',
594
-		'1.2.840.113549.1.9.16.3.11*' => 'hmacWith3DESwrap',
595
-		'1.2.840.113549.1.9.16.3.12*' => 'hmacWithAESwrap',
596
-		'1.2.840.113549.1.9.16.3.13*' => 'md5XorExperiment',
597
-		'1.2.840.113549.1.9.16.3.14*' => 'rsaKEM',
598
-		'1.2.840.113549.1.9.16.3.15*' => 'authEnc128',
599
-		'1.2.840.113549.1.9.16.3.16*' => 'authEnc256',
600
-		'1.2.840.113549.1.9.16.4.1*' => 'certDist-ldap',
601
-		'1.2.840.113549.1.9.16.5.1*' => 'sigPolicyQualifier-spuri x',
602
-		'1.2.840.113549.1.9.16.5.2*' => 'sigPolicyQualifier-spUserNotice',
603
-		'1.2.840.113549.1.9.16.6.1*' => 'proofOfOrigin',
604
-		'1.2.840.113549.1.9.16.6.2*' => 'proofOfReceipt',
605
-		'1.2.840.113549.1.9.16.6.3*' => 'proofOfDelivery',
606
-		'1.2.840.113549.1.9.16.6.4*' => 'proofOfSender',
607
-		'1.2.840.113549.1.9.16.6.5*' => 'proofOfApproval',
608
-		'1.2.840.113549.1.9.16.6.6*' => 'proofOfCreation',
609
-		'1.2.840.113549.1.9.16.8.1*' => 'glUseKEK',
610
-		'1.2.840.113549.1.9.16.8.2*' => 'glDelete',
611
-		'1.2.840.113549.1.9.16.8.3*' => 'glAddMember',
612
-		'1.2.840.113549.1.9.16.8.4*' => 'glDeleteMember',
613
-		'1.2.840.113549.1.9.16.8.5*' => 'glRekey',
614
-		'1.2.840.113549.1.9.16.8.6*' => 'glAddOwner',
615
-		'1.2.840.113549.1.9.16.8.7*' => 'glRemoveOwner',
616
-		'1.2.840.113549.1.9.16.8.8*' => 'glkCompromise',
617
-		'1.2.840.113549.1.9.16.8.9*' => 'glkRefresh',
618
-		'1.2.840.113549.1.9.16.8.10*' => 'glFailInfo',
619
-		'1.2.840.113549.1.9.16.8.11*' => 'glaQueryRequest',
620
-		'1.2.840.113549.1.9.16.8.12*' => 'glaQueryResponse',
621
-		'1.2.840.113549.1.9.16.8.13*' => 'glProvideCert',
622
-		'1.2.840.113549.1.9.16.8.14*' => 'glUpdateCert',
623
-		'1.2.840.113549.1.9.16.8.15*' => 'glKey',
624
-		'1.2.840.113549.1.9.16.9*' => 'signatureTypeIdentifier',
625
-		'1.2.840.113549.1.9.16.9.1*' => 'originatorSig',
626
-		'1.2.840.113549.1.9.16.9.2*' => 'domainSig',
627
-		'1.2.840.113549.1.9.16.9.3*' => 'additionalAttributesSig',
628
-		'1.2.840.113549.1.9.16.9.4*' => 'reviewSig',
629
-		'1.2.840.113549.1.9.16.11*' => 'capabilities',
630
-		'1.2.840.113549.1.9.16.11.1*' => 'preferBinaryInside',
631
-		'1.2.840.113549.1.9.20*' => 'friendlyName (for PKCS #12)',
632
-		'1.2.840.113549.1.9.21*' => 'localKeyID (for PKCS #12)',
633
-		'1.2.840.113549.1.9.22*' => 'certTypes (for PKCS #12)',
634
-		'1.2.840.113549.1.9.22.1*' => 'x509Certificate (for PKCS #12)',
635
-		'1.2.840.113549.1.9.22.2*' => 'sdsiCertificate (for PKCS #12)',
636
-		'1.2.840.113549.1.9.23*' => 'crlTypes (for PKCS #12)',
637
-		'1.2.840.113549.1.9.23.1*' => 'x509Crl (for PKCS #12)',
638
-		'1.2.840.113549.1.9.24*' => 'pkcs9objectClass',
639
-		'1.2.840.113549.1.9.25*' => 'pkcs9attributes',
640
-		'1.2.840.113549.1.9.25.1*' => 'pkcs15Token',
641
-		'1.2.840.113549.1.9.25.2*' => 'encryptedPrivateKeyInfo',
642
-		'1.2.840.113549.1.9.25.3*' => 'randomNonce',
643
-		'1.2.840.113549.1.9.25.4*' => 'sequenceNumber',
644
-		'1.2.840.113549.1.9.25.5*' => 'pkcs7PDU',
645
-		'1.2.840.113549.1.9.26*' => 'pkcs9syntax',
646
-		'1.2.840.113549.1.9.27*' => 'pkcs9matchingRules',
647
-		'1.2.840.113549.1.12*' => 'pkcs-12',
648
-		'1.2.840.113549.1.12.1*' => 'pkcs-12-PbeIds',
649
-		'1.2.840.113549.1.12.1.1*' => 'pbeWithSHAAnd128BitRC4',
650
-		'1.2.840.113549.1.12.1.2*' => 'pbeWithSHAAnd40BitRC4',
651
-		'1.2.840.113549.1.12.1.3*' => 'pbeWithSHAAnd3-KeyTripleDES-CBC',
652
-		'1.2.840.113549.1.12.1.4*' => 'pbeWithSHAAnd2-KeyTripleDES-CBC',
653
-		'1.2.840.113549.1.12.1.5*' => 'pbeWithSHAAnd128BitRC2-CBC',
654
-		'1.2.840.113549.1.12.1.6*' => 'pbeWithSHAAnd40BitRC2-CBC',
655
-		'1.2.840.113549.1.12.2*' => 'pkcs-12-ESPVKID',
656
-		'1.2.840.113549.1.12.2.1*' => 'pkcs-12-PKCS8KeyShrouding',
657
-		'1.2.840.113549.1.12.3*' => 'pkcs-12-BagIds',
658
-		'1.2.840.113549.1.12.3.1*' => 'pkcs-12-keyBagId',
659
-		'1.2.840.113549.1.12.3.2*' => 'pkcs-12-certAndCRLBagId',
660
-		'1.2.840.113549.1.12.3.3*' => 'pkcs-12-secretBagId',
661
-		'1.2.840.113549.1.12.3.4*' => 'pkcs-12-safeContentsId',
662
-		'1.2.840.113549.1.12.3.5*' => 'pkcs-12-pkcs-8ShroudedKeyBagId',
663
-		'1.2.840.113549.1.12.4*' => 'pkcs-12-CertBagID',
664
-		'1.2.840.113549.1.12.4.1*' => 'pkcs-12-X509CertCRLBagID',
665
-		'1.2.840.113549.1.12.4.2*' => 'pkcs-12-SDSICertBagID',
666
-		'1.2.840.113549.1.12.5*' => 'pkcs-12-OID',
667
-		'1.2.840.113549.1.12.5.1*' => 'pkcs-12-PBEID',
668
-		'1.2.840.113549.1.12.5.1.1*' => 'pkcs-12-PBEWithSha1And128BitRC4',
669
-		'1.2.840.113549.1.12.5.1.2*' => 'pkcs-12-PBEWithSha1And40BitRC4',
670
-		'1.2.840.113549.1.12.5.1.3*' => 'pkcs-12-PBEWithSha1AndTripleDESCBC',
671
-		'1.2.840.113549.1.12.5.1.4*' => 'pkcs-12-PBEWithSha1And128BitRC2CBC',
672
-		'1.2.840.113549.1.12.5.1.5*' => 'pkcs-12-PBEWithSha1And40BitRC2CBC',
673
-		'1.2.840.113549.1.12.5.1.6*' => 'pkcs-12-PBEWithSha1AndRC4',
674
-		'1.2.840.113549.1.12.5.1.7*' => 'pkcs-12-PBEWithSha1AndRC2CBC',
675
-		'1.2.840.113549.1.12.5.2*' => 'pkcs-12-EnvelopingID',
676
-		'1.2.840.113549.1.12.5.2.1*' => 'pkcs-12-RSAEncryptionWith128BitRC4',
677
-		'1.2.840.113549.1.12.5.2.2*' => 'pkcs-12-RSAEncryptionWith40BitRC4',
678
-		'1.2.840.113549.1.12.5.2.3*' => 'pkcs-12-RSAEncryptionWithTripleDES',
679
-		'1.2.840.113549.1.12.5.3*' => 'pkcs-12-SignatureID',
680
-		'1.2.840.113549.1.12.5.3.1*' => 'pkcs-12-RSASignatureWithSHA1Digest',
681
-		'1.2.840.113549.1.12.10*' => 'pkcs-12Version1',
682
-		'1.2.840.113549.1.12.10.1*' => 'pkcs-12BadIds',
683
-		'1.2.840.113549.1.12.10.1.1*' => 'pkcs-12-keyBag',
684
-		'1.2.840.113549.1.12.10.1.2*' => 'pkcs-12-pkcs-8ShroudedKeyBag',
685
-		'1.2.840.113549.1.12.10.1.3*' => 'pkcs-12-certBag',
686
-		'1.2.840.113549.1.12.10.1.4*' => 'pkcs-12-crlBag',
687
-		'1.2.840.113549.1.12.10.1.5*' => 'pkcs-12-secretBag',
688
-		'1.2.840.113549.1.12.10.1.6*' => 'pkcs-12-safeContentsBag',
689
-		'1.2.840.113549.1.15.1*' => 'pkcs15modules',
690
-		'1.2.840.113549.1.15.2*' => 'pkcs15attributes',
691
-		'1.2.840.113549.1.15.3*' => 'pkcs15contentType',
692
-		'1.2.840.113549.1.15.3.1*' => 'pkcs15content',
693
-		'1.2.840.113549.2*' => 'digestAlgorithm',
694
-		'1.2.840.113549.2.2*' => 'md2',
695
-		'1.2.840.113549.2.4*' => 'md4',
696
-		'1.2.840.113549.2.5*' => 'md5',
697
-		'1.2.840.113549.2.7*' => 'hmacWithSHA1',
698
-		'1.2.840.113549.2.8*' => 'hmacWithSHA224',
699
-		'1.2.840.113549.2.9*' => 'hmacWithSHA256',
700
-		'1.2.840.113549.2.10*' => 'hmacWithSHA384',
701
-		'1.2.840.113549.2.11*' => 'hmacWithSHA512',
702
-		'1.2.840.113549.3*' => 'encryptionAlgorithm',
703
-		'1.2.840.113549.3.2*' => 'rc2CBC',
704
-		'1.2.840.113549.3.3*' => 'rc2ECB',
705
-		'1.2.840.113549.3.4*' => 'rc4',
706
-		'1.2.840.113549.3.5*' => 'rc4WithMAC',
707
-		'1.2.840.113549.3.6*' => 'desx-CBC',
708
-		'1.2.840.113549.3.7*' => 'des-EDE3-CBC',
709
-		'1.2.840.113549.3.8*' => 'rc5CBC',
710
-		'1.2.840.113549.3.9*' => 'rc5-CBCPad',
711
-		'1.2.840.113549.3.10*' => 'desCDMF',
712
-		'1.2.840.114021.1.6.1*' => 'Identrus unknown policyIdentifier',
713
-		'1.2.840.114021.4.1*' => 'identrusOCSP',
714
-		'1.2.840.113556.1.2.241*' => 'deliveryMechanism',
715
-		'1.2.840.113556.1.3.0*' => 'site-Addressing',
716
-		'1.2.840.113556.1.3.13*' => 'classSchema',
717
-		'1.2.840.113556.1.3.14*' => 'attributeSchema',
718
-		'1.2.840.113556.1.3.17*' => 'mailbox-Agent',
719
-		'1.2.840.113556.1.3.22*' => 'mailbox',
720
-		'1.2.840.113556.1.3.23*' => 'container',
721
-		'1.2.840.113556.1.3.46*' => 'mailRecipient',
722
-		'1.2.840.113556.1.2.281*' => 'ntSecurityDescriptor',
723
-		'1.2.840.113556.1.4.145*' => 'revision',
724
-		'1.2.840.113556.1.4.1327*' => 'pKIDefaultKeySpec',
725
-		'1.2.840.113556.1.4.1328*' => 'pKIKeyUsage',
726
-		'1.2.840.113556.1.4.1329*' => 'pKIMaxIssuingDepth',
727
-		'1.2.840.113556.1.4.1330*' => 'pKICriticalExtensions',
728
-		'1.2.840.113556.1.4.1331*' => 'pKIExpirationPeriod',
729
-		'1.2.840.113556.1.4.1332*' => 'pKIOverlapPeriod',
730
-		'1.2.840.113556.1.4.1333*' => 'pKIExtendedKeyUsage',
731
-		'1.2.840.113556.1.4.1334*' => 'pKIDefaultCSPs',
732
-		'1.2.840.113556.1.4.1335*' => 'pKIEnrollmentAccess',
733
-		'1.2.840.113556.1.4.1429*' => 'msPKI-RA-Signature',
734
-		'1.2.840.113556.1.4.1430*' => 'msPKI-Enrollment-Flag',
735
-		'1.2.840.113556.1.4.1431*' => 'msPKI-Private-Key-Flag',
736
-		'1.2.840.113556.1.4.1432*' => 'msPKI-Certificate-Name-Flag',
737
-		'1.2.840.113556.1.4.1433*' => 'msPKI-Minimal-Key-Size',
738
-		'1.2.840.113556.1.4.1434*' => 'msPKI-Template-Schema-Version',
739
-		'1.2.840.113556.1.4.1435*' => 'msPKI-Template-Minor-Revision',
740
-		'1.2.840.113556.1.4.1436*' => 'msPKI-Cert-Template-OID',
741
-		'1.2.840.113556.1.4.1437*' => 'msPKI-Supersede-Templates',
742
-		'1.2.840.113556.1.4.1438*' => 'msPKI-RA-Policies',
743
-		'1.2.840.113556.1.4.1439*' => 'msPKI-Certificate-Policy',
744
-		'1.2.840.113556.1.4.1674*' => 'msPKI-Certificate-Application-Policy',
745
-		'1.2.840.113556.1.4.1675*' => 'msPKI-RA-Application-Policies',
746
-		'1.2.840.113556.4.3*' => 'microsoftExcel',
747
-		'1.2.840.113556.4.4*' => 'titledWithOID',
748
-		'1.2.840.113556.4.5*' => 'microsoftPowerPoint',
749
-		'1.2.840.113628.114.1.7*' => 'adobePKCS7',
750
-		'1.2.840.113635.100*' => 'appleDataSecurity',
751
-		'1.2.840.113635.100.1*' => 'appleTrustPolicy',
752
-		'1.2.840.113635.100.1.1*' => 'appleISignTP',
753
-		'1.2.840.113635.100.1.2*' => 'appleX509Basic',
754
-		'1.2.840.113635.100.1.3*' => 'appleSSLPolicy',
755
-		'1.2.840.113635.100.1.4*' => 'appleLocalCertGenPolicy',
756
-		'1.2.840.113635.100.1.5*' => 'appleCSRGenPolicy',
757
-		'1.2.840.113635.100.1.6*' => 'appleCRLPolicy',
758
-		'1.2.840.113635.100.1.7*' => 'appleOCSPPolicy',
759
-		'1.2.840.113635.100.1.8*' => 'appleSMIMEPolicy',
760
-		'1.2.840.113635.100.1.9*' => 'appleEAPPolicy',
761
-		'1.2.840.113635.100.1.10*' => 'appleSWUpdateSigningPolicy',
762
-		'1.2.840.113635.100.1.11*' => 'appleIPSecPolicy',
763
-		'1.2.840.113635.100.1.12*' => 'appleIChatPolicy',
764
-		'1.2.840.113635.100.1.13*' => 'appleResourceSignPolicy',
765
-		'1.2.840.113635.100.1.14*' => 'applePKINITClientPolicy',
766
-		'1.2.840.113635.100.1.15*' => 'applePKINITServerPolicy',
767
-		'1.2.840.113635.100.1.16*' => 'appleCodeSigningPolicy',
768
-		'1.2.840.113635.100.1.17*' => 'applePackageSigningPolicy',
769
-		'1.2.840.113635.100.2*' => 'appleSecurityAlgorithm',
770
-		'1.2.840.113635.100.2.1*' => 'appleFEE',
771
-		'1.2.840.113635.100.2.2*' => 'appleASC',
772
-		'1.2.840.113635.100.2.3*' => 'appleFEE_MD5',
773
-		'1.2.840.113635.100.2.4*' => 'appleFEE_SHA1',
774
-		'1.2.840.113635.100.2.5*' => 'appleFEED',
775
-		'1.2.840.113635.100.2.6*' => 'appleFEEDEXP',
776
-		'1.2.840.113635.100.2.7*' => 'appleECDSA',
777
-		'1.2.840.113635.100.3*' => 'appleDotMacCertificate',
778
-		'1.2.840.113635.100.3.1*' => 'appleDotMacCertificateRequest',
779
-		'1.2.840.113635.100.3.2*' => 'appleDotMacCertificateExtension',
780
-		'1.2.840.113635.100.3.3*' => 'appleDotMacCertificateRequestValues',
781
-		'1.2.840.113635.100.4*' => 'appleExtendedKeyUsage',
782
-		'1.2.840.113635.100.4.1*' => 'appleCodeSigning',
783
-		'1.2.840.113635.100.4.1.1*' => 'appleCodeSigningDevelopment',
784
-		'1.2.840.113635.100.4.1.2*' => 'appleSoftwareUpdateSigning',
785
-		'1.2.840.113635.100.4.1.3*' => 'appleCodeSigningThirdParty',
786
-		'1.2.840.113635.100.4.1.4*' => 'appleResourceSigning',
787
-		'1.2.840.113635.100.4.2*' => 'appleIChatSigning',
788
-		'1.2.840.113635.100.4.3*' => 'appleIChatEncryption',
789
-		'1.2.840.113635.100.4.4*' => 'appleSystemIdentity',
790
-		'1.2.840.113635.100.4.5*' => 'appleCryptoEnv',
791
-		'1.2.840.113635.100.4.5.1*' => 'appleCryptoProductionEnv',
792
-		'1.2.840.113635.100.4.5.2*' => 'appleCryptoMaintenanceEnv',
793
-		'1.2.840.113635.100.4.5.3*' => 'appleCryptoTestEnv',
794
-		'1.2.840.113635.100.4.5.4*' => 'appleCryptoDevelopmentEnv',
795
-		'1.2.840.113635.100.4.6*' => 'appleCryptoQoS',
796
-		'1.2.840.113635.100.4.6.1*' => 'appleCryptoTier0QoS',
797
-		'1.2.840.113635.100.4.6.2*' => 'appleCryptoTier1QoS',
798
-		'1.2.840.113635.100.4.6.3*' => 'appleCryptoTier2QoS',
799
-		'1.2.840.113635.100.4.6.4*' => 'appleCryptoTier3QoS',
800
-		'1.2.840.113635.100.5*' => 'appleCertificatePolicies',
801
-		'1.2.840.113635.100.5.1*' => 'appleCertificatePolicyID',
802
-		'1.2.840.113635.100.5.2*' => 'appleDotMacCertificatePolicyID',
803
-		'1.2.840.113635.100.5.3*' => 'appleADCCertificatePolicyID',
804
-		'1.2.840.113635.100.6*' => 'appleCertificateExtensions',
805
-		'1.2.840.113635.100.6.1*' => 'appleCertificateExtensionCodeSigning',
806
-		'1.2.840.113635.100.6.1.1*' => 'appleCertificateExtensionAppleSigning',
807
-		'1.2.840.113635.100.6.1.2*' => 'appleCertificateExtensionADCDeveloperSigning',
808
-		'1.2.840.113635.100.6.1.3*' => 'appleCertificateExtensionADCAppleSigning',
809
-		'1.3.6.1.4.1.311.2.1.4*' => 'spcIndirectDataContext',
810
-		'1.3.6.1.4.1.311.2.1.10*' => 'spcAgencyInfo',
811
-		'1.3.6.1.4.1.311.2.1.11*' => 'spcStatementType',
812
-		'1.3.6.1.4.1.311.2.1.12*' => 'spcSpOpusInfo',
813
-		'1.3.6.1.4.1.311.2.1.14*' => 'certReqExtensions',
814
-		'1.3.6.1.4.1.311.2.1.15*' => 'spcPEImageData',
815
-		'1.3.6.1.4.1.311.2.1.18*' => 'spcRawFileData',
816
-		'1.3.6.1.4.1.311.2.1.19*' => 'spcStructuredStorageData',
817
-		'1.3.6.1.4.1.311.2.1.20*' => 'spcJavaClassData (type 1)',
818
-		'1.3.6.1.4.1.311.2.1.21*' => 'individualCodeSigning',
819
-		'1.3.6.1.4.1.311.2.1.22*' => 'commercialCodeSigning',
820
-		'1.3.6.1.4.1.311.2.1.25*' => 'spcLink (type 2)',
821
-		'1.3.6.1.4.1.311.2.1.26*' => 'spcMinimalCriteriaInfo',
822
-		'1.3.6.1.4.1.311.2.1.27*' => 'spcFinancialCriteriaInfo',
823
-		'1.3.6.1.4.1.311.2.1.28*' => 'spcLink (type 3)',
824
-		'1.3.6.1.4.1.311.3.2.1*' => 'timestampRequest',
825
-		'1.3.6.1.4.1.311.10.1*' => 'certTrustList',
826
-		'1.3.6.1.4.1.311.10.1.1*' => 'sortedCtl',
827
-		'1.3.6.1.4.1.311.10.2*' => 'nextUpdateLocation',
828
-		'1.3.6.1.4.1.311.10.3.1*' => 'certTrustListSigning',
829
-		'1.3.6.1.4.1.311.10.3.2*' => 'timeStampSigning',
830
-		'1.3.6.1.4.1.311.10.3.3*' => 'serverGatedCrypto',
831
-		'1.3.6.1.4.1.311.10.3.3.1*' => 'serialized',
832
-		'1.3.6.1.4.1.311.10.3.4*' => 'encryptedFileSystem',
833
-		'1.3.6.1.4.1.311.10.3.5*' => 'whqlCrypto',
834
-		'1.3.6.1.4.1.311.10.3.6*' => 'nt5Crypto',
835
-		'1.3.6.1.4.1.311.10.3.7*' => 'oemWHQLCrypto',
836
-		'1.3.6.1.4.1.311.10.3.8*' => 'embeddedNTCrypto',
837
-		'1.3.6.1.4.1.311.10.3.9*' => 'rootListSigner',
838
-		'1.3.6.1.4.1.311.10.3.10*' => 'qualifiedSubordination',
839
-		'1.3.6.1.4.1.311.10.3.11*' => 'keyRecovery',
840
-		'1.3.6.1.4.1.311.10.3.12*' => 'documentSigning',
841
-		'1.3.6.1.4.1.311.10.3.13*' => 'lifetimeSigning',
842
-		'1.3.6.1.4.1.311.10.3.14*' => 'mobileDeviceSoftware',
843
-		'1.3.6.1.4.1.311.10.3.15*' => 'smartDisplay',
844
-		'1.3.6.1.4.1.311.10.3.16*' => 'cspSignature',
845
-		'1.3.6.1.4.1.311.10.3.4.1*' => 'efsRecovery',
846
-		'1.3.6.1.4.1.311.10.4.1*' => 'yesnoTrustAttr',
847
-		'1.3.6.1.4.1.311.10.5.1*' => 'drm',
848
-		'1.3.6.1.4.1.311.10.5.2*' => 'drmIndividualization',
849
-		'1.3.6.1.4.1.311.10.6.1*' => 'licenses',
850
-		'1.3.6.1.4.1.311.10.6.2*' => 'licenseServer',
851
-		'1.3.6.1.4.1.311.10.7.1*' => 'keyidRdn',
852
-		'1.3.6.1.4.1.311.10.8.1*' => 'removeCertificate',
853
-		'1.3.6.1.4.1.311.10.9.1*' => 'crossCertDistPoints',
854
-		'1.3.6.1.4.1.311.10.10.1*' => 'cmcAddAttributes',
855
-		'1.3.6.1.4.1.311.10.11*' => 'certPropIdPrefix',
856
-		'1.3.6.1.4.1.311.10.11.4*' => 'certMd5HashPropId',
857
-		'1.3.6.1.4.1.311.10.11.20*' => 'certKeyIdentifierPropId',
858
-		'1.3.6.1.4.1.311.10.11.28*' => 'certIssuerSerialNumberMd5HashPropId',
859
-		'1.3.6.1.4.1.311.10.11.29*' => 'certSubjectNameMd5HashPropId',
860
-		'1.3.6.1.4.1.311.10.12.1*' => 'anyApplicationPolicy',
861
-		'1.3.6.1.4.1.311.13.1*' => 'renewalCertificate',
862
-		'1.3.6.1.4.1.311.13.2.1*' => 'enrolmentNameValuePair',
863
-		'1.3.6.1.4.1.311.13.2.2*' => 'enrolmentCSP',
864
-		'1.3.6.1.4.1.311.13.2.3*' => 'osVersion',
865
-		'1.3.6.1.4.1.311.16.4*' => 'microsoftRecipientInfo',
866
-		'1.3.6.1.4.1.311.17.1*' => 'pkcs12KeyProviderNameAttr',
867
-		'1.3.6.1.4.1.311.17.2*' => 'localMachineKeyset',
868
-		'1.3.6.1.4.1.311.17.3*' => 'pkcs12ExtendedAttributes',
869
-		'1.3.6.1.4.1.311.20.1*' => 'autoEnrollCtlUsage',
870
-		'1.3.6.1.4.1.311.20.2*' => 'enrollCerttypeExtension',
871
-		'1.3.6.1.4.1.311.20.2.1*' => 'enrollmentAgent',
872
-		'1.3.6.1.4.1.311.20.2.2*' => 'smartcardLogon',
873
-		'1.3.6.1.4.1.311.20.2.3*' => 'universalPrincipalName',
874
-		'1.3.6.1.4.1.311.20.3*' => 'certManifold',
875
-		'1.3.6.1.4.1.311.21.1*' => 'cAKeyCertIndexPair',
876
-		'1.3.6.1.4.1.311.21.5*' => 'caExchange',
877
-		'1.3.6.1.4.1.311.21.2*' => 'certSrvPreviousCertHash',
878
-		'1.3.6.1.4.1.311.21.3*' => 'crlVirtualBase',
879
-		'1.3.6.1.4.1.311.21.4*' => 'crlNextPublish',
880
-		'1.3.6.1.4.1.311.21.6*' => 'keyRecovery',
881
-		'1.3.6.1.4.1.311.21.7*' => 'certificateTemplate',
882
-		'1.3.6.1.4.1.311.21.9*' => 'rdnDummySigner',
883
-		'1.3.6.1.4.1.311.21.10*' => 'applicationCertPolicies',
884
-		'1.3.6.1.4.1.311.21.11*' => 'applicationPolicyMappings',
885
-		'1.3.6.1.4.1.311.21.12*' => 'applicationPolicyConstraints',
886
-		'1.3.6.1.4.1.311.21.13*' => 'archivedKey',
887
-		'1.3.6.1.4.1.311.21.14*' => 'crlSelfCDP',
888
-		'1.3.6.1.4.1.311.21.15*' => 'requireCertChainPolicy',
889
-		'1.3.6.1.4.1.311.21.16*' => 'archivedKeyCertHash',
890
-		'1.3.6.1.4.1.311.21.17*' => 'issuedCertHash',
891
-		'1.3.6.1.4.1.311.21.19*' => 'dsEmailReplication',
892
-		'1.3.6.1.4.1.311.21.20*' => 'requestClientInfo',
893
-		'1.3.6.1.4.1.311.21.21*' => 'encryptedKeyHash',
894
-		'1.3.6.1.4.1.311.21.22*' => 'certsrvCrossCaVersion',
895
-		'1.3.6.1.4.1.311.25.1*' => 'ntdsReplication',
896
-		'1.3.6.1.4.1.311.31.1*' => 'productUpdate',
897
-		'1.3.6.1.4.1.311.47.1.1*' => 'systemHealth',
898
-		'1.3.6.1.4.1.311.47.1.3*' => 'systemHealthLoophole',
899
-		'1.3.6.1.4.1.311.60.1.1*' => 'rootProgramFlags',
900
-		'1.3.6.1.4.1.311.61.1.1*' => 'kernelModeCodeSigning',
901
-		'1.3.6.1.4.1.311.60.2.1.1*' => 'jurisdictionOfIncorporationL',
902
-		'1.3.6.1.4.1.311.60.2.1.2*' => 'jurisdictionOfIncorporationSP',
903
-		'1.3.6.1.4.1.311.60.2.1.3*' => 'jurisdictionOfIncorporationC',
904
-		'1.3.6.1.4.1.311.88.2.1*' => 'originalFilename',
905
-		'1.3.6.1.4.1.188.7.1.1*' => 'ascom',
906
-		'1.3.6.1.4.1.188.7.1.1.1*' => 'ideaECB',
907
-		'1.3.6.1.4.1.188.7.1.1.2*' => 'ideaCBC',
908
-		'1.3.6.1.4.1.188.7.1.1.3*' => 'ideaCFB',
909
-		'1.3.6.1.4.1.188.7.1.1.4*' => 'ideaOFB',
910
-		'1.3.6.1.4.1.2428.10.1.1*' => 'UNINETT policyIdentifier',
911
-		'1.3.6.1.4.1.2712.10*' => 'ICE-TEL policyIdentifier',
912
-		'1.3.6.1.4.1.2786.1.1.1*' => 'ICE-TEL Italian policyIdentifier',
913
-		'1.3.6.1.4.1.3029.1.1.1*' => 'blowfishECB',
914
-		'1.3.6.1.4.1.3029.1.1.2*' => 'blowfishCBC',
915
-		'1.3.6.1.4.1.3029.1.1.3*' => 'blowfishCFB',
916
-		'1.3.6.1.4.1.3029.1.1.4*' => 'blowfishOFB',
917
-		'1.3.6.1.4.1.3029.1.2.1*' => 'elgamal',
918
-		'1.3.6.1.4.1.3029.1.2.1.1*' => 'elgamalWithSHA-1',
919
-		'1.3.6.1.4.1.3029.1.2.1.2*' => 'elgamalWithRIPEMD-160',
920
-		'1.3.6.1.4.1.3029.3.1.1*' => 'cryptlibPresenceCheck',
921
-		'1.3.6.1.4.1.3029.3.1.2*' => 'pkiBoot',
922
-		'1.3.6.1.4.1.3029.3.1.4*' => 'crlExtReason',
923
-		'1.3.6.1.4.1.3029.3.1.5*' => 'keyFeatures',
924
-		'1.3.6.1.4.1.3029.4.1*' => 'cryptlibContent',
925
-		'1.3.6.1.4.1.3029.4.1.1*' => 'cryptlibConfigData',
926
-		'1.3.6.1.4.1.3029.4.1.2*' => 'cryptlibUserIndex',
927
-		'1.3.6.1.4.1.3029.4.1.3*' => 'cryptlibUserInfo',
928
-		'1.3.6.1.4.1.3029.4.1.4*' => 'rtcsRequest',
929
-		'1.3.6.1.4.1.3029.4.1.5*' => 'rtcsResponse',
930
-		'1.3.6.1.4.1.3029.4.1.6*' => 'rtcsResponseExt',
931
-		'1.3.6.1.4.1.3029.42.11172.1*' => 'mpeg-1',
932
-		'1.3.6.1.4.1.3029.88.89.90.90.89*' => 'xYZZY policyIdentifier',
933
-		'1.3.6.1.4.1.3401.8.1.1*' => 'pgpExtension',
934
-		'1.3.6.1.4.1.3576.7*' => 'eciaAscX12Edi',
935
-		'1.3.6.1.4.1.3576.7.1*' => 'plainEDImessage',
936
-		'1.3.6.1.4.1.3576.7.2*' => 'signedEDImessage',
937
-		'1.3.6.1.4.1.3576.7.5*' => 'integrityEDImessage',
938
-		'1.3.6.1.4.1.3576.7.65*' => 'iaReceiptMessage',
939
-		'1.3.6.1.4.1.3576.7.97*' => 'iaStatusMessage',
940
-		'1.3.6.1.4.1.3576.8*' => 'eciaEdifact',
941
-		'1.3.6.1.4.1.3576.9*' => 'eciaNonEdi',
942
-		'1.3.6.1.4.1.4146*' => 'Globalsign',
943
-		'1.3.6.1.4.1.4146.1*' => 'globalsignPolicy',
944
-		'1.3.6.1.4.1.4146.1.10*' => 'globalsignDVPolicy',
945
-		'1.3.6.1.4.1.4146.1.20*' => 'globalsignOVPolicy',
946
-		'1.3.6.1.4.1.4146.1.30*' => 'globalsignTSAPolicy',
947
-		'1.3.6.1.4.1.4146.1.40*' => 'globalsignClientCertPolicy',
948
-		'1.3.6.1.4.1.4146.1.50*' => 'globalsignCodeSignPolicy',
949
-		'1.3.6.1.4.1.4146.1.60*' => 'globalsignRootSignPolicy',
950
-		'1.3.6.1.4.1.4146.1.70*' => 'globalsignTrustedRootPolicy',
951
-		'1.3.6.1.4.1.4146.1.80*' => 'globalsignEDIClientPolicy',
952
-		'1.3.6.1.4.1.4146.1.81*' => 'globalsignEDIServerPolicy',
953
-		'1.3.6.1.4.1.4146.1.90*' => 'globalsignTPMRootPolicy',
954
-		'1.3.6.1.4.1.4146.1.95*' => 'globalsignOCSPPolicy',
955
-		'1.3.6.1.4.1.5309.1.2.2*' => 'edelWebTSAPolicy',
956
-		'1.3.6.1.4.1.5472*' => 'timeproof',
957
-		'1.3.6.1.4.1.5472.1*' => 'tss',
958
-		'1.3.6.1.4.1.5472.1.1*' => 'tss80',
959
-		'1.3.6.1.4.1.5472.1.2*' => 'tss380',
960
-		'1.3.6.1.4.1.5472.1.3*' => 'tss400',
961
-		'1.3.6.1.4.1.5770.0.3*' => 'secondaryPractices',
962
-		'1.3.6.1.4.1.5770.0.4*' => 'physicianIdentifiers',
963
-		'1.3.6.1.4.1.6449.1.2.1.3.1*' => 'comodoPolicy',
964
-		'1.3.6.1.4.1.6449.1.3.5.2*' => 'validityModelX',
965
-		'1.3.6.1.4.1.8301.3.5.1*' => 'validityModelChain',
966
-		'1.3.6.1.4.1.8301.3.5.2*' => 'validityModelShell',
967
-		'1.3.6.1.4.1.8231.1*' => 'rolUnicoNacional',
968
-		'1.3.6.1.4.1.11591*' => 'gnu',
969
-		'1.3.6.1.4.1.11591.1*' => 'gnuRadius',
970
-		'1.3.6.1.4.1.11591.3*' => 'gnuRadar',
971
-		'1.3.6.1.4.1.11591.12*' => 'gnuDigestAlgorithm',
972
-		'1.3.6.1.4.1.11591.12.2*' => 'tiger',
973
-		'1.3.6.1.4.1.11591.13*' => 'gnuEncryptionAlgorithm',
974
-		'1.3.6.1.4.1.11591.13.2*' => 'serpent',
975
-		'1.3.6.1.4.1.11591.13.2.1*' => 'serpent128_ECB',
976
-		'1.3.6.1.4.1.11591.13.2.2*' => 'serpent128_CBC',
977
-		'1.3.6.1.4.1.11591.13.2.3*' => 'serpent128_OFB',
978
-		'1.3.6.1.4.1.11591.13.2.4*' => 'serpent128_CFB',
979
-		'1.3.6.1.4.1.11591.13.2.21*' => 'serpent192_ECB',
980
-		'1.3.6.1.4.1.11591.13.2.22*' => 'serpent192_CBC',
981
-		'1.3.6.1.4.1.11591.13.2.23*' => 'serpent192_OFB',
982
-		'1.3.6.1.4.1.11591.13.2.24*' => 'serpent192_CFB',
983
-		'1.3.6.1.4.1.11591.13.2.41*' => 'serpent256_ECB',
984
-		'1.3.6.1.4.1.11591.13.2.42*' => 'serpent256_CBC',
985
-		'1.3.6.1.4.1.11591.13.2.43*' => 'serpent256_OFB',
986
-		'1.3.6.1.4.1.11591.13.2.44*' => 'serpent256_CFB',
987
-		'1.3.6.1.4.1.16334.509.1.1*' => 'Northrop Grumman extKeyUsage?',
988
-		'1.3.6.1.4.1.16334.509.2.1*' => 'ngcClass1',
989
-		'1.3.6.1.4.1.16334.509.2.2*' => 'ngcClass2',
990
-		'1.3.6.1.4.1.16334.509.2.3*' => 'ngcClass3',
991
-		'1.3.6.1.5.5.7*' => 'pkix',
992
-		'1.3.6.1.5.5.7.0.12*' => 'attributeCert',
993
-		'1.3.6.1.5.5.7.1*' => 'privateExtension',
994
-		'1.3.6.1.5.5.7.1.1*' => 'authorityInfoAccess',
995
-		'1.3.6.1.5.5.7.1.2*' => 'biometricInfo',
996
-		'1.3.6.1.5.5.7.1.3*' => 'qcStatements',
997
-		'1.3.6.1.5.5.7.1.4*' => 'acAuditIdentity',
998
-		'1.3.6.1.5.5.7.1.5*' => 'acTargeting',
999
-		'1.3.6.1.5.5.7.1.6*' => 'acAaControls',
1000
-		'1.3.6.1.5.5.7.1.7*' => 'ipAddrBlocks',
1001
-		'1.3.6.1.5.5.7.1.8*' => 'autonomousSysIds',
1002
-		'1.3.6.1.5.5.7.1.9*' => 'routerIdentifier',
1003
-		'1.3.6.1.5.5.7.1.10*' => 'acProxying',
1004
-		'1.3.6.1.5.5.7.1.11*' => 'subjectInfoAccess',
1005
-		'1.3.6.1.5.5.7.1.12*' => 'logoType',
1006
-		'1.3.6.1.5.5.7.1.13*' => 'wlanSSID',
1007
-		'1.3.6.1.5.5.7.2*' => 'policyQualifierIds',
1008
-		'1.3.6.1.5.5.7.2.1*' => 'cps',
1009
-		'1.3.6.1.5.5.7.2.2*' => 'unotice',
1010
-		'1.3.6.1.5.5.7.2.3*' => 'textNotice',
1011
-		'1.3.6.1.5.5.7.3*' => 'keyPurpose',
1012
-		'1.3.6.1.5.5.7.3.1*' => 'serverAuth',
1013
-		'1.3.6.1.5.5.7.3.2*' => 'clientAuth',
1014
-		'1.3.6.1.5.5.7.3.3*' => 'codeSigning',
1015
-		'1.3.6.1.5.5.7.3.4*' => 'emailProtection',
1016
-		'1.3.6.1.5.5.7.3.5*' => 'ipsecEndSystem',
1017
-		'1.3.6.1.5.5.7.3.6*' => 'ipsecTunnel',
1018
-		'1.3.6.1.5.5.7.3.7*' => 'ipsecUser',
1019
-		'1.3.6.1.5.5.7.3.8*' => 'timeStamping',
1020
-		'1.3.6.1.5.5.7.3.9*' => 'ocspSigning',
1021
-		'1.3.6.1.5.5.7.3.10*' => 'dvcs',
1022
-		'1.3.6.1.5.5.7.3.11*' => 'sbgpCertAAServerAuth',
1023
-		'1.3.6.1.5.5.7.3.13*' => 'eapOverPPP',
1024
-		'1.3.6.1.5.5.7.3.14*' => 'eapOverLAN',
1025
-		'1.3.6.1.5.5.7.4*' => 'cmpInformationTypes',
1026
-		'1.3.6.1.5.5.7.4.1*' => 'caProtEncCert',
1027
-		'1.3.6.1.5.5.7.4.2*' => 'signKeyPairTypes',
1028
-		'1.3.6.1.5.5.7.4.3*' => 'encKeyPairTypes',
1029
-		'1.3.6.1.5.5.7.4.4*' => 'preferredSymmAlg',
1030
-		'1.3.6.1.5.5.7.4.5*' => 'caKeyUpdateInfo',
1031
-		'1.3.6.1.5.5.7.4.6*' => 'currentCRL',
1032
-		'1.3.6.1.5.5.7.4.7*' => 'unsupportedOIDs',
1033
-		'1.3.6.1.5.5.7.4.10*' => 'keyPairParamReq',
1034
-		'1.3.6.1.5.5.7.4.11*' => 'keyPairParamRep',
1035
-		'1.3.6.1.5.5.7.4.12*' => 'revPassphrase',
1036
-		'1.3.6.1.5.5.7.4.13*' => 'implicitConfirm',
1037
-		'1.3.6.1.5.5.7.4.14*' => 'confirmWaitTime',
1038
-		'1.3.6.1.5.5.7.4.15*' => 'origPKIMessage',
1039
-		'1.3.6.1.5.5.7.4.16*' => 'suppLangTags',
1040
-		'1.3.6.1.5.5.7.5*' => 'crmfRegistration',
1041
-		'1.3.6.1.5.5.7.5.1*' => 'regCtrl',
1042
-		'1.3.6.1.5.5.7.5.1.1*' => 'regToken',
1043
-		'1.3.6.1.5.5.7.5.1.2*' => 'authenticator',
1044
-		'1.3.6.1.5.5.7.5.1.3*' => 'pkiPublicationInfo',
1045
-		'1.3.6.1.5.5.7.5.1.4*' => 'pkiArchiveOptions',
1046
-		'1.3.6.1.5.5.7.5.1.5*' => 'oldCertID',
1047
-		'1.3.6.1.5.5.7.5.1.6*' => 'protocolEncrKey',
1048
-		'1.3.6.1.5.5.7.5.1.7*' => 'altCertTemplate',
1049
-		'1.3.6.1.5.5.7.5.1.8*' => 'wtlsTemplate',
1050
-		'1.3.6.1.5.5.7.5.2*' => 'utf8Pairs',
1051
-		'1.3.6.1.5.5.7.5.2.1*' => 'utf8Pairs',
1052
-		'1.3.6.1.5.5.7.5.2.2*' => 'certReq',
1053
-		'1.3.6.1.5.5.7.6*' => 'algorithms',
1054
-		'1.3.6.1.5.5.7.6.1*' => 'des40',
1055
-		'1.3.6.1.5.5.7.6.2*' => 'noSignature',
1056
-		'1.3.6.1.5.5.7.6.3*' => 'dh-sig-hmac-sha1',
1057
-		'1.3.6.1.5.5.7.6.4*' => 'dh-pop',
1058
-		'1.3.6.1.5.5.7.7*' => 'cmcControls',
1059
-		'1.3.6.1.5.5.7.8*' => 'otherNames',
1060
-		'1.3.6.1.5.5.7.8.1*' => 'personalData',
1061
-		'1.3.6.1.5.5.7.8.2*' => 'userGroup',
1062
-		'1.3.6.1.5.5.7.9*' => 'personalData',
1063
-		'1.3.6.1.5.5.7.9.1*' => 'dateOfBirth',
1064
-		'1.3.6.1.5.5.7.9.2*' => 'placeOfBirth',
1065
-		'1.3.6.1.5.5.7.9.3*' => 'gender',
1066
-		'1.3.6.1.5.5.7.9.4*' => 'countryOfCitizenship',
1067
-		'1.3.6.1.5.5.7.9.5*' => 'countryOfResidence',
1068
-		'1.3.6.1.5.5.7.10*' => 'attributeCertificate',
1069
-		'1.3.6.1.5.5.7.10.1*' => 'authenticationInfo',
1070
-		'1.3.6.1.5.5.7.10.2*' => 'accessIdentity',
1071
-		'1.3.6.1.5.5.7.10.3*' => 'chargingIdentity',
1072
-		'1.3.6.1.5.5.7.10.4*' => 'group',
1073
-		'1.3.6.1.5.5.7.10.5*' => 'role',
1074
-		'1.3.6.1.5.5.7.10.6*' => 'wlanSSID',
1075
-		'1.3.6.1.5.5.7.11*' => 'personalData',
1076
-		'1.3.6.1.5.5.7.11.1*' => 'pkixQCSyntax-v1',
1077
-		'1.3.6.1.5.5.7.14.2*' => 'resourceCertificatePolicy',
1078
-		'1.3.6.1.5.5.7.20*' => 'logo',
1079
-		'1.3.6.1.5.5.7.20.1*' => 'logoLoyalty',
1080
-		'1.3.6.1.5.5.7.20.2*' => 'logoBackground',
1081
-		'1.3.6.1.5.5.7.48.1*' => 'ocsp',
1082
-		'1.3.6.1.5.5.7.48.1.1*' => 'ocspBasic',
1083
-		'1.3.6.1.5.5.7.48.1.2*' => 'ocspNonce',
1084
-		'1.3.6.1.5.5.7.48.1.3*' => 'ocspCRL',
1085
-		'1.3.6.1.5.5.7.48.1.4*' => 'ocspResponse',
1086
-		'1.3.6.1.5.5.7.48.1.5*' => 'ocspNoCheck',
1087
-		'1.3.6.1.5.5.7.48.1.6*' => 'ocspArchiveCutoff',
1088
-		'1.3.6.1.5.5.7.48.1.7*' => 'ocspServiceLocator',
1089
-		'1.3.6.1.5.5.7.48.2*' => 'caIssuers',
1090
-		'1.3.6.1.5.5.7.48.3*' => 'timeStamping',
1091
-		'1.3.6.1.5.5.7.48.4*' => 'dvcs',
1092
-		'1.3.6.1.5.5.7.48.5*' => 'caRepository',
1093
-		'1.3.6.1.5.5.7.48.7*' => 'signedObjectRepository',
1094
-		'1.3.6.1.5.5.7.48.10*' => 'rpkiManifest',
1095
-		'1.3.6.1.5.5.7.48.11*' => 'signedObject',
1096
-		'1.3.6.1.5.5.8.1.1*' => 'hmacMD5',
1097
-		'1.3.6.1.5.5.8.1.2*' => 'hmacSHA',
1098
-		'1.3.6.1.5.5.8.1.3*' => 'hmacTiger',
1099
-		'1.3.6.1.5.5.8.2.2*' => 'iKEIntermediate',
1100
-		'1.3.12.2.1011.7.1*' => 'decEncryptionAlgorithm',
1101
-		'1.3.12.2.1011.7.1.2*' => 'decDEA',
1102
-		'1.3.12.2.1011.7.2*' => 'decHashAlgorithm',
1103
-		'1.3.12.2.1011.7.2.1*' => 'decMD2',
1104
-		'1.3.12.2.1011.7.2.2*' => 'decMD4',
1105
-		'1.3.12.2.1011.7.3*' => 'decSignatureAlgorithm',
1106
-		'1.3.12.2.1011.7.3.1*' => 'decMD2withRSA',
1107
-		'1.3.12.2.1011.7.3.2*' => 'decMD4withRSA',
1108
-		'1.3.12.2.1011.7.3.3*' => 'decDEAMAC',
1109
-		'1.3.14.2.26.5*' => 'sha',
1110
-		'1.3.14.3.2.1.1*' => 'rsa',
1111
-		'1.3.14.3.2.2*' => 'md4WitRSA',
1112
-		'1.3.14.3.2.3*' => 'md5WithRSA',
1113
-		'1.3.14.3.2.4*' => 'md4WithRSAEncryption',
1114
-		'1.3.14.3.2.2.1*' => 'sqmod-N',
1115
-		'1.3.14.3.2.3.1*' => 'sqmod-NwithRSA',
1116
-		'1.3.14.3.2.6*' => 'desECB',
1117
-		'1.3.14.3.2.7*' => 'desCBC',
1118
-		'1.3.14.3.2.8*' => 'desOFB',
1119
-		'1.3.14.3.2.9*' => 'desCFB',
1120
-		'1.3.14.3.2.10*' => 'desMAC',
1121
-		'1.3.14.3.2.11*' => 'rsaSignature',
1122
-		'1.3.14.3.2.12*' => 'dsa',
1123
-		'1.3.14.3.2.13*' => 'dsaWithSHA',
1124
-		'1.3.14.3.2.14*' => 'mdc2WithRSASignature',
1125
-		'1.3.14.3.2.15*' => 'shaWithRSASignature',
1126
-		'1.3.14.3.2.16*' => 'dhWithCommonModulus',
1127
-		'1.3.14.3.2.17*' => 'desEDE',
1128
-		'1.3.14.3.2.18*' => 'sha',
1129
-		'1.3.14.3.2.19*' => 'mdc-2',
1130
-		'1.3.14.3.2.20*' => 'dsaCommon',
1131
-		'1.3.14.3.2.21*' => 'dsaCommonWithSHA',
1132
-		'1.3.14.3.2.22*' => 'rsaKeyTransport',
1133
-		'1.3.14.3.2.23*' => 'keyed-hash-seal',
1134
-		'1.3.14.3.2.24*' => 'md2WithRSASignature',
1135
-		'1.3.14.3.2.25*' => 'md5WithRSASignature',
1136
-		'1.3.14.3.2.26*' => 'sha1',
1137
-		'1.3.14.3.2.27*' => 'dsaWithSHA1',
1138
-		'1.3.14.3.2.28*' => 'dsaWithCommonSHA1',
1139
-		#        '1.3.14.3.2.29*' => 'sha-1WithRSAEncryption',
1140
-		'1.3.14.3.2.29*' => 'sha1WithRSAEncryption',
1141
-		'1.3.14.3.3.1*' => 'simple-strong-auth-mechanism',
1142
-		'1.3.14.7.2.1.1*' => 'ElGamal',
1143
-		'1.3.14.7.2.3.1*' => 'md2WithRSA',
1144
-		'1.3.14.7.2.3.2*' => 'md2WithElGamal',
1145
-		'1.3.36.1*' => 'document',
1146
-		'1.3.36.1.1*' => 'finalVersion',
1147
-		'1.3.36.1.2*' => 'draft',
1148
-		'1.3.36.2*' => 'sio',
1149
-		'1.3.36.2.1*' => 'sedu',
1150
-		'1.3.36.3*' => 'algorithm',
1151
-		'1.3.36.3.1*' => 'encryptionAlgorithm',
1152
-		'1.3.36.3.1.1*' => 'des',
1153
-		'1.3.36.3.1.1.1*' => 'desECB_pad',
1154
-		'1.3.36.3.1.1.1.1*' => 'desECB_ISOpad',
1155
-		'1.3.36.3.1.1.2.1*' => 'desCBC_pad',
1156
-		'1.3.36.3.1.1.2.1.1*' => 'desCBC_ISOpad',
1157
-		'1.3.36.3.1.3*' => 'des_3',
1158
-		'1.3.36.3.1.3.1.1*' => 'des_3ECB_pad',
1159
-		'1.3.36.3.1.3.1.1.1*' => 'des_3ECB_ISOpad',
1160
-		'1.3.36.3.1.3.2.1*' => 'des_3CBC_pad',
1161
-		'1.3.36.3.1.3.2.1.1*' => 'des_3CBC_ISOpad',
1162
-		'1.3.36.3.1.2*' => 'idea',
1163
-		'1.3.36.3.1.2.1*' => 'ideaECB',
1164
-		'1.3.36.3.1.2.1.1*' => 'ideaECB_pad',
1165
-		'1.3.36.3.1.2.1.1.1*' => 'ideaECB_ISOpad',
1166
-		'1.3.36.3.1.2.2*' => 'ideaCBC',
1167
-		'1.3.36.3.1.2.2.1*' => 'ideaCBC_pad',
1168
-		'1.3.36.3.1.2.2.1.1*' => 'ideaCBC_ISOpad',
1169
-		'1.3.36.3.1.2.3*' => 'ideaOFB',
1170
-		'1.3.36.3.1.2.4*' => 'ideaCFB',
1171
-		'1.3.36.3.1.4*' => 'rsaEncryption',
1172
-		'1.3.36.3.1.4.512.17*' => 'rsaEncryptionWithlmod512expe17',
1173
-		'1.3.36.3.1.5*' => 'bsi-1',
1174
-		'1.3.36.3.1.5.1*' => 'bsi_1ECB_pad',
1175
-		'1.3.36.3.1.5.2*' => 'bsi_1CBC_pad',
1176
-		'1.3.36.3.1.5.2.1*' => 'bsi_1CBC_PEMpad',
1177
-		'1.3.36.3.2*' => 'hashAlgorithm',
1178
-		'1.3.36.3.2.1*' => 'ripemd160',
1179
-		'1.3.36.3.2.2*' => 'ripemd128',
1180
-		'1.3.36.3.2.3*' => 'ripemd256',
1181
-		'1.3.36.3.2.4*' => 'mdc2singleLength',
1182
-		'1.3.36.3.2.5*' => 'mdc2doubleLength',
1183
-		'1.3.36.3.3*' => 'signatureAlgorithm',
1184
-		'1.3.36.3.3.1*' => 'rsaSignature',
1185
-		'1.3.36.3.3.1.1*' => 'rsaSignatureWithsha1',
1186
-		'1.3.36.3.3.1.1.512.2*' => 'rsaSignatureWithsha1_l512_l2',
1187
-		'1.3.36.3.3.1.1.640.2*' => 'rsaSignatureWithsha1_l640_l2',
1188
-		'1.3.36.3.3.1.1.768.2*' => 'rsaSignatureWithsha1_l768_l2',
1189
-		'1.3.36.3.3.1.1.896.2*' => 'rsaSignatureWithsha1_l896_l2',
1190
-		'1.3.36.3.3.1.1.1024.2*' => 'rsaSignatureWithsha1_l1024_l2',
1191
-		'1.3.36.3.3.1.1.512.3*' => 'rsaSignatureWithsha1_l512_l3',
1192
-		'1.3.36.3.3.1.1.640.3*' => 'rsaSignatureWithsha1_l640_l3',
1193
-		'1.3.36.3.3.1.1.768.3*' => 'rsaSignatureWithsha1_l768_l3',
1194
-		'1.3.36.3.3.1.1.896.3*' => 'rsaSignatureWithsha1_l896_l3',
1195
-		'1.3.36.3.3.1.1.1024.3*' => 'rsaSignatureWithsha1_l1024_l3',
1196
-		'1.3.36.3.3.1.1.512.5*' => 'rsaSignatureWithsha1_l512_l5',
1197
-		'1.3.36.3.3.1.1.640.5*' => 'rsaSignatureWithsha1_l640_l5',
1198
-		'1.3.36.3.3.1.1.768.5*' => 'rsaSignatureWithsha1_l768_l5',
1199
-		'1.3.36.3.3.1.1.896.5*' => 'rsaSignatureWithsha1_l896_l5',
1200
-		'1.3.36.3.3.1.1.1024.5*' => 'rsaSignatureWithsha1_l1024_l5',
1201
-		'1.3.36.3.3.1.1.512.9*' => 'rsaSignatureWithsha1_l512_l9',
1202
-		'1.3.36.3.3.1.1.640.9*' => 'rsaSignatureWithsha1_l640_l9',
1203
-		'1.3.36.3.3.1.1.768.9*' => 'rsaSignatureWithsha1_l768_l9',
1204
-		'1.3.36.3.3.1.1.896.9*' => 'rsaSignatureWithsha1_l896_l9',
1205
-		'1.3.36.3.3.1.1.1024.9*' => 'rsaSignatureWithsha1_l1024_l9',
1206
-		'1.3.36.3.3.1.1.512.11*' => 'rsaSignatureWithsha1_l512_l11',
1207
-		'1.3.36.3.3.1.1.640.11*' => 'rsaSignatureWithsha1_l640_l11',
1208
-		'1.3.36.3.3.1.1.768.11*' => 'rsaSignatureWithsha1_l768_l11',
1209
-		'1.3.36.3.3.1.1.896.11*' => 'rsaSignatureWithsha1_l896_l11',
1210
-		'1.3.36.3.3.1.1.1024.11*' => 'rsaSignatureWithsha1_l1024_l11',
1211
-		'1.3.36.3.3.1.2*' => 'rsaSignatureWithripemd160',
1212
-		'1.3.36.3.3.1.2.512.2*' => 'rsaSignatureWithripemd160_l512_l2',
1213
-		'1.3.36.3.3.1.2.640.2*' => 'rsaSignatureWithripemd160_l640_l2',
1214
-		'1.3.36.3.3.1.2.768.2*' => 'rsaSignatureWithripemd160_l768_l2',
1215
-		'1.3.36.3.3.1.2.896.2*' => 'rsaSignatureWithripemd160_l896_l2',
1216
-		'1.3.36.3.3.1.2.1024.2*' => 'rsaSignatureWithripemd160_l1024_l2',
1217
-		'1.3.36.3.3.1.2.512.3*' => 'rsaSignatureWithripemd160_l512_l3',
1218
-		'1.3.36.3.3.1.2.640.3*' => 'rsaSignatureWithripemd160_l640_l3',
1219
-		'1.3.36.3.3.1.2.768.3*' => 'rsaSignatureWithripemd160_l768_l3',
1220
-		'1.3.36.3.3.1.2.896.3*' => 'rsaSignatureWithripemd160_l896_l3',
1221
-		'1.3.36.3.3.1.2.1024.3*' => 'rsaSignatureWithripemd160_l1024_l3',
1222
-		'1.3.36.3.3.1.2.512.5*' => 'rsaSignatureWithripemd160_l512_l5',
1223
-		'1.3.36.3.3.1.2.640.5*' => 'rsaSignatureWithripemd160_l640_l5',
1224
-		'1.3.36.3.3.1.2.768.5*' => 'rsaSignatureWithripemd160_l768_l5',
1225
-		'1.3.36.3.3.1.2.896.5*' => 'rsaSignatureWithripemd160_l896_l5',
1226
-		'1.3.36.3.3.1.2.1024.5*' => 'rsaSignatureWithripemd160_l1024_l5',
1227
-		'1.3.36.3.3.1.2.512.9*' => 'rsaSignatureWithripemd160_l512_l9',
1228
-		'1.3.36.3.3.1.2.640.9*' => 'rsaSignatureWithripemd160_l640_l9',
1229
-		'1.3.36.3.3.1.2.768.9*' => 'rsaSignatureWithripemd160_l768_l9',
1230
-		'1.3.36.3.3.1.2.896.9*' => 'rsaSignatureWithripemd160_l896_l9',
1231
-		'1.3.36.3.3.1.2.1024.9*' => 'rsaSignatureWithripemd160_l1024_l9',
1232
-		'1.3.36.3.3.1.2.512.11*' => 'rsaSignatureWithripemd160_l512_l11',
1233
-		'1.3.36.3.3.1.2.640.11*' => 'rsaSignatureWithripemd160_l640_l11',
1234
-		'1.3.36.3.3.1.2.768.11*' => 'rsaSignatureWithripemd160_l768_l11',
1235
-		'1.3.36.3.3.1.2.896.11*' => 'rsaSignatureWithripemd160_l896_l11',
1236
-		'1.3.36.3.3.1.2.1024.11*' => 'rsaSignatureWithripemd160_l1024_l11',
1237
-		'1.3.36.3.3.1.3*' => 'rsaSignatureWithrimpemd128',
1238
-		'1.3.36.3.3.1.4*' => 'rsaSignatureWithrimpemd256',
1239
-		'1.3.36.3.3.2*' => 'ecsieSign',
1240
-		'1.3.36.3.3.2.1*' => 'ecsieSignWithsha1',
1241
-		'1.3.36.3.3.2.2*' => 'ecsieSignWithripemd160',
1242
-		'1.3.36.3.3.2.3*' => 'ecsieSignWithmd2',
1243
-		'1.3.36.3.3.2.4*' => 'ecsieSignWithmd5',
1244
-		'1.3.36.3.3.2.8.1.1.1*' => 'brainpoolP160r1',
1245
-		'1.3.36.3.3.2.8.1.1.2*' => 'brainpoolP160t1',
1246
-		'1.3.36.3.3.2.8.1.1.3*' => 'brainpoolP192r1',
1247
-		'1.3.36.3.3.2.8.1.1.4*' => 'brainpoolP192t1',
1248
-		'1.3.36.3.3.2.8.1.1.5*' => 'brainpoolP224r1',
1249
-		'1.3.36.3.3.2.8.1.1.6*' => 'brainpoolP224t1',
1250
-		'1.3.36.3.3.2.8.1.1.7*' => 'brainpoolP256r1',
1251
-		'1.3.36.3.3.2.8.1.1.8*' => 'brainpoolP256t1',
1252
-		'1.3.36.3.3.2.8.1.1.9*' => 'brainpoolP320r1',
1253
-		'1.3.36.3.3.2.8.1.1.10*' => 'brainpoolP320t1',
1254
-		'1.3.36.3.3.2.8.1.1.11*' => 'brainpoolP384r1',
1255
-		'1.3.36.3.3.2.8.1.1.12*' => 'brainpoolP384t1',
1256
-		'1.3.36.3.3.2.8.1.1.13*' => 'brainpoolP512r1',
1257
-		'1.3.36.3.3.2.8.1.1.14*' => 'brainpoolP512t1',
1258
-		'1.3.36.3.4*' => 'signatureScheme',
1259
-		'1.3.36.3.4.1*' => 'sigS_ISO9796-1',
1260
-		'1.3.36.3.4.2*' => 'sigS_ISO9796-2',
1261
-		'1.3.36.3.4.2.1*' => 'sigS_ISO9796-2Withred',
1262
-		'1.3.36.3.4.2.2*' => 'sigS_ISO9796-2Withrsa',
1263
-		'1.3.36.3.4.2.3*' => 'sigS_ISO9796-2Withrnd',
1264
-		'1.3.36.4*' => 'attribute',
1265
-		'1.3.36.5*' => 'policy',
1266
-		'1.3.36.6*' => 'api',
1267
-		'1.3.36.6.1*' => 'manufacturer-specific_api',
1268
-		'1.3.36.6.1.1*' => 'utimaco-api',
1269
-		'1.3.36.6.2*' => 'functionality-specific_api',
1270
-		'1.3.36.7*' => 'keymgmnt',
1271
-		'1.3.36.7.1*' => 'keyagree',
1272
-		'1.3.36.7.1.1*' => 'bsiPKE',
1273
-		'1.3.36.7.2*' => 'keytrans',
1274
-		'1.3.36.7.2.1*' => 'encISO9796-2Withrsa',
1275
-		'1.3.36.8.1.1*' => 'Teletrust SigGConform policyIdentifier',
1276
-		'1.3.36.8.2.1*' => 'directoryService',
1277
-		'1.3.36.8.3.1*' => 'dateOfCertGen',
1278
-		'1.3.36.8.3.2*' => 'procuration',
1279
-		'1.3.36.8.3.3*' => 'admission',
1280
-		'1.3.36.8.3.4*' => 'monetaryLimit',
1281
-		'1.3.36.8.3.5*' => 'declarationOfMajority',
1282
-		'1.3.36.8.3.6*' => 'integratedCircuitCardSerialNumber',
1283
-		'1.3.36.8.3.7*' => 'pKReference',
1284
-		'1.3.36.8.3.8*' => 'restriction',
1285
-		'1.3.36.8.3.9*' => 'retrieveIfAllowed',
1286
-		'1.3.36.8.3.10*' => 'requestedCertificate',
1287
-		'1.3.36.8.3.11*' => 'namingAuthorities',
1288
-		'1.3.36.8.3.11.1*' => 'rechtWirtschaftSteuern',
1289
-		'1.3.36.8.3.11.1.1*' => 'rechtsanwaeltin',
1290
-		'1.3.36.8.3.11.1.2*' => 'rechtsanwalt',
1291
-		'1.3.36.8.3.11.1.3*' => 'rechtsBeistand',
1292
-		'1.3.36.8.3.11.1.4*' => 'steuerBeraterin',
1293
-		'1.3.36.8.3.11.1.5*' => 'steuerBerater',
1294
-		'1.3.36.8.3.11.1.6*' => 'steuerBevollmaechtigte',
1295
-		'1.3.36.8.3.11.1.7*' => 'steuerBevollmaechtigter',
1296
-		'1.3.36.8.3.11.1.8*' => 'notarin',
1297
-		'1.3.36.8.3.11.1.9*' => 'notar',
1298
-		'1.3.36.8.3.11.1.10*' => 'notarVertreterin',
1299
-		'1.3.36.8.3.11.1.11*' => 'notarVertreter',
1300
-		'1.3.36.8.3.11.1.12*' => 'notariatsVerwalterin',
1301
-		'1.3.36.8.3.11.1.13*' => 'notariatsVerwalter',
1302
-		'1.3.36.8.3.11.1.14*' => 'wirtschaftsPrueferin',
1303
-		'1.3.36.8.3.11.1.15*' => 'wirtschaftsPruefer',
1304
-		'1.3.36.8.3.11.1.16*' => 'vereidigteBuchprueferin',
1305
-		'1.3.36.8.3.11.1.17*' => 'vereidigterBuchpruefer',
1306
-		'1.3.36.8.3.11.1.18*' => 'patentAnwaeltin',
1307
-		'1.3.36.8.3.11.1.19*' => 'patentAnwalt',
1308
-		'1.3.36.8.3.12*' => 'certInDirSince',
1309
-		'1.3.36.8.3.13*' => 'certHash',
1310
-		'1.3.36.8.3.14*' => 'nameAtBirth',
1311
-		'1.3.36.8.3.15*' => 'additionalInformation',
1312
-		'1.3.36.8.4.1*' => 'personalData',
1313
-		'1.3.36.8.4.8*' => 'restriction',
1314
-		'1.3.36.8.5.1.1.1*' => 'rsaIndicateSHA1',
1315
-		'1.3.36.8.5.1.1.2*' => 'rsaIndicateRIPEMD160',
1316
-		'1.3.36.8.5.1.1.3*' => 'rsaWithSHA1',
1317
-		'1.3.36.8.5.1.1.4*' => 'rsaWithRIPEMD160',
1318
-		'1.3.36.8.5.1.2.1*' => 'dsaExtended',
1319
-		'1.3.36.8.5.1.2.2*' => 'dsaWithRIPEMD160',
1320
-		'1.3.36.8.6.1*' => 'cert',
1321
-		'1.3.36.8.6.2*' => 'certRef',
1322
-		'1.3.36.8.6.3*' => 'attrCert',
1323
-		'1.3.36.8.6.4*' => 'attrRef',
1324
-		'1.3.36.8.6.5*' => 'fileName',
1325
-		'1.3.36.8.6.6*' => 'storageTime',
1326
-		'1.3.36.8.6.7*' => 'fileSize',
1327
-		'1.3.36.8.6.8*' => 'location',
1328
-		'1.3.36.8.6.9*' => 'sigNumber',
1329
-		'1.3.36.8.6.10*' => 'autoGen',
1330
-		'1.3.36.8.7.1.1*' => 'ptAdobeILL',
1331
-		'1.3.36.8.7.1.2*' => 'ptAmiPro',
1332
-		'1.3.36.8.7.1.3*' => 'ptAutoCAD',
1333
-		'1.3.36.8.7.1.4*' => 'ptBinary',
1334
-		'1.3.36.8.7.1.5*' => 'ptBMP',
1335
-		'1.3.36.8.7.1.6*' => 'ptCGM',
1336
-		'1.3.36.8.7.1.7*' => 'ptCorelCRT',
1337
-		'1.3.36.8.7.1.8*' => 'ptCorelDRW',
1338
-		'1.3.36.8.7.1.9*' => 'ptCorelEXC',
1339
-		'1.3.36.8.7.1.10*' => 'ptCorelPHT',
1340
-		'1.3.36.8.7.1.11*' => 'ptDraw',
1341
-		'1.3.36.8.7.1.12*' => 'ptDVI',
1342
-		'1.3.36.8.7.1.13*' => 'ptEPS',
1343
-		'1.3.36.8.7.1.14*' => 'ptExcel',
1344
-		'1.3.36.8.7.1.15*' => 'ptGEM',
1345
-		'1.3.36.8.7.1.16*' => 'ptGIF',
1346
-		'1.3.36.8.7.1.17*' => 'ptHPGL',
1347
-		'1.3.36.8.7.1.18*' => 'ptJPEG',
1348
-		'1.3.36.8.7.1.19*' => 'ptKodak',
1349
-		'1.3.36.8.7.1.20*' => 'ptLaTeX',
1350
-		'1.3.36.8.7.1.21*' => 'ptLotus',
1351
-		'1.3.36.8.7.1.22*' => 'ptLotusPIC',
1352
-		'1.3.36.8.7.1.23*' => 'ptMacPICT',
1353
-		'1.3.36.8.7.1.24*' => 'ptMacWord',
1354
-		'1.3.36.8.7.1.25*' => 'ptMSWfD',
1355
-		'1.3.36.8.7.1.26*' => 'ptMSWord',
1356
-		'1.3.36.8.7.1.27*' => 'ptMSWord2',
1357
-		'1.3.36.8.7.1.28*' => 'ptMSWord6',
1358
-		'1.3.36.8.7.1.29*' => 'ptMSWord8',
1359
-		'1.3.36.8.7.1.30*' => 'ptPDF',
1360
-		'1.3.36.8.7.1.31*' => 'ptPIF',
1361
-		'1.3.36.8.7.1.32*' => 'ptPostscript',
1362
-		'1.3.36.8.7.1.33*' => 'ptRTF',
1363
-		'1.3.36.8.7.1.34*' => 'ptSCITEX',
1364
-		'1.3.36.8.7.1.35*' => 'ptTAR',
1365
-		'1.3.36.8.7.1.36*' => 'ptTarga',
1366
-		'1.3.36.8.7.1.37*' => 'ptTeX',
1367
-		'1.3.36.8.7.1.38*' => 'ptText',
1368
-		'1.3.36.8.7.1.39*' => 'ptTIFF',
1369
-		'1.3.36.8.7.1.40*' => 'ptTIFF-FC',
1370
-		'1.3.36.8.7.1.41*' => 'ptUID',
1371
-		'1.3.36.8.7.1.42*' => 'ptUUEncode',
1372
-		'1.3.36.8.7.1.43*' => 'ptWordPerfect x',
1373
-		'1.3.36.8.7.1.45*' => 'ptWPGrph',
1374
-		'1.3.101.1.4*' => 'thawte-ce',
1375
-		'1.3.101.1.4.1*' => 'strongExtranet',
1376
-		'1.3.132.0.1*' => 'sect163k1',
1377
-		'1.3.132.0.2*' => 'sect163r1',
1378
-		'1.3.132.0.3*' => 'sect239k1',
1379
-		'1.3.132.0.4*' => 'sect113r1',
1380
-		'1.3.132.0.5*' => 'sect113r2',
1381
-		'1.3.132.0.6*' => 'secp112r1',
1382
-		'1.3.132.0.7*' => 'secp112r2',
1383
-		'1.3.132.0.8*' => 'secp160r1',
1384
-		'1.3.132.0.9*' => 'secp160k1',
1385
-		'1.3.132.0.10*' => 'secp256k1',
1386
-		'1.3.132.0.15*' => 'sect163r2',
1387
-		'1.3.132.0.16*' => 'sect283k1',
1388
-		'1.3.132.0.17*' => 'sect283r1',
1389
-		'1.3.132.0.22*' => 'sect131r1',
1390
-		'1.3.132.0.23*' => 'sect131r2',
1391
-		'1.3.132.0.24*' => 'sect193r1',
1392
-		'1.3.132.0.25*' => 'sect193r2',
1393
-		'1.3.132.0.26*' => 'sect233k1',
1394
-		'1.3.132.0.27*' => 'sect233r1',
1395
-		'1.3.132.0.28*' => 'secp128r1',
1396
-		'1.3.132.0.29*' => 'secp128r2',
1397
-		'1.3.132.0.30*' => 'secp160r2',
1398
-		'1.3.132.0.31*' => 'secp192k1',
1399
-		'1.3.132.0.32*' => 'secp224k1',
1400
-		'1.3.132.0.33*' => 'secp224r1',
1401
-		'1.3.132.0.34*' => 'secp384r1',
1402
-		'1.3.132.0.35*' => 'secp521r1',
1403
-		'1.3.132.0.36*' => 'sect409k1',
1404
-		'1.3.132.0.37*' => 'sect409r1',
1405
-		'1.3.132.0.38*' => 'sect571k1',
1406
-		'1.3.132.0.39*' => 'sect571r1',
1407
-		'2.5.4.0*' => 'objectClass',
1408
-		'2.5.4.1*' => 'aliasedEntryName',
1409
-		'2.5.4.2*' => 'knowledgeInformation',
1410
-		'2.5.4.3*' => 'commonName',
1411
-		'2.5.4.4*' => 'surname',
1412
-		'2.5.4.5*' => 'serialNumber',
1413
-		'2.5.4.6*' => 'countryName',
1414
-		'2.5.4.7*' => 'localityName',
1415
-		'2.5.4.7.1*' => 'collectiveLocalityName',
1416
-		'2.5.4.8*' => 'stateOrProvinceName',
1417
-		'2.5.4.8.1*' => 'collectiveStateOrProvinceName',
1418
-		'2.5.4.9*' => 'streetAddress',
1419
-		'2.5.4.9.1*' => 'collectiveStreetAddress',
1420
-		'2.5.4.10*' => 'organizationName',
1421
-		'2.5.4.10.1*' => 'collectiveOrganizationName',
1422
-		'2.5.4.11*' => 'organizationalUnitName',
1423
-		'2.5.4.11.1*' => 'collectiveOrganizationalUnitName',
1424
-		'2.5.4.12*' => 'title',
1425
-		'2.5.4.13*' => 'description',
1426
-		'2.5.4.14*' => 'searchGuide',
1427
-		'2.5.4.15*' => 'businessCategory',
1428
-		'2.5.4.16*' => 'postalAddress',
1429
-		'2.5.4.16.1*' => 'collectivePostalAddress',
1430
-		'2.5.4.17*' => 'postalCode',
1431
-		'2.5.4.17.1*' => 'collectivePostalCode',
1432
-		'2.5.4.18*' => 'postOfficeBox',
1433
-		'2.5.4.18.1*' => 'collectivePostOfficeBox',
1434
-		'2.5.4.19*' => 'physicalDeliveryOfficeName',
1435
-		'2.5.4.19.1*' => 'collectivePhysicalDeliveryOfficeName',
1436
-		'2.5.4.20*' => 'telephoneNumber',
1437
-		'2.5.4.20.1*' => 'collectiveTelephoneNumber',
1438
-		'2.5.4.21*' => 'telexNumber',
1439
-		'2.5.4.21.1*' => 'collectiveTelexNumber',
1440
-		'2.5.4.22*' => 'teletexTerminalIdentifier',
1441
-		'2.5.4.22.1*' => 'collectiveTeletexTerminalIdentifier',
1442
-		'2.5.4.23*' => 'facsimileTelephoneNumber',
1443
-		'2.5.4.23.1*' => 'collectiveFacsimileTelephoneNumber',
1444
-		'2.5.4.24*' => 'x121Address',
1445
-		'2.5.4.25*' => 'internationalISDNNumber',
1446
-		'2.5.4.25.1*' => 'collectiveInternationalISDNNumber',
1447
-		'2.5.4.26*' => 'registeredAddress',
1448
-		'2.5.4.27*' => 'destinationIndicator',
1449
-		'2.5.4.28*' => 'preferredDeliveryMehtod',
1450
-		'2.5.4.29*' => 'presentationAddress',
1451
-		'2.5.4.30*' => 'supportedApplicationContext',
1452
-		'2.5.4.31*' => 'member',
1453
-		'2.5.4.32*' => 'owner',
1454
-		'2.5.4.33*' => 'roleOccupant',
1455
-		'2.5.4.34*' => 'seeAlso',
1456
-		'2.5.4.35*' => 'userPassword',
1457
-		'2.5.4.36*' => 'userCertificate',
1458
-		'2.5.4.37*' => 'caCertificate',
1459
-		'2.5.4.38*' => 'authorityRevocationList',
1460
-		'2.5.4.39*' => 'certificateRevocationList',
1461
-		'2.5.4.40*' => 'crossCertificatePair',
1462
-		'2.5.4.41*' => 'name',
1463
-		'2.5.4.42*' => 'givenName',
1464
-		'2.5.4.43*' => 'initials',
1465
-		'2.5.4.44*' => 'generationQualifier',
1466
-		'2.5.4.45*' => 'uniqueIdentifier',
1467
-		'2.5.4.46*' => 'dnQualifier',
1468
-		'2.5.4.47*' => 'enhancedSearchGuide',
1469
-		'2.5.4.48*' => 'protocolInformation',
1470
-		'2.5.4.49*' => 'distinguishedName',
1471
-		'2.5.4.50*' => 'uniqueMember',
1472
-		'2.5.4.51*' => 'houseIdentifier',
1473
-		'2.5.4.52*' => 'supportedAlgorithms',
1474
-		'2.5.4.53*' => 'deltaRevocationList',
1475
-		'2.5.4.54*' => 'dmdName',
1476
-		'2.5.4.55*' => 'clearance',
1477
-		'2.5.4.56*' => 'defaultDirQop',
1478
-		'2.5.4.57*' => 'attributeIntegrityInfo',
1479
-		'2.5.4.58*' => 'attributeCertificate',
1480
-		'2.5.4.59*' => 'attributeCertificateRevocationList',
1481
-		'2.5.4.60*' => 'confKeyInfo',
1482
-		'2.5.4.61*' => 'aACertificate',
1483
-		'2.5.4.62*' => 'attributeDescriptorCertificate',
1484
-		'2.5.4.63*' => 'attributeAuthorityRevocationList',
1485
-		'2.5.4.64*' => 'familyInformation',
1486
-		'2.5.4.65*' => 'pseudonym',
1487
-		'2.5.4.66*' => 'communicationsService',
1488
-		'2.5.4.67*' => 'communicationsNetwork',
1489
-		'2.5.4.68*' => 'certificationPracticeStmt',
1490
-		'2.5.4.69*' => 'certificatePolicy',
1491
-		'2.5.4.70*' => 'pkiPath',
1492
-		'2.5.4.71*' => 'privPolicy',
1493
-		'2.5.4.72*' => 'role',
1494
-		'2.5.4.73*' => 'delegationPath',
1495
-		'2.5.4.74*' => 'protPrivPolicy',
1496
-		'2.5.4.75*' => 'xMLPrivilegeInfo',
1497
-		'2.5.4.76*' => 'xmlPrivPolicy',
1498
-		'2.5.4.82*' => 'permission',
1499
-		'2.5.6.0*' => 'top',
1500
-		'2.5.6.1*' => 'alias',
1501
-		'2.5.6.2*' => 'country',
1502
-		'2.5.6.3*' => 'locality',
1503
-		'2.5.6.4*' => 'organization',
1504
-		'2.5.6.5*' => 'organizationalUnit',
1505
-		'2.5.6.6*' => 'person',
1506
-		'2.5.6.7*' => 'organizationalPerson',
1507
-		'2.5.6.8*' => 'organizationalRole',
1508
-		'2.5.6.9*' => 'groupOfNames',
1509
-		'2.5.6.10*' => 'residentialPerson',
1510
-		'2.5.6.11*' => 'applicationProcess',
1511
-		'2.5.6.12*' => 'applicationEntity',
1512
-		'2.5.6.13*' => 'dSA',
1513
-		'2.5.6.14*' => 'device',
1514
-		'2.5.6.15*' => 'strongAuthenticationUser',
1515
-		'2.5.6.16*' => 'certificateAuthority',
1516
-		'2.5.6.17*' => 'groupOfUniqueNames',
1517
-		'2.5.6.21*' => 'pkiUser',
1518
-		'2.5.6.22*' => 'pkiCA',
1519
-		'2.5.8.1.1*' => 'rsa',
1520
-		'2.5.29.1*' => 'authorityKeyIdentifier',
1521
-		'2.5.29.2*' => 'keyAttributes',
1522
-		'2.5.29.3*' => 'certificatePolicies',
1523
-		'2.5.29.4*' => 'keyUsageRestriction',
1524
-		'2.5.29.5*' => 'policyMapping',
1525
-		'2.5.29.6*' => 'subtreesConstraint',
1526
-		'2.5.29.7*' => 'subjectAltName',
1527
-		'2.5.29.8*' => 'issuerAltName',
1528
-		'2.5.29.9*' => 'subjectDirectoryAttributes',
1529
-		'2.5.29.10*' => 'basicConstraints',
1530
-		'2.5.29.11*' => 'nameConstraints',
1531
-		'2.5.29.12*' => 'policyConstraints',
1532
-		'2.5.29.13*' => 'basicConstraints',
1533
-		'2.5.29.14*' => 'subjectKeyIdentifier',
1534
-		'2.5.29.15*' => 'keyUsage',
1535
-		'2.5.29.16*' => 'privateKeyUsagePeriod',
1536
-		'2.5.29.17*' => 'subjectAltName',
1537
-		'2.5.29.18*' => 'issuerAltName',
1538
-		'2.5.29.19*' => 'basicConstraints',
1539
-		'2.5.29.20*' => 'cRLNumber',
1540
-		'2.5.29.21*' => 'cRLReason',
1541
-		'2.5.29.22*' => 'expirationDate',
1542
-		'2.5.29.23*' => 'instructionCode',
1543
-		'2.5.29.24*' => 'invalidityDate',
1544
-		'2.5.29.25*' => 'cRLDistributionPoints',
1545
-		'2.5.29.26*' => 'issuingDistributionPoint',
1546
-		'2.5.29.27*' => 'deltaCRLIndicator',
1547
-		'2.5.29.28*' => 'issuingDistributionPoint',
1548
-		'2.5.29.29*' => 'certificateIssuer',
1549
-		'2.5.29.30*' => 'nameConstraints',
1550
-		'2.5.29.31*' => 'cRLDistributionPoints',
1551
-		'2.5.29.32*' => 'certificatePolicies',
1552
-		'2.5.29.32.0*' => 'anyPolicy',
1553
-		'2.5.29.33*' => 'policyMappings',
1554
-		'2.5.29.34*' => 'policyConstraints',
1555
-		'2.5.29.35*' => 'authorityKeyIdentifier',
1556
-		'2.5.29.36*' => 'policyConstraints',
1557
-		'2.5.29.37*' => 'extKeyUsage',
1558
-		'2.5.29.37.0*' => 'anyExtendedKeyUsage',
1559
-		'2.5.29.38*' => 'authorityAttributeIdentifier',
1560
-		'2.5.29.39*' => 'roleSpecCertIdentifier',
1561
-		'2.5.29.40*' => 'cRLStreamIdentifier',
1562
-		'2.5.29.41*' => 'basicAttConstraints',
1563
-		'2.5.29.42*' => 'delegatedNameConstraints',
1564
-		'2.5.29.43*' => 'timeSpecification',
1565
-		'2.5.29.44*' => 'cRLScope',
1566
-		'2.5.29.45*' => 'statusReferrals',
1567
-		'2.5.29.46*' => 'freshestCRL',
1568
-		'2.5.29.47*' => 'orderedList',
1569
-		'2.5.29.48*' => 'attributeDescriptor',
1570
-		'2.5.29.49*' => 'userNotice',
1571
-		'2.5.29.50*' => 'sOAIdentifier',
1572
-		'2.5.29.51*' => 'baseUpdateTime',
1573
-		'2.5.29.52*' => 'acceptableCertPolicies',
1574
-		'2.5.29.53*' => 'deltaInfo',
1575
-		'2.5.29.54*' => 'inhibitAnyPolicy',
1576
-		'2.5.29.55*' => 'targetInformation',
1577
-		'2.5.29.56*' => 'noRevAvail',
1578
-		'2.5.29.57*' => 'acceptablePrivilegePolicies',
1579
-		'2.5.29.58*' => 'toBeRevoked',
1580
-		'2.5.29.59*' => 'revokedGroups',
1581
-		'2.5.29.60*' => 'expiredCertsOnCRL',
1582
-		'2.5.29.61*' => 'indirectIssuer',
1583
-		'2.5.29.62*' => 'noAssertion',
1584
-		'2.5.29.63*' => 'aAissuingDistributionPoint',
1585
-		'2.5.29.64*' => 'issuedOnBehalfOf',
1586
-		'2.5.29.65*' => 'singleUse',
1587
-		'2.5.29.66*' => 'groupAC',
1588
-		'2.5.29.67*' => 'allowedAttAss',
1589
-		'2.5.29.68*' => 'attributeMappings',
1590
-		'2.5.29.69*' => 'holderNameConstraints',
1591
-		'2.16.840.1.101.2.1.1.1*' => 'sdnsSignatureAlgorithm',
1592
-		'2.16.840.1.101.2.1.1.2*' => 'fortezzaSignatureAlgorithm',
1593
-		'2.16.840.1.101.2.1.1.3*' => 'sdnsConfidentialityAlgorithm',
1594
-		'2.16.840.1.101.2.1.1.4*' => 'fortezzaConfidentialityAlgorithm',
1595
-		'2.16.840.1.101.2.1.1.5*' => 'sdnsIntegrityAlgorithm',
1596
-		'2.16.840.1.101.2.1.1.6*' => 'fortezzaIntegrityAlgorithm',
1597
-		'2.16.840.1.101.2.1.1.7*' => 'sdnsTokenProtectionAlgorithm',
1598
-		'2.16.840.1.101.2.1.1.8*' => 'fortezzaTokenProtectionAlgorithm',
1599
-		'2.16.840.1.101.2.1.1.9*' => 'sdnsKeyManagementAlgorithm',
1600
-		'2.16.840.1.101.2.1.1.10*' => 'fortezzaKeyManagementAlgorithm',
1601
-		'2.16.840.1.101.2.1.1.11*' => 'sdnsKMandSigAlgorithm',
1602
-		'2.16.840.1.101.2.1.1.12*' => 'fortezzaKMandSigAlgorithm',
1603
-		'2.16.840.1.101.2.1.1.13*' => 'suiteASignatureAlgorithm',
1604
-		'2.16.840.1.101.2.1.1.14*' => 'suiteAConfidentialityAlgorithm',
1605
-		'2.16.840.1.101.2.1.1.15*' => 'suiteAIntegrityAlgorithm',
1606
-		'2.16.840.1.101.2.1.1.16*' => 'suiteATokenProtectionAlgorithm',
1607
-		'2.16.840.1.101.2.1.1.17*' => 'suiteAKeyManagementAlgorithm',
1608
-		'2.16.840.1.101.2.1.1.18*' => 'suiteAKMandSigAlgorithm',
1609
-		'2.16.840.1.101.2.1.1.19*' => 'fortezzaUpdatedSigAlgorithm',
1610
-		'2.16.840.1.101.2.1.1.20*' => 'fortezzaKMandUpdSigAlgorithms',
1611
-		'2.16.840.1.101.2.1.1.21*' => 'fortezzaUpdatedIntegAlgorithm',
1612
-		'2.16.840.1.101.2.1.1.22*' => 'keyExchangeAlgorithm',
1613
-		'2.16.840.1.101.2.1.1.23*' => 'fortezzaWrap80Algorithm',
1614
-		'2.16.840.1.101.2.1.1.24*' => 'kEAKeyEncryptionAlgorithm',
1615
-		'2.16.840.1.101.2.1.2.1*' => 'rfc822MessageFormat',
1616
-		'2.16.840.1.101.2.1.2.2*' => 'emptyContent',
1617
-		'2.16.840.1.101.2.1.2.3*' => 'cspContentType',
1618
-		'2.16.840.1.101.2.1.2.42*' => 'mspRev3ContentType',
1619
-		'2.16.840.1.101.2.1.2.48*' => 'mspContentType',
1620
-		'2.16.840.1.101.2.1.2.49*' => 'mspRekeyAgentProtocol',
1621
-		'2.16.840.1.101.2.1.2.50*' => 'mspMMP',
1622
-		'2.16.840.1.101.2.1.2.66*' => 'mspRev3-1ContentType',
1623
-		'2.16.840.1.101.2.1.2.72*' => 'forwardedMSPMessageBodyPart',
1624
-		'2.16.840.1.101.2.1.2.73*' => 'mspForwardedMessageParameters',
1625
-		'2.16.840.1.101.2.1.2.74*' => 'forwardedCSPMsgBodyPart',
1626
-		'2.16.840.1.101.2.1.2.75*' => 'cspForwardedMessageParameters',
1627
-		'2.16.840.1.101.2.1.2.76*' => 'mspMMP2',
1628
-		'2.16.840.1.101.2.1.3.1*' => 'sdnsSecurityPolicy',
1629
-		'2.16.840.1.101.2.1.3.2*' => 'sdnsPRBAC',
1630
-		'2.16.840.1.101.2.1.3.3*' => 'mosaicPRBAC',
1631
-		'2.16.840.1.101.2.1.3.10*' => 'siSecurityPolicy',
1632
-		'2.16.840.1.101.2.1.3.10.0*' => 'siNASP',
1633
-		'2.16.840.1.101.2.1.3.10.1*' => 'siELCO',
1634
-		'2.16.840.1.101.2.1.3.10.2*' => 'siTK',
1635
-		'2.16.840.1.101.2.1.3.10.3*' => 'siDSAP',
1636
-		'2.16.840.1.101.2.1.3.10.4*' => 'siSSSS',
1637
-		'2.16.840.1.101.2.1.3.10.5*' => 'siDNASP',
1638
-		'2.16.840.1.101.2.1.3.10.6*' => 'siBYEMAN',
1639
-		'2.16.840.1.101.2.1.3.10.7*' => 'siREL-US',
1640
-		'2.16.840.1.101.2.1.3.10.8*' => 'siREL-AUS',
1641
-		'2.16.840.1.101.2.1.3.10.9*' => 'siREL-CAN',
1642
-		'2.16.840.1.101.2.1.3.10.10*' => 'siREL_UK',
1643
-		'2.16.840.1.101.2.1.3.10.11*' => 'siREL-NZ',
1644
-		'2.16.840.1.101.2.1.3.10.12*' => 'siGeneric',
1645
-		'2.16.840.1.101.2.1.3.11*' => 'genser',
1646
-		'2.16.840.1.101.2.1.3.11.0*' => 'genserNations',
1647
-		'2.16.840.1.101.2.1.3.11.1*' => 'genserComsec',
1648
-		'2.16.840.1.101.2.1.3.11.2*' => 'genserAcquisition',
1649
-		'2.16.840.1.101.2.1.3.11.3*' => 'genserSecurityCategories',
1650
-		'2.16.840.1.101.2.1.3.11.3.0*' => 'genserTagSetName',
1651
-		'2.16.840.1.101.2.1.3.12*' => 'defaultSecurityPolicy',
1652
-		'2.16.840.1.101.2.1.3.13*' => 'capcoMarkings',
1653
-		'2.16.840.1.101.2.1.3.13.0*' => 'capcoSecurityCategories',
1654
-		'2.16.840.1.101.2.1.3.13.0.1*' => 'capcoTagSetName1',
1655
-		'2.16.840.1.101.2.1.3.13.0.2*' => 'capcoTagSetName2',
1656
-		'2.16.840.1.101.2.1.3.13.0.3*' => 'capcoTagSetName3',
1657
-		'2.16.840.1.101.2.1.3.13.0.4*' => 'capcoTagSetName4',
1658
-		'2.16.840.1.101.2.1.5.1*' => 'sdnsKeyManagementCertificate',
1659
-		'2.16.840.1.101.2.1.5.2*' => 'sdnsUserSignatureCertificate',
1660
-		'2.16.840.1.101.2.1.5.3*' => 'sdnsKMandSigCertificate',
1661
-		'2.16.840.1.101.2.1.5.4*' => 'fortezzaKeyManagementCertificate',
1662
-		'2.16.840.1.101.2.1.5.5*' => 'fortezzaKMandSigCertificate',
1663
-		'2.16.840.1.101.2.1.5.6*' => 'fortezzaUserSignatureCertificate',
1664
-		'2.16.840.1.101.2.1.5.7*' => 'fortezzaCASignatureCertificate',
1665
-		'2.16.840.1.101.2.1.5.8*' => 'sdnsCASignatureCertificate',
1666
-		'2.16.840.1.101.2.1.5.10*' => 'auxiliaryVector',
1667
-		'2.16.840.1.101.2.1.5.11*' => 'mlReceiptPolicy',
1668
-		'2.16.840.1.101.2.1.5.12*' => 'mlMembership',
1669
-		'2.16.840.1.101.2.1.5.13*' => 'mlAdministrators',
1670
-		'2.16.840.1.101.2.1.5.14*' => 'alid',
1671
-		'2.16.840.1.101.2.1.5.20*' => 'janUKMs',
1672
-		'2.16.840.1.101.2.1.5.21*' => 'febUKMs',
1673
-		'2.16.840.1.101.2.1.5.22*' => 'marUKMs',
1674
-		'2.16.840.1.101.2.1.5.23*' => 'aprUKMs',
1675
-		'2.16.840.1.101.2.1.5.24*' => 'mayUKMs',
1676
-		'2.16.840.1.101.2.1.5.25*' => 'junUKMs',
1677
-		'2.16.840.1.101.2.1.5.26*' => 'julUKMs',
1678
-		'2.16.840.1.101.2.1.5.27*' => 'augUKMs',
1679
-		'2.16.840.1.101.2.1.5.28*' => 'sepUKMs',
1680
-		'2.16.840.1.101.2.1.5.29*' => 'octUKMs',
1681
-		'2.16.840.1.101.2.1.5.30*' => 'novUKMs',
1682
-		'2.16.840.1.101.2.1.5.31*' => 'decUKMs',
1683
-		'2.16.840.1.101.2.1.5.40*' => 'metaSDNSckl',
1684
-		'2.16.840.1.101.2.1.5.41*' => 'sdnsCKL',
1685
-		'2.16.840.1.101.2.1.5.42*' => 'metaSDNSsignatureCKL',
1686
-		'2.16.840.1.101.2.1.5.43*' => 'sdnsSignatureCKL',
1687
-		'2.16.840.1.101.2.1.5.44*' => 'sdnsCertificateRevocationList',
1688
-		'2.16.840.1.101.2.1.5.45*' => 'fortezzaCertificateRevocationList',
1689
-		'2.16.840.1.101.2.1.5.46*' => 'fortezzaCKL',
1690
-		'2.16.840.1.101.2.1.5.47*' => 'alExemptedAddressProcessor',
1691
-		'2.16.840.1.101.2.1.5.48*' => 'guard',
1692
-		'2.16.840.1.101.2.1.5.49*' => 'algorithmsSupported',
1693
-		'2.16.840.1.101.2.1.5.50*' => 'suiteAKeyManagementCertificate',
1694
-		'2.16.840.1.101.2.1.5.51*' => 'suiteAKMandSigCertificate',
1695
-		'2.16.840.1.101.2.1.5.52*' => 'suiteAUserSignatureCertificate',
1696
-		'2.16.840.1.101.2.1.5.53*' => 'prbacInfo',
1697
-		'2.16.840.1.101.2.1.5.54*' => 'prbacCAConstraints',
1698
-		'2.16.840.1.101.2.1.5.55*' => 'sigOrKMPrivileges',
1699
-		'2.16.840.1.101.2.1.5.56*' => 'commPrivileges',
1700
-		'2.16.840.1.101.2.1.5.57*' => 'labeledAttribute',
1701
-		'2.16.840.1.101.2.1.5.58*' => 'policyInformationFile',
1702
-		'2.16.840.1.101.2.1.5.59*' => 'secPolicyInformationFile',
1703
-		'2.16.840.1.101.2.1.5.60*' => 'cAClearanceConstraint',
1704
-		'2.16.840.1.101.2.1.7.1*' => 'cspExtns',
1705
-		'2.16.840.1.101.2.1.7.1.0*' => 'cspCsExtn',
1706
-		'2.16.840.1.101.2.1.8.1*' => 'mISSISecurityCategories',
1707
-		'2.16.840.1.101.2.1.8.2*' => 'standardSecurityLabelPrivileges',
1708
-		'2.16.840.1.101.2.1.10.1*' => 'sigPrivileges',
1709
-		'2.16.840.1.101.2.1.10.2*' => 'kmPrivileges',
1710
-		'2.16.840.1.101.2.1.10.3*' => 'namedTagSetPrivilege',
1711
-		'2.16.840.1.101.2.1.11.1*' => 'ukDemo',
1712
-		'2.16.840.1.101.2.1.11.2*' => 'usDODClass2',
1713
-		'2.16.840.1.101.2.1.11.3*' => 'usMediumPilot',
1714
-		'2.16.840.1.101.2.1.11.4*' => 'usDODClass4',
1715
-		'2.16.840.1.101.2.1.11.5*' => 'usDODClass3',
1716
-		'2.16.840.1.101.2.1.11.6*' => 'usDODClass5',
1717
-		'2.16.840.1.101.2.1.12.0*' => 'testSecurityPolicy',
1718
-		'2.16.840.1.101.2.1.12.0.1*' => 'tsp1',
1719
-		'2.16.840.1.101.2.1.12.0.1.0*' => 'tsp1SecurityCategories',
1720
-		'2.16.840.1.101.2.1.12.0.1.0.0*' => 'tsp1TagSetZero',
1721
-		'2.16.840.1.101.2.1.12.0.1.0.1*' => 'tsp1TagSetOne',
1722
-		'2.16.840.1.101.2.1.12.0.1.0.2*' => 'tsp1TagSetTwo',
1723
-		'2.16.840.1.101.2.1.12.0.2*' => 'tsp2',
1724
-		'2.16.840.1.101.2.1.12.0.2.0*' => 'tsp2SecurityCategories',
1725
-		'2.16.840.1.101.2.1.12.0.2.0.0*' => 'tsp2TagSetZero',
1726
-		'2.16.840.1.101.2.1.12.0.2.0.1*' => 'tsp2TagSetOne',
1727
-		'2.16.840.1.101.2.1.12.0.2.0.2*' => 'tsp2TagSetTwo',
1728
-		'2.16.840.1.101.2.1.12.0.3*' => 'kafka',
1729
-		'2.16.840.1.101.2.1.12.0.3.0*' => 'kafkaSecurityCategories',
1730
-		'2.16.840.1.101.2.1.12.0.3.0.1*' => 'kafkaTagSetName1',
1731
-		'2.16.840.1.101.2.1.12.0.3.0.2*' => 'kafkaTagSetName2',
1732
-		'2.16.840.1.101.2.1.12.0.3.0.3*' => 'kafkaTagSetName3',
1733
-		'2.16.840.1.101.2.1.12.1.1*' => 'tcp1',
1734
-		'2.16.840.1.101.3.1*' => 'slabel',
1735
-		'2.16.840.1.101.3.2*' => 'pki',
1736
-		'2.16.840.1.101.3.2.1*' => 'NIST policyIdentifier',
1737
-		'2.16.840.1.101.3.2.1.3.1*' => 'fbcaRudimentaryPolicy',
1738
-		'2.16.840.1.101.3.2.1.3.2*' => 'fbcaBasicPolicy',
1739
-		'2.16.840.1.101.3.2.1.3.3*' => 'fbcaMediumPolicy',
1740
-		'2.16.840.1.101.3.2.1.3.4*' => 'fbcaHighPolicy',
1741
-		'2.16.840.1.101.3.2.1.48.1*' => 'nistTestPolicy1',
1742
-		'2.16.840.1.101.3.2.1.48.2*' => 'nistTestPolicy2',
1743
-		'2.16.840.1.101.3.2.1.48.3*' => 'nistTestPolicy3',
1744
-		'2.16.840.1.101.3.2.1.48.4*' => 'nistTestPolicy4',
1745
-		'2.16.840.1.101.3.2.1.48.5*' => 'nistTestPolicy5',
1746
-		'2.16.840.1.101.3.2.1.48.6*' => 'nistTestPolicy6',
1747
-		'2.16.840.1.101.3.2.2*' => 'gak',
1748
-		'2.16.840.1.101.3.2.2.1*' => 'kRAKey',
1749
-		'2.16.840.1.101.3.2.3*' => 'extensions',
1750
-		'2.16.840.1.101.3.2.3.1*' => 'kRTechnique',
1751
-		'2.16.840.1.101.3.2.3.2*' => 'kRecoveryCapable',
1752
-		'2.16.840.1.101.3.2.3.3*' => 'kR',
1753
-		'2.16.840.1.101.3.2.4*' => 'keyRecoverySchemes',
1754
-		'2.16.840.1.101.3.2.5*' => 'krapola',
1755
-		'2.16.840.1.101.3.3*' => 'arpa',
1756
-		'2.16.840.1.101.3.4*' => 'nistAlgorithm',
1757
-		'2.16.840.1.101.3.4.1*' => 'aes',
1758
-		'2.16.840.1.101.3.4.1.1*' => 'aes128-ECB',
1759
-		'2.16.840.1.101.3.4.1.2*' => 'aes128-CBC',
1760
-		'2.16.840.1.101.3.4.1.3*' => 'aes128-OFB',
1761
-		'2.16.840.1.101.3.4.1.4*' => 'aes128-CFB',
1762
-		'2.16.840.1.101.3.4.1.5*' => 'aes128-wrap',
1763
-		'2.16.840.1.101.3.4.1.6*' => 'aes128-GCM',
1764
-		'2.16.840.1.101.3.4.1.7*' => 'aes128-CCM',
1765
-		'2.16.840.1.101.3.4.1.8*' => 'aes128-wrap-pad',
1766
-		'2.16.840.1.101.3.4.1.21*' => 'aes192-ECB',
1767
-		'2.16.840.1.101.3.4.1.22*' => 'aes192-CBC',
1768
-		'2.16.840.1.101.3.4.1.23*' => 'aes192-OFB',
1769
-		'2.16.840.1.101.3.4.1.24*' => 'aes192-CFB',
1770
-		'2.16.840.1.101.3.4.1.25*' => 'aes192-wrap',
1771
-		'2.16.840.1.101.3.4.1.26*' => 'aes192-GCM',
1772
-		'2.16.840.1.101.3.4.1.27*' => 'aes192-CCM',
1773
-		'2.16.840.1.101.3.4.1.28*' => 'aes192-wrap-pad',
1774
-		'2.16.840.1.101.3.4.1.41*' => 'aes256-ECB',
1775
-		'2.16.840.1.101.3.4.1.42*' => 'aes256-CBC',
1776
-		'2.16.840.1.101.3.4.1.43*' => 'aes256-OFB',
1777
-		'2.16.840.1.101.3.4.1.44*' => 'aes256-CFB',
1778
-		'2.16.840.1.101.3.4.1.45*' => 'aes256-wrap',
1779
-		'2.16.840.1.101.3.4.1.46*' => 'aes256-GCM',
1780
-		'2.16.840.1.101.3.4.1.47*' => 'aes256-CCM',
1781
-		'2.16.840.1.101.3.4.1.48*' => 'aes256-wrap-pad',
1782
-		'2.16.840.1.101.3.4.2*' => 'hashAlgos',
1783
-		'2.16.840.1.101.3.4.2.1*' => 'sha-256',
1784
-		'2.16.840.1.101.3.4.2.2*' => 'sha-384',
1785
-		'2.16.840.1.101.3.4.2.3*' => 'sha-512',
1786
-		'2.16.840.1.101.3.4.2.4*' => 'sha-224',
1787
-		'2.16.840.1.101.3.4.3.1*' => 'dsaWithSha224',
1788
-		'2.16.840.1.101.3.4.3.2*' => 'dsaWithSha256',
1789
-		'2.16.840.1.113719.1.2.8*' => 'novellAlgorithm',
1790
-		'2.16.840.1.113719.1.2.8.22*' => 'desCbcIV8',
1791
-		'2.16.840.1.113719.1.2.8.23*' => 'desCbcPadIV8',
1792
-		'2.16.840.1.113719.1.2.8.24*' => 'desEDE2CbcIV8',
1793
-		'2.16.840.1.113719.1.2.8.25*' => 'desEDE2CbcPadIV8',
1794
-		'2.16.840.1.113719.1.2.8.26*' => 'desEDE3CbcIV8',
1795
-		'2.16.840.1.113719.1.2.8.27*' => 'desEDE3CbcPadIV8',
1796
-		'2.16.840.1.113719.1.2.8.28*' => 'rc5CbcPad',
1797
-		'2.16.840.1.113719.1.2.8.29*' => 'md2WithRSAEncryptionBSafe1',
1798
-		'2.16.840.1.113719.1.2.8.30*' => 'md5WithRSAEncryptionBSafe1',
1799
-		'2.16.840.1.113719.1.2.8.31*' => 'sha1WithRSAEncryptionBSafe1',
1800
-		'2.16.840.1.113719.1.2.8.32*' => 'lmDigest',
1801
-		'2.16.840.1.113719.1.2.8.40*' => 'md2',
1802
-		'2.16.840.1.113719.1.2.8.50*' => 'md5',
1803
-		'2.16.840.1.113719.1.2.8.51*' => 'ikeHmacWithSHA1-RSA',
1804
-		'2.16.840.1.113719.1.2.8.52*' => 'ikeHmacWithMD5-RSA',
1805
-		'2.16.840.1.113719.1.2.8.69*' => 'rc2CbcPad',
1806
-		'2.16.840.1.113719.1.2.8.82*' => 'sha-1',
1807
-		'2.16.840.1.113719.1.2.8.92*' => 'rc2BSafe1Cbc',
1808
-		'2.16.840.1.113719.1.2.8.95*' => 'md4',
1809
-		'2.16.840.1.113719.1.2.8.130*' => 'md4Packet',
1810
-		'2.16.840.1.113719.1.2.8.131*' => 'rsaEncryptionBsafe1',
1811
-		'2.16.840.1.113719.1.2.8.132*' => 'nwPassword',
1812
-		'2.16.840.1.113719.1.2.8.133*' => 'novellObfuscate-1',
1813
-		'2.16.840.1.113719.1.9*' => 'pki',
1814
-		'2.16.840.1.113719.1.9.4*' => 'pkiAttributeType',
1815
-		'2.16.840.1.113719.1.9.4.1*' => 'securityAttributes',
1816
-		'2.16.840.1.113719.1.9.4.2*' => 'relianceLimit',
1817
-		'2.16.840.1.113730.1*' => 'cert-extension',
1818
-		'2.16.840.1.113730.1.1*' => 'netscape-cert-type',
1819
-		'2.16.840.1.113730.1.2*' => 'netscape-base-url',
1820
-		'2.16.840.1.113730.1.3*' => 'netscape-revocation-url',
1821
-		'2.16.840.1.113730.1.4*' => 'netscape-ca-revocation-url',
1822
-		'2.16.840.1.113730.1.7*' => 'netscape-cert-renewal-url',
1823
-		'2.16.840.1.113730.1.8*' => 'netscape-ca-policy-url',
1824
-		'2.16.840.1.113730.1.9*' => 'HomePage-url',
1825
-		'2.16.840.1.113730.1.10*' => 'EntityLogo',
1826
-		'2.16.840.1.113730.1.11*' => 'UserPicture',
1827
-		'2.16.840.1.113730.1.12*' => 'netscape-ssl-server-name',
1828
-		'2.16.840.1.113730.1.13*' => 'netscape-comment',
1829
-		'2.16.840.1.113730.2*' => 'data-type',
1830
-		'2.16.840.1.113730.2.1*' => 'dataGIF',
1831
-		'2.16.840.1.113730.2.2*' => 'dataJPEG',
1832
-		'2.16.840.1.113730.2.3*' => 'dataURL',
1833
-		'2.16.840.1.113730.2.4*' => 'dataHTML',
1834
-		'2.16.840.1.113730.2.5*' => 'certSequence',
1835
-		'2.16.840.1.113730.2.6*' => 'certURL',
1836
-		'2.16.840.1.113730.3*' => 'directory',
1837
-		'2.16.840.1.113730.3.1*' => 'ldapDefinitions',
1838
-		'2.16.840.1.113730.3.1.1*' => 'carLicense',
1839
-		'2.16.840.1.113730.3.1.2*' => 'departmentNumber',
1840
-		'2.16.840.1.113730.3.1.3*' => 'employeeNumber',
1841
-		'2.16.840.1.113730.3.1.4*' => 'employeeType',
1842
-		'2.16.840.1.113730.3.2.2*' => 'inetOrgPerson',
1843
-		'2.16.840.1.113730.4.1*' => 'serverGatedCrypto',
1844
-		'2.16.840.1.113733.1.6.3*' => 'verisignCZAG',
1845
-		'2.16.840.1.113733.1.6.6*' => 'verisignInBox',
1846
-		'2.16.840.1.113733.1.6.11*' => 'verisignOnsiteJurisdictionHash',
1847
-		'2.16.840.1.113733.1.6.13*' => 'Unknown Verisign VPN extension',
1848
-		'2.16.840.1.113733.1.6.15*' => 'verisignServerID',
1849
-		'2.16.840.1.113733.1.7.1.1*' => 'verisignCertPolicies95Qualifier1',
1850
-		'2.16.840.1.113733.1.7.1.1.1*' => 'verisignCPSv1notice',
1851
-		'2.16.840.1.113733.1.7.1.1.2*' => 'verisignCPSv1nsi',
1852
-		'2.16.840.1.113733.1.7.23.6*' => 'VeriSign EV policy',
1853
-		'2.16.840.1.113733.1.8.1*' => 'verisignISSStrongCrypto',
1854
-		'2.16.840.1.113733.1*' => 'pki',
1855
-		'2.16.840.1.113733.1.9*' => 'pkcs7Attribute',
1856
-		'2.16.840.1.113733.1.9.2*' => 'messageType',
1857
-		'2.16.840.1.113733.1.9.3*' => 'pkiStatus',
1858
-		'2.16.840.1.113733.1.9.4*' => 'failInfo',
1859
-		'2.16.840.1.113733.1.9.5*' => 'senderNonce',
1860
-		'2.16.840.1.113733.1.9.6*' => 'recipientNonce',
1861
-		'2.16.840.1.113733.1.9.7*' => 'transID',
1862
-		'2.16.840.1.113733.1.9.8*' => 'extensionReq',
1863
-		'2.16.840.1.114412.1.3.0.1*' => 'digiCertGlobalCAPolicy',
1864
-		'2.16.840.1.114412.1.3.0.2*' => 'digiCertHighAssuranceEVCAPolicy',
1865
-		'2.16.840.1.114412.1.3.0.3*' => 'digiCertGlobalRootCAPolicy',
1866
-		'2.16.840.1.114412.1.3.0.4*' => 'digiCertAssuredIDRootCAPolicy',
1867
-		'2.23.42.0*' => 'contentType',
1868
-		'2.23.42.0.0*' => 'panData',
1869
-		'2.23.42.0.1*' => 'panToken',
1870
-		'2.23.42.0.2*' => 'panOnly',
1871
-		'2.23.42.1*' => 'msgExt',
1872
-		'2.23.42.2*' => 'field',
1873
-		'2.23.42.2.0*' => 'fullName',
1874
-		'2.23.42.2.1*' => 'givenName',
1875
-		'2.23.42.2.2*' => 'familyName',
1876
-		'2.23.42.2.3*' => 'birthFamilyName',
1877
-		'2.23.42.2.4*' => 'placeName',
1878
-		'2.23.42.2.5*' => 'identificationNumber',
1879
-		'2.23.42.2.6*' => 'month',
1880
-		'2.23.42.2.7*' => 'date',
1881
-		'2.23.42.2.8*' => 'address',
1882
-		'2.23.42.2.9*' => 'telephone',
1883
-		'2.23.42.2.10*' => 'amount',
1884
-		'2.23.42.2.11*' => 'accountNumber',
1885
-		'2.23.42.2.12*' => 'passPhrase',
1886
-		'2.23.42.3*' => 'attribute',
1887
-		'2.23.42.3.0*' => 'cert',
1888
-		'2.23.42.3.0.0*' => 'rootKeyThumb',
1889
-		'2.23.42.3.0.1*' => 'additionalPolicy',
1890
-		'2.23.42.4*' => 'algorithm',
1891
-		'2.23.42.5*' => 'policy',
1892
-		'2.23.42.5.0*' => 'root',
1893
-		'2.23.42.6*' => 'module',
1894
-		'2.23.42.7*' => 'certExt',
1895
-		'2.23.42.7.0*' => 'hashedRootKey',
1896
-		'2.23.42.7.1*' => 'certificateType',
1897
-		'2.23.42.7.2*' => 'merchantData',
1898
-		'2.23.42.7.3*' => 'cardCertRequired',
1899
-		'2.23.42.7.4*' => 'tunneling',
1900
-		'2.23.42.7.5*' => 'setExtensions',
1901
-		'2.23.42.7.6*' => 'setQualifier',
1902
-		'2.23.42.8*' => 'brand',
1903
-		'2.23.42.8.1*' => 'IATA-ATA',
1904
-		'2.23.42.8.4*' => 'VISA',
1905
-		'2.23.42.8.5*' => 'MasterCard',
1906
-		'2.23.42.8.30*' => 'Diners',
1907
-		'2.23.42.8.34*' => 'AmericanExpress',
1908
-		'2.23.42.8.6011*' => 'Novus',
1909
-		'2.23.42.9*' => 'vendor',
1910
-		'2.23.42.9.0*' => 'GlobeSet',
1911
-		'2.23.42.9.1*' => 'IBM',
1912
-		'2.23.42.9.2*' => 'CyberCash',
1913
-		'2.23.42.9.3*' => 'Terisa',
1914
-		'2.23.42.9.4*' => 'RSADSI',
1915
-		'2.23.42.9.5*' => 'VeriFone',
1916
-		'2.23.42.9.6*' => 'TrinTech',
1917
-		'2.23.42.9.7*' => 'BankGate',
1918
-		'2.23.42.9.8*' => 'GTE',
1919
-		'2.23.42.9.9*' => 'CompuSource',
1920
-		'2.23.42.9.10*' => 'Griffin',
1921
-		'2.23.42.9.11*' => 'Certicom',
1922
-		'2.23.42.9.12*' => 'OSS',
1923
-		'2.23.42.9.13*' => 'TenthMountain',
1924
-		'2.23.42.9.14*' => 'Antares',
1925
-		'2.23.42.9.15*' => 'ECC',
1926
-		'2.23.42.9.16*' => 'Maithean',
1927
-		'2.23.42.9.17*' => 'Netscape',
1928
-		'2.23.42.9.18*' => 'Verisign',
1929
-		'2.23.42.9.19*' => 'BlueMoney',
1930
-		'2.23.42.9.20*' => 'Lacerte',
1931
-		'2.23.42.9.21*' => 'Fujitsu',
1932
-		'2.23.42.9.22*' => 'eLab',
1933
-		'2.23.42.9.23*' => 'Entrust',
1934
-		'2.23.42.9.24*' => 'VIAnet',
1935
-		'2.23.42.9.25*' => 'III',
1936
-		'2.23.42.9.26*' => 'OpenMarket',
1937
-		'2.23.42.9.27*' => 'Lexem',
1938
-		'2.23.42.9.28*' => 'Intertrader',
1939
-		'2.23.42.9.29*' => 'Persimmon',
1940
-		'2.23.42.9.30*' => 'NABLE',
1941
-		'2.23.42.9.31*' => 'espace-net',
1942
-		'2.23.42.9.32*' => 'Hitachi',
1943
-		'2.23.42.9.33*' => 'Microsoft',
1944
-		'2.23.42.9.34*' => 'NEC',
1945
-		'2.23.42.9.35*' => 'Mitsubishi',
1946
-		'2.23.42.9.36*' => 'NCR',
1947
-		'2.23.42.9.37*' => 'e-COMM',
1948
-		'2.23.42.9.38*' => 'Gemplus',
1949
-		'2.23.42.10*' => 'national',
1950
-		'2.23.42.10.392*' => 'Japan',
1951
-		'2.23.136.1.1.1*' => 'mRTDSignatureData',
1952
-		'2.54.1775.2*' => 'hashedRootKey',
1953
-		'2.54.1775.3*' => 'certificateType',
1954
-		'2.54.1775.4*' => 'merchantData',
1955
-		'2.54.1775.5*' => 'cardCertRequired',
1956
-		'2.54.1775.6*' => 'tunneling',
1957
-		'2.54.1775.7*' => 'setQualifier',
1958
-		'2.54.1775.99*' => 'setData',
1959
-		'1.3.6.1.4.1.6449.1.2.1.5.1*' => 'UTN-USERFirst EV policy',
1960
-		'1.3.6.1.4.1.34697.2.1*' => 'AffirmTrust EV policy',
1961
-		'1.3.6.1.4.1.34697.2.2*' => 'AffirmTrust EV policy',
1962
-		'1.3.6.1.4.1.34697.2.3*' => 'AffirmTrust EV policy',
1963
-		'1.3.6.1.4.1.34697.2.4*' => 'AffirmTrust EV policy',
1964
-		'1.3.6.1.4.1.22234.2.5.2.3.1*' => 'CertPlus EV policy',
1965
-		'1.3.6.1.4.1.6334.1.100.1*' => 'GTE CyberTrust EV policy',
1966
-		'2.16.840.1.114412.2.1*' => 'DigiCert EV policy',
1967
-		'2.16.528.1.1001.1.1.1.12.6.1.1.1*' => 'DigiNotar EV policy',
1968
-		'2.16.840.1.114028.10.1.2*' => 'Entrust EV policy',
1969
-		'1.3.6.1.4.1.14370.1.6*' => 'GeoTrust EV policy',
1970
-		'1.3.6.1.4.1.4146.1.1*' => 'GlobalSign EV policy',
1971
-		'2.16.840.1.114413.1.7.23.3*' => 'ValiCert EV policy',
1972
-		'1.3.6.1.4.1.782.1.2.1.8.1*' => 'Network Solutions EV policy',
1973
-		'1.3.6.1.4.1.8024.0.2.100.1.2*' => 'QuoVadis EV policy',
1974
-		'2.16.840.1.114404.1.1.2.4.1*' => 'Secure Global EV policy',
1975
-		'1.2.392.200091.100.721.1*' => 'Security Communication EV policy',
1976
-		'1.3.6.1.4.1.23223.1.1.1*' => 'StartCom EV policy',
1977
-		'2.16.840.1.114414.1.7.23.3*' => 'Starfield EV policy',
1978
-		'2.16.756.1.89.1.2.1.1*' => 'SwissSign EV policy',
1979
-		'2.16.840.1.113733.1.7.48.1*' => 'Thawte EV policy',
1980
-		'2.16.840.1.114171.500.9*' => 'Wells Fargo EV policy',
1981
-	];
23
+    public $oids = [
24
+        '0.2.262.1.10*' => 'Telesec',
25
+        '0.2.262.1.10.0*' => 'extension',
26
+        '0.2.262.1.10.1*' => 'mechanism',
27
+        '0.2.262.1.10.1.0*' => 'authentication',
28
+        '0.2.262.1.10.1.0.1*' => 'passwordAuthentication',
29
+        '0.2.262.1.10.1.0.2*' => 'protectedPasswordAuthentication',
30
+        '0.2.262.1.10.1.0.3*' => 'oneWayX509Authentication',
31
+        '0.2.262.1.10.1.0.4*' => 'twoWayX509Authentication',
32
+        '0.2.262.1.10.1.0.5*' => 'threeWayX509Authentication',
33
+        '0.2.262.1.10.1.0.6*' => 'oneWayISO9798Authentication',
34
+        '0.2.262.1.10.1.0.7*' => 'twoWayISO9798Authentication',
35
+        '0.2.262.1.10.1.0.8*' => 'telekomAuthentication',
36
+        '0.2.262.1.10.1.1*' => 'signature',
37
+        '0.2.262.1.10.1.1.1*' => 'md4WithRSAAndISO9697',
38
+        '0.2.262.1.10.1.1.2*' => 'md4WithRSAAndTelesecSignatureStandard',
39
+        '0.2.262.1.10.1.1.3*' => 'md5WithRSAAndISO9697',
40
+        '0.2.262.1.10.1.1.4*' => 'md5WithRSAAndTelesecSignatureStandard',
41
+        '0.2.262.1.10.1.1.5*' => 'ripemd160WithRSAAndTelekomSignatureStandard',
42
+        '0.2.262.1.10.1.1.9*' => 'hbciRsaSignature',
43
+        '0.2.262.1.10.1.2*' => 'encryption',
44
+        '0.2.262.1.10.1.2.0*' => 'none',
45
+        '0.2.262.1.10.1.2.1*' => 'rsaTelesec',
46
+        '0.2.262.1.10.1.2.2*' => 'des',
47
+        '0.2.262.1.10.1.2.2.1*' => 'desECB',
48
+        '0.2.262.1.10.1.2.2.2*' => 'desCBC',
49
+        '0.2.262.1.10.1.2.2.3*' => 'desOFB',
50
+        '0.2.262.1.10.1.2.2.4*' => 'desCFB8',
51
+        '0.2.262.1.10.1.2.2.5*' => 'desCFB64',
52
+        '0.2.262.1.10.1.2.3*' => 'des3',
53
+        '0.2.262.1.10.1.2.3.1*' => 'des3ECB',
54
+        '0.2.262.1.10.1.2.3.2*' => 'des3CBC',
55
+        '0.2.262.1.10.1.2.3.3*' => 'des3OFB',
56
+        '0.2.262.1.10.1.2.3.4*' => 'des3CFB8',
57
+        '0.2.262.1.10.1.2.3.5*' => 'des3CFB64',
58
+        '0.2.262.1.10.1.2.4*' => 'magenta',
59
+        '0.2.262.1.10.1.2.5*' => 'idea',
60
+        '0.2.262.1.10.1.2.5.1*' => 'ideaECB',
61
+        '0.2.262.1.10.1.2.5.2*' => 'ideaCBC',
62
+        '0.2.262.1.10.1.2.5.3*' => 'ideaOFB',
63
+        '0.2.262.1.10.1.2.5.4*' => 'ideaCFB8',
64
+        '0.2.262.1.10.1.2.5.5*' => 'ideaCFB64',
65
+        '0.2.262.1.10.1.3*' => 'oneWayFunction',
66
+        '0.2.262.1.10.1.3.1*' => 'md4',
67
+        '0.2.262.1.10.1.3.2*' => 'md5',
68
+        '0.2.262.1.10.1.3.3*' => 'sqModNX509',
69
+        '0.2.262.1.10.1.3.4*' => 'sqModNISO',
70
+        '0.2.262.1.10.1.3.5*' => 'ripemd128',
71
+        '0.2.262.1.10.1.3.6*' => 'hashUsingBlockCipher',
72
+        '0.2.262.1.10.1.3.7*' => 'mac',
73
+        '0.2.262.1.10.1.3.8*' => 'ripemd160',
74
+        '0.2.262.1.10.1.4*' => 'fecFunction',
75
+        '0.2.262.1.10.1.4.1*' => 'reedSolomon',
76
+        '0.2.262.1.10.2*' => 'module',
77
+        '0.2.262.1.10.2.0*' => 'algorithms',
78
+        '0.2.262.1.10.2.1*' => 'attributeTypes',
79
+        '0.2.262.1.10.2.2*' => 'certificateTypes',
80
+        '0.2.262.1.10.2.3*' => 'messageTypes',
81
+        '0.2.262.1.10.2.4*' => 'plProtocol',
82
+        '0.2.262.1.10.2.5*' => 'smeAndComponentsOfSme',
83
+        '0.2.262.1.10.2.6*' => 'fec',
84
+        '0.2.262.1.10.2.7*' => 'usefulDefinitions',
85
+        '0.2.262.1.10.2.8*' => 'stefiles',
86
+        '0.2.262.1.10.2.9*' => 'sadmib',
87
+        '0.2.262.1.10.2.10*' => 'electronicOrder',
88
+        '0.2.262.1.10.2.11*' => 'telesecTtpAsymmetricApplication',
89
+        '0.2.262.1.10.2.12*' => 'telesecTtpBasisApplication',
90
+        '0.2.262.1.10.2.13*' => 'telesecTtpMessages',
91
+        '0.2.262.1.10.2.14*' => 'telesecTtpTimeStampApplication',
92
+        '0.2.262.1.10.3*' => 'objectClass',
93
+        '0.2.262.1.10.3.0*' => 'telesecOtherName',
94
+        '0.2.262.1.10.3.1*' => 'directory',
95
+        '0.2.262.1.10.3.2*' => 'directoryType',
96
+        '0.2.262.1.10.3.3*' => 'directoryGroup',
97
+        '0.2.262.1.10.3.4*' => 'directoryUser',
98
+        '0.2.262.1.10.3.5*' => 'symmetricKeyEntry',
99
+        '0.2.262.1.10.4*' => 'package',
100
+        '0.2.262.1.10.5*' => 'parameter',
101
+        '0.2.262.1.10.6*' => 'nameBinding',
102
+        '0.2.262.1.10.7*' => 'attribute',
103
+        '0.2.262.1.10.7.0*' => 'applicationGroupIdentifier',
104
+        '0.2.262.1.10.7.1*' => 'certificateType',
105
+        '0.2.262.1.10.7.2*' => 'telesecCertificate',
106
+        '0.2.262.1.10.7.3*' => 'certificateNumber',
107
+        '0.2.262.1.10.7.4*' => 'certificateRevocationList',
108
+        '0.2.262.1.10.7.5*' => 'creationDate',
109
+        '0.2.262.1.10.7.6*' => 'issuer',
110
+        '0.2.262.1.10.7.7*' => 'namingAuthority',
111
+        '0.2.262.1.10.7.8*' => 'publicKeyDirectory',
112
+        '0.2.262.1.10.7.9*' => 'securityDomain',
113
+        '0.2.262.1.10.7.10*' => 'subject',
114
+        '0.2.262.1.10.7.11*' => 'timeOfRevocation',
115
+        '0.2.262.1.10.7.12*' => 'userGroupReference',
116
+        '0.2.262.1.10.7.13*' => 'validity',
117
+        '0.2.262.1.10.7.14*' => 'zert93',
118
+        '0.2.262.1.10.7.15*' => 'securityMessEnv',
119
+        '0.2.262.1.10.7.16*' => 'anonymizedPublicKeyDirectory',
120
+        '0.2.262.1.10.7.17*' => 'telesecGivenName',
121
+        '0.2.262.1.10.7.18*' => 'nameAdditions',
122
+        '0.2.262.1.10.7.19*' => 'telesecPostalCode',
123
+        '0.2.262.1.10.7.20*' => 'nameDistinguisher',
124
+        '0.2.262.1.10.7.21*' => 'telesecCertificateList',
125
+        '0.2.262.1.10.7.22*' => 'teletrustCertificateList',
126
+        '0.2.262.1.10.7.23*' => 'x509CertificateList',
127
+        '0.2.262.1.10.7.24*' => 'timeOfIssue',
128
+        '0.2.262.1.10.7.25*' => 'physicalCardNumber',
129
+        '0.2.262.1.10.7.26*' => 'fileType',
130
+        '0.2.262.1.10.7.27*' => 'ctlFileIsArchive',
131
+        '0.2.262.1.10.7.28*' => 'emailAddress',
132
+        '0.2.262.1.10.7.29*' => 'certificateTemplateList',
133
+        '0.2.262.1.10.7.30*' => 'directoryName',
134
+        '0.2.262.1.10.7.31*' => 'directoryTypeName',
135
+        '0.2.262.1.10.7.32*' => 'directoryGroupName',
136
+        '0.2.262.1.10.7.33*' => 'directoryUserName',
137
+        '0.2.262.1.10.7.34*' => 'revocationFlag',
138
+        '0.2.262.1.10.7.35*' => 'symmetricKeyEntryName',
139
+        '0.2.262.1.10.7.36*' => 'glNumber',
140
+        '0.2.262.1.10.7.37*' => 'goNumber',
141
+        '0.2.262.1.10.7.38*' => 'gKeyData',
142
+        '0.2.262.1.10.7.39*' => 'zKeyData',
143
+        '0.2.262.1.10.7.40*' => 'ktKeyData',
144
+        '0.2.262.1.10.7.41*' => 'ktKeyNumber',
145
+        '0.2.262.1.10.7.51*' => 'timeOfRevocationGen',
146
+        '0.2.262.1.10.7.52*' => 'liabilityText',
147
+        '0.2.262.1.10.8*' => 'attributeGroup',
148
+        '0.2.262.1.10.9*' => 'action',
149
+        '0.2.262.1.10.10*' => 'notification',
150
+        '0.2.262.1.10.11*' => 'snmp-mibs',
151
+        '0.2.262.1.10.11.1*' => 'securityApplication',
152
+        '0.2.262.1.10.12*' => 'certAndCrlExtensionDefinitions',
153
+        '0.2.262.1.10.12.0*' => 'liabilityLimitationFlag',
154
+        '0.2.262.1.10.12.1*' => 'telesecCertIdExt',
155
+        '0.2.262.1.10.12.2*' => 'Telesec policyIdentifier',
156
+        '0.2.262.1.10.12.3*' => 'telesecPolicyQualifierID',
157
+        '0.2.262.1.10.12.4*' => 'telesecCRLFilteredExt',
158
+        '0.2.262.1.10.12.5*' => 'telesecCRLFilterExt',
159
+        '0.2.262.1.10.12.6*' => 'telesecNamingAuthorityExt',
160
+        '0.4.0.127.0.7*' => 'bsi',
161
+        '0.4.0.127.0.7.1*' => 'bsiEcc',
162
+        '0.4.0.127.0.7.1.1*' => 'bsifieldType',
163
+        '0.4.0.127.0.7.1.1.1*' => 'bsiPrimeField',
164
+        '0.4.0.127.0.7.1.1.2*' => 'bsiCharacteristicTwoField',
165
+        '0.4.0.127.0.7.1.1.2.3*' => 'bsiCharacteristicTwoBasis',
166
+        '0.4.0.127.0.7.1.1.2.3.1*' => 'bsiGnBasis',
167
+        '0.4.0.127.0.7.1.1.2.3.2*' => 'bsiTpBasis',
168
+        '0.4.0.127.0.7.1.1.2.3.3*' => 'bsiPpBasis',
169
+        '0.4.0.127.0.7.1.1.4.1*' => 'bsiEcdsaSignatures',
170
+        '0.4.0.127.0.7.1.1.4.1.1*' => 'bsiEcdsaWithSHA1',
171
+        '0.4.0.127.0.7.1.1.4.1.2*' => 'bsiEcdsaWithSHA224',
172
+        '0.4.0.127.0.7.1.1.4.1.3*' => 'bsiEcdsaWithSHA256',
173
+        '0.4.0.127.0.7.1.1.4.1.4*' => 'bsiEcdsaWithSHA384',
174
+        '0.4.0.127.0.7.1.1.4.1.5*' => 'bsiEcdsaWithSHA512',
175
+        '0.4.0.127.0.7.1.1.4.1.6*' => 'bsiEcdsaWithRIPEMD160',
176
+        '0.4.0.127.0.7.1.2*' => 'bsiEcKeyType',
177
+        '0.4.0.127.0.7.1.2.1*' => 'bsiEcPublicKey',
178
+        '0.4.0.127.0.7.1.5.1*' => 'bsiKaeg',
179
+        '0.4.0.127.0.7.1.5.1.1*' => 'bsiKaegWithX963KDF',
180
+        '0.4.0.127.0.7.1.5.1.2*' => 'bsiKaegWith3DESKDF',
181
+        '0.4.0.127.0.7.2.2.1*' => 'bsiPK',
182
+        '0.4.0.127.0.7.2.2.1.1*' => 'bsiPK_DH',
183
+        '0.4.0.127.0.7.2.2.1.2*' => 'bsiPK_ECDH',
184
+        '0.4.0.127.0.7.2.2.2*' => 'bsiTA',
185
+        '0.4.0.127.0.7.2.2.2.1*' => 'bsiTA_RSA',
186
+        '0.4.0.127.0.7.2.2.2.1.1*' => 'bsiTA_RSAv1_5_SHA1',
187
+        '0.4.0.127.0.7.2.2.2.1.2*' => 'bsiTA_RSAv1_5_SHA256',
188
+        '0.4.0.127.0.7.2.2.2.1.3*' => 'bsiTA_RSAPSS_SHA1',
189
+        '0.4.0.127.0.7.2.2.2.1.4*' => 'bsiTA_RSAPSS_SHA256',
190
+        '0.4.0.127.0.7.2.2.2.2*' => 'bsiTA_ECDSA',
191
+        '0.4.0.127.0.7.2.2.2.2.1*' => 'bsiTA_ECDSA_SHA1',
192
+        '0.4.0.127.0.7.2.2.2.2.2*' => 'bsiTA_ECDSA_SHA224',
193
+        '0.4.0.127.0.7.2.2.2.2.3*' => 'bsiTA_ECDSA_SHA256',
194
+        '0.4.0.127.0.7.2.2.3*' => 'bsiCA',
195
+        '0.4.0.127.0.7.2.2.3.1*' => 'bsiCA_DH',
196
+        '0.4.0.127.0.7.2.2.3.2*' => 'bsiCA_ECDH',
197
+        '0.4.0.127.0.7.3.1.2.1*' => 'bsiRoleEAC',
198
+        '0.4.0.1862*' => 'etsiQcsProfile',
199
+        '0.4.0.1862.1*' => 'etsiQcs',
200
+        '0.4.0.1862.1.1*' => 'etsiQcsCompliance',
201
+        '0.4.0.1862.1.2*' => 'etsiQcsLimitValue',
202
+        '0.4.0.1862.1.3*' => 'etsiQcsRetentionPeriod',
203
+        '0.4.0.1862.1.4*' => 'etsiQcsQcSSCD',
204
+        '0.9.2342.19200300.100.1.1*' => 'userID',
205
+        '0.9.2342.19200300.100.1.3*' => 'rfc822Mailbox',
206
+        '0.9.2342.19200300.100.1.25*' => 'domainComponent',
207
+        '1.0.10118.3.0.49*' => 'ripemd160',
208
+        '1.0.10118.3.0.50*' => 'ripemd128',
209
+        '1.0.10118.3.0.55*' => 'whirlpool',
210
+        '1.2.36.1.3.1.1.1*' => 'qgpki',
211
+        '1.2.36.1.3.1.1.1.1*' => 'qgpkiPolicies',
212
+        '1.2.36.1.3.1.1.1.1.1*' => 'qgpkiMedIntermedCA',
213
+        '1.2.36.1.3.1.1.1.1.1.1*' => 'qgpkiMedIntermedIndividual',
214
+        '1.2.36.1.3.1.1.1.1.1.2*' => 'qgpkiMedIntermedDeviceControl',
215
+        '1.2.36.1.3.1.1.1.1.1.3*' => 'qgpkiMedIntermedDevice',
216
+        '1.2.36.1.3.1.1.1.1.1.4*' => 'qgpkiMedIntermedAuthorisedParty',
217
+        '1.2.36.1.3.1.1.1.1.1.5*' => 'qgpkiMedIntermedDeviceSystem',
218
+        '1.2.36.1.3.1.1.1.1.2*' => 'qgpkiMedIssuingCA',
219
+        '1.2.36.1.3.1.1.1.1.2.1*' => 'qgpkiMedIssuingIndividual',
220
+        '1.2.36.1.3.1.1.1.1.2.2*' => 'qgpkiMedIssuingDeviceControl',
221
+        '1.2.36.1.3.1.1.1.1.2.3*' => 'qgpkiMedIssuingDevice',
222
+        '1.2.36.1.3.1.1.1.1.2.4*' => 'qgpkiMedIssuingAuthorisedParty',
223
+        '1.2.36.1.3.1.1.1.1.2.5*' => 'qgpkiMedIssuingClientAuth',
224
+        '1.2.36.1.3.1.1.1.1.2.6*' => 'qgpkiMedIssuingServerAuth',
225
+        '1.2.36.1.3.1.1.1.1.2.7*' => 'qgpkiMedIssuingDataProt',
226
+        '1.2.36.1.3.1.1.1.1.2.8*' => 'qgpkiMedIssuingTokenAuth',
227
+        '1.2.36.1.3.1.1.1.1.3*' => 'qgpkiBasicIntermedCA',
228
+        '1.2.36.1.3.1.1.1.1.3.1*' => 'qgpkiBasicIntermedDeviceSystem',
229
+        '1.2.36.1.3.1.1.1.1.4*' => 'qgpkiBasicIssuingCA',
230
+        '1.2.36.1.3.1.1.1.1.4.1*' => 'qgpkiBasicIssuingClientAuth',
231
+        '1.2.36.1.3.1.1.1.1.4.2*' => 'qgpkiBasicIssuingServerAuth',
232
+        '1.2.36.1.3.1.1.1.1.4.3*' => 'qgpkiBasicIssuingDataSigning',
233
+        '1.2.36.1.3.1.1.1.2*' => 'qgpkiAssuranceLevel',
234
+        '1.2.36.1.3.1.1.1.2.1*' => 'qgpkiAssuranceRudimentary',
235
+        '1.2.36.1.3.1.1.1.2.2*' => 'qgpkiAssuranceBasic',
236
+        '1.2.36.1.3.1.1.1.2.3*' => 'qgpkiAssuranceMedium',
237
+        '1.2.36.1.3.1.1.1.2.4*' => 'qgpkiAssuranceHigh',
238
+        '1.2.36.1.3.1.1.1.3*' => 'qgpkiCertFunction',
239
+        '1.2.36.1.3.1.1.1.3.1*' => 'qgpkiFunctionIndividual',
240
+        '1.2.36.1.3.1.1.1.3.2*' => 'qgpkiFunctionDevice',
241
+        '1.2.36.1.3.1.1.1.3.3*' => 'qgpkiFunctionAuthorisedParty',
242
+        '1.2.36.1.3.1.1.1.3.4*' => 'qgpkiFunctionDeviceControl',
243
+        '1.2.36.1.3.1.2*' => 'qpspki',
244
+        '1.2.36.1.3.1.2.1*' => 'qpspkiPolicies',
245
+        '1.2.36.1.3.1.2.1.2*' => 'qpspkiPolicyBasic',
246
+        '1.2.36.1.3.1.2.1.3*' => 'qpspkiPolicyMedium',
247
+        '1.2.36.1.3.1.2.1.4*' => 'qpspkiPolicyHigh',
248
+        '1.2.36.1.3.1.3.2*' => 'qtmrpki',
249
+        '1.2.36.1.3.1.3.2.1*' => 'qtmrpkiPolicies',
250
+        '1.2.36.1.3.1.3.2.2*' => 'qtmrpkiPurpose',
251
+        '1.2.36.1.3.1.3.2.2.1*' => 'qtmrpkiIndividual',
252
+        '1.2.36.1.3.1.3.2.2.2*' => 'qtmrpkiDeviceControl',
253
+        '1.2.36.1.3.1.3.2.2.3*' => 'qtmrpkiDevice',
254
+        '1.2.36.1.3.1.3.2.2.4*' => 'qtmrpkiAuthorisedParty',
255
+        '1.2.36.1.3.1.3.2.2.5*' => 'qtmrpkiDeviceSystem',
256
+        '1.2.36.1.3.1.3.2.3*' => 'qtmrpkiDevice',
257
+        '1.2.36.1.3.1.3.2.3.1*' => 'qtmrpkiDriverLicense',
258
+        '1.2.36.1.3.1.3.2.3.2*' => 'qtmrpkiIndustryAuthority',
259
+        '1.2.36.1.3.1.3.2.3.3*' => 'qtmrpkiMarineLicense',
260
+        '1.2.36.1.3.1.3.2.3.4*' => 'qtmrpkiAdultProofOfAge',
261
+        '1.2.36.1.3.1.3.2.3.5*' => 'qtmrpkiSam',
262
+        '1.2.36.1.3.1.3.2.4*' => 'qtmrpkiAuthorisedParty',
263
+        '1.2.36.1.3.1.3.2.4.1*' => 'qtmrpkiTransportInspector',
264
+        '1.2.36.1.3.1.3.2.4.2*' => 'qtmrpkiPoliceOfficer',
265
+        '1.2.36.1.3.1.3.2.4.3*' => 'qtmrpkiSystem',
266
+        '1.2.36.1.3.1.3.2.4.4*' => 'qtmrpkiLiquorLicensingInspector',
267
+        '1.2.36.1.3.1.3.2.4.5*' => 'qtmrpkiMarineEnforcementOfficer',
268
+        '1.2.36.1.333.1*' => 'australianBusinessNumber',
269
+        '1.2.36.68980861.1.1.2*' => 'signetPersonal',
270
+        '1.2.36.68980861.1.1.3*' => 'signetBusiness',
271
+        '1.2.36.68980861.1.1.4*' => 'signetLegal',
272
+        '1.2.36.68980861.1.1.10*' => 'signetPilot',
273
+        '1.2.36.68980861.1.1.11*' => 'signetIntraNet',
274
+        '1.2.36.68980861.1.1.20*' => 'signetPolicy',
275
+        '1.2.36.75878867.1.100.1.1*' => 'certificatesAustraliaPolicy',
276
+        '1.2.392.200011.61.1.1.1*' => 'mitsubishiSecurityAlgorithm',
277
+        '1.2.392.200011.61.1.1.1.1*' => 'misty1-cbc',
278
+        '1.2.410.200004.1.4*' => 'seedCBC',
279
+        '1.2.410.200004.1.7*' => 'seedMAC',
280
+        '1.2.410.200004.1.15*' => 'pbeWithSHA1AndSEED-CBC',
281
+        '1.2.410.200046.1.1*' => 'aria1AlgorithmModes',
282
+        '1.2.410.200046.1.1.1*' => 'aria128-ecb',
283
+        '1.2.410.200046.1.1.2*' => 'aria128-cbc',
284
+        '1.2.410.200046.1.1.3*' => 'aria128-cfb',
285
+        '1.2.410.200046.1.1.4*' => 'aria128-ofb',
286
+        '1.2.410.200046.1.1.5*' => 'aria128-ctr',
287
+        '1.2.410.200046.1.1.6*' => 'aria192-ecb',
288
+        '1.2.410.200046.1.1.7*' => 'aria192-cbc',
289
+        '1.2.410.200046.1.1.8*' => 'aria192-cfb',
290
+        '1.2.410.200046.1.1.9*' => 'aria192-ofb',
291
+        '1.2.410.200046.1.1.10*' => 'aria192-ctr',
292
+        '1.2.410.200046.1.1.11*' => 'aria256-ecb',
293
+        '1.2.410.200046.1.1.12*' => 'aria256-cbc',
294
+        '1.2.410.200046.1.1.13*' => 'aria256-ctr',
295
+        '1.2.410.200046.1.1.21*' => 'aria128-cmac',
296
+        '1.2.410.200046.1.1.22*' => 'aria192-cmac',
297
+        '1.2.410.200046.1.1.23*' => 'aria256-cmac',
298
+        '1.2.410.200046.1.1.31*' => 'aria128-ocb2',
299
+        '1.2.410.200046.1.1.32*' => 'aria192-ocb2',
300
+        '1.2.410.200046.1.1.33*' => 'aria256-ocb2',
301
+        '1.2.410.200046.1.1.34*' => 'aria128-gcm',
302
+        '1.2.410.200046.1.1.35*' => 'aria192-gcm',
303
+        '1.2.410.200046.1.1.36*' => 'aria256-gcm',
304
+        '1.2.410.200046.1.1.37*' => 'aria128-ccm',
305
+        '1.2.410.200046.1.1.38*' => 'aria192-ccm',
306
+        '1.2.410.200046.1.1.39*' => 'aria256-ccm',
307
+        '1.2.410.200046.1.1.40*' => 'aria128-keywrap',
308
+        '1.2.410.200046.1.1.41*' => 'aria192-keywrap',
309
+        '1.2.410.200046.1.1.42*' => 'aria256-keywrap',
310
+        '1.2.410.200046.1.1.43*' => 'aria128-keywrapWithPad',
311
+        '1.2.410.200046.1.1.44*' => 'aria192-keywrapWithPad',
312
+        '1.2.410.200046.1.1.45*' => 'aria256-keywrapWithPad',
313
+        '1.2.643.2.2.3*' => 'gostSignature',
314
+        '1.2.643.2.2.4*' => 'gost94Signature',
315
+        '1.2.643.2.2.20*' => 'gost94PublicKey',
316
+        '1.2.643.2.2.19*' => 'gostPublicKey',
317
+        '1.2.643.2.2.21*' => 'gostCipher',
318
+        '1.2.643.2.2.31.0*' => 'testCipherParams',
319
+        '1.2.643.2.2.31.1*' => 'cryptoProCipherA',
320
+        '1.2.643.2.2.31.2*' => 'cryptoProCipherB',
321
+        '1.2.643.2.2.31.3*' => 'cryptoProCipherC',
322
+        '1.2.643.2.2.31.4*' => 'cryptoProCipherD',
323
+        '1.2.643.2.2.31.5*' => 'oscar11Cipher',
324
+        '1.2.643.2.2.31.6*' => 'oscar10Cipher',
325
+        '1.2.643.2.2.31.7*' => 'ric1Cipher',
326
+        '1.2.643.2.2.9*' => 'gostDigest',
327
+        '1.2.643.2.2.30.0*' => 'testDigestParams',
328
+        '1.2.643.2.2.30.1*' => 'cryptoProDigestA',
329
+        '1.2.643.2.2.35.0*' => 'testSignParams',
330
+        '1.2.643.2.2.35.1*' => 'cryptoProSignA',
331
+        '1.2.643.2.2.35.2*' => 'cryptoProSignB',
332
+        '1.2.643.2.2.35.3*' => 'cryptoProSignC',
333
+        '1.2.643.2.2.36.0*' => 'cryptoProSignXA',
334
+        '1.2.643.2.2.36.1*' => 'cryptoProSignXB',
335
+        '1.2.643.2.2.14.0*' => 'nullMeshing',
336
+        '1.2.643.2.2.14.1*' => 'cryptoProMeshing',
337
+        '1.2.643.2.2.10*' => 'hmacGost',
338
+        '1.2.643.2.2.13.0*' => 'gostWrap',
339
+        '1.2.643.2.2.13.1*' => 'cryptoProWrap',
340
+        '1.2.643.2.2.96*' => 'cryptoProECDHWrap',
341
+        '1.2.752.34.1*' => 'seis-cp',
342
+        '1.2.752.34.1.1*' => 'SEIS high-assurance policyIdentifier',
343
+        '1.2.752.34.1.2*' => 'SEIS GAK policyIdentifier',
344
+        '1.2.752.34.2*' => 'SEIS pe',
345
+        '1.2.752.34.3*' => 'SEIS at',
346
+        '1.2.752.34.3.1*' => 'SEIS at-personalIdentifier',
347
+        '1.2.840.10040.1*' => 'module',
348
+        '1.2.840.10040.1.1*' => 'x9f1-cert-mgmt',
349
+        '1.2.840.10040.2*' => 'holdinstruction',
350
+        '1.2.840.10040.2.1*' => 'holdinstruction-none',
351
+        '1.2.840.10040.2.2*' => 'callissuer',
352
+        '1.2.840.10040.2.3*' => 'reject',
353
+        '1.2.840.10040.2.4*' => 'pickupToken',
354
+        '1.2.840.10040.3*' => 'attribute',
355
+        '1.2.840.10040.3.1*' => 'countersignature',
356
+        '1.2.840.10040.3.2*' => 'attribute-cert',
357
+        '1.2.840.10040.4*' => 'algorithm',
358
+        '1.2.840.10040.4.1*' => 'dsa',
359
+        '1.2.840.10040.4.2*' => 'dsa-match',
360
+        '1.2.840.10040.4.3*' => 'dsaWithSha1',
361
+        '1.2.840.10045.1*' => 'fieldType',
362
+        '1.2.840.10045.1.1*' => 'prime-field',
363
+        '1.2.840.10045.1.2*' => 'characteristic-two-field',
364
+        '1.2.840.10045.1.2.3*' => 'characteristic-two-basis',
365
+        '1.2.840.10045.1.2.3.1*' => 'onBasis',
366
+        '1.2.840.10045.1.2.3.2*' => 'tpBasis',
367
+        '1.2.840.10045.1.2.3.3*' => 'ppBasis',
368
+        '1.2.840.10045.2*' => 'publicKeyType',
369
+        '1.2.840.10045.2.1*' => 'ecPublicKey',
370
+        '1.2.840.10045.3.0.1*' => 'c2pnb163v1',
371
+        '1.2.840.10045.3.0.2*' => 'c2pnb163v2',
372
+        '1.2.840.10045.3.0.3*' => 'c2pnb163v3',
373
+        '1.2.840.10045.3.0.5*' => 'c2tnb191v1',
374
+        '1.2.840.10045.3.0.6*' => 'c2tnb191v2',
375
+        '1.2.840.10045.3.0.7*' => 'c2tnb191v3',
376
+        '1.2.840.10045.3.0.10*' => 'c2pnb208w1',
377
+        '1.2.840.10045.3.0.11*' => 'c2tnb239v1',
378
+        '1.2.840.10045.3.0.12*' => 'c2tnb239v2',
379
+        '1.2.840.10045.3.0.13*' => 'c2tnb239v3',
380
+        '1.2.840.10045.3.0.16*' => 'c2pnb272w1',
381
+        '1.2.840.10045.3.0.18*' => 'c2tnb359v1',
382
+        '1.2.840.10045.3.0.19*' => 'c2pnb368w1',
383
+        '1.2.840.10045.3.0.20*' => 'c2tnb431r1',
384
+        '1.2.840.10045.3.1.1*' => 'ansiX9p192r1',
385
+        '1.2.840.10045.3.1.1.1*' => 'prime192v1',
386
+        '1.2.840.10045.3.1.1.2*' => 'prime192v2',
387
+        '1.2.840.10045.3.1.1.3*' => 'prime192v3',
388
+        '1.2.840.10045.3.1.1.4*' => 'prime239v1',
389
+        '1.2.840.10045.3.1.1.5*' => 'prime239v2',
390
+        '1.2.840.10045.3.1.1.6*' => 'prime239v3',
391
+        '1.2.840.10045.3.1.1.7*' => 'prime256v1',
392
+        '1.2.840.10045.3.1.7*' => 'ansiX9p256r1',
393
+        '1.2.840.10045.4.1*' => 'ecdsaWithSHA1',
394
+        '1.2.840.10045.4.2*' => 'ecdsaWithRecommended',
395
+        '1.2.840.10045.4.3*' => 'ecdsaWithSpecified',
396
+        '1.2.840.10045.4.3.1*' => 'ecdsaWithSHA224',
397
+        '1.2.840.10045.4.3.2*' => 'ecdsaWithSHA256',
398
+        '1.2.840.10045.4.3.3*' => 'ecdsaWithSHA384',
399
+        '1.2.840.10045.4.3.4*' => 'ecdsaWithSHA512',
400
+        '1.2.840.10046.1*' => 'fieldType',
401
+        '1.2.840.10046.1.1*' => 'gf-prime',
402
+        '1.2.840.10046.2*' => 'numberType',
403
+        '1.2.840.10046.2.1*' => 'dhPublicKey',
404
+        '1.2.840.10046.3*' => 'scheme',
405
+        '1.2.840.10046.3.1*' => 'dhStatic',
406
+        '1.2.840.10046.3.2*' => 'dhEphem',
407
+        '1.2.840.10046.3.3*' => 'dhHybrid1',
408
+        '1.2.840.10046.3.4*' => 'dhHybrid2',
409
+        '1.2.840.10046.3.5*' => 'mqv2',
410
+        '1.2.840.10046.3.6*' => 'mqv1',
411
+        '1.2.840.10065.2.2*' => '?',
412
+        '1.2.840.10065.2.3*' => 'healthcareLicense',
413
+        '1.2.840.10065.2.3.1.1*' => 'license?',
414
+        '1.2.840.113533.7*' => 'nsn',
415
+        '1.2.840.113533.7.65*' => 'nsn-ce',
416
+        '1.2.840.113533.7.65.0*' => 'entrustVersInfo',
417
+        '1.2.840.113533.7.66*' => 'nsn-alg',
418
+        '1.2.840.113533.7.66.3*' => 'cast3CBC',
419
+        '1.2.840.113533.7.66.10*' => 'cast5CBC',
420
+        '1.2.840.113533.7.66.11*' => 'cast5MAC',
421
+        '1.2.840.113533.7.66.12*' => 'pbeWithMD5AndCAST5-CBC',
422
+        '1.2.840.113533.7.66.13*' => 'passwordBasedMac',
423
+        '1.2.840.113533.7.67*' => 'nsn-oc',
424
+        '1.2.840.113533.7.67.0*' => 'entrustUser',
425
+        '1.2.840.113533.7.68*' => 'nsn-at',
426
+        '1.2.840.113533.7.68.0*' => 'entrustCAInfo',
427
+        '1.2.840.113533.7.68.10*' => 'attributeCertificate',
428
+        '1.2.840.113549.1.1*' => 'pkcs-1',
429
+        '1.2.840.113549.1.1.1*' => 'rsaEncryption',
430
+        '1.2.840.113549.1.1.2*' => 'md2WithRSAEncryption',
431
+        '1.2.840.113549.1.1.3*' => 'md4WithRSAEncryption',
432
+        '1.2.840.113549.1.1.4*' => 'md5WithRSAEncryption',
433
+        '1.2.840.113549.1.1.5*' => 'sha1WithRSAEncryption',
434
+        '1.2.840.113549.1.1.7*' => 'rsaOAEP',
435
+        '1.2.840.113549.1.1.8*' => 'pkcs1-MGF',
436
+        '1.2.840.113549.1.1.9*' => 'rsaOAEP-pSpecified',
437
+        '1.2.840.113549.1.1.10*' => 'rsaPSS',
438
+        '1.2.840.113549.1.1.11*' => 'sha256WithRSAEncryption',
439
+        '1.2.840.113549.1.1.12*' => 'sha384WithRSAEncryption',
440
+        '1.2.840.113549.1.1.13*' => 'sha512WithRSAEncryption',
441
+        '1.2.840.113549.1.1.14*' => 'sha224WithRSAEncryption',
442
+        '1.2.840.113549.1.1.6*' => 'rsaOAEPEncryptionSET',
443
+        '1.2.840.113549.1.2*' => 'bsafeRsaEncr',
444
+        '1.2.840.113549.1.3*' => 'pkcs-3',
445
+        '1.2.840.113549.1.3.1*' => 'dhKeyAgreement',
446
+        '1.2.840.113549.1.5*' => 'pkcs-5',
447
+        '1.2.840.113549.1.5.1*' => 'pbeWithMD2AndDES-CBC',
448
+        '1.2.840.113549.1.5.3*' => 'pbeWithMD5AndDES-CBC',
449
+        '1.2.840.113549.1.5.4*' => 'pbeWithMD2AndRC2-CBC',
450
+        '1.2.840.113549.1.5.6*' => 'pbeWithMD5AndRC2-CBC',
451
+        '1.2.840.113549.1.5.9*' => 'pbeWithMD5AndXOR',
452
+        '1.2.840.113549.1.5.10*' => 'pbeWithSHAAndDES-CBC',
453
+        '1.2.840.113549.1.5.12*' => 'pkcs5PBKDF2',
454
+        '1.2.840.113549.1.5.13*' => 'pkcs5PBES2',
455
+        '1.2.840.113549.1.5.14*' => 'pkcs5PBMAC1',
456
+        '1.2.840.113549.1.7*' => 'pkcs-7',
457
+        '1.2.840.113549.1.7.1*' => 'data',
458
+        '1.2.840.113549.1.7.2*' => 'signedData',
459
+        '1.2.840.113549.1.7.3*' => 'envelopedData',
460
+        '1.2.840.113549.1.7.4*' => 'signedAndEnvelopedData',
461
+        '1.2.840.113549.1.7.5*' => 'digestedData',
462
+        '1.2.840.113549.1.7.6*' => 'encryptedData',
463
+        '1.2.840.113549.1.7.7*' => 'dataWithAttributes',
464
+        '1.2.840.113549.1.7.8*' => 'encryptedPrivateKeyInfo',
465
+        '1.2.840.113549.1.9*' => 'pkcs-9',
466
+        '1.2.840.113549.1.9.1*' => 'emailAddress',
467
+        '1.2.840.113549.1.9.2*' => 'unstructuredName',
468
+        '1.2.840.113549.1.9.3*' => 'contentType',
469
+        '1.2.840.113549.1.9.4*' => 'messageDigest',
470
+        '1.2.840.113549.1.9.5*' => 'signingTime',
471
+        '1.2.840.113549.1.9.6*' => 'countersignature',
472
+        '1.2.840.113549.1.9.7*' => 'challengePassword',
473
+        '1.2.840.113549.1.9.8*' => 'unstructuredAddress',
474
+        '1.2.840.113549.1.9.9*' => 'extendedCertificateAttributes',
475
+        '1.2.840.113549.1.9.10*' => 'issuerAndSerialNumber',
476
+        '1.2.840.113549.1.9.11*' => 'passwordCheck',
477
+        '1.2.840.113549.1.9.12*' => 'publicKey',
478
+        '1.2.840.113549.1.9.13*' => 'signingDescription',
479
+        '1.2.840.113549.1.9.14*' => 'extensionRequest',
480
+        '1.2.840.113549.1.9.15*' => 'sMIMECapabilities',
481
+        '1.2.840.113549.1.9.15.1*' => 'preferSignedData',
482
+        '1.2.840.113549.1.9.15.2*' => 'canNotDecryptAny',
483
+        '1.2.840.113549.1.9.15.3*' => 'receiptRequest',
484
+        '1.2.840.113549.1.9.15.4*' => 'receipt',
485
+        '1.2.840.113549.1.9.15.5*' => 'contentHints',
486
+        '1.2.840.113549.1.9.15.6*' => 'mlExpansionHistory',
487
+        '1.2.840.113549.1.9.16*' => 'id-sMIME',
488
+        '1.2.840.113549.1.9.16.0*' => 'id-mod',
489
+        '1.2.840.113549.1.9.16.0.1*' => 'id-mod-cms',
490
+        '1.2.840.113549.1.9.16.0.2*' => 'id-mod-ess',
491
+        '1.2.840.113549.1.9.16.0.3*' => 'id-mod-oid',
492
+        '1.2.840.113549.1.9.16.0.4*' => 'id-mod-msg-v3',
493
+        '1.2.840.113549.1.9.16.0.5*' => 'id-mod-ets-eSignature-88',
494
+        '1.2.840.113549.1.9.16.0.6*' => 'id-mod-ets-eSignature-97',
495
+        '1.2.840.113549.1.9.16.0.7*' => 'id-mod-ets-eSigPolicy-88',
496
+        '1.2.840.113549.1.9.16.0.8*' => 'id-mod-ets-eSigPolicy-88',
497
+        '1.2.840.113549.1.9.16.1*' => 'contentType',
498
+        '1.2.840.113549.1.9.16.1.1*' => 'receipt',
499
+        '1.2.840.113549.1.9.16.1.2*' => 'authData',
500
+        '1.2.840.113549.1.9.16.1.3*' => 'publishCert',
501
+        '1.2.840.113549.1.9.16.1.4*' => 'tSTInfo',
502
+        '1.2.840.113549.1.9.16.1.5*' => 'tDTInfo',
503
+        '1.2.840.113549.1.9.16.1.6*' => 'contentInfo',
504
+        '1.2.840.113549.1.9.16.1.7*' => 'dVCSRequestData',
505
+        '1.2.840.113549.1.9.16.1.8*' => 'dVCSResponseData',
506
+        '1.2.840.113549.1.9.16.1.9*' => 'compressedData',
507
+        '1.2.840.113549.1.9.16.1.10*' => 'scvpCertValRequest',
508
+        '1.2.840.113549.1.9.16.1.11*' => 'scvpCertValResponse',
509
+        '1.2.840.113549.1.9.16.1.12*' => 'scvpValPolRequest',
510
+        '1.2.840.113549.1.9.16.1.13*' => 'scvpValPolResponse',
511
+        '1.2.840.113549.1.9.16.1.14*' => 'attrCertEncAttrs',
512
+        '1.2.840.113549.1.9.16.1.15*' => 'tSReq',
513
+        '1.2.840.113549.1.9.16.1.16*' => 'firmwarePackage',
514
+        '1.2.840.113549.1.9.16.1.17*' => 'firmwareLoadReceipt',
515
+        '1.2.840.113549.1.9.16.1.18*' => 'firmwareLoadError',
516
+        '1.2.840.113549.1.9.16.1.19*' => 'contentCollection',
517
+        '1.2.840.113549.1.9.16.1.20*' => 'contentWithAttrs',
518
+        '1.2.840.113549.1.9.16.1.21*' => 'encKeyWithID',
519
+        '1.2.840.113549.1.9.16.1.22*' => 'encPEPSI',
520
+        '1.2.840.113549.1.9.16.1.23*' => 'authEnvelopedData',
521
+        '1.2.840.113549.1.9.16.1.24*' => 'routeOriginAttest',
522
+        '1.2.840.113549.1.9.16.1.25*' => 'symmetricKeyPackage',
523
+        '1.2.840.113549.1.9.16.1.26*' => 'rpkiManifest',
524
+        '1.2.840.113549.1.9.16.1.27*' => 'asciiTextWithCRLF',
525
+        '1.2.840.113549.1.9.16.1.28*' => 'xml',
526
+        '1.2.840.113549.1.9.16.1.29*' => 'pdf',
527
+        '1.2.840.113549.1.9.16.1.30*' => 'postscript',
528
+        '1.2.840.113549.1.9.16.1.31*' => 'timestampedData',
529
+        '1.2.840.113549.1.9.16.1.32*' => 'asAdjacencyAttest',
530
+        '1.2.840.113549.1.9.16.1.33*' => 'rpkiTrustAnchor',
531
+        '1.2.840.113549.1.9.16.1.34*' => 'trustAnchorList',
532
+        '1.2.840.113549.1.9.16.2*' => 'authenticatedAttributes',
533
+        '1.2.840.113549.1.9.16.2.1*' => 'receiptRequest',
534
+        '1.2.840.113549.1.9.16.2.2*' => 'securityLabel',
535
+        '1.2.840.113549.1.9.16.2.3*' => 'mlExpandHistory',
536
+        '1.2.840.113549.1.9.16.2.4*' => 'contentHint',
537
+        '1.2.840.113549.1.9.16.2.5*' => 'msgSigDigest',
538
+        '1.2.840.113549.1.9.16.2.6*' => 'encapContentType',
539
+        '1.2.840.113549.1.9.16.2.7*' => 'contentIdentifier',
540
+        '1.2.840.113549.1.9.16.2.8*' => 'macValue',
541
+        '1.2.840.113549.1.9.16.2.9*' => 'equivalentLabels',
542
+        '1.2.840.113549.1.9.16.2.10*' => 'contentReference',
543
+        '1.2.840.113549.1.9.16.2.11*' => 'encrypKeyPref',
544
+        '1.2.840.113549.1.9.16.2.12*' => 'signingCertificate',
545
+        '1.2.840.113549.1.9.16.2.13*' => 'smimeEncryptCerts',
546
+        '1.2.840.113549.1.9.16.2.14*' => 'timeStampToken',
547
+        '1.2.840.113549.1.9.16.2.15*' => 'sigPolicyId',
548
+        '1.2.840.113549.1.9.16.2.16*' => 'commitmentType',
549
+        '1.2.840.113549.1.9.16.2.17*' => 'signerLocation',
550
+        '1.2.840.113549.1.9.16.2.18*' => 'signerAttr',
551
+        '1.2.840.113549.1.9.16.2.19*' => 'otherSigCert',
552
+        '1.2.840.113549.1.9.16.2.20*' => 'contentTimestamp',
553
+        '1.2.840.113549.1.9.16.2.21*' => 'certificateRefs',
554
+        '1.2.840.113549.1.9.16.2.22*' => 'revocationRefs',
555
+        '1.2.840.113549.1.9.16.2.23*' => 'certValues',
556
+        '1.2.840.113549.1.9.16.2.24*' => 'revocationValues',
557
+        '1.2.840.113549.1.9.16.2.25*' => 'escTimeStamp',
558
+        '1.2.840.113549.1.9.16.2.26*' => 'certCRLTimestamp',
559
+        '1.2.840.113549.1.9.16.2.27*' => 'archiveTimeStamp',
560
+        '1.2.840.113549.1.9.16.2.28*' => 'signatureType',
561
+        '1.2.840.113549.1.9.16.2.29*' => 'dvcsDvc',
562
+        '1.2.840.113549.1.9.16.2.30*' => 'cekReference',
563
+        '1.2.840.113549.1.9.16.2.31*' => 'maxCEKDecrypts',
564
+        '1.2.840.113549.1.9.16.2.32*' => 'kekDerivationAlg',
565
+        '1.2.840.113549.1.9.16.2.33*' => 'intendedRecipients',
566
+        '1.2.840.113549.1.9.16.2.34*' => 'cmcUnsignedData',
567
+        '1.2.840.113549.1.9.16.2.35*' => 'fwPackageID',
568
+        '1.2.840.113549.1.9.16.2.36*' => 'fwTargetHardwareIDs',
569
+        '1.2.840.113549.1.9.16.2.37*' => 'fwDecryptKeyID',
570
+        '1.2.840.113549.1.9.16.2.38*' => 'fwImplCryptAlgs',
571
+        '1.2.840.113549.1.9.16.2.39*' => 'fwWrappedFirmwareKey',
572
+        '1.2.840.113549.1.9.16.2.40*' => 'fwCommunityIdentifiers',
573
+        '1.2.840.113549.1.9.16.2.41*' => 'fwPkgMessageDigest',
574
+        '1.2.840.113549.1.9.16.2.42*' => 'fwPackageInfo',
575
+        '1.2.840.113549.1.9.16.2.43*' => 'fwImplCompressAlgs',
576
+        '1.2.840.113549.1.9.16.2.44*' => 'etsAttrCertificateRefs',
577
+        '1.2.840.113549.1.9.16.2.45*' => 'etsAttrRevocationRefs',
578
+        '1.2.840.113549.1.9.16.2.46*' => 'binarySigningTime',
579
+        '1.2.840.113549.1.9.16.2.47*' => 'signingCertificateV2',
580
+        '1.2.840.113549.1.9.16.2.48*' => 'etsArchiveTimeStampV2',
581
+        '1.2.840.113549.1.9.16.2.49*' => 'erInternal',
582
+        '1.2.840.113549.1.9.16.2.50*' => 'erExternal',
583
+        '1.2.840.113549.1.9.16.2.51*' => 'multipleSignatures',
584
+        '1.2.840.113549.1.9.16.3.1*' => 'esDHwith3DES',
585
+        '1.2.840.113549.1.9.16.3.2*' => 'esDHwithRC2',
586
+        '1.2.840.113549.1.9.16.3.3*' => '3desWrap',
587
+        '1.2.840.113549.1.9.16.3.4*' => 'rc2Wrap',
588
+        '1.2.840.113549.1.9.16.3.5*' => 'esDH',
589
+        '1.2.840.113549.1.9.16.3.6*' => 'cms3DESwrap',
590
+        '1.2.840.113549.1.9.16.3.7*' => 'cmsRC2wrap',
591
+        '1.2.840.113549.1.9.16.3.8*' => 'zlib',
592
+        '1.2.840.113549.1.9.16.3.9*' => 'pwriKEK',
593
+        '1.2.840.113549.1.9.16.3.10*' => 'ssDH',
594
+        '1.2.840.113549.1.9.16.3.11*' => 'hmacWith3DESwrap',
595
+        '1.2.840.113549.1.9.16.3.12*' => 'hmacWithAESwrap',
596
+        '1.2.840.113549.1.9.16.3.13*' => 'md5XorExperiment',
597
+        '1.2.840.113549.1.9.16.3.14*' => 'rsaKEM',
598
+        '1.2.840.113549.1.9.16.3.15*' => 'authEnc128',
599
+        '1.2.840.113549.1.9.16.3.16*' => 'authEnc256',
600
+        '1.2.840.113549.1.9.16.4.1*' => 'certDist-ldap',
601
+        '1.2.840.113549.1.9.16.5.1*' => 'sigPolicyQualifier-spuri x',
602
+        '1.2.840.113549.1.9.16.5.2*' => 'sigPolicyQualifier-spUserNotice',
603
+        '1.2.840.113549.1.9.16.6.1*' => 'proofOfOrigin',
604
+        '1.2.840.113549.1.9.16.6.2*' => 'proofOfReceipt',
605
+        '1.2.840.113549.1.9.16.6.3*' => 'proofOfDelivery',
606
+        '1.2.840.113549.1.9.16.6.4*' => 'proofOfSender',
607
+        '1.2.840.113549.1.9.16.6.5*' => 'proofOfApproval',
608
+        '1.2.840.113549.1.9.16.6.6*' => 'proofOfCreation',
609
+        '1.2.840.113549.1.9.16.8.1*' => 'glUseKEK',
610
+        '1.2.840.113549.1.9.16.8.2*' => 'glDelete',
611
+        '1.2.840.113549.1.9.16.8.3*' => 'glAddMember',
612
+        '1.2.840.113549.1.9.16.8.4*' => 'glDeleteMember',
613
+        '1.2.840.113549.1.9.16.8.5*' => 'glRekey',
614
+        '1.2.840.113549.1.9.16.8.6*' => 'glAddOwner',
615
+        '1.2.840.113549.1.9.16.8.7*' => 'glRemoveOwner',
616
+        '1.2.840.113549.1.9.16.8.8*' => 'glkCompromise',
617
+        '1.2.840.113549.1.9.16.8.9*' => 'glkRefresh',
618
+        '1.2.840.113549.1.9.16.8.10*' => 'glFailInfo',
619
+        '1.2.840.113549.1.9.16.8.11*' => 'glaQueryRequest',
620
+        '1.2.840.113549.1.9.16.8.12*' => 'glaQueryResponse',
621
+        '1.2.840.113549.1.9.16.8.13*' => 'glProvideCert',
622
+        '1.2.840.113549.1.9.16.8.14*' => 'glUpdateCert',
623
+        '1.2.840.113549.1.9.16.8.15*' => 'glKey',
624
+        '1.2.840.113549.1.9.16.9*' => 'signatureTypeIdentifier',
625
+        '1.2.840.113549.1.9.16.9.1*' => 'originatorSig',
626
+        '1.2.840.113549.1.9.16.9.2*' => 'domainSig',
627
+        '1.2.840.113549.1.9.16.9.3*' => 'additionalAttributesSig',
628
+        '1.2.840.113549.1.9.16.9.4*' => 'reviewSig',
629
+        '1.2.840.113549.1.9.16.11*' => 'capabilities',
630
+        '1.2.840.113549.1.9.16.11.1*' => 'preferBinaryInside',
631
+        '1.2.840.113549.1.9.20*' => 'friendlyName (for PKCS #12)',
632
+        '1.2.840.113549.1.9.21*' => 'localKeyID (for PKCS #12)',
633
+        '1.2.840.113549.1.9.22*' => 'certTypes (for PKCS #12)',
634
+        '1.2.840.113549.1.9.22.1*' => 'x509Certificate (for PKCS #12)',
635
+        '1.2.840.113549.1.9.22.2*' => 'sdsiCertificate (for PKCS #12)',
636
+        '1.2.840.113549.1.9.23*' => 'crlTypes (for PKCS #12)',
637
+        '1.2.840.113549.1.9.23.1*' => 'x509Crl (for PKCS #12)',
638
+        '1.2.840.113549.1.9.24*' => 'pkcs9objectClass',
639
+        '1.2.840.113549.1.9.25*' => 'pkcs9attributes',
640
+        '1.2.840.113549.1.9.25.1*' => 'pkcs15Token',
641
+        '1.2.840.113549.1.9.25.2*' => 'encryptedPrivateKeyInfo',
642
+        '1.2.840.113549.1.9.25.3*' => 'randomNonce',
643
+        '1.2.840.113549.1.9.25.4*' => 'sequenceNumber',
644
+        '1.2.840.113549.1.9.25.5*' => 'pkcs7PDU',
645
+        '1.2.840.113549.1.9.26*' => 'pkcs9syntax',
646
+        '1.2.840.113549.1.9.27*' => 'pkcs9matchingRules',
647
+        '1.2.840.113549.1.12*' => 'pkcs-12',
648
+        '1.2.840.113549.1.12.1*' => 'pkcs-12-PbeIds',
649
+        '1.2.840.113549.1.12.1.1*' => 'pbeWithSHAAnd128BitRC4',
650
+        '1.2.840.113549.1.12.1.2*' => 'pbeWithSHAAnd40BitRC4',
651
+        '1.2.840.113549.1.12.1.3*' => 'pbeWithSHAAnd3-KeyTripleDES-CBC',
652
+        '1.2.840.113549.1.12.1.4*' => 'pbeWithSHAAnd2-KeyTripleDES-CBC',
653
+        '1.2.840.113549.1.12.1.5*' => 'pbeWithSHAAnd128BitRC2-CBC',
654
+        '1.2.840.113549.1.12.1.6*' => 'pbeWithSHAAnd40BitRC2-CBC',
655
+        '1.2.840.113549.1.12.2*' => 'pkcs-12-ESPVKID',
656
+        '1.2.840.113549.1.12.2.1*' => 'pkcs-12-PKCS8KeyShrouding',
657
+        '1.2.840.113549.1.12.3*' => 'pkcs-12-BagIds',
658
+        '1.2.840.113549.1.12.3.1*' => 'pkcs-12-keyBagId',
659
+        '1.2.840.113549.1.12.3.2*' => 'pkcs-12-certAndCRLBagId',
660
+        '1.2.840.113549.1.12.3.3*' => 'pkcs-12-secretBagId',
661
+        '1.2.840.113549.1.12.3.4*' => 'pkcs-12-safeContentsId',
662
+        '1.2.840.113549.1.12.3.5*' => 'pkcs-12-pkcs-8ShroudedKeyBagId',
663
+        '1.2.840.113549.1.12.4*' => 'pkcs-12-CertBagID',
664
+        '1.2.840.113549.1.12.4.1*' => 'pkcs-12-X509CertCRLBagID',
665
+        '1.2.840.113549.1.12.4.2*' => 'pkcs-12-SDSICertBagID',
666
+        '1.2.840.113549.1.12.5*' => 'pkcs-12-OID',
667
+        '1.2.840.113549.1.12.5.1*' => 'pkcs-12-PBEID',
668
+        '1.2.840.113549.1.12.5.1.1*' => 'pkcs-12-PBEWithSha1And128BitRC4',
669
+        '1.2.840.113549.1.12.5.1.2*' => 'pkcs-12-PBEWithSha1And40BitRC4',
670
+        '1.2.840.113549.1.12.5.1.3*' => 'pkcs-12-PBEWithSha1AndTripleDESCBC',
671
+        '1.2.840.113549.1.12.5.1.4*' => 'pkcs-12-PBEWithSha1And128BitRC2CBC',
672
+        '1.2.840.113549.1.12.5.1.5*' => 'pkcs-12-PBEWithSha1And40BitRC2CBC',
673
+        '1.2.840.113549.1.12.5.1.6*' => 'pkcs-12-PBEWithSha1AndRC4',
674
+        '1.2.840.113549.1.12.5.1.7*' => 'pkcs-12-PBEWithSha1AndRC2CBC',
675
+        '1.2.840.113549.1.12.5.2*' => 'pkcs-12-EnvelopingID',
676
+        '1.2.840.113549.1.12.5.2.1*' => 'pkcs-12-RSAEncryptionWith128BitRC4',
677
+        '1.2.840.113549.1.12.5.2.2*' => 'pkcs-12-RSAEncryptionWith40BitRC4',
678
+        '1.2.840.113549.1.12.5.2.3*' => 'pkcs-12-RSAEncryptionWithTripleDES',
679
+        '1.2.840.113549.1.12.5.3*' => 'pkcs-12-SignatureID',
680
+        '1.2.840.113549.1.12.5.3.1*' => 'pkcs-12-RSASignatureWithSHA1Digest',
681
+        '1.2.840.113549.1.12.10*' => 'pkcs-12Version1',
682
+        '1.2.840.113549.1.12.10.1*' => 'pkcs-12BadIds',
683
+        '1.2.840.113549.1.12.10.1.1*' => 'pkcs-12-keyBag',
684
+        '1.2.840.113549.1.12.10.1.2*' => 'pkcs-12-pkcs-8ShroudedKeyBag',
685
+        '1.2.840.113549.1.12.10.1.3*' => 'pkcs-12-certBag',
686
+        '1.2.840.113549.1.12.10.1.4*' => 'pkcs-12-crlBag',
687
+        '1.2.840.113549.1.12.10.1.5*' => 'pkcs-12-secretBag',
688
+        '1.2.840.113549.1.12.10.1.6*' => 'pkcs-12-safeContentsBag',
689
+        '1.2.840.113549.1.15.1*' => 'pkcs15modules',
690
+        '1.2.840.113549.1.15.2*' => 'pkcs15attributes',
691
+        '1.2.840.113549.1.15.3*' => 'pkcs15contentType',
692
+        '1.2.840.113549.1.15.3.1*' => 'pkcs15content',
693
+        '1.2.840.113549.2*' => 'digestAlgorithm',
694
+        '1.2.840.113549.2.2*' => 'md2',
695
+        '1.2.840.113549.2.4*' => 'md4',
696
+        '1.2.840.113549.2.5*' => 'md5',
697
+        '1.2.840.113549.2.7*' => 'hmacWithSHA1',
698
+        '1.2.840.113549.2.8*' => 'hmacWithSHA224',
699
+        '1.2.840.113549.2.9*' => 'hmacWithSHA256',
700
+        '1.2.840.113549.2.10*' => 'hmacWithSHA384',
701
+        '1.2.840.113549.2.11*' => 'hmacWithSHA512',
702
+        '1.2.840.113549.3*' => 'encryptionAlgorithm',
703
+        '1.2.840.113549.3.2*' => 'rc2CBC',
704
+        '1.2.840.113549.3.3*' => 'rc2ECB',
705
+        '1.2.840.113549.3.4*' => 'rc4',
706
+        '1.2.840.113549.3.5*' => 'rc4WithMAC',
707
+        '1.2.840.113549.3.6*' => 'desx-CBC',
708
+        '1.2.840.113549.3.7*' => 'des-EDE3-CBC',
709
+        '1.2.840.113549.3.8*' => 'rc5CBC',
710
+        '1.2.840.113549.3.9*' => 'rc5-CBCPad',
711
+        '1.2.840.113549.3.10*' => 'desCDMF',
712
+        '1.2.840.114021.1.6.1*' => 'Identrus unknown policyIdentifier',
713
+        '1.2.840.114021.4.1*' => 'identrusOCSP',
714
+        '1.2.840.113556.1.2.241*' => 'deliveryMechanism',
715
+        '1.2.840.113556.1.3.0*' => 'site-Addressing',
716
+        '1.2.840.113556.1.3.13*' => 'classSchema',
717
+        '1.2.840.113556.1.3.14*' => 'attributeSchema',
718
+        '1.2.840.113556.1.3.17*' => 'mailbox-Agent',
719
+        '1.2.840.113556.1.3.22*' => 'mailbox',
720
+        '1.2.840.113556.1.3.23*' => 'container',
721
+        '1.2.840.113556.1.3.46*' => 'mailRecipient',
722
+        '1.2.840.113556.1.2.281*' => 'ntSecurityDescriptor',
723
+        '1.2.840.113556.1.4.145*' => 'revision',
724
+        '1.2.840.113556.1.4.1327*' => 'pKIDefaultKeySpec',
725
+        '1.2.840.113556.1.4.1328*' => 'pKIKeyUsage',
726
+        '1.2.840.113556.1.4.1329*' => 'pKIMaxIssuingDepth',
727
+        '1.2.840.113556.1.4.1330*' => 'pKICriticalExtensions',
728
+        '1.2.840.113556.1.4.1331*' => 'pKIExpirationPeriod',
729
+        '1.2.840.113556.1.4.1332*' => 'pKIOverlapPeriod',
730
+        '1.2.840.113556.1.4.1333*' => 'pKIExtendedKeyUsage',
731
+        '1.2.840.113556.1.4.1334*' => 'pKIDefaultCSPs',
732
+        '1.2.840.113556.1.4.1335*' => 'pKIEnrollmentAccess',
733
+        '1.2.840.113556.1.4.1429*' => 'msPKI-RA-Signature',
734
+        '1.2.840.113556.1.4.1430*' => 'msPKI-Enrollment-Flag',
735
+        '1.2.840.113556.1.4.1431*' => 'msPKI-Private-Key-Flag',
736
+        '1.2.840.113556.1.4.1432*' => 'msPKI-Certificate-Name-Flag',
737
+        '1.2.840.113556.1.4.1433*' => 'msPKI-Minimal-Key-Size',
738
+        '1.2.840.113556.1.4.1434*' => 'msPKI-Template-Schema-Version',
739
+        '1.2.840.113556.1.4.1435*' => 'msPKI-Template-Minor-Revision',
740
+        '1.2.840.113556.1.4.1436*' => 'msPKI-Cert-Template-OID',
741
+        '1.2.840.113556.1.4.1437*' => 'msPKI-Supersede-Templates',
742
+        '1.2.840.113556.1.4.1438*' => 'msPKI-RA-Policies',
743
+        '1.2.840.113556.1.4.1439*' => 'msPKI-Certificate-Policy',
744
+        '1.2.840.113556.1.4.1674*' => 'msPKI-Certificate-Application-Policy',
745
+        '1.2.840.113556.1.4.1675*' => 'msPKI-RA-Application-Policies',
746
+        '1.2.840.113556.4.3*' => 'microsoftExcel',
747
+        '1.2.840.113556.4.4*' => 'titledWithOID',
748
+        '1.2.840.113556.4.5*' => 'microsoftPowerPoint',
749
+        '1.2.840.113628.114.1.7*' => 'adobePKCS7',
750
+        '1.2.840.113635.100*' => 'appleDataSecurity',
751
+        '1.2.840.113635.100.1*' => 'appleTrustPolicy',
752
+        '1.2.840.113635.100.1.1*' => 'appleISignTP',
753
+        '1.2.840.113635.100.1.2*' => 'appleX509Basic',
754
+        '1.2.840.113635.100.1.3*' => 'appleSSLPolicy',
755
+        '1.2.840.113635.100.1.4*' => 'appleLocalCertGenPolicy',
756
+        '1.2.840.113635.100.1.5*' => 'appleCSRGenPolicy',
757
+        '1.2.840.113635.100.1.6*' => 'appleCRLPolicy',
758
+        '1.2.840.113635.100.1.7*' => 'appleOCSPPolicy',
759
+        '1.2.840.113635.100.1.8*' => 'appleSMIMEPolicy',
760
+        '1.2.840.113635.100.1.9*' => 'appleEAPPolicy',
761
+        '1.2.840.113635.100.1.10*' => 'appleSWUpdateSigningPolicy',
762
+        '1.2.840.113635.100.1.11*' => 'appleIPSecPolicy',
763
+        '1.2.840.113635.100.1.12*' => 'appleIChatPolicy',
764
+        '1.2.840.113635.100.1.13*' => 'appleResourceSignPolicy',
765
+        '1.2.840.113635.100.1.14*' => 'applePKINITClientPolicy',
766
+        '1.2.840.113635.100.1.15*' => 'applePKINITServerPolicy',
767
+        '1.2.840.113635.100.1.16*' => 'appleCodeSigningPolicy',
768
+        '1.2.840.113635.100.1.17*' => 'applePackageSigningPolicy',
769
+        '1.2.840.113635.100.2*' => 'appleSecurityAlgorithm',
770
+        '1.2.840.113635.100.2.1*' => 'appleFEE',
771
+        '1.2.840.113635.100.2.2*' => 'appleASC',
772
+        '1.2.840.113635.100.2.3*' => 'appleFEE_MD5',
773
+        '1.2.840.113635.100.2.4*' => 'appleFEE_SHA1',
774
+        '1.2.840.113635.100.2.5*' => 'appleFEED',
775
+        '1.2.840.113635.100.2.6*' => 'appleFEEDEXP',
776
+        '1.2.840.113635.100.2.7*' => 'appleECDSA',
777
+        '1.2.840.113635.100.3*' => 'appleDotMacCertificate',
778
+        '1.2.840.113635.100.3.1*' => 'appleDotMacCertificateRequest',
779
+        '1.2.840.113635.100.3.2*' => 'appleDotMacCertificateExtension',
780
+        '1.2.840.113635.100.3.3*' => 'appleDotMacCertificateRequestValues',
781
+        '1.2.840.113635.100.4*' => 'appleExtendedKeyUsage',
782
+        '1.2.840.113635.100.4.1*' => 'appleCodeSigning',
783
+        '1.2.840.113635.100.4.1.1*' => 'appleCodeSigningDevelopment',
784
+        '1.2.840.113635.100.4.1.2*' => 'appleSoftwareUpdateSigning',
785
+        '1.2.840.113635.100.4.1.3*' => 'appleCodeSigningThirdParty',
786
+        '1.2.840.113635.100.4.1.4*' => 'appleResourceSigning',
787
+        '1.2.840.113635.100.4.2*' => 'appleIChatSigning',
788
+        '1.2.840.113635.100.4.3*' => 'appleIChatEncryption',
789
+        '1.2.840.113635.100.4.4*' => 'appleSystemIdentity',
790
+        '1.2.840.113635.100.4.5*' => 'appleCryptoEnv',
791
+        '1.2.840.113635.100.4.5.1*' => 'appleCryptoProductionEnv',
792
+        '1.2.840.113635.100.4.5.2*' => 'appleCryptoMaintenanceEnv',
793
+        '1.2.840.113635.100.4.5.3*' => 'appleCryptoTestEnv',
794
+        '1.2.840.113635.100.4.5.4*' => 'appleCryptoDevelopmentEnv',
795
+        '1.2.840.113635.100.4.6*' => 'appleCryptoQoS',
796
+        '1.2.840.113635.100.4.6.1*' => 'appleCryptoTier0QoS',
797
+        '1.2.840.113635.100.4.6.2*' => 'appleCryptoTier1QoS',
798
+        '1.2.840.113635.100.4.6.3*' => 'appleCryptoTier2QoS',
799
+        '1.2.840.113635.100.4.6.4*' => 'appleCryptoTier3QoS',
800
+        '1.2.840.113635.100.5*' => 'appleCertificatePolicies',
801
+        '1.2.840.113635.100.5.1*' => 'appleCertificatePolicyID',
802
+        '1.2.840.113635.100.5.2*' => 'appleDotMacCertificatePolicyID',
803
+        '1.2.840.113635.100.5.3*' => 'appleADCCertificatePolicyID',
804
+        '1.2.840.113635.100.6*' => 'appleCertificateExtensions',
805
+        '1.2.840.113635.100.6.1*' => 'appleCertificateExtensionCodeSigning',
806
+        '1.2.840.113635.100.6.1.1*' => 'appleCertificateExtensionAppleSigning',
807
+        '1.2.840.113635.100.6.1.2*' => 'appleCertificateExtensionADCDeveloperSigning',
808
+        '1.2.840.113635.100.6.1.3*' => 'appleCertificateExtensionADCAppleSigning',
809
+        '1.3.6.1.4.1.311.2.1.4*' => 'spcIndirectDataContext',
810
+        '1.3.6.1.4.1.311.2.1.10*' => 'spcAgencyInfo',
811
+        '1.3.6.1.4.1.311.2.1.11*' => 'spcStatementType',
812
+        '1.3.6.1.4.1.311.2.1.12*' => 'spcSpOpusInfo',
813
+        '1.3.6.1.4.1.311.2.1.14*' => 'certReqExtensions',
814
+        '1.3.6.1.4.1.311.2.1.15*' => 'spcPEImageData',
815
+        '1.3.6.1.4.1.311.2.1.18*' => 'spcRawFileData',
816
+        '1.3.6.1.4.1.311.2.1.19*' => 'spcStructuredStorageData',
817
+        '1.3.6.1.4.1.311.2.1.20*' => 'spcJavaClassData (type 1)',
818
+        '1.3.6.1.4.1.311.2.1.21*' => 'individualCodeSigning',
819
+        '1.3.6.1.4.1.311.2.1.22*' => 'commercialCodeSigning',
820
+        '1.3.6.1.4.1.311.2.1.25*' => 'spcLink (type 2)',
821
+        '1.3.6.1.4.1.311.2.1.26*' => 'spcMinimalCriteriaInfo',
822
+        '1.3.6.1.4.1.311.2.1.27*' => 'spcFinancialCriteriaInfo',
823
+        '1.3.6.1.4.1.311.2.1.28*' => 'spcLink (type 3)',
824
+        '1.3.6.1.4.1.311.3.2.1*' => 'timestampRequest',
825
+        '1.3.6.1.4.1.311.10.1*' => 'certTrustList',
826
+        '1.3.6.1.4.1.311.10.1.1*' => 'sortedCtl',
827
+        '1.3.6.1.4.1.311.10.2*' => 'nextUpdateLocation',
828
+        '1.3.6.1.4.1.311.10.3.1*' => 'certTrustListSigning',
829
+        '1.3.6.1.4.1.311.10.3.2*' => 'timeStampSigning',
830
+        '1.3.6.1.4.1.311.10.3.3*' => 'serverGatedCrypto',
831
+        '1.3.6.1.4.1.311.10.3.3.1*' => 'serialized',
832
+        '1.3.6.1.4.1.311.10.3.4*' => 'encryptedFileSystem',
833
+        '1.3.6.1.4.1.311.10.3.5*' => 'whqlCrypto',
834
+        '1.3.6.1.4.1.311.10.3.6*' => 'nt5Crypto',
835
+        '1.3.6.1.4.1.311.10.3.7*' => 'oemWHQLCrypto',
836
+        '1.3.6.1.4.1.311.10.3.8*' => 'embeddedNTCrypto',
837
+        '1.3.6.1.4.1.311.10.3.9*' => 'rootListSigner',
838
+        '1.3.6.1.4.1.311.10.3.10*' => 'qualifiedSubordination',
839
+        '1.3.6.1.4.1.311.10.3.11*' => 'keyRecovery',
840
+        '1.3.6.1.4.1.311.10.3.12*' => 'documentSigning',
841
+        '1.3.6.1.4.1.311.10.3.13*' => 'lifetimeSigning',
842
+        '1.3.6.1.4.1.311.10.3.14*' => 'mobileDeviceSoftware',
843
+        '1.3.6.1.4.1.311.10.3.15*' => 'smartDisplay',
844
+        '1.3.6.1.4.1.311.10.3.16*' => 'cspSignature',
845
+        '1.3.6.1.4.1.311.10.3.4.1*' => 'efsRecovery',
846
+        '1.3.6.1.4.1.311.10.4.1*' => 'yesnoTrustAttr',
847
+        '1.3.6.1.4.1.311.10.5.1*' => 'drm',
848
+        '1.3.6.1.4.1.311.10.5.2*' => 'drmIndividualization',
849
+        '1.3.6.1.4.1.311.10.6.1*' => 'licenses',
850
+        '1.3.6.1.4.1.311.10.6.2*' => 'licenseServer',
851
+        '1.3.6.1.4.1.311.10.7.1*' => 'keyidRdn',
852
+        '1.3.6.1.4.1.311.10.8.1*' => 'removeCertificate',
853
+        '1.3.6.1.4.1.311.10.9.1*' => 'crossCertDistPoints',
854
+        '1.3.6.1.4.1.311.10.10.1*' => 'cmcAddAttributes',
855
+        '1.3.6.1.4.1.311.10.11*' => 'certPropIdPrefix',
856
+        '1.3.6.1.4.1.311.10.11.4*' => 'certMd5HashPropId',
857
+        '1.3.6.1.4.1.311.10.11.20*' => 'certKeyIdentifierPropId',
858
+        '1.3.6.1.4.1.311.10.11.28*' => 'certIssuerSerialNumberMd5HashPropId',
859
+        '1.3.6.1.4.1.311.10.11.29*' => 'certSubjectNameMd5HashPropId',
860
+        '1.3.6.1.4.1.311.10.12.1*' => 'anyApplicationPolicy',
861
+        '1.3.6.1.4.1.311.13.1*' => 'renewalCertificate',
862
+        '1.3.6.1.4.1.311.13.2.1*' => 'enrolmentNameValuePair',
863
+        '1.3.6.1.4.1.311.13.2.2*' => 'enrolmentCSP',
864
+        '1.3.6.1.4.1.311.13.2.3*' => 'osVersion',
865
+        '1.3.6.1.4.1.311.16.4*' => 'microsoftRecipientInfo',
866
+        '1.3.6.1.4.1.311.17.1*' => 'pkcs12KeyProviderNameAttr',
867
+        '1.3.6.1.4.1.311.17.2*' => 'localMachineKeyset',
868
+        '1.3.6.1.4.1.311.17.3*' => 'pkcs12ExtendedAttributes',
869
+        '1.3.6.1.4.1.311.20.1*' => 'autoEnrollCtlUsage',
870
+        '1.3.6.1.4.1.311.20.2*' => 'enrollCerttypeExtension',
871
+        '1.3.6.1.4.1.311.20.2.1*' => 'enrollmentAgent',
872
+        '1.3.6.1.4.1.311.20.2.2*' => 'smartcardLogon',
873
+        '1.3.6.1.4.1.311.20.2.3*' => 'universalPrincipalName',
874
+        '1.3.6.1.4.1.311.20.3*' => 'certManifold',
875
+        '1.3.6.1.4.1.311.21.1*' => 'cAKeyCertIndexPair',
876
+        '1.3.6.1.4.1.311.21.5*' => 'caExchange',
877
+        '1.3.6.1.4.1.311.21.2*' => 'certSrvPreviousCertHash',
878
+        '1.3.6.1.4.1.311.21.3*' => 'crlVirtualBase',
879
+        '1.3.6.1.4.1.311.21.4*' => 'crlNextPublish',
880
+        '1.3.6.1.4.1.311.21.6*' => 'keyRecovery',
881
+        '1.3.6.1.4.1.311.21.7*' => 'certificateTemplate',
882
+        '1.3.6.1.4.1.311.21.9*' => 'rdnDummySigner',
883
+        '1.3.6.1.4.1.311.21.10*' => 'applicationCertPolicies',
884
+        '1.3.6.1.4.1.311.21.11*' => 'applicationPolicyMappings',
885
+        '1.3.6.1.4.1.311.21.12*' => 'applicationPolicyConstraints',
886
+        '1.3.6.1.4.1.311.21.13*' => 'archivedKey',
887
+        '1.3.6.1.4.1.311.21.14*' => 'crlSelfCDP',
888
+        '1.3.6.1.4.1.311.21.15*' => 'requireCertChainPolicy',
889
+        '1.3.6.1.4.1.311.21.16*' => 'archivedKeyCertHash',
890
+        '1.3.6.1.4.1.311.21.17*' => 'issuedCertHash',
891
+        '1.3.6.1.4.1.311.21.19*' => 'dsEmailReplication',
892
+        '1.3.6.1.4.1.311.21.20*' => 'requestClientInfo',
893
+        '1.3.6.1.4.1.311.21.21*' => 'encryptedKeyHash',
894
+        '1.3.6.1.4.1.311.21.22*' => 'certsrvCrossCaVersion',
895
+        '1.3.6.1.4.1.311.25.1*' => 'ntdsReplication',
896
+        '1.3.6.1.4.1.311.31.1*' => 'productUpdate',
897
+        '1.3.6.1.4.1.311.47.1.1*' => 'systemHealth',
898
+        '1.3.6.1.4.1.311.47.1.3*' => 'systemHealthLoophole',
899
+        '1.3.6.1.4.1.311.60.1.1*' => 'rootProgramFlags',
900
+        '1.3.6.1.4.1.311.61.1.1*' => 'kernelModeCodeSigning',
901
+        '1.3.6.1.4.1.311.60.2.1.1*' => 'jurisdictionOfIncorporationL',
902
+        '1.3.6.1.4.1.311.60.2.1.2*' => 'jurisdictionOfIncorporationSP',
903
+        '1.3.6.1.4.1.311.60.2.1.3*' => 'jurisdictionOfIncorporationC',
904
+        '1.3.6.1.4.1.311.88.2.1*' => 'originalFilename',
905
+        '1.3.6.1.4.1.188.7.1.1*' => 'ascom',
906
+        '1.3.6.1.4.1.188.7.1.1.1*' => 'ideaECB',
907
+        '1.3.6.1.4.1.188.7.1.1.2*' => 'ideaCBC',
908
+        '1.3.6.1.4.1.188.7.1.1.3*' => 'ideaCFB',
909
+        '1.3.6.1.4.1.188.7.1.1.4*' => 'ideaOFB',
910
+        '1.3.6.1.4.1.2428.10.1.1*' => 'UNINETT policyIdentifier',
911
+        '1.3.6.1.4.1.2712.10*' => 'ICE-TEL policyIdentifier',
912
+        '1.3.6.1.4.1.2786.1.1.1*' => 'ICE-TEL Italian policyIdentifier',
913
+        '1.3.6.1.4.1.3029.1.1.1*' => 'blowfishECB',
914
+        '1.3.6.1.4.1.3029.1.1.2*' => 'blowfishCBC',
915
+        '1.3.6.1.4.1.3029.1.1.3*' => 'blowfishCFB',
916
+        '1.3.6.1.4.1.3029.1.1.4*' => 'blowfishOFB',
917
+        '1.3.6.1.4.1.3029.1.2.1*' => 'elgamal',
918
+        '1.3.6.1.4.1.3029.1.2.1.1*' => 'elgamalWithSHA-1',
919
+        '1.3.6.1.4.1.3029.1.2.1.2*' => 'elgamalWithRIPEMD-160',
920
+        '1.3.6.1.4.1.3029.3.1.1*' => 'cryptlibPresenceCheck',
921
+        '1.3.6.1.4.1.3029.3.1.2*' => 'pkiBoot',
922
+        '1.3.6.1.4.1.3029.3.1.4*' => 'crlExtReason',
923
+        '1.3.6.1.4.1.3029.3.1.5*' => 'keyFeatures',
924
+        '1.3.6.1.4.1.3029.4.1*' => 'cryptlibContent',
925
+        '1.3.6.1.4.1.3029.4.1.1*' => 'cryptlibConfigData',
926
+        '1.3.6.1.4.1.3029.4.1.2*' => 'cryptlibUserIndex',
927
+        '1.3.6.1.4.1.3029.4.1.3*' => 'cryptlibUserInfo',
928
+        '1.3.6.1.4.1.3029.4.1.4*' => 'rtcsRequest',
929
+        '1.3.6.1.4.1.3029.4.1.5*' => 'rtcsResponse',
930
+        '1.3.6.1.4.1.3029.4.1.6*' => 'rtcsResponseExt',
931
+        '1.3.6.1.4.1.3029.42.11172.1*' => 'mpeg-1',
932
+        '1.3.6.1.4.1.3029.88.89.90.90.89*' => 'xYZZY policyIdentifier',
933
+        '1.3.6.1.4.1.3401.8.1.1*' => 'pgpExtension',
934
+        '1.3.6.1.4.1.3576.7*' => 'eciaAscX12Edi',
935
+        '1.3.6.1.4.1.3576.7.1*' => 'plainEDImessage',
936
+        '1.3.6.1.4.1.3576.7.2*' => 'signedEDImessage',
937
+        '1.3.6.1.4.1.3576.7.5*' => 'integrityEDImessage',
938
+        '1.3.6.1.4.1.3576.7.65*' => 'iaReceiptMessage',
939
+        '1.3.6.1.4.1.3576.7.97*' => 'iaStatusMessage',
940
+        '1.3.6.1.4.1.3576.8*' => 'eciaEdifact',
941
+        '1.3.6.1.4.1.3576.9*' => 'eciaNonEdi',
942
+        '1.3.6.1.4.1.4146*' => 'Globalsign',
943
+        '1.3.6.1.4.1.4146.1*' => 'globalsignPolicy',
944
+        '1.3.6.1.4.1.4146.1.10*' => 'globalsignDVPolicy',
945
+        '1.3.6.1.4.1.4146.1.20*' => 'globalsignOVPolicy',
946
+        '1.3.6.1.4.1.4146.1.30*' => 'globalsignTSAPolicy',
947
+        '1.3.6.1.4.1.4146.1.40*' => 'globalsignClientCertPolicy',
948
+        '1.3.6.1.4.1.4146.1.50*' => 'globalsignCodeSignPolicy',
949
+        '1.3.6.1.4.1.4146.1.60*' => 'globalsignRootSignPolicy',
950
+        '1.3.6.1.4.1.4146.1.70*' => 'globalsignTrustedRootPolicy',
951
+        '1.3.6.1.4.1.4146.1.80*' => 'globalsignEDIClientPolicy',
952
+        '1.3.6.1.4.1.4146.1.81*' => 'globalsignEDIServerPolicy',
953
+        '1.3.6.1.4.1.4146.1.90*' => 'globalsignTPMRootPolicy',
954
+        '1.3.6.1.4.1.4146.1.95*' => 'globalsignOCSPPolicy',
955
+        '1.3.6.1.4.1.5309.1.2.2*' => 'edelWebTSAPolicy',
956
+        '1.3.6.1.4.1.5472*' => 'timeproof',
957
+        '1.3.6.1.4.1.5472.1*' => 'tss',
958
+        '1.3.6.1.4.1.5472.1.1*' => 'tss80',
959
+        '1.3.6.1.4.1.5472.1.2*' => 'tss380',
960
+        '1.3.6.1.4.1.5472.1.3*' => 'tss400',
961
+        '1.3.6.1.4.1.5770.0.3*' => 'secondaryPractices',
962
+        '1.3.6.1.4.1.5770.0.4*' => 'physicianIdentifiers',
963
+        '1.3.6.1.4.1.6449.1.2.1.3.1*' => 'comodoPolicy',
964
+        '1.3.6.1.4.1.6449.1.3.5.2*' => 'validityModelX',
965
+        '1.3.6.1.4.1.8301.3.5.1*' => 'validityModelChain',
966
+        '1.3.6.1.4.1.8301.3.5.2*' => 'validityModelShell',
967
+        '1.3.6.1.4.1.8231.1*' => 'rolUnicoNacional',
968
+        '1.3.6.1.4.1.11591*' => 'gnu',
969
+        '1.3.6.1.4.1.11591.1*' => 'gnuRadius',
970
+        '1.3.6.1.4.1.11591.3*' => 'gnuRadar',
971
+        '1.3.6.1.4.1.11591.12*' => 'gnuDigestAlgorithm',
972
+        '1.3.6.1.4.1.11591.12.2*' => 'tiger',
973
+        '1.3.6.1.4.1.11591.13*' => 'gnuEncryptionAlgorithm',
974
+        '1.3.6.1.4.1.11591.13.2*' => 'serpent',
975
+        '1.3.6.1.4.1.11591.13.2.1*' => 'serpent128_ECB',
976
+        '1.3.6.1.4.1.11591.13.2.2*' => 'serpent128_CBC',
977
+        '1.3.6.1.4.1.11591.13.2.3*' => 'serpent128_OFB',
978
+        '1.3.6.1.4.1.11591.13.2.4*' => 'serpent128_CFB',
979
+        '1.3.6.1.4.1.11591.13.2.21*' => 'serpent192_ECB',
980
+        '1.3.6.1.4.1.11591.13.2.22*' => 'serpent192_CBC',
981
+        '1.3.6.1.4.1.11591.13.2.23*' => 'serpent192_OFB',
982
+        '1.3.6.1.4.1.11591.13.2.24*' => 'serpent192_CFB',
983
+        '1.3.6.1.4.1.11591.13.2.41*' => 'serpent256_ECB',
984
+        '1.3.6.1.4.1.11591.13.2.42*' => 'serpent256_CBC',
985
+        '1.3.6.1.4.1.11591.13.2.43*' => 'serpent256_OFB',
986
+        '1.3.6.1.4.1.11591.13.2.44*' => 'serpent256_CFB',
987
+        '1.3.6.1.4.1.16334.509.1.1*' => 'Northrop Grumman extKeyUsage?',
988
+        '1.3.6.1.4.1.16334.509.2.1*' => 'ngcClass1',
989
+        '1.3.6.1.4.1.16334.509.2.2*' => 'ngcClass2',
990
+        '1.3.6.1.4.1.16334.509.2.3*' => 'ngcClass3',
991
+        '1.3.6.1.5.5.7*' => 'pkix',
992
+        '1.3.6.1.5.5.7.0.12*' => 'attributeCert',
993
+        '1.3.6.1.5.5.7.1*' => 'privateExtension',
994
+        '1.3.6.1.5.5.7.1.1*' => 'authorityInfoAccess',
995
+        '1.3.6.1.5.5.7.1.2*' => 'biometricInfo',
996
+        '1.3.6.1.5.5.7.1.3*' => 'qcStatements',
997
+        '1.3.6.1.5.5.7.1.4*' => 'acAuditIdentity',
998
+        '1.3.6.1.5.5.7.1.5*' => 'acTargeting',
999
+        '1.3.6.1.5.5.7.1.6*' => 'acAaControls',
1000
+        '1.3.6.1.5.5.7.1.7*' => 'ipAddrBlocks',
1001
+        '1.3.6.1.5.5.7.1.8*' => 'autonomousSysIds',
1002
+        '1.3.6.1.5.5.7.1.9*' => 'routerIdentifier',
1003
+        '1.3.6.1.5.5.7.1.10*' => 'acProxying',
1004
+        '1.3.6.1.5.5.7.1.11*' => 'subjectInfoAccess',
1005
+        '1.3.6.1.5.5.7.1.12*' => 'logoType',
1006
+        '1.3.6.1.5.5.7.1.13*' => 'wlanSSID',
1007
+        '1.3.6.1.5.5.7.2*' => 'policyQualifierIds',
1008
+        '1.3.6.1.5.5.7.2.1*' => 'cps',
1009
+        '1.3.6.1.5.5.7.2.2*' => 'unotice',
1010
+        '1.3.6.1.5.5.7.2.3*' => 'textNotice',
1011
+        '1.3.6.1.5.5.7.3*' => 'keyPurpose',
1012
+        '1.3.6.1.5.5.7.3.1*' => 'serverAuth',
1013
+        '1.3.6.1.5.5.7.3.2*' => 'clientAuth',
1014
+        '1.3.6.1.5.5.7.3.3*' => 'codeSigning',
1015
+        '1.3.6.1.5.5.7.3.4*' => 'emailProtection',
1016
+        '1.3.6.1.5.5.7.3.5*' => 'ipsecEndSystem',
1017
+        '1.3.6.1.5.5.7.3.6*' => 'ipsecTunnel',
1018
+        '1.3.6.1.5.5.7.3.7*' => 'ipsecUser',
1019
+        '1.3.6.1.5.5.7.3.8*' => 'timeStamping',
1020
+        '1.3.6.1.5.5.7.3.9*' => 'ocspSigning',
1021
+        '1.3.6.1.5.5.7.3.10*' => 'dvcs',
1022
+        '1.3.6.1.5.5.7.3.11*' => 'sbgpCertAAServerAuth',
1023
+        '1.3.6.1.5.5.7.3.13*' => 'eapOverPPP',
1024
+        '1.3.6.1.5.5.7.3.14*' => 'eapOverLAN',
1025
+        '1.3.6.1.5.5.7.4*' => 'cmpInformationTypes',
1026
+        '1.3.6.1.5.5.7.4.1*' => 'caProtEncCert',
1027
+        '1.3.6.1.5.5.7.4.2*' => 'signKeyPairTypes',
1028
+        '1.3.6.1.5.5.7.4.3*' => 'encKeyPairTypes',
1029
+        '1.3.6.1.5.5.7.4.4*' => 'preferredSymmAlg',
1030
+        '1.3.6.1.5.5.7.4.5*' => 'caKeyUpdateInfo',
1031
+        '1.3.6.1.5.5.7.4.6*' => 'currentCRL',
1032
+        '1.3.6.1.5.5.7.4.7*' => 'unsupportedOIDs',
1033
+        '1.3.6.1.5.5.7.4.10*' => 'keyPairParamReq',
1034
+        '1.3.6.1.5.5.7.4.11*' => 'keyPairParamRep',
1035
+        '1.3.6.1.5.5.7.4.12*' => 'revPassphrase',
1036
+        '1.3.6.1.5.5.7.4.13*' => 'implicitConfirm',
1037
+        '1.3.6.1.5.5.7.4.14*' => 'confirmWaitTime',
1038
+        '1.3.6.1.5.5.7.4.15*' => 'origPKIMessage',
1039
+        '1.3.6.1.5.5.7.4.16*' => 'suppLangTags',
1040
+        '1.3.6.1.5.5.7.5*' => 'crmfRegistration',
1041
+        '1.3.6.1.5.5.7.5.1*' => 'regCtrl',
1042
+        '1.3.6.1.5.5.7.5.1.1*' => 'regToken',
1043
+        '1.3.6.1.5.5.7.5.1.2*' => 'authenticator',
1044
+        '1.3.6.1.5.5.7.5.1.3*' => 'pkiPublicationInfo',
1045
+        '1.3.6.1.5.5.7.5.1.4*' => 'pkiArchiveOptions',
1046
+        '1.3.6.1.5.5.7.5.1.5*' => 'oldCertID',
1047
+        '1.3.6.1.5.5.7.5.1.6*' => 'protocolEncrKey',
1048
+        '1.3.6.1.5.5.7.5.1.7*' => 'altCertTemplate',
1049
+        '1.3.6.1.5.5.7.5.1.8*' => 'wtlsTemplate',
1050
+        '1.3.6.1.5.5.7.5.2*' => 'utf8Pairs',
1051
+        '1.3.6.1.5.5.7.5.2.1*' => 'utf8Pairs',
1052
+        '1.3.6.1.5.5.7.5.2.2*' => 'certReq',
1053
+        '1.3.6.1.5.5.7.6*' => 'algorithms',
1054
+        '1.3.6.1.5.5.7.6.1*' => 'des40',
1055
+        '1.3.6.1.5.5.7.6.2*' => 'noSignature',
1056
+        '1.3.6.1.5.5.7.6.3*' => 'dh-sig-hmac-sha1',
1057
+        '1.3.6.1.5.5.7.6.4*' => 'dh-pop',
1058
+        '1.3.6.1.5.5.7.7*' => 'cmcControls',
1059
+        '1.3.6.1.5.5.7.8*' => 'otherNames',
1060
+        '1.3.6.1.5.5.7.8.1*' => 'personalData',
1061
+        '1.3.6.1.5.5.7.8.2*' => 'userGroup',
1062
+        '1.3.6.1.5.5.7.9*' => 'personalData',
1063
+        '1.3.6.1.5.5.7.9.1*' => 'dateOfBirth',
1064
+        '1.3.6.1.5.5.7.9.2*' => 'placeOfBirth',
1065
+        '1.3.6.1.5.5.7.9.3*' => 'gender',
1066
+        '1.3.6.1.5.5.7.9.4*' => 'countryOfCitizenship',
1067
+        '1.3.6.1.5.5.7.9.5*' => 'countryOfResidence',
1068
+        '1.3.6.1.5.5.7.10*' => 'attributeCertificate',
1069
+        '1.3.6.1.5.5.7.10.1*' => 'authenticationInfo',
1070
+        '1.3.6.1.5.5.7.10.2*' => 'accessIdentity',
1071
+        '1.3.6.1.5.5.7.10.3*' => 'chargingIdentity',
1072
+        '1.3.6.1.5.5.7.10.4*' => 'group',
1073
+        '1.3.6.1.5.5.7.10.5*' => 'role',
1074
+        '1.3.6.1.5.5.7.10.6*' => 'wlanSSID',
1075
+        '1.3.6.1.5.5.7.11*' => 'personalData',
1076
+        '1.3.6.1.5.5.7.11.1*' => 'pkixQCSyntax-v1',
1077
+        '1.3.6.1.5.5.7.14.2*' => 'resourceCertificatePolicy',
1078
+        '1.3.6.1.5.5.7.20*' => 'logo',
1079
+        '1.3.6.1.5.5.7.20.1*' => 'logoLoyalty',
1080
+        '1.3.6.1.5.5.7.20.2*' => 'logoBackground',
1081
+        '1.3.6.1.5.5.7.48.1*' => 'ocsp',
1082
+        '1.3.6.1.5.5.7.48.1.1*' => 'ocspBasic',
1083
+        '1.3.6.1.5.5.7.48.1.2*' => 'ocspNonce',
1084
+        '1.3.6.1.5.5.7.48.1.3*' => 'ocspCRL',
1085
+        '1.3.6.1.5.5.7.48.1.4*' => 'ocspResponse',
1086
+        '1.3.6.1.5.5.7.48.1.5*' => 'ocspNoCheck',
1087
+        '1.3.6.1.5.5.7.48.1.6*' => 'ocspArchiveCutoff',
1088
+        '1.3.6.1.5.5.7.48.1.7*' => 'ocspServiceLocator',
1089
+        '1.3.6.1.5.5.7.48.2*' => 'caIssuers',
1090
+        '1.3.6.1.5.5.7.48.3*' => 'timeStamping',
1091
+        '1.3.6.1.5.5.7.48.4*' => 'dvcs',
1092
+        '1.3.6.1.5.5.7.48.5*' => 'caRepository',
1093
+        '1.3.6.1.5.5.7.48.7*' => 'signedObjectRepository',
1094
+        '1.3.6.1.5.5.7.48.10*' => 'rpkiManifest',
1095
+        '1.3.6.1.5.5.7.48.11*' => 'signedObject',
1096
+        '1.3.6.1.5.5.8.1.1*' => 'hmacMD5',
1097
+        '1.3.6.1.5.5.8.1.2*' => 'hmacSHA',
1098
+        '1.3.6.1.5.5.8.1.3*' => 'hmacTiger',
1099
+        '1.3.6.1.5.5.8.2.2*' => 'iKEIntermediate',
1100
+        '1.3.12.2.1011.7.1*' => 'decEncryptionAlgorithm',
1101
+        '1.3.12.2.1011.7.1.2*' => 'decDEA',
1102
+        '1.3.12.2.1011.7.2*' => 'decHashAlgorithm',
1103
+        '1.3.12.2.1011.7.2.1*' => 'decMD2',
1104
+        '1.3.12.2.1011.7.2.2*' => 'decMD4',
1105
+        '1.3.12.2.1011.7.3*' => 'decSignatureAlgorithm',
1106
+        '1.3.12.2.1011.7.3.1*' => 'decMD2withRSA',
1107
+        '1.3.12.2.1011.7.3.2*' => 'decMD4withRSA',
1108
+        '1.3.12.2.1011.7.3.3*' => 'decDEAMAC',
1109
+        '1.3.14.2.26.5*' => 'sha',
1110
+        '1.3.14.3.2.1.1*' => 'rsa',
1111
+        '1.3.14.3.2.2*' => 'md4WitRSA',
1112
+        '1.3.14.3.2.3*' => 'md5WithRSA',
1113
+        '1.3.14.3.2.4*' => 'md4WithRSAEncryption',
1114
+        '1.3.14.3.2.2.1*' => 'sqmod-N',
1115
+        '1.3.14.3.2.3.1*' => 'sqmod-NwithRSA',
1116
+        '1.3.14.3.2.6*' => 'desECB',
1117
+        '1.3.14.3.2.7*' => 'desCBC',
1118
+        '1.3.14.3.2.8*' => 'desOFB',
1119
+        '1.3.14.3.2.9*' => 'desCFB',
1120
+        '1.3.14.3.2.10*' => 'desMAC',
1121
+        '1.3.14.3.2.11*' => 'rsaSignature',
1122
+        '1.3.14.3.2.12*' => 'dsa',
1123
+        '1.3.14.3.2.13*' => 'dsaWithSHA',
1124
+        '1.3.14.3.2.14*' => 'mdc2WithRSASignature',
1125
+        '1.3.14.3.2.15*' => 'shaWithRSASignature',
1126
+        '1.3.14.3.2.16*' => 'dhWithCommonModulus',
1127
+        '1.3.14.3.2.17*' => 'desEDE',
1128
+        '1.3.14.3.2.18*' => 'sha',
1129
+        '1.3.14.3.2.19*' => 'mdc-2',
1130
+        '1.3.14.3.2.20*' => 'dsaCommon',
1131
+        '1.3.14.3.2.21*' => 'dsaCommonWithSHA',
1132
+        '1.3.14.3.2.22*' => 'rsaKeyTransport',
1133
+        '1.3.14.3.2.23*' => 'keyed-hash-seal',
1134
+        '1.3.14.3.2.24*' => 'md2WithRSASignature',
1135
+        '1.3.14.3.2.25*' => 'md5WithRSASignature',
1136
+        '1.3.14.3.2.26*' => 'sha1',
1137
+        '1.3.14.3.2.27*' => 'dsaWithSHA1',
1138
+        '1.3.14.3.2.28*' => 'dsaWithCommonSHA1',
1139
+        #        '1.3.14.3.2.29*' => 'sha-1WithRSAEncryption',
1140
+        '1.3.14.3.2.29*' => 'sha1WithRSAEncryption',
1141
+        '1.3.14.3.3.1*' => 'simple-strong-auth-mechanism',
1142
+        '1.3.14.7.2.1.1*' => 'ElGamal',
1143
+        '1.3.14.7.2.3.1*' => 'md2WithRSA',
1144
+        '1.3.14.7.2.3.2*' => 'md2WithElGamal',
1145
+        '1.3.36.1*' => 'document',
1146
+        '1.3.36.1.1*' => 'finalVersion',
1147
+        '1.3.36.1.2*' => 'draft',
1148
+        '1.3.36.2*' => 'sio',
1149
+        '1.3.36.2.1*' => 'sedu',
1150
+        '1.3.36.3*' => 'algorithm',
1151
+        '1.3.36.3.1*' => 'encryptionAlgorithm',
1152
+        '1.3.36.3.1.1*' => 'des',
1153
+        '1.3.36.3.1.1.1*' => 'desECB_pad',
1154
+        '1.3.36.3.1.1.1.1*' => 'desECB_ISOpad',
1155
+        '1.3.36.3.1.1.2.1*' => 'desCBC_pad',
1156
+        '1.3.36.3.1.1.2.1.1*' => 'desCBC_ISOpad',
1157
+        '1.3.36.3.1.3*' => 'des_3',
1158
+        '1.3.36.3.1.3.1.1*' => 'des_3ECB_pad',
1159
+        '1.3.36.3.1.3.1.1.1*' => 'des_3ECB_ISOpad',
1160
+        '1.3.36.3.1.3.2.1*' => 'des_3CBC_pad',
1161
+        '1.3.36.3.1.3.2.1.1*' => 'des_3CBC_ISOpad',
1162
+        '1.3.36.3.1.2*' => 'idea',
1163
+        '1.3.36.3.1.2.1*' => 'ideaECB',
1164
+        '1.3.36.3.1.2.1.1*' => 'ideaECB_pad',
1165
+        '1.3.36.3.1.2.1.1.1*' => 'ideaECB_ISOpad',
1166
+        '1.3.36.3.1.2.2*' => 'ideaCBC',
1167
+        '1.3.36.3.1.2.2.1*' => 'ideaCBC_pad',
1168
+        '1.3.36.3.1.2.2.1.1*' => 'ideaCBC_ISOpad',
1169
+        '1.3.36.3.1.2.3*' => 'ideaOFB',
1170
+        '1.3.36.3.1.2.4*' => 'ideaCFB',
1171
+        '1.3.36.3.1.4*' => 'rsaEncryption',
1172
+        '1.3.36.3.1.4.512.17*' => 'rsaEncryptionWithlmod512expe17',
1173
+        '1.3.36.3.1.5*' => 'bsi-1',
1174
+        '1.3.36.3.1.5.1*' => 'bsi_1ECB_pad',
1175
+        '1.3.36.3.1.5.2*' => 'bsi_1CBC_pad',
1176
+        '1.3.36.3.1.5.2.1*' => 'bsi_1CBC_PEMpad',
1177
+        '1.3.36.3.2*' => 'hashAlgorithm',
1178
+        '1.3.36.3.2.1*' => 'ripemd160',
1179
+        '1.3.36.3.2.2*' => 'ripemd128',
1180
+        '1.3.36.3.2.3*' => 'ripemd256',
1181
+        '1.3.36.3.2.4*' => 'mdc2singleLength',
1182
+        '1.3.36.3.2.5*' => 'mdc2doubleLength',
1183
+        '1.3.36.3.3*' => 'signatureAlgorithm',
1184
+        '1.3.36.3.3.1*' => 'rsaSignature',
1185
+        '1.3.36.3.3.1.1*' => 'rsaSignatureWithsha1',
1186
+        '1.3.36.3.3.1.1.512.2*' => 'rsaSignatureWithsha1_l512_l2',
1187
+        '1.3.36.3.3.1.1.640.2*' => 'rsaSignatureWithsha1_l640_l2',
1188
+        '1.3.36.3.3.1.1.768.2*' => 'rsaSignatureWithsha1_l768_l2',
1189
+        '1.3.36.3.3.1.1.896.2*' => 'rsaSignatureWithsha1_l896_l2',
1190
+        '1.3.36.3.3.1.1.1024.2*' => 'rsaSignatureWithsha1_l1024_l2',
1191
+        '1.3.36.3.3.1.1.512.3*' => 'rsaSignatureWithsha1_l512_l3',
1192
+        '1.3.36.3.3.1.1.640.3*' => 'rsaSignatureWithsha1_l640_l3',
1193
+        '1.3.36.3.3.1.1.768.3*' => 'rsaSignatureWithsha1_l768_l3',
1194
+        '1.3.36.3.3.1.1.896.3*' => 'rsaSignatureWithsha1_l896_l3',
1195
+        '1.3.36.3.3.1.1.1024.3*' => 'rsaSignatureWithsha1_l1024_l3',
1196
+        '1.3.36.3.3.1.1.512.5*' => 'rsaSignatureWithsha1_l512_l5',
1197
+        '1.3.36.3.3.1.1.640.5*' => 'rsaSignatureWithsha1_l640_l5',
1198
+        '1.3.36.3.3.1.1.768.5*' => 'rsaSignatureWithsha1_l768_l5',
1199
+        '1.3.36.3.3.1.1.896.5*' => 'rsaSignatureWithsha1_l896_l5',
1200
+        '1.3.36.3.3.1.1.1024.5*' => 'rsaSignatureWithsha1_l1024_l5',
1201
+        '1.3.36.3.3.1.1.512.9*' => 'rsaSignatureWithsha1_l512_l9',
1202
+        '1.3.36.3.3.1.1.640.9*' => 'rsaSignatureWithsha1_l640_l9',
1203
+        '1.3.36.3.3.1.1.768.9*' => 'rsaSignatureWithsha1_l768_l9',
1204
+        '1.3.36.3.3.1.1.896.9*' => 'rsaSignatureWithsha1_l896_l9',
1205
+        '1.3.36.3.3.1.1.1024.9*' => 'rsaSignatureWithsha1_l1024_l9',
1206
+        '1.3.36.3.3.1.1.512.11*' => 'rsaSignatureWithsha1_l512_l11',
1207
+        '1.3.36.3.3.1.1.640.11*' => 'rsaSignatureWithsha1_l640_l11',
1208
+        '1.3.36.3.3.1.1.768.11*' => 'rsaSignatureWithsha1_l768_l11',
1209
+        '1.3.36.3.3.1.1.896.11*' => 'rsaSignatureWithsha1_l896_l11',
1210
+        '1.3.36.3.3.1.1.1024.11*' => 'rsaSignatureWithsha1_l1024_l11',
1211
+        '1.3.36.3.3.1.2*' => 'rsaSignatureWithripemd160',
1212
+        '1.3.36.3.3.1.2.512.2*' => 'rsaSignatureWithripemd160_l512_l2',
1213
+        '1.3.36.3.3.1.2.640.2*' => 'rsaSignatureWithripemd160_l640_l2',
1214
+        '1.3.36.3.3.1.2.768.2*' => 'rsaSignatureWithripemd160_l768_l2',
1215
+        '1.3.36.3.3.1.2.896.2*' => 'rsaSignatureWithripemd160_l896_l2',
1216
+        '1.3.36.3.3.1.2.1024.2*' => 'rsaSignatureWithripemd160_l1024_l2',
1217
+        '1.3.36.3.3.1.2.512.3*' => 'rsaSignatureWithripemd160_l512_l3',
1218
+        '1.3.36.3.3.1.2.640.3*' => 'rsaSignatureWithripemd160_l640_l3',
1219
+        '1.3.36.3.3.1.2.768.3*' => 'rsaSignatureWithripemd160_l768_l3',
1220
+        '1.3.36.3.3.1.2.896.3*' => 'rsaSignatureWithripemd160_l896_l3',
1221
+        '1.3.36.3.3.1.2.1024.3*' => 'rsaSignatureWithripemd160_l1024_l3',
1222
+        '1.3.36.3.3.1.2.512.5*' => 'rsaSignatureWithripemd160_l512_l5',
1223
+        '1.3.36.3.3.1.2.640.5*' => 'rsaSignatureWithripemd160_l640_l5',
1224
+        '1.3.36.3.3.1.2.768.5*' => 'rsaSignatureWithripemd160_l768_l5',
1225
+        '1.3.36.3.3.1.2.896.5*' => 'rsaSignatureWithripemd160_l896_l5',
1226
+        '1.3.36.3.3.1.2.1024.5*' => 'rsaSignatureWithripemd160_l1024_l5',
1227
+        '1.3.36.3.3.1.2.512.9*' => 'rsaSignatureWithripemd160_l512_l9',
1228
+        '1.3.36.3.3.1.2.640.9*' => 'rsaSignatureWithripemd160_l640_l9',
1229
+        '1.3.36.3.3.1.2.768.9*' => 'rsaSignatureWithripemd160_l768_l9',
1230
+        '1.3.36.3.3.1.2.896.9*' => 'rsaSignatureWithripemd160_l896_l9',
1231
+        '1.3.36.3.3.1.2.1024.9*' => 'rsaSignatureWithripemd160_l1024_l9',
1232
+        '1.3.36.3.3.1.2.512.11*' => 'rsaSignatureWithripemd160_l512_l11',
1233
+        '1.3.36.3.3.1.2.640.11*' => 'rsaSignatureWithripemd160_l640_l11',
1234
+        '1.3.36.3.3.1.2.768.11*' => 'rsaSignatureWithripemd160_l768_l11',
1235
+        '1.3.36.3.3.1.2.896.11*' => 'rsaSignatureWithripemd160_l896_l11',
1236
+        '1.3.36.3.3.1.2.1024.11*' => 'rsaSignatureWithripemd160_l1024_l11',
1237
+        '1.3.36.3.3.1.3*' => 'rsaSignatureWithrimpemd128',
1238
+        '1.3.36.3.3.1.4*' => 'rsaSignatureWithrimpemd256',
1239
+        '1.3.36.3.3.2*' => 'ecsieSign',
1240
+        '1.3.36.3.3.2.1*' => 'ecsieSignWithsha1',
1241
+        '1.3.36.3.3.2.2*' => 'ecsieSignWithripemd160',
1242
+        '1.3.36.3.3.2.3*' => 'ecsieSignWithmd2',
1243
+        '1.3.36.3.3.2.4*' => 'ecsieSignWithmd5',
1244
+        '1.3.36.3.3.2.8.1.1.1*' => 'brainpoolP160r1',
1245
+        '1.3.36.3.3.2.8.1.1.2*' => 'brainpoolP160t1',
1246
+        '1.3.36.3.3.2.8.1.1.3*' => 'brainpoolP192r1',
1247
+        '1.3.36.3.3.2.8.1.1.4*' => 'brainpoolP192t1',
1248
+        '1.3.36.3.3.2.8.1.1.5*' => 'brainpoolP224r1',
1249
+        '1.3.36.3.3.2.8.1.1.6*' => 'brainpoolP224t1',
1250
+        '1.3.36.3.3.2.8.1.1.7*' => 'brainpoolP256r1',
1251
+        '1.3.36.3.3.2.8.1.1.8*' => 'brainpoolP256t1',
1252
+        '1.3.36.3.3.2.8.1.1.9*' => 'brainpoolP320r1',
1253
+        '1.3.36.3.3.2.8.1.1.10*' => 'brainpoolP320t1',
1254
+        '1.3.36.3.3.2.8.1.1.11*' => 'brainpoolP384r1',
1255
+        '1.3.36.3.3.2.8.1.1.12*' => 'brainpoolP384t1',
1256
+        '1.3.36.3.3.2.8.1.1.13*' => 'brainpoolP512r1',
1257
+        '1.3.36.3.3.2.8.1.1.14*' => 'brainpoolP512t1',
1258
+        '1.3.36.3.4*' => 'signatureScheme',
1259
+        '1.3.36.3.4.1*' => 'sigS_ISO9796-1',
1260
+        '1.3.36.3.4.2*' => 'sigS_ISO9796-2',
1261
+        '1.3.36.3.4.2.1*' => 'sigS_ISO9796-2Withred',
1262
+        '1.3.36.3.4.2.2*' => 'sigS_ISO9796-2Withrsa',
1263
+        '1.3.36.3.4.2.3*' => 'sigS_ISO9796-2Withrnd',
1264
+        '1.3.36.4*' => 'attribute',
1265
+        '1.3.36.5*' => 'policy',
1266
+        '1.3.36.6*' => 'api',
1267
+        '1.3.36.6.1*' => 'manufacturer-specific_api',
1268
+        '1.3.36.6.1.1*' => 'utimaco-api',
1269
+        '1.3.36.6.2*' => 'functionality-specific_api',
1270
+        '1.3.36.7*' => 'keymgmnt',
1271
+        '1.3.36.7.1*' => 'keyagree',
1272
+        '1.3.36.7.1.1*' => 'bsiPKE',
1273
+        '1.3.36.7.2*' => 'keytrans',
1274
+        '1.3.36.7.2.1*' => 'encISO9796-2Withrsa',
1275
+        '1.3.36.8.1.1*' => 'Teletrust SigGConform policyIdentifier',
1276
+        '1.3.36.8.2.1*' => 'directoryService',
1277
+        '1.3.36.8.3.1*' => 'dateOfCertGen',
1278
+        '1.3.36.8.3.2*' => 'procuration',
1279
+        '1.3.36.8.3.3*' => 'admission',
1280
+        '1.3.36.8.3.4*' => 'monetaryLimit',
1281
+        '1.3.36.8.3.5*' => 'declarationOfMajority',
1282
+        '1.3.36.8.3.6*' => 'integratedCircuitCardSerialNumber',
1283
+        '1.3.36.8.3.7*' => 'pKReference',
1284
+        '1.3.36.8.3.8*' => 'restriction',
1285
+        '1.3.36.8.3.9*' => 'retrieveIfAllowed',
1286
+        '1.3.36.8.3.10*' => 'requestedCertificate',
1287
+        '1.3.36.8.3.11*' => 'namingAuthorities',
1288
+        '1.3.36.8.3.11.1*' => 'rechtWirtschaftSteuern',
1289
+        '1.3.36.8.3.11.1.1*' => 'rechtsanwaeltin',
1290
+        '1.3.36.8.3.11.1.2*' => 'rechtsanwalt',
1291
+        '1.3.36.8.3.11.1.3*' => 'rechtsBeistand',
1292
+        '1.3.36.8.3.11.1.4*' => 'steuerBeraterin',
1293
+        '1.3.36.8.3.11.1.5*' => 'steuerBerater',
1294
+        '1.3.36.8.3.11.1.6*' => 'steuerBevollmaechtigte',
1295
+        '1.3.36.8.3.11.1.7*' => 'steuerBevollmaechtigter',
1296
+        '1.3.36.8.3.11.1.8*' => 'notarin',
1297
+        '1.3.36.8.3.11.1.9*' => 'notar',
1298
+        '1.3.36.8.3.11.1.10*' => 'notarVertreterin',
1299
+        '1.3.36.8.3.11.1.11*' => 'notarVertreter',
1300
+        '1.3.36.8.3.11.1.12*' => 'notariatsVerwalterin',
1301
+        '1.3.36.8.3.11.1.13*' => 'notariatsVerwalter',
1302
+        '1.3.36.8.3.11.1.14*' => 'wirtschaftsPrueferin',
1303
+        '1.3.36.8.3.11.1.15*' => 'wirtschaftsPruefer',
1304
+        '1.3.36.8.3.11.1.16*' => 'vereidigteBuchprueferin',
1305
+        '1.3.36.8.3.11.1.17*' => 'vereidigterBuchpruefer',
1306
+        '1.3.36.8.3.11.1.18*' => 'patentAnwaeltin',
1307
+        '1.3.36.8.3.11.1.19*' => 'patentAnwalt',
1308
+        '1.3.36.8.3.12*' => 'certInDirSince',
1309
+        '1.3.36.8.3.13*' => 'certHash',
1310
+        '1.3.36.8.3.14*' => 'nameAtBirth',
1311
+        '1.3.36.8.3.15*' => 'additionalInformation',
1312
+        '1.3.36.8.4.1*' => 'personalData',
1313
+        '1.3.36.8.4.8*' => 'restriction',
1314
+        '1.3.36.8.5.1.1.1*' => 'rsaIndicateSHA1',
1315
+        '1.3.36.8.5.1.1.2*' => 'rsaIndicateRIPEMD160',
1316
+        '1.3.36.8.5.1.1.3*' => 'rsaWithSHA1',
1317
+        '1.3.36.8.5.1.1.4*' => 'rsaWithRIPEMD160',
1318
+        '1.3.36.8.5.1.2.1*' => 'dsaExtended',
1319
+        '1.3.36.8.5.1.2.2*' => 'dsaWithRIPEMD160',
1320
+        '1.3.36.8.6.1*' => 'cert',
1321
+        '1.3.36.8.6.2*' => 'certRef',
1322
+        '1.3.36.8.6.3*' => 'attrCert',
1323
+        '1.3.36.8.6.4*' => 'attrRef',
1324
+        '1.3.36.8.6.5*' => 'fileName',
1325
+        '1.3.36.8.6.6*' => 'storageTime',
1326
+        '1.3.36.8.6.7*' => 'fileSize',
1327
+        '1.3.36.8.6.8*' => 'location',
1328
+        '1.3.36.8.6.9*' => 'sigNumber',
1329
+        '1.3.36.8.6.10*' => 'autoGen',
1330
+        '1.3.36.8.7.1.1*' => 'ptAdobeILL',
1331
+        '1.3.36.8.7.1.2*' => 'ptAmiPro',
1332
+        '1.3.36.8.7.1.3*' => 'ptAutoCAD',
1333
+        '1.3.36.8.7.1.4*' => 'ptBinary',
1334
+        '1.3.36.8.7.1.5*' => 'ptBMP',
1335
+        '1.3.36.8.7.1.6*' => 'ptCGM',
1336
+        '1.3.36.8.7.1.7*' => 'ptCorelCRT',
1337
+        '1.3.36.8.7.1.8*' => 'ptCorelDRW',
1338
+        '1.3.36.8.7.1.9*' => 'ptCorelEXC',
1339
+        '1.3.36.8.7.1.10*' => 'ptCorelPHT',
1340
+        '1.3.36.8.7.1.11*' => 'ptDraw',
1341
+        '1.3.36.8.7.1.12*' => 'ptDVI',
1342
+        '1.3.36.8.7.1.13*' => 'ptEPS',
1343
+        '1.3.36.8.7.1.14*' => 'ptExcel',
1344
+        '1.3.36.8.7.1.15*' => 'ptGEM',
1345
+        '1.3.36.8.7.1.16*' => 'ptGIF',
1346
+        '1.3.36.8.7.1.17*' => 'ptHPGL',
1347
+        '1.3.36.8.7.1.18*' => 'ptJPEG',
1348
+        '1.3.36.8.7.1.19*' => 'ptKodak',
1349
+        '1.3.36.8.7.1.20*' => 'ptLaTeX',
1350
+        '1.3.36.8.7.1.21*' => 'ptLotus',
1351
+        '1.3.36.8.7.1.22*' => 'ptLotusPIC',
1352
+        '1.3.36.8.7.1.23*' => 'ptMacPICT',
1353
+        '1.3.36.8.7.1.24*' => 'ptMacWord',
1354
+        '1.3.36.8.7.1.25*' => 'ptMSWfD',
1355
+        '1.3.36.8.7.1.26*' => 'ptMSWord',
1356
+        '1.3.36.8.7.1.27*' => 'ptMSWord2',
1357
+        '1.3.36.8.7.1.28*' => 'ptMSWord6',
1358
+        '1.3.36.8.7.1.29*' => 'ptMSWord8',
1359
+        '1.3.36.8.7.1.30*' => 'ptPDF',
1360
+        '1.3.36.8.7.1.31*' => 'ptPIF',
1361
+        '1.3.36.8.7.1.32*' => 'ptPostscript',
1362
+        '1.3.36.8.7.1.33*' => 'ptRTF',
1363
+        '1.3.36.8.7.1.34*' => 'ptSCITEX',
1364
+        '1.3.36.8.7.1.35*' => 'ptTAR',
1365
+        '1.3.36.8.7.1.36*' => 'ptTarga',
1366
+        '1.3.36.8.7.1.37*' => 'ptTeX',
1367
+        '1.3.36.8.7.1.38*' => 'ptText',
1368
+        '1.3.36.8.7.1.39*' => 'ptTIFF',
1369
+        '1.3.36.8.7.1.40*' => 'ptTIFF-FC',
1370
+        '1.3.36.8.7.1.41*' => 'ptUID',
1371
+        '1.3.36.8.7.1.42*' => 'ptUUEncode',
1372
+        '1.3.36.8.7.1.43*' => 'ptWordPerfect x',
1373
+        '1.3.36.8.7.1.45*' => 'ptWPGrph',
1374
+        '1.3.101.1.4*' => 'thawte-ce',
1375
+        '1.3.101.1.4.1*' => 'strongExtranet',
1376
+        '1.3.132.0.1*' => 'sect163k1',
1377
+        '1.3.132.0.2*' => 'sect163r1',
1378
+        '1.3.132.0.3*' => 'sect239k1',
1379
+        '1.3.132.0.4*' => 'sect113r1',
1380
+        '1.3.132.0.5*' => 'sect113r2',
1381
+        '1.3.132.0.6*' => 'secp112r1',
1382
+        '1.3.132.0.7*' => 'secp112r2',
1383
+        '1.3.132.0.8*' => 'secp160r1',
1384
+        '1.3.132.0.9*' => 'secp160k1',
1385
+        '1.3.132.0.10*' => 'secp256k1',
1386
+        '1.3.132.0.15*' => 'sect163r2',
1387
+        '1.3.132.0.16*' => 'sect283k1',
1388
+        '1.3.132.0.17*' => 'sect283r1',
1389
+        '1.3.132.0.22*' => 'sect131r1',
1390
+        '1.3.132.0.23*' => 'sect131r2',
1391
+        '1.3.132.0.24*' => 'sect193r1',
1392
+        '1.3.132.0.25*' => 'sect193r2',
1393
+        '1.3.132.0.26*' => 'sect233k1',
1394
+        '1.3.132.0.27*' => 'sect233r1',
1395
+        '1.3.132.0.28*' => 'secp128r1',
1396
+        '1.3.132.0.29*' => 'secp128r2',
1397
+        '1.3.132.0.30*' => 'secp160r2',
1398
+        '1.3.132.0.31*' => 'secp192k1',
1399
+        '1.3.132.0.32*' => 'secp224k1',
1400
+        '1.3.132.0.33*' => 'secp224r1',
1401
+        '1.3.132.0.34*' => 'secp384r1',
1402
+        '1.3.132.0.35*' => 'secp521r1',
1403
+        '1.3.132.0.36*' => 'sect409k1',
1404
+        '1.3.132.0.37*' => 'sect409r1',
1405
+        '1.3.132.0.38*' => 'sect571k1',
1406
+        '1.3.132.0.39*' => 'sect571r1',
1407
+        '2.5.4.0*' => 'objectClass',
1408
+        '2.5.4.1*' => 'aliasedEntryName',
1409
+        '2.5.4.2*' => 'knowledgeInformation',
1410
+        '2.5.4.3*' => 'commonName',
1411
+        '2.5.4.4*' => 'surname',
1412
+        '2.5.4.5*' => 'serialNumber',
1413
+        '2.5.4.6*' => 'countryName',
1414
+        '2.5.4.7*' => 'localityName',
1415
+        '2.5.4.7.1*' => 'collectiveLocalityName',
1416
+        '2.5.4.8*' => 'stateOrProvinceName',
1417
+        '2.5.4.8.1*' => 'collectiveStateOrProvinceName',
1418
+        '2.5.4.9*' => 'streetAddress',
1419
+        '2.5.4.9.1*' => 'collectiveStreetAddress',
1420
+        '2.5.4.10*' => 'organizationName',
1421
+        '2.5.4.10.1*' => 'collectiveOrganizationName',
1422
+        '2.5.4.11*' => 'organizationalUnitName',
1423
+        '2.5.4.11.1*' => 'collectiveOrganizationalUnitName',
1424
+        '2.5.4.12*' => 'title',
1425
+        '2.5.4.13*' => 'description',
1426
+        '2.5.4.14*' => 'searchGuide',
1427
+        '2.5.4.15*' => 'businessCategory',
1428
+        '2.5.4.16*' => 'postalAddress',
1429
+        '2.5.4.16.1*' => 'collectivePostalAddress',
1430
+        '2.5.4.17*' => 'postalCode',
1431
+        '2.5.4.17.1*' => 'collectivePostalCode',
1432
+        '2.5.4.18*' => 'postOfficeBox',
1433
+        '2.5.4.18.1*' => 'collectivePostOfficeBox',
1434
+        '2.5.4.19*' => 'physicalDeliveryOfficeName',
1435
+        '2.5.4.19.1*' => 'collectivePhysicalDeliveryOfficeName',
1436
+        '2.5.4.20*' => 'telephoneNumber',
1437
+        '2.5.4.20.1*' => 'collectiveTelephoneNumber',
1438
+        '2.5.4.21*' => 'telexNumber',
1439
+        '2.5.4.21.1*' => 'collectiveTelexNumber',
1440
+        '2.5.4.22*' => 'teletexTerminalIdentifier',
1441
+        '2.5.4.22.1*' => 'collectiveTeletexTerminalIdentifier',
1442
+        '2.5.4.23*' => 'facsimileTelephoneNumber',
1443
+        '2.5.4.23.1*' => 'collectiveFacsimileTelephoneNumber',
1444
+        '2.5.4.24*' => 'x121Address',
1445
+        '2.5.4.25*' => 'internationalISDNNumber',
1446
+        '2.5.4.25.1*' => 'collectiveInternationalISDNNumber',
1447
+        '2.5.4.26*' => 'registeredAddress',
1448
+        '2.5.4.27*' => 'destinationIndicator',
1449
+        '2.5.4.28*' => 'preferredDeliveryMehtod',
1450
+        '2.5.4.29*' => 'presentationAddress',
1451
+        '2.5.4.30*' => 'supportedApplicationContext',
1452
+        '2.5.4.31*' => 'member',
1453
+        '2.5.4.32*' => 'owner',
1454
+        '2.5.4.33*' => 'roleOccupant',
1455
+        '2.5.4.34*' => 'seeAlso',
1456
+        '2.5.4.35*' => 'userPassword',
1457
+        '2.5.4.36*' => 'userCertificate',
1458
+        '2.5.4.37*' => 'caCertificate',
1459
+        '2.5.4.38*' => 'authorityRevocationList',
1460
+        '2.5.4.39*' => 'certificateRevocationList',
1461
+        '2.5.4.40*' => 'crossCertificatePair',
1462
+        '2.5.4.41*' => 'name',
1463
+        '2.5.4.42*' => 'givenName',
1464
+        '2.5.4.43*' => 'initials',
1465
+        '2.5.4.44*' => 'generationQualifier',
1466
+        '2.5.4.45*' => 'uniqueIdentifier',
1467
+        '2.5.4.46*' => 'dnQualifier',
1468
+        '2.5.4.47*' => 'enhancedSearchGuide',
1469
+        '2.5.4.48*' => 'protocolInformation',
1470
+        '2.5.4.49*' => 'distinguishedName',
1471
+        '2.5.4.50*' => 'uniqueMember',
1472
+        '2.5.4.51*' => 'houseIdentifier',
1473
+        '2.5.4.52*' => 'supportedAlgorithms',
1474
+        '2.5.4.53*' => 'deltaRevocationList',
1475
+        '2.5.4.54*' => 'dmdName',
1476
+        '2.5.4.55*' => 'clearance',
1477
+        '2.5.4.56*' => 'defaultDirQop',
1478
+        '2.5.4.57*' => 'attributeIntegrityInfo',
1479
+        '2.5.4.58*' => 'attributeCertificate',
1480
+        '2.5.4.59*' => 'attributeCertificateRevocationList',
1481
+        '2.5.4.60*' => 'confKeyInfo',
1482
+        '2.5.4.61*' => 'aACertificate',
1483
+        '2.5.4.62*' => 'attributeDescriptorCertificate',
1484
+        '2.5.4.63*' => 'attributeAuthorityRevocationList',
1485
+        '2.5.4.64*' => 'familyInformation',
1486
+        '2.5.4.65*' => 'pseudonym',
1487
+        '2.5.4.66*' => 'communicationsService',
1488
+        '2.5.4.67*' => 'communicationsNetwork',
1489
+        '2.5.4.68*' => 'certificationPracticeStmt',
1490
+        '2.5.4.69*' => 'certificatePolicy',
1491
+        '2.5.4.70*' => 'pkiPath',
1492
+        '2.5.4.71*' => 'privPolicy',
1493
+        '2.5.4.72*' => 'role',
1494
+        '2.5.4.73*' => 'delegationPath',
1495
+        '2.5.4.74*' => 'protPrivPolicy',
1496
+        '2.5.4.75*' => 'xMLPrivilegeInfo',
1497
+        '2.5.4.76*' => 'xmlPrivPolicy',
1498
+        '2.5.4.82*' => 'permission',
1499
+        '2.5.6.0*' => 'top',
1500
+        '2.5.6.1*' => 'alias',
1501
+        '2.5.6.2*' => 'country',
1502
+        '2.5.6.3*' => 'locality',
1503
+        '2.5.6.4*' => 'organization',
1504
+        '2.5.6.5*' => 'organizationalUnit',
1505
+        '2.5.6.6*' => 'person',
1506
+        '2.5.6.7*' => 'organizationalPerson',
1507
+        '2.5.6.8*' => 'organizationalRole',
1508
+        '2.5.6.9*' => 'groupOfNames',
1509
+        '2.5.6.10*' => 'residentialPerson',
1510
+        '2.5.6.11*' => 'applicationProcess',
1511
+        '2.5.6.12*' => 'applicationEntity',
1512
+        '2.5.6.13*' => 'dSA',
1513
+        '2.5.6.14*' => 'device',
1514
+        '2.5.6.15*' => 'strongAuthenticationUser',
1515
+        '2.5.6.16*' => 'certificateAuthority',
1516
+        '2.5.6.17*' => 'groupOfUniqueNames',
1517
+        '2.5.6.21*' => 'pkiUser',
1518
+        '2.5.6.22*' => 'pkiCA',
1519
+        '2.5.8.1.1*' => 'rsa',
1520
+        '2.5.29.1*' => 'authorityKeyIdentifier',
1521
+        '2.5.29.2*' => 'keyAttributes',
1522
+        '2.5.29.3*' => 'certificatePolicies',
1523
+        '2.5.29.4*' => 'keyUsageRestriction',
1524
+        '2.5.29.5*' => 'policyMapping',
1525
+        '2.5.29.6*' => 'subtreesConstraint',
1526
+        '2.5.29.7*' => 'subjectAltName',
1527
+        '2.5.29.8*' => 'issuerAltName',
1528
+        '2.5.29.9*' => 'subjectDirectoryAttributes',
1529
+        '2.5.29.10*' => 'basicConstraints',
1530
+        '2.5.29.11*' => 'nameConstraints',
1531
+        '2.5.29.12*' => 'policyConstraints',
1532
+        '2.5.29.13*' => 'basicConstraints',
1533
+        '2.5.29.14*' => 'subjectKeyIdentifier',
1534
+        '2.5.29.15*' => 'keyUsage',
1535
+        '2.5.29.16*' => 'privateKeyUsagePeriod',
1536
+        '2.5.29.17*' => 'subjectAltName',
1537
+        '2.5.29.18*' => 'issuerAltName',
1538
+        '2.5.29.19*' => 'basicConstraints',
1539
+        '2.5.29.20*' => 'cRLNumber',
1540
+        '2.5.29.21*' => 'cRLReason',
1541
+        '2.5.29.22*' => 'expirationDate',
1542
+        '2.5.29.23*' => 'instructionCode',
1543
+        '2.5.29.24*' => 'invalidityDate',
1544
+        '2.5.29.25*' => 'cRLDistributionPoints',
1545
+        '2.5.29.26*' => 'issuingDistributionPoint',
1546
+        '2.5.29.27*' => 'deltaCRLIndicator',
1547
+        '2.5.29.28*' => 'issuingDistributionPoint',
1548
+        '2.5.29.29*' => 'certificateIssuer',
1549
+        '2.5.29.30*' => 'nameConstraints',
1550
+        '2.5.29.31*' => 'cRLDistributionPoints',
1551
+        '2.5.29.32*' => 'certificatePolicies',
1552
+        '2.5.29.32.0*' => 'anyPolicy',
1553
+        '2.5.29.33*' => 'policyMappings',
1554
+        '2.5.29.34*' => 'policyConstraints',
1555
+        '2.5.29.35*' => 'authorityKeyIdentifier',
1556
+        '2.5.29.36*' => 'policyConstraints',
1557
+        '2.5.29.37*' => 'extKeyUsage',
1558
+        '2.5.29.37.0*' => 'anyExtendedKeyUsage',
1559
+        '2.5.29.38*' => 'authorityAttributeIdentifier',
1560
+        '2.5.29.39*' => 'roleSpecCertIdentifier',
1561
+        '2.5.29.40*' => 'cRLStreamIdentifier',
1562
+        '2.5.29.41*' => 'basicAttConstraints',
1563
+        '2.5.29.42*' => 'delegatedNameConstraints',
1564
+        '2.5.29.43*' => 'timeSpecification',
1565
+        '2.5.29.44*' => 'cRLScope',
1566
+        '2.5.29.45*' => 'statusReferrals',
1567
+        '2.5.29.46*' => 'freshestCRL',
1568
+        '2.5.29.47*' => 'orderedList',
1569
+        '2.5.29.48*' => 'attributeDescriptor',
1570
+        '2.5.29.49*' => 'userNotice',
1571
+        '2.5.29.50*' => 'sOAIdentifier',
1572
+        '2.5.29.51*' => 'baseUpdateTime',
1573
+        '2.5.29.52*' => 'acceptableCertPolicies',
1574
+        '2.5.29.53*' => 'deltaInfo',
1575
+        '2.5.29.54*' => 'inhibitAnyPolicy',
1576
+        '2.5.29.55*' => 'targetInformation',
1577
+        '2.5.29.56*' => 'noRevAvail',
1578
+        '2.5.29.57*' => 'acceptablePrivilegePolicies',
1579
+        '2.5.29.58*' => 'toBeRevoked',
1580
+        '2.5.29.59*' => 'revokedGroups',
1581
+        '2.5.29.60*' => 'expiredCertsOnCRL',
1582
+        '2.5.29.61*' => 'indirectIssuer',
1583
+        '2.5.29.62*' => 'noAssertion',
1584
+        '2.5.29.63*' => 'aAissuingDistributionPoint',
1585
+        '2.5.29.64*' => 'issuedOnBehalfOf',
1586
+        '2.5.29.65*' => 'singleUse',
1587
+        '2.5.29.66*' => 'groupAC',
1588
+        '2.5.29.67*' => 'allowedAttAss',
1589
+        '2.5.29.68*' => 'attributeMappings',
1590
+        '2.5.29.69*' => 'holderNameConstraints',
1591
+        '2.16.840.1.101.2.1.1.1*' => 'sdnsSignatureAlgorithm',
1592
+        '2.16.840.1.101.2.1.1.2*' => 'fortezzaSignatureAlgorithm',
1593
+        '2.16.840.1.101.2.1.1.3*' => 'sdnsConfidentialityAlgorithm',
1594
+        '2.16.840.1.101.2.1.1.4*' => 'fortezzaConfidentialityAlgorithm',
1595
+        '2.16.840.1.101.2.1.1.5*' => 'sdnsIntegrityAlgorithm',
1596
+        '2.16.840.1.101.2.1.1.6*' => 'fortezzaIntegrityAlgorithm',
1597
+        '2.16.840.1.101.2.1.1.7*' => 'sdnsTokenProtectionAlgorithm',
1598
+        '2.16.840.1.101.2.1.1.8*' => 'fortezzaTokenProtectionAlgorithm',
1599
+        '2.16.840.1.101.2.1.1.9*' => 'sdnsKeyManagementAlgorithm',
1600
+        '2.16.840.1.101.2.1.1.10*' => 'fortezzaKeyManagementAlgorithm',
1601
+        '2.16.840.1.101.2.1.1.11*' => 'sdnsKMandSigAlgorithm',
1602
+        '2.16.840.1.101.2.1.1.12*' => 'fortezzaKMandSigAlgorithm',
1603
+        '2.16.840.1.101.2.1.1.13*' => 'suiteASignatureAlgorithm',
1604
+        '2.16.840.1.101.2.1.1.14*' => 'suiteAConfidentialityAlgorithm',
1605
+        '2.16.840.1.101.2.1.1.15*' => 'suiteAIntegrityAlgorithm',
1606
+        '2.16.840.1.101.2.1.1.16*' => 'suiteATokenProtectionAlgorithm',
1607
+        '2.16.840.1.101.2.1.1.17*' => 'suiteAKeyManagementAlgorithm',
1608
+        '2.16.840.1.101.2.1.1.18*' => 'suiteAKMandSigAlgorithm',
1609
+        '2.16.840.1.101.2.1.1.19*' => 'fortezzaUpdatedSigAlgorithm',
1610
+        '2.16.840.1.101.2.1.1.20*' => 'fortezzaKMandUpdSigAlgorithms',
1611
+        '2.16.840.1.101.2.1.1.21*' => 'fortezzaUpdatedIntegAlgorithm',
1612
+        '2.16.840.1.101.2.1.1.22*' => 'keyExchangeAlgorithm',
1613
+        '2.16.840.1.101.2.1.1.23*' => 'fortezzaWrap80Algorithm',
1614
+        '2.16.840.1.101.2.1.1.24*' => 'kEAKeyEncryptionAlgorithm',
1615
+        '2.16.840.1.101.2.1.2.1*' => 'rfc822MessageFormat',
1616
+        '2.16.840.1.101.2.1.2.2*' => 'emptyContent',
1617
+        '2.16.840.1.101.2.1.2.3*' => 'cspContentType',
1618
+        '2.16.840.1.101.2.1.2.42*' => 'mspRev3ContentType',
1619
+        '2.16.840.1.101.2.1.2.48*' => 'mspContentType',
1620
+        '2.16.840.1.101.2.1.2.49*' => 'mspRekeyAgentProtocol',
1621
+        '2.16.840.1.101.2.1.2.50*' => 'mspMMP',
1622
+        '2.16.840.1.101.2.1.2.66*' => 'mspRev3-1ContentType',
1623
+        '2.16.840.1.101.2.1.2.72*' => 'forwardedMSPMessageBodyPart',
1624
+        '2.16.840.1.101.2.1.2.73*' => 'mspForwardedMessageParameters',
1625
+        '2.16.840.1.101.2.1.2.74*' => 'forwardedCSPMsgBodyPart',
1626
+        '2.16.840.1.101.2.1.2.75*' => 'cspForwardedMessageParameters',
1627
+        '2.16.840.1.101.2.1.2.76*' => 'mspMMP2',
1628
+        '2.16.840.1.101.2.1.3.1*' => 'sdnsSecurityPolicy',
1629
+        '2.16.840.1.101.2.1.3.2*' => 'sdnsPRBAC',
1630
+        '2.16.840.1.101.2.1.3.3*' => 'mosaicPRBAC',
1631
+        '2.16.840.1.101.2.1.3.10*' => 'siSecurityPolicy',
1632
+        '2.16.840.1.101.2.1.3.10.0*' => 'siNASP',
1633
+        '2.16.840.1.101.2.1.3.10.1*' => 'siELCO',
1634
+        '2.16.840.1.101.2.1.3.10.2*' => 'siTK',
1635
+        '2.16.840.1.101.2.1.3.10.3*' => 'siDSAP',
1636
+        '2.16.840.1.101.2.1.3.10.4*' => 'siSSSS',
1637
+        '2.16.840.1.101.2.1.3.10.5*' => 'siDNASP',
1638
+        '2.16.840.1.101.2.1.3.10.6*' => 'siBYEMAN',
1639
+        '2.16.840.1.101.2.1.3.10.7*' => 'siREL-US',
1640
+        '2.16.840.1.101.2.1.3.10.8*' => 'siREL-AUS',
1641
+        '2.16.840.1.101.2.1.3.10.9*' => 'siREL-CAN',
1642
+        '2.16.840.1.101.2.1.3.10.10*' => 'siREL_UK',
1643
+        '2.16.840.1.101.2.1.3.10.11*' => 'siREL-NZ',
1644
+        '2.16.840.1.101.2.1.3.10.12*' => 'siGeneric',
1645
+        '2.16.840.1.101.2.1.3.11*' => 'genser',
1646
+        '2.16.840.1.101.2.1.3.11.0*' => 'genserNations',
1647
+        '2.16.840.1.101.2.1.3.11.1*' => 'genserComsec',
1648
+        '2.16.840.1.101.2.1.3.11.2*' => 'genserAcquisition',
1649
+        '2.16.840.1.101.2.1.3.11.3*' => 'genserSecurityCategories',
1650
+        '2.16.840.1.101.2.1.3.11.3.0*' => 'genserTagSetName',
1651
+        '2.16.840.1.101.2.1.3.12*' => 'defaultSecurityPolicy',
1652
+        '2.16.840.1.101.2.1.3.13*' => 'capcoMarkings',
1653
+        '2.16.840.1.101.2.1.3.13.0*' => 'capcoSecurityCategories',
1654
+        '2.16.840.1.101.2.1.3.13.0.1*' => 'capcoTagSetName1',
1655
+        '2.16.840.1.101.2.1.3.13.0.2*' => 'capcoTagSetName2',
1656
+        '2.16.840.1.101.2.1.3.13.0.3*' => 'capcoTagSetName3',
1657
+        '2.16.840.1.101.2.1.3.13.0.4*' => 'capcoTagSetName4',
1658
+        '2.16.840.1.101.2.1.5.1*' => 'sdnsKeyManagementCertificate',
1659
+        '2.16.840.1.101.2.1.5.2*' => 'sdnsUserSignatureCertificate',
1660
+        '2.16.840.1.101.2.1.5.3*' => 'sdnsKMandSigCertificate',
1661
+        '2.16.840.1.101.2.1.5.4*' => 'fortezzaKeyManagementCertificate',
1662
+        '2.16.840.1.101.2.1.5.5*' => 'fortezzaKMandSigCertificate',
1663
+        '2.16.840.1.101.2.1.5.6*' => 'fortezzaUserSignatureCertificate',
1664
+        '2.16.840.1.101.2.1.5.7*' => 'fortezzaCASignatureCertificate',
1665
+        '2.16.840.1.101.2.1.5.8*' => 'sdnsCASignatureCertificate',
1666
+        '2.16.840.1.101.2.1.5.10*' => 'auxiliaryVector',
1667
+        '2.16.840.1.101.2.1.5.11*' => 'mlReceiptPolicy',
1668
+        '2.16.840.1.101.2.1.5.12*' => 'mlMembership',
1669
+        '2.16.840.1.101.2.1.5.13*' => 'mlAdministrators',
1670
+        '2.16.840.1.101.2.1.5.14*' => 'alid',
1671
+        '2.16.840.1.101.2.1.5.20*' => 'janUKMs',
1672
+        '2.16.840.1.101.2.1.5.21*' => 'febUKMs',
1673
+        '2.16.840.1.101.2.1.5.22*' => 'marUKMs',
1674
+        '2.16.840.1.101.2.1.5.23*' => 'aprUKMs',
1675
+        '2.16.840.1.101.2.1.5.24*' => 'mayUKMs',
1676
+        '2.16.840.1.101.2.1.5.25*' => 'junUKMs',
1677
+        '2.16.840.1.101.2.1.5.26*' => 'julUKMs',
1678
+        '2.16.840.1.101.2.1.5.27*' => 'augUKMs',
1679
+        '2.16.840.1.101.2.1.5.28*' => 'sepUKMs',
1680
+        '2.16.840.1.101.2.1.5.29*' => 'octUKMs',
1681
+        '2.16.840.1.101.2.1.5.30*' => 'novUKMs',
1682
+        '2.16.840.1.101.2.1.5.31*' => 'decUKMs',
1683
+        '2.16.840.1.101.2.1.5.40*' => 'metaSDNSckl',
1684
+        '2.16.840.1.101.2.1.5.41*' => 'sdnsCKL',
1685
+        '2.16.840.1.101.2.1.5.42*' => 'metaSDNSsignatureCKL',
1686
+        '2.16.840.1.101.2.1.5.43*' => 'sdnsSignatureCKL',
1687
+        '2.16.840.1.101.2.1.5.44*' => 'sdnsCertificateRevocationList',
1688
+        '2.16.840.1.101.2.1.5.45*' => 'fortezzaCertificateRevocationList',
1689
+        '2.16.840.1.101.2.1.5.46*' => 'fortezzaCKL',
1690
+        '2.16.840.1.101.2.1.5.47*' => 'alExemptedAddressProcessor',
1691
+        '2.16.840.1.101.2.1.5.48*' => 'guard',
1692
+        '2.16.840.1.101.2.1.5.49*' => 'algorithmsSupported',
1693
+        '2.16.840.1.101.2.1.5.50*' => 'suiteAKeyManagementCertificate',
1694
+        '2.16.840.1.101.2.1.5.51*' => 'suiteAKMandSigCertificate',
1695
+        '2.16.840.1.101.2.1.5.52*' => 'suiteAUserSignatureCertificate',
1696
+        '2.16.840.1.101.2.1.5.53*' => 'prbacInfo',
1697
+        '2.16.840.1.101.2.1.5.54*' => 'prbacCAConstraints',
1698
+        '2.16.840.1.101.2.1.5.55*' => 'sigOrKMPrivileges',
1699
+        '2.16.840.1.101.2.1.5.56*' => 'commPrivileges',
1700
+        '2.16.840.1.101.2.1.5.57*' => 'labeledAttribute',
1701
+        '2.16.840.1.101.2.1.5.58*' => 'policyInformationFile',
1702
+        '2.16.840.1.101.2.1.5.59*' => 'secPolicyInformationFile',
1703
+        '2.16.840.1.101.2.1.5.60*' => 'cAClearanceConstraint',
1704
+        '2.16.840.1.101.2.1.7.1*' => 'cspExtns',
1705
+        '2.16.840.1.101.2.1.7.1.0*' => 'cspCsExtn',
1706
+        '2.16.840.1.101.2.1.8.1*' => 'mISSISecurityCategories',
1707
+        '2.16.840.1.101.2.1.8.2*' => 'standardSecurityLabelPrivileges',
1708
+        '2.16.840.1.101.2.1.10.1*' => 'sigPrivileges',
1709
+        '2.16.840.1.101.2.1.10.2*' => 'kmPrivileges',
1710
+        '2.16.840.1.101.2.1.10.3*' => 'namedTagSetPrivilege',
1711
+        '2.16.840.1.101.2.1.11.1*' => 'ukDemo',
1712
+        '2.16.840.1.101.2.1.11.2*' => 'usDODClass2',
1713
+        '2.16.840.1.101.2.1.11.3*' => 'usMediumPilot',
1714
+        '2.16.840.1.101.2.1.11.4*' => 'usDODClass4',
1715
+        '2.16.840.1.101.2.1.11.5*' => 'usDODClass3',
1716
+        '2.16.840.1.101.2.1.11.6*' => 'usDODClass5',
1717
+        '2.16.840.1.101.2.1.12.0*' => 'testSecurityPolicy',
1718
+        '2.16.840.1.101.2.1.12.0.1*' => 'tsp1',
1719
+        '2.16.840.1.101.2.1.12.0.1.0*' => 'tsp1SecurityCategories',
1720
+        '2.16.840.1.101.2.1.12.0.1.0.0*' => 'tsp1TagSetZero',
1721
+        '2.16.840.1.101.2.1.12.0.1.0.1*' => 'tsp1TagSetOne',
1722
+        '2.16.840.1.101.2.1.12.0.1.0.2*' => 'tsp1TagSetTwo',
1723
+        '2.16.840.1.101.2.1.12.0.2*' => 'tsp2',
1724
+        '2.16.840.1.101.2.1.12.0.2.0*' => 'tsp2SecurityCategories',
1725
+        '2.16.840.1.101.2.1.12.0.2.0.0*' => 'tsp2TagSetZero',
1726
+        '2.16.840.1.101.2.1.12.0.2.0.1*' => 'tsp2TagSetOne',
1727
+        '2.16.840.1.101.2.1.12.0.2.0.2*' => 'tsp2TagSetTwo',
1728
+        '2.16.840.1.101.2.1.12.0.3*' => 'kafka',
1729
+        '2.16.840.1.101.2.1.12.0.3.0*' => 'kafkaSecurityCategories',
1730
+        '2.16.840.1.101.2.1.12.0.3.0.1*' => 'kafkaTagSetName1',
1731
+        '2.16.840.1.101.2.1.12.0.3.0.2*' => 'kafkaTagSetName2',
1732
+        '2.16.840.1.101.2.1.12.0.3.0.3*' => 'kafkaTagSetName3',
1733
+        '2.16.840.1.101.2.1.12.1.1*' => 'tcp1',
1734
+        '2.16.840.1.101.3.1*' => 'slabel',
1735
+        '2.16.840.1.101.3.2*' => 'pki',
1736
+        '2.16.840.1.101.3.2.1*' => 'NIST policyIdentifier',
1737
+        '2.16.840.1.101.3.2.1.3.1*' => 'fbcaRudimentaryPolicy',
1738
+        '2.16.840.1.101.3.2.1.3.2*' => 'fbcaBasicPolicy',
1739
+        '2.16.840.1.101.3.2.1.3.3*' => 'fbcaMediumPolicy',
1740
+        '2.16.840.1.101.3.2.1.3.4*' => 'fbcaHighPolicy',
1741
+        '2.16.840.1.101.3.2.1.48.1*' => 'nistTestPolicy1',
1742
+        '2.16.840.1.101.3.2.1.48.2*' => 'nistTestPolicy2',
1743
+        '2.16.840.1.101.3.2.1.48.3*' => 'nistTestPolicy3',
1744
+        '2.16.840.1.101.3.2.1.48.4*' => 'nistTestPolicy4',
1745
+        '2.16.840.1.101.3.2.1.48.5*' => 'nistTestPolicy5',
1746
+        '2.16.840.1.101.3.2.1.48.6*' => 'nistTestPolicy6',
1747
+        '2.16.840.1.101.3.2.2*' => 'gak',
1748
+        '2.16.840.1.101.3.2.2.1*' => 'kRAKey',
1749
+        '2.16.840.1.101.3.2.3*' => 'extensions',
1750
+        '2.16.840.1.101.3.2.3.1*' => 'kRTechnique',
1751
+        '2.16.840.1.101.3.2.3.2*' => 'kRecoveryCapable',
1752
+        '2.16.840.1.101.3.2.3.3*' => 'kR',
1753
+        '2.16.840.1.101.3.2.4*' => 'keyRecoverySchemes',
1754
+        '2.16.840.1.101.3.2.5*' => 'krapola',
1755
+        '2.16.840.1.101.3.3*' => 'arpa',
1756
+        '2.16.840.1.101.3.4*' => 'nistAlgorithm',
1757
+        '2.16.840.1.101.3.4.1*' => 'aes',
1758
+        '2.16.840.1.101.3.4.1.1*' => 'aes128-ECB',
1759
+        '2.16.840.1.101.3.4.1.2*' => 'aes128-CBC',
1760
+        '2.16.840.1.101.3.4.1.3*' => 'aes128-OFB',
1761
+        '2.16.840.1.101.3.4.1.4*' => 'aes128-CFB',
1762
+        '2.16.840.1.101.3.4.1.5*' => 'aes128-wrap',
1763
+        '2.16.840.1.101.3.4.1.6*' => 'aes128-GCM',
1764
+        '2.16.840.1.101.3.4.1.7*' => 'aes128-CCM',
1765
+        '2.16.840.1.101.3.4.1.8*' => 'aes128-wrap-pad',
1766
+        '2.16.840.1.101.3.4.1.21*' => 'aes192-ECB',
1767
+        '2.16.840.1.101.3.4.1.22*' => 'aes192-CBC',
1768
+        '2.16.840.1.101.3.4.1.23*' => 'aes192-OFB',
1769
+        '2.16.840.1.101.3.4.1.24*' => 'aes192-CFB',
1770
+        '2.16.840.1.101.3.4.1.25*' => 'aes192-wrap',
1771
+        '2.16.840.1.101.3.4.1.26*' => 'aes192-GCM',
1772
+        '2.16.840.1.101.3.4.1.27*' => 'aes192-CCM',
1773
+        '2.16.840.1.101.3.4.1.28*' => 'aes192-wrap-pad',
1774
+        '2.16.840.1.101.3.4.1.41*' => 'aes256-ECB',
1775
+        '2.16.840.1.101.3.4.1.42*' => 'aes256-CBC',
1776
+        '2.16.840.1.101.3.4.1.43*' => 'aes256-OFB',
1777
+        '2.16.840.1.101.3.4.1.44*' => 'aes256-CFB',
1778
+        '2.16.840.1.101.3.4.1.45*' => 'aes256-wrap',
1779
+        '2.16.840.1.101.3.4.1.46*' => 'aes256-GCM',
1780
+        '2.16.840.1.101.3.4.1.47*' => 'aes256-CCM',
1781
+        '2.16.840.1.101.3.4.1.48*' => 'aes256-wrap-pad',
1782
+        '2.16.840.1.101.3.4.2*' => 'hashAlgos',
1783
+        '2.16.840.1.101.3.4.2.1*' => 'sha-256',
1784
+        '2.16.840.1.101.3.4.2.2*' => 'sha-384',
1785
+        '2.16.840.1.101.3.4.2.3*' => 'sha-512',
1786
+        '2.16.840.1.101.3.4.2.4*' => 'sha-224',
1787
+        '2.16.840.1.101.3.4.3.1*' => 'dsaWithSha224',
1788
+        '2.16.840.1.101.3.4.3.2*' => 'dsaWithSha256',
1789
+        '2.16.840.1.113719.1.2.8*' => 'novellAlgorithm',
1790
+        '2.16.840.1.113719.1.2.8.22*' => 'desCbcIV8',
1791
+        '2.16.840.1.113719.1.2.8.23*' => 'desCbcPadIV8',
1792
+        '2.16.840.1.113719.1.2.8.24*' => 'desEDE2CbcIV8',
1793
+        '2.16.840.1.113719.1.2.8.25*' => 'desEDE2CbcPadIV8',
1794
+        '2.16.840.1.113719.1.2.8.26*' => 'desEDE3CbcIV8',
1795
+        '2.16.840.1.113719.1.2.8.27*' => 'desEDE3CbcPadIV8',
1796
+        '2.16.840.1.113719.1.2.8.28*' => 'rc5CbcPad',
1797
+        '2.16.840.1.113719.1.2.8.29*' => 'md2WithRSAEncryptionBSafe1',
1798
+        '2.16.840.1.113719.1.2.8.30*' => 'md5WithRSAEncryptionBSafe1',
1799
+        '2.16.840.1.113719.1.2.8.31*' => 'sha1WithRSAEncryptionBSafe1',
1800
+        '2.16.840.1.113719.1.2.8.32*' => 'lmDigest',
1801
+        '2.16.840.1.113719.1.2.8.40*' => 'md2',
1802
+        '2.16.840.1.113719.1.2.8.50*' => 'md5',
1803
+        '2.16.840.1.113719.1.2.8.51*' => 'ikeHmacWithSHA1-RSA',
1804
+        '2.16.840.1.113719.1.2.8.52*' => 'ikeHmacWithMD5-RSA',
1805
+        '2.16.840.1.113719.1.2.8.69*' => 'rc2CbcPad',
1806
+        '2.16.840.1.113719.1.2.8.82*' => 'sha-1',
1807
+        '2.16.840.1.113719.1.2.8.92*' => 'rc2BSafe1Cbc',
1808
+        '2.16.840.1.113719.1.2.8.95*' => 'md4',
1809
+        '2.16.840.1.113719.1.2.8.130*' => 'md4Packet',
1810
+        '2.16.840.1.113719.1.2.8.131*' => 'rsaEncryptionBsafe1',
1811
+        '2.16.840.1.113719.1.2.8.132*' => 'nwPassword',
1812
+        '2.16.840.1.113719.1.2.8.133*' => 'novellObfuscate-1',
1813
+        '2.16.840.1.113719.1.9*' => 'pki',
1814
+        '2.16.840.1.113719.1.9.4*' => 'pkiAttributeType',
1815
+        '2.16.840.1.113719.1.9.4.1*' => 'securityAttributes',
1816
+        '2.16.840.1.113719.1.9.4.2*' => 'relianceLimit',
1817
+        '2.16.840.1.113730.1*' => 'cert-extension',
1818
+        '2.16.840.1.113730.1.1*' => 'netscape-cert-type',
1819
+        '2.16.840.1.113730.1.2*' => 'netscape-base-url',
1820
+        '2.16.840.1.113730.1.3*' => 'netscape-revocation-url',
1821
+        '2.16.840.1.113730.1.4*' => 'netscape-ca-revocation-url',
1822
+        '2.16.840.1.113730.1.7*' => 'netscape-cert-renewal-url',
1823
+        '2.16.840.1.113730.1.8*' => 'netscape-ca-policy-url',
1824
+        '2.16.840.1.113730.1.9*' => 'HomePage-url',
1825
+        '2.16.840.1.113730.1.10*' => 'EntityLogo',
1826
+        '2.16.840.1.113730.1.11*' => 'UserPicture',
1827
+        '2.16.840.1.113730.1.12*' => 'netscape-ssl-server-name',
1828
+        '2.16.840.1.113730.1.13*' => 'netscape-comment',
1829
+        '2.16.840.1.113730.2*' => 'data-type',
1830
+        '2.16.840.1.113730.2.1*' => 'dataGIF',
1831
+        '2.16.840.1.113730.2.2*' => 'dataJPEG',
1832
+        '2.16.840.1.113730.2.3*' => 'dataURL',
1833
+        '2.16.840.1.113730.2.4*' => 'dataHTML',
1834
+        '2.16.840.1.113730.2.5*' => 'certSequence',
1835
+        '2.16.840.1.113730.2.6*' => 'certURL',
1836
+        '2.16.840.1.113730.3*' => 'directory',
1837
+        '2.16.840.1.113730.3.1*' => 'ldapDefinitions',
1838
+        '2.16.840.1.113730.3.1.1*' => 'carLicense',
1839
+        '2.16.840.1.113730.3.1.2*' => 'departmentNumber',
1840
+        '2.16.840.1.113730.3.1.3*' => 'employeeNumber',
1841
+        '2.16.840.1.113730.3.1.4*' => 'employeeType',
1842
+        '2.16.840.1.113730.3.2.2*' => 'inetOrgPerson',
1843
+        '2.16.840.1.113730.4.1*' => 'serverGatedCrypto',
1844
+        '2.16.840.1.113733.1.6.3*' => 'verisignCZAG',
1845
+        '2.16.840.1.113733.1.6.6*' => 'verisignInBox',
1846
+        '2.16.840.1.113733.1.6.11*' => 'verisignOnsiteJurisdictionHash',
1847
+        '2.16.840.1.113733.1.6.13*' => 'Unknown Verisign VPN extension',
1848
+        '2.16.840.1.113733.1.6.15*' => 'verisignServerID',
1849
+        '2.16.840.1.113733.1.7.1.1*' => 'verisignCertPolicies95Qualifier1',
1850
+        '2.16.840.1.113733.1.7.1.1.1*' => 'verisignCPSv1notice',
1851
+        '2.16.840.1.113733.1.7.1.1.2*' => 'verisignCPSv1nsi',
1852
+        '2.16.840.1.113733.1.7.23.6*' => 'VeriSign EV policy',
1853
+        '2.16.840.1.113733.1.8.1*' => 'verisignISSStrongCrypto',
1854
+        '2.16.840.1.113733.1*' => 'pki',
1855
+        '2.16.840.1.113733.1.9*' => 'pkcs7Attribute',
1856
+        '2.16.840.1.113733.1.9.2*' => 'messageType',
1857
+        '2.16.840.1.113733.1.9.3*' => 'pkiStatus',
1858
+        '2.16.840.1.113733.1.9.4*' => 'failInfo',
1859
+        '2.16.840.1.113733.1.9.5*' => 'senderNonce',
1860
+        '2.16.840.1.113733.1.9.6*' => 'recipientNonce',
1861
+        '2.16.840.1.113733.1.9.7*' => 'transID',
1862
+        '2.16.840.1.113733.1.9.8*' => 'extensionReq',
1863
+        '2.16.840.1.114412.1.3.0.1*' => 'digiCertGlobalCAPolicy',
1864
+        '2.16.840.1.114412.1.3.0.2*' => 'digiCertHighAssuranceEVCAPolicy',
1865
+        '2.16.840.1.114412.1.3.0.3*' => 'digiCertGlobalRootCAPolicy',
1866
+        '2.16.840.1.114412.1.3.0.4*' => 'digiCertAssuredIDRootCAPolicy',
1867
+        '2.23.42.0*' => 'contentType',
1868
+        '2.23.42.0.0*' => 'panData',
1869
+        '2.23.42.0.1*' => 'panToken',
1870
+        '2.23.42.0.2*' => 'panOnly',
1871
+        '2.23.42.1*' => 'msgExt',
1872
+        '2.23.42.2*' => 'field',
1873
+        '2.23.42.2.0*' => 'fullName',
1874
+        '2.23.42.2.1*' => 'givenName',
1875
+        '2.23.42.2.2*' => 'familyName',
1876
+        '2.23.42.2.3*' => 'birthFamilyName',
1877
+        '2.23.42.2.4*' => 'placeName',
1878
+        '2.23.42.2.5*' => 'identificationNumber',
1879
+        '2.23.42.2.6*' => 'month',
1880
+        '2.23.42.2.7*' => 'date',
1881
+        '2.23.42.2.8*' => 'address',
1882
+        '2.23.42.2.9*' => 'telephone',
1883
+        '2.23.42.2.10*' => 'amount',
1884
+        '2.23.42.2.11*' => 'accountNumber',
1885
+        '2.23.42.2.12*' => 'passPhrase',
1886
+        '2.23.42.3*' => 'attribute',
1887
+        '2.23.42.3.0*' => 'cert',
1888
+        '2.23.42.3.0.0*' => 'rootKeyThumb',
1889
+        '2.23.42.3.0.1*' => 'additionalPolicy',
1890
+        '2.23.42.4*' => 'algorithm',
1891
+        '2.23.42.5*' => 'policy',
1892
+        '2.23.42.5.0*' => 'root',
1893
+        '2.23.42.6*' => 'module',
1894
+        '2.23.42.7*' => 'certExt',
1895
+        '2.23.42.7.0*' => 'hashedRootKey',
1896
+        '2.23.42.7.1*' => 'certificateType',
1897
+        '2.23.42.7.2*' => 'merchantData',
1898
+        '2.23.42.7.3*' => 'cardCertRequired',
1899
+        '2.23.42.7.4*' => 'tunneling',
1900
+        '2.23.42.7.5*' => 'setExtensions',
1901
+        '2.23.42.7.6*' => 'setQualifier',
1902
+        '2.23.42.8*' => 'brand',
1903
+        '2.23.42.8.1*' => 'IATA-ATA',
1904
+        '2.23.42.8.4*' => 'VISA',
1905
+        '2.23.42.8.5*' => 'MasterCard',
1906
+        '2.23.42.8.30*' => 'Diners',
1907
+        '2.23.42.8.34*' => 'AmericanExpress',
1908
+        '2.23.42.8.6011*' => 'Novus',
1909
+        '2.23.42.9*' => 'vendor',
1910
+        '2.23.42.9.0*' => 'GlobeSet',
1911
+        '2.23.42.9.1*' => 'IBM',
1912
+        '2.23.42.9.2*' => 'CyberCash',
1913
+        '2.23.42.9.3*' => 'Terisa',
1914
+        '2.23.42.9.4*' => 'RSADSI',
1915
+        '2.23.42.9.5*' => 'VeriFone',
1916
+        '2.23.42.9.6*' => 'TrinTech',
1917
+        '2.23.42.9.7*' => 'BankGate',
1918
+        '2.23.42.9.8*' => 'GTE',
1919
+        '2.23.42.9.9*' => 'CompuSource',
1920
+        '2.23.42.9.10*' => 'Griffin',
1921
+        '2.23.42.9.11*' => 'Certicom',
1922
+        '2.23.42.9.12*' => 'OSS',
1923
+        '2.23.42.9.13*' => 'TenthMountain',
1924
+        '2.23.42.9.14*' => 'Antares',
1925
+        '2.23.42.9.15*' => 'ECC',
1926
+        '2.23.42.9.16*' => 'Maithean',
1927
+        '2.23.42.9.17*' => 'Netscape',
1928
+        '2.23.42.9.18*' => 'Verisign',
1929
+        '2.23.42.9.19*' => 'BlueMoney',
1930
+        '2.23.42.9.20*' => 'Lacerte',
1931
+        '2.23.42.9.21*' => 'Fujitsu',
1932
+        '2.23.42.9.22*' => 'eLab',
1933
+        '2.23.42.9.23*' => 'Entrust',
1934
+        '2.23.42.9.24*' => 'VIAnet',
1935
+        '2.23.42.9.25*' => 'III',
1936
+        '2.23.42.9.26*' => 'OpenMarket',
1937
+        '2.23.42.9.27*' => 'Lexem',
1938
+        '2.23.42.9.28*' => 'Intertrader',
1939
+        '2.23.42.9.29*' => 'Persimmon',
1940
+        '2.23.42.9.30*' => 'NABLE',
1941
+        '2.23.42.9.31*' => 'espace-net',
1942
+        '2.23.42.9.32*' => 'Hitachi',
1943
+        '2.23.42.9.33*' => 'Microsoft',
1944
+        '2.23.42.9.34*' => 'NEC',
1945
+        '2.23.42.9.35*' => 'Mitsubishi',
1946
+        '2.23.42.9.36*' => 'NCR',
1947
+        '2.23.42.9.37*' => 'e-COMM',
1948
+        '2.23.42.9.38*' => 'Gemplus',
1949
+        '2.23.42.10*' => 'national',
1950
+        '2.23.42.10.392*' => 'Japan',
1951
+        '2.23.136.1.1.1*' => 'mRTDSignatureData',
1952
+        '2.54.1775.2*' => 'hashedRootKey',
1953
+        '2.54.1775.3*' => 'certificateType',
1954
+        '2.54.1775.4*' => 'merchantData',
1955
+        '2.54.1775.5*' => 'cardCertRequired',
1956
+        '2.54.1775.6*' => 'tunneling',
1957
+        '2.54.1775.7*' => 'setQualifier',
1958
+        '2.54.1775.99*' => 'setData',
1959
+        '1.3.6.1.4.1.6449.1.2.1.5.1*' => 'UTN-USERFirst EV policy',
1960
+        '1.3.6.1.4.1.34697.2.1*' => 'AffirmTrust EV policy',
1961
+        '1.3.6.1.4.1.34697.2.2*' => 'AffirmTrust EV policy',
1962
+        '1.3.6.1.4.1.34697.2.3*' => 'AffirmTrust EV policy',
1963
+        '1.3.6.1.4.1.34697.2.4*' => 'AffirmTrust EV policy',
1964
+        '1.3.6.1.4.1.22234.2.5.2.3.1*' => 'CertPlus EV policy',
1965
+        '1.3.6.1.4.1.6334.1.100.1*' => 'GTE CyberTrust EV policy',
1966
+        '2.16.840.1.114412.2.1*' => 'DigiCert EV policy',
1967
+        '2.16.528.1.1001.1.1.1.12.6.1.1.1*' => 'DigiNotar EV policy',
1968
+        '2.16.840.1.114028.10.1.2*' => 'Entrust EV policy',
1969
+        '1.3.6.1.4.1.14370.1.6*' => 'GeoTrust EV policy',
1970
+        '1.3.6.1.4.1.4146.1.1*' => 'GlobalSign EV policy',
1971
+        '2.16.840.1.114413.1.7.23.3*' => 'ValiCert EV policy',
1972
+        '1.3.6.1.4.1.782.1.2.1.8.1*' => 'Network Solutions EV policy',
1973
+        '1.3.6.1.4.1.8024.0.2.100.1.2*' => 'QuoVadis EV policy',
1974
+        '2.16.840.1.114404.1.1.2.4.1*' => 'Secure Global EV policy',
1975
+        '1.2.392.200091.100.721.1*' => 'Security Communication EV policy',
1976
+        '1.3.6.1.4.1.23223.1.1.1*' => 'StartCom EV policy',
1977
+        '2.16.840.1.114414.1.7.23.3*' => 'Starfield EV policy',
1978
+        '2.16.756.1.89.1.2.1.1*' => 'SwissSign EV policy',
1979
+        '2.16.840.1.113733.1.7.48.1*' => 'Thawte EV policy',
1980
+        '2.16.840.1.114171.500.9*' => 'Wells Fargo EV policy',
1981
+    ];
1982 1982
 }
Please login to merge, or discard this patch.
plugins/smime/php/lib/Der.php 3 patches
Indentation   +262 added lines, -262 removed lines patch added patch discarded remove patch
@@ -5,269 +5,269 @@
 block discarded – undo
5 5
 require_once 'Oids.php';
6 6
 
7 7
 class Der extends Oids {
8
-	protected $tag;
9
-	protected $len;
10
-	protected $value;
11
-	protected $class;
12
-	protected $constructed;
13
-	protected $buffer;
14
-	protected $stack = [];
15
-	protected $i;
16
-	private $ignoredextensions = [
17
-		'netscape-cert-type' => 1,
18
-	];
19
-	private $id;
20
-
21
-	protected function init($der) {
22
-		$this->buffer = $der;
23
-		$this->i = 0;
24
-		$this->id = uniqid();
25
-	}
26
-
27
-	protected function dump($note = '') {
28
-		$z = strlen($this->buffer) - $this->i;
29
-		print_r("{$note}\n");
30
-		print_r("len: {$z}\n");
31
-		print_r(chunk_split(bin2hex(substr($this->buffer, $this->i)), 2, ':'));
32
-		echo "\n";
33
-	}
34
-
35
-	protected function pr($note = '') {
36
-		$savei = $this->i;
37
-		$byte = ord($this->buffer[$this->i++]);
38
-		$tag = $byte & 0x1F;
39
-		$class = $byte & 0xC0;
40
-		$constructed = $byte & 0x20;
41
-		$len = $this->vallen();
42
-		$this->i = $savei;
43
-		print_r("{$note}\n");
44
-		print_r("i  : {$this->i}\n");
45
-		print_r("len: {$len}\n");
46
-		print_r("class:   {$class}\n");
47
-		print_r("tag  :   {$tag}\n");
48
-		print_r(chunk_split(bin2hex(substr($this->buffer, $this->i, min(32, strlen($this->buffer) - $this->i))) . "\n", 2, ':'));
49
-		print_r("---\n");
50
-	}
51
-
52
-	private function tlv($expectedtag = null) {
53
-		$byte = ord($this->buffer[$this->i++]);
54
-		$this->tag = $byte & 0x1F;
55
-		if ($expectedtag < 0) {
56
-			$this->tag = $expectedtag = -$expectedtag;
57
-		}
58
-		if ($expectedtag && $expectedtag != $this->tag) {
59
-			trigger_error("expected tag == {$expectedtag}, got {$this->tag} {$this->id}\n", E_USER_ERROR);
60
-		}
61
-		$this->class = $byte & 0xC0;
62
-		$this->constructed = $byte & 0x20;
63
-		$this->len = $this->vallen();
64
-	}
65
-
66
-	protected function next($expectedtag = null) {
67
-		$this->tlv($expectedtag);
68
-		if ($this->constructed) {
69
-			return;
70
-		}
71
-		$value = substr($this->buffer, $this->i, $this->len);
72
-		if ($this->class == 0 || $this->class == 0x80) {
73
-			if ($this->tag == 2 || $this->tag == 10) { # ints and enums
74
-				$int = 0;
75
-				foreach (str_split($value) as $byte) {
76
-					$int = bcmul($int, '256', 0);
77
-					$int = bcadd($int, ord($byte), 0);
78
-				}
79
-				$this->value = $int;
80
-			}
81
-			elseif ($this->tag == 1) { # boolean
82
-				$this->value = ord($value) != 0;
83
-			}
84
-			elseif ($this->tag == 3) { # bit string
85
-				$this->value = $value;
86
-			}
87
-			elseif ($this->tag == 5) { # null
88
-				$this->value = null;
89
-			}
90
-			else {
91
-				$this->value = $value;
92
-			}
93
-		}
94
-		$this->i += $this->len;
95
-
96
-		return $this->value;
97
-	}
98
-
99
-	protected function der($expectedtag = null, $pass = false) {
100
-		$oldi = $this->i;
101
-		$this->tlv($expectedtag);
102
-		$i = $this->i;
103
-		if (!$pass) {
104
-			$this->i = $oldi;
105
-		}
106
-		else {
107
-			$this->i += $this->len;
108
-		}
109
-
110
-		return substr($this->buffer, $oldi, $this->len + $i - $oldi);
111
-	}
112
-
113
-	/*
8
+    protected $tag;
9
+    protected $len;
10
+    protected $value;
11
+    protected $class;
12
+    protected $constructed;
13
+    protected $buffer;
14
+    protected $stack = [];
15
+    protected $i;
16
+    private $ignoredextensions = [
17
+        'netscape-cert-type' => 1,
18
+    ];
19
+    private $id;
20
+
21
+    protected function init($der) {
22
+        $this->buffer = $der;
23
+        $this->i = 0;
24
+        $this->id = uniqid();
25
+    }
26
+
27
+    protected function dump($note = '') {
28
+        $z = strlen($this->buffer) - $this->i;
29
+        print_r("{$note}\n");
30
+        print_r("len: {$z}\n");
31
+        print_r(chunk_split(bin2hex(substr($this->buffer, $this->i)), 2, ':'));
32
+        echo "\n";
33
+    }
34
+
35
+    protected function pr($note = '') {
36
+        $savei = $this->i;
37
+        $byte = ord($this->buffer[$this->i++]);
38
+        $tag = $byte & 0x1F;
39
+        $class = $byte & 0xC0;
40
+        $constructed = $byte & 0x20;
41
+        $len = $this->vallen();
42
+        $this->i = $savei;
43
+        print_r("{$note}\n");
44
+        print_r("i  : {$this->i}\n");
45
+        print_r("len: {$len}\n");
46
+        print_r("class:   {$class}\n");
47
+        print_r("tag  :   {$tag}\n");
48
+        print_r(chunk_split(bin2hex(substr($this->buffer, $this->i, min(32, strlen($this->buffer) - $this->i))) . "\n", 2, ':'));
49
+        print_r("---\n");
50
+    }
51
+
52
+    private function tlv($expectedtag = null) {
53
+        $byte = ord($this->buffer[$this->i++]);
54
+        $this->tag = $byte & 0x1F;
55
+        if ($expectedtag < 0) {
56
+            $this->tag = $expectedtag = -$expectedtag;
57
+        }
58
+        if ($expectedtag && $expectedtag != $this->tag) {
59
+            trigger_error("expected tag == {$expectedtag}, got {$this->tag} {$this->id}\n", E_USER_ERROR);
60
+        }
61
+        $this->class = $byte & 0xC0;
62
+        $this->constructed = $byte & 0x20;
63
+        $this->len = $this->vallen();
64
+    }
65
+
66
+    protected function next($expectedtag = null) {
67
+        $this->tlv($expectedtag);
68
+        if ($this->constructed) {
69
+            return;
70
+        }
71
+        $value = substr($this->buffer, $this->i, $this->len);
72
+        if ($this->class == 0 || $this->class == 0x80) {
73
+            if ($this->tag == 2 || $this->tag == 10) { # ints and enums
74
+                $int = 0;
75
+                foreach (str_split($value) as $byte) {
76
+                    $int = bcmul($int, '256', 0);
77
+                    $int = bcadd($int, ord($byte), 0);
78
+                }
79
+                $this->value = $int;
80
+            }
81
+            elseif ($this->tag == 1) { # boolean
82
+                $this->value = ord($value) != 0;
83
+            }
84
+            elseif ($this->tag == 3) { # bit string
85
+                $this->value = $value;
86
+            }
87
+            elseif ($this->tag == 5) { # null
88
+                $this->value = null;
89
+            }
90
+            else {
91
+                $this->value = $value;
92
+            }
93
+        }
94
+        $this->i += $this->len;
95
+
96
+        return $this->value;
97
+    }
98
+
99
+    protected function der($expectedtag = null, $pass = false) {
100
+        $oldi = $this->i;
101
+        $this->tlv($expectedtag);
102
+        $i = $this->i;
103
+        if (!$pass) {
104
+            $this->i = $oldi;
105
+        }
106
+        else {
107
+            $this->i += $this->len;
108
+        }
109
+
110
+        return substr($this->buffer, $oldi, $this->len + $i - $oldi);
111
+    }
112
+
113
+    /*
114 114
 	 * if provided with a tag and the tag is equal to the current tag
115 115
 	 * peek considers it EXPLICIT, consumes it and return true
116 116
 	 */
117
-	protected function peek($tag = null) {
118
-		$t = null;
119
-		if ($this->i < end($this->stack)) {
120
-			$t = ord($this->buffer[$this->i]) & 0x1F;
121
-		}
122
-		if ($tag !== null) {
123
-			if ($t === $tag) {
124
-				$this->next($tag);
125
-
126
-				return true;
127
-			}
128
-
129
-			return false;
130
-		}
131
-
132
-		return $t;
133
-	}
134
-
135
-	protected function vallen() {
136
-		$byte = ord($this->buffer[$this->i++]);
137
-		$res = $len = $byte & 0x7F;
138
-		if ($byte >= 0x80) {
139
-			$res = 0;
140
-			for ($c = 0; $c < $len; ++$c) {
141
-				$res = $res * 256 + ord($this->buffer[$this->i++]);
142
-			}
143
-		}
144
-
145
-		return $res;
146
-	}
147
-
148
-	protected function beginsequence($tag = 16) {
149
-		$this->begin($tag);
150
-	}
151
-
152
-	protected function beginset($tag = 17) {
153
-		$this->begin($tag);
154
-	}
155
-
156
-	protected function begin($tag) {
157
-		$this->next($tag);
158
-		array_push($this->stack, $this->i + $this->len);
159
-	}
160
-
161
-	protected function in() {
162
-		return $this->i < end($this->stack);
163
-	}
164
-
165
-	protected function end() {
166
-		$end = array_pop($this->stack);
167
-		if ($end != $this->i) {
168
-			trigger_error("sequence or set length does not match: {$end} != {$this->i}", E_USER_ERROR);
169
-		}
170
-	}
171
-
172
-	protected function extensions() {
173
-		$this->beginsequence();
174
-		$extns = [];
175
-		while ($this->in()) {
176
-			$this->beginsequence();
177
-			$extnID = $this->oid();
178
-			$theext['critical'] = $this->peek(1);
179
-			$theext['extnValue'] = $this->next(4);
180
-
181
-			try {
182
-				if (method_exists($this, $extnID)) {
183
-					$theext['extnValue'] = call_user_func([$this, $extnID], $theext['extnValue']);
184
-				}
185
-				elseif (!empty($ignoredextensions['$extnID'])) {
186
-					trigger_error("Unknown extension {$extnID}", E_USER_ERROR);
187
-				}
188
-				else {
189
-					$theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
190
-				}
191
-			}
192
-			catch (\Exception $e) {
193
-				$theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
194
-			}
195
-			$this->end();
196
-			$extns[$extnID] = $theext;
197
-		}
198
-		$this->end();
199
-
200
-		return $extns;
201
-	}
202
-
203
-	protected function signatureAlgorithm() {
204
-		$this->beginsequence();
205
-		$salg = $this->oid();
206
-		if ($this->in()) {
207
-			$this->next(); # alg param - ignore for now
208
-		}
209
-		$this->end();
210
-
211
-		return $salg;
212
-	}
213
-
214
-	protected function name($tag = null) {
215
-		$this->beginsequence($tag);  # seq of RDN
216
-		$res = [];
217
-		while ($this->in()) {
218
-			$parts = [];
219
-			$this->beginset(); # set of AttributeTypeAndValue
220
-			while ($this->in()) {
221
-				$this->beginsequence();
222
-				$parts[$this->oid()] = $this->next(); # AttributeValue
223
-				$this->end();
224
-			}
225
-			$this->end();
226
-			$res[] = $parts;
227
-		}
228
-		$this->end();
229
-
230
-		return $res;
231
-	}
232
-
233
-	protected function oid($tag = 6) {
234
-		$v = $this->oid_($this->next($tag));
235
-		if (isset($this->oids[$v])) {
236
-			return $this->oids[$v];
237
-		}
238
-
239
-		return $v;
240
-	}
241
-
242
-	protected function oid_($oid) {
243
-		$len = strlen($oid);
244
-		$v = "";
245
-		$n = 0;
246
-		for ($c = 0; $c < $len; ++$c) {
247
-			$x = ord($oid[$c]);
248
-			$n = $n * 128 + ($x & 0x7F);
249
-			if ($x <= 127) {
250
-				$v .= $v ? '.' . $n : ((int) ($n / 40) . '.' . ($n % 40));
251
-				$n = 0;
252
-			}
253
-		}
254
-
255
-		return $v . '*';
256
-	}
257
-
258
-	protected function time($tag = null) {
259
-		$time = $this->next($tag);
260
-		if ($this->tag == 23) {
261
-			$time = (substr($time, 0, 2) < 50 ? '20' : '19') . $time;
262
-		}
263
-		elseif ($this->tag != 24) {
264
-			trigger_error('expected der utc or generalized time', E_USER_ERROR);
265
-		}
266
-
267
-		return $time;
268
-	}
269
-
270
-	protected function keyident($tag = 4) {
271
-		return chunk_split(bin2hex($this->next($tag)), 2, ':');
272
-	}
117
+    protected function peek($tag = null) {
118
+        $t = null;
119
+        if ($this->i < end($this->stack)) {
120
+            $t = ord($this->buffer[$this->i]) & 0x1F;
121
+        }
122
+        if ($tag !== null) {
123
+            if ($t === $tag) {
124
+                $this->next($tag);
125
+
126
+                return true;
127
+            }
128
+
129
+            return false;
130
+        }
131
+
132
+        return $t;
133
+    }
134
+
135
+    protected function vallen() {
136
+        $byte = ord($this->buffer[$this->i++]);
137
+        $res = $len = $byte & 0x7F;
138
+        if ($byte >= 0x80) {
139
+            $res = 0;
140
+            for ($c = 0; $c < $len; ++$c) {
141
+                $res = $res * 256 + ord($this->buffer[$this->i++]);
142
+            }
143
+        }
144
+
145
+        return $res;
146
+    }
147
+
148
+    protected function beginsequence($tag = 16) {
149
+        $this->begin($tag);
150
+    }
151
+
152
+    protected function beginset($tag = 17) {
153
+        $this->begin($tag);
154
+    }
155
+
156
+    protected function begin($tag) {
157
+        $this->next($tag);
158
+        array_push($this->stack, $this->i + $this->len);
159
+    }
160
+
161
+    protected function in() {
162
+        return $this->i < end($this->stack);
163
+    }
164
+
165
+    protected function end() {
166
+        $end = array_pop($this->stack);
167
+        if ($end != $this->i) {
168
+            trigger_error("sequence or set length does not match: {$end} != {$this->i}", E_USER_ERROR);
169
+        }
170
+    }
171
+
172
+    protected function extensions() {
173
+        $this->beginsequence();
174
+        $extns = [];
175
+        while ($this->in()) {
176
+            $this->beginsequence();
177
+            $extnID = $this->oid();
178
+            $theext['critical'] = $this->peek(1);
179
+            $theext['extnValue'] = $this->next(4);
180
+
181
+            try {
182
+                if (method_exists($this, $extnID)) {
183
+                    $theext['extnValue'] = call_user_func([$this, $extnID], $theext['extnValue']);
184
+                }
185
+                elseif (!empty($ignoredextensions['$extnID'])) {
186
+                    trigger_error("Unknown extension {$extnID}", E_USER_ERROR);
187
+                }
188
+                else {
189
+                    $theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
190
+                }
191
+            }
192
+            catch (\Exception $e) {
193
+                $theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
194
+            }
195
+            $this->end();
196
+            $extns[$extnID] = $theext;
197
+        }
198
+        $this->end();
199
+
200
+        return $extns;
201
+    }
202
+
203
+    protected function signatureAlgorithm() {
204
+        $this->beginsequence();
205
+        $salg = $this->oid();
206
+        if ($this->in()) {
207
+            $this->next(); # alg param - ignore for now
208
+        }
209
+        $this->end();
210
+
211
+        return $salg;
212
+    }
213
+
214
+    protected function name($tag = null) {
215
+        $this->beginsequence($tag);  # seq of RDN
216
+        $res = [];
217
+        while ($this->in()) {
218
+            $parts = [];
219
+            $this->beginset(); # set of AttributeTypeAndValue
220
+            while ($this->in()) {
221
+                $this->beginsequence();
222
+                $parts[$this->oid()] = $this->next(); # AttributeValue
223
+                $this->end();
224
+            }
225
+            $this->end();
226
+            $res[] = $parts;
227
+        }
228
+        $this->end();
229
+
230
+        return $res;
231
+    }
232
+
233
+    protected function oid($tag = 6) {
234
+        $v = $this->oid_($this->next($tag));
235
+        if (isset($this->oids[$v])) {
236
+            return $this->oids[$v];
237
+        }
238
+
239
+        return $v;
240
+    }
241
+
242
+    protected function oid_($oid) {
243
+        $len = strlen($oid);
244
+        $v = "";
245
+        $n = 0;
246
+        for ($c = 0; $c < $len; ++$c) {
247
+            $x = ord($oid[$c]);
248
+            $n = $n * 128 + ($x & 0x7F);
249
+            if ($x <= 127) {
250
+                $v .= $v ? '.' . $n : ((int) ($n / 40) . '.' . ($n % 40));
251
+                $n = 0;
252
+            }
253
+        }
254
+
255
+        return $v . '*';
256
+    }
257
+
258
+    protected function time($tag = null) {
259
+        $time = $this->next($tag);
260
+        if ($this->tag == 23) {
261
+            $time = (substr($time, 0, 2) < 50 ? '20' : '19') . $time;
262
+        }
263
+        elseif ($this->tag != 24) {
264
+            trigger_error('expected der utc or generalized time', E_USER_ERROR);
265
+        }
266
+
267
+        return $time;
268
+    }
269
+
270
+    protected function keyident($tag = 4) {
271
+        return chunk_split(bin2hex($this->next($tag)), 2, ':');
272
+    }
273 273
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -212,7 +212,7 @@
 block discarded – undo
212 212
 	}
213 213
 
214 214
 	protected function name($tag = null) {
215
-		$this->beginsequence($tag);  # seq of RDN
215
+		$this->beginsequence($tag); # seq of RDN
216 216
 		$res = [];
217 217
 		while ($this->in()) {
218 218
 			$parts = [];
Please login to merge, or discard this patch.
Braces   +9 added lines, -18 removed lines patch added patch discarded remove patch
@@ -77,17 +77,13 @@  discard block
 block discarded – undo
77 77
 					$int = bcadd($int, ord($byte), 0);
78 78
 				}
79 79
 				$this->value = $int;
80
-			}
81
-			elseif ($this->tag == 1) { # boolean
80
+			} elseif ($this->tag == 1) { # boolean
82 81
 				$this->value = ord($value) != 0;
83
-			}
84
-			elseif ($this->tag == 3) { # bit string
82
+			} elseif ($this->tag == 3) { # bit string
85 83
 				$this->value = $value;
86
-			}
87
-			elseif ($this->tag == 5) { # null
84
+			} elseif ($this->tag == 5) { # null
88 85
 				$this->value = null;
89
-			}
90
-			else {
86
+			} else {
91 87
 				$this->value = $value;
92 88
 			}
93 89
 		}
@@ -102,8 +98,7 @@  discard block
 block discarded – undo
102 98
 		$i = $this->i;
103 99
 		if (!$pass) {
104 100
 			$this->i = $oldi;
105
-		}
106
-		else {
101
+		} else {
107 102
 			$this->i += $this->len;
108 103
 		}
109 104
 
@@ -181,15 +176,12 @@  discard block
 block discarded – undo
181 176
 			try {
182 177
 				if (method_exists($this, $extnID)) {
183 178
 					$theext['extnValue'] = call_user_func([$this, $extnID], $theext['extnValue']);
184
-				}
185
-				elseif (!empty($ignoredextensions['$extnID'])) {
179
+				} elseif (!empty($ignoredextensions['$extnID'])) {
186 180
 					trigger_error("Unknown extension {$extnID}", E_USER_ERROR);
187
-				}
188
-				else {
181
+				} else {
189 182
 					$theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
190 183
 				}
191
-			}
192
-			catch (\Exception $e) {
184
+			} catch (\Exception $e) {
193 185
 				$theext['extnValue'] = chunk_split(bin2hex($theext['extnValue']), 2, ':');
194 186
 			}
195 187
 			$this->end();
@@ -259,8 +251,7 @@  discard block
 block discarded – undo
259 251
 		$time = $this->next($tag);
260 252
 		if ($this->tag == 23) {
261 253
 			$time = (substr($time, 0, 2) < 50 ? '20' : '19') . $time;
262
-		}
263
-		elseif ($this->tag != 24) {
254
+		} elseif ($this->tag != 24) {
264 255
 			trigger_error('expected der utc or generalized time', E_USER_ERROR);
265 256
 		}
266 257
 
Please login to merge, or discard this patch.
plugins/smime/php/class.pluginsmimemodule.php 3 patches
Indentation   +252 added lines, -252 removed lines patch added patch discarded remove patch
@@ -7,289 +7,289 @@
 block discarded – undo
7 7
 define('CHANGE_PASSPHRASE_WRONG', 3);
8 8
 
9 9
 class PluginSmimeModule extends Module {
10
-	/**
11
-	 * Constructor.
12
-	 *
13
-	 * @param int    $id            unique id
14
-	 * @param string $folderentryid Entryid of the folder. Data will be selected from this folder.
15
-	 * @param array  $data          list of all actions
16
-	 */
17
-	public function __construct($id, $data) {
18
-		$this->store = $GLOBALS['mapisession']->getDefaultMessageStore();
19
-		parent::__construct($id, $data);
20
-	}
10
+    /**
11
+     * Constructor.
12
+     *
13
+     * @param int    $id            unique id
14
+     * @param string $folderentryid Entryid of the folder. Data will be selected from this folder.
15
+     * @param array  $data          list of all actions
16
+     */
17
+    public function __construct($id, $data) {
18
+        $this->store = $GLOBALS['mapisession']->getDefaultMessageStore();
19
+        parent::__construct($id, $data);
20
+    }
21 21
 
22
-	/**
23
-	 * Executes all the actions in the $data variable.
24
-	 *
25
-	 * @return bool true on success or false on failure
26
-	 */
27
-	public function execute() {
28
-		foreach ($this->data as $actionType => $actionData) {
29
-			if (isset($actionType)) {
30
-				try {
31
-					switch ($actionType) {
32
-						case 'certificate':
33
-							$data = $this->verifyCertificate($actionData);
34
-							$response = [
35
-								'type' => 3,
36
-								'status' => $data['status'],
37
-								'message' => $data['message'],
38
-								'data' => $data['data'],
39
-							];
40
-							$this->addActionData('certificate', $response);
41
-							$GLOBALS['bus']->addData($this->getResponseData());
42
-							break;
22
+    /**
23
+     * Executes all the actions in the $data variable.
24
+     *
25
+     * @return bool true on success or false on failure
26
+     */
27
+    public function execute() {
28
+        foreach ($this->data as $actionType => $actionData) {
29
+            if (isset($actionType)) {
30
+                try {
31
+                    switch ($actionType) {
32
+                        case 'certificate':
33
+                            $data = $this->verifyCertificate($actionData);
34
+                            $response = [
35
+                                'type' => 3,
36
+                                'status' => $data['status'],
37
+                                'message' => $data['message'],
38
+                                'data' => $data['data'],
39
+                            ];
40
+                            $this->addActionData('certificate', $response);
41
+                            $GLOBALS['bus']->addData($this->getResponseData());
42
+                            break;
43 43
 
44
-						case 'passphrase':
45
-							$data = $this->verifyPassphrase($actionData);
46
-							$response = [
47
-								'type' => 3,
48
-								'status' => $data['status'],
49
-							];
50
-							$this->addActionData('passphrase', $response);
51
-							$GLOBALS['bus']->addData($this->getResponseData());
52
-							break;
44
+                        case 'passphrase':
45
+                            $data = $this->verifyPassphrase($actionData);
46
+                            $response = [
47
+                                'type' => 3,
48
+                                'status' => $data['status'],
49
+                            ];
50
+                            $this->addActionData('passphrase', $response);
51
+                            $GLOBALS['bus']->addData($this->getResponseData());
52
+                            break;
53 53
 
54
-						case 'changepassphrase':
55
-							$data = $this->changePassphrase($actionData);
56
-							if ($data === CHANGE_PASSPHRASE_SUCCESS) {
57
-								// Reset cached passphrase.
58
-								$encryptionStore = EncryptionStore::getInstance();
59
-								withPHPSession(function () use ($encryptionStore) {
60
-									$encryptionStore->add('smime', '');
61
-								});
62
-							}
63
-							$response = [
64
-								'type' => 3,
65
-								'code' => $data,
66
-							];
67
-							$this->addActionData('changepassphrase', $response);
68
-							$GLOBALS['bus']->addData($this->getResponseData());
69
-							break;
54
+                        case 'changepassphrase':
55
+                            $data = $this->changePassphrase($actionData);
56
+                            if ($data === CHANGE_PASSPHRASE_SUCCESS) {
57
+                                // Reset cached passphrase.
58
+                                $encryptionStore = EncryptionStore::getInstance();
59
+                                withPHPSession(function () use ($encryptionStore) {
60
+                                    $encryptionStore->add('smime', '');
61
+                                });
62
+                            }
63
+                            $response = [
64
+                                'type' => 3,
65
+                                'code' => $data,
66
+                            ];
67
+                            $this->addActionData('changepassphrase', $response);
68
+                            $GLOBALS['bus']->addData($this->getResponseData());
69
+                            break;
70 70
 
71
-						case 'list':
72
-							$data = $this->getPublicCertificates();
73
-							$this->addActionData('list', $data);
74
-							$GLOBALS['bus']->addData($this->getResponseData());
75
-							break;
71
+                        case 'list':
72
+                            $data = $this->getPublicCertificates();
73
+                            $this->addActionData('list', $data);
74
+                            $GLOBALS['bus']->addData($this->getResponseData());
75
+                            break;
76 76
 
77
-						case 'delete':
78
-							// FIXME: handle multiple deletes? Separate function?
79
-							$entryid = $actionData['entryid'];
80
-							$root = mapi_msgstore_openentry($this->store, null);
81
-							mapi_folder_deletemessages($root, [hex2bin($entryid)]);
77
+                        case 'delete':
78
+                            // FIXME: handle multiple deletes? Separate function?
79
+                            $entryid = $actionData['entryid'];
80
+                            $root = mapi_msgstore_openentry($this->store, null);
81
+                            mapi_folder_deletemessages($root, [hex2bin($entryid)]);
82 82
 
83
-							$this->sendFeedback(true);
84
-							break;
83
+                            $this->sendFeedback(true);
84
+                            break;
85 85
 
86
-						default:
87
-							$this->handleUnknownActionType($actionType);
88
-					}
89
-				}
90
-				catch (Exception $e) {
91
-					$this->sendFeedback(false, parent::errorDetailsFromException($e));
92
-				}
93
-			}
94
-		}
95
-	}
86
+                        default:
87
+                            $this->handleUnknownActionType($actionType);
88
+                    }
89
+                }
90
+                catch (Exception $e) {
91
+                    $this->sendFeedback(false, parent::errorDetailsFromException($e));
92
+                }
93
+            }
94
+        }
95
+    }
96 96
 
97
-	/**
98
-	 * Verifies the users private certificate,
99
-	 * returns array with three statuses and a message key containing a message for the user.
100
-	 * 1. There is a certificate and valid
101
-	 * 2. There is a certificate and not valid
102
-	 * 3. No certificate
103
-	 * FIXME: in the future we might support multiple private certs.
104
-	 *
105
-	 * @param array $data which contains the data send from JavaScript
106
-	 *
107
-	 * @return array $data which returns two keys containing the certificate
108
-	 */
109
-	public function verifyCertificate($data) {
110
-		$message = '';
111
-		$status = false;
97
+    /**
98
+     * Verifies the users private certificate,
99
+     * returns array with three statuses and a message key containing a message for the user.
100
+     * 1. There is a certificate and valid
101
+     * 2. There is a certificate and not valid
102
+     * 3. No certificate
103
+     * FIXME: in the future we might support multiple private certs.
104
+     *
105
+     * @param array $data which contains the data send from JavaScript
106
+     *
107
+     * @return array $data which returns two keys containing the certificate
108
+     */
109
+    public function verifyCertificate($data) {
110
+        $message = '';
111
+        $status = false;
112 112
 
113
-		$privateCerts = getMAPICert($this->store);
114
-		$certIdx = -1;
113
+        $privateCerts = getMAPICert($this->store);
114
+        $certIdx = -1;
115 115
 
116
-		// No certificates
117
-		if (!$privateCerts || count($privateCerts) === 0) {
118
-			$message = _('No certificate avaliable');
119
-		}
120
-		else {
121
-			// For each certificate in MAPI store
122
-			$smtpAddress = $GLOBALS['mapisession']->getSMTPAddress();
123
-			for ($i = 0, $cnt = count($privateCerts); $i < $cnt; ++$i) {
124
-				// Check if certificate is still valid
125
-				// TODO: create a more generic function which verifyies if the certificate is valid
126
-				// And remove possible duplication from plugin.smime.php->onUploadCertificate
127
-				if ($privateCerts[$i][PR_MESSAGE_DELIVERY_TIME] < time()) { // validTo
128
-					$message = _('Private certificate is not valid yet, unable to sign email');
129
-				}
130
-				elseif ($privateCerts[$i][PR_CLIENT_SUBMIT_TIME] >= time()) { // validFrom
131
-					$message = _('Private certificate has been expired, unable to sign email');
132
-				}
133
-				elseif (strcasecmp($privateCerts[$i][PR_SUBJECT], $smtpAddress) !== 0) {
134
-					$message = _('Private certificate does not match email address');
135
-				}
136
-				else {
137
-					$status = true;
138
-					$message = '';
139
-					$certIdx = $i;
140
-				}
141
-			}
142
-		}
116
+        // No certificates
117
+        if (!$privateCerts || count($privateCerts) === 0) {
118
+            $message = _('No certificate avaliable');
119
+        }
120
+        else {
121
+            // For each certificate in MAPI store
122
+            $smtpAddress = $GLOBALS['mapisession']->getSMTPAddress();
123
+            for ($i = 0, $cnt = count($privateCerts); $i < $cnt; ++$i) {
124
+                // Check if certificate is still valid
125
+                // TODO: create a more generic function which verifyies if the certificate is valid
126
+                // And remove possible duplication from plugin.smime.php->onUploadCertificate
127
+                if ($privateCerts[$i][PR_MESSAGE_DELIVERY_TIME] < time()) { // validTo
128
+                    $message = _('Private certificate is not valid yet, unable to sign email');
129
+                }
130
+                elseif ($privateCerts[$i][PR_CLIENT_SUBMIT_TIME] >= time()) { // validFrom
131
+                    $message = _('Private certificate has been expired, unable to sign email');
132
+                }
133
+                elseif (strcasecmp($privateCerts[$i][PR_SUBJECT], $smtpAddress) !== 0) {
134
+                    $message = _('Private certificate does not match email address');
135
+                }
136
+                else {
137
+                    $status = true;
138
+                    $message = '';
139
+                    $certIdx = $i;
140
+                }
141
+            }
142
+        }
143 143
 
144
-		return [
145
-			'message' => $message,
146
-			'status' => $status,
147
-			'data' => [
148
-				'validto' => $privateCerts[$certIdx][PR_MESSAGE_DELIVERY_TIME] ?? '',
149
-				'validFrom' => $privateCerts[$certIdx][PR_CLIENT_SUBMIT_TIME] ?? '',
150
-				'subject' => $privateCerts[$certIdx][PR_SUBJECT] ?? 'Unknown',
151
-			],
152
-		];
153
-	}
144
+        return [
145
+            'message' => $message,
146
+            'status' => $status,
147
+            'data' => [
148
+                'validto' => $privateCerts[$certIdx][PR_MESSAGE_DELIVERY_TIME] ?? '',
149
+                'validFrom' => $privateCerts[$certIdx][PR_CLIENT_SUBMIT_TIME] ?? '',
150
+                'subject' => $privateCerts[$certIdx][PR_SUBJECT] ?? 'Unknown',
151
+            ],
152
+        ];
153
+    }
154 154
 
155
-	/**
156
-	 * Verify if the supplied passphrase unlocks the private certificate stored in the mapi
157
-	 * userstore.
158
-	 *
159
-	 * @param array $data which contains the data send from JavaScript
160
-	 *
161
-	 * @return array $data which contains a key 'stats'
162
-	 */
163
-	public function verifyPassphrase($data) {
164
-		$result = readPrivateCert($this->store, $data['passphrase']);
155
+    /**
156
+     * Verify if the supplied passphrase unlocks the private certificate stored in the mapi
157
+     * userstore.
158
+     *
159
+     * @param array $data which contains the data send from JavaScript
160
+     *
161
+     * @return array $data which contains a key 'stats'
162
+     */
163
+    public function verifyPassphrase($data) {
164
+        $result = readPrivateCert($this->store, $data['passphrase']);
165 165
 
166
-		if ($result) {
167
-			$encryptionStore = EncryptionStore::getInstance();
168
-			if (encryptionStoreExpirationSupport()) {
169
-				$encryptionStore->add('smime', $data['passphrase'], time() + (5 * 60));
170
-			}
171
-			else {
172
-				withPHPSession(function () use ($encryptionStore, $data) {
173
-					$encryptionStore->add('smime', $data['passphrase']);
174
-				});
175
-			}
176
-			$result = true;
177
-		}
178
-		else {
179
-			$result = false;
180
-		}
166
+        if ($result) {
167
+            $encryptionStore = EncryptionStore::getInstance();
168
+            if (encryptionStoreExpirationSupport()) {
169
+                $encryptionStore->add('smime', $data['passphrase'], time() + (5 * 60));
170
+            }
171
+            else {
172
+                withPHPSession(function () use ($encryptionStore, $data) {
173
+                    $encryptionStore->add('smime', $data['passphrase']);
174
+                });
175
+            }
176
+            $result = true;
177
+        }
178
+        else {
179
+            $result = false;
180
+        }
181 181
 
182
-		return [
183
-			'status' => $result,
184
-		];
185
-	}
182
+        return [
183
+            'status' => $result,
184
+        ];
185
+    }
186 186
 
187
-	/**
188
-	 * Returns data for the JavaScript CertificateStore 'list' call.
189
-	 *
190
-	 * @return array $data which contains a list of public certificates
191
-	 */
192
-	public function getPublicCertificates() {
193
-		$items = [];
194
-		$data['page'] = [];
187
+    /**
188
+     * Returns data for the JavaScript CertificateStore 'list' call.
189
+     *
190
+     * @return array $data which contains a list of public certificates
191
+     */
192
+    public function getPublicCertificates() {
193
+        $items = [];
194
+        $data['page'] = [];
195 195
 
196
-		$root = mapi_msgstore_openentry($this->store, null);
197
-		$table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
196
+        $root = mapi_msgstore_openentry($this->store, null);
197
+        $table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
198 198
 
199
-		// restriction for public/private certificates which are stored in the root associated folder
200
-		$restrict = [RES_OR, [
201
-			[RES_PROPERTY,
202
-				[
203
-					RELOP => RELOP_EQ,
204
-					ULPROPTAG => PR_MESSAGE_CLASS,
205
-					VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Public"],
206
-				],
207
-			],
208
-			[RES_PROPERTY,
209
-				[
210
-					RELOP => RELOP_EQ,
211
-					ULPROPTAG => PR_MESSAGE_CLASS,
212
-					VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Private"],
213
-				],
214
-			], ],
215
-		];
216
-		mapi_table_restrict($table, $restrict, TBL_BATCH);
217
-		mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
218
-		$certs = mapi_table_queryallrows($table, [PR_SUBJECT, PR_ENTRYID, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME, PR_MESSAGE_CLASS, PR_SENDER_NAME, PR_SENDER_EMAIL_ADDRESS, PR_SUBJECT_PREFIX, PR_RECEIVED_BY_NAME, PR_INTERNET_MESSAGE_ID], $restrict);
219
-		foreach ($certs as $cert) {
220
-			$item = [];
221
-			$item['entryid'] = bin2hex($cert[PR_ENTRYID]);
222
-			$item['email'] = $cert[PR_SUBJECT];
223
-			$item['validto'] = $cert[PR_MESSAGE_DELIVERY_TIME];
224
-			$item['validfrom'] = $cert[PR_CLIENT_SUBMIT_TIME];
225
-			$item['serial'] = $cert[PR_SENDER_NAME];
226
-			$item['issued_by'] = $cert[PR_SENDER_EMAIL_ADDRESS];
227
-			$item['issued_to'] = $cert[PR_SUBJECT_PREFIX];
228
-			$item['fingerprint_sha1'] = $cert[PR_RECEIVED_BY_NAME];
229
-			$item['fingerprint_md5'] = $cert[PR_INTERNET_MESSAGE_ID];
230
-			$item['type'] = strtolower($cert[PR_MESSAGE_CLASS]) == 'webapp.security.public' ? 'public' : 'private';
231
-			array_push($items, ['props' => $item]);
232
-		}
233
-		$data['page']['start'] = 0;
234
-		$data['page']['rowcount'] = mapi_table_getrowcount($table);
235
-		$data['page']['totalrowcount'] = $data['page']['rowcount'];
199
+        // restriction for public/private certificates which are stored in the root associated folder
200
+        $restrict = [RES_OR, [
201
+            [RES_PROPERTY,
202
+                [
203
+                    RELOP => RELOP_EQ,
204
+                    ULPROPTAG => PR_MESSAGE_CLASS,
205
+                    VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Public"],
206
+                ],
207
+            ],
208
+            [RES_PROPERTY,
209
+                [
210
+                    RELOP => RELOP_EQ,
211
+                    ULPROPTAG => PR_MESSAGE_CLASS,
212
+                    VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Private"],
213
+                ],
214
+            ], ],
215
+        ];
216
+        mapi_table_restrict($table, $restrict, TBL_BATCH);
217
+        mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
218
+        $certs = mapi_table_queryallrows($table, [PR_SUBJECT, PR_ENTRYID, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME, PR_MESSAGE_CLASS, PR_SENDER_NAME, PR_SENDER_EMAIL_ADDRESS, PR_SUBJECT_PREFIX, PR_RECEIVED_BY_NAME, PR_INTERNET_MESSAGE_ID], $restrict);
219
+        foreach ($certs as $cert) {
220
+            $item = [];
221
+            $item['entryid'] = bin2hex($cert[PR_ENTRYID]);
222
+            $item['email'] = $cert[PR_SUBJECT];
223
+            $item['validto'] = $cert[PR_MESSAGE_DELIVERY_TIME];
224
+            $item['validfrom'] = $cert[PR_CLIENT_SUBMIT_TIME];
225
+            $item['serial'] = $cert[PR_SENDER_NAME];
226
+            $item['issued_by'] = $cert[PR_SENDER_EMAIL_ADDRESS];
227
+            $item['issued_to'] = $cert[PR_SUBJECT_PREFIX];
228
+            $item['fingerprint_sha1'] = $cert[PR_RECEIVED_BY_NAME];
229
+            $item['fingerprint_md5'] = $cert[PR_INTERNET_MESSAGE_ID];
230
+            $item['type'] = strtolower($cert[PR_MESSAGE_CLASS]) == 'webapp.security.public' ? 'public' : 'private';
231
+            array_push($items, ['props' => $item]);
232
+        }
233
+        $data['page']['start'] = 0;
234
+        $data['page']['rowcount'] = mapi_table_getrowcount($table);
235
+        $data['page']['totalrowcount'] = $data['page']['rowcount'];
236 236
 
237
-		return array_merge($data, ['item' => $items]);
238
-	}
237
+        return array_merge($data, ['item' => $items]);
238
+    }
239 239
 
240
-	/*
240
+    /*
241 241
 	 * Changes the passphrase of an already stored certificatem by generating
242 242
 	 * a new PKCS12 container.
243 243
 	 *
244 244
 	 * @param Array $actionData contains the passphrase and new passphrase
245 245
 	 * return Number error number
246 246
 	 */
247
-	public function changePassphrase($actionData) {
248
-		$certs = readPrivateCert($this->store, $actionData['passphrase']);
247
+    public function changePassphrase($actionData) {
248
+        $certs = readPrivateCert($this->store, $actionData['passphrase']);
249 249
 
250
-		if (empty($certs)) {
251
-			return CHANGE_PASSPHRASE_WRONG;
252
-		}
250
+        if (empty($certs)) {
251
+            return CHANGE_PASSPHRASE_WRONG;
252
+        }
253 253
 
254
-		$cert = $this->pkcs12_change_passphrase($certs, $actionData['new_passphrase']);
254
+        $cert = $this->pkcs12_change_passphrase($certs, $actionData['new_passphrase']);
255 255
 
256
-		if ($cert === false) {
257
-			return CHANGE_PASSPHRASE_ERROR;
258
-		}
256
+        if ($cert === false) {
257
+            return CHANGE_PASSPHRASE_ERROR;
258
+        }
259 259
 
260
-		$mapiCerts = getMAPICert($this->store);
261
-		$mapiCert = $mapiCerts[0] ?? [];
262
-		if (!$mapiCert || empty($mapiCert)) {
263
-			return CHANGE_PASSPHRASE_ERROR;
264
-		}
265
-		$privateCert = mapi_msgstore_openentry($this->store, $mapiCert[PR_ENTRYID]);
260
+        $mapiCerts = getMAPICert($this->store);
261
+        $mapiCert = $mapiCerts[0] ?? [];
262
+        if (!$mapiCert || empty($mapiCert)) {
263
+            return CHANGE_PASSPHRASE_ERROR;
264
+        }
265
+        $privateCert = mapi_msgstore_openentry($this->store, $mapiCert[PR_ENTRYID]);
266 266
 
267
-		$msgBody = base64_encode($cert);
268
-		$stream = mapi_openproperty($privateCert, PR_BODY, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
269
-		mapi_stream_setsize($stream, strlen($msgBody));
270
-		mapi_stream_write($stream, $msgBody);
271
-		mapi_stream_commit($stream);
272
-		mapi_message_savechanges($privateCert);
267
+        $msgBody = base64_encode($cert);
268
+        $stream = mapi_openproperty($privateCert, PR_BODY, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
269
+        mapi_stream_setsize($stream, strlen($msgBody));
270
+        mapi_stream_write($stream, $msgBody);
271
+        mapi_stream_commit($stream);
272
+        mapi_message_savechanges($privateCert);
273 273
 
274
-		return CHANGE_PASSPHRASE_SUCCESS;
275
-	}
274
+        return CHANGE_PASSPHRASE_SUCCESS;
275
+    }
276 276
 
277
-	/**
278
-	 * Generate a new  PKCS#12 certificate store file with a new passphrase.
279
-	 *
280
-	 * @param array  $certs          the original certificate
281
-	 * @param string $passphrase     the passphrase
282
-	 * @param mixed  $new_passphrase
283
-	 *
284
-	 * @return mixed boolean or string certificate
285
-	 */
286
-	public function pkcs12_change_passphrase($certs, $new_passphrase) {
287
-		$cert = "";
288
-		$extracerts = isset($certs['extracerts']) ? $certs['extracerts'] : [];
289
-		if (openssl_pkcs12_export($certs['cert'], $cert, $certs['pkey'], $new_passphrase, ['extracerts' => $extracerts])) {
290
-			return $cert;
291
-		}
277
+    /**
278
+     * Generate a new  PKCS#12 certificate store file with a new passphrase.
279
+     *
280
+     * @param array  $certs          the original certificate
281
+     * @param string $passphrase     the passphrase
282
+     * @param mixed  $new_passphrase
283
+     *
284
+     * @return mixed boolean or string certificate
285
+     */
286
+    public function pkcs12_change_passphrase($certs, $new_passphrase) {
287
+        $cert = "";
288
+        $extracerts = isset($certs['extracerts']) ? $certs['extracerts'] : [];
289
+        if (openssl_pkcs12_export($certs['cert'], $cert, $certs['pkey'], $new_passphrase, ['extracerts' => $extracerts])) {
290
+            return $cert;
291
+        }
292 292
 
293
-		return false;
294
-	}
293
+        return false;
294
+    }
295 295
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
56 56
 							if ($data === CHANGE_PASSPHRASE_SUCCESS) {
57 57
 								// Reset cached passphrase.
58 58
 								$encryptionStore = EncryptionStore::getInstance();
59
-								withPHPSession(function () use ($encryptionStore) {
59
+								withPHPSession(function() use ($encryptionStore) {
60 60
 									$encryptionStore->add('smime', '');
61 61
 								});
62 62
 							}
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 				$encryptionStore->add('smime', $data['passphrase'], time() + (5 * 60));
170 170
 			}
171 171
 			else {
172
-				withPHPSession(function () use ($encryptionStore, $data) {
172
+				withPHPSession(function() use ($encryptionStore, $data) {
173 173
 					$encryptionStore->add('smime', $data['passphrase']);
174 174
 				});
175 175
 			}
Please login to merge, or discard this patch.
Braces   +7 added lines, -14 removed lines patch added patch discarded remove patch
@@ -86,8 +86,7 @@  discard block
 block discarded – undo
86 86
 						default:
87 87
 							$this->handleUnknownActionType($actionType);
88 88
 					}
89
-				}
90
-				catch (Exception $e) {
89
+				} catch (Exception $e) {
91 90
 					$this->sendFeedback(false, parent::errorDetailsFromException($e));
92 91
 				}
93 92
 			}
@@ -116,8 +115,7 @@  discard block
 block discarded – undo
116 115
 		// No certificates
117 116
 		if (!$privateCerts || count($privateCerts) === 0) {
118 117
 			$message = _('No certificate avaliable');
119
-		}
120
-		else {
118
+		} else {
121 119
 			// For each certificate in MAPI store
122 120
 			$smtpAddress = $GLOBALS['mapisession']->getSMTPAddress();
123 121
 			for ($i = 0, $cnt = count($privateCerts); $i < $cnt; ++$i) {
@@ -126,14 +124,11 @@  discard block
 block discarded – undo
126 124
 				// And remove possible duplication from plugin.smime.php->onUploadCertificate
127 125
 				if ($privateCerts[$i][PR_MESSAGE_DELIVERY_TIME] < time()) { // validTo
128 126
 					$message = _('Private certificate is not valid yet, unable to sign email');
129
-				}
130
-				elseif ($privateCerts[$i][PR_CLIENT_SUBMIT_TIME] >= time()) { // validFrom
127
+				} elseif ($privateCerts[$i][PR_CLIENT_SUBMIT_TIME] >= time()) { // validFrom
131 128
 					$message = _('Private certificate has been expired, unable to sign email');
132
-				}
133
-				elseif (strcasecmp($privateCerts[$i][PR_SUBJECT], $smtpAddress) !== 0) {
129
+				} elseif (strcasecmp($privateCerts[$i][PR_SUBJECT], $smtpAddress) !== 0) {
134 130
 					$message = _('Private certificate does not match email address');
135
-				}
136
-				else {
131
+				} else {
137 132
 					$status = true;
138 133
 					$message = '';
139 134
 					$certIdx = $i;
@@ -167,15 +162,13 @@  discard block
 block discarded – undo
167 162
 			$encryptionStore = EncryptionStore::getInstance();
168 163
 			if (encryptionStoreExpirationSupport()) {
169 164
 				$encryptionStore->add('smime', $data['passphrase'], time() + (5 * 60));
170
-			}
171
-			else {
165
+			} else {
172 166
 				withPHPSession(function () use ($encryptionStore, $data) {
173 167
 					$encryptionStore->add('smime', $data['passphrase']);
174 168
 				});
175 169
 			}
176 170
 			$result = true;
177
-		}
178
-		else {
171
+		} else {
179 172
 			$result = false;
180 173
 		}
181 174
 
Please login to merge, or discard this patch.
plugins/smime/php/plugin.smime.php 3 patches
Indentation   +1107 added lines, -1107 removed lines patch added patch discarded remove patch
@@ -34,520 +34,520 @@  discard block
 block discarded – undo
34 34
 define('OPENSSL_RECIPIENT_CERTIFICATE_MISMATCH', '21070073');
35 35
 
36 36
 class Pluginsmime extends Plugin {
37
-	/**
38
-	 * decrypted/verified message.
39
-	 */
40
-	private $message = [];
41
-
42
-	/**
43
-	 * Default MAPI Message Store.
44
-	 */
45
-	private $store;
46
-
47
-	/**
48
-	 * Last openssl error string.
49
-	 */
50
-	private $openssl_error = "";
51
-
52
-	/**
53
-	 * Called to initialize the plugin and register for hooks.
54
-	 */
55
-	public function init() {
56
-		$this->registerHook('server.core.settings.init.before');
57
-		$this->registerHook('server.util.parse_smime.signed');
58
-		$this->registerHook('server.util.parse_smime.encrypted');
59
-		$this->registerHook('server.module.itemmodule.open.after');
60
-		$this->registerHook('server.core.operations.submitmessage');
61
-		$this->registerHook('server.upload_attachment.upload');
62
-		$this->registerHook('server.module.createmailitemmodule.beforesend');
63
-		$this->registerHook('server.index.load.custom');
64
-
65
-		if (version_compare(phpversion(), '5.4', '<')) {
66
-			$this->cipher = OPENSSL_CIPHER_3DES;
67
-		}
68
-		else {
69
-			$this->cipher = PLUGIN_SMIME_CIPHER;
70
-		}
71
-	}
72
-
73
-	/**
74
-	 * Default message store.
75
-	 *
76
-	 * @return object MAPI Message store
77
-	 */
78
-	public function getStore() {
79
-		if (!$this->store) {
80
-			$this->store = $GLOBALS['mapisession']->getDefaultMessageStore();
81
-		}
82
-
83
-		return $this->store;
84
-	}
85
-
86
-	/**
87
-	 * Process the incoming events that where fired by the client.
88
-	 *
89
-	 * @param string $eventID Identifier of the hook
90
-	 * @param array  $data    Reference to the data of the triggered hook
91
-	 */
92
-	public function execute($eventID, &$data) {
93
-		switch ($eventID) {
94
-			// Register plugin
95
-			case 'server.core.settings.init.before':
96
-				$this->onBeforeSettingsInit($data);
97
-				break;
98
-			// Verify a signed or encrypted message when an email is opened
99
-			case 'server.util.parse_smime.signed':
100
-				$this->onSignedMessage($data);
101
-				break;
102
-
103
-			case 'server.util.parse_smime.encrypted':
104
-				$this->onEncrypted($data);
105
-				break;
106
-			// Add S/MIME property, which is send to the client
107
-			case 'server.module.itemmodule.open.after':
108
-				$this->onAfterOpen($data);
109
-				break;
110
-			// Catch uploaded certificate
111
-			case 'server.upload_attachment.upload':
112
-				$this->onUploadCertificate($data);
113
-				break;
114
-			// Sign email before sending
115
-			case 'server.core.operations.submitmessage':
116
-				$this->onBeforeSend($data);
117
-				break;
118
-			// Verify that we have public certificates for all recipients
119
-			case 'server.module.createmailitemmodule.beforesend':
120
-				$this->onCertificateCheck($data);
121
-				break;
122
-
123
-			case 'server.index.load.custom':
124
-				if ($data['name'] === 'smime_passphrase') {
125
-					include 'templates/passphrase.tpl.php';
126
-
127
-					exit();
128
-				}
129
-				if ($data['name'] === 'smime_passphrasecheck') {
130
-					// No need to do anything, this is just used to trigger
131
-					// the browser's autofill save password dialog.
132
-					exit();
133
-				}
134
-				break;
135
-		}
136
-	}
137
-
138
-	/**
139
-	 * Function checks if public certificate exists for all recipients and creates an error
140
-	 * message for the frontend which includes the email address of the missing public
141
-	 * certificates.
142
-	 *
143
-	 * If my own certificate is missing, a different error message is shown which informs the
144
-	 * user that his own public certificate is missing and required for reading encrypted emails
145
-	 * in the 'Sent items' folder.
146
-	 *
147
-	 * @param array $data Reference to the data of the triggered hook
148
-	 */
149
-	public function onCertificateCheck($data) {
150
-		$entryid = $data['entryid'];
151
-		// FIXME: unittests, save trigger will pass $entryid is 0 (which will open the root folder and not the message we want)
152
-		if ($entryid === false) {
153
-			return;
154
-		}
155
-
156
-		if (!isset($data['action']['props']['smime']) || empty($data['action']['props']['smime'])) {
157
-			return;
158
-		}
159
-
160
-		$message = mapi_msgstore_openentry($data['store'], $entryid);
161
-		$module = $data['moduleObject'];
162
-		$data['success'] = true;
163
-
164
-		$messageClass = mapi_getprops($message, [PR_MESSAGE_CLASS]);
165
-		$messageClass = $messageClass[PR_MESSAGE_CLASS];
166
-		if ($messageClass !== 'IPM.Note.SMIME' && $messageClass !== 'IPM.Note.SMIME.SignedEncrypt') {
167
-			return;
168
-		}
169
-
170
-		$recipients = $data['action']['props']['smime'];
171
-		$missingCerts = [];
172
-
173
-		foreach ($recipients as $recipient) {
174
-			$email = $recipient['email'];
175
-
176
-			if (!$this->pubcertExists($email, $recipient['internal'])) {
177
-				array_push($missingCerts, $email);
178
-			}
179
-		}
180
-
181
-		if (empty($missingCerts)) {
182
-			return;
183
-		}
184
-
185
-		function missingMyself($email) {
186
-			return $GLOBALS['mapisession']->getSMTPAddress() === $email;
187
-		}
188
-
189
-		if (array_filter($missingCerts, "missingMyself") === []) {
190
-			$errorMsg = _('Missing public certificates for the following recipients: ') . implode(', ', $missingCerts) . _('. Please contact your system administrator for details');
191
-		}
192
-		else {
193
-			$errorMsg = _("Your public certificate is not installed. Without this certificate, you will not be able to read encrypted messages you have sent to others.");
194
-		}
195
-
196
-		$module->sendFeedback(false, ["type" => ERROR_GENERAL, "info" => ['display_message' => $errorMsg]]);
197
-		$data['success'] = false;
198
-	}
199
-
200
-	/**
201
-	 * Function which verifies a message.
202
-	 *
203
-	 * TODO: Clean up flow
204
-	 *
205
-	 * @param mixed $message
206
-	 * @param mixed $eml
207
-	 */
208
-	public function verifyMessage($message, $eml) {
209
-		$userCert = '';
210
-		$tmpUserCert = tempnam(sys_get_temp_dir(), true);
211
-		$importMessageCert = true;
212
-		$fromGAB = false;
213
-
214
-		// TODO: worth to split fetching public certificate in a separate function?
215
-
216
-		// If user entry exists in GAB, try to retrieve public cert
217
-		// Public certificate from GAB in combination with LDAP saved in PR_EMS_AB_TAGGED_X509_CERT
218
-		$userProps = mapi_getprops($message, [PR_SENT_REPRESENTING_ENTRYID, PR_SENT_REPRESENTING_NAME]);
219
-		if (isset($userProps[PR_SENT_REPRESENTING_ENTRYID])) {
220
-			try {
221
-				$user = mapi_ab_openentry($GLOBALS['mapisession']->getAddressbook(), $userProps[PR_SENT_REPRESENTING_ENTRYID]);
222
-				$gabCert = $this->getGABCert($user);
223
-				if (!empty($gabCert)) {
224
-					$fromGAB = true;
225
-					// Put empty string into file? dafuq?
226
-					file_put_contents($tmpUserCert, $userCert);
227
-				}
228
-			}
229
-			catch (MAPIException $e) {
230
-				$msg = "[smime] Unable to open PR_SENT_REPRESENTING_ENTRYID. Maybe %s was does not exists or deleted from server.";
231
-				Log::write(LOGLEVEL_ERROR, sprintf($msg, $userProps[PR_SENT_REPRESENTING_NAME]));
232
-				error_log("[smime] Unable to open PR_SENT_REPRESENTING_NAME: " . print_r($userProps[PR_SENT_REPRESENTING_NAME], true));
233
-				$this->message['success'] = SMIME_NOPUB;
234
-				$this->message['info'] = SMIME_USER_DETECT_FAILURE;
235
-			}
236
-		}
237
-
238
-		// When downloading an email as eml, $GLOBALS['operations'] isn't set, so add a check so that downloading works
239
-		// If the certificate is already fetch from the GAB, skip checking the userStore.
240
-		if (!$fromGAB && isset($GLOBALS['operations'])) {
241
-			$senderAddressArray = $this->getSenderAddress($message);
242
-			$senderAddressArray = $senderAddressArray['props'];
243
-			if ($senderAddressArray['address_type'] === 'SMTP') {
244
-				$emailAddr = $senderAddressArray['email_address'];
245
-			}
246
-			else {
247
-				$emailAddr = $senderAddressArray['smtp_address'];
248
-			}
249
-
250
-			// User not in AB,
251
-			// so get email address from either PR_SENT_REPRESENTING_NAME, PR_SEARCH_KEY or PR_SENT_REPRESENTING_SEARCH_KEY
252
-			// of the message
253
-			if (!$emailAddr) {
254
-				if (!empty($userProps[PR_SENT_REPRESENTING_NAME])) {
255
-					$emailAddr = $userProps[PR_SENT_REPRESENTING_NAME];
256
-				}
257
-				else {
258
-					$searchKeys = mapi_getprops($message, [PR_SEARCH_KEY, PR_SENT_REPRESENTING_SEARCH_KEY]);
259
-					$searchKey = $searchKeys[PR_SEARCH_KEY] ?? $searchKeys[PR_SENT_REPRESENTING_SEARCH_KEY];
260
-					if ($searchKey) {
261
-						$emailAddr = $trim(strtolower(explode(':', $searchKey)[1]));
262
-					}
263
-				}
264
-			}
265
-
266
-			if ($emailAddr) {
267
-				// Get all public certificates of $emailAddr stored on the server
268
-				$userCerts = $this->getPublicKey($emailAddr, true);
269
-			}
270
-		}
271
-
272
-		// Save signed message in a random file
273
-		$tmpfname = tempnam(sys_get_temp_dir(), true);
274
-		file_put_contents($tmpfname, $eml);
275
-
276
-		// Create random file for saving the signed message
277
-		$outcert = tempnam(sys_get_temp_dir(), true);
278
-
279
-		// Verify signed message
280
-		// Returns True if verified, False if tampered or signing certificate invalid OR -1 on error
281
-		if (count($userCerts) > 0) {
282
-			// Try to verify a certificate in the MAPI store
283
-			foreach ($userCerts as $userCert) {
284
-				$userCert = base64_decode($userCert);
285
-				// Save signed message in a random file
286
-				$tmpfname = tempnam(sys_get_temp_dir(), true);
287
-				file_put_contents($tmpfname, $eml);
288
-
289
-				// Create random file for saving the signed message
290
-				$outcert = tempnam(sys_get_temp_dir(), true);
291
-
292
-				if (!empty($userCert)) { // Check MAPI UserStore
293
-					file_put_contents($tmpUserCert, $userCert);
294
-				}
295
-				$signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOINTERN, $outcert, explode(';', PLUGIN_SMIME_CACERTS), $tmpUserCert);
296
-				$openssl_error_code = $this->extract_openssl_error();
297
-				$this->validateSignedMessage($signed_ok, $openssl_error_code);
298
-				// Check if we need to import a newer certificate
299
-				$importCert = file_get_contents($outcert);
300
-				$parsedImportCert = openssl_x509_parse($importCert);
301
-				$parsedUserCert = openssl_x509_parse($userCert);
302
-				if ($signed_ok && $openssl_error_code !== OPENSSL_CA_VERIFY_FAIL) { // CA Checks out
303
-					$caCerts = $this->extractCAs($tmpfname);
304
-					// If validTo and validFrom are more in the future, emailAddress matches and OCSP check is valid, import newer certificate
305
-					if ($parsedImportCert['validTo'] > $parsedUserCert['validTo'] && $parsedImportCert['validFrom'] > $parsedUserCert['validFrom'] &&
306
-						getCertEmail($parsedImportCert) === getCertEmail($parsedUserCert) && verifyOCSP($importCert, $caCerts, $this->message) &&
307
-						$importMessageCert !== false) {
308
-						// Redundant
309
-						$importMessageCert = true;
310
-					}
311
-					else {
312
-						$importMessageCert = false;
313
-						verifyOCSP($userCert, $caCerts, $this->message);
314
-						break;
315
-					}
316
-				}
317
-			}
318
-		}
319
-		else {
320
-			// Works. Just leave it.
321
-			$signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOSIGS, $outcert, explode(';', PLUGIN_SMIME_CACERTS));
322
-			$openssl_error_code = $this->extract_openssl_error();
323
-			$this->validateSignedMessage($signed_ok, $openssl_error_code);
324
-
325
-			// OCSP check
326
-			if ($signed_ok && $openssl_error_code !== OPENSSL_CA_VERIFY_FAIL) { // CA Checks out
327
-				$userCert = file_get_contents($outcert);
328
-				$parsedImportCert = openssl_x509_parse($userCert);
329
-
330
-				$caCerts = $this->extractCAs($tmpfname);
331
-				if (!is_array($parsedImportCert) || !verifyOCSP($userCert, $caCerts, $this->message)) {
332
-					$importMessageCert = false;
333
-				}
334
-				// We don't have a certificate from the MAPI UserStore or LDAP, so we will set $userCert to $importCert
335
-				// so that we can verify the message according to the be imported certificate.
336
-			}
337
-			else { // No pubkey
338
-				$importMessageCert = false;
339
-				Log::write(LOGLEVEL_INFO, sprintf("[smime] Unable to verify message without public key, openssl error: '%s'", $this->openssl_error));
340
-				$this->message['success'] = SMIME_STATUS_FAIL;
341
-				$this->message['info'] = SMIME_CA;
342
-			}
343
-		}
344
-		// Certificate is newer or not yet imported to the user store and not revoked
345
-		// If certificate is from the GAB, then don't import it.
346
-		if ($importMessageCert && !$fromGAB) {
347
-			$signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOSIGS, $outcert, explode(';', PLUGIN_SMIME_CACERTS));
348
-			$openssl_error_code = $this->extract_openssl_error();
349
-			$this->validateSignedMessage($signed_ok, $openssl_error_code);
350
-			$userCert = file_get_contents($outcert);
351
-			$parsedImportCert = openssl_x509_parse($userCert);
352
-			// FIXME: doing this in importPublicKey too...
353
-			$certEmail = getCertEmail($parsedImportCert);
354
-			if (!empty($certEmail)) {
355
-				$this->importCertificate($userCert, $parsedImportCert, 'public', true);
356
-			}
357
-		}
358
-
359
-		// Remove extracted certificate from openssl_pkcs7_verify
360
-		unlink($outcert);
361
-
362
-		// remove the temporary file
363
-		unlink($tmpfname);
364
-
365
-		// Clean up temp cert
366
-		unlink($tmpUserCert);
367
-	}
368
-
369
-	/**
370
-	 * Function which decrypts an encrypted message.
371
-	 * The key should be unlocked and stored in the EncryptionStore for a successful decrypt
372
-	 * If the key isn't in the session, we give the user a message to unlock his certificate.
373
-	 *
374
-	 * @param {mixed} $data array of data from hook
375
-	 */
376
-	public function onEncrypted($data) {
377
-		// Cert unlocked, decode message
378
-		$this->message['success'] = SMIME_STATUS_INFO;
379
-		$this->message['info'] = SMIME_DECRYPT_FAILURE;
380
-
381
-		$this->message['type'] = 'encrypted';
382
-		$encryptionStore = EncryptionStore::getInstance();
383
-		$pass = $encryptionStore->get('smime');
384
-		if (isset($pass) && !empty($pass)) {
385
-			$certs = readPrivateCert($this->getStore(), $pass, false);
386
-			// create random file for saving the encrypted and body message
387
-			$tmpFile = tempnam(sys_get_temp_dir(), true);
388
-			$tmpDecrypted = tempnam(sys_get_temp_dir(), true);
389
-
390
-			// Write mime header. Because it's not provided in the attachment, otherwise openssl won't parse it
391
-			$fp = fopen($tmpFile, 'w');
392
-			fwrite($fp, "Content-Type: application/pkcs7-mime; name=\"smime.p7m\"; smime-type=enveloped-data\n");
393
-			fwrite($fp, "Content-Transfer-Encoding: base64\nContent-Disposition: attachment; filename=\"smime.p7m\"\n");
394
-			fwrite($fp, "Content-Description: S/MIME Encrypted Message\n\n");
395
-			fwrite($fp, chunk_split(base64_encode($data['data']), 72) . "\n");
396
-			fclose($fp);
397
-
398
-			$decryptStatus = false;
399
-			// If multiple private certs were decrypted with supplied password
400
-			if (!$certs['cert'] && count($certs) > 0) {
401
-				foreach ($certs as $cert) {
402
-					$decryptStatus = openssl_pkcs7_decrypt($tmpFile, $tmpDecrypted, $cert['cert'], [$cert['pkey'], $pass]);
403
-					if ($decryptStatus !== false) {
404
-						break;
405
-					}
406
-				}
407
-			}
408
-			else {
409
-				$decryptStatus = openssl_pkcs7_decrypt($tmpFile, $tmpDecrypted, $certs['cert'], [$certs['pkey'], $pass]);
410
-			}
411
-
412
-			$content = file_get_contents($tmpDecrypted);
413
-			// Handle OL empty body Outlook Signed & Encrypted mails.
414
-			// The S/MIME plugin has to extract the body from the signed message.
415
-			if (strpos($content, 'signed-data') !== false) {
416
-				$this->message['type'] = 'encryptsigned';
417
-				$olcert = tempnam(sys_get_temp_dir(), true);
418
-				$olmsg = tempnam(sys_get_temp_dir(), true);
419
-				openssl_pkcs7_verify($tmpDecrypted, PKCS7_NOVERIFY, $olcert);
420
-				openssl_pkcs7_verify($tmpDecrypted, PKCS7_NOVERIFY, $olcert, [], $olcert, $olmsg);
421
-				$content = file_get_contents($olmsg);
422
-				unlink($olmsg);
423
-				unlink($olcert);
424
-			}
425
-
426
-			$copyProps = mapi_getprops($data['message'], [PR_MESSAGE_DELIVERY_TIME, PR_SENDER_ENTRYID, PR_SENT_REPRESENTING_ENTRYID]);
427
-			mapi_inetmapi_imtomapi($GLOBALS['mapisession']->getSession(), $data['store'], $GLOBALS['mapisession']->getAddressbook(), $data['message'], $content, ['parse_smime_signed' => true]);
428
-			// Manually set time back to the received time, since mapi_inetmapi_imtomapi overwrites this
429
-			mapi_setprops($data['message'], $copyProps);
430
-
431
-			// remove temporary files
432
-			unlink($tmpFile);
433
-			unlink($tmpDecrypted);
434
-
435
-			// mapi_inetmapi_imtomapi removes the PR_MESSAGE_CLASS = 'IPM.Note.SMIME.MultipartSigned'
436
-			// So we need to check if the message was also signed by looking at the MIME_TAG in the eml
437
-			if (strpos($content, 'multipart/signed') !== false || strpos($content, 'signed-data') !== false) {
438
-				$this->message['type'] = 'encryptsigned';
439
-				$this->verifyMessage($data['message'], $content);
440
-			}
441
-			elseif ($decryptStatus) {
442
-				$this->message['info'] = SMIME_DECRYPT_SUCCESS;
443
-				$this->message['success'] = SMIME_STATUS_SUCCESS;
444
-			}
445
-			elseif ($this->extract_openssl_error() === OPENSSL_RECIPIENT_CERTIFICATE_MISMATCH) {
446
-				error_log("[smime] Error when decrypting email, openssl error: " . print_r($this->openssl_error, true));
447
-				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when decrypting email, openssl error: '%s'", $this->openssl_error));
448
-				$this->message['info'] = SMIME_DECRYPT_CERT_MISMATCH;
449
-				$this->message['success'] = SMIME_STATUS_FAIL;
450
-			}
451
-		}
452
-		else {
453
-			$this->message['info'] = SMIME_UNLOCK_CERT;
454
-		}
455
-
456
-		if (!encryptionStoreExpirationSupport()) {
457
-			withPHPSession(function () use ($encryptionStore) {
458
-				$encryptionStore->add('smime', '');
459
-			});
460
-		}
461
-	}
462
-
463
-	/**
464
-	 * Function which calls verifyMessage to verify if the message isn't malformed during transport.
465
-	 *
466
-	 * @param {mixed} $data array of data from hook
467
-	 */
468
-	public function onSignedMessage($data) {
469
-		$this->message['type'] = 'signed';
470
-		$this->verifyMessage($data['message'], $data['data']);
471
-	}
472
-
473
-	/**
474
-	 * General function which parses the openssl_pkcs7_verify return value and the errors generated by
475
-	 * openssl_error_string().
476
-	 *
477
-	 * @param mixed $openssl_return
478
-	 * @param mixed $openssl_errors
479
-	 */
480
-	public function validateSignedMessage($openssl_return, $openssl_errors) {
481
-		if ($openssl_return === -1) {
482
-			$this->message['info'] = SMIME_ERROR;
483
-			$this->message['success'] = SMIME_STATUS_FAIL;
484
-		// Verification was successful
485
-		}
486
-		elseif ($openssl_return) {
487
-			$this->message['info'] = SMIME_SUCCESS;
488
-			$this->message['success'] = SMIME_STATUS_SUCCESS;
489
-		// Verification was not successful, display extra information.
490
-		}
491
-		else {
492
-			$this->message['success'] = SMIME_STATUS_FAIL;
493
-			if ($openssl_errors === OPENSSL_CA_VERIFY_FAIL) {
494
-				$this->message['info'] = SMIME_CA;
495
-			}
496
-			else { // Catch general errors
497
-				$this->message['info'] = SMIME_ERROR;
498
-			}
499
-		}
500
-	}
501
-
502
-	/**
503
-	 * Set smime key in $data array, which is send back to client
504
-	 * Since we can't create this array key in the hooks:
505
-	 * 'server.util.parse_smime.signed'
506
-	 * 'server.util.parse_smime.encrypted'.
507
-	 *
508
-	 * TODO: investigate if we can move away from this hook
509
-	 *
510
-	 * @param {mixed} $data
511
-	 */
512
-	public function onAfterOpen($data) {
513
-		if (isset($this->message) && !empty($this->message)) {
514
-			$data['data']['item']['props']['smime'] = $this->message;
515
-		}
516
-	}
517
-
518
-	/**
519
-	 * Handles the uploaded certificate in the settingsmenu in grommunio Web
520
-	 * - Opens the certificate with provided passphrase
521
-	 * - Checks if it can be used for signing/decrypting
522
-	 * - Verifies that the email address is equal to the
523
-	 * - Verifies that the certificate isn't expired and inform user.
524
-	 *
525
-	 * @param {mixed} $data
526
-	 */
527
-	public function onUploadCertificate($data) {
528
-		if ($data['sourcetype'] === 'certificate') {
529
-			$passphrase = $_POST['passphrase'];
530
-			$saveCert = false;
531
-			$tmpname = $data['tmpname'];
532
-			$message = '';
533
-
534
-			$certificate = file_get_contents($tmpname);
535
-			$emailAddress = $GLOBALS['mapisession']->getSMTPAddress();
536
-			list($message, $publickey, $publickeyData) = validateUploadedPKCS($certificate, $passphrase, $emailAddress);
537
-
538
-			// All checks completed successful
539
-			// Store private cert in users associated store (check for duplicates)
540
-			if (empty($message)) {
541
-				$certMessage = getMAPICert($this->getStore());
542
-				// TODO: update to serialNumber check
543
-				if ($certMessage && $certMessage[0][PR_MESSAGE_DELIVERY_TIME] == $publickeyData['validTo_time_t']) {
544
-					$message = _('Certificate is already stored on the server');
545
-				}
546
-				else {
547
-					$saveCert = true;
548
-					$root = mapi_msgstore_openentry($this->getStore(), null);
549
-					// Remove old certificate
550
-					/*
37
+    /**
38
+     * decrypted/verified message.
39
+     */
40
+    private $message = [];
41
+
42
+    /**
43
+     * Default MAPI Message Store.
44
+     */
45
+    private $store;
46
+
47
+    /**
48
+     * Last openssl error string.
49
+     */
50
+    private $openssl_error = "";
51
+
52
+    /**
53
+     * Called to initialize the plugin and register for hooks.
54
+     */
55
+    public function init() {
56
+        $this->registerHook('server.core.settings.init.before');
57
+        $this->registerHook('server.util.parse_smime.signed');
58
+        $this->registerHook('server.util.parse_smime.encrypted');
59
+        $this->registerHook('server.module.itemmodule.open.after');
60
+        $this->registerHook('server.core.operations.submitmessage');
61
+        $this->registerHook('server.upload_attachment.upload');
62
+        $this->registerHook('server.module.createmailitemmodule.beforesend');
63
+        $this->registerHook('server.index.load.custom');
64
+
65
+        if (version_compare(phpversion(), '5.4', '<')) {
66
+            $this->cipher = OPENSSL_CIPHER_3DES;
67
+        }
68
+        else {
69
+            $this->cipher = PLUGIN_SMIME_CIPHER;
70
+        }
71
+    }
72
+
73
+    /**
74
+     * Default message store.
75
+     *
76
+     * @return object MAPI Message store
77
+     */
78
+    public function getStore() {
79
+        if (!$this->store) {
80
+            $this->store = $GLOBALS['mapisession']->getDefaultMessageStore();
81
+        }
82
+
83
+        return $this->store;
84
+    }
85
+
86
+    /**
87
+     * Process the incoming events that where fired by the client.
88
+     *
89
+     * @param string $eventID Identifier of the hook
90
+     * @param array  $data    Reference to the data of the triggered hook
91
+     */
92
+    public function execute($eventID, &$data) {
93
+        switch ($eventID) {
94
+            // Register plugin
95
+            case 'server.core.settings.init.before':
96
+                $this->onBeforeSettingsInit($data);
97
+                break;
98
+            // Verify a signed or encrypted message when an email is opened
99
+            case 'server.util.parse_smime.signed':
100
+                $this->onSignedMessage($data);
101
+                break;
102
+
103
+            case 'server.util.parse_smime.encrypted':
104
+                $this->onEncrypted($data);
105
+                break;
106
+            // Add S/MIME property, which is send to the client
107
+            case 'server.module.itemmodule.open.after':
108
+                $this->onAfterOpen($data);
109
+                break;
110
+            // Catch uploaded certificate
111
+            case 'server.upload_attachment.upload':
112
+                $this->onUploadCertificate($data);
113
+                break;
114
+            // Sign email before sending
115
+            case 'server.core.operations.submitmessage':
116
+                $this->onBeforeSend($data);
117
+                break;
118
+            // Verify that we have public certificates for all recipients
119
+            case 'server.module.createmailitemmodule.beforesend':
120
+                $this->onCertificateCheck($data);
121
+                break;
122
+
123
+            case 'server.index.load.custom':
124
+                if ($data['name'] === 'smime_passphrase') {
125
+                    include 'templates/passphrase.tpl.php';
126
+
127
+                    exit();
128
+                }
129
+                if ($data['name'] === 'smime_passphrasecheck') {
130
+                    // No need to do anything, this is just used to trigger
131
+                    // the browser's autofill save password dialog.
132
+                    exit();
133
+                }
134
+                break;
135
+        }
136
+    }
137
+
138
+    /**
139
+     * Function checks if public certificate exists for all recipients and creates an error
140
+     * message for the frontend which includes the email address of the missing public
141
+     * certificates.
142
+     *
143
+     * If my own certificate is missing, a different error message is shown which informs the
144
+     * user that his own public certificate is missing and required for reading encrypted emails
145
+     * in the 'Sent items' folder.
146
+     *
147
+     * @param array $data Reference to the data of the triggered hook
148
+     */
149
+    public function onCertificateCheck($data) {
150
+        $entryid = $data['entryid'];
151
+        // FIXME: unittests, save trigger will pass $entryid is 0 (which will open the root folder and not the message we want)
152
+        if ($entryid === false) {
153
+            return;
154
+        }
155
+
156
+        if (!isset($data['action']['props']['smime']) || empty($data['action']['props']['smime'])) {
157
+            return;
158
+        }
159
+
160
+        $message = mapi_msgstore_openentry($data['store'], $entryid);
161
+        $module = $data['moduleObject'];
162
+        $data['success'] = true;
163
+
164
+        $messageClass = mapi_getprops($message, [PR_MESSAGE_CLASS]);
165
+        $messageClass = $messageClass[PR_MESSAGE_CLASS];
166
+        if ($messageClass !== 'IPM.Note.SMIME' && $messageClass !== 'IPM.Note.SMIME.SignedEncrypt') {
167
+            return;
168
+        }
169
+
170
+        $recipients = $data['action']['props']['smime'];
171
+        $missingCerts = [];
172
+
173
+        foreach ($recipients as $recipient) {
174
+            $email = $recipient['email'];
175
+
176
+            if (!$this->pubcertExists($email, $recipient['internal'])) {
177
+                array_push($missingCerts, $email);
178
+            }
179
+        }
180
+
181
+        if (empty($missingCerts)) {
182
+            return;
183
+        }
184
+
185
+        function missingMyself($email) {
186
+            return $GLOBALS['mapisession']->getSMTPAddress() === $email;
187
+        }
188
+
189
+        if (array_filter($missingCerts, "missingMyself") === []) {
190
+            $errorMsg = _('Missing public certificates for the following recipients: ') . implode(', ', $missingCerts) . _('. Please contact your system administrator for details');
191
+        }
192
+        else {
193
+            $errorMsg = _("Your public certificate is not installed. Without this certificate, you will not be able to read encrypted messages you have sent to others.");
194
+        }
195
+
196
+        $module->sendFeedback(false, ["type" => ERROR_GENERAL, "info" => ['display_message' => $errorMsg]]);
197
+        $data['success'] = false;
198
+    }
199
+
200
+    /**
201
+     * Function which verifies a message.
202
+     *
203
+     * TODO: Clean up flow
204
+     *
205
+     * @param mixed $message
206
+     * @param mixed $eml
207
+     */
208
+    public function verifyMessage($message, $eml) {
209
+        $userCert = '';
210
+        $tmpUserCert = tempnam(sys_get_temp_dir(), true);
211
+        $importMessageCert = true;
212
+        $fromGAB = false;
213
+
214
+        // TODO: worth to split fetching public certificate in a separate function?
215
+
216
+        // If user entry exists in GAB, try to retrieve public cert
217
+        // Public certificate from GAB in combination with LDAP saved in PR_EMS_AB_TAGGED_X509_CERT
218
+        $userProps = mapi_getprops($message, [PR_SENT_REPRESENTING_ENTRYID, PR_SENT_REPRESENTING_NAME]);
219
+        if (isset($userProps[PR_SENT_REPRESENTING_ENTRYID])) {
220
+            try {
221
+                $user = mapi_ab_openentry($GLOBALS['mapisession']->getAddressbook(), $userProps[PR_SENT_REPRESENTING_ENTRYID]);
222
+                $gabCert = $this->getGABCert($user);
223
+                if (!empty($gabCert)) {
224
+                    $fromGAB = true;
225
+                    // Put empty string into file? dafuq?
226
+                    file_put_contents($tmpUserCert, $userCert);
227
+                }
228
+            }
229
+            catch (MAPIException $e) {
230
+                $msg = "[smime] Unable to open PR_SENT_REPRESENTING_ENTRYID. Maybe %s was does not exists or deleted from server.";
231
+                Log::write(LOGLEVEL_ERROR, sprintf($msg, $userProps[PR_SENT_REPRESENTING_NAME]));
232
+                error_log("[smime] Unable to open PR_SENT_REPRESENTING_NAME: " . print_r($userProps[PR_SENT_REPRESENTING_NAME], true));
233
+                $this->message['success'] = SMIME_NOPUB;
234
+                $this->message['info'] = SMIME_USER_DETECT_FAILURE;
235
+            }
236
+        }
237
+
238
+        // When downloading an email as eml, $GLOBALS['operations'] isn't set, so add a check so that downloading works
239
+        // If the certificate is already fetch from the GAB, skip checking the userStore.
240
+        if (!$fromGAB && isset($GLOBALS['operations'])) {
241
+            $senderAddressArray = $this->getSenderAddress($message);
242
+            $senderAddressArray = $senderAddressArray['props'];
243
+            if ($senderAddressArray['address_type'] === 'SMTP') {
244
+                $emailAddr = $senderAddressArray['email_address'];
245
+            }
246
+            else {
247
+                $emailAddr = $senderAddressArray['smtp_address'];
248
+            }
249
+
250
+            // User not in AB,
251
+            // so get email address from either PR_SENT_REPRESENTING_NAME, PR_SEARCH_KEY or PR_SENT_REPRESENTING_SEARCH_KEY
252
+            // of the message
253
+            if (!$emailAddr) {
254
+                if (!empty($userProps[PR_SENT_REPRESENTING_NAME])) {
255
+                    $emailAddr = $userProps[PR_SENT_REPRESENTING_NAME];
256
+                }
257
+                else {
258
+                    $searchKeys = mapi_getprops($message, [PR_SEARCH_KEY, PR_SENT_REPRESENTING_SEARCH_KEY]);
259
+                    $searchKey = $searchKeys[PR_SEARCH_KEY] ?? $searchKeys[PR_SENT_REPRESENTING_SEARCH_KEY];
260
+                    if ($searchKey) {
261
+                        $emailAddr = $trim(strtolower(explode(':', $searchKey)[1]));
262
+                    }
263
+                }
264
+            }
265
+
266
+            if ($emailAddr) {
267
+                // Get all public certificates of $emailAddr stored on the server
268
+                $userCerts = $this->getPublicKey($emailAddr, true);
269
+            }
270
+        }
271
+
272
+        // Save signed message in a random file
273
+        $tmpfname = tempnam(sys_get_temp_dir(), true);
274
+        file_put_contents($tmpfname, $eml);
275
+
276
+        // Create random file for saving the signed message
277
+        $outcert = tempnam(sys_get_temp_dir(), true);
278
+
279
+        // Verify signed message
280
+        // Returns True if verified, False if tampered or signing certificate invalid OR -1 on error
281
+        if (count($userCerts) > 0) {
282
+            // Try to verify a certificate in the MAPI store
283
+            foreach ($userCerts as $userCert) {
284
+                $userCert = base64_decode($userCert);
285
+                // Save signed message in a random file
286
+                $tmpfname = tempnam(sys_get_temp_dir(), true);
287
+                file_put_contents($tmpfname, $eml);
288
+
289
+                // Create random file for saving the signed message
290
+                $outcert = tempnam(sys_get_temp_dir(), true);
291
+
292
+                if (!empty($userCert)) { // Check MAPI UserStore
293
+                    file_put_contents($tmpUserCert, $userCert);
294
+                }
295
+                $signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOINTERN, $outcert, explode(';', PLUGIN_SMIME_CACERTS), $tmpUserCert);
296
+                $openssl_error_code = $this->extract_openssl_error();
297
+                $this->validateSignedMessage($signed_ok, $openssl_error_code);
298
+                // Check if we need to import a newer certificate
299
+                $importCert = file_get_contents($outcert);
300
+                $parsedImportCert = openssl_x509_parse($importCert);
301
+                $parsedUserCert = openssl_x509_parse($userCert);
302
+                if ($signed_ok && $openssl_error_code !== OPENSSL_CA_VERIFY_FAIL) { // CA Checks out
303
+                    $caCerts = $this->extractCAs($tmpfname);
304
+                    // If validTo and validFrom are more in the future, emailAddress matches and OCSP check is valid, import newer certificate
305
+                    if ($parsedImportCert['validTo'] > $parsedUserCert['validTo'] && $parsedImportCert['validFrom'] > $parsedUserCert['validFrom'] &&
306
+                        getCertEmail($parsedImportCert) === getCertEmail($parsedUserCert) && verifyOCSP($importCert, $caCerts, $this->message) &&
307
+                        $importMessageCert !== false) {
308
+                        // Redundant
309
+                        $importMessageCert = true;
310
+                    }
311
+                    else {
312
+                        $importMessageCert = false;
313
+                        verifyOCSP($userCert, $caCerts, $this->message);
314
+                        break;
315
+                    }
316
+                }
317
+            }
318
+        }
319
+        else {
320
+            // Works. Just leave it.
321
+            $signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOSIGS, $outcert, explode(';', PLUGIN_SMIME_CACERTS));
322
+            $openssl_error_code = $this->extract_openssl_error();
323
+            $this->validateSignedMessage($signed_ok, $openssl_error_code);
324
+
325
+            // OCSP check
326
+            if ($signed_ok && $openssl_error_code !== OPENSSL_CA_VERIFY_FAIL) { // CA Checks out
327
+                $userCert = file_get_contents($outcert);
328
+                $parsedImportCert = openssl_x509_parse($userCert);
329
+
330
+                $caCerts = $this->extractCAs($tmpfname);
331
+                if (!is_array($parsedImportCert) || !verifyOCSP($userCert, $caCerts, $this->message)) {
332
+                    $importMessageCert = false;
333
+                }
334
+                // We don't have a certificate from the MAPI UserStore or LDAP, so we will set $userCert to $importCert
335
+                // so that we can verify the message according to the be imported certificate.
336
+            }
337
+            else { // No pubkey
338
+                $importMessageCert = false;
339
+                Log::write(LOGLEVEL_INFO, sprintf("[smime] Unable to verify message without public key, openssl error: '%s'", $this->openssl_error));
340
+                $this->message['success'] = SMIME_STATUS_FAIL;
341
+                $this->message['info'] = SMIME_CA;
342
+            }
343
+        }
344
+        // Certificate is newer or not yet imported to the user store and not revoked
345
+        // If certificate is from the GAB, then don't import it.
346
+        if ($importMessageCert && !$fromGAB) {
347
+            $signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOSIGS, $outcert, explode(';', PLUGIN_SMIME_CACERTS));
348
+            $openssl_error_code = $this->extract_openssl_error();
349
+            $this->validateSignedMessage($signed_ok, $openssl_error_code);
350
+            $userCert = file_get_contents($outcert);
351
+            $parsedImportCert = openssl_x509_parse($userCert);
352
+            // FIXME: doing this in importPublicKey too...
353
+            $certEmail = getCertEmail($parsedImportCert);
354
+            if (!empty($certEmail)) {
355
+                $this->importCertificate($userCert, $parsedImportCert, 'public', true);
356
+            }
357
+        }
358
+
359
+        // Remove extracted certificate from openssl_pkcs7_verify
360
+        unlink($outcert);
361
+
362
+        // remove the temporary file
363
+        unlink($tmpfname);
364
+
365
+        // Clean up temp cert
366
+        unlink($tmpUserCert);
367
+    }
368
+
369
+    /**
370
+     * Function which decrypts an encrypted message.
371
+     * The key should be unlocked and stored in the EncryptionStore for a successful decrypt
372
+     * If the key isn't in the session, we give the user a message to unlock his certificate.
373
+     *
374
+     * @param {mixed} $data array of data from hook
375
+     */
376
+    public function onEncrypted($data) {
377
+        // Cert unlocked, decode message
378
+        $this->message['success'] = SMIME_STATUS_INFO;
379
+        $this->message['info'] = SMIME_DECRYPT_FAILURE;
380
+
381
+        $this->message['type'] = 'encrypted';
382
+        $encryptionStore = EncryptionStore::getInstance();
383
+        $pass = $encryptionStore->get('smime');
384
+        if (isset($pass) && !empty($pass)) {
385
+            $certs = readPrivateCert($this->getStore(), $pass, false);
386
+            // create random file for saving the encrypted and body message
387
+            $tmpFile = tempnam(sys_get_temp_dir(), true);
388
+            $tmpDecrypted = tempnam(sys_get_temp_dir(), true);
389
+
390
+            // Write mime header. Because it's not provided in the attachment, otherwise openssl won't parse it
391
+            $fp = fopen($tmpFile, 'w');
392
+            fwrite($fp, "Content-Type: application/pkcs7-mime; name=\"smime.p7m\"; smime-type=enveloped-data\n");
393
+            fwrite($fp, "Content-Transfer-Encoding: base64\nContent-Disposition: attachment; filename=\"smime.p7m\"\n");
394
+            fwrite($fp, "Content-Description: S/MIME Encrypted Message\n\n");
395
+            fwrite($fp, chunk_split(base64_encode($data['data']), 72) . "\n");
396
+            fclose($fp);
397
+
398
+            $decryptStatus = false;
399
+            // If multiple private certs were decrypted with supplied password
400
+            if (!$certs['cert'] && count($certs) > 0) {
401
+                foreach ($certs as $cert) {
402
+                    $decryptStatus = openssl_pkcs7_decrypt($tmpFile, $tmpDecrypted, $cert['cert'], [$cert['pkey'], $pass]);
403
+                    if ($decryptStatus !== false) {
404
+                        break;
405
+                    }
406
+                }
407
+            }
408
+            else {
409
+                $decryptStatus = openssl_pkcs7_decrypt($tmpFile, $tmpDecrypted, $certs['cert'], [$certs['pkey'], $pass]);
410
+            }
411
+
412
+            $content = file_get_contents($tmpDecrypted);
413
+            // Handle OL empty body Outlook Signed & Encrypted mails.
414
+            // The S/MIME plugin has to extract the body from the signed message.
415
+            if (strpos($content, 'signed-data') !== false) {
416
+                $this->message['type'] = 'encryptsigned';
417
+                $olcert = tempnam(sys_get_temp_dir(), true);
418
+                $olmsg = tempnam(sys_get_temp_dir(), true);
419
+                openssl_pkcs7_verify($tmpDecrypted, PKCS7_NOVERIFY, $olcert);
420
+                openssl_pkcs7_verify($tmpDecrypted, PKCS7_NOVERIFY, $olcert, [], $olcert, $olmsg);
421
+                $content = file_get_contents($olmsg);
422
+                unlink($olmsg);
423
+                unlink($olcert);
424
+            }
425
+
426
+            $copyProps = mapi_getprops($data['message'], [PR_MESSAGE_DELIVERY_TIME, PR_SENDER_ENTRYID, PR_SENT_REPRESENTING_ENTRYID]);
427
+            mapi_inetmapi_imtomapi($GLOBALS['mapisession']->getSession(), $data['store'], $GLOBALS['mapisession']->getAddressbook(), $data['message'], $content, ['parse_smime_signed' => true]);
428
+            // Manually set time back to the received time, since mapi_inetmapi_imtomapi overwrites this
429
+            mapi_setprops($data['message'], $copyProps);
430
+
431
+            // remove temporary files
432
+            unlink($tmpFile);
433
+            unlink($tmpDecrypted);
434
+
435
+            // mapi_inetmapi_imtomapi removes the PR_MESSAGE_CLASS = 'IPM.Note.SMIME.MultipartSigned'
436
+            // So we need to check if the message was also signed by looking at the MIME_TAG in the eml
437
+            if (strpos($content, 'multipart/signed') !== false || strpos($content, 'signed-data') !== false) {
438
+                $this->message['type'] = 'encryptsigned';
439
+                $this->verifyMessage($data['message'], $content);
440
+            }
441
+            elseif ($decryptStatus) {
442
+                $this->message['info'] = SMIME_DECRYPT_SUCCESS;
443
+                $this->message['success'] = SMIME_STATUS_SUCCESS;
444
+            }
445
+            elseif ($this->extract_openssl_error() === OPENSSL_RECIPIENT_CERTIFICATE_MISMATCH) {
446
+                error_log("[smime] Error when decrypting email, openssl error: " . print_r($this->openssl_error, true));
447
+                Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when decrypting email, openssl error: '%s'", $this->openssl_error));
448
+                $this->message['info'] = SMIME_DECRYPT_CERT_MISMATCH;
449
+                $this->message['success'] = SMIME_STATUS_FAIL;
450
+            }
451
+        }
452
+        else {
453
+            $this->message['info'] = SMIME_UNLOCK_CERT;
454
+        }
455
+
456
+        if (!encryptionStoreExpirationSupport()) {
457
+            withPHPSession(function () use ($encryptionStore) {
458
+                $encryptionStore->add('smime', '');
459
+            });
460
+        }
461
+    }
462
+
463
+    /**
464
+     * Function which calls verifyMessage to verify if the message isn't malformed during transport.
465
+     *
466
+     * @param {mixed} $data array of data from hook
467
+     */
468
+    public function onSignedMessage($data) {
469
+        $this->message['type'] = 'signed';
470
+        $this->verifyMessage($data['message'], $data['data']);
471
+    }
472
+
473
+    /**
474
+     * General function which parses the openssl_pkcs7_verify return value and the errors generated by
475
+     * openssl_error_string().
476
+     *
477
+     * @param mixed $openssl_return
478
+     * @param mixed $openssl_errors
479
+     */
480
+    public function validateSignedMessage($openssl_return, $openssl_errors) {
481
+        if ($openssl_return === -1) {
482
+            $this->message['info'] = SMIME_ERROR;
483
+            $this->message['success'] = SMIME_STATUS_FAIL;
484
+        // Verification was successful
485
+        }
486
+        elseif ($openssl_return) {
487
+            $this->message['info'] = SMIME_SUCCESS;
488
+            $this->message['success'] = SMIME_STATUS_SUCCESS;
489
+        // Verification was not successful, display extra information.
490
+        }
491
+        else {
492
+            $this->message['success'] = SMIME_STATUS_FAIL;
493
+            if ($openssl_errors === OPENSSL_CA_VERIFY_FAIL) {
494
+                $this->message['info'] = SMIME_CA;
495
+            }
496
+            else { // Catch general errors
497
+                $this->message['info'] = SMIME_ERROR;
498
+            }
499
+        }
500
+    }
501
+
502
+    /**
503
+     * Set smime key in $data array, which is send back to client
504
+     * Since we can't create this array key in the hooks:
505
+     * 'server.util.parse_smime.signed'
506
+     * 'server.util.parse_smime.encrypted'.
507
+     *
508
+     * TODO: investigate if we can move away from this hook
509
+     *
510
+     * @param {mixed} $data
511
+     */
512
+    public function onAfterOpen($data) {
513
+        if (isset($this->message) && !empty($this->message)) {
514
+            $data['data']['item']['props']['smime'] = $this->message;
515
+        }
516
+    }
517
+
518
+    /**
519
+     * Handles the uploaded certificate in the settingsmenu in grommunio Web
520
+     * - Opens the certificate with provided passphrase
521
+     * - Checks if it can be used for signing/decrypting
522
+     * - Verifies that the email address is equal to the
523
+     * - Verifies that the certificate isn't expired and inform user.
524
+     *
525
+     * @param {mixed} $data
526
+     */
527
+    public function onUploadCertificate($data) {
528
+        if ($data['sourcetype'] === 'certificate') {
529
+            $passphrase = $_POST['passphrase'];
530
+            $saveCert = false;
531
+            $tmpname = $data['tmpname'];
532
+            $message = '';
533
+
534
+            $certificate = file_get_contents($tmpname);
535
+            $emailAddress = $GLOBALS['mapisession']->getSMTPAddress();
536
+            list($message, $publickey, $publickeyData) = validateUploadedPKCS($certificate, $passphrase, $emailAddress);
537
+
538
+            // All checks completed successful
539
+            // Store private cert in users associated store (check for duplicates)
540
+            if (empty($message)) {
541
+                $certMessage = getMAPICert($this->getStore());
542
+                // TODO: update to serialNumber check
543
+                if ($certMessage && $certMessage[0][PR_MESSAGE_DELIVERY_TIME] == $publickeyData['validTo_time_t']) {
544
+                    $message = _('Certificate is already stored on the server');
545
+                }
546
+                else {
547
+                    $saveCert = true;
548
+                    $root = mapi_msgstore_openentry($this->getStore(), null);
549
+                    // Remove old certificate
550
+                    /*
551 551
 					if($certMessage) {
552 552
 						// Delete private key
553 553
 						mapi_folder_deletemessages($root, array($certMessage[PR_ENTRYID]));
@@ -562,597 +562,597 @@  discard block
 block discarded – undo
562 562
 						$message = _('Certificate uploaded');
563 563
 					}*/
564 564
 
565
-					$this->importCertificate($certificate, $publickeyData, 'private');
566
-
567
-					// Check if the user has a public key in the GAB.
568
-					$store_props = mapi_getprops($this->getStore(), [PR_USER_ENTRYID]);
569
-					$user = mapi_ab_openentry($GLOBALS['mapisession']->getAddressbook(), $store_props[PR_USER_ENTRYID]);
570
-
571
-					$this->importCertificate($publickey, $publickeyData, 'public', true);
572
-				}
573
-			}
574
-
575
-			$returnfiles = [];
576
-			$returnfiles[] = [
577
-				'props' => [
578
-					'attach_num' => -1,
579
-					'size' => $data['size'],
580
-					'name' => $data['name'],
581
-					'cert' => $saveCert,
582
-					'cert_warning' => $message,
583
-				],
584
-			];
585
-			$data['returnfiles'] = $returnfiles;
586
-		}
587
-	}
588
-
589
-	/**
590
-	 * This function handles the 'beforesend' hook which is triggered before sending the email.
591
-	 * If the PR_MESSAGE_CLASS is set to a signed email (IPM.Note.SMIME.Multipartsigned), this function
592
-	 * will convert the mapi message to RFC822, sign the eml and attach the signed email to the mapi message.
593
-	 *
594
-	 * @param {mixed} $data from php hook
595
-	 */
596
-	public function onBeforeSend(&$data) {
597
-		$store = $data['store'];
598
-		$message = $data['message'];
599
-
600
-		// Retrieve message class
601
-		$props = mapi_getprops($message, [PR_MESSAGE_CLASS, PR_EC_IMAP_EMAIL]);
602
-		$messageClass = $props[PR_MESSAGE_CLASS];
603
-
604
-		if (isset($messageClass) && (stripos($messageClass, 'IPM.Note.SMIME') !== false)) {
605
-			// FIXME: for now return when we are going to sign but we don't have the passphrase set
606
-			// This should never happen sign
607
-			$encryptionStore = \EncryptionStore::getInstance();
608
-			if (($messageClass === 'IPM.Note.SMIME.SignedEncrypt' || $messageClass === 'IPM.Note.SMIME.MultipartSigned') &&
609
-				!$encryptionStore->get('smime')) {
610
-				return;
611
-			}
612
-			// NOTE: setting message class to IPM.Note, so that mapi_inetmapi_imtoinet converts the message to plain email
613
-			// and doesn't fail when handling the attachments.
614
-			mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note']);
615
-			mapi_savechanges($message);
616
-
617
-			// If RFC822-formatted stream is already available in PR_EC_IMAP_EMAIL property
618
-			// than directly use it, generate otherwise.
619
-			if (isset($props[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $props) == MAPI_E_NOT_ENOUGH_MEMORY) {
620
-				// Stream the message to properly get the PR_EC_IMAP_EMAIL property
621
-				$emlMessageStream = mapi_openproperty($message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
622
-			}
623
-			else {
624
-				// Read the message as RFC822-formatted e-mail stream.
625
-				$emlMessageStream = mapi_inetmapi_imtoinet($GLOBALS['mapisession']->getSession(), $GLOBALS['mapisession']->getAddressbook(), $message, []);
626
-			}
627
-
628
-			// Remove all attachments, since they are stored in the attached signed message
629
-			$atable = mapi_message_getattachmenttable($message);
630
-			$rows = mapi_table_queryallrows($atable, [PR_ATTACH_MIME_TAG, PR_ATTACH_NUM]);
631
-			foreach ($rows as $row) {
632
-				$attnum = $row[PR_ATTACH_NUM];
633
-				mapi_message_deleteattach($message, $attnum);
634
-			}
635
-
636
-			// create temporary files
637
-			$tmpSendEmail = tempnam(sys_get_temp_dir(), true);
638
-			$tmpSendSmimeEmail = tempnam(sys_get_temp_dir(), true);
639
-
640
-			// Save message stream to a file
641
-			$stat = mapi_stream_stat($emlMessageStream);
642
-
643
-			$fhandle = fopen($tmpSendEmail, 'w');
644
-			$buffer = null;
645
-			for ($i = 0; $i < $stat["cb"]; $i += BLOCK_SIZE) {
646
-				// Write stream
647
-				$buffer = mapi_stream_read($emlMessageStream, BLOCK_SIZE);
648
-				fwrite($fhandle, $buffer, strlen($buffer));
649
-			}
650
-			fclose($fhandle);
651
-
652
-			// Create attachment for S/MIME message
653
-			$signedAttach = mapi_message_createattach($message);
654
-			$smimeProps = [
655
-				PR_ATTACH_LONG_FILENAME => 'smime.p7m',
656
-				PR_DISPLAY_NAME => 'smime.p7m',
657
-				PR_ATTACH_METHOD => ATTACH_BY_VALUE,
658
-				PR_ATTACH_MIME_TAG => 'multipart/signed',
659
-				PR_ATTACHMENT_HIDDEN => true,
660
-			];
661
-
662
-			// Sign then Encrypt email
663
-			switch ($messageClass) {
664
-				case 'IPM.Note.SMIME.SignedEncrypt':
665
-					$tmpFile = tempnam(sys_get_temp_dir(), true);
666
-					$this->sign($tmpSendEmail, $tmpFile, $message, $signedAttach, $smimeProps);
667
-					$this->encrypt($tmpFile, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
668
-					unlink($tmpFile);
669
-					break;
670
-
671
-				case 'IPM.Note.SMIME.MultipartSigned':
672
-					$this->sign($tmpSendEmail, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
673
-					break;
674
-
675
-				case 'IPM.Note.SMIME':
676
-					$this->encrypt($tmpSendEmail, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
677
-					break;
678
-			}
679
-
680
-			// Save the signed message as attachment of the send email
681
-			$stream = mapi_openproperty($signedAttach, PR_ATTACH_DATA_BIN, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
682
-			$handle = fopen($tmpSendSmimeEmail, 'r');
683
-			while (!feof($handle)) {
684
-				$contents = fread($handle, BLOCK_SIZE);
685
-				mapi_stream_write($stream, $contents);
686
-			}
687
-			fclose($handle);
688
-
689
-			mapi_stream_commit($stream);
690
-
691
-			// remove tmp files
692
-			unlink($tmpSendSmimeEmail);
693
-			unlink($tmpSendEmail);
694
-
695
-			mapi_savechanges($signedAttach);
696
-			mapi_savechanges($message);
697
-		}
698
-	}
699
-
700
-	/**
701
-	 * Function to sign an email.
702
-	 *
703
-	 * @param object $infile       File eml to be encrypted
704
-	 * @param object $outfile      File
705
-	 * @param object $message      Mapi Message Object
706
-	 * @param object $signedAttach
707
-	 * @param array  $smimeProps
708
-	 */
709
-	public function sign(&$infile, &$outfile, &$message, &$signedAttach, $smimeProps) {
710
-		// Set mesageclass back to IPM.Note.SMIME.MultipartSigned
711
-		mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note.SMIME.MultipartSigned']);
712
-		mapi_setprops($signedAttach, $smimeProps);
713
-
714
-		// Obtain private certificate
715
-		$encryptionStore = EncryptionStore::getInstance();
716
-		// Only the newest one is returned
717
-		$certs = readPrivateCert($this->getStore(), $encryptionStore->get('smime'));
718
-
719
-		// Retrieve intermediate CA's for verification, if available
720
-		if (isset($certs['extracerts'])) {
721
-			$tmpFile = tempnam(sys_get_temp_dir(), true);
722
-			file_put_contents($tmpFile, implode('', $certs['extracerts']));
723
-			$ok = openssl_pkcs7_sign($infile, $outfile, $certs['cert'], [$certs['pkey'], ''], [], PKCS7_DETACHED, $tmpFile);
724
-			if (!$ok) {
725
-				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message with intermediate certificates, openssl error: '%s'", @openssl_error_string()));
726
-			}
727
-			unlink($tmpFile);
728
-		}
729
-		else {
730
-			$ok = openssl_pkcs7_sign($infile, $outfile, $certs['cert'], [$certs['pkey'], ''], [], PKCS7_DETACHED);
731
-			if (!$ok) {
732
-				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message, openssl error: '%s'", @openssl_error_string()));
733
-			}
734
-		}
735
-	}
736
-
737
-	/**
738
-	 * Function to encrypt an email.
739
-	 *
740
-	 * @param object $infile       File eml to be encrypted
741
-	 * @param object $outfile      File
742
-	 * @param object $message      Mapi Message Object
743
-	 * @param object $signedAttach
744
-	 * @param array  $smimeProps
745
-	 */
746
-	public function encrypt(&$infile, &$outfile, &$message, &$signedAttach, $smimeProps) {
747
-		mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note.SMIME']);
748
-		$smimeProps[PR_ATTACH_MIME_TAG] = "application/pkcs7-mime";
749
-		mapi_setprops($signedAttach, $smimeProps);
750
-
751
-		$publicCerts = $this->getPublicKeyForMessage($message);
752
-		// Always append our own certificate, so that the mail can be decrypted in 'Sent items'
753
-		// Prefer GAB public certificate above MAPI Store certificate.
754
-		$email = $GLOBALS['mapisession']->getSMTPAddress();
755
-		$user = $this->getGABUser($email);
756
-		$cert = $this->getGABCert($user);
757
-		if (empty($cert)) {
758
-			$cert = base64_decode($this->getPublicKey($email));
759
-		}
760
-
761
-		if (!empty($cert)) {
762
-			array_push($publicCerts, $cert);
763
-		}
764
-
765
-		$ok = openssl_pkcs7_encrypt($infile, $outfile, $publicCerts, [], 0, $this->cipher);
766
-		if (!$ok) {
767
-			error_log("[smime] unable to encrypt message, openssl error: " . print_r(@openssl_error_string(), true));
768
-			Log::Write(LOGLEVEL_ERROR, sprintf("[smime] unable to encrypt message, openssl error: '%s'", @openssl_error_string()));
769
-		}
770
-		$tmpEml = file_get_contents($outfile);
771
-
772
-		// Grab the base64 data, since MAPI requires it saved as decoded base64 string.
773
-		// FIXME: we can do better here
774
-		$matches = explode("\n\n", $tmpEml);
775
-		$base64 = str_replace("\n", "", $matches[1]);
776
-		file_put_contents($outfile, base64_decode($base64));
777
-
778
-		// Empty the body
779
-		mapi_setprops($message, [PR_BODY => ""]);
780
-	}
781
-
782
-	/**
783
-	 * Function which fetches the public certificates for all recipients (TO/CC/BCC) of a message
784
-	 * Always get the certificate of an address which expires last.
785
-	 *
786
-	 * @param object $message Mapi Message Object
787
-	 *
788
-	 * @return array of public certificates
789
-	 */
790
-	public function getPublicKeyForMessage($message) {
791
-		$recipientTable = mapi_message_getrecipienttable($message);
792
-		$recips = mapi_table_queryallrows($recipientTable, [PR_SMTP_ADDRESS, PR_RECIPIENT_TYPE, PR_ADDRTYPE], [RES_OR, [
793
-			[RES_PROPERTY,
794
-				[
795
-					RELOP => RELOP_EQ,
796
-					ULPROPTAG => PR_RECIPIENT_TYPE,
797
-					VALUE => MAPI_BCC,
798
-				],
799
-			],
800
-			[RES_PROPERTY,
801
-				[
802
-					RELOP => RELOP_EQ,
803
-					ULPROPTAG => PR_RECIPIENT_TYPE,
804
-					VALUE => MAPI_CC,
805
-				],
806
-			],
807
-			[RES_PROPERTY,
808
-				[
809
-					RELOP => RELOP_EQ,
810
-					ULPROPTAG => PR_RECIPIENT_TYPE,
811
-					VALUE => MAPI_TO,
812
-				],
813
-			],
814
-		]]);
815
-
816
-		$publicCerts = [];
817
-		$storeCert = '';
818
-		$gabCert = '';
819
-
820
-		foreach ($recips as $recip) {
821
-			$emailAddr = $recip[PR_SMTP_ADDRESS];
822
-			$addrType = $recip[PR_ADDRTYPE];
823
-
824
-			if ($addrType === "ZARAFA" || $addrType === "EX") {
825
-				$user = $this->getGABUser($emailAddr);
826
-				$gabCert = $this->getGABCert($user);
827
-			}
828
-
829
-			$storeCert = $this->getPublicKey($emailAddr);
830
-
831
-			if (!empty($gabCert)) {
832
-				array_push($publicCerts, $gabCert);
833
-			}
834
-			elseif (!empty($storeCert)) {
835
-				array_push($publicCerts, base64_decode($storeCert));
836
-			}
837
-		}
838
-
839
-		return $publicCerts;
840
-	}
841
-
842
-	/**
843
-	 * Retrieves the public certificates stored in the MAPI UserStore and belonging to the
844
-	 * emailAdddress, returns "" if there is no certificate for that user.
845
-	 *
846
-	 * @param {String} emailAddress
847
-	 * @param mixed $emailAddress
848
-	 * @param mixed $multiple
849
-	 *
850
-	 * @return {String} $certificate
851
-	 */
852
-	public function getPublicKey($emailAddress, $multiple = false) {
853
-		$certificates = [];
854
-
855
-		$certs = getMAPICert($this->getStore(), 'WebApp.Security.Public', $emailAddress);
856
-
857
-		if ($certs && count($certs) > 0) {
858
-			foreach ($certs as $cert) {
859
-				$pubkey = mapi_msgstore_openentry($this->getStore(), $cert[PR_ENTRYID]);
860
-				$certificate = "";
861
-				if ($pubkey != false) {
862
-					// retrieve pkcs#11 certificate from body
863
-					$stream = mapi_openproperty($pubkey, PR_BODY, IID_IStream, 0, 0);
864
-					$stat = mapi_stream_stat($stream);
865
-					mapi_stream_seek($stream, 0, STREAM_SEEK_SET);
866
-					for ($i = 0; $i < $stat['cb']; $i += 1024) {
867
-						$certificate .= mapi_stream_read($stream, 1024);
868
-					}
869
-					array_push($certificates, $certificate);
870
-				}
871
-			}
872
-		}
873
-
874
-		return $multiple ? $certificates : ($certificates[0] ?? '');
875
-	}
876
-
877
-	/**
878
-	 * Function which is used to check if there is a public certificate for the provided emailAddress.
879
-	 *
880
-	 * @param {String} emailAddress emailAddres of recipient
881
-	 * @param {Boolean} gabUser is the user of PR_ADDRTYPE == ZARAFA
882
-	 * @param mixed $emailAddress
883
-	 * @param mixed $gabUser
884
-	 *
885
-	 * @return {Boolean} true if public certificate exists
886
-	 */
887
-	public function pubcertExists($emailAddress, $gabUser = false) {
888
-		if ($gabUser) {
889
-			$user = $this->getGABUser($emailAddress);
890
-			$gabCert = $this->getGABCert($user);
891
-			if ($user && !empty($gabCert)) {
892
-				return true;
893
-			}
894
-		}
895
-
896
-		$root = mapi_msgstore_openentry($this->getStore(), null);
897
-		$table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
898
-
899
-		// Restriction for public certificates which are from the recipient of the email, are active and have the correct message_class
900
-		$restrict = [RES_AND, [
901
-			[RES_PROPERTY,
902
-				[
903
-					RELOP => RELOP_EQ,
904
-					ULPROPTAG => PR_MESSAGE_CLASS,
905
-					VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Public"],
906
-				],
907
-			],
908
-			[RES_PROPERTY,
909
-				[
910
-					RELOP => RELOP_EQ,
911
-					ULPROPTAG => PR_SUBJECT,
912
-					VALUE => [PR_SUBJECT => $emailAddress],
913
-				],
914
-			],
915
-		]];
916
-		mapi_table_restrict($table, $restrict, TBL_BATCH);
917
-		mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
918
-
919
-		$rows = mapi_table_queryallrows($table, [PR_SUBJECT, PR_ENTRYID, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME], $restrict);
920
-
921
-		return !empty($rows);
922
-	}
923
-
924
-	/**
925
-	 * Helper functions which extracts the errors from openssl_error_string()
926
-	 * Example error from openssl_error_string(): error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error
927
-	 * Note that openssl_error_string() returns an error when verifying is successful, this is a bug in PHP https://bugs.php.net/bug.php?id=50713.
928
-	 *
929
-	 * @return {String}
930
-	 */
931
-	public function extract_openssl_error() {
932
-		// TODO: should catch more errors by using while($error = @openssl_error_string())
933
-		$this->openssl_error = @openssl_error_string();
934
-		$openssl_error_code = 0;
935
-		if ($this->openssl_error) {
936
-			$openssl_error_list = explode(":", $this->openssl_error);
937
-			$openssl_error_code = $openssl_error_list[1];
938
-		}
939
-
940
-		return $openssl_error_code;
941
-	}
942
-
943
-	/**
944
-	 * Extract the intermediate certificates from the signed email. Uses kopano_smime's
945
-	 * two functions, to extract the PKCS#7 blob and then converts the PKCS#7 blob to
946
-	 * X509 certificates using kopano_pkcs7_read.
947
-	 *
948
-	 * @param string $emlfile - the s/mime message
949
-	 *
950
-	 * @return array a list of extracted intermediate certificates
951
-	 */
952
-	public function extractCAs($emlfile) {
953
-		$php72 = version_compare(phpversion(), "7.2.0") >= 0;
954
-		$phpcompat = function_exists('kopano_pkcs7_verify') && function_exists('kopano_pkcs7_read');
955
-		if (!$phpcompat && !$php72) {
956
-			return [];
957
-		}
958
-
959
-		$certfile = tempnam(sys_get_temp_dir(), true);
960
-		$outfile = tempnam(sys_get_temp_dir(), true);
961
-		$p7bfile = tempnam(sys_get_temp_dir(), true);
962
-
963
-		if ($php72) {
964
-			openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
965
-			openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
966
-		}
967
-		else {
968
-			kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
969
-			kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
970
-		}
971
-
972
-		$cas = [];
973
-		$p7b = file_get_contents($p7bfile);
974
-		if ($php72) {
975
-			openssl_pkcs7_read($p7b, $cas);
976
-		}
977
-		else {
978
-			// FIXME: Without the error_log, kopano_pkcs7_verify does not work (wtf).
979
-			error_log($p7b);
980
-			kopano_pkcs7_read($p7b, $cas);
981
-		}
982
-		unlink($certfile);
983
-		unlink($outfile);
984
-		unlink($p7bfile);
985
-
986
-		return $cas;
987
-	}
988
-
989
-	/**
990
-	 * Imports certificate in the MAPI Root Associated Folder.
991
-	 *
992
-	 * Private key, always insert certificate
993
-	 * Public key, check if we already have one stored
994
-	 *
995
-	 * @param string $cert     certificate body as a string
996
-	 * @param mixed  $certData an array with the parsed certificate data
997
-	 * @param string $type     certificate type, default 'public'
998
-	 * @param bool   $force    force import the certificate even though we have one already stored in the MAPI Store.
999
-	 *                         FIXME: remove $force in the future and move the check for newer certificate in this function.
1000
-	 */
1001
-	public function importCertificate($cert, $certData, $type = 'public', $force = false) {
1002
-		$certEmail = getCertEmail($certData);
1003
-		if (!$this->pubcertExists($certEmail) || $force || $type === 'private') {
1004
-			$issued_by = "";
1005
-			foreach (array_keys($certData['issuer']) as $key) {
1006
-				$issued_by .= $key . '=' . $certData['issuer'][$key] . "\n";
1007
-			}
1008
-
1009
-			$root = mapi_msgstore_openentry($this->getStore(), null);
1010
-			$assocMessage = mapi_folder_createmessage($root, MAPI_ASSOCIATED);
1011
-			// TODO: write these properties down.
1012
-			mapi_setprops($assocMessage, [
1013
-				PR_SUBJECT => $certEmail,
1014
-				PR_MESSAGE_CLASS => $type == 'public' ? 'WebApp.Security.Public' : 'WebApp.Security.Private',
1015
-				PR_MESSAGE_DELIVERY_TIME => $certData['validTo_time_t'],
1016
-				PR_CLIENT_SUBMIT_TIME => $certData['validFrom_time_t'],
1017
-				PR_SENDER_NAME => $certData['serialNumber'], // serial
1018
-				PR_SENDER_EMAIL_ADDRESS => $issued_by, // Issuer To
1019
-				PR_SUBJECT_PREFIX => '',
1020
-				PR_RECEIVED_BY_NAME => $this->fingerprint_cert($cert, 'sha1'), // SHA1 Fingerprint
1021
-				PR_INTERNET_MESSAGE_ID => $this->fingerprint_cert($cert), // MD5 FingerPrint
1022
-			]);
1023
-			// Save attachment
1024
-			$msgBody = base64_encode($cert);
1025
-			$stream = mapi_openproperty($assocMessage, PR_BODY, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
1026
-			mapi_stream_setsize($stream, strlen($msgBody));
1027
-			mapi_stream_write($stream, $msgBody);
1028
-			mapi_stream_commit($stream);
1029
-			mapi_message_savechanges($assocMessage);
1030
-		}
1031
-	}
1032
-
1033
-	/**
1034
-	 * Function which returns the fingerprint (hash) of the certificate.
1035
-	 *
1036
-	 * @param {string} $cert certificate body as a string
1037
-	 * @param {string} $hash optional hash algorithm
1038
-	 * @param mixed $body
1039
-	 */
1040
-	public function fingerprint_cert($body, $hash = 'md5') {
1041
-		// TODO: Note for PHP > 5.6 we can use openssl_x509_fingerprint
1042
-		$body = str_replace('-----BEGIN CERTIFICATE-----', '', $body);
1043
-		$body = str_replace('-----END CERTIFICATE-----', '', $body);
1044
-		$body = base64_decode($body);
1045
-
1046
-		if ($hash === 'sha1') {
1047
-			$fingerprint = sha1($body);
1048
-		}
1049
-		else {
1050
-			$fingerprint = md5($body);
1051
-		}
1052
-
1053
-		// Format 1000AB as 10:00:AB
1054
-		return strtoupper(implode(':', str_split($fingerprint, 2)));
1055
-	}
1056
-
1057
-	/**
1058
-	 * Retrieve the GAB User.
1059
-	 *
1060
-	 * FIXME: ideally this would be a public function in grommunio Web.
1061
-	 *
1062
-	 * @param string $email the email address of the user
1063
-	 *
1064
-	 * @return mixed $user boolean if false else MAPIObject
1065
-	 */
1066
-	public function getGABUser($email) {
1067
-		$addrbook = $GLOBALS["mapisession"]->getAddressbook();
1068
-		$userArr = [[PR_DISPLAY_NAME => $email]];
1069
-		$user = false;
1070
-
1071
-		try {
1072
-			$user = mapi_ab_resolvename($addrbook, $userArr, EMS_AB_ADDRESS_LOOKUP);
1073
-			$user = mapi_ab_openentry($addrbook, $user[0][PR_ENTRYID]);
1074
-		}
1075
-		catch (MAPIException $e) {
1076
-			$e->setHandled();
1077
-		}
1078
-
1079
-		return $user;
1080
-	}
1081
-
1082
-	/**
1083
-	 * Retrieve the PR_EMS_AB_TAGGED_X509_CERT.
1084
-	 *
1085
-	 * @param MAPIObject $user the GAB user
1086
-	 *
1087
-	 * @return string $cert the certificate, empty if not found
1088
-	 */
1089
-	public function getGABCert($user) {
1090
-		$cert = '';
1091
-		$userCertArray = mapi_getprops($user, [PR_EMS_AB_TAGGED_X509_CERT]);
1092
-		if (isset($userCertArray[PR_EMS_AB_TAGGED_X509_CERT])) {
1093
-			$cert = der2pem($userCertArray[PR_EMS_AB_TAGGED_X509_CERT][0]);
1094
-		}
1095
-
1096
-		return $cert;
1097
-	}
1098
-
1099
-	/**
1100
-	 * Called when the core Settings class is initialized and ready to accept sysadmin default
1101
-	 * settings. Registers the sysadmin defaults for the example plugin.
1102
-	 *
1103
-	 * @param {mixed} $data Reference to the data of the triggered hook
1104
-	 */
1105
-	public function onBeforeSettingsInit(&$data) {
1106
-		$data['settingsObj']->addSysAdminDefaults([
1107
-			'zarafa' => [
1108
-				'v1' => [
1109
-					'plugins' => [
1110
-						'smime' => [
1111
-							'enable' => defined('PLUGIN_SMIME_USER_DEFAULT_ENABLE_SMIME') && PLUGIN_SMIME_USER_DEFAULT_ENABLE_SMIME,
1112
-							'passphrase_cache' => defined('PLUGIN_SMIME_PASSPHRASE_REMEMBER_BROWSER') && PLUGIN_SMIME_PASSPHRASE_REMEMBER_BROWSER,
1113
-						],
1114
-					],
1115
-				],
1116
-			],
1117
-		]);
1118
-	}
1119
-
1120
-	/**
1121
-	 * Get sender structure of the MAPI Message.
1122
-	 *
1123
-	 * @param mapimessage $mapiMessage MAPI Message resource from which we need to get the sender
1124
-	 *
1125
-	 * @return array with properties
1126
-	 */
1127
-	public function getSenderAddress($mapiMessage) {
1128
-		if (!method_exists($GLOBALS['operations'], 'getSenderAddress')) {
1129
-			$messageProps = mapi_getprops($mapiMessage, [PR_SENT_REPRESENTING_ENTRYID, PR_SENDER_ENTRYID]);
1130
-			$senderEntryID = isset($messageProps[PR_SENT_REPRESENTING_ENTRYID]) ? $messageProps[PR_SENT_REPRESENTING_ENTRYID] : $messageProps[PR_SENDER_ENTRYID];
1131
-
1132
-			try {
1133
-				$senderUser = mapi_ab_openentry($GLOBALS["mapisession"]->getAddressbook(), $senderEntryID);
1134
-				if ($senderUser) {
1135
-					$userprops = mapi_getprops($senderUser, [PR_ADDRTYPE, PR_DISPLAY_NAME, PR_EMAIL_ADDRESS, PR_SMTP_ADDRESS, PR_OBJECT_TYPE, PR_RECIPIENT_TYPE, PR_DISPLAY_TYPE, PR_DISPLAY_TYPE_EX, PR_ENTRYID]);
1136
-
1137
-					$senderStructure = [];
1138
-					$senderStructure["props"]['entryid'] = bin2hex($userprops[PR_ENTRYID]);
1139
-					$senderStructure["props"]['display_name'] = isset($userprops[PR_DISPLAY_NAME]) ? $userprops[PR_DISPLAY_NAME] : '';
1140
-					$senderStructure["props"]['email_address'] = isset($userprops[PR_EMAIL_ADDRESS]) ? $userprops[PR_EMAIL_ADDRESS] : '';
1141
-					$senderStructure["props"]['smtp_address'] = isset($userprops[PR_SMTP_ADDRESS]) ? $userprops[PR_SMTP_ADDRESS] : '';
1142
-					$senderStructure["props"]['address_type'] = isset($userprops[PR_ADDRTYPE]) ? $userprops[PR_ADDRTYPE] : '';
1143
-					$senderStructure["props"]['object_type'] = $userprops[PR_OBJECT_TYPE];
1144
-					$senderStructure["props"]['recipient_type'] = MAPI_TO;
1145
-					$senderStructure["props"]['display_type'] = isset($userprops[PR_DISPLAY_TYPE]) ? $userprops[PR_DISPLAY_TYPE] : MAPI_MAILUSER;
1146
-					$senderStructure["props"]['display_type_ex'] = isset($userprops[PR_DISPLAY_TYPE_EX]) ? $userprops[PR_DISPLAY_TYPE_EX] : MAPI_MAILUSER;
1147
-				}
1148
-			}
1149
-			catch (MAPIException $e) {
1150
-				Log::write(LOGLEVEL_ERROR, sprintf("%s %s", $e, $userProps[PR_SENT_REPRESENTING_NAME]));
1151
-			}
1152
-
1153
-			return $senderStructure;
1154
-		}
1155
-
1156
-		return $GLOBALS["operations"]->getSenderAddress($mapiMessage);
1157
-	}
565
+                    $this->importCertificate($certificate, $publickeyData, 'private');
566
+
567
+                    // Check if the user has a public key in the GAB.
568
+                    $store_props = mapi_getprops($this->getStore(), [PR_USER_ENTRYID]);
569
+                    $user = mapi_ab_openentry($GLOBALS['mapisession']->getAddressbook(), $store_props[PR_USER_ENTRYID]);
570
+
571
+                    $this->importCertificate($publickey, $publickeyData, 'public', true);
572
+                }
573
+            }
574
+
575
+            $returnfiles = [];
576
+            $returnfiles[] = [
577
+                'props' => [
578
+                    'attach_num' => -1,
579
+                    'size' => $data['size'],
580
+                    'name' => $data['name'],
581
+                    'cert' => $saveCert,
582
+                    'cert_warning' => $message,
583
+                ],
584
+            ];
585
+            $data['returnfiles'] = $returnfiles;
586
+        }
587
+    }
588
+
589
+    /**
590
+     * This function handles the 'beforesend' hook which is triggered before sending the email.
591
+     * If the PR_MESSAGE_CLASS is set to a signed email (IPM.Note.SMIME.Multipartsigned), this function
592
+     * will convert the mapi message to RFC822, sign the eml and attach the signed email to the mapi message.
593
+     *
594
+     * @param {mixed} $data from php hook
595
+     */
596
+    public function onBeforeSend(&$data) {
597
+        $store = $data['store'];
598
+        $message = $data['message'];
599
+
600
+        // Retrieve message class
601
+        $props = mapi_getprops($message, [PR_MESSAGE_CLASS, PR_EC_IMAP_EMAIL]);
602
+        $messageClass = $props[PR_MESSAGE_CLASS];
603
+
604
+        if (isset($messageClass) && (stripos($messageClass, 'IPM.Note.SMIME') !== false)) {
605
+            // FIXME: for now return when we are going to sign but we don't have the passphrase set
606
+            // This should never happen sign
607
+            $encryptionStore = \EncryptionStore::getInstance();
608
+            if (($messageClass === 'IPM.Note.SMIME.SignedEncrypt' || $messageClass === 'IPM.Note.SMIME.MultipartSigned') &&
609
+                !$encryptionStore->get('smime')) {
610
+                return;
611
+            }
612
+            // NOTE: setting message class to IPM.Note, so that mapi_inetmapi_imtoinet converts the message to plain email
613
+            // and doesn't fail when handling the attachments.
614
+            mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note']);
615
+            mapi_savechanges($message);
616
+
617
+            // If RFC822-formatted stream is already available in PR_EC_IMAP_EMAIL property
618
+            // than directly use it, generate otherwise.
619
+            if (isset($props[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $props) == MAPI_E_NOT_ENOUGH_MEMORY) {
620
+                // Stream the message to properly get the PR_EC_IMAP_EMAIL property
621
+                $emlMessageStream = mapi_openproperty($message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
622
+            }
623
+            else {
624
+                // Read the message as RFC822-formatted e-mail stream.
625
+                $emlMessageStream = mapi_inetmapi_imtoinet($GLOBALS['mapisession']->getSession(), $GLOBALS['mapisession']->getAddressbook(), $message, []);
626
+            }
627
+
628
+            // Remove all attachments, since they are stored in the attached signed message
629
+            $atable = mapi_message_getattachmenttable($message);
630
+            $rows = mapi_table_queryallrows($atable, [PR_ATTACH_MIME_TAG, PR_ATTACH_NUM]);
631
+            foreach ($rows as $row) {
632
+                $attnum = $row[PR_ATTACH_NUM];
633
+                mapi_message_deleteattach($message, $attnum);
634
+            }
635
+
636
+            // create temporary files
637
+            $tmpSendEmail = tempnam(sys_get_temp_dir(), true);
638
+            $tmpSendSmimeEmail = tempnam(sys_get_temp_dir(), true);
639
+
640
+            // Save message stream to a file
641
+            $stat = mapi_stream_stat($emlMessageStream);
642
+
643
+            $fhandle = fopen($tmpSendEmail, 'w');
644
+            $buffer = null;
645
+            for ($i = 0; $i < $stat["cb"]; $i += BLOCK_SIZE) {
646
+                // Write stream
647
+                $buffer = mapi_stream_read($emlMessageStream, BLOCK_SIZE);
648
+                fwrite($fhandle, $buffer, strlen($buffer));
649
+            }
650
+            fclose($fhandle);
651
+
652
+            // Create attachment for S/MIME message
653
+            $signedAttach = mapi_message_createattach($message);
654
+            $smimeProps = [
655
+                PR_ATTACH_LONG_FILENAME => 'smime.p7m',
656
+                PR_DISPLAY_NAME => 'smime.p7m',
657
+                PR_ATTACH_METHOD => ATTACH_BY_VALUE,
658
+                PR_ATTACH_MIME_TAG => 'multipart/signed',
659
+                PR_ATTACHMENT_HIDDEN => true,
660
+            ];
661
+
662
+            // Sign then Encrypt email
663
+            switch ($messageClass) {
664
+                case 'IPM.Note.SMIME.SignedEncrypt':
665
+                    $tmpFile = tempnam(sys_get_temp_dir(), true);
666
+                    $this->sign($tmpSendEmail, $tmpFile, $message, $signedAttach, $smimeProps);
667
+                    $this->encrypt($tmpFile, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
668
+                    unlink($tmpFile);
669
+                    break;
670
+
671
+                case 'IPM.Note.SMIME.MultipartSigned':
672
+                    $this->sign($tmpSendEmail, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
673
+                    break;
674
+
675
+                case 'IPM.Note.SMIME':
676
+                    $this->encrypt($tmpSendEmail, $tmpSendSmimeEmail, $message, $signedAttach, $smimeProps);
677
+                    break;
678
+            }
679
+
680
+            // Save the signed message as attachment of the send email
681
+            $stream = mapi_openproperty($signedAttach, PR_ATTACH_DATA_BIN, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
682
+            $handle = fopen($tmpSendSmimeEmail, 'r');
683
+            while (!feof($handle)) {
684
+                $contents = fread($handle, BLOCK_SIZE);
685
+                mapi_stream_write($stream, $contents);
686
+            }
687
+            fclose($handle);
688
+
689
+            mapi_stream_commit($stream);
690
+
691
+            // remove tmp files
692
+            unlink($tmpSendSmimeEmail);
693
+            unlink($tmpSendEmail);
694
+
695
+            mapi_savechanges($signedAttach);
696
+            mapi_savechanges($message);
697
+        }
698
+    }
699
+
700
+    /**
701
+     * Function to sign an email.
702
+     *
703
+     * @param object $infile       File eml to be encrypted
704
+     * @param object $outfile      File
705
+     * @param object $message      Mapi Message Object
706
+     * @param object $signedAttach
707
+     * @param array  $smimeProps
708
+     */
709
+    public function sign(&$infile, &$outfile, &$message, &$signedAttach, $smimeProps) {
710
+        // Set mesageclass back to IPM.Note.SMIME.MultipartSigned
711
+        mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note.SMIME.MultipartSigned']);
712
+        mapi_setprops($signedAttach, $smimeProps);
713
+
714
+        // Obtain private certificate
715
+        $encryptionStore = EncryptionStore::getInstance();
716
+        // Only the newest one is returned
717
+        $certs = readPrivateCert($this->getStore(), $encryptionStore->get('smime'));
718
+
719
+        // Retrieve intermediate CA's for verification, if available
720
+        if (isset($certs['extracerts'])) {
721
+            $tmpFile = tempnam(sys_get_temp_dir(), true);
722
+            file_put_contents($tmpFile, implode('', $certs['extracerts']));
723
+            $ok = openssl_pkcs7_sign($infile, $outfile, $certs['cert'], [$certs['pkey'], ''], [], PKCS7_DETACHED, $tmpFile);
724
+            if (!$ok) {
725
+                Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message with intermediate certificates, openssl error: '%s'", @openssl_error_string()));
726
+            }
727
+            unlink($tmpFile);
728
+        }
729
+        else {
730
+            $ok = openssl_pkcs7_sign($infile, $outfile, $certs['cert'], [$certs['pkey'], ''], [], PKCS7_DETACHED);
731
+            if (!$ok) {
732
+                Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message, openssl error: '%s'", @openssl_error_string()));
733
+            }
734
+        }
735
+    }
736
+
737
+    /**
738
+     * Function to encrypt an email.
739
+     *
740
+     * @param object $infile       File eml to be encrypted
741
+     * @param object $outfile      File
742
+     * @param object $message      Mapi Message Object
743
+     * @param object $signedAttach
744
+     * @param array  $smimeProps
745
+     */
746
+    public function encrypt(&$infile, &$outfile, &$message, &$signedAttach, $smimeProps) {
747
+        mapi_setprops($message, [PR_MESSAGE_CLASS => 'IPM.Note.SMIME']);
748
+        $smimeProps[PR_ATTACH_MIME_TAG] = "application/pkcs7-mime";
749
+        mapi_setprops($signedAttach, $smimeProps);
750
+
751
+        $publicCerts = $this->getPublicKeyForMessage($message);
752
+        // Always append our own certificate, so that the mail can be decrypted in 'Sent items'
753
+        // Prefer GAB public certificate above MAPI Store certificate.
754
+        $email = $GLOBALS['mapisession']->getSMTPAddress();
755
+        $user = $this->getGABUser($email);
756
+        $cert = $this->getGABCert($user);
757
+        if (empty($cert)) {
758
+            $cert = base64_decode($this->getPublicKey($email));
759
+        }
760
+
761
+        if (!empty($cert)) {
762
+            array_push($publicCerts, $cert);
763
+        }
764
+
765
+        $ok = openssl_pkcs7_encrypt($infile, $outfile, $publicCerts, [], 0, $this->cipher);
766
+        if (!$ok) {
767
+            error_log("[smime] unable to encrypt message, openssl error: " . print_r(@openssl_error_string(), true));
768
+            Log::Write(LOGLEVEL_ERROR, sprintf("[smime] unable to encrypt message, openssl error: '%s'", @openssl_error_string()));
769
+        }
770
+        $tmpEml = file_get_contents($outfile);
771
+
772
+        // Grab the base64 data, since MAPI requires it saved as decoded base64 string.
773
+        // FIXME: we can do better here
774
+        $matches = explode("\n\n", $tmpEml);
775
+        $base64 = str_replace("\n", "", $matches[1]);
776
+        file_put_contents($outfile, base64_decode($base64));
777
+
778
+        // Empty the body
779
+        mapi_setprops($message, [PR_BODY => ""]);
780
+    }
781
+
782
+    /**
783
+     * Function which fetches the public certificates for all recipients (TO/CC/BCC) of a message
784
+     * Always get the certificate of an address which expires last.
785
+     *
786
+     * @param object $message Mapi Message Object
787
+     *
788
+     * @return array of public certificates
789
+     */
790
+    public function getPublicKeyForMessage($message) {
791
+        $recipientTable = mapi_message_getrecipienttable($message);
792
+        $recips = mapi_table_queryallrows($recipientTable, [PR_SMTP_ADDRESS, PR_RECIPIENT_TYPE, PR_ADDRTYPE], [RES_OR, [
793
+            [RES_PROPERTY,
794
+                [
795
+                    RELOP => RELOP_EQ,
796
+                    ULPROPTAG => PR_RECIPIENT_TYPE,
797
+                    VALUE => MAPI_BCC,
798
+                ],
799
+            ],
800
+            [RES_PROPERTY,
801
+                [
802
+                    RELOP => RELOP_EQ,
803
+                    ULPROPTAG => PR_RECIPIENT_TYPE,
804
+                    VALUE => MAPI_CC,
805
+                ],
806
+            ],
807
+            [RES_PROPERTY,
808
+                [
809
+                    RELOP => RELOP_EQ,
810
+                    ULPROPTAG => PR_RECIPIENT_TYPE,
811
+                    VALUE => MAPI_TO,
812
+                ],
813
+            ],
814
+        ]]);
815
+
816
+        $publicCerts = [];
817
+        $storeCert = '';
818
+        $gabCert = '';
819
+
820
+        foreach ($recips as $recip) {
821
+            $emailAddr = $recip[PR_SMTP_ADDRESS];
822
+            $addrType = $recip[PR_ADDRTYPE];
823
+
824
+            if ($addrType === "ZARAFA" || $addrType === "EX") {
825
+                $user = $this->getGABUser($emailAddr);
826
+                $gabCert = $this->getGABCert($user);
827
+            }
828
+
829
+            $storeCert = $this->getPublicKey($emailAddr);
830
+
831
+            if (!empty($gabCert)) {
832
+                array_push($publicCerts, $gabCert);
833
+            }
834
+            elseif (!empty($storeCert)) {
835
+                array_push($publicCerts, base64_decode($storeCert));
836
+            }
837
+        }
838
+
839
+        return $publicCerts;
840
+    }
841
+
842
+    /**
843
+     * Retrieves the public certificates stored in the MAPI UserStore and belonging to the
844
+     * emailAdddress, returns "" if there is no certificate for that user.
845
+     *
846
+     * @param {String} emailAddress
847
+     * @param mixed $emailAddress
848
+     * @param mixed $multiple
849
+     *
850
+     * @return {String} $certificate
851
+     */
852
+    public function getPublicKey($emailAddress, $multiple = false) {
853
+        $certificates = [];
854
+
855
+        $certs = getMAPICert($this->getStore(), 'WebApp.Security.Public', $emailAddress);
856
+
857
+        if ($certs && count($certs) > 0) {
858
+            foreach ($certs as $cert) {
859
+                $pubkey = mapi_msgstore_openentry($this->getStore(), $cert[PR_ENTRYID]);
860
+                $certificate = "";
861
+                if ($pubkey != false) {
862
+                    // retrieve pkcs#11 certificate from body
863
+                    $stream = mapi_openproperty($pubkey, PR_BODY, IID_IStream, 0, 0);
864
+                    $stat = mapi_stream_stat($stream);
865
+                    mapi_stream_seek($stream, 0, STREAM_SEEK_SET);
866
+                    for ($i = 0; $i < $stat['cb']; $i += 1024) {
867
+                        $certificate .= mapi_stream_read($stream, 1024);
868
+                    }
869
+                    array_push($certificates, $certificate);
870
+                }
871
+            }
872
+        }
873
+
874
+        return $multiple ? $certificates : ($certificates[0] ?? '');
875
+    }
876
+
877
+    /**
878
+     * Function which is used to check if there is a public certificate for the provided emailAddress.
879
+     *
880
+     * @param {String} emailAddress emailAddres of recipient
881
+     * @param {Boolean} gabUser is the user of PR_ADDRTYPE == ZARAFA
882
+     * @param mixed $emailAddress
883
+     * @param mixed $gabUser
884
+     *
885
+     * @return {Boolean} true if public certificate exists
886
+     */
887
+    public function pubcertExists($emailAddress, $gabUser = false) {
888
+        if ($gabUser) {
889
+            $user = $this->getGABUser($emailAddress);
890
+            $gabCert = $this->getGABCert($user);
891
+            if ($user && !empty($gabCert)) {
892
+                return true;
893
+            }
894
+        }
895
+
896
+        $root = mapi_msgstore_openentry($this->getStore(), null);
897
+        $table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
898
+
899
+        // Restriction for public certificates which are from the recipient of the email, are active and have the correct message_class
900
+        $restrict = [RES_AND, [
901
+            [RES_PROPERTY,
902
+                [
903
+                    RELOP => RELOP_EQ,
904
+                    ULPROPTAG => PR_MESSAGE_CLASS,
905
+                    VALUE => [PR_MESSAGE_CLASS => "WebApp.Security.Public"],
906
+                ],
907
+            ],
908
+            [RES_PROPERTY,
909
+                [
910
+                    RELOP => RELOP_EQ,
911
+                    ULPROPTAG => PR_SUBJECT,
912
+                    VALUE => [PR_SUBJECT => $emailAddress],
913
+                ],
914
+            ],
915
+        ]];
916
+        mapi_table_restrict($table, $restrict, TBL_BATCH);
917
+        mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
918
+
919
+        $rows = mapi_table_queryallrows($table, [PR_SUBJECT, PR_ENTRYID, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME], $restrict);
920
+
921
+        return !empty($rows);
922
+    }
923
+
924
+    /**
925
+     * Helper functions which extracts the errors from openssl_error_string()
926
+     * Example error from openssl_error_string(): error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error
927
+     * Note that openssl_error_string() returns an error when verifying is successful, this is a bug in PHP https://bugs.php.net/bug.php?id=50713.
928
+     *
929
+     * @return {String}
930
+     */
931
+    public function extract_openssl_error() {
932
+        // TODO: should catch more errors by using while($error = @openssl_error_string())
933
+        $this->openssl_error = @openssl_error_string();
934
+        $openssl_error_code = 0;
935
+        if ($this->openssl_error) {
936
+            $openssl_error_list = explode(":", $this->openssl_error);
937
+            $openssl_error_code = $openssl_error_list[1];
938
+        }
939
+
940
+        return $openssl_error_code;
941
+    }
942
+
943
+    /**
944
+     * Extract the intermediate certificates from the signed email. Uses kopano_smime's
945
+     * two functions, to extract the PKCS#7 blob and then converts the PKCS#7 blob to
946
+     * X509 certificates using kopano_pkcs7_read.
947
+     *
948
+     * @param string $emlfile - the s/mime message
949
+     *
950
+     * @return array a list of extracted intermediate certificates
951
+     */
952
+    public function extractCAs($emlfile) {
953
+        $php72 = version_compare(phpversion(), "7.2.0") >= 0;
954
+        $phpcompat = function_exists('kopano_pkcs7_verify') && function_exists('kopano_pkcs7_read');
955
+        if (!$phpcompat && !$php72) {
956
+            return [];
957
+        }
958
+
959
+        $certfile = tempnam(sys_get_temp_dir(), true);
960
+        $outfile = tempnam(sys_get_temp_dir(), true);
961
+        $p7bfile = tempnam(sys_get_temp_dir(), true);
962
+
963
+        if ($php72) {
964
+            openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
965
+            openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
966
+        }
967
+        else {
968
+            kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
969
+            kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
970
+        }
971
+
972
+        $cas = [];
973
+        $p7b = file_get_contents($p7bfile);
974
+        if ($php72) {
975
+            openssl_pkcs7_read($p7b, $cas);
976
+        }
977
+        else {
978
+            // FIXME: Without the error_log, kopano_pkcs7_verify does not work (wtf).
979
+            error_log($p7b);
980
+            kopano_pkcs7_read($p7b, $cas);
981
+        }
982
+        unlink($certfile);
983
+        unlink($outfile);
984
+        unlink($p7bfile);
985
+
986
+        return $cas;
987
+    }
988
+
989
+    /**
990
+     * Imports certificate in the MAPI Root Associated Folder.
991
+     *
992
+     * Private key, always insert certificate
993
+     * Public key, check if we already have one stored
994
+     *
995
+     * @param string $cert     certificate body as a string
996
+     * @param mixed  $certData an array with the parsed certificate data
997
+     * @param string $type     certificate type, default 'public'
998
+     * @param bool   $force    force import the certificate even though we have one already stored in the MAPI Store.
999
+     *                         FIXME: remove $force in the future and move the check for newer certificate in this function.
1000
+     */
1001
+    public function importCertificate($cert, $certData, $type = 'public', $force = false) {
1002
+        $certEmail = getCertEmail($certData);
1003
+        if (!$this->pubcertExists($certEmail) || $force || $type === 'private') {
1004
+            $issued_by = "";
1005
+            foreach (array_keys($certData['issuer']) as $key) {
1006
+                $issued_by .= $key . '=' . $certData['issuer'][$key] . "\n";
1007
+            }
1008
+
1009
+            $root = mapi_msgstore_openentry($this->getStore(), null);
1010
+            $assocMessage = mapi_folder_createmessage($root, MAPI_ASSOCIATED);
1011
+            // TODO: write these properties down.
1012
+            mapi_setprops($assocMessage, [
1013
+                PR_SUBJECT => $certEmail,
1014
+                PR_MESSAGE_CLASS => $type == 'public' ? 'WebApp.Security.Public' : 'WebApp.Security.Private',
1015
+                PR_MESSAGE_DELIVERY_TIME => $certData['validTo_time_t'],
1016
+                PR_CLIENT_SUBMIT_TIME => $certData['validFrom_time_t'],
1017
+                PR_SENDER_NAME => $certData['serialNumber'], // serial
1018
+                PR_SENDER_EMAIL_ADDRESS => $issued_by, // Issuer To
1019
+                PR_SUBJECT_PREFIX => '',
1020
+                PR_RECEIVED_BY_NAME => $this->fingerprint_cert($cert, 'sha1'), // SHA1 Fingerprint
1021
+                PR_INTERNET_MESSAGE_ID => $this->fingerprint_cert($cert), // MD5 FingerPrint
1022
+            ]);
1023
+            // Save attachment
1024
+            $msgBody = base64_encode($cert);
1025
+            $stream = mapi_openproperty($assocMessage, PR_BODY, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY);
1026
+            mapi_stream_setsize($stream, strlen($msgBody));
1027
+            mapi_stream_write($stream, $msgBody);
1028
+            mapi_stream_commit($stream);
1029
+            mapi_message_savechanges($assocMessage);
1030
+        }
1031
+    }
1032
+
1033
+    /**
1034
+     * Function which returns the fingerprint (hash) of the certificate.
1035
+     *
1036
+     * @param {string} $cert certificate body as a string
1037
+     * @param {string} $hash optional hash algorithm
1038
+     * @param mixed $body
1039
+     */
1040
+    public function fingerprint_cert($body, $hash = 'md5') {
1041
+        // TODO: Note for PHP > 5.6 we can use openssl_x509_fingerprint
1042
+        $body = str_replace('-----BEGIN CERTIFICATE-----', '', $body);
1043
+        $body = str_replace('-----END CERTIFICATE-----', '', $body);
1044
+        $body = base64_decode($body);
1045
+
1046
+        if ($hash === 'sha1') {
1047
+            $fingerprint = sha1($body);
1048
+        }
1049
+        else {
1050
+            $fingerprint = md5($body);
1051
+        }
1052
+
1053
+        // Format 1000AB as 10:00:AB
1054
+        return strtoupper(implode(':', str_split($fingerprint, 2)));
1055
+    }
1056
+
1057
+    /**
1058
+     * Retrieve the GAB User.
1059
+     *
1060
+     * FIXME: ideally this would be a public function in grommunio Web.
1061
+     *
1062
+     * @param string $email the email address of the user
1063
+     *
1064
+     * @return mixed $user boolean if false else MAPIObject
1065
+     */
1066
+    public function getGABUser($email) {
1067
+        $addrbook = $GLOBALS["mapisession"]->getAddressbook();
1068
+        $userArr = [[PR_DISPLAY_NAME => $email]];
1069
+        $user = false;
1070
+
1071
+        try {
1072
+            $user = mapi_ab_resolvename($addrbook, $userArr, EMS_AB_ADDRESS_LOOKUP);
1073
+            $user = mapi_ab_openentry($addrbook, $user[0][PR_ENTRYID]);
1074
+        }
1075
+        catch (MAPIException $e) {
1076
+            $e->setHandled();
1077
+        }
1078
+
1079
+        return $user;
1080
+    }
1081
+
1082
+    /**
1083
+     * Retrieve the PR_EMS_AB_TAGGED_X509_CERT.
1084
+     *
1085
+     * @param MAPIObject $user the GAB user
1086
+     *
1087
+     * @return string $cert the certificate, empty if not found
1088
+     */
1089
+    public function getGABCert($user) {
1090
+        $cert = '';
1091
+        $userCertArray = mapi_getprops($user, [PR_EMS_AB_TAGGED_X509_CERT]);
1092
+        if (isset($userCertArray[PR_EMS_AB_TAGGED_X509_CERT])) {
1093
+            $cert = der2pem($userCertArray[PR_EMS_AB_TAGGED_X509_CERT][0]);
1094
+        }
1095
+
1096
+        return $cert;
1097
+    }
1098
+
1099
+    /**
1100
+     * Called when the core Settings class is initialized and ready to accept sysadmin default
1101
+     * settings. Registers the sysadmin defaults for the example plugin.
1102
+     *
1103
+     * @param {mixed} $data Reference to the data of the triggered hook
1104
+     */
1105
+    public function onBeforeSettingsInit(&$data) {
1106
+        $data['settingsObj']->addSysAdminDefaults([
1107
+            'zarafa' => [
1108
+                'v1' => [
1109
+                    'plugins' => [
1110
+                        'smime' => [
1111
+                            'enable' => defined('PLUGIN_SMIME_USER_DEFAULT_ENABLE_SMIME') && PLUGIN_SMIME_USER_DEFAULT_ENABLE_SMIME,
1112
+                            'passphrase_cache' => defined('PLUGIN_SMIME_PASSPHRASE_REMEMBER_BROWSER') && PLUGIN_SMIME_PASSPHRASE_REMEMBER_BROWSER,
1113
+                        ],
1114
+                    ],
1115
+                ],
1116
+            ],
1117
+        ]);
1118
+    }
1119
+
1120
+    /**
1121
+     * Get sender structure of the MAPI Message.
1122
+     *
1123
+     * @param mapimessage $mapiMessage MAPI Message resource from which we need to get the sender
1124
+     *
1125
+     * @return array with properties
1126
+     */
1127
+    public function getSenderAddress($mapiMessage) {
1128
+        if (!method_exists($GLOBALS['operations'], 'getSenderAddress')) {
1129
+            $messageProps = mapi_getprops($mapiMessage, [PR_SENT_REPRESENTING_ENTRYID, PR_SENDER_ENTRYID]);
1130
+            $senderEntryID = isset($messageProps[PR_SENT_REPRESENTING_ENTRYID]) ? $messageProps[PR_SENT_REPRESENTING_ENTRYID] : $messageProps[PR_SENDER_ENTRYID];
1131
+
1132
+            try {
1133
+                $senderUser = mapi_ab_openentry($GLOBALS["mapisession"]->getAddressbook(), $senderEntryID);
1134
+                if ($senderUser) {
1135
+                    $userprops = mapi_getprops($senderUser, [PR_ADDRTYPE, PR_DISPLAY_NAME, PR_EMAIL_ADDRESS, PR_SMTP_ADDRESS, PR_OBJECT_TYPE, PR_RECIPIENT_TYPE, PR_DISPLAY_TYPE, PR_DISPLAY_TYPE_EX, PR_ENTRYID]);
1136
+
1137
+                    $senderStructure = [];
1138
+                    $senderStructure["props"]['entryid'] = bin2hex($userprops[PR_ENTRYID]);
1139
+                    $senderStructure["props"]['display_name'] = isset($userprops[PR_DISPLAY_NAME]) ? $userprops[PR_DISPLAY_NAME] : '';
1140
+                    $senderStructure["props"]['email_address'] = isset($userprops[PR_EMAIL_ADDRESS]) ? $userprops[PR_EMAIL_ADDRESS] : '';
1141
+                    $senderStructure["props"]['smtp_address'] = isset($userprops[PR_SMTP_ADDRESS]) ? $userprops[PR_SMTP_ADDRESS] : '';
1142
+                    $senderStructure["props"]['address_type'] = isset($userprops[PR_ADDRTYPE]) ? $userprops[PR_ADDRTYPE] : '';
1143
+                    $senderStructure["props"]['object_type'] = $userprops[PR_OBJECT_TYPE];
1144
+                    $senderStructure["props"]['recipient_type'] = MAPI_TO;
1145
+                    $senderStructure["props"]['display_type'] = isset($userprops[PR_DISPLAY_TYPE]) ? $userprops[PR_DISPLAY_TYPE] : MAPI_MAILUSER;
1146
+                    $senderStructure["props"]['display_type_ex'] = isset($userprops[PR_DISPLAY_TYPE_EX]) ? $userprops[PR_DISPLAY_TYPE_EX] : MAPI_MAILUSER;
1147
+                }
1148
+            }
1149
+            catch (MAPIException $e) {
1150
+                Log::write(LOGLEVEL_ERROR, sprintf("%s %s", $e, $userProps[PR_SENT_REPRESENTING_NAME]));
1151
+            }
1152
+
1153
+            return $senderStructure;
1154
+        }
1155
+
1156
+        return $GLOBALS["operations"]->getSenderAddress($mapiMessage);
1157
+    }
1158 1158
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -454,7 +454,7 @@
 block discarded – undo
454 454
 		}
455 455
 
456 456
 		if (!encryptionStoreExpirationSupport()) {
457
-			withPHPSession(function () use ($encryptionStore) {
457
+			withPHPSession(function() use ($encryptionStore) {
458 458
 				$encryptionStore->add('smime', '');
459 459
 			});
460 460
 		}
Please login to merge, or discard this patch.
Braces   +24 added lines, -48 removed lines patch added patch discarded remove patch
@@ -64,8 +64,7 @@  discard block
 block discarded – undo
64 64
 
65 65
 		if (version_compare(phpversion(), '5.4', '<')) {
66 66
 			$this->cipher = OPENSSL_CIPHER_3DES;
67
-		}
68
-		else {
67
+		} else {
69 68
 			$this->cipher = PLUGIN_SMIME_CIPHER;
70 69
 		}
71 70
 	}
@@ -188,8 +187,7 @@  discard block
 block discarded – undo
188 187
 
189 188
 		if (array_filter($missingCerts, "missingMyself") === []) {
190 189
 			$errorMsg = _('Missing public certificates for the following recipients: ') . implode(', ', $missingCerts) . _('. Please contact your system administrator for details');
191
-		}
192
-		else {
190
+		} else {
193 191
 			$errorMsg = _("Your public certificate is not installed. Without this certificate, you will not be able to read encrypted messages you have sent to others.");
194 192
 		}
195 193
 
@@ -225,8 +223,7 @@  discard block
 block discarded – undo
225 223
 					// Put empty string into file? dafuq?
226 224
 					file_put_contents($tmpUserCert, $userCert);
227 225
 				}
228
-			}
229
-			catch (MAPIException $e) {
226
+			} catch (MAPIException $e) {
230 227
 				$msg = "[smime] Unable to open PR_SENT_REPRESENTING_ENTRYID. Maybe %s was does not exists or deleted from server.";
231 228
 				Log::write(LOGLEVEL_ERROR, sprintf($msg, $userProps[PR_SENT_REPRESENTING_NAME]));
232 229
 				error_log("[smime] Unable to open PR_SENT_REPRESENTING_NAME: " . print_r($userProps[PR_SENT_REPRESENTING_NAME], true));
@@ -242,8 +239,7 @@  discard block
 block discarded – undo
242 239
 			$senderAddressArray = $senderAddressArray['props'];
243 240
 			if ($senderAddressArray['address_type'] === 'SMTP') {
244 241
 				$emailAddr = $senderAddressArray['email_address'];
245
-			}
246
-			else {
242
+			} else {
247 243
 				$emailAddr = $senderAddressArray['smtp_address'];
248 244
 			}
249 245
 
@@ -253,8 +249,7 @@  discard block
 block discarded – undo
253 249
 			if (!$emailAddr) {
254 250
 				if (!empty($userProps[PR_SENT_REPRESENTING_NAME])) {
255 251
 					$emailAddr = $userProps[PR_SENT_REPRESENTING_NAME];
256
-				}
257
-				else {
252
+				} else {
258 253
 					$searchKeys = mapi_getprops($message, [PR_SEARCH_KEY, PR_SENT_REPRESENTING_SEARCH_KEY]);
259 254
 					$searchKey = $searchKeys[PR_SEARCH_KEY] ?? $searchKeys[PR_SENT_REPRESENTING_SEARCH_KEY];
260 255
 					if ($searchKey) {
@@ -307,16 +302,14 @@  discard block
 block discarded – undo
307 302
 						$importMessageCert !== false) {
308 303
 						// Redundant
309 304
 						$importMessageCert = true;
310
-					}
311
-					else {
305
+					} else {
312 306
 						$importMessageCert = false;
313 307
 						verifyOCSP($userCert, $caCerts, $this->message);
314 308
 						break;
315 309
 					}
316 310
 				}
317 311
 			}
318
-		}
319
-		else {
312
+		} else {
320 313
 			// Works. Just leave it.
321 314
 			$signed_ok = openssl_pkcs7_verify($tmpfname, PKCS7_NOSIGS, $outcert, explode(';', PLUGIN_SMIME_CACERTS));
322 315
 			$openssl_error_code = $this->extract_openssl_error();
@@ -333,8 +326,7 @@  discard block
 block discarded – undo
333 326
 				}
334 327
 				// We don't have a certificate from the MAPI UserStore or LDAP, so we will set $userCert to $importCert
335 328
 				// so that we can verify the message according to the be imported certificate.
336
-			}
337
-			else { // No pubkey
329
+			} else { // No pubkey
338 330
 				$importMessageCert = false;
339 331
 				Log::write(LOGLEVEL_INFO, sprintf("[smime] Unable to verify message without public key, openssl error: '%s'", $this->openssl_error));
340 332
 				$this->message['success'] = SMIME_STATUS_FAIL;
@@ -404,8 +396,7 @@  discard block
 block discarded – undo
404 396
 						break;
405 397
 					}
406 398
 				}
407
-			}
408
-			else {
399
+			} else {
409 400
 				$decryptStatus = openssl_pkcs7_decrypt($tmpFile, $tmpDecrypted, $certs['cert'], [$certs['pkey'], $pass]);
410 401
 			}
411 402
 
@@ -437,19 +428,16 @@  discard block
 block discarded – undo
437 428
 			if (strpos($content, 'multipart/signed') !== false || strpos($content, 'signed-data') !== false) {
438 429
 				$this->message['type'] = 'encryptsigned';
439 430
 				$this->verifyMessage($data['message'], $content);
440
-			}
441
-			elseif ($decryptStatus) {
431
+			} elseif ($decryptStatus) {
442 432
 				$this->message['info'] = SMIME_DECRYPT_SUCCESS;
443 433
 				$this->message['success'] = SMIME_STATUS_SUCCESS;
444
-			}
445
-			elseif ($this->extract_openssl_error() === OPENSSL_RECIPIENT_CERTIFICATE_MISMATCH) {
434
+			} elseif ($this->extract_openssl_error() === OPENSSL_RECIPIENT_CERTIFICATE_MISMATCH) {
446 435
 				error_log("[smime] Error when decrypting email, openssl error: " . print_r($this->openssl_error, true));
447 436
 				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when decrypting email, openssl error: '%s'", $this->openssl_error));
448 437
 				$this->message['info'] = SMIME_DECRYPT_CERT_MISMATCH;
449 438
 				$this->message['success'] = SMIME_STATUS_FAIL;
450 439
 			}
451
-		}
452
-		else {
440
+		} else {
453 441
 			$this->message['info'] = SMIME_UNLOCK_CERT;
454 442
 		}
455 443
 
@@ -482,18 +470,15 @@  discard block
 block discarded – undo
482 470
 			$this->message['info'] = SMIME_ERROR;
483 471
 			$this->message['success'] = SMIME_STATUS_FAIL;
484 472
 		// Verification was successful
485
-		}
486
-		elseif ($openssl_return) {
473
+		} elseif ($openssl_return) {
487 474
 			$this->message['info'] = SMIME_SUCCESS;
488 475
 			$this->message['success'] = SMIME_STATUS_SUCCESS;
489 476
 		// Verification was not successful, display extra information.
490
-		}
491
-		else {
477
+		} else {
492 478
 			$this->message['success'] = SMIME_STATUS_FAIL;
493 479
 			if ($openssl_errors === OPENSSL_CA_VERIFY_FAIL) {
494 480
 				$this->message['info'] = SMIME_CA;
495
-			}
496
-			else { // Catch general errors
481
+			} else { // Catch general errors
497 482
 				$this->message['info'] = SMIME_ERROR;
498 483
 			}
499 484
 		}
@@ -542,8 +527,7 @@  discard block
 block discarded – undo
542 527
 				// TODO: update to serialNumber check
543 528
 				if ($certMessage && $certMessage[0][PR_MESSAGE_DELIVERY_TIME] == $publickeyData['validTo_time_t']) {
544 529
 					$message = _('Certificate is already stored on the server');
545
-				}
546
-				else {
530
+				} else {
547 531
 					$saveCert = true;
548 532
 					$root = mapi_msgstore_openentry($this->getStore(), null);
549 533
 					// Remove old certificate
@@ -619,8 +603,7 @@  discard block
 block discarded – undo
619 603
 			if (isset($props[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $props) == MAPI_E_NOT_ENOUGH_MEMORY) {
620 604
 				// Stream the message to properly get the PR_EC_IMAP_EMAIL property
621 605
 				$emlMessageStream = mapi_openproperty($message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
622
-			}
623
-			else {
606
+			} else {
624 607
 				// Read the message as RFC822-formatted e-mail stream.
625 608
 				$emlMessageStream = mapi_inetmapi_imtoinet($GLOBALS['mapisession']->getSession(), $GLOBALS['mapisession']->getAddressbook(), $message, []);
626 609
 			}
@@ -725,8 +708,7 @@  discard block
 block discarded – undo
725 708
 				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message with intermediate certificates, openssl error: '%s'", @openssl_error_string()));
726 709
 			}
727 710
 			unlink($tmpFile);
728
-		}
729
-		else {
711
+		} else {
730 712
 			$ok = openssl_pkcs7_sign($infile, $outfile, $certs['cert'], [$certs['pkey'], ''], [], PKCS7_DETACHED);
731 713
 			if (!$ok) {
732 714
 				Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Unable to sign message, openssl error: '%s'", @openssl_error_string()));
@@ -830,8 +812,7 @@  discard block
 block discarded – undo
830 812
 
831 813
 			if (!empty($gabCert)) {
832 814
 				array_push($publicCerts, $gabCert);
833
-			}
834
-			elseif (!empty($storeCert)) {
815
+			} elseif (!empty($storeCert)) {
835 816
 				array_push($publicCerts, base64_decode($storeCert));
836 817
 			}
837 818
 		}
@@ -963,8 +944,7 @@  discard block
 block discarded – undo
963 944
 		if ($php72) {
964 945
 			openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
965 946
 			openssl_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
966
-		}
967
-		else {
947
+		} else {
968 948
 			kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile);
969 949
 			kopano_pkcs7_verify($emlfile, PKCS7_NOVERIFY, $certfile, [], $certfile, $outfile, $p7bfile);
970 950
 		}
@@ -973,8 +953,7 @@  discard block
 block discarded – undo
973 953
 		$p7b = file_get_contents($p7bfile);
974 954
 		if ($php72) {
975 955
 			openssl_pkcs7_read($p7b, $cas);
976
-		}
977
-		else {
956
+		} else {
978 957
 			// FIXME: Without the error_log, kopano_pkcs7_verify does not work (wtf).
979 958
 			error_log($p7b);
980 959
 			kopano_pkcs7_read($p7b, $cas);
@@ -1045,8 +1024,7 @@  discard block
 block discarded – undo
1045 1024
 
1046 1025
 		if ($hash === 'sha1') {
1047 1026
 			$fingerprint = sha1($body);
1048
-		}
1049
-		else {
1027
+		} else {
1050 1028
 			$fingerprint = md5($body);
1051 1029
 		}
1052 1030
 
@@ -1071,8 +1049,7 @@  discard block
 block discarded – undo
1071 1049
 		try {
1072 1050
 			$user = mapi_ab_resolvename($addrbook, $userArr, EMS_AB_ADDRESS_LOOKUP);
1073 1051
 			$user = mapi_ab_openentry($addrbook, $user[0][PR_ENTRYID]);
1074
-		}
1075
-		catch (MAPIException $e) {
1052
+		} catch (MAPIException $e) {
1076 1053
 			$e->setHandled();
1077 1054
 		}
1078 1055
 
@@ -1145,8 +1122,7 @@  discard block
 block discarded – undo
1145 1122
 					$senderStructure["props"]['display_type'] = isset($userprops[PR_DISPLAY_TYPE]) ? $userprops[PR_DISPLAY_TYPE] : MAPI_MAILUSER;
1146 1123
 					$senderStructure["props"]['display_type_ex'] = isset($userprops[PR_DISPLAY_TYPE_EX]) ? $userprops[PR_DISPLAY_TYPE_EX] : MAPI_MAILUSER;
1147 1124
 				}
1148
-			}
1149
-			catch (MAPIException $e) {
1125
+			} catch (MAPIException $e) {
1150 1126
 				Log::write(LOGLEVEL_ERROR, sprintf("%s %s", $e, $userProps[PR_SENT_REPRESENTING_NAME]));
1151 1127
 			}
1152 1128
 
Please login to merge, or discard this patch.
plugins/smime/php/class.certificate.php 2 patches
Indentation   +372 added lines, -372 removed lines patch added patch discarded remove patch
@@ -17,405 +17,405 @@
 block discarded – undo
17 17
 define('OCSP_CERT_STATUS_UNKOWN', 3);
18 18
 
19 19
 class OCSPException extends Exception {
20
-	private $status;
20
+    private $status;
21 21
 
22
-	public function setCertStatus($status) {
23
-		$this->status = $status;
24
-	}
22
+    public function setCertStatus($status) {
23
+        $this->status = $status;
24
+    }
25 25
 
26
-	public function getCertStatus() {
27
-		if (!$this->status) {
28
-			return;
29
-		}
26
+    public function getCertStatus() {
27
+        if (!$this->status) {
28
+            return;
29
+        }
30 30
 
31
-		if ($this->code !== OCSP_CERT_STATUS) {
32
-			return;
33
-		}
31
+        if ($this->code !== OCSP_CERT_STATUS) {
32
+            return;
33
+        }
34 34
 
35
-		switch ($this->status) {
36
-			case 'good':
37
-				return OCSP_CERT_STATUS_GOOD;
35
+        switch ($this->status) {
36
+            case 'good':
37
+                return OCSP_CERT_STATUS_GOOD;
38 38
 
39
-			case 'revoked':
40
-				return OCSP_CERT_STATUS_REVOKED;
39
+            case 'revoked':
40
+                return OCSP_CERT_STATUS_REVOKED;
41 41
 
42
-			default:
43
-				return OCSP_CERT_STATUS_UNKOWN;
44
-			}
45
-	}
42
+            default:
43
+                return OCSP_CERT_STATUS_UNKOWN;
44
+            }
45
+    }
46 46
 }
47 47
 
48 48
 function tempErrorHandler($errno, $errstr, $errfile, $errline) {
49
-	return true;
49
+    return true;
50 50
 }
51 51
 
52 52
 class Certificate {
53
-	private $cert;
54
-	private $data;
55
-
56
-	public function __construct($cert, $issuer = '') {
57
-		// XXX: error handling
58
-		$this->data = openssl_x509_parse($cert);
59
-		$this->cert = $cert;
60
-		$this->issuer = $issuer;
61
-	}
62
-
63
-	/**
64
-	 * The name of the certificate in DN notation.
65
-	 *
66
-	 * @return {string} the name of the certificate
67
-	 */
68
-	public function getName() {
69
-		return $this->data['name'];
70
-	}
71
-
72
-	/**
73
-	 * Issuer of the certificate.
74
-	 *
75
-	 * @return string The issuer of the certificate in DN notation
76
-	 */
77
-	public function getIssuerName() {
78
-		$issuer = '';
79
-		foreach ($this->data['issuer'] as $key => $value) {
80
-			$issuer .= "/{$key}={$value}";
81
-		}
82
-
83
-		return $issuer;
84
-	}
85
-
86
-	/**
87
-	 * Converts X509 DER format string to PEM format.
88
-	 *
89
-	 * @param {string} X509 Certificate in DER format
90
-	 * @param mixed $cert
91
-	 *
92
-	 * @return {string} X509 Certificate in PEM format
93
-	 */
94
-	protected function der2pem($cert) {
95
-		return "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($cert), 64, "\n") . "-----END CERTIFICATE-----\n";
96
-	}
97
-
98
-	/**
99
-	 * Converts X509 PEM format string to DER format.
100
-	 *
101
-	 * @param {string} X509 Certificate in PEM format
102
-	 * @param mixed $pem_data
103
-	 *
104
-	 * @return {string} X509 Certificate in DER format
105
-	 */
106
-	protected function pem2der($pem_data) {
107
-		$begin = "CERTIFICATE-----";
108
-		$end = "-----END";
109
-		$pem_data = substr($pem_data, strpos($pem_data, $begin) + strlen($begin));
110
-		$pem_data = substr($pem_data, 0, strpos($pem_data, $end));
111
-
112
-		return base64_decode($pem_data);
113
-	}
114
-
115
-	/**
116
-	 * The subject/emailAddress or subjectAltName.
117
-	 *
118
-	 * @return string The email address belonging to the certificate
119
-	 */
120
-	public function emailAddress() {
121
-		$certEmailAddress = "";
122
-		// If subject/emailAddress is not set, try subjectAltName
123
-		if (isset($this->data['subject']['emailAddress'])) {
124
-			$certEmailAddress = $this->data['subject']['emailAddress'];
125
-		}
126
-		elseif (isset($this->data['extensions'], $this->data['extensions']['subjectAltName'])
127
-			) {
128
-			// Example [subjectAltName] => email:[email protected]
129
-			$tmp = explode('email:', $this->data['extensions']['subjectAltName']);
130
-			// Only get the first match
131
-			if (isset($tmp[1]) && !empty($tmp[1])) {
132
-				$certEmailAddress = $tmp[1];
133
-			}
134
-		}
135
-
136
-		return $certEmailAddress;
137
-	}
138
-
139
-	/**
140
-	 * Return the certificate in DER format.
141
-	 *
142
-	 * @return string certificate in DER format
143
-	 */
144
-	public function der() {
145
-		return $this->pem2der($this->cert);
146
-	}
147
-
148
-	/**
149
-	 * Return the certificate in PEM format.
150
-	 *
151
-	 * @return string certificate in PEM format
152
-	 */
153
-	public function pem() {
154
-		return $this->cert;
155
-	}
156
-
157
-	/**
158
-	 * The beginning of the valid period of the certificate.
159
-	 *
160
-	 * @return int timestamp from which the certificate is valid
161
-	 */
162
-	public function validFrom() {
163
-		return $this->data['validFrom_time_t'];
164
-	}
165
-
166
-	/**
167
-	 * The end of the valid period of the certificate.
168
-	 *
169
-	 * @return int timestamp from which the certificate is invalid
170
-	 */
171
-	public function validTo() {
172
-		return $this->data['validTo_time_t'];
173
-	}
174
-
175
-	/**
176
-	 * Determines if the certificate is valid.
177
-	 *
178
-	 * @return bool the valid status
179
-	 */
180
-	public function valid() {
181
-		$time = time();
182
-
183
-		return $time > $this->validFrom() && $time < $this->validTo();
184
-	}
185
-
186
-	/**
187
-	 * The caURL of the certififcate.
188
-	 *
189
-	 * @return string return an empty string or the CA URL
190
-	 */
191
-	public function caURL() {
192
-		$authorityInfoAccess = $this->authorityInfoAccess();
193
-		if (preg_match("/CA Issuers - URI:(.*)/", $authorityInfoAccess, $matches)) {
194
-			return array_pop($matches);
195
-		}
196
-
197
-		return '';
198
-	}
199
-
200
-	/**
201
-	 * The OCSP URL of the certificate.
202
-	 *
203
-	 * @return string return an empty string or the OCSP URL
204
-	 */
205
-	public function ocspURL() {
206
-		$authorityInfoAccess = $this->authorityInfoAccess();
207
-		if (preg_match("/OCSP - URI:(.*)/", $authorityInfoAccess, $matches)) {
208
-			return array_pop($matches);
209
-		}
210
-
211
-		return '';
212
-	}
213
-
214
-	/**
215
-	 * Internal helper to obtain the authorityInfoAccess information.
216
-	 *
217
-	 * @return string authorityInfoAccess if set
218
-	 */
219
-	protected function authorityInfoAccess() {
220
-		if (!isset($this->data['extensions'])) {
221
-			return '';
222
-		}
223
-
224
-		if (!isset($this->data['extensions']['authorityInfoAccess'])) {
225
-			return '';
226
-		}
227
-
228
-		return $this->data['extensions']['authorityInfoAccess'];
229
-	}
230
-
231
-	/**
232
-	 * The fingerprint (hash) of the certificate body.
233
-	 *
234
-	 * @param string hash_algorithm either sha1 or md5
235
-	 * @param mixed $hash_algorithm
236
-	 *
237
-	 * @return string the hash of the certificate's body
238
-	 */
239
-	public function fingerprint($hash_algorithm = "md5") {
240
-		$body = str_replace('-----BEGIN CERTIFICATE-----', '', $this->cert);
241
-		$body = str_replace('-----END CERTIFICATE-----', '', $body);
242
-		$body = base64_decode($body);
243
-		if ($hash_algorithm === 'sha1') {
244
-			$fingerprint = sha1($body);
245
-		}
246
-		else {
247
-			$fingerprint = md5($body);
248
-		}
249
-		// Format 1000AB as 10:00:AB
250
-		return strtoupper(implode(':', str_split($fingerprint, 2)));
251
-	}
252
-
253
-	/**
254
-	 * The issuer of this certificate.
255
-	 *
256
-	 * @return Certificate the issuer certificate
257
-	 */
258
-	public function issuer() {
259
-		if (!empty($this->issuer)) {
260
-			return $this->issuer;
261
-		}
262
-		$cert = '';
263
-		$ch = curl_init();
264
-		curl_setopt($ch, CURLOPT_URL, $this->caURL());
265
-		curl_setopt($ch, CURLOPT_FAILONERROR, true);
266
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
267
-
268
-		// HTTP Proxy settings
269
-		if (defined('PLUGIN_SMIME_PROXY') && PLUGIN_SMIME_PROXY != '') {
270
-			curl_setopt($ch, CURLOPT_PROXY, PLUGIN_SMIME_PROXY);
271
-		}
272
-		if (defined('PLUGIN_SMIME_PROXY_PORT') && PLUGIN_SMIME_PROXY_PORT != '') {
273
-			curl_setopt($ch, CURLOPT_PROXYPORT, PLUGIN_SMIME_PROXY_PORT);
274
-		}
275
-		if (defined('PLUGIN_SMIME_PROXY_USERPWD') && PLUGIN_SMIME_PROXY_USERPWD != '') {
276
-			curl_setopt($ch, CURLOPT_PROXYUSERPWD, PLUGIN_SMIME_PROXY_USERPWD);
277
-		}
278
-
279
-		$output = curl_exec($ch);
280
-		$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
281
-		$curl_error = curl_error($ch);
282
-		if (!$curl_error && $http_status === 200) {
283
-			$cert = $this->der2pem($output);
284
-		}
285
-		else {
286
-			Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when downloading internmediate certificate '%s', http status: '%s'", $curl_error, $http_status));
287
-		}
288
-		curl_close($ch);
289
-
290
-		return new Certificate($cert);
291
-	}
292
-
293
-	/**
294
-	 * Set the issuer of a certificate.
295
-	 *
296
-	 * @param string the issuer certificate
297
-	 * @param mixed $issuer
298
-	 */
299
-	public function setIssuer($issuer) {
300
-		if (is_object($issuer)) {
301
-			$this->issuer = $issuer;
302
-		}
303
-	}
304
-
305
-	/**
306
-	 * Verify the certificate status using OCSP.
307
-	 *
308
-	 * @return bool verification succeeded or failed
309
-	 */
310
-	public function verify() {
311
-		$message = [];
312
-
313
-		if (!$this->valid()) {
314
-			throw new OCSPException('Certificate expired', OCSP_CERT_EXPIRED);
315
-		}
316
-
317
-		$issuer = $this->issuer();
318
-		if (!is_object($issuer)) {
319
-			throw new OCSPException('No issuer', OCSP_NO_ISSUER);
320
-		}
321
-
322
-		/* Set custom error handler since the nemid ocsp library uses
53
+    private $cert;
54
+    private $data;
55
+
56
+    public function __construct($cert, $issuer = '') {
57
+        // XXX: error handling
58
+        $this->data = openssl_x509_parse($cert);
59
+        $this->cert = $cert;
60
+        $this->issuer = $issuer;
61
+    }
62
+
63
+    /**
64
+     * The name of the certificate in DN notation.
65
+     *
66
+     * @return {string} the name of the certificate
67
+     */
68
+    public function getName() {
69
+        return $this->data['name'];
70
+    }
71
+
72
+    /**
73
+     * Issuer of the certificate.
74
+     *
75
+     * @return string The issuer of the certificate in DN notation
76
+     */
77
+    public function getIssuerName() {
78
+        $issuer = '';
79
+        foreach ($this->data['issuer'] as $key => $value) {
80
+            $issuer .= "/{$key}={$value}";
81
+        }
82
+
83
+        return $issuer;
84
+    }
85
+
86
+    /**
87
+     * Converts X509 DER format string to PEM format.
88
+     *
89
+     * @param {string} X509 Certificate in DER format
90
+     * @param mixed $cert
91
+     *
92
+     * @return {string} X509 Certificate in PEM format
93
+     */
94
+    protected function der2pem($cert) {
95
+        return "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($cert), 64, "\n") . "-----END CERTIFICATE-----\n";
96
+    }
97
+
98
+    /**
99
+     * Converts X509 PEM format string to DER format.
100
+     *
101
+     * @param {string} X509 Certificate in PEM format
102
+     * @param mixed $pem_data
103
+     *
104
+     * @return {string} X509 Certificate in DER format
105
+     */
106
+    protected function pem2der($pem_data) {
107
+        $begin = "CERTIFICATE-----";
108
+        $end = "-----END";
109
+        $pem_data = substr($pem_data, strpos($pem_data, $begin) + strlen($begin));
110
+        $pem_data = substr($pem_data, 0, strpos($pem_data, $end));
111
+
112
+        return base64_decode($pem_data);
113
+    }
114
+
115
+    /**
116
+     * The subject/emailAddress or subjectAltName.
117
+     *
118
+     * @return string The email address belonging to the certificate
119
+     */
120
+    public function emailAddress() {
121
+        $certEmailAddress = "";
122
+        // If subject/emailAddress is not set, try subjectAltName
123
+        if (isset($this->data['subject']['emailAddress'])) {
124
+            $certEmailAddress = $this->data['subject']['emailAddress'];
125
+        }
126
+        elseif (isset($this->data['extensions'], $this->data['extensions']['subjectAltName'])
127
+            ) {
128
+            // Example [subjectAltName] => email:[email protected]
129
+            $tmp = explode('email:', $this->data['extensions']['subjectAltName']);
130
+            // Only get the first match
131
+            if (isset($tmp[1]) && !empty($tmp[1])) {
132
+                $certEmailAddress = $tmp[1];
133
+            }
134
+        }
135
+
136
+        return $certEmailAddress;
137
+    }
138
+
139
+    /**
140
+     * Return the certificate in DER format.
141
+     *
142
+     * @return string certificate in DER format
143
+     */
144
+    public function der() {
145
+        return $this->pem2der($this->cert);
146
+    }
147
+
148
+    /**
149
+     * Return the certificate in PEM format.
150
+     *
151
+     * @return string certificate in PEM format
152
+     */
153
+    public function pem() {
154
+        return $this->cert;
155
+    }
156
+
157
+    /**
158
+     * The beginning of the valid period of the certificate.
159
+     *
160
+     * @return int timestamp from which the certificate is valid
161
+     */
162
+    public function validFrom() {
163
+        return $this->data['validFrom_time_t'];
164
+    }
165
+
166
+    /**
167
+     * The end of the valid period of the certificate.
168
+     *
169
+     * @return int timestamp from which the certificate is invalid
170
+     */
171
+    public function validTo() {
172
+        return $this->data['validTo_time_t'];
173
+    }
174
+
175
+    /**
176
+     * Determines if the certificate is valid.
177
+     *
178
+     * @return bool the valid status
179
+     */
180
+    public function valid() {
181
+        $time = time();
182
+
183
+        return $time > $this->validFrom() && $time < $this->validTo();
184
+    }
185
+
186
+    /**
187
+     * The caURL of the certififcate.
188
+     *
189
+     * @return string return an empty string or the CA URL
190
+     */
191
+    public function caURL() {
192
+        $authorityInfoAccess = $this->authorityInfoAccess();
193
+        if (preg_match("/CA Issuers - URI:(.*)/", $authorityInfoAccess, $matches)) {
194
+            return array_pop($matches);
195
+        }
196
+
197
+        return '';
198
+    }
199
+
200
+    /**
201
+     * The OCSP URL of the certificate.
202
+     *
203
+     * @return string return an empty string or the OCSP URL
204
+     */
205
+    public function ocspURL() {
206
+        $authorityInfoAccess = $this->authorityInfoAccess();
207
+        if (preg_match("/OCSP - URI:(.*)/", $authorityInfoAccess, $matches)) {
208
+            return array_pop($matches);
209
+        }
210
+
211
+        return '';
212
+    }
213
+
214
+    /**
215
+     * Internal helper to obtain the authorityInfoAccess information.
216
+     *
217
+     * @return string authorityInfoAccess if set
218
+     */
219
+    protected function authorityInfoAccess() {
220
+        if (!isset($this->data['extensions'])) {
221
+            return '';
222
+        }
223
+
224
+        if (!isset($this->data['extensions']['authorityInfoAccess'])) {
225
+            return '';
226
+        }
227
+
228
+        return $this->data['extensions']['authorityInfoAccess'];
229
+    }
230
+
231
+    /**
232
+     * The fingerprint (hash) of the certificate body.
233
+     *
234
+     * @param string hash_algorithm either sha1 or md5
235
+     * @param mixed $hash_algorithm
236
+     *
237
+     * @return string the hash of the certificate's body
238
+     */
239
+    public function fingerprint($hash_algorithm = "md5") {
240
+        $body = str_replace('-----BEGIN CERTIFICATE-----', '', $this->cert);
241
+        $body = str_replace('-----END CERTIFICATE-----', '', $body);
242
+        $body = base64_decode($body);
243
+        if ($hash_algorithm === 'sha1') {
244
+            $fingerprint = sha1($body);
245
+        }
246
+        else {
247
+            $fingerprint = md5($body);
248
+        }
249
+        // Format 1000AB as 10:00:AB
250
+        return strtoupper(implode(':', str_split($fingerprint, 2)));
251
+    }
252
+
253
+    /**
254
+     * The issuer of this certificate.
255
+     *
256
+     * @return Certificate the issuer certificate
257
+     */
258
+    public function issuer() {
259
+        if (!empty($this->issuer)) {
260
+            return $this->issuer;
261
+        }
262
+        $cert = '';
263
+        $ch = curl_init();
264
+        curl_setopt($ch, CURLOPT_URL, $this->caURL());
265
+        curl_setopt($ch, CURLOPT_FAILONERROR, true);
266
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
267
+
268
+        // HTTP Proxy settings
269
+        if (defined('PLUGIN_SMIME_PROXY') && PLUGIN_SMIME_PROXY != '') {
270
+            curl_setopt($ch, CURLOPT_PROXY, PLUGIN_SMIME_PROXY);
271
+        }
272
+        if (defined('PLUGIN_SMIME_PROXY_PORT') && PLUGIN_SMIME_PROXY_PORT != '') {
273
+            curl_setopt($ch, CURLOPT_PROXYPORT, PLUGIN_SMIME_PROXY_PORT);
274
+        }
275
+        if (defined('PLUGIN_SMIME_PROXY_USERPWD') && PLUGIN_SMIME_PROXY_USERPWD != '') {
276
+            curl_setopt($ch, CURLOPT_PROXYUSERPWD, PLUGIN_SMIME_PROXY_USERPWD);
277
+        }
278
+
279
+        $output = curl_exec($ch);
280
+        $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
281
+        $curl_error = curl_error($ch);
282
+        if (!$curl_error && $http_status === 200) {
283
+            $cert = $this->der2pem($output);
284
+        }
285
+        else {
286
+            Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when downloading internmediate certificate '%s', http status: '%s'", $curl_error, $http_status));
287
+        }
288
+        curl_close($ch);
289
+
290
+        return new Certificate($cert);
291
+    }
292
+
293
+    /**
294
+     * Set the issuer of a certificate.
295
+     *
296
+     * @param string the issuer certificate
297
+     * @param mixed $issuer
298
+     */
299
+    public function setIssuer($issuer) {
300
+        if (is_object($issuer)) {
301
+            $this->issuer = $issuer;
302
+        }
303
+    }
304
+
305
+    /**
306
+     * Verify the certificate status using OCSP.
307
+     *
308
+     * @return bool verification succeeded or failed
309
+     */
310
+    public function verify() {
311
+        $message = [];
312
+
313
+        if (!$this->valid()) {
314
+            throw new OCSPException('Certificate expired', OCSP_CERT_EXPIRED);
315
+        }
316
+
317
+        $issuer = $this->issuer();
318
+        if (!is_object($issuer)) {
319
+            throw new OCSPException('No issuer', OCSP_NO_ISSUER);
320
+        }
321
+
322
+        /* Set custom error handler since the nemid ocsp library uses
323 323
 		 * trigger_error() to throw errors when it cannot parse certain
324 324
 		 * x509 fields which are not required for the OCSP Request.
325 325
 		 * Also when receiving the OCSP request, the OCSP library
326 326
 		 * triggers errors when the request does not adhere to the
327 327
 		 * standard.
328 328
 		 */
329
-		set_error_handler("tempErrorHandler");
330
-
331
-		$x509 = new \WAYF\X509();
332
-		$issuer = $x509->certificate($issuer->der());
333
-		$certificate = $x509->certificate($this->der());
334
-
335
-		$ocspclient = new \WAYF\OCSP();
336
-		$certID = $ocspclient->certOcspID(
337
-			[
338
-				'issuerName' => $issuer['tbsCertificate']['subject_der'],
339
-				// remember to skip the first byte it is the number of
340
-				// unused bits and it is always 0 for keys and certificates
341
-				'issuerKey' => substr($issuer['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], 1),
342
-				'serialNumber_der' => $certificate['tbsCertificate']['serialNumber_der'],
343
-			],
344
-			'sha1'
345
-		);
346
-
347
-		$ocspreq = $ocspclient->request([$certID]);
348
-
349
-		$stream_options = [
350
-			'http' => [
351
-				'ignore_errors' => false,
352
-				'method' => 'POST',
353
-				'header' => 'Content-type: application/ocsp-request' . "\r\n",
354
-				'content' => $ocspreq,
355
-				'timeout' => 1,
356
-			],
357
-		];
358
-
359
-		// Do the OCSP request
360
-		$context = stream_context_create($stream_options);
361
-		$derresponse = file_get_contents($this->ocspURL(), null, $context);
362
-		// OCSP service not available, import certificate, but show a warning.
363
-		if ($derresponse === false) {
364
-			throw new OCSPException('No response', OCSP_NO_RESPONSE);
365
-		}
366
-		$ocspresponse = $ocspclient->response($derresponse);
367
-
368
-		// Restore the previous error handler
369
-		restore_error_handler();
370
-
371
-		// responseStatuses: successful, malformedRequest,
372
-		// internalError, tryLater, sigRequired, unauthorized.
373
-		if (isset($ocspresponse['responseStatus']) &&
374
-			$ocspresponse['responseStatus'] !== 'successful') {
375
-			throw new OCSPException('Response status' . $ocspresponse['responseStatus'], OCSP_RESPONSE_STATUS);
376
-		}
377
-
378
-		$resp = $ocspresponse['responseBytes']['BasicOCSPResponse']['tbsResponseData']['responses'][0];
379
-		/*
329
+        set_error_handler("tempErrorHandler");
330
+
331
+        $x509 = new \WAYF\X509();
332
+        $issuer = $x509->certificate($issuer->der());
333
+        $certificate = $x509->certificate($this->der());
334
+
335
+        $ocspclient = new \WAYF\OCSP();
336
+        $certID = $ocspclient->certOcspID(
337
+            [
338
+                'issuerName' => $issuer['tbsCertificate']['subject_der'],
339
+                // remember to skip the first byte it is the number of
340
+                // unused bits and it is always 0 for keys and certificates
341
+                'issuerKey' => substr($issuer['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], 1),
342
+                'serialNumber_der' => $certificate['tbsCertificate']['serialNumber_der'],
343
+            ],
344
+            'sha1'
345
+        );
346
+
347
+        $ocspreq = $ocspclient->request([$certID]);
348
+
349
+        $stream_options = [
350
+            'http' => [
351
+                'ignore_errors' => false,
352
+                'method' => 'POST',
353
+                'header' => 'Content-type: application/ocsp-request' . "\r\n",
354
+                'content' => $ocspreq,
355
+                'timeout' => 1,
356
+            ],
357
+        ];
358
+
359
+        // Do the OCSP request
360
+        $context = stream_context_create($stream_options);
361
+        $derresponse = file_get_contents($this->ocspURL(), null, $context);
362
+        // OCSP service not available, import certificate, but show a warning.
363
+        if ($derresponse === false) {
364
+            throw new OCSPException('No response', OCSP_NO_RESPONSE);
365
+        }
366
+        $ocspresponse = $ocspclient->response($derresponse);
367
+
368
+        // Restore the previous error handler
369
+        restore_error_handler();
370
+
371
+        // responseStatuses: successful, malformedRequest,
372
+        // internalError, tryLater, sigRequired, unauthorized.
373
+        if (isset($ocspresponse['responseStatus']) &&
374
+            $ocspresponse['responseStatus'] !== 'successful') {
375
+            throw new OCSPException('Response status' . $ocspresponse['responseStatus'], OCSP_RESPONSE_STATUS);
376
+        }
377
+
378
+        $resp = $ocspresponse['responseBytes']['BasicOCSPResponse']['tbsResponseData']['responses'][0];
379
+        /*
380 380
 		 * OCSP response status, possible values are: good, revoked,
381 381
 		 * unknown according to the RFC
382 382
 		 * https://www.ietf.org/rfc/rfc2560.txt
383 383
 		 */
384
-		if ($resp['certStatus'] !== 'good') {
385
-			// Certificate status is not good, revoked or unknown
386
-			$exception = new OCSPException('Certificate status ' . $resp['certStatus'], OCSP_CERT_STATUS);
387
-			$exception->setCertStatus($resp['certStatus']);
384
+        if ($resp['certStatus'] !== 'good') {
385
+            // Certificate status is not good, revoked or unknown
386
+            $exception = new OCSPException('Certificate status ' . $resp['certStatus'], OCSP_CERT_STATUS);
387
+            $exception->setCertStatus($resp['certStatus']);
388 388
 
389
-			throw $exception;
390
-		}
389
+            throw $exception;
390
+        }
391 391
 
392
-		/* Check if:
392
+        /* Check if:
393 393
 		 * - hash algorithm is equal
394 394
 		 * - check if issuerNamehash is the same from response
395 395
 		 * - check if issuerKeyHash is the same from response
396 396
 		 * - check if serialNumber is the same from response
397 397
 		 */
398
-		if ($resp['certID']['hashAlgorithm'] !== 'sha1' &&
399
-			$resp['certID']['issuerNameHash'] !== $certID['issuerNameHash'] &&
400
-			$resp['certID']['issuerKeyHash'] !== $certID['issuerKeyHash'] &&
401
-			$resp['certID']['serialNumber'] !== $certID['serialNumber']) {
402
-			// OCSP Revocation, mismatch between original and checked certificate
403
-			throw new OCSPException('Certificate mismatch', OCSP_CERT_MISMATCH);
404
-		}
405
-
406
-		// check if OCSP revocation update is recent
407
-		$now = new DateTime(gmdate('YmdHis\Z'));
408
-		$thisUpdate = new DateTime($resp['thisUpdate']);
409
-
410
-		// Check if update time is earlier then our own time
411
-		if (!isset($resp['nextupdate']) && $thisUpdate > $now) {
412
-			throw new OCSPException('Update time earlier then our own time', OCSP_RESPONSE_TIME_EARLY);
413
-		}
414
-
415
-		// Current time should be between thisUpdate and nextUpdate.
416
-		if ($thisUpdate > $now && $now > new DateTime($resp['nextUpdate'])) {
417
-			// OCSP Revocation status not current
418
-			throw new OCSPException('Current time not between thisUpdate and nextUpdate', OCSP_RESPONSE_TIME_INVALID);
419
-		}
420
-	}
398
+        if ($resp['certID']['hashAlgorithm'] !== 'sha1' &&
399
+            $resp['certID']['issuerNameHash'] !== $certID['issuerNameHash'] &&
400
+            $resp['certID']['issuerKeyHash'] !== $certID['issuerKeyHash'] &&
401
+            $resp['certID']['serialNumber'] !== $certID['serialNumber']) {
402
+            // OCSP Revocation, mismatch between original and checked certificate
403
+            throw new OCSPException('Certificate mismatch', OCSP_CERT_MISMATCH);
404
+        }
405
+
406
+        // check if OCSP revocation update is recent
407
+        $now = new DateTime(gmdate('YmdHis\Z'));
408
+        $thisUpdate = new DateTime($resp['thisUpdate']);
409
+
410
+        // Check if update time is earlier then our own time
411
+        if (!isset($resp['nextupdate']) && $thisUpdate > $now) {
412
+            throw new OCSPException('Update time earlier then our own time', OCSP_RESPONSE_TIME_EARLY);
413
+        }
414
+
415
+        // Current time should be between thisUpdate and nextUpdate.
416
+        if ($thisUpdate > $now && $now > new DateTime($resp['nextUpdate'])) {
417
+            // OCSP Revocation status not current
418
+            throw new OCSPException('Current time not between thisUpdate and nextUpdate', OCSP_RESPONSE_TIME_INVALID);
419
+        }
420
+    }
421 421
 }
Please login to merge, or discard this patch.
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -122,8 +122,7 @@  discard block
 block discarded – undo
122 122
 		// If subject/emailAddress is not set, try subjectAltName
123 123
 		if (isset($this->data['subject']['emailAddress'])) {
124 124
 			$certEmailAddress = $this->data['subject']['emailAddress'];
125
-		}
126
-		elseif (isset($this->data['extensions'], $this->data['extensions']['subjectAltName'])
125
+		} elseif (isset($this->data['extensions'], $this->data['extensions']['subjectAltName'])
127 126
 			) {
128 127
 			// Example [subjectAltName] => email:[email protected]
129 128
 			$tmp = explode('email:', $this->data['extensions']['subjectAltName']);
@@ -242,8 +241,7 @@  discard block
 block discarded – undo
242 241
 		$body = base64_decode($body);
243 242
 		if ($hash_algorithm === 'sha1') {
244 243
 			$fingerprint = sha1($body);
245
-		}
246
-		else {
244
+		} else {
247 245
 			$fingerprint = md5($body);
248 246
 		}
249 247
 		// Format 1000AB as 10:00:AB
@@ -281,8 +279,7 @@  discard block
 block discarded – undo
281 279
 		$curl_error = curl_error($ch);
282 280
 		if (!$curl_error && $http_status === 200) {
283 281
 			$cert = $this->der2pem($output);
284
-		}
285
-		else {
282
+		} else {
286 283
 			Log::Write(LOGLEVEL_ERROR, sprintf("[smime] Error when downloading internmediate certificate '%s', http status: '%s'", $curl_error, $http_status));
287 284
 		}
288 285
 		curl_close($ch);
Please login to merge, or discard this patch.
plugins/smime/php/util.php 2 patches
Indentation   +173 added lines, -173 removed lines patch added patch discarded remove patch
@@ -13,21 +13,21 @@  discard block
 block discarded – undo
13 13
  * @param {Mixed} $certificate certificate data
14 14
  */
15 15
 function getCertEmail($certificate) {
16
-	$certEmailAddress = "";
17
-	// If subject/emailAddress is not set, try subjectAltName
18
-	if (isset($certificate['subject']['emailAddress'])) {
19
-		$certEmailAddress = $certificate['subject']['emailAddress'];
20
-	}
21
-	elseif (isset($certificate['extensions'], $certificate['extensions']['subjectAltName'])) {
22
-		// Example [subjectAltName] => email:[email protected]
23
-		$tmp = explode('email:', $certificate['extensions']['subjectAltName']);
24
-		// Only get the first match
25
-		if (isset($tmp[1]) && !empty($tmp[1])) {
26
-			$certEmailAddress = $tmp[1];
27
-		}
28
-	}
29
-
30
-	return $certEmailAddress;
16
+    $certEmailAddress = "";
17
+    // If subject/emailAddress is not set, try subjectAltName
18
+    if (isset($certificate['subject']['emailAddress'])) {
19
+        $certEmailAddress = $certificate['subject']['emailAddress'];
20
+    }
21
+    elseif (isset($certificate['extensions'], $certificate['extensions']['subjectAltName'])) {
22
+        // Example [subjectAltName] => email:[email protected]
23
+        $tmp = explode('email:', $certificate['extensions']['subjectAltName']);
24
+        // Only get the first match
25
+        if (isset($tmp[1]) && !empty($tmp[1])) {
26
+            $certEmailAddress = $tmp[1];
27
+        }
28
+    }
29
+
30
+    return $certEmailAddress;
31 31
 }
32 32
 
33 33
 /**
@@ -40,40 +40,40 @@  discard block
 block discarded – undo
40 40
  * @return {MAPIObject} the mapi message containing the private certificate, returns false if no certificate is found
41 41
  */
42 42
 function getMAPICert($store, $type = 'WebApp.Security.Private', $emailAddress = '') {
43
-	$root = mapi_msgstore_openentry($store, null);
44
-	$table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
45
-
46
-	$restrict = [RES_PROPERTY,
47
-		[
48
-			RELOP => RELOP_EQ,
49
-			ULPROPTAG => PR_MESSAGE_CLASS,
50
-			VALUE => [PR_MESSAGE_CLASS => $type],
51
-		],
52
-	];
53
-	if ($type == 'WebApp.Security.Public' && !empty($emailAddress)) {
54
-		$restrict = [RES_AND, [
55
-			$restrict,
56
-			[RES_CONTENT,
57
-				[
58
-					FUZZYLEVEL => FL_FULLSTRING | FL_IGNORECASE,
59
-					ULPROPTAG => PR_SUBJECT,
60
-					VALUE => [PR_SUBJECT => $emailAddress],
61
-				],
62
-			],
63
-		]];
64
-	}
65
-
66
-	// PR_MESSAGE_DELIVERY_TIME validTo / PR_CLIENT_SUBMIT_TIME validFrom
67
-	mapi_table_restrict($table, $restrict, TBL_BATCH);
68
-	mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
69
-
70
-	$privateCerts = mapi_table_queryallrows($table, [PR_ENTRYID, PR_SUBJECT, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME], $restrict);
71
-
72
-	if ($privateCerts && count($privateCerts) > 0) {
73
-		return $privateCerts;
74
-	}
75
-
76
-	return false;
43
+    $root = mapi_msgstore_openentry($store, null);
44
+    $table = mapi_folder_getcontentstable($root, MAPI_ASSOCIATED);
45
+
46
+    $restrict = [RES_PROPERTY,
47
+        [
48
+            RELOP => RELOP_EQ,
49
+            ULPROPTAG => PR_MESSAGE_CLASS,
50
+            VALUE => [PR_MESSAGE_CLASS => $type],
51
+        ],
52
+    ];
53
+    if ($type == 'WebApp.Security.Public' && !empty($emailAddress)) {
54
+        $restrict = [RES_AND, [
55
+            $restrict,
56
+            [RES_CONTENT,
57
+                [
58
+                    FUZZYLEVEL => FL_FULLSTRING | FL_IGNORECASE,
59
+                    ULPROPTAG => PR_SUBJECT,
60
+                    VALUE => [PR_SUBJECT => $emailAddress],
61
+                ],
62
+            ],
63
+        ]];
64
+    }
65
+
66
+    // PR_MESSAGE_DELIVERY_TIME validTo / PR_CLIENT_SUBMIT_TIME validFrom
67
+    mapi_table_restrict($table, $restrict, TBL_BATCH);
68
+    mapi_table_sort($table, [PR_MESSAGE_DELIVERY_TIME => TABLE_SORT_DESCEND], TBL_BATCH);
69
+
70
+    $privateCerts = mapi_table_queryallrows($table, [PR_ENTRYID, PR_SUBJECT, PR_MESSAGE_DELIVERY_TIME, PR_CLIENT_SUBMIT_TIME], $restrict);
71
+
72
+    if ($privateCerts && count($privateCerts) > 0) {
73
+        return $privateCerts;
74
+    }
75
+
76
+    return false;
77 77
 }
78 78
 
79 79
 /**
@@ -88,34 +88,34 @@  discard block
 block discarded – undo
88 88
  * @return {Mixed} collection of certificates, empty if none if decrypting fails or stored private certificate isn't found
89 89
  */
90 90
 function readPrivateCert($store, $passphrase, $singleCert = true) {
91
-	$unlockedCerts = [];
92
-	// Get all private certificates saved in the store
93
-	$privateCerts = getMAPICert($store);
94
-	if ($singleCert) {
95
-		$privateCerts = [$privateCerts[0]];
96
-	}
97
-
98
-	// Get messages from certificates
99
-	foreach ($privateCerts as $privateCert) {
100
-		$privateCertMessage = mapi_msgstore_openentry($store, $privateCert[PR_ENTRYID]);
101
-		if ($privateCertMessage !== false) {
102
-			$pkcs12 = "";
103
-			$certs = [];
104
-			// Read pkcs12 cert from message
105
-			$stream = mapi_openproperty($privateCertMessage, PR_BODY, IID_IStream, 0, 0);
106
-			$stat = mapi_stream_stat($stream);
107
-			mapi_stream_seek($stream, 0, STREAM_SEEK_SET);
108
-			for ($i = 0; $i < $stat['cb']; $i += 1024) {
109
-				$pkcs12 .= mapi_stream_read($stream, 1024);
110
-			}
111
-			$ok = openssl_pkcs12_read(base64_decode($pkcs12), $certs, $passphrase);
112
-			if ($ok !== false) {
113
-				array_push($unlockedCerts, $certs);
114
-			}
115
-		}
116
-	}
117
-
118
-	return ($singleCert !== false && count($unlockedCerts) > 0) ? $unlockedCerts[0] : $unlockedCerts;
91
+    $unlockedCerts = [];
92
+    // Get all private certificates saved in the store
93
+    $privateCerts = getMAPICert($store);
94
+    if ($singleCert) {
95
+        $privateCerts = [$privateCerts[0]];
96
+    }
97
+
98
+    // Get messages from certificates
99
+    foreach ($privateCerts as $privateCert) {
100
+        $privateCertMessage = mapi_msgstore_openentry($store, $privateCert[PR_ENTRYID]);
101
+        if ($privateCertMessage !== false) {
102
+            $pkcs12 = "";
103
+            $certs = [];
104
+            // Read pkcs12 cert from message
105
+            $stream = mapi_openproperty($privateCertMessage, PR_BODY, IID_IStream, 0, 0);
106
+            $stat = mapi_stream_stat($stream);
107
+            mapi_stream_seek($stream, 0, STREAM_SEEK_SET);
108
+            for ($i = 0; $i < $stat['cb']; $i += 1024) {
109
+                $pkcs12 .= mapi_stream_read($stream, 1024);
110
+            }
111
+            $ok = openssl_pkcs12_read(base64_decode($pkcs12), $certs, $passphrase);
112
+            if ($ok !== false) {
113
+                array_push($unlockedCerts, $certs);
114
+            }
115
+        }
116
+    }
117
+
118
+    return ($singleCert !== false && count($unlockedCerts) > 0) ? $unlockedCerts[0] : $unlockedCerts;
119 119
 }
120 120
 
121 121
 /**
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
  * @return {string} X509 Certificate in PEM format
128 128
  */
129 129
 function der2pem($certificate) {
130
-	return "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($certificate), 64, "\n") . "-----END CERTIFICATE-----\n";
130
+    return "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($certificate), 64, "\n") . "-----END CERTIFICATE-----\n";
131 131
 }
132 132
 
133 133
 /**
@@ -150,55 +150,55 @@  discard block
 block discarded – undo
150 150
  * @return {Boolean} true is OCSP verification has succeeded or when there is no OCSP support, false if it hasn't
151 151
  */
152 152
 function verifyOCSP($certificate, $extracerts = [], &$message) {
153
-	if (!PLUGIN_SMIME_ENABLE_OCSP) {
154
-		$message['success'] = SMIME_STATUS_SUCCESS;
155
-		$message['info'] = SMIME_OCSP_DISABLED;
153
+    if (!PLUGIN_SMIME_ENABLE_OCSP) {
154
+        $message['success'] = SMIME_STATUS_SUCCESS;
155
+        $message['info'] = SMIME_OCSP_DISABLED;
156 156
 
157
-		return true;
158
-	}
157
+        return true;
158
+    }
159 159
 
160
-	$pubcert = new Certificate($certificate);
160
+    $pubcert = new Certificate($certificate);
161 161
 
162
-	/*
162
+    /*
163 163
 	 * Walk over the provided extra intermediate certificates and setup the issuer
164 164
 	 * chain.
165 165
 	 */
166
-	$parent = $pubcert;
167
-	while ($cert = array_shift($extracerts)) {
168
-		$cert = new Certificate($cert);
169
-
170
-		if ($cert->getName() === $pubcert->getName()) {
171
-			continue;
172
-		}
173
-
174
-		if ($cert->getName() === $parent->getIssuerName()) {
175
-			$parent->setIssuer($cert);
176
-			$parent = $cert;
177
-		}
178
-	}
179
-
180
-	try {
181
-		$pubcert->verify();
182
-		$issuer = $pubcert->issuer();
183
-		if ($issuer->issuer()) {
184
-			$issuer->verify();
185
-		}
186
-	}
187
-	catch (OCSPException $e) {
188
-		if ($e->getCode() === OCSP_CERT_STATUS && $e->getCertStatus() == OCSP_CERT_STATUS_REVOKED) {
189
-			$message['info'] = SMIME_REVOKED;
190
-			$message['success'] = SMIME_STATUS_PARTIAL;
191
-
192
-			return false;
193
-		}
194
-		error_log(sprintf("[SMIME] OCSP verification warning: '%s'", $e->getMessage()));
195
-	}
196
-
197
-	// Certificate does not support OCSP
198
-	$message['info'] = SMIME_SUCCESS;
199
-	$message['success'] = SMIME_STATUS_SUCCESS;
200
-
201
-	return true;
166
+    $parent = $pubcert;
167
+    while ($cert = array_shift($extracerts)) {
168
+        $cert = new Certificate($cert);
169
+
170
+        if ($cert->getName() === $pubcert->getName()) {
171
+            continue;
172
+        }
173
+
174
+        if ($cert->getName() === $parent->getIssuerName()) {
175
+            $parent->setIssuer($cert);
176
+            $parent = $cert;
177
+        }
178
+    }
179
+
180
+    try {
181
+        $pubcert->verify();
182
+        $issuer = $pubcert->issuer();
183
+        if ($issuer->issuer()) {
184
+            $issuer->verify();
185
+        }
186
+    }
187
+    catch (OCSPException $e) {
188
+        if ($e->getCode() === OCSP_CERT_STATUS && $e->getCertStatus() == OCSP_CERT_STATUS_REVOKED) {
189
+            $message['info'] = SMIME_REVOKED;
190
+            $message['success'] = SMIME_STATUS_PARTIAL;
191
+
192
+            return false;
193
+        }
194
+        error_log(sprintf("[SMIME] OCSP verification warning: '%s'", $e->getMessage()));
195
+    }
196
+
197
+    // Certificate does not support OCSP
198
+    $message['info'] = SMIME_SUCCESS;
199
+    $message['success'] = SMIME_STATUS_SUCCESS;
200
+
201
+    return true;
202 202
 }
203 203
 
204 204
 /* Validate the certificate of a user, set an error message.
@@ -208,48 +208,48 @@  discard block
 block discarded – undo
208 208
  * @param string $emailAddres the users email address (must match certificate email)
209 209
  */
210 210
 function validateUploadedPKCS($certificate, $passphrase, $emailAddress) {
211
-	if (!openssl_pkcs12_read($certificate, $certs, $passphrase)) {
212
-		return [_('Unable to decrypt certificate'), '', ''];
213
-	}
214
-
215
-	$message = '';
216
-	$data = [];
217
-	$privatekey = $certs['pkey'];
218
-	$publickey = $certs['cert'];
219
-	$extracerts = isset($certs['extracerts']) ? $certs['extracerts'] : [];
220
-	$publickeyData = openssl_x509_parse($publickey);
221
-
222
-	if ($publickeyData) {
223
-		$certEmailAddress = getCertEmail($publickeyData);
224
-		$validFrom = $publickeyData['validFrom_time_t'];
225
-		$validTo = $publickeyData['validTo_time_t'];
226
-
227
-		// Check priv key for signing capabilities
228
-		if (!openssl_x509_checkpurpose($privatekey, X509_PURPOSE_SMIME_SIGN)) {
229
-			$message = _('Private key can\'t be used to sign email');
230
-		}
231
-		// Check if the certificate owner matches the grommunio Web users email address
232
-		elseif (strcasecmp($certEmailAddress, $emailAddress) !== 0) {
233
-			$message = _('Certificate email address doesn\'t match grommunio Web account ') . $certEmailAddress;
234
-		}
235
-		// Check if certificate is not expired, still import the certificate since a user wants to decrypt his old email
236
-		elseif ($validTo < time()) {
237
-			$message = _('Certificate was expired on ') . date('Y-m-d', $validTo) . '. ' . _('Certificate has not been imported');
238
-		}
239
-		// Check if the certificate is validFrom date is not in the future
240
-		elseif ($validFrom > time()) {
241
-			$message = _('Certificate is not yet valid ') . date('Y-m-d', $validFrom) . '. ' . _('Certificate has not been imported');
242
-		}
243
-		// We allow users to import private certificate which have no OCSP support
244
-		elseif (!verifyOCSP($certs['cert'], $extracerts, $data)) {
245
-			$message = _('Certificate is revoked');
246
-		}
247
-	}
248
-	else { // Can't parse public certificate pkcs#12 file might be corrupt
249
-		$message = _('Unable to read public certificate');
250
-	}
251
-
252
-	return [$message, $publickey, $publickeyData];
211
+    if (!openssl_pkcs12_read($certificate, $certs, $passphrase)) {
212
+        return [_('Unable to decrypt certificate'), '', ''];
213
+    }
214
+
215
+    $message = '';
216
+    $data = [];
217
+    $privatekey = $certs['pkey'];
218
+    $publickey = $certs['cert'];
219
+    $extracerts = isset($certs['extracerts']) ? $certs['extracerts'] : [];
220
+    $publickeyData = openssl_x509_parse($publickey);
221
+
222
+    if ($publickeyData) {
223
+        $certEmailAddress = getCertEmail($publickeyData);
224
+        $validFrom = $publickeyData['validFrom_time_t'];
225
+        $validTo = $publickeyData['validTo_time_t'];
226
+
227
+        // Check priv key for signing capabilities
228
+        if (!openssl_x509_checkpurpose($privatekey, X509_PURPOSE_SMIME_SIGN)) {
229
+            $message = _('Private key can\'t be used to sign email');
230
+        }
231
+        // Check if the certificate owner matches the grommunio Web users email address
232
+        elseif (strcasecmp($certEmailAddress, $emailAddress) !== 0) {
233
+            $message = _('Certificate email address doesn\'t match grommunio Web account ') . $certEmailAddress;
234
+        }
235
+        // Check if certificate is not expired, still import the certificate since a user wants to decrypt his old email
236
+        elseif ($validTo < time()) {
237
+            $message = _('Certificate was expired on ') . date('Y-m-d', $validTo) . '. ' . _('Certificate has not been imported');
238
+        }
239
+        // Check if the certificate is validFrom date is not in the future
240
+        elseif ($validFrom > time()) {
241
+            $message = _('Certificate is not yet valid ') . date('Y-m-d', $validFrom) . '. ' . _('Certificate has not been imported');
242
+        }
243
+        // We allow users to import private certificate which have no OCSP support
244
+        elseif (!verifyOCSP($certs['cert'], $extracerts, $data)) {
245
+            $message = _('Certificate is revoked');
246
+        }
247
+    }
248
+    else { // Can't parse public certificate pkcs#12 file might be corrupt
249
+        $message = _('Unable to read public certificate');
250
+    }
251
+
252
+    return [$message, $publickey, $publickeyData];
253 253
 }
254 254
 
255 255
 /**
@@ -258,9 +258,9 @@  discard block
 block discarded – undo
258 258
  * @return {boolean} true is expiration is supported
259 259
  */
260 260
 function encryptionStoreExpirationSupport() {
261
-	$refClass = new ReflectionClass('EncryptionStore');
261
+    $refClass = new ReflectionClass('EncryptionStore');
262 262
 
263
-	return count($refClass->getMethod('add')->getParameters()) === 3;
263
+    return count($refClass->getMethod('add')->getParameters()) === 3;
264 264
 }
265 265
 
266 266
 /**
@@ -270,14 +270,14 @@  discard block
 block discarded – undo
270 270
  * @param mixed $sessionOpened
271 271
  */
272 272
 function withPHPSession($func, $sessionOpened = false) {
273
-	if (session_status() === PHP_SESSION_NONE) {
274
-		session_start();
275
-		$sessionOpened = true;
276
-	}
273
+    if (session_status() === PHP_SESSION_NONE) {
274
+        session_start();
275
+        $sessionOpened = true;
276
+    }
277 277
 
278
-	$func();
278
+    $func();
279 279
 
280
-	if ($sessionOpened) {
281
-		session_write_close();
282
-	}
280
+    if ($sessionOpened) {
281
+        session_write_close();
282
+    }
283 283
 }
Please login to merge, or discard this patch.
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -17,8 +17,7 @@  discard block
 block discarded – undo
17 17
 	// If subject/emailAddress is not set, try subjectAltName
18 18
 	if (isset($certificate['subject']['emailAddress'])) {
19 19
 		$certEmailAddress = $certificate['subject']['emailAddress'];
20
-	}
21
-	elseif (isset($certificate['extensions'], $certificate['extensions']['subjectAltName'])) {
20
+	} elseif (isset($certificate['extensions'], $certificate['extensions']['subjectAltName'])) {
22 21
 		// Example [subjectAltName] => email:[email protected]
23 22
 		$tmp = explode('email:', $certificate['extensions']['subjectAltName']);
24 23
 		// Only get the first match
@@ -183,8 +182,7 @@  discard block
 block discarded – undo
183 182
 		if ($issuer->issuer()) {
184 183
 			$issuer->verify();
185 184
 		}
186
-	}
187
-	catch (OCSPException $e) {
185
+	} catch (OCSPException $e) {
188 186
 		if ($e->getCode() === OCSP_CERT_STATUS && $e->getCertStatus() == OCSP_CERT_STATUS_REVOKED) {
189 187
 			$message['info'] = SMIME_REVOKED;
190 188
 			$message['success'] = SMIME_STATUS_PARTIAL;
@@ -244,8 +242,7 @@  discard block
 block discarded – undo
244 242
 		elseif (!verifyOCSP($certs['cert'], $extracerts, $data)) {
245 243
 			$message = _('Certificate is revoked');
246 244
 		}
247
-	}
248
-	else { // Can't parse public certificate pkcs#12 file might be corrupt
245
+	} else { // Can't parse public certificate pkcs#12 file might be corrupt
249 246
 		$message = _('Unable to read public certificate');
250 247
 	}
251 248
 
Please login to merge, or discard this patch.
server/includes/download_message.php 2 patches
Indentation   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -12,167 +12,167 @@
 block discarded – undo
12 12
  * It extends the DownloadBase class.
13 13
  */
14 14
 class DownloadMessage extends DownloadBase {
15
-	/**
16
-	 * Function get message-stream using respective mapi function.
17
-	 * It also sends the eml file to the client.
18
-	 */
19
-	public function downloadMessageAsFile() {
20
-		if ($this->message && $this->store) {
21
-			// get message properties.
22
-			$messageProps = mapi_getprops($this->message, [PR_SUBJECT, PR_EC_IMAP_EMAIL, PR_MESSAGE_CLASS]);
23
-
24
-			$stream = $this->getEmlStream($messageProps);
25
-
26
-			$filename = (!empty($messageProps[PR_SUBJECT])) ? $messageProps[PR_SUBJECT] : _('Untitled');
27
-			$filename .= '.eml';
28
-
29
-			// Set the file length
30
-			$stat = mapi_stream_stat($stream);
31
-
32
-			$this->setNecessaryHeaders($filename, $stat['cb']);
33
-
34
-			// Read whole message and echo it.
35
-			for ($i = 0; $i < $stat['cb']; $i += BLOCK_SIZE) {
36
-				// Print stream
37
-				echo mapi_stream_read($stream, BLOCK_SIZE);
38
-
39
-				// Need to discard the buffer contents to prevent memory
40
-				// exhaustion while echoing large content.
41
-				ob_flush();
42
-			}
43
-		}
44
-	}
45
-
46
-	/**
47
-	 * Function will create a ZIP archive and add eml files into the same.
48
-	 * It also configures necessary header information which required to send the ZIP file to client.
49
-	 * Send ZIP to the client if all the requested eml files included successfully into the same.
50
-	 */
51
-	public function downloadMessageAsZipFile() {
52
-		if ($this->store) {
53
-			// Generate random ZIP file name at default temporary path of PHP
54
-			$randomZipName = tempnam(sys_get_temp_dir(), 'zip');
55
-
56
-			// Create an open zip archive.
57
-			$zip = new ZipArchive();
58
-			$result = $zip->open($randomZipName, ZipArchive::CREATE);
59
-
60
-			if ($result === true) {
61
-				for ($index = 0, $count = count($this->entryIds); $index < $count; ++$index) {
62
-					$this->message = mapi_msgstore_openentry($this->store, hex2bin($this->entryIds[$index]));
63
-
64
-					// get message properties.
65
-					$messageProps = mapi_getprops($this->message, [PR_SUBJECT, PR_EC_IMAP_EMAIL, PR_MESSAGE_CLASS]);
66
-
67
-					$stream = $this->getEmlStream($messageProps);
68
-					$stat = mapi_stream_stat($stream);
69
-
70
-					// Get the stream
71
-					$datastring = '';
72
-					for ($i = 0; $i < $stat['cb']; $i += BLOCK_SIZE) {
73
-						$datastring .= mapi_stream_read($stream, BLOCK_SIZE);
74
-						// Need to discard the buffer contents to prevent memory
75
-						// exhaustion.
76
-						ob_flush();
77
-					}
78
-
79
-					$filename = (!empty($messageProps[PR_SUBJECT])) ? $messageProps[PR_SUBJECT] : _('Untitled');
80
-					$filename .= '.eml';
81
-
82
-					$filename = $this->handleDuplicateFileNames($filename);
83
-					// Remove slashes to prevent unwanted directories to be created in the zip file.
84
-					$filename = str_replace('\\', '_', $filename);
85
-					$filename = str_replace('/', '_', $filename);
86
-
87
-					// Add file into zip by stream
88
-					$zip->addFromString($filename, $datastring);
89
-				}
90
-			}
91
-			else {
92
-				$zip->close();
93
-				// Remove the zip file to avoid unnecessary disk-space consumption
94
-				unlink($randomZipName);
95
-
96
-				// Throw exception if ZIP is not created successfully
97
-				throw new ZarafaException(_("ZIP is not created successfully"));
98
-			}
99
-
100
-			$zip->close();
101
-
102
-			// Set the headers
103
-			header('Pragma: public');
104
-			header('Expires: 0'); // set expiration time
105
-			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
106
-			header('Content-Disposition: attachment; filename="' . addslashes(browserDependingHTTPHeaderEncode(_("Messages") . date(" d-m-Y") . ".zip")) . '"');
107
-			header('Content-Transfer-Encoding: binary');
108
-			header('Content-Type:  application/zip');
109
-			header('Content-Length: ' . filesize($randomZipName));
110
-
111
-			// Send the actual response as ZIP file
112
-			readfile($randomZipName);
113
-
114
-			// Remove the zip file to avoid unnecessary disk-space consumption
115
-			unlink($randomZipName);
116
-		}
117
-	}
118
-
119
-	/**
120
-	 * Function will obtain stream from the message, For email messages it will open email as
121
-	 * inet object and get the stream content as eml format, when user has IMAP enabled.
122
-	 * The below mentioned properties are configured with the whole message as a stream in it, while IMAP is enabled:
123
-	 * PR_EC_IMAP_EMAIL
124
-	 * PR_EC_IMAP_EMAIL_SIZE
125
-	 * PR_EC_IMAP_BODY
126
-	 * PR_EC_IMAP_BODYSTRUCTURE.
127
-	 *
128
-	 * @param array $messageProps properties of this particular message
129
-	 *
130
-	 * @return Stream $stream the eml stream obtained from message
131
-	 */
132
-	public function getEmlStream($messageProps) {
133
-		// If RFC822-formatted stream is already available in PR_EC_IMAP_EMAIL property
134
-		// than directly use it, generate otherwise.
135
-		if (isset($messageProps[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $messageProps) == MAPI_E_NOT_ENOUGH_MEMORY) {
136
-			// Stream the message to properly get the PR_EC_IMAP_EMAIL property
137
-			$stream = mapi_openproperty($this->message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
138
-		}
139
-		else {
140
-			// Get addressbook for current session
141
-			$addrBook = $GLOBALS['mapisession']->getAddressbook();
142
-
143
-			// Read the message as RFC822-formatted e-mail stream.
144
-			$stream = mapi_inetmapi_imtoinet($GLOBALS['mapisession']->getSession(), $addrBook, $this->message, []);
145
-		}
146
-
147
-		return $stream;
148
-	}
149
-
150
-	/**
151
-	 * Check received data and decide either the eml file or
152
-	 * ZIP file is requested to be downloaded.
153
-	 */
154
-	public function download() {
155
-		if ($this->allAsZip) {
156
-			// download multiple eml messages in a ZIP file
157
-			$this->downloadMessageAsZipFile();
158
-		}
159
-		else {
160
-			// download message as file
161
-			$this->downloadMessageAsFile();
162
-		}
163
-	}
15
+    /**
16
+     * Function get message-stream using respective mapi function.
17
+     * It also sends the eml file to the client.
18
+     */
19
+    public function downloadMessageAsFile() {
20
+        if ($this->message && $this->store) {
21
+            // get message properties.
22
+            $messageProps = mapi_getprops($this->message, [PR_SUBJECT, PR_EC_IMAP_EMAIL, PR_MESSAGE_CLASS]);
23
+
24
+            $stream = $this->getEmlStream($messageProps);
25
+
26
+            $filename = (!empty($messageProps[PR_SUBJECT])) ? $messageProps[PR_SUBJECT] : _('Untitled');
27
+            $filename .= '.eml';
28
+
29
+            // Set the file length
30
+            $stat = mapi_stream_stat($stream);
31
+
32
+            $this->setNecessaryHeaders($filename, $stat['cb']);
33
+
34
+            // Read whole message and echo it.
35
+            for ($i = 0; $i < $stat['cb']; $i += BLOCK_SIZE) {
36
+                // Print stream
37
+                echo mapi_stream_read($stream, BLOCK_SIZE);
38
+
39
+                // Need to discard the buffer contents to prevent memory
40
+                // exhaustion while echoing large content.
41
+                ob_flush();
42
+            }
43
+        }
44
+    }
45
+
46
+    /**
47
+     * Function will create a ZIP archive and add eml files into the same.
48
+     * It also configures necessary header information which required to send the ZIP file to client.
49
+     * Send ZIP to the client if all the requested eml files included successfully into the same.
50
+     */
51
+    public function downloadMessageAsZipFile() {
52
+        if ($this->store) {
53
+            // Generate random ZIP file name at default temporary path of PHP
54
+            $randomZipName = tempnam(sys_get_temp_dir(), 'zip');
55
+
56
+            // Create an open zip archive.
57
+            $zip = new ZipArchive();
58
+            $result = $zip->open($randomZipName, ZipArchive::CREATE);
59
+
60
+            if ($result === true) {
61
+                for ($index = 0, $count = count($this->entryIds); $index < $count; ++$index) {
62
+                    $this->message = mapi_msgstore_openentry($this->store, hex2bin($this->entryIds[$index]));
63
+
64
+                    // get message properties.
65
+                    $messageProps = mapi_getprops($this->message, [PR_SUBJECT, PR_EC_IMAP_EMAIL, PR_MESSAGE_CLASS]);
66
+
67
+                    $stream = $this->getEmlStream($messageProps);
68
+                    $stat = mapi_stream_stat($stream);
69
+
70
+                    // Get the stream
71
+                    $datastring = '';
72
+                    for ($i = 0; $i < $stat['cb']; $i += BLOCK_SIZE) {
73
+                        $datastring .= mapi_stream_read($stream, BLOCK_SIZE);
74
+                        // Need to discard the buffer contents to prevent memory
75
+                        // exhaustion.
76
+                        ob_flush();
77
+                    }
78
+
79
+                    $filename = (!empty($messageProps[PR_SUBJECT])) ? $messageProps[PR_SUBJECT] : _('Untitled');
80
+                    $filename .= '.eml';
81
+
82
+                    $filename = $this->handleDuplicateFileNames($filename);
83
+                    // Remove slashes to prevent unwanted directories to be created in the zip file.
84
+                    $filename = str_replace('\\', '_', $filename);
85
+                    $filename = str_replace('/', '_', $filename);
86
+
87
+                    // Add file into zip by stream
88
+                    $zip->addFromString($filename, $datastring);
89
+                }
90
+            }
91
+            else {
92
+                $zip->close();
93
+                // Remove the zip file to avoid unnecessary disk-space consumption
94
+                unlink($randomZipName);
95
+
96
+                // Throw exception if ZIP is not created successfully
97
+                throw new ZarafaException(_("ZIP is not created successfully"));
98
+            }
99
+
100
+            $zip->close();
101
+
102
+            // Set the headers
103
+            header('Pragma: public');
104
+            header('Expires: 0'); // set expiration time
105
+            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
106
+            header('Content-Disposition: attachment; filename="' . addslashes(browserDependingHTTPHeaderEncode(_("Messages") . date(" d-m-Y") . ".zip")) . '"');
107
+            header('Content-Transfer-Encoding: binary');
108
+            header('Content-Type:  application/zip');
109
+            header('Content-Length: ' . filesize($randomZipName));
110
+
111
+            // Send the actual response as ZIP file
112
+            readfile($randomZipName);
113
+
114
+            // Remove the zip file to avoid unnecessary disk-space consumption
115
+            unlink($randomZipName);
116
+        }
117
+    }
118
+
119
+    /**
120
+     * Function will obtain stream from the message, For email messages it will open email as
121
+     * inet object and get the stream content as eml format, when user has IMAP enabled.
122
+     * The below mentioned properties are configured with the whole message as a stream in it, while IMAP is enabled:
123
+     * PR_EC_IMAP_EMAIL
124
+     * PR_EC_IMAP_EMAIL_SIZE
125
+     * PR_EC_IMAP_BODY
126
+     * PR_EC_IMAP_BODYSTRUCTURE.
127
+     *
128
+     * @param array $messageProps properties of this particular message
129
+     *
130
+     * @return Stream $stream the eml stream obtained from message
131
+     */
132
+    public function getEmlStream($messageProps) {
133
+        // If RFC822-formatted stream is already available in PR_EC_IMAP_EMAIL property
134
+        // than directly use it, generate otherwise.
135
+        if (isset($messageProps[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $messageProps) == MAPI_E_NOT_ENOUGH_MEMORY) {
136
+            // Stream the message to properly get the PR_EC_IMAP_EMAIL property
137
+            $stream = mapi_openproperty($this->message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
138
+        }
139
+        else {
140
+            // Get addressbook for current session
141
+            $addrBook = $GLOBALS['mapisession']->getAddressbook();
142
+
143
+            // Read the message as RFC822-formatted e-mail stream.
144
+            $stream = mapi_inetmapi_imtoinet($GLOBALS['mapisession']->getSession(), $addrBook, $this->message, []);
145
+        }
146
+
147
+        return $stream;
148
+    }
149
+
150
+    /**
151
+     * Check received data and decide either the eml file or
152
+     * ZIP file is requested to be downloaded.
153
+     */
154
+    public function download() {
155
+        if ($this->allAsZip) {
156
+            // download multiple eml messages in a ZIP file
157
+            $this->downloadMessageAsZipFile();
158
+        }
159
+        else {
160
+            // download message as file
161
+            $this->downloadMessageAsFile();
162
+        }
163
+    }
164 164
 }
165 165
 
166 166
 // create instance of class to download message as file
167 167
 $messageInstance = new DownloadMessage();
168 168
 
169 169
 try {
170
-	// initialize variables
171
-	$messageInstance->init($_GET);
170
+    // initialize variables
171
+    $messageInstance->init($_GET);
172 172
 
173
-	// download message
174
-	$messageInstance->download();
173
+    // download message
174
+    $messageInstance->download();
175 175
 }
176 176
 catch (Exception $e) {
177
-	$messageInstance->handleSaveMessageException($e);
177
+    $messageInstance->handleSaveMessageException($e);
178 178
 }
Please login to merge, or discard this patch.
Braces   +4 added lines, -8 removed lines patch added patch discarded remove patch
@@ -87,8 +87,7 @@  discard block
 block discarded – undo
87 87
 					// Add file into zip by stream
88 88
 					$zip->addFromString($filename, $datastring);
89 89
 				}
90
-			}
91
-			else {
90
+			} else {
92 91
 				$zip->close();
93 92
 				// Remove the zip file to avoid unnecessary disk-space consumption
94 93
 				unlink($randomZipName);
@@ -135,8 +134,7 @@  discard block
 block discarded – undo
135 134
 		if (isset($messageProps[PR_EC_IMAP_EMAIL]) || propIsError(PR_EC_IMAP_EMAIL, $messageProps) == MAPI_E_NOT_ENOUGH_MEMORY) {
136 135
 			// Stream the message to properly get the PR_EC_IMAP_EMAIL property
137 136
 			$stream = mapi_openproperty($this->message, PR_EC_IMAP_EMAIL, IID_IStream, 0, 0);
138
-		}
139
-		else {
137
+		} else {
140 138
 			// Get addressbook for current session
141 139
 			$addrBook = $GLOBALS['mapisession']->getAddressbook();
142 140
 
@@ -155,8 +153,7 @@  discard block
 block discarded – undo
155 153
 		if ($this->allAsZip) {
156 154
 			// download multiple eml messages in a ZIP file
157 155
 			$this->downloadMessageAsZipFile();
158
-		}
159
-		else {
156
+		} else {
160 157
 			// download message as file
161 158
 			$this->downloadMessageAsFile();
162 159
 		}
@@ -172,7 +169,6 @@  discard block
 block discarded – undo
172 169
 
173 170
 	// download message
174 171
 	$messageInstance->download();
175
-}
176
-catch (Exception $e) {
172
+} catch (Exception $e) {
177 173
 	$messageInstance->handleSaveMessageException($e);
178 174
 }
Please login to merge, or discard this patch.
server/includes/logger/class.filelog.php 1 patch
Indentation   +76 added lines, -76 removed lines patch added patch discarded remove patch
@@ -1,89 +1,89 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-	class FileLog extends Logger {
4
-		/**
5
-		 * @var string
6
-		 */
7
-		private $logToUserFile = "";
3
+    class FileLog extends Logger {
4
+        /**
5
+         * @var string
6
+         */
7
+        private $logToUserFile = "";
8 8
 
9
-		/**
10
-		 * Writes a log message to the general log.
11
-		 *
12
-		 * @param {Number}        $loglevel       one of the defined LOGLEVELS
13
-		 * @param {string}        $message        The log message which we want to log in user specific log file
14
-		 * @param {boolean|array} $detailMessage  (optional) The detailed log message. it can be Error/Exception array.
15
-		 * @param {boolean|array} $request        (optional) The request log the the request data which sent by the user
16
-		 * @param mixed $logLevel
17
-		 */
18
-		protected function Write($logLevel, $message, $detailMessage, $request) {
19
-			$dir = LOG_FILE_DIR;
20
-			if (substr(LOG_FILE_DIR, -1) != "/") {
21
-				$dir .= "/";
22
-			}
9
+        /**
10
+         * Writes a log message to the general log.
11
+         *
12
+         * @param {Number}        $loglevel       one of the defined LOGLEVELS
13
+         * @param {string}        $message        The log message which we want to log in user specific log file
14
+         * @param {boolean|array} $detailMessage  (optional) The detailed log message. it can be Error/Exception array.
15
+         * @param {boolean|array} $request        (optional) The request log the the request data which sent by the user
16
+         * @param mixed $logLevel
17
+         */
18
+        protected function Write($logLevel, $message, $detailMessage, $request) {
19
+            $dir = LOG_FILE_DIR;
20
+            if (substr(LOG_FILE_DIR, -1) != "/") {
21
+                $dir .= "/";
22
+            }
23 23
 
24
-			// If users directory not created then create it first.
25
-			if (!is_dir($dir)) {
26
-				if (empty($dir)) {
27
-					error_log("Log directory has not configured. provide valid directory path.");
24
+            // If users directory not created then create it first.
25
+            if (!is_dir($dir)) {
26
+                if (empty($dir)) {
27
+                    error_log("Log directory has not configured. provide valid directory path.");
28 28
 
29
-					return;
30
-				}
31
-				if (mkdir($dir, 0777, true) === false) {
32
-					error_log("Problem in creating log folder " . $dir);
29
+                    return;
30
+                }
31
+                if (mkdir($dir, 0777, true) === false) {
32
+                    error_log("Problem in creating log folder " . $dir);
33 33
 
34
-					return;
35
-				}
36
-			}
37
-			$data = $this->BuildLogString($logLevel, $message, $detailMessage, $request) . PHP_EOL;
38
-			file_put_contents($dir . $this->getLogToUserFile(), $data, FILE_APPEND);
39
-		}
34
+                    return;
35
+                }
36
+            }
37
+            $data = $this->BuildLogString($logLevel, $message, $detailMessage, $request) . PHP_EOL;
38
+            file_put_contents($dir . $this->getLogToUserFile(), $data, FILE_APPEND);
39
+        }
40 40
 
41
-		/**
42
-		 * Get the log user file.
43
-		 *
44
-		 * @return string
45
-		 */
46
-		private function getLogToUserFile() {
47
-			if (strlen($this->logToUserFile) == 0) {
48
-				$this->setLogToUserFile($this->getUser() . ".log");
49
-			}
41
+        /**
42
+         * Get the log user file.
43
+         *
44
+         * @return string
45
+         */
46
+        private function getLogToUserFile() {
47
+            if (strlen($this->logToUserFile) == 0) {
48
+                $this->setLogToUserFile($this->getUser() . ".log");
49
+            }
50 50
 
51
-			return $this->logToUserFile;
52
-		}
51
+            return $this->logToUserFile;
52
+        }
53 53
 
54
-		/**
55
-		 * Set user log-file relative to log directory.
56
-		 *
57
-		 * @param string $value
58
-		 */
59
-		private function setLogToUserFile($value) {
60
-			$this->logToUserFile = $value;
61
-		}
54
+        /**
55
+         * Set user log-file relative to log directory.
56
+         *
57
+         * @param string $value
58
+         */
59
+        private function setLogToUserFile($value) {
60
+            $this->logToUserFile = $value;
61
+        }
62 62
 
63
-		/**
64
-		 * Returns the string to be logged.
65
-		 *
66
-		 * @param {Number}        $loglevel       one of the defined LOGLEVELS
67
-		 * @param {string}        $message        The log message which we want to log in user specific log file
68
-		 * @param {boolean|array} $detailMessage  (optional) The detailed log message. it can be Error/Exception array.
69
-		 * @param {boolean|array} $request        (optional) The request log the the request data which sent by the user
70
-		 *
71
-		 * @return string
72
-		 */
73
-		public function BuildLogString($loglevel, $message, $detailMessage = false, $request = false) {
74
-			$dateTime = strftime("%d-%b-%Y %H:%M:%S");
75
-			$log = "[" . $dateTime . "] ";
76
-			$log .= $this->GetLogLevelString($loglevel);
77
-			$log .= ' ' . $message;
63
+        /**
64
+         * Returns the string to be logged.
65
+         *
66
+         * @param {Number}        $loglevel       one of the defined LOGLEVELS
67
+         * @param {string}        $message        The log message which we want to log in user specific log file
68
+         * @param {boolean|array} $detailMessage  (optional) The detailed log message. it can be Error/Exception array.
69
+         * @param {boolean|array} $request        (optional) The request log the the request data which sent by the user
70
+         *
71
+         * @return string
72
+         */
73
+        public function BuildLogString($loglevel, $message, $detailMessage = false, $request = false) {
74
+            $dateTime = strftime("%d-%b-%Y %H:%M:%S");
75
+            $log = "[" . $dateTime . "] ";
76
+            $log .= $this->GetLogLevelString($loglevel);
77
+            $log .= ' ' . $message;
78 78
 
79
-			if ($detailMessage) {
80
-				$log .= ' :' . var_export($detailMessage, true) . "\r\n";
81
-			}
79
+            if ($detailMessage) {
80
+                $log .= ' :' . var_export($detailMessage, true) . "\r\n";
81
+            }
82 82
 
83
-			if ($request) {
84
-				$log .= ' Request:' . var_export($request, true) . "\r\n";
85
-			}
83
+            if ($request) {
84
+                $log .= ' Request:' . var_export($request, true) . "\r\n";
85
+            }
86 86
 
87
-			return $log;
88
-		}
89
-	}
87
+            return $log;
88
+        }
89
+    }
Please login to merge, or discard this patch.
server/includes/logger/class.baselogger.php 1 patch
Indentation   +161 added lines, -161 removed lines patch added patch discarded remove patch
@@ -1,163 +1,163 @@
 block discarded – undo
1 1
 <?php
2 2
 
3
-	abstract class Logger {
4
-		/**
5
-		 * @var string
6
-		 */
7
-		protected $user = '';
8
-
9
-		/**
10
-		 * @var array
11
-		 */
12
-		protected $specialLogUsers = [];
13
-
14
-		/**
15
-		 * Only used as a cache value for IsUserInSpecialLogUsers.
16
-		 *
17
-		 * @var array
18
-		 */
19
-		private $isUserInSpecialLogUsers = [];
20
-
21
-		/**
22
-		 * Only used as a cache value for IsAuthUserInSpecialLogUsers function.
23
-		 *
24
-		 * @var bool
25
-		 */
26
-		private $isAuthUserInSpecialLogUsers = false;
27
-
28
-		/**
29
-		 * Returns the current user.
30
-		 *
31
-		 * @return string
32
-		 */
33
-		public function GetUser() {
34
-			return $this->user;
35
-		}
36
-
37
-		/**
38
-		 * Sets the current user.
39
-		 *
40
-		 * @param array $value user information which is currently login
41
-		 */
42
-		public function SetUser($value) {
43
-			$this->user = $value;
44
-		}
45
-
46
-		/**
47
-		 * Indicates if special log users are known.
48
-		 *
49
-		 * @return bool True if we do have to log some specific user. False otherwise.
50
-		 */
51
-		public function HasSpecialLogUsers() {
52
-			return !empty($this->specialLogUsers);
53
-		}
54
-
55
-		/**
56
-		 * Indicates if the user is in the special log users.
57
-		 *
58
-		 * @param string $user
59
-		 *
60
-		 * @return bool
61
-		 */
62
-		public function IsUserInSpecialLogUsers($user) {
63
-			if (isset($this->isUserInSpecialLogUsers[$user])) {
64
-				return true;
65
-			}
66
-			if ($this->HasSpecialLogUsers()) {
67
-				$specialLogUsers = $this->GetSpecialLogUsers();
68
-				if (array_search($user, $specialLogUsers, true) !== false) {
69
-					$this->isUserInSpecialLogUsers[$user] = true;
70
-
71
-					return true;
72
-				}
73
-			}
74
-
75
-			return false;
76
-		}
77
-
78
-		/**
79
-		 * Returns the current special log users array.
80
-		 *
81
-		 * @return array
82
-		 */
83
-		public function GetSpecialLogUsers() {
84
-			return $this->specialLogUsers;
85
-		}
86
-
87
-		/**
88
-		 * Sets the current special log users array.
89
-		 */
90
-		public function SetSpecialLogUsers(array $value) {
91
-			$this->isUserInSpecialLogUsers = []; // reset cache
92
-			$this->specialLogUsers = $value;
93
-		}
94
-
95
-		/**
96
-		 * Check that the current login user is in the special log user array.
97
-		 * This call is equivalent to `$this->IsUserInSpecialLogUsers($this->GetUser())` at the exception that this
98
-		 * call uses cache so there won't be more than one check to the specialLogUser for the login user.
99
-		 *
100
-		 * @return bool true if user exist in special log user array else false
101
-		 */
102
-		public function IsAuthUserInSpecialLogUsers() {
103
-			if ($this->isAuthUserInSpecialLogUsers) {
104
-				return true;
105
-			}
106
-			if ($this->IsUserInSpecialLogUsers($this->GetUser())) {
107
-				$this->isAuthUserInSpecialLogUsers = true;
108
-
109
-				return true;
110
-			}
111
-
112
-			return false;
113
-		}
114
-
115
-		/**
116
-		 * Logs a message with a given log level.
117
-		 *
118
-		 * @param {int} $logLevel The log level which will be configured in config file
119
-		 * @param {string} $message The log message which we want to log in user specific log file
120
-		 * @param {boolean|array} $detailMessage (optional) The detailed log message. it can be Error/Exception array.
121
-		 * @param {boolean|array} $request (optional) The request log the the request data which sent by the user
122
-		 */
123
-		public function Log($logLevel, $message, $detailMessage = false, $request = false) {
124
-			if ($logLevel <= LOG_USER_LEVEL) {
125
-				if ($this->IsAuthUserInSpecialLogUsers()) {
126
-					$this->Write($logLevel, $message, $detailMessage, $request);
127
-				}
128
-			}
129
-		}
130
-
131
-		/**
132
-		 * Returns the string representation of the given $loglevel.
133
-		 *
134
-		 * @param {int} $loglevel one of the LOGLEVELs
135
-		 *
136
-		 * @return string
137
-		 */
138
-		protected function GetLogLevelString($loglevel) {
139
-			switch ($loglevel) {
140
-				case LOGLEVEL_OFF:          return ""; break;
141
-
142
-				case LOGLEVEL_FATAL:        return "[FATAL]"; break;
143
-
144
-				case LOGLEVEL_ERROR:        return "[ERROR]"; break;
145
-
146
-				case LOGLEVEL_WARN:         return "[WARN]"; break;
147
-
148
-				case LOGLEVEL_INFO:         return "[INFO]"; break;
149
-
150
-				case LOGLEVEL_DEBUG:        return "[DEBUG]"; break;
151
-			}
152
-		}
153
-
154
-		/**
155
-		 * Writes a log message to the general log.
156
-		 *
157
-		 * @param {int} $logLevel The log level which will be configured in config file
158
-		 * @param {string} $message The log message which we want to log in user specific log file
159
-		 * @param {boolean|array} $detailMessage (optional) The detailed log message. it can be Error/Exception array.
160
-		 * @param {boolean|array} $request (optional) The request log the the request data which sent by the user
161
-		 */
162
-		abstract protected function Write($logLevel, $message, $detailMessage, $request);
163
-	}
3
+    abstract class Logger {
4
+        /**
5
+         * @var string
6
+         */
7
+        protected $user = '';
8
+
9
+        /**
10
+         * @var array
11
+         */
12
+        protected $specialLogUsers = [];
13
+
14
+        /**
15
+         * Only used as a cache value for IsUserInSpecialLogUsers.
16
+         *
17
+         * @var array
18
+         */
19
+        private $isUserInSpecialLogUsers = [];
20
+
21
+        /**
22
+         * Only used as a cache value for IsAuthUserInSpecialLogUsers function.
23
+         *
24
+         * @var bool
25
+         */
26
+        private $isAuthUserInSpecialLogUsers = false;
27
+
28
+        /**
29
+         * Returns the current user.
30
+         *
31
+         * @return string
32
+         */
33
+        public function GetUser() {
34
+            return $this->user;
35
+        }
36
+
37
+        /**
38
+         * Sets the current user.
39
+         *
40
+         * @param array $value user information which is currently login
41
+         */
42
+        public function SetUser($value) {
43
+            $this->user = $value;
44
+        }
45
+
46
+        /**
47
+         * Indicates if special log users are known.
48
+         *
49
+         * @return bool True if we do have to log some specific user. False otherwise.
50
+         */
51
+        public function HasSpecialLogUsers() {
52
+            return !empty($this->specialLogUsers);
53
+        }
54
+
55
+        /**
56
+         * Indicates if the user is in the special log users.
57
+         *
58
+         * @param string $user
59
+         *
60
+         * @return bool
61
+         */
62
+        public function IsUserInSpecialLogUsers($user) {
63
+            if (isset($this->isUserInSpecialLogUsers[$user])) {
64
+                return true;
65
+            }
66
+            if ($this->HasSpecialLogUsers()) {
67
+                $specialLogUsers = $this->GetSpecialLogUsers();
68
+                if (array_search($user, $specialLogUsers, true) !== false) {
69
+                    $this->isUserInSpecialLogUsers[$user] = true;
70
+
71
+                    return true;
72
+                }
73
+            }
74
+
75
+            return false;
76
+        }
77
+
78
+        /**
79
+         * Returns the current special log users array.
80
+         *
81
+         * @return array
82
+         */
83
+        public function GetSpecialLogUsers() {
84
+            return $this->specialLogUsers;
85
+        }
86
+
87
+        /**
88
+         * Sets the current special log users array.
89
+         */
90
+        public function SetSpecialLogUsers(array $value) {
91
+            $this->isUserInSpecialLogUsers = []; // reset cache
92
+            $this->specialLogUsers = $value;
93
+        }
94
+
95
+        /**
96
+         * Check that the current login user is in the special log user array.
97
+         * This call is equivalent to `$this->IsUserInSpecialLogUsers($this->GetUser())` at the exception that this
98
+         * call uses cache so there won't be more than one check to the specialLogUser for the login user.
99
+         *
100
+         * @return bool true if user exist in special log user array else false
101
+         */
102
+        public function IsAuthUserInSpecialLogUsers() {
103
+            if ($this->isAuthUserInSpecialLogUsers) {
104
+                return true;
105
+            }
106
+            if ($this->IsUserInSpecialLogUsers($this->GetUser())) {
107
+                $this->isAuthUserInSpecialLogUsers = true;
108
+
109
+                return true;
110
+            }
111
+
112
+            return false;
113
+        }
114
+
115
+        /**
116
+         * Logs a message with a given log level.
117
+         *
118
+         * @param {int} $logLevel The log level which will be configured in config file
119
+         * @param {string} $message The log message which we want to log in user specific log file
120
+         * @param {boolean|array} $detailMessage (optional) The detailed log message. it can be Error/Exception array.
121
+         * @param {boolean|array} $request (optional) The request log the the request data which sent by the user
122
+         */
123
+        public function Log($logLevel, $message, $detailMessage = false, $request = false) {
124
+            if ($logLevel <= LOG_USER_LEVEL) {
125
+                if ($this->IsAuthUserInSpecialLogUsers()) {
126
+                    $this->Write($logLevel, $message, $detailMessage, $request);
127
+                }
128
+            }
129
+        }
130
+
131
+        /**
132
+         * Returns the string representation of the given $loglevel.
133
+         *
134
+         * @param {int} $loglevel one of the LOGLEVELs
135
+         *
136
+         * @return string
137
+         */
138
+        protected function GetLogLevelString($loglevel) {
139
+            switch ($loglevel) {
140
+                case LOGLEVEL_OFF:          return ""; break;
141
+
142
+                case LOGLEVEL_FATAL:        return "[FATAL]"; break;
143
+
144
+                case LOGLEVEL_ERROR:        return "[ERROR]"; break;
145
+
146
+                case LOGLEVEL_WARN:         return "[WARN]"; break;
147
+
148
+                case LOGLEVEL_INFO:         return "[INFO]"; break;
149
+
150
+                case LOGLEVEL_DEBUG:        return "[DEBUG]"; break;
151
+            }
152
+        }
153
+
154
+        /**
155
+         * Writes a log message to the general log.
156
+         *
157
+         * @param {int} $logLevel The log level which will be configured in config file
158
+         * @param {string} $message The log message which we want to log in user specific log file
159
+         * @param {boolean|array} $detailMessage (optional) The detailed log message. it can be Error/Exception array.
160
+         * @param {boolean|array} $request (optional) The request log the the request data which sent by the user
161
+         */
162
+        abstract protected function Write($logLevel, $message, $detailMessage, $request);
163
+    }
Please login to merge, or discard this patch.