1use std::str::FromStr;
11
12use pyo3::prelude::*;
13
14use synta::ObjectIdentifier;
15
16use crate::types::PyObjectIdentifier;
17
18pub mod ac;
19pub mod ace88;
20pub mod acme;
21pub mod cert;
22pub mod cert_builder;
23pub mod cmp;
24pub mod cms;
25pub mod crmf;
26pub mod csr_builder;
27pub mod ess;
28pub mod general_name;
29pub mod kem;
30pub mod key_types;
31pub mod logotype;
32pub mod ms_pki;
33pub mod name_builder;
34pub mod pkcs5;
35pub mod pkcs8;
36pub mod pkcs9;
37pub mod pkix;
38pub mod pkixalgs;
39pub mod tsp;
40
41use ac::register_ac_submodule;
42use ace88::register_ace88_classes;
43use acme::register_acme_submodule;
44use cert::{PyCertificate, PyPolicyInformation, PyPolicyQualifier};
45use cert_builder::PyCertificateBuilder;
46use cmp::register_cmp_submodule;
47use cms::register_cms_submodule;
48use crmf::register_crmf_submodule;
49use csr_builder::PyCsrBuilder;
50use ess::register_ess_classes;
51use kem::register_kem_submodule;
52use key_types::{PyMlDsaPrivateKey, PyMlDsaPublicKey, PyRsaPublicKey, PyRsassaPssParams};
53use logotype::register_logotype_classes;
54use ms_pki::register_ms_pki_submodule;
55use name_builder::PyNameBuilder;
56use pkcs5::register_pkcs5_submodule;
57use pkcs8::register_pkcs8_submodule;
58use pkcs9::register_pkcs9_submodule;
59use pkix::{
60 PyCertID, PyCertificateListBuilder, PyCrl, PyCsr, PyOCSPCertIDSpec, PyOCSPRequestBuilder,
61 PyOCSPResponseBuilder, PyOCSPSingleResponse, PyOcspRequest, PyOcspResponse,
62};
63use pkixalgs::{register_pkixalgs_submodule, PyAlgorithmIdentifier};
64use tsp::register_tsp_classes;
65
66pub use pkix::{
67 create_pkcs12, encode_extended_key_usage, encode_subject_alt_names,
68 load_der_pkcs7_certificates, load_pem_pkcs7_certificates, load_pkcs12,
69 load_pkcs12_certificates, load_pkcs12_keys, name_der_equal, read_pki_blocks,
70};
71
72pub(crate) fn oid_from_pyany(obj: &Bound<'_, PyAny>) -> PyResult<ObjectIdentifier> {
75 if let Ok(oid_ref) = obj.extract::<PyRef<PyObjectIdentifier>>() {
76 return Ok(oid_ref.inner.clone());
77 }
78 if let Ok(s) = obj.extract::<String>() {
79 return ObjectIdentifier::from_str(&s)
80 .map_err(|_| pyo3::exceptions::PyValueError::new_err(format!("invalid OID: {s}")));
81 }
82 Err(pyo3::exceptions::PyTypeError::new_err(
83 "oid must be a str or ObjectIdentifier",
84 ))
85}
86
87pub(crate) fn oid_const(py: Python<'_>, components: &[u32]) -> Py<PyAny> {
93 let inner = ObjectIdentifier::new(components)
94 .expect("oid constant has invalid components — bug in synta-certificate");
95 Py::new(py, PyObjectIdentifier::from_oid(inner))
96 .expect("PyObjectIdentifier allocation failed")
97 .into_any()
98}
99
100pub fn register_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
109 m.add_class::<PyAlgorithmIdentifier>()?;
110 m.add_class::<PyObjectIdentifier>()?;
111 m.add_class::<PyPolicyQualifier>()?;
112 m.add_class::<PyPolicyInformation>()?;
113 m.add_class::<PyCertificate>()?;
114 m.add_class::<PyCertificateBuilder>()?;
115 m.add_class::<PyCsrBuilder>()?;
116 m.add_class::<PyNameBuilder>()?;
117 m.add_class::<PyCsr>()?;
118 m.add_class::<PyCrl>()?;
119 m.add_class::<PyCertificateListBuilder>()?;
120 m.add_class::<PyOcspResponse>()?;
121 m.add_class::<PyOcspRequest>()?;
122 m.add_class::<PyCertID>()?;
123 m.add_class::<PyOCSPSingleResponse>()?;
124 m.add_class::<PyOCSPResponseBuilder>()?;
125 m.add_class::<PyOCSPCertIDSpec>()?;
126 m.add_class::<PyOCSPRequestBuilder>()?;
127 m.add_class::<PyMlDsaPrivateKey>()?;
128 m.add_class::<PyMlDsaPublicKey>()?;
129 m.add_class::<PyRsaPublicKey>()?;
130 m.add_class::<PyRsassaPssParams>()?;
131 let py = m.py();
135 m.add(
136 "ML_DSA_44",
137 oid_const(py, synta_certificate::oids::ML_DSA_44),
138 )?;
139 m.add(
140 "ML_DSA_65",
141 oid_const(py, synta_certificate::oids::ML_DSA_65),
142 )?;
143 m.add(
144 "ML_DSA_87",
145 oid_const(py, synta_certificate::oids::ML_DSA_87),
146 )?;
147 m.add_function(wrap_pyfunction!(load_der_pkcs7_certificates, m)?)?;
148 m.add_function(wrap_pyfunction!(load_pem_pkcs7_certificates, m)?)?;
149 m.add_function(wrap_pyfunction!(load_pkcs12_certificates, m)?)?;
150 m.add_function(wrap_pyfunction!(load_pkcs12_keys, m)?)?;
151 m.add_function(wrap_pyfunction!(load_pkcs12, m)?)?;
152 m.add_function(wrap_pyfunction!(read_pki_blocks, m)?)?;
153 m.add_function(wrap_pyfunction!(create_pkcs12, m)?)?;
154 register_tsp_classes(m)?;
155 register_ess_classes(m)?;
156 register_logotype_classes(m)?;
157 register_ace88_classes(m)?;
158 register_oids_submodule(m)?;
159 register_cms_submodule(m)?;
160 register_general_name_submodule(m)?;
161 register_pkixalgs_submodule(m)?;
162 register_kem_submodule(m)?;
163 register_ac_submodule(m)?;
164 register_crmf_submodule(m)?;
165 register_cmp_submodule(m)?;
166 register_ms_pki_submodule(m)?;
167 register_pkcs8_submodule(m)?;
168 register_pkcs9_submodule(m)?;
169 register_pkcs5_submodule(m)?;
170 register_acme_submodule(m)?;
171 Ok(())
172}
173
174#[pyfunction]
187fn identify_signature_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<&'static str> {
188 let inner = oid_from_pyany(oid)?;
189 Ok(synta_certificate::identify_signature_algorithm(&inner))
190}
191
192#[pyfunction]
200fn identify_public_key_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
201 let inner = oid_from_pyany(oid)?;
202 Ok(synta_certificate::identify_public_key_algorithm(&inner))
203}
204
205#[pyfunction]
212fn ec_curve_short_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
213 let inner = oid_from_pyany(oid)?;
214 Ok(synta_certificate::ec_curve_short_name(inner.components()))
215}
216
217#[pyfunction]
224fn ec_curve_nist_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
225 let inner = oid_from_pyany(oid)?;
226 Ok(synta_certificate::ec_curve_nist_name(inner.components()))
227}
228
229#[pyfunction]
237fn ec_curve_key_bits(oid: &Bound<'_, PyAny>) -> PyResult<Option<usize>> {
238 let inner = oid_from_pyany(oid)?;
239 Ok(synta_certificate::ec_curve_key_bits(inner.components()))
240}
241
242#[pyfunction]
250fn extension_oid_name(oid: &Bound<'_, PyAny>) -> PyResult<String> {
251 let inner = oid_from_pyany(oid)?;
252 Ok(synta_certificate::extension_oid_name(&inner))
253}
254
255fn register_oids_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
262 let py = parent.py();
263 let m = PyModule::new(py, "oids")?;
264
265 m.add(
267 "ML_DSA_44",
268 oid_const(py, synta_certificate::oids::ML_DSA_44),
269 )?;
270 m.add(
271 "ML_DSA_65",
272 oid_const(py, synta_certificate::oids::ML_DSA_65),
273 )?;
274 m.add(
275 "ML_DSA_87",
276 oid_const(py, synta_certificate::oids::ML_DSA_87),
277 )?;
278
279 m.add(
281 "ML_KEM_512",
282 oid_const(py, synta_certificate::oids::ML_KEM_512),
283 )?;
284 m.add(
285 "ML_KEM_768",
286 oid_const(py, synta_certificate::oids::ML_KEM_768),
287 )?;
288 m.add(
289 "ML_KEM_1024",
290 oid_const(py, synta_certificate::oids::ML_KEM_1024),
291 )?;
292
293 m.add(
295 "SLH_DSA_SHA2_128S",
296 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128S),
297 )?;
298 m.add(
299 "SLH_DSA_SHA2_128F",
300 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128F),
301 )?;
302 m.add(
303 "SLH_DSA_SHA2_192S",
304 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192S),
305 )?;
306 m.add(
307 "SLH_DSA_SHA2_192F",
308 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192F),
309 )?;
310 m.add(
311 "SLH_DSA_SHA2_256S",
312 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256S),
313 )?;
314 m.add(
315 "SLH_DSA_SHA2_256F",
316 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256F),
317 )?;
318 m.add(
319 "SLH_DSA_SHAKE_128S",
320 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128S),
321 )?;
322 m.add(
323 "SLH_DSA_SHAKE_128F",
324 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128F),
325 )?;
326 m.add(
327 "SLH_DSA_SHAKE_192S",
328 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192S),
329 )?;
330 m.add(
331 "SLH_DSA_SHAKE_192F",
332 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192F),
333 )?;
334 m.add(
335 "SLH_DSA_SHAKE_256S",
336 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256S),
337 )?;
338 m.add(
339 "SLH_DSA_SHAKE_256F",
340 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256F),
341 )?;
342
343 m.add("ED25519", oid_const(py, synta_certificate::oids::ED25519))?;
345 m.add("ED448", oid_const(py, synta_certificate::oids::ED448))?;
346
347 m.add(
349 "RSA_ENCRYPTION",
350 oid_const(py, synta_certificate::oids::RSA_ENCRYPTION),
351 )?;
352 m.add(
353 "MD5_WITH_RSA",
354 oid_const(py, synta_certificate::oids::MD5_WITH_RSA),
355 )?;
356 m.add(
357 "SHA1_WITH_RSA",
358 oid_const(py, synta_certificate::oids::SHA1_WITH_RSA),
359 )?;
360 m.add(
361 "SHA256_WITH_RSA",
362 oid_const(py, synta_certificate::oids::SHA256_WITH_RSA),
363 )?;
364 m.add(
365 "SHA384_WITH_RSA",
366 oid_const(py, synta_certificate::oids::SHA384_WITH_RSA),
367 )?;
368 m.add(
369 "SHA512_WITH_RSA",
370 oid_const(py, synta_certificate::oids::SHA512_WITH_RSA),
371 )?;
372 m.add("RSA", oid_const(py, synta_certificate::oids::RSA))?;
374 m.add(
376 "MD2_WITH_RSA",
377 oid_const(py, synta_certificate::oids::MD2_WITH_RSA),
378 )?;
379 m.add(
380 "SHA512_224_WITH_RSA",
381 oid_const(py, synta_certificate::oids::SHA512_224_WITH_RSA),
382 )?;
383 m.add(
384 "SHA512_256_WITH_RSA",
385 oid_const(py, synta_certificate::oids::SHA512_256_WITH_RSA),
386 )?;
387 m.add(
388 "RSASSA_PSS",
389 oid_const(py, synta_certificate::oids::RSASSA_PSS),
390 )?;
391 m.add(
392 "RSAES_OAEP",
393 oid_const(py, synta_certificate::oids::RSAES_OAEP),
394 )?;
395 m.add("MGF1", oid_const(py, synta_certificate::oids::MGF1))?;
396 m.add(
397 "P_SPECIFIED",
398 oid_const(py, synta_certificate::oids::P_SPECIFIED),
399 )?;
400
401 m.add(
403 "EC_PUBLIC_KEY",
404 oid_const(py, synta_certificate::oids::EC_PUBLIC_KEY),
405 )?;
406 m.add(
407 "ECDSA_WITH_SHA1",
408 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA1),
409 )?;
410 m.add(
411 "ECDSA_WITH_SHA256",
412 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA256),
413 )?;
414 m.add(
415 "ECDSA_WITH_SHA384",
416 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA384),
417 )?;
418 m.add(
419 "ECDSA_WITH_SHA512",
420 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA512),
421 )?;
422 m.add("ECDSA", oid_const(py, synta_certificate::oids::ECDSA_SIG))?;
424
425 m.add(
427 "EC_CURVE_P256",
428 oid_const(py, synta_certificate::oids::EC_CURVE_P256),
429 )?;
430 m.add(
431 "EC_CURVE_P384",
432 oid_const(py, synta_certificate::oids::EC_CURVE_P384),
433 )?;
434 m.add(
435 "EC_CURVE_P521",
436 oid_const(py, synta_certificate::oids::EC_CURVE_P521),
437 )?;
438 m.add(
439 "EC_CURVE_SECP256K1",
440 oid_const(py, synta_certificate::oids::EC_CURVE_SECP256K1),
441 )?;
442
443 m.add("SHA224", oid_const(py, synta_certificate::oids::ID_SHA224))?;
445 m.add("SHA256", oid_const(py, synta_certificate::oids::ID_SHA256))?;
446 m.add("SHA384", oid_const(py, synta_certificate::oids::ID_SHA384))?;
447 m.add("SHA512", oid_const(py, synta_certificate::oids::ID_SHA512))?;
448 m.add(
449 "SHA512_224",
450 oid_const(py, synta_certificate::oids::ID_SHA512_224),
451 )?;
452 m.add(
453 "SHA512_256",
454 oid_const(py, synta_certificate::oids::ID_SHA512_256),
455 )?;
456
457 m.add(
459 "SHA3_224",
460 oid_const(py, synta_certificate::oids::ID_SHA3_224),
461 )?;
462 m.add(
463 "SHA3_256",
464 oid_const(py, synta_certificate::oids::ID_SHA3_256),
465 )?;
466 m.add(
467 "SHA3_384",
468 oid_const(py, synta_certificate::oids::ID_SHA3_384),
469 )?;
470 m.add(
471 "SHA3_512",
472 oid_const(py, synta_certificate::oids::ID_SHA3_512),
473 )?;
474 m.add(
475 "SHAKE128",
476 oid_const(py, synta_certificate::oids::ID_SHAKE128),
477 )?;
478 m.add(
479 "SHAKE256",
480 oid_const(py, synta_certificate::oids::ID_SHAKE256),
481 )?;
482
483 m.add(
485 "SUBJECT_KEY_IDENTIFIER",
486 oid_const(py, synta_certificate::oids::SUBJECT_KEY_IDENTIFIER),
487 )?;
488 m.add(
489 "KEY_USAGE",
490 oid_const(py, synta_certificate::oids::KEY_USAGE),
491 )?;
492 m.add(
493 "SUBJECT_ALT_NAME",
494 oid_const(py, synta_certificate::oids::SUBJECT_ALT_NAME),
495 )?;
496 m.add(
497 "ISSUER_ALT_NAME",
498 oid_const(py, synta_certificate::oids::ISSUER_ALT_NAME),
499 )?;
500 m.add(
501 "BASIC_CONSTRAINTS",
502 oid_const(py, synta_certificate::oids::BASIC_CONSTRAINTS),
503 )?;
504 m.add(
505 "CRL_NUMBER",
506 oid_const(py, synta_certificate::oids::CRL_NUMBER),
507 )?;
508 m.add(
509 "CRL_DISTRIBUTION_POINTS",
510 oid_const(py, synta_certificate::oids::CRL_DISTRIBUTION_POINTS),
511 )?;
512 m.add(
513 "NAME_CONSTRAINTS",
514 oid_const(py, synta_certificate::oids::NAME_CONSTRAINTS),
515 )?;
516 m.add(
517 "CERTIFICATE_POLICIES",
518 oid_const(py, synta_certificate::oids::CERTIFICATE_POLICIES),
519 )?;
520 m.add(
521 "AUTHORITY_KEY_IDENTIFIER",
522 oid_const(py, synta_certificate::oids::AUTHORITY_KEY_IDENTIFIER),
523 )?;
524 m.add(
525 "EXTENDED_KEY_USAGE",
526 oid_const(py, synta_certificate::oids::EXTENDED_KEY_USAGE),
527 )?;
528 m.add(
529 "AUTHORITY_INFO_ACCESS",
530 oid_const(py, synta_certificate::oids::AUTHORITY_INFO_ACCESS),
531 )?;
532 m.add(
533 "CT_PRECERT_SCTS",
534 oid_const(py, synta_certificate::oids::CT_PRECERT_SCTS),
535 )?;
536 m.add(
537 "PE_ACME_IDENTIFIER",
538 oid_const(py, synta_certificate::oids::PE_ACME_IDENTIFIER),
539 )?;
540
541 m.add(
543 "KP_SERVER_AUTH",
544 oid_const(py, synta_certificate::oids::KP_SERVER_AUTH),
545 )?;
546 m.add(
547 "KP_CLIENT_AUTH",
548 oid_const(py, synta_certificate::oids::KP_CLIENT_AUTH),
549 )?;
550 m.add(
551 "KP_CODE_SIGNING",
552 oid_const(py, synta_certificate::oids::KP_CODE_SIGNING),
553 )?;
554 m.add(
555 "KP_EMAIL_PROTECTION",
556 oid_const(py, synta_certificate::oids::KP_EMAIL_PROTECTION),
557 )?;
558 m.add(
559 "KP_TIME_STAMPING",
560 oid_const(py, synta_certificate::oids::KP_TIME_STAMPING),
561 )?;
562 m.add(
563 "KP_OCSP_SIGNING",
564 oid_const(py, synta_certificate::oids::KP_OCSP_SIGNING),
565 )?;
566 m.add(
567 "ANY_EXTENDED_KEY_USAGE",
568 oid_const(py, synta_certificate::oids::ANY_EXTENDED_KEY_USAGE),
569 )?;
570
571 m.add(
573 "PKINIT_SAN",
574 oid_const(py, synta_certificate::oids::ID_PKINIT_SAN),
575 )?;
576 m.add(
577 "PKINIT_KP_CLIENT_AUTH",
578 oid_const(py, synta_certificate::oids::ID_PKINIT_KPCLIENT_AUTH),
579 )?;
580 m.add(
581 "PKINIT_KP_KDC",
582 oid_const(py, synta_certificate::oids::ID_PKINIT_KPKDC),
583 )?;
584 m.add(
585 "PKINIT_AUTH_DATA",
586 oid_const(py, synta_certificate::oids::ID_PKINIT_AUTH_DATA),
587 )?;
588 m.add(
589 "PKINIT_DHKEY_DATA",
590 oid_const(py, synta_certificate::oids::ID_PKINIT_DHKEY_DATA),
591 )?;
592 m.add(
593 "PKINIT_RKEY_DATA",
594 oid_const(py, synta_certificate::oids::ID_PKINIT_RKEY_DATA),
595 )?;
596 m.add(
597 "PKINIT_KDF",
598 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF),
599 )?;
600 m.add(
601 "PKINIT_KDF_SHA1",
602 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA1),
603 )?;
604 m.add(
605 "PKINIT_KDF_SHA256",
606 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA256),
607 )?;
608 m.add(
609 "PKINIT_KDF_SHA384",
610 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA384),
611 )?;
612 m.add(
613 "PKINIT_KDF_SHA512",
614 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA512),
615 )?;
616
617 m.add(
619 "MS_SAN_UPN",
620 oid_const(py, synta_certificate::oids::ID_MS_SAN_UPN),
621 )?;
622 m.add(
623 "MS_CERTIFICATE_TEMPLATE_NAME",
624 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE_NAME),
625 )?;
626 m.add(
627 "MS_CERTIFICATE_TEMPLATE",
628 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE),
629 )?;
630 m.add(
631 "MS_KP_SMARTCARD_LOGON",
632 oid_const(py, synta_certificate::oids::ID_MS_KP_SMARTCARD_LOGON),
633 )?;
634 m.add(
635 "MS_NTDS_REPLICATION",
636 oid_const(py, synta_certificate::oids::ID_MS_NTDS_REPLICATION),
637 )?;
638
639 m.add("CMS_DATA", oid_const(py, synta_certificate::oids::CMS_DATA))?;
641 m.add(
642 "CMS_SIGNED_DATA",
643 oid_const(py, synta_certificate::oids::CMS_SIGNED_DATA),
644 )?;
645 m.add(
646 "CMS_ENVELOPED_DATA",
647 oid_const(py, synta_certificate::oids::CMS_ENVELOPED_DATA),
648 )?;
649 m.add(
650 "CMS_DIGESTED_DATA",
651 oid_const(py, synta_certificate::oids::CMS_DIGESTED_DATA),
652 )?;
653 m.add(
654 "CMS_ENCRYPTED_DATA",
655 oid_const(py, synta_certificate::oids::CMS_ENCRYPTED_DATA),
656 )?;
657 m.add(
658 "CMS_AUTH_DATA",
659 oid_const(py, synta_certificate::oids::CMS_AUTH_DATA),
660 )?;
661 m.add("CMS_ORI", oid_const(py, synta_certificate::oids::CMS_ORI))?;
663 m.add(
664 "CMS_ORI_KEM",
665 oid_const(py, synta_certificate::oids::CMS_ORI_KEM),
666 )?;
667
668 m.add(
670 "PKCS9_EMAIL_ADDRESS",
671 oid_const(py, synta_certificate::oids::PKCS9_EMAIL_ADDRESS),
672 )?;
673 m.add(
674 "PKCS9_CONTENT_TYPE",
675 oid_const(py, synta_certificate::oids::PKCS9_CONTENT_TYPE),
676 )?;
677 m.add(
678 "PKCS9_MESSAGE_DIGEST",
679 oid_const(py, synta_certificate::oids::PKCS9_MESSAGE_DIGEST),
680 )?;
681 m.add(
682 "PKCS9_SIGNING_TIME",
683 oid_const(py, synta_certificate::oids::PKCS9_SIGNING_TIME),
684 )?;
685 m.add(
686 "PKCS9_COUNTERSIGNATURE",
687 oid_const(py, synta_certificate::oids::PKCS9_COUNTERSIGNATURE),
688 )?;
689 m.add(
690 "PKCS9_CHALLENGE_PASSWORD",
691 oid_const(py, synta_certificate::oids::PKCS9_CHALLENGE_PASSWORD),
692 )?;
693 m.add(
694 "PKCS9_EXTENSION_REQUEST",
695 oid_const(py, synta_certificate::oids::PKCS9_EXTENSION_REQUEST),
696 )?;
697 m.add(
698 "PKCS9_FRIENDLY_NAME",
699 oid_const(py, synta_certificate::oids::PKCS9_FRIENDLY_NAME),
700 )?;
701 m.add(
702 "PKCS9_LOCAL_KEY_ID",
703 oid_const(py, synta_certificate::oids::PKCS9_LOCAL_KEY_ID),
704 )?;
705
706 m.add(
708 "ALG_UNSIGNED",
709 oid_const(py, synta_certificate::oids::ALG_UNSIGNED),
710 )?;
711 m.add(
712 "RDNA_UNSIGNED",
713 oid_const(py, synta_certificate::oids::RDNA_UNSIGNED),
714 )?;
715
716 m.add_function(wrap_pyfunction!(identify_signature_algorithm, &m)?)?;
718 m.add_function(wrap_pyfunction!(identify_public_key_algorithm, &m)?)?;
719 m.add_function(wrap_pyfunction!(ec_curve_short_name, &m)?)?;
720 m.add_function(wrap_pyfunction!(ec_curve_nist_name, &m)?)?;
721 m.add_function(wrap_pyfunction!(ec_curve_key_bits, &m)?)?;
722 m.add_function(wrap_pyfunction!(extension_oid_name, &m)?)?;
723
724 let attr = PyModule::new(py, "attr")?;
726 attr.add(
727 "__doc__",
728 "OIDs for X.500 Distinguished Name attribute types (RFC 4519).",
729 )?;
730 attr.add(
731 "COMMON_NAME",
732 oid_const(py, synta_certificate::oids::attr::COMMON_NAME),
733 )?;
734 attr.add(
735 "COUNTRY",
736 oid_const(py, synta_certificate::oids::attr::COUNTRY),
737 )?;
738 attr.add("STATE", oid_const(py, synta_certificate::oids::attr::STATE))?;
739 attr.add(
740 "LOCALITY",
741 oid_const(py, synta_certificate::oids::attr::LOCALITY),
742 )?;
743 attr.add(
744 "ORGANIZATION",
745 oid_const(py, synta_certificate::oids::attr::ORGANIZATION),
746 )?;
747 attr.add(
748 "ORG_UNIT",
749 oid_const(py, synta_certificate::oids::attr::ORG_UNIT),
750 )?;
751 attr.add(
752 "ORG_IDENTIFIER",
753 oid_const(py, synta_certificate::oids::attr::ORG_IDENTIFIER),
754 )?;
755 attr.add(
756 "STREET",
757 oid_const(py, synta_certificate::oids::attr::STREET),
758 )?;
759 attr.add(
760 "SURNAME",
761 oid_const(py, synta_certificate::oids::attr::SURNAME),
762 )?;
763 attr.add(
764 "GIVEN_NAME",
765 oid_const(py, synta_certificate::oids::attr::GIVEN_NAME),
766 )?;
767 attr.add(
768 "INITIALS",
769 oid_const(py, synta_certificate::oids::attr::INITIALS),
770 )?;
771 attr.add("TITLE", oid_const(py, synta_certificate::oids::attr::TITLE))?;
772 attr.add(
773 "SERIAL_NUMBER",
774 oid_const(py, synta_certificate::oids::attr::SERIAL_NUMBER),
775 )?;
776 attr.add(
777 "EMAIL_ADDRESS",
778 oid_const(py, synta_certificate::oids::attr::EMAIL_ADDRESS),
779 )?;
780 attr.add(
781 "USER_ID",
782 oid_const(py, synta_certificate::oids::attr::USER_ID),
783 )?;
784 attr.add(
785 "DOMAIN_COMPONENT",
786 oid_const(py, synta_certificate::oids::attr::DOMAIN_COMPONENT),
787 )?;
788 attr.add(
789 "BUSINESS_CATEGORY",
790 oid_const(py, synta_certificate::oids::attr::BUSINESS_CATEGORY),
791 )?;
792 attr.add(
793 "POSTAL_CODE",
794 oid_const(py, synta_certificate::oids::attr::POSTAL_CODE),
795 )?;
796 attr.add(
797 "GENERATION_QUALIFIER",
798 oid_const(py, synta_certificate::oids::attr::GENERATION_QUALIFIER),
799 )?;
800 attr.add(
801 "DN_QUALIFIER",
802 oid_const(py, synta_certificate::oids::attr::DN_QUALIFIER),
803 )?;
804 attr.add(
805 "PSEUDONYM",
806 oid_const(py, synta_certificate::oids::attr::PSEUDONYM),
807 )?;
808 attr.add(
809 "JURISDICTION_LOCALITY",
810 oid_const(py, synta_certificate::oids::attr::JURISDICTION_LOCALITY),
811 )?;
812 attr.add(
813 "JURISDICTION_STATE",
814 oid_const(py, synta_certificate::oids::attr::JURISDICTION_STATE),
815 )?;
816 attr.add(
817 "JURISDICTION_COUNTRY",
818 oid_const(py, synta_certificate::oids::attr::JURISDICTION_COUNTRY),
819 )?;
820
821 crate::install_submodule(&m, &attr, "synta.oids.attr", None)?;
822 crate::install_submodule(
823 parent,
824 &m,
825 "synta.oids",
826 Some("OID constants for X.509 signature, public-key, and extension algorithms."),
827 )
828}
829
830fn register_general_name_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
833 let py = parent.py();
834 let m = PyModule::new(py, "general_name")?;
835
836 m.add("OTHER_NAME", synta_certificate::general_name::OTHER_NAME)?;
838 m.add("RFC822_NAME", synta_certificate::general_name::RFC822_NAME)?;
839 m.add("DNS_NAME", synta_certificate::general_name::DNS_NAME)?;
840 m.add(
841 "X400_ADDRESS",
842 synta_certificate::general_name::X400_ADDRESS,
843 )?;
844 m.add(
845 "DIRECTORY_NAME",
846 synta_certificate::general_name::DIRECTORY_NAME,
847 )?;
848 m.add(
849 "EDI_PARTY_NAME",
850 synta_certificate::general_name::EDI_PARTY_NAME,
851 )?;
852 m.add("URI", synta_certificate::general_name::URI)?;
853 m.add("IP_ADDRESS", synta_certificate::general_name::IP_ADDRESS)?;
854 m.add(
855 "REGISTERED_ID",
856 synta_certificate::general_name::REGISTERED_ID,
857 )?;
858
859 m.add_class::<general_name::PyOtherName>()?;
861 m.add_class::<general_name::PyRfc822Name>()?;
862 m.add_class::<general_name::PyDnsName>()?;
863 m.add_class::<general_name::PyX400Address>()?;
864 m.add_class::<general_name::PyDirectoryName>()?;
865 m.add_class::<general_name::PyEdiPartyName>()?;
866 m.add_class::<general_name::PyUri>()?;
867 m.add_class::<general_name::PyIPAddress>()?;
868 m.add_class::<general_name::PyRegisteredId>()?;
869
870 crate::install_submodule(
871 parent,
872 &m,
873 "synta.general_name",
874 Some(concat!(
875 "Context-specific tag numbers for the ``GeneralName`` CHOICE type ",
876 "(RFC 5280 \u{a7}4.2.1.6).\n\n",
877 "These integer constants correspond to the first element of tuples returned by\n",
878 ":func:`~synta.parse_general_names` and ",
879 ":meth:`~synta.Certificate.subject_alt_names`.\n\n",
880 "Example usage::\n\n",
881 " import synta.general_name as gn\n",
882 " for tag, content in cert.subject_alt_names():\n",
883 " if tag == gn.DNS_NAME:\n",
884 " print('DNS:', content.decode())\n",
885 " elif tag == gn.IP_ADDRESS:\n",
886 " print('IP:', content.hex())",
887 )),
888 )
889}