Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/scapy/layers/x509.py: 84%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

410 statements  

1# SPDX-License-Identifier: GPL-2.0-only 

2# This file is part of Scapy 

3# See https://scapy.net/ for more information 

4# Copyright (C) Philippe Biondi <phil@secdev.org> 

5# Acknowledgment: Maxence Tury <maxence.tury@ssi.gouv.fr> 

6 

7# Cool history about this file: http://natisbad.org/scapy/index.html 

8 

9""" 

10X.509 certificates. 

11""" 

12 

13from scapy.asn1.mib import conf # loads conf.mib 

14from scapy.asn1.asn1 import ASN1_Codecs, ASN1_OID, \ 

15 ASN1_IA5_STRING, ASN1_NULL, ASN1_PRINTABLE_STRING, \ 

16 ASN1_UTC_TIME, ASN1_UTF8_STRING 

17from scapy.asn1packet import ASN1_Packet 

18from scapy.asn1fields import ( 

19 ASN1F_BIT_STRING_ENCAPS, 

20 ASN1F_BIT_STRING, 

21 ASN1F_BMP_STRING, 

22 ASN1F_BOOLEAN, 

23 ASN1F_CHOICE, 

24 ASN1F_enum_INTEGER, 

25 ASN1F_ENUMERATED, 

26 ASN1F_field, 

27 ASN1F_FLAGS, 

28 ASN1F_GENERALIZED_TIME, 

29 ASN1F_IA5_STRING, 

30 ASN1F_INTEGER, 

31 ASN1F_ISO646_STRING, 

32 ASN1F_NULL, 

33 ASN1F_OID, 

34 ASN1F_optional, 

35 ASN1F_PACKET, 

36 ASN1F_PRINTABLE_STRING, 

37 ASN1F_SEQUENCE_OF, 

38 ASN1F_SEQUENCE, 

39 ASN1F_SET_OF, 

40 ASN1F_STRING_PacketField, 

41 ASN1F_STRING, 

42 ASN1F_T61_STRING, 

43 ASN1F_UNIVERSAL_STRING, 

44 ASN1F_UTC_TIME, 

45 ASN1F_UTF8_STRING, 

46) 

47from scapy.packet import Packet 

48from scapy.fields import PacketField, MultipleTypeField 

49from scapy.volatile import ZuluTime, GeneralizedTime 

50from scapy.compat import plain_str 

51 

52 

53class ASN1P_OID(ASN1_Packet): 

54 ASN1_codec = ASN1_Codecs.BER 

55 ASN1_root = ASN1F_OID("oid", "0") 

56 

57 

58class ASN1P_INTEGER(ASN1_Packet): 

59 ASN1_codec = ASN1_Codecs.BER 

60 ASN1_root = ASN1F_INTEGER("number", 0) 

61 

62 

63class ASN1P_PRIVSEQ(ASN1_Packet): 

64 # This class gets used in x509.uts 

65 # It showcases the private high-tag decoding capacities of scapy. 

66 ASN1_codec = ASN1_Codecs.BER 

67 ASN1_root = ASN1F_SEQUENCE( 

68 ASN1F_IA5_STRING("str", ""), 

69 ASN1F_STRING("int", 0), 

70 explicit_tag=0, 

71 flexible_tag=True) 

72 

73 

74####################### 

75# RSA packets # 

76####################### 

77# based on RFC 3447 

78 

79# It could be interesting to use os.urandom and try to generate 

80# a new modulus each time RSAPublicKey is called with default values. 

81# (We might have to dig into scapy field initialization mechanisms...) 

82# NEVER rely on the key below, which is provided only for debugging purposes. 

83class RSAPublicKey(ASN1_Packet): 

84 ASN1_codec = ASN1_Codecs.BER 

85 ASN1_root = ASN1F_SEQUENCE( 

86 ASN1F_INTEGER("modulus", 10), 

87 ASN1F_INTEGER("publicExponent", 3)) 

88 

89 

90class RSAOtherPrimeInfo(ASN1_Packet): 

91 ASN1_codec = ASN1_Codecs.BER 

92 ASN1_root = ASN1F_SEQUENCE( 

93 ASN1F_INTEGER("prime", 0), 

94 ASN1F_INTEGER("exponent", 0), 

95 ASN1F_INTEGER("coefficient", 0)) 

96 

97 

98class RSAPrivateKey(ASN1_Packet): 

99 ASN1_codec = ASN1_Codecs.BER 

100 ASN1_root = ASN1F_SEQUENCE( 

101 ASN1F_enum_INTEGER("version", 0, ["two-prime", "multi"]), 

102 ASN1F_INTEGER("modulus", 10), 

103 ASN1F_INTEGER("publicExponent", 3), 

104 ASN1F_INTEGER("privateExponent", 3), 

105 ASN1F_INTEGER("prime1", 2), 

106 ASN1F_INTEGER("prime2", 5), 

107 ASN1F_INTEGER("exponent1", 0), 

108 ASN1F_INTEGER("exponent2", 3), 

109 ASN1F_INTEGER("coefficient", 1), 

110 ASN1F_optional( 

111 ASN1F_SEQUENCE_OF("otherPrimeInfos", None, 

112 RSAOtherPrimeInfo))) 

113 

114#################################### 

115# ECDSA packets # 

116#################################### 

117# based on RFC 3279 & 5480 & 5915 

118 

119 

120class ECFieldID(ASN1_Packet): 

121 # No characteristic-two-field support for now. 

122 ASN1_codec = ASN1_Codecs.BER 

123 ASN1_root = ASN1F_SEQUENCE( 

124 ASN1F_OID("fieldType", "prime-field"), 

125 ASN1F_INTEGER("prime", 0)) 

126 

127 

128class ECCurve(ASN1_Packet): 

129 ASN1_codec = ASN1_Codecs.BER 

130 ASN1_root = ASN1F_SEQUENCE( 

131 ASN1F_STRING("a", ""), 

132 ASN1F_STRING("b", ""), 

133 ASN1F_optional( 

134 ASN1F_BIT_STRING("seed", None))) 

135 

136 

137class ECSpecifiedDomain(ASN1_Packet): 

138 ASN1_codec = ASN1_Codecs.BER 

139 ASN1_root = ASN1F_SEQUENCE( 

140 ASN1F_enum_INTEGER("version", 1, {1: "ecpVer1"}), 

141 ASN1F_PACKET("fieldID", ECFieldID(), ECFieldID), 

142 ASN1F_PACKET("curve", ECCurve(), ECCurve), 

143 ASN1F_STRING("base", ""), 

144 ASN1F_INTEGER("order", 0), 

145 ASN1F_optional( 

146 ASN1F_INTEGER("cofactor", None))) 

147 

148 

149class ECParameters(ASN1_Packet): 

150 ASN1_codec = ASN1_Codecs.BER 

151 ASN1_root = ASN1F_CHOICE("curve", ASN1_OID("ansip384r1"), 

152 ASN1F_OID, # for named curves 

153 ASN1F_NULL, # for implicit curves 

154 ECSpecifiedDomain) 

155 

156 

157class ECDSAPublicKey(ASN1_Packet): 

158 ASN1_codec = ASN1_Codecs.BER 

159 ASN1_root = ASN1F_BIT_STRING("ecPoint", "") 

160 

161 

162class ECDSAPrivateKey(ASN1_Packet): 

163 ASN1_codec = ASN1_Codecs.BER 

164 ASN1_root = ASN1F_SEQUENCE( 

165 ASN1F_enum_INTEGER("version", 1, {1: "ecPrivkeyVer1"}), 

166 ASN1F_STRING("privateKey", ""), 

167 ASN1F_optional( 

168 ASN1F_PACKET("parameters", None, ECParameters, 

169 explicit_tag=0xa0)), 

170 ASN1F_optional( 

171 ASN1F_PACKET("publicKey", None, 

172 ECDSAPublicKey, 

173 explicit_tag=0xa1))) 

174 

175 

176class ECDSASignature(ASN1_Packet): 

177 ASN1_codec = ASN1_Codecs.BER 

178 ASN1_root = ASN1F_SEQUENCE( 

179 ASN1F_INTEGER("r", 0), 

180 ASN1F_INTEGER("s", 0)) 

181 

182 

183#################################### 

184# x25519/x448 packets # 

185#################################### 

186# based on RFC 8410 

187 

188class EdDSAPublicKey(ASN1_Packet): 

189 ASN1_codec = ASN1_Codecs.BER 

190 ASN1_root = ASN1F_BIT_STRING("ecPoint", "") 

191 

192 

193class AlgorithmIdentifier(ASN1_Packet): 

194 ASN1_codec = ASN1_Codecs.BER 

195 ASN1_root = ASN1F_SEQUENCE( 

196 ASN1F_OID("algorithm", None), 

197 ) 

198 

199 

200class EdDSAPrivateKey(ASN1_Packet): 

201 ASN1_codec = ASN1_Codecs.BER 

202 ASN1_root = ASN1F_SEQUENCE( 

203 ASN1F_enum_INTEGER("version", 1, {1: "ecPrivkeyVer1"}), 

204 ASN1F_PACKET("privateKeyAlgorithm", AlgorithmIdentifier(), AlgorithmIdentifier), 

205 ASN1F_STRING("privateKey", ""), 

206 ASN1F_optional( 

207 ASN1F_PACKET("publicKey", None, 

208 ECDSAPublicKey, 

209 explicit_tag=0xa1))) 

210 

211 

212###################### 

213# X509 packets # 

214###################### 

215# based on RFC 5280 

216 

217 

218# Names # 

219 

220class ASN1F_X509_DirectoryString(ASN1F_CHOICE): 

221 # we include ASN1 bit strings and bmp strings for rare instances of x500 addresses 

222 def __init__(self, name, default, **kwargs): 

223 ASN1F_CHOICE.__init__(self, name, default, 

224 ASN1F_PRINTABLE_STRING, ASN1F_UTF8_STRING, 

225 ASN1F_IA5_STRING, ASN1F_T61_STRING, 

226 ASN1F_UNIVERSAL_STRING, ASN1F_BIT_STRING, 

227 ASN1F_BMP_STRING, 

228 **kwargs) 

229 

230 

231class X509_AttributeValue(ASN1_Packet): 

232 ASN1_codec = ASN1_Codecs.BER 

233 ASN1_root = ASN1F_CHOICE("value", ASN1_PRINTABLE_STRING("FR"), 

234 ASN1F_PRINTABLE_STRING, ASN1F_UTF8_STRING, 

235 ASN1F_IA5_STRING, ASN1F_T61_STRING, 

236 ASN1F_UNIVERSAL_STRING) 

237 

238 

239class X509_Attribute(ASN1_Packet): 

240 ASN1_codec = ASN1_Codecs.BER 

241 ASN1_root = ASN1F_SEQUENCE( 

242 ASN1F_OID("type", "2.5.4.6"), 

243 ASN1F_SET_OF("values", 

244 [X509_AttributeValue()], 

245 X509_AttributeValue)) 

246 

247 

248class X509_AttributeTypeAndValue(ASN1_Packet): 

249 ASN1_codec = ASN1_Codecs.BER 

250 ASN1_root = ASN1F_SEQUENCE( 

251 ASN1F_OID("type", "2.5.4.6"), 

252 ASN1F_X509_DirectoryString("value", 

253 ASN1_PRINTABLE_STRING("FR"))) 

254 

255 

256class X509_RDN(ASN1_Packet): 

257 ASN1_codec = ASN1_Codecs.BER 

258 ASN1_root = ASN1F_SET_OF("rdn", [X509_AttributeTypeAndValue()], 

259 X509_AttributeTypeAndValue) 

260 

261 

262class X509_OtherName(ASN1_Packet): 

263 ASN1_codec = ASN1_Codecs.BER 

264 ASN1_root = ASN1F_SEQUENCE( 

265 ASN1F_OID("type_id", "0"), 

266 ASN1F_CHOICE("value", None, 

267 ASN1F_IA5_STRING, ASN1F_ISO646_STRING, 

268 ASN1F_BMP_STRING, ASN1F_UTF8_STRING, 

269 ASN1F_STRING, 

270 explicit_tag=0xa0)) 

271 

272 

273class ASN1F_X509_otherName(ASN1F_SEQUENCE): 

274 # field version of X509_OtherName, for usage in [MS-WCCE] 

275 def __init__(self, **kargs): 

276 seq = [ASN1F_SEQUENCE(*X509_OtherName.ASN1_root.seq, 

277 implicit_tag=0xA0)] 

278 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

279 

280 

281class X509_RFC822Name(ASN1_Packet): 

282 ASN1_codec = ASN1_Codecs.BER 

283 ASN1_root = ASN1F_IA5_STRING("rfc822Name", "") 

284 

285 

286class X509_DNSName(ASN1_Packet): 

287 ASN1_codec = ASN1_Codecs.BER 

288 ASN1_root = ASN1F_IA5_STRING("dNSName", "") 

289 

290# XXX write me 

291 

292 

293class X509_X400Address(ASN1_Packet): 

294 ASN1_codec = ASN1_Codecs.BER 

295 ASN1_root = ASN1F_field("x400Address", "") 

296 

297 

298_default_directoryName = [ 

299 X509_RDN(), 

300 X509_RDN( 

301 rdn=[X509_AttributeTypeAndValue( 

302 type=ASN1_OID("2.5.4.10"), 

303 value=ASN1_PRINTABLE_STRING("Scapy, Inc."))]), 

304 X509_RDN( 

305 rdn=[X509_AttributeTypeAndValue( 

306 type=ASN1_OID("2.5.4.3"), 

307 value=ASN1_PRINTABLE_STRING("Scapy Default Name"))]) 

308] 

309 

310 

311class X509_DirectoryName(ASN1_Packet): 

312 ASN1_codec = ASN1_Codecs.BER 

313 ASN1_root = ASN1F_SEQUENCE_OF("directoryName", _default_directoryName, 

314 X509_RDN) 

315 

316 

317class X509_EDIPartyName(ASN1_Packet): 

318 ASN1_codec = ASN1_Codecs.BER 

319 ASN1_root = ASN1F_SEQUENCE( 

320 ASN1F_optional( 

321 ASN1F_X509_DirectoryString("nameAssigner", None, 

322 explicit_tag=0xa0)), 

323 ASN1F_X509_DirectoryString("partyName", None, 

324 explicit_tag=0xa1)) 

325 

326 

327class X509_URI(ASN1_Packet): 

328 ASN1_codec = ASN1_Codecs.BER 

329 ASN1_root = ASN1F_IA5_STRING("uniformResourceIdentifier", "") 

330 

331 

332class X509_IPAddress(ASN1_Packet): 

333 ASN1_codec = ASN1_Codecs.BER 

334 ASN1_root = ASN1F_STRING("iPAddress", "") 

335 

336 

337class X509_RegisteredID(ASN1_Packet): 

338 ASN1_codec = ASN1_Codecs.BER 

339 ASN1_root = ASN1F_OID("registeredID", "") 

340 

341 

342class X509_GeneralName(ASN1_Packet): 

343 ASN1_codec = ASN1_Codecs.BER 

344 ASN1_root = ASN1F_CHOICE("generalName", X509_DirectoryName(), 

345 ASN1F_PACKET("otherName", None, X509_OtherName, 

346 implicit_tag=0xa0), 

347 ASN1F_PACKET("rfc822Name", None, X509_RFC822Name, 

348 implicit_tag=0x81), 

349 ASN1F_PACKET("dNSName", None, X509_DNSName, 

350 implicit_tag=0x82), 

351 ASN1F_PACKET("x400Address", None, X509_X400Address, # noqa: E501 

352 explicit_tag=0xa3), 

353 ASN1F_PACKET("directoryName", None, X509_DirectoryName, # noqa: E501 

354 explicit_tag=0xa4), 

355 ASN1F_PACKET("ediPartyName", None, X509_EDIPartyName, # noqa: E501 

356 explicit_tag=0xa5), 

357 ASN1F_PACKET("uniformResourceIdentifier", None, X509_URI, # noqa: E501 

358 implicit_tag=0x86), 

359 ASN1F_PACKET("ipAddress", None, X509_IPAddress, 

360 implicit_tag=0x87), 

361 ASN1F_PACKET("registeredID", None, X509_RegisteredID, # noqa: E501 

362 implicit_tag=0x88)) 

363 

364 

365# Extensions # 

366 

367class X509_ExtAuthorityKeyIdentifier(ASN1_Packet): 

368 ASN1_codec = ASN1_Codecs.BER 

369 ASN1_root = ASN1F_SEQUENCE( 

370 ASN1F_optional( 

371 ASN1F_STRING("keyIdentifier", b"\xff" * 20, 

372 implicit_tag=0x80)), 

373 ASN1F_optional( 

374 ASN1F_SEQUENCE_OF("authorityCertIssuer", None, 

375 X509_GeneralName, 

376 implicit_tag=0xa1)), 

377 ASN1F_optional( 

378 ASN1F_INTEGER("authorityCertSerialNumber", None, 

379 implicit_tag=0x82))) 

380 

381 

382class X509_ExtSubjectDirectoryAttributes(ASN1_Packet): 

383 ASN1_codec = ASN1_Codecs.BER 

384 ASN1_root = ASN1F_SEQUENCE_OF("subjectDirectoryAttributes", 

385 [X509_Attribute()], 

386 X509_Attribute) 

387 

388 

389class X509_ExtSubjectKeyIdentifier(ASN1_Packet): 

390 ASN1_codec = ASN1_Codecs.BER 

391 ASN1_root = ASN1F_STRING("keyIdentifier", "xff" * 20) 

392 

393 

394class X509_ExtFullName(ASN1_Packet): 

395 ASN1_codec = ASN1_Codecs.BER 

396 ASN1_root = ASN1F_SEQUENCE_OF("fullName", [X509_GeneralName()], 

397 X509_GeneralName, implicit_tag=0xa0) 

398 

399 

400class X509_ExtNameRelativeToCRLIssuer(ASN1_Packet): 

401 ASN1_codec = ASN1_Codecs.BER 

402 ASN1_root = ASN1F_PACKET("nameRelativeToCRLIssuer", X509_RDN(), X509_RDN, 

403 implicit_tag=0xa1) 

404 

405 

406class X509_ExtDistributionPointName(ASN1_Packet): 

407 ASN1_codec = ASN1_Codecs.BER 

408 ASN1_root = ASN1F_CHOICE("distributionPointName", None, 

409 X509_ExtFullName, X509_ExtNameRelativeToCRLIssuer) 

410 

411 

412_reasons_mapping = ["unused", 

413 "keyCompromise", 

414 "cACompromise", 

415 "affiliationChanged", 

416 "superseded", 

417 "cessationOfOperation", 

418 "certificateHold", 

419 "privilegeWithdrawn", 

420 "aACompromise"] 

421 

422 

423class X509_ExtDistributionPoint(ASN1_Packet): 

424 ASN1_codec = ASN1_Codecs.BER 

425 ASN1_root = ASN1F_SEQUENCE( 

426 ASN1F_optional( 

427 ASN1F_PACKET("distributionPoint", 

428 X509_ExtDistributionPointName(), 

429 X509_ExtDistributionPointName, 

430 explicit_tag=0xa0)), 

431 ASN1F_optional( 

432 ASN1F_FLAGS("reasons", None, _reasons_mapping, 

433 implicit_tag=0x81)), 

434 ASN1F_optional( 

435 ASN1F_SEQUENCE_OF("cRLIssuer", None, 

436 X509_GeneralName, 

437 implicit_tag=0xa2))) 

438 

439 

440_ku_mapping = ["digitalSignature", 

441 "nonRepudiation", 

442 "keyEncipherment", 

443 "dataEncipherment", 

444 "keyAgreement", 

445 "keyCertSign", 

446 "cRLSign", 

447 "encipherOnly", 

448 "decipherOnly"] 

449 

450 

451class X509_ExtKeyUsage(ASN1_Packet): 

452 ASN1_codec = ASN1_Codecs.BER 

453 ASN1_root = ASN1F_FLAGS("keyUsage", "101", _ku_mapping) 

454 

455 def get_keyUsage(self): 

456 return self.ASN1_root.get_flags(self) 

457 

458 

459class X509_ExtPrivateKeyUsagePeriod(ASN1_Packet): 

460 ASN1_codec = ASN1_Codecs.BER 

461 ASN1_root = ASN1F_SEQUENCE( 

462 ASN1F_optional( 

463 ASN1F_GENERALIZED_TIME("notBefore", 

464 str(GeneralizedTime(-600)), 

465 implicit_tag=0x80)), 

466 ASN1F_optional( 

467 ASN1F_GENERALIZED_TIME("notAfter", 

468 str(GeneralizedTime(+86400)), 

469 implicit_tag=0x81))) 

470 

471 

472class X509_PolicyMapping(ASN1_Packet): 

473 ASN1_codec = ASN1_Codecs.BER 

474 ASN1_root = ASN1F_SEQUENCE( 

475 ASN1F_OID("issuerDomainPolicy", None), 

476 ASN1F_OID("subjectDomainPolicy", None)) 

477 

478 

479class X509_ExtPolicyMappings(ASN1_Packet): 

480 ASN1_codec = ASN1_Codecs.BER 

481 ASN1_root = ASN1F_SEQUENCE_OF("policyMappings", [], X509_PolicyMapping) 

482 

483 

484class X509_ExtBasicConstraints(ASN1_Packet): 

485 # The cA field should not be optional, but some certs omit it for False. 

486 ASN1_codec = ASN1_Codecs.BER 

487 ASN1_root = ASN1F_SEQUENCE( 

488 ASN1F_optional( 

489 ASN1F_BOOLEAN("cA", False)), 

490 ASN1F_optional( 

491 ASN1F_INTEGER("pathLenConstraint", None))) 

492 

493 

494class X509_ExtCRLNumber(ASN1_Packet): 

495 ASN1_codec = ASN1_Codecs.BER 

496 ASN1_root = ASN1F_INTEGER("cRLNumber", 0) 

497 

498 

499_cRL_reasons = ["unspecified", 

500 "keyCompromise", 

501 "cACompromise", 

502 "affiliationChanged", 

503 "superseded", 

504 "cessationOfOperation", 

505 "certificateHold", 

506 "unused_reasonCode", 

507 "removeFromCRL", 

508 "privilegeWithdrawn", 

509 "aACompromise"] 

510 

511 

512class X509_ExtReasonCode(ASN1_Packet): 

513 ASN1_codec = ASN1_Codecs.BER 

514 ASN1_root = ASN1F_ENUMERATED("cRLReason", 0, _cRL_reasons) 

515 

516 

517class X509_ExtDeltaCRLIndicator(ASN1_Packet): 

518 ASN1_codec = ASN1_Codecs.BER 

519 ASN1_root = ASN1F_INTEGER("deltaCRLIndicator", 0) 

520 

521 

522class X509_ExtIssuingDistributionPoint(ASN1_Packet): 

523 ASN1_codec = ASN1_Codecs.BER 

524 ASN1_root = ASN1F_SEQUENCE( 

525 ASN1F_optional( 

526 ASN1F_PACKET("distributionPoint", 

527 X509_ExtDistributionPointName(), 

528 X509_ExtDistributionPointName, 

529 explicit_tag=0xa0)), 

530 ASN1F_BOOLEAN("onlyContainsUserCerts", False, 

531 implicit_tag=0x81), 

532 ASN1F_BOOLEAN("onlyContainsCACerts", False, 

533 implicit_tag=0x82), 

534 ASN1F_optional( 

535 ASN1F_FLAGS("onlySomeReasons", None, 

536 _reasons_mapping, 

537 implicit_tag=0x83)), 

538 ASN1F_BOOLEAN("indirectCRL", False, 

539 implicit_tag=0x84), 

540 ASN1F_BOOLEAN("onlyContainsAttributeCerts", False, 

541 implicit_tag=0x85)) 

542 

543 

544class X509_ExtCertificateIssuer(ASN1_Packet): 

545 ASN1_codec = ASN1_Codecs.BER 

546 ASN1_root = ASN1F_SEQUENCE_OF("certificateIssuer", [], X509_GeneralName) 

547 

548 

549class X509_ExtInvalidityDate(ASN1_Packet): 

550 ASN1_codec = ASN1_Codecs.BER 

551 ASN1_root = ASN1F_GENERALIZED_TIME("invalidityDate", str(ZuluTime(+86400))) 

552 

553 

554class X509_ExtSubjectAltName(ASN1_Packet): 

555 ASN1_codec = ASN1_Codecs.BER 

556 ASN1_root = ASN1F_SEQUENCE_OF("subjectAltName", [], X509_GeneralName) 

557 

558 

559class X509_ExtIssuerAltName(ASN1_Packet): 

560 ASN1_codec = ASN1_Codecs.BER 

561 ASN1_root = ASN1F_SEQUENCE_OF("issuerAltName", [], X509_GeneralName) 

562 

563 

564class X509_ExtGeneralSubtree(ASN1_Packet): 

565 # 'minimum' is not optional in RFC 5280, yet it is in some implementations. 

566 ASN1_codec = ASN1_Codecs.BER 

567 ASN1_root = ASN1F_SEQUENCE( 

568 ASN1F_PACKET("base", X509_GeneralName(), X509_GeneralName), 

569 ASN1F_optional( 

570 ASN1F_INTEGER("minimum", None, implicit_tag=0x80)), 

571 ASN1F_optional( 

572 ASN1F_INTEGER("maximum", None, implicit_tag=0x81))) 

573 

574 

575class X509_ExtNameConstraints(ASN1_Packet): 

576 ASN1_codec = ASN1_Codecs.BER 

577 ASN1_root = ASN1F_SEQUENCE( 

578 ASN1F_optional( 

579 ASN1F_SEQUENCE_OF("permittedSubtrees", None, 

580 X509_ExtGeneralSubtree, 

581 implicit_tag=0xa0)), 

582 ASN1F_optional( 

583 ASN1F_SEQUENCE_OF("excludedSubtrees", None, 

584 X509_ExtGeneralSubtree, 

585 implicit_tag=0xa1))) 

586 

587 

588class X509_ExtPolicyConstraints(ASN1_Packet): 

589 ASN1_codec = ASN1_Codecs.BER 

590 ASN1_root = ASN1F_SEQUENCE( 

591 ASN1F_optional( 

592 ASN1F_INTEGER("requireExplicitPolicy", None, 

593 implicit_tag=0x80)), 

594 ASN1F_optional( 

595 ASN1F_INTEGER("inhibitPolicyMapping", None, 

596 implicit_tag=0x81))) 

597 

598 

599class X509_ExtExtendedKeyUsage(ASN1_Packet): 

600 ASN1_codec = ASN1_Codecs.BER 

601 ASN1_root = ASN1F_SEQUENCE_OF("extendedKeyUsage", [], ASN1P_OID) 

602 

603 def get_extendedKeyUsage(self): 

604 eku_array = self.extendedKeyUsage 

605 return [eku.oid.oidname for eku in eku_array] 

606 

607 

608class X509_ExtNoticeReference(ASN1_Packet): 

609 ASN1_codec = ASN1_Codecs.BER 

610 ASN1_root = ASN1F_SEQUENCE( 

611 ASN1F_CHOICE("organization", 

612 ASN1_UTF8_STRING("Dummy Organization"), 

613 ASN1F_IA5_STRING, ASN1F_ISO646_STRING, 

614 ASN1F_BMP_STRING, ASN1F_UTF8_STRING), 

615 ASN1F_SEQUENCE_OF("noticeNumbers", [], ASN1P_INTEGER)) 

616 

617 

618class X509_ExtUserNotice(ASN1_Packet): 

619 ASN1_codec = ASN1_Codecs.BER 

620 ASN1_root = ASN1F_SEQUENCE( 

621 ASN1F_optional( 

622 ASN1F_PACKET("noticeRef", None, 

623 X509_ExtNoticeReference)), 

624 ASN1F_optional( 

625 ASN1F_CHOICE("explicitText", 

626 ASN1_UTF8_STRING("Dummy ExplicitText"), 

627 ASN1F_IA5_STRING, ASN1F_ISO646_STRING, 

628 ASN1F_BMP_STRING, ASN1F_UTF8_STRING))) 

629 

630 

631class X509_ExtPolicyQualifierInfo(ASN1_Packet): 

632 ASN1_codec = ASN1_Codecs.BER 

633 ASN1_root = ASN1F_SEQUENCE( 

634 ASN1F_OID("policyQualifierId", "1.3.6.1.5.5.7.2.1"), 

635 ASN1F_CHOICE("qualifier", ASN1_IA5_STRING("cps_str"), 

636 ASN1F_IA5_STRING, X509_ExtUserNotice)) 

637 

638 

639class X509_ExtPolicyInformation(ASN1_Packet): 

640 ASN1_codec = ASN1_Codecs.BER 

641 ASN1_root = ASN1F_SEQUENCE( 

642 ASN1F_OID("policyIdentifier", "2.5.29.32.0"), 

643 ASN1F_optional( 

644 ASN1F_SEQUENCE_OF("policyQualifiers", None, 

645 X509_ExtPolicyQualifierInfo))) 

646 

647 

648class X509_ExtCertificatePolicies(ASN1_Packet): 

649 ASN1_codec = ASN1_Codecs.BER 

650 ASN1_root = ASN1F_SEQUENCE_OF("certificatePolicies", 

651 [X509_ExtPolicyInformation()], 

652 X509_ExtPolicyInformation) 

653 

654 

655class X509_ExtCRLDistributionPoints(ASN1_Packet): 

656 ASN1_codec = ASN1_Codecs.BER 

657 ASN1_root = ASN1F_SEQUENCE_OF("cRLDistributionPoints", 

658 [X509_ExtDistributionPoint()], 

659 X509_ExtDistributionPoint) 

660 

661 

662class X509_ExtInhibitAnyPolicy(ASN1_Packet): 

663 ASN1_codec = ASN1_Codecs.BER 

664 ASN1_root = ASN1F_INTEGER("skipCerts", 0) 

665 

666 

667class X509_ExtFreshestCRL(ASN1_Packet): 

668 ASN1_codec = ASN1_Codecs.BER 

669 ASN1_root = ASN1F_SEQUENCE_OF("cRLDistributionPoints", 

670 [X509_ExtDistributionPoint()], 

671 X509_ExtDistributionPoint) 

672 

673 

674class X509_AccessDescription(ASN1_Packet): 

675 ASN1_codec = ASN1_Codecs.BER 

676 ASN1_root = ASN1F_SEQUENCE( 

677 ASN1F_OID("accessMethod", "0"), 

678 ASN1F_PACKET("accessLocation", X509_GeneralName(), 

679 X509_GeneralName)) 

680 

681 

682class X509_ExtAuthInfoAccess(ASN1_Packet): 

683 ASN1_codec = ASN1_Codecs.BER 

684 ASN1_root = ASN1F_SEQUENCE_OF("authorityInfoAccess", 

685 [X509_AccessDescription()], 

686 X509_AccessDescription) 

687 

688 

689class X509_ExtQcStatement(ASN1_Packet): 

690 ASN1_codec = ASN1_Codecs.BER 

691 ASN1_root = ASN1F_SEQUENCE( 

692 ASN1F_OID("statementId", "0.4.0.1862.1.1"), 

693 ASN1F_optional( 

694 ASN1F_field("statementInfo", None))) 

695 

696 

697class X509_ExtQcStatements(ASN1_Packet): 

698 ASN1_codec = ASN1_Codecs.BER 

699 ASN1_root = ASN1F_SEQUENCE_OF("qcStatements", 

700 [X509_ExtQcStatement()], 

701 X509_ExtQcStatement) 

702 

703 

704class X509_ExtSubjInfoAccess(ASN1_Packet): 

705 ASN1_codec = ASN1_Codecs.BER 

706 ASN1_root = ASN1F_SEQUENCE_OF("subjectInfoAccess", 

707 [X509_AccessDescription()], 

708 X509_AccessDescription) 

709 

710 

711class X509_ExtNetscapeCertType(ASN1_Packet): 

712 ASN1_codec = ASN1_Codecs.BER 

713 ASN1_root = ASN1F_BIT_STRING("netscapeCertType", "") 

714 

715 

716class X509_ExtComment(ASN1_Packet): 

717 ASN1_codec = ASN1_Codecs.BER 

718 ASN1_root = ASN1F_CHOICE("comment", 

719 ASN1_UTF8_STRING("Dummy comment."), 

720 ASN1F_IA5_STRING, ASN1F_ISO646_STRING, 

721 ASN1F_BMP_STRING, ASN1F_UTF8_STRING) 

722 

723 

724class X509_ExtCertificateTemplateName(ASN1_Packet): 

725 ASN1_codec = ASN1_Codecs.BER 

726 ASN1_root = ASN1F_BMP_STRING("Name", b"") 

727 

728 

729class X509_ExtOidNTDSCaSecurity(ASN1_Packet): 

730 ASN1_codec = ASN1_Codecs.BER 

731 ASN1_root = ASN1F_X509_otherName() 

732 type_id = ASN1_OID("1.3.6.1.4.1.311.25.2.1") 

733 value = ASN1_UTF8_STRING("") 

734 

735 

736# oid-info.com shows that some extensions share multiple OIDs. 

737# Here we only reproduce those written in RFC5280. 

738_ext_mapping = { 

739 "2.5.29.9": X509_ExtSubjectDirectoryAttributes, 

740 "2.5.29.14": X509_ExtSubjectKeyIdentifier, 

741 "2.5.29.15": X509_ExtKeyUsage, 

742 "2.5.29.16": X509_ExtPrivateKeyUsagePeriod, 

743 "2.5.29.17": X509_ExtSubjectAltName, 

744 "2.5.29.18": X509_ExtIssuerAltName, 

745 "2.5.29.19": X509_ExtBasicConstraints, 

746 "2.5.29.20": X509_ExtCRLNumber, 

747 "2.5.29.21": X509_ExtReasonCode, 

748 "2.5.29.24": X509_ExtInvalidityDate, 

749 "2.5.29.27": X509_ExtDeltaCRLIndicator, 

750 "2.5.29.28": X509_ExtIssuingDistributionPoint, 

751 "2.5.29.29": X509_ExtCertificateIssuer, 

752 "2.5.29.30": X509_ExtNameConstraints, 

753 "2.5.29.31": X509_ExtCRLDistributionPoints, 

754 "2.5.29.32": X509_ExtCertificatePolicies, 

755 "2.5.29.33": X509_ExtPolicyMappings, 

756 "2.5.29.35": X509_ExtAuthorityKeyIdentifier, 

757 "2.5.29.36": X509_ExtPolicyConstraints, 

758 "2.5.29.37": X509_ExtExtendedKeyUsage, 

759 "2.5.29.46": X509_ExtFreshestCRL, 

760 "2.5.29.54": X509_ExtInhibitAnyPolicy, 

761 "2.16.840.1.113730.1.1": X509_ExtNetscapeCertType, 

762 "2.16.840.1.113730.1.13": X509_ExtComment, 

763 "1.3.6.1.4.1.311.20.2": X509_ExtCertificateTemplateName, 

764 "1.3.6.1.4.1.311.25.2": X509_ExtOidNTDSCaSecurity, 

765 "1.3.6.1.5.5.7.1.1": X509_ExtAuthInfoAccess, 

766 "1.3.6.1.5.5.7.1.3": X509_ExtQcStatements, 

767 "1.3.6.1.5.5.7.1.11": X509_ExtSubjInfoAccess 

768} 

769 

770 

771class _X509_ExtField(ASN1F_STRING_PacketField): 

772 def m2i(self, pkt, s): 

773 val = super(_X509_ExtField, self).m2i(pkt, s) 

774 if not val[0].val: 

775 return val 

776 if pkt.extnID.val in _ext_mapping: 

777 return ( 

778 _ext_mapping[pkt.extnID.val](val[0].val, _underlayer=pkt), 

779 val[1], 

780 ) 

781 return val 

782 

783 

784class ASN1F_EXT_SEQUENCE(ASN1F_SEQUENCE): 

785 def __init__(self, **kargs): 

786 seq = [ASN1F_OID("extnID", "2.5.29.19"), 

787 ASN1F_optional( 

788 ASN1F_BOOLEAN("critical", False)), 

789 _X509_ExtField("extnValue", X509_ExtBasicConstraints())] 

790 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

791 

792 

793class X509_Extension(ASN1_Packet): 

794 ASN1_codec = ASN1_Codecs.BER 

795 ASN1_root = ASN1F_EXT_SEQUENCE() 

796 

797 

798class X509_Extensions(ASN1_Packet): 

799 # we use this in OCSP status requests, in tls/handshake.py 

800 ASN1_codec = ASN1_Codecs.BER 

801 ASN1_root = ASN1F_optional( 

802 ASN1F_SEQUENCE_OF("extensions", 

803 None, X509_Extension)) 

804 

805 

806# Public key wrapper # 

807 

808class X509_AlgorithmIdentifier(ASN1_Packet): 

809 ASN1_codec = ASN1_Codecs.BER 

810 ASN1_root = ASN1F_SEQUENCE( 

811 ASN1F_OID("algorithm", "1.2.840.113549.1.1.11"), 

812 ASN1F_optional( 

813 ASN1F_CHOICE("parameters", ASN1_NULL(0), 

814 ASN1F_NULL, ECParameters))) 

815 

816 

817class ASN1F_X509_SubjectPublicKeyInfo(ASN1F_SEQUENCE): 

818 def __init__(self, **kargs): 

819 seq = [ASN1F_PACKET("signatureAlgorithm", 

820 X509_AlgorithmIdentifier(), 

821 X509_AlgorithmIdentifier), 

822 MultipleTypeField( 

823 [ 

824 (ASN1F_BIT_STRING_ENCAPS("subjectPublicKey", 

825 RSAPublicKey(), 

826 RSAPublicKey), 

827 lambda pkt: "rsa" in pkt.signatureAlgorithm.algorithm.oidname.lower()), # noqa: E501 

828 (ASN1F_PACKET("subjectPublicKey", 

829 ECDSAPublicKey(), 

830 ECDSAPublicKey), 

831 lambda pkt: "ecPublicKey" == pkt.signatureAlgorithm.algorithm.oidname), # noqa: E501 

832 (ASN1F_PACKET("subjectPublicKey", 

833 EdDSAPublicKey(), 

834 EdDSAPublicKey), 

835 lambda pkt: pkt.signatureAlgorithm.algorithm.oidname in ["Ed25519", "Ed448"]), # noqa: E501 

836 ], 

837 ASN1F_BIT_STRING("subjectPublicKey", ""))] 

838 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

839 

840 

841class X509_SubjectPublicKeyInfo(ASN1_Packet): 

842 ASN1_codec = ASN1_Codecs.BER 

843 ASN1_root = ASN1F_X509_SubjectPublicKeyInfo() 

844 

845 

846# OpenSSL compatibility wrappers # 

847 

848# XXX As ECDSAPrivateKey already uses the structure from RFC 5958, 

849# and as we would prefer encapsulated RSA private keys to be parsed, 

850# this lazy implementation actually supports RSA encoding only. 

851# We'd rather call it RSAPrivateKey_OpenSSL than X509_PrivateKeyInfo. 

852class RSAPrivateKey_OpenSSL(ASN1_Packet): 

853 ASN1_codec = ASN1_Codecs.BER 

854 ASN1_root = ASN1F_SEQUENCE( 

855 ASN1F_enum_INTEGER("version", 0, ["v1", "v2"]), 

856 ASN1F_PACKET("privateKeyAlgorithm", 

857 X509_AlgorithmIdentifier(), 

858 X509_AlgorithmIdentifier), 

859 ASN1F_PACKET("privateKey", 

860 RSAPrivateKey(), 

861 RSAPrivateKey, 

862 explicit_tag=0x04), 

863 ASN1F_optional( 

864 ASN1F_PACKET("parameters", None, ECParameters, 

865 explicit_tag=0xa0)), 

866 ASN1F_optional( 

867 ASN1F_PACKET("publicKey", None, 

868 ECDSAPublicKey, 

869 explicit_tag=0xa1))) 

870 

871# We need this hack because ECParameters parsing below must return 

872# a Padding payload, and making the ASN1_Packet class have Padding 

873# instead of Raw payload would break things... 

874 

875 

876class _PacketFieldRaw(PacketField): 

877 def getfield(self, pkt, s): 

878 i = self.m2i(pkt, s) 

879 remain = "" 

880 if conf.raw_layer in i: 

881 r = i[conf.raw_layer] 

882 del r.underlayer.payload 

883 remain = r.load 

884 return remain, i 

885 

886 

887class ECDSAPrivateKey_OpenSSL(Packet): 

888 name = "ECDSA Params + Private Key" 

889 fields_desc = [_PacketFieldRaw("ecparam", 

890 ECParameters(), 

891 ECParameters), 

892 PacketField("privateKey", 

893 ECDSAPrivateKey(), 

894 ECDSAPrivateKey)] 

895 

896 

897# TBSCertificate & Certificate # 

898 

899_default_issuer = [ 

900 X509_RDN(), 

901 X509_RDN( 

902 rdn=[X509_AttributeTypeAndValue( 

903 type=ASN1_OID("2.5.4.10"), 

904 value=ASN1_PRINTABLE_STRING("Scapy, Inc."))]), 

905 X509_RDN( 

906 rdn=[X509_AttributeTypeAndValue( 

907 type=ASN1_OID("2.5.4.3"), 

908 value=ASN1_PRINTABLE_STRING("Scapy Default Issuer"))]) 

909] 

910 

911_default_subject = [ 

912 X509_RDN(), 

913 X509_RDN( 

914 rdn=[X509_AttributeTypeAndValue( 

915 type=ASN1_OID("2.5.4.10"), 

916 value=ASN1_PRINTABLE_STRING("Scapy, Inc."))]), 

917 X509_RDN( 

918 rdn=[X509_AttributeTypeAndValue( 

919 type=ASN1_OID("2.5.4.3"), 

920 value=ASN1_PRINTABLE_STRING("Scapy Default Subject"))]) 

921] 

922 

923 

924class X509_Validity(ASN1_Packet): 

925 ASN1_codec = ASN1_Codecs.BER 

926 ASN1_root = ASN1F_SEQUENCE( 

927 ASN1F_CHOICE("not_before", 

928 ASN1_UTC_TIME(str(ZuluTime(-600))), 

929 ASN1F_UTC_TIME, ASN1F_GENERALIZED_TIME), 

930 ASN1F_CHOICE("not_after", 

931 ASN1_UTC_TIME(str(ZuluTime(+86400))), 

932 ASN1F_UTC_TIME, ASN1F_GENERALIZED_TIME)) 

933 

934 

935_attrName_mapping = [ 

936 ("countryName", "C"), 

937 ("stateOrProvinceName", "ST"), 

938 ("localityName", "L"), 

939 ("organizationName", "O"), 

940 ("organizationUnitName", "OU"), 

941 ("commonName", "CN") 

942] 

943_attrName_specials = [name for name, symbol in _attrName_mapping] 

944 

945 

946class X509_TBSCertificate(ASN1_Packet): 

947 ASN1_codec = ASN1_Codecs.BER 

948 ASN1_root = ASN1F_SEQUENCE( 

949 ASN1F_optional( 

950 ASN1F_enum_INTEGER("version", 0x2, ["v1", "v2", "v3"], 

951 explicit_tag=0xa0)), 

952 ASN1F_INTEGER("serialNumber", 1), 

953 ASN1F_PACKET("signature", 

954 X509_AlgorithmIdentifier(), 

955 X509_AlgorithmIdentifier), 

956 ASN1F_SEQUENCE_OF("issuer", _default_issuer, X509_RDN), 

957 ASN1F_PACKET("validity", 

958 X509_Validity(), 

959 X509_Validity), 

960 ASN1F_SEQUENCE_OF("subject", _default_subject, X509_RDN), 

961 ASN1F_PACKET("subjectPublicKeyInfo", 

962 X509_SubjectPublicKeyInfo(), 

963 X509_SubjectPublicKeyInfo), 

964 ASN1F_optional( 

965 ASN1F_BIT_STRING("issuerUniqueID", None, 

966 implicit_tag=0x81)), 

967 ASN1F_optional( 

968 ASN1F_BIT_STRING("subjectUniqueID", None, 

969 implicit_tag=0x82)), 

970 ASN1F_optional( 

971 ASN1F_SEQUENCE_OF("extensions", 

972 [X509_Extension()], 

973 X509_Extension, 

974 explicit_tag=0xa3))) 

975 

976 def get_issuer(self): 

977 attrs = self.issuer 

978 attrsDict = {} 

979 for attr in attrs: 

980 # we assume there is only one name in each rdn ASN1_SET 

981 attrsDict[attr.rdn[0].type.oidname] = plain_str(attr.rdn[0].value.val) # noqa: E501 

982 return attrsDict 

983 

984 def get_issuer_str(self): 

985 """ 

986 Returns a one-line string containing every type/value 

987 in a rather specific order. sorted() built-in ensures unicity. 

988 """ 

989 name_str = "" 

990 attrsDict = self.get_issuer() 

991 for attrType, attrSymbol in _attrName_mapping: 

992 if attrType in attrsDict: 

993 name_str += "/" + attrSymbol + "=" 

994 name_str += attrsDict[attrType] 

995 for attrType in sorted(attrsDict): 

996 if attrType not in _attrName_specials: 

997 name_str += "/" + attrType + "=" 

998 name_str += attrsDict[attrType] 

999 return name_str 

1000 

1001 def get_subject(self): 

1002 attrs = self.subject 

1003 attrsDict = {} 

1004 for attr in attrs: 

1005 # we assume there is only one name in each rdn ASN1_SET 

1006 attrsDict[attr.rdn[0].type.oidname] = plain_str(attr.rdn[0].value.val) # noqa: E501 

1007 return attrsDict 

1008 

1009 def get_subject_str(self): 

1010 name_str = "" 

1011 attrsDict = self.get_subject() 

1012 for attrType, attrSymbol in _attrName_mapping: 

1013 if attrType in attrsDict: 

1014 name_str += "/" + attrSymbol + "=" 

1015 name_str += attrsDict[attrType] 

1016 for attrType in sorted(attrsDict): 

1017 if attrType not in _attrName_specials: 

1018 name_str += "/" + attrType + "=" 

1019 name_str += attrsDict[attrType] 

1020 return name_str 

1021 

1022 

1023class ASN1F_X509_Cert(ASN1F_SEQUENCE): 

1024 def __init__(self, **kargs): 

1025 seq = [ASN1F_PACKET("tbsCertificate", 

1026 X509_TBSCertificate(), 

1027 X509_TBSCertificate), 

1028 ASN1F_PACKET("signatureAlgorithm", 

1029 X509_AlgorithmIdentifier(), 

1030 X509_AlgorithmIdentifier), 

1031 MultipleTypeField( 

1032 [ 

1033 (ASN1F_BIT_STRING_ENCAPS("signatureValue", 

1034 ECDSASignature(), 

1035 ECDSASignature), 

1036 lambda pkt: "ecdsa" in pkt.signatureAlgorithm.algorithm.oidname.lower()), # noqa: E501 

1037 ], 

1038 ASN1F_BIT_STRING("signatureValue", 

1039 "defaultsignature" * 2))] 

1040 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

1041 

1042 

1043class X509_Cert(ASN1_Packet): 

1044 ASN1_codec = ASN1_Codecs.BER 

1045 ASN1_root = ASN1F_X509_Cert() 

1046 

1047 

1048# TBSCertList & CRL # 

1049 

1050class X509_RevokedCertificate(ASN1_Packet): 

1051 ASN1_codec = ASN1_Codecs.BER 

1052 ASN1_root = ASN1F_SEQUENCE(ASN1F_INTEGER("serialNumber", 1), 

1053 ASN1F_UTC_TIME("revocationDate", 

1054 str(ZuluTime(+86400))), 

1055 ASN1F_optional( 

1056 ASN1F_SEQUENCE_OF("crlEntryExtensions", 

1057 None, X509_Extension))) 

1058 

1059 

1060class X509_TBSCertList(ASN1_Packet): 

1061 ASN1_codec = ASN1_Codecs.BER 

1062 ASN1_root = ASN1F_SEQUENCE( 

1063 ASN1F_optional( 

1064 ASN1F_enum_INTEGER("version", 1, ["v1", "v2"])), 

1065 ASN1F_PACKET("signature", 

1066 X509_AlgorithmIdentifier(), 

1067 X509_AlgorithmIdentifier), 

1068 ASN1F_SEQUENCE_OF("issuer", _default_issuer, X509_RDN), 

1069 ASN1F_UTC_TIME("this_update", str(ZuluTime(-1))), 

1070 ASN1F_optional( 

1071 ASN1F_UTC_TIME("next_update", None)), 

1072 ASN1F_optional( 

1073 ASN1F_SEQUENCE_OF("revokedCertificates", None, 

1074 X509_RevokedCertificate)), 

1075 ASN1F_optional( 

1076 ASN1F_SEQUENCE_OF("crlExtensions", None, 

1077 X509_Extension, 

1078 explicit_tag=0xa0))) 

1079 

1080 def get_issuer(self): 

1081 attrs = self.issuer 

1082 attrsDict = {} 

1083 for attr in attrs: 

1084 # we assume there is only one name in each rdn ASN1_SET 

1085 attrsDict[attr.rdn[0].type.oidname] = plain_str(attr.rdn[0].value.val) # noqa: E501 

1086 return attrsDict 

1087 

1088 def get_issuer_str(self): 

1089 """ 

1090 Returns a one-line string containing every type/value 

1091 in a rather specific order. sorted() built-in ensures unicity. 

1092 """ 

1093 name_str = "" 

1094 attrsDict = self.get_issuer() 

1095 for attrType, attrSymbol in _attrName_mapping: 

1096 if attrType in attrsDict: 

1097 name_str += "/" + attrSymbol + "=" 

1098 name_str += attrsDict[attrType] 

1099 for attrType in sorted(attrsDict): 

1100 if attrType not in _attrName_specials: 

1101 name_str += "/" + attrType + "=" 

1102 name_str += attrsDict[attrType] 

1103 return name_str 

1104 

1105 

1106class ASN1F_X509_CRL(ASN1F_SEQUENCE): 

1107 def __init__(self, **kargs): 

1108 seq = [ASN1F_PACKET("tbsCertList", 

1109 X509_TBSCertList(), 

1110 X509_TBSCertList), 

1111 ASN1F_PACKET("signatureAlgorithm", 

1112 X509_AlgorithmIdentifier(), 

1113 X509_AlgorithmIdentifier), 

1114 MultipleTypeField( 

1115 [ 

1116 (ASN1F_BIT_STRING_ENCAPS("signatureValue", 

1117 ECDSASignature(), 

1118 ECDSASignature), 

1119 lambda pkt: "ecdsa" in pkt.signatureAlgorithm.algorithm.oidname.lower()), # noqa: E501 

1120 ], 

1121 ASN1F_BIT_STRING("signatureValue", 

1122 "defaultsignature" * 2))] 

1123 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

1124 

1125 

1126class X509_CRL(ASN1_Packet): 

1127 ASN1_codec = ASN1_Codecs.BER 

1128 ASN1_root = ASN1F_X509_CRL() 

1129 

1130 

1131############################# 

1132# OCSP Status packets # 

1133############################# 

1134# based on RFC 6960 

1135 

1136class OCSP_CertID(ASN1_Packet): 

1137 ASN1_codec = ASN1_Codecs.BER 

1138 ASN1_root = ASN1F_SEQUENCE( 

1139 ASN1F_PACKET("hashAlgorithm", 

1140 X509_AlgorithmIdentifier(), 

1141 X509_AlgorithmIdentifier), 

1142 ASN1F_STRING("issuerNameHash", ""), 

1143 ASN1F_STRING("issuerKeyHash", ""), 

1144 ASN1F_INTEGER("serialNumber", 0)) 

1145 

1146 

1147class OCSP_GoodInfo(ASN1_Packet): 

1148 ASN1_codec = ASN1_Codecs.BER 

1149 ASN1_root = ASN1F_NULL("info", 0) 

1150 

1151 

1152class OCSP_RevokedInfo(ASN1_Packet): 

1153 ASN1_codec = ASN1_Codecs.BER 

1154 ASN1_root = ASN1F_SEQUENCE( 

1155 ASN1F_GENERALIZED_TIME("revocationTime", ""), 

1156 ASN1F_optional( 

1157 ASN1F_PACKET("revocationReason", None, 

1158 X509_ExtReasonCode, 

1159 explicit_tag=0xa0))) 

1160 

1161 

1162class OCSP_UnknownInfo(ASN1_Packet): 

1163 ASN1_codec = ASN1_Codecs.BER 

1164 ASN1_root = ASN1F_NULL("info", 0) 

1165 

1166 

1167class OCSP_CertStatus(ASN1_Packet): 

1168 ASN1_codec = ASN1_Codecs.BER 

1169 ASN1_root = ASN1F_CHOICE("certStatus", None, 

1170 ASN1F_PACKET("good", OCSP_GoodInfo(), 

1171 OCSP_GoodInfo, implicit_tag=0x80), 

1172 ASN1F_PACKET("revoked", OCSP_RevokedInfo(), 

1173 OCSP_RevokedInfo, implicit_tag=0xa1), 

1174 ASN1F_PACKET("unknown", OCSP_UnknownInfo(), 

1175 OCSP_UnknownInfo, implicit_tag=0x82)) 

1176 

1177 

1178class OCSP_SingleResponse(ASN1_Packet): 

1179 ASN1_codec = ASN1_Codecs.BER 

1180 ASN1_root = ASN1F_SEQUENCE( 

1181 ASN1F_PACKET("certID", OCSP_CertID(), OCSP_CertID), 

1182 ASN1F_PACKET("certStatus", OCSP_CertStatus(certStatus=OCSP_GoodInfo()), 

1183 OCSP_CertStatus), 

1184 ASN1F_GENERALIZED_TIME("thisUpdate", ""), 

1185 ASN1F_optional( 

1186 ASN1F_GENERALIZED_TIME("nextUpdate", "", 

1187 explicit_tag=0xa0)), 

1188 ASN1F_optional( 

1189 ASN1F_SEQUENCE_OF("singleExtensions", None, 

1190 X509_Extension, 

1191 explicit_tag=0xa1))) 

1192 

1193 

1194class OCSP_ByName(ASN1_Packet): 

1195 ASN1_codec = ASN1_Codecs.BER 

1196 ASN1_root = ASN1F_SEQUENCE_OF("byName", [], X509_RDN) 

1197 

1198 

1199class OCSP_ByKey(ASN1_Packet): 

1200 ASN1_codec = ASN1_Codecs.BER 

1201 ASN1_root = ASN1F_STRING("byKey", "") 

1202 

1203 

1204class OCSP_ResponderID(ASN1_Packet): 

1205 ASN1_codec = ASN1_Codecs.BER 

1206 ASN1_root = ASN1F_CHOICE("responderID", None, 

1207 ASN1F_PACKET("byName", OCSP_ByName(), OCSP_ByName, 

1208 explicit_tag=0xa1), 

1209 ASN1F_PACKET("byKey", OCSP_ByKey(), OCSP_ByKey, 

1210 explicit_tag=0xa2)) 

1211 

1212 

1213class OCSP_ResponseData(ASN1_Packet): 

1214 ASN1_codec = ASN1_Codecs.BER 

1215 ASN1_root = ASN1F_SEQUENCE( 

1216 ASN1F_optional( 

1217 ASN1F_enum_INTEGER("version", 0, {0: "v1"}, 

1218 explicit_tag=0x80)), 

1219 ASN1F_PACKET("responderID", OCSP_ResponderID(responderID=OCSP_ByName()), 

1220 OCSP_ResponderID), 

1221 ASN1F_GENERALIZED_TIME("producedAt", 

1222 str(GeneralizedTime())), 

1223 ASN1F_SEQUENCE_OF("responses", [], OCSP_SingleResponse), 

1224 ASN1F_optional( 

1225 ASN1F_SEQUENCE_OF("responseExtensions", None, 

1226 X509_Extension, 

1227 explicit_tag=0xa1))) 

1228 

1229 

1230class ASN1F_OCSP_BasicResponse(ASN1F_SEQUENCE): 

1231 def __init__(self, **kargs): 

1232 seq = [ASN1F_PACKET("tbsResponseData", 

1233 OCSP_ResponseData(), 

1234 OCSP_ResponseData), 

1235 ASN1F_PACKET("signatureAlgorithm", 

1236 X509_AlgorithmIdentifier(), 

1237 X509_AlgorithmIdentifier), 

1238 MultipleTypeField( 

1239 [ 

1240 (ASN1F_BIT_STRING_ENCAPS("signature", 

1241 ECDSASignature(), 

1242 ECDSASignature), 

1243 lambda pkt: "ecdsa" in pkt.signatureAlgorithm.algorithm.oidname.lower()), # noqa: E501 

1244 ], 

1245 ASN1F_BIT_STRING("signature", 

1246 "defaultsignature" * 2)), 

1247 ASN1F_optional( 

1248 ASN1F_SEQUENCE_OF("certs", None, X509_Cert, 

1249 explicit_tag=0xa0))] 

1250 ASN1F_SEQUENCE.__init__(self, *seq, **kargs) 

1251 

1252 

1253class OCSP_ResponseBytes(ASN1_Packet): 

1254 ASN1_codec = ASN1_Codecs.BER 

1255 ASN1_root = ASN1F_SEQUENCE( 

1256 ASN1F_OID("responseType", "1.3.6.1.5.5.7.48.1.1"), 

1257 ASN1F_OCSP_BasicResponse(explicit_tag=0x04)) 

1258 

1259 

1260_responseStatus_mapping = ["successful", 

1261 "malformedRequest", 

1262 "internalError", 

1263 "tryLater", 

1264 "notUsed", 

1265 "sigRequired", 

1266 "unauthorized"] 

1267 

1268 

1269class OCSP_Response(ASN1_Packet): 

1270 ASN1_codec = ASN1_Codecs.BER 

1271 ASN1_root = ASN1F_SEQUENCE( 

1272 ASN1F_ENUMERATED("responseStatus", 0, 

1273 _responseStatus_mapping), 

1274 ASN1F_optional( 

1275 ASN1F_PACKET("responseBytes", None, 

1276 OCSP_ResponseBytes, 

1277 explicit_tag=0xa0)))