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 PyCertificateListBuilder, PyCrl, PyCsr, PyOCSPResponseBuilder, PyOCSPSingleResponse,
61 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::<PyOCSPSingleResponse>()?;
122 m.add_class::<PyOCSPResponseBuilder>()?;
123 m.add_class::<PyMlDsaPrivateKey>()?;
124 m.add_class::<PyMlDsaPublicKey>()?;
125 m.add_class::<PyRsaPublicKey>()?;
126 m.add_class::<PyRsassaPssParams>()?;
127 let py = m.py();
131 m.add(
132 "ML_DSA_44",
133 oid_const(py, synta_certificate::oids::ML_DSA_44),
134 )?;
135 m.add(
136 "ML_DSA_65",
137 oid_const(py, synta_certificate::oids::ML_DSA_65),
138 )?;
139 m.add(
140 "ML_DSA_87",
141 oid_const(py, synta_certificate::oids::ML_DSA_87),
142 )?;
143 m.add_function(wrap_pyfunction!(load_der_pkcs7_certificates, m)?)?;
144 m.add_function(wrap_pyfunction!(load_pem_pkcs7_certificates, m)?)?;
145 m.add_function(wrap_pyfunction!(load_pkcs12_certificates, m)?)?;
146 m.add_function(wrap_pyfunction!(load_pkcs12_keys, m)?)?;
147 m.add_function(wrap_pyfunction!(load_pkcs12, m)?)?;
148 m.add_function(wrap_pyfunction!(read_pki_blocks, m)?)?;
149 m.add_function(wrap_pyfunction!(create_pkcs12, m)?)?;
150 register_tsp_classes(m)?;
151 register_ess_classes(m)?;
152 register_logotype_classes(m)?;
153 register_ace88_classes(m)?;
154 register_oids_submodule(m)?;
155 register_cms_submodule(m)?;
156 register_general_name_submodule(m)?;
157 register_pkixalgs_submodule(m)?;
158 register_kem_submodule(m)?;
159 register_ac_submodule(m)?;
160 register_crmf_submodule(m)?;
161 register_cmp_submodule(m)?;
162 register_ms_pki_submodule(m)?;
163 register_pkcs8_submodule(m)?;
164 register_pkcs9_submodule(m)?;
165 register_pkcs5_submodule(m)?;
166 register_acme_submodule(m)?;
167 Ok(())
168}
169
170#[pyfunction]
183fn identify_signature_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<&'static str> {
184 let inner = oid_from_pyany(oid)?;
185 Ok(synta_certificate::identify_signature_algorithm(&inner))
186}
187
188#[pyfunction]
196fn identify_public_key_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
197 let inner = oid_from_pyany(oid)?;
198 Ok(synta_certificate::identify_public_key_algorithm(&inner))
199}
200
201#[pyfunction]
208fn ec_curve_short_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
209 let inner = oid_from_pyany(oid)?;
210 Ok(synta_certificate::ec_curve_short_name(inner.components()))
211}
212
213#[pyfunction]
220fn ec_curve_nist_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
221 let inner = oid_from_pyany(oid)?;
222 Ok(synta_certificate::ec_curve_nist_name(inner.components()))
223}
224
225#[pyfunction]
233fn ec_curve_key_bits(oid: &Bound<'_, PyAny>) -> PyResult<Option<usize>> {
234 let inner = oid_from_pyany(oid)?;
235 Ok(synta_certificate::ec_curve_key_bits(inner.components()))
236}
237
238#[pyfunction]
246fn extension_oid_name(oid: &Bound<'_, PyAny>) -> PyResult<String> {
247 let inner = oid_from_pyany(oid)?;
248 Ok(synta_certificate::extension_oid_name(&inner))
249}
250
251fn register_oids_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
258 let py = parent.py();
259 let m = PyModule::new(py, "oids")?;
260
261 m.add(
263 "ML_DSA_44",
264 oid_const(py, synta_certificate::oids::ML_DSA_44),
265 )?;
266 m.add(
267 "ML_DSA_65",
268 oid_const(py, synta_certificate::oids::ML_DSA_65),
269 )?;
270 m.add(
271 "ML_DSA_87",
272 oid_const(py, synta_certificate::oids::ML_DSA_87),
273 )?;
274
275 m.add(
277 "ML_KEM_512",
278 oid_const(py, synta_certificate::oids::ML_KEM_512),
279 )?;
280 m.add(
281 "ML_KEM_768",
282 oid_const(py, synta_certificate::oids::ML_KEM_768),
283 )?;
284 m.add(
285 "ML_KEM_1024",
286 oid_const(py, synta_certificate::oids::ML_KEM_1024),
287 )?;
288
289 m.add(
291 "SLH_DSA_SHA2_128S",
292 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128S),
293 )?;
294 m.add(
295 "SLH_DSA_SHA2_128F",
296 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128F),
297 )?;
298 m.add(
299 "SLH_DSA_SHA2_192S",
300 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192S),
301 )?;
302 m.add(
303 "SLH_DSA_SHA2_192F",
304 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192F),
305 )?;
306 m.add(
307 "SLH_DSA_SHA2_256S",
308 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256S),
309 )?;
310 m.add(
311 "SLH_DSA_SHA2_256F",
312 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256F),
313 )?;
314 m.add(
315 "SLH_DSA_SHAKE_128S",
316 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128S),
317 )?;
318 m.add(
319 "SLH_DSA_SHAKE_128F",
320 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128F),
321 )?;
322 m.add(
323 "SLH_DSA_SHAKE_192S",
324 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192S),
325 )?;
326 m.add(
327 "SLH_DSA_SHAKE_192F",
328 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192F),
329 )?;
330 m.add(
331 "SLH_DSA_SHAKE_256S",
332 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256S),
333 )?;
334 m.add(
335 "SLH_DSA_SHAKE_256F",
336 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256F),
337 )?;
338
339 m.add("ED25519", oid_const(py, synta_certificate::oids::ED25519))?;
341 m.add("ED448", oid_const(py, synta_certificate::oids::ED448))?;
342
343 m.add(
345 "RSA_ENCRYPTION",
346 oid_const(py, synta_certificate::oids::RSA_ENCRYPTION),
347 )?;
348 m.add(
349 "MD5_WITH_RSA",
350 oid_const(py, synta_certificate::oids::MD5_WITH_RSA),
351 )?;
352 m.add(
353 "SHA1_WITH_RSA",
354 oid_const(py, synta_certificate::oids::SHA1_WITH_RSA),
355 )?;
356 m.add(
357 "SHA256_WITH_RSA",
358 oid_const(py, synta_certificate::oids::SHA256_WITH_RSA),
359 )?;
360 m.add(
361 "SHA384_WITH_RSA",
362 oid_const(py, synta_certificate::oids::SHA384_WITH_RSA),
363 )?;
364 m.add(
365 "SHA512_WITH_RSA",
366 oid_const(py, synta_certificate::oids::SHA512_WITH_RSA),
367 )?;
368 m.add("RSA", oid_const(py, synta_certificate::oids::RSA))?;
370 m.add(
372 "MD2_WITH_RSA",
373 oid_const(py, synta_certificate::oids::MD2_WITH_RSA),
374 )?;
375 m.add(
376 "SHA512_224_WITH_RSA",
377 oid_const(py, synta_certificate::oids::SHA512_224_WITH_RSA),
378 )?;
379 m.add(
380 "SHA512_256_WITH_RSA",
381 oid_const(py, synta_certificate::oids::SHA512_256_WITH_RSA),
382 )?;
383 m.add(
384 "RSASSA_PSS",
385 oid_const(py, synta_certificate::oids::RSASSA_PSS),
386 )?;
387 m.add(
388 "RSAES_OAEP",
389 oid_const(py, synta_certificate::oids::RSAES_OAEP),
390 )?;
391 m.add("MGF1", oid_const(py, synta_certificate::oids::MGF1))?;
392 m.add(
393 "P_SPECIFIED",
394 oid_const(py, synta_certificate::oids::P_SPECIFIED),
395 )?;
396
397 m.add(
399 "EC_PUBLIC_KEY",
400 oid_const(py, synta_certificate::oids::EC_PUBLIC_KEY),
401 )?;
402 m.add(
403 "ECDSA_WITH_SHA1",
404 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA1),
405 )?;
406 m.add(
407 "ECDSA_WITH_SHA256",
408 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA256),
409 )?;
410 m.add(
411 "ECDSA_WITH_SHA384",
412 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA384),
413 )?;
414 m.add(
415 "ECDSA_WITH_SHA512",
416 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA512),
417 )?;
418 m.add("ECDSA", oid_const(py, synta_certificate::oids::ECDSA_SIG))?;
420
421 m.add(
423 "EC_CURVE_P256",
424 oid_const(py, synta_certificate::oids::EC_CURVE_P256),
425 )?;
426 m.add(
427 "EC_CURVE_P384",
428 oid_const(py, synta_certificate::oids::EC_CURVE_P384),
429 )?;
430 m.add(
431 "EC_CURVE_P521",
432 oid_const(py, synta_certificate::oids::EC_CURVE_P521),
433 )?;
434 m.add(
435 "EC_CURVE_SECP256K1",
436 oid_const(py, synta_certificate::oids::EC_CURVE_SECP256K1),
437 )?;
438
439 m.add("SHA224", oid_const(py, synta_certificate::oids::ID_SHA224))?;
441 m.add("SHA256", oid_const(py, synta_certificate::oids::ID_SHA256))?;
442 m.add("SHA384", oid_const(py, synta_certificate::oids::ID_SHA384))?;
443 m.add("SHA512", oid_const(py, synta_certificate::oids::ID_SHA512))?;
444 m.add(
445 "SHA512_224",
446 oid_const(py, synta_certificate::oids::ID_SHA512_224),
447 )?;
448 m.add(
449 "SHA512_256",
450 oid_const(py, synta_certificate::oids::ID_SHA512_256),
451 )?;
452
453 m.add(
455 "SHA3_224",
456 oid_const(py, synta_certificate::oids::ID_SHA3_224),
457 )?;
458 m.add(
459 "SHA3_256",
460 oid_const(py, synta_certificate::oids::ID_SHA3_256),
461 )?;
462 m.add(
463 "SHA3_384",
464 oid_const(py, synta_certificate::oids::ID_SHA3_384),
465 )?;
466 m.add(
467 "SHA3_512",
468 oid_const(py, synta_certificate::oids::ID_SHA3_512),
469 )?;
470 m.add(
471 "SHAKE128",
472 oid_const(py, synta_certificate::oids::ID_SHAKE128),
473 )?;
474 m.add(
475 "SHAKE256",
476 oid_const(py, synta_certificate::oids::ID_SHAKE256),
477 )?;
478
479 m.add(
481 "SUBJECT_KEY_IDENTIFIER",
482 oid_const(py, synta_certificate::oids::SUBJECT_KEY_IDENTIFIER),
483 )?;
484 m.add(
485 "KEY_USAGE",
486 oid_const(py, synta_certificate::oids::KEY_USAGE),
487 )?;
488 m.add(
489 "SUBJECT_ALT_NAME",
490 oid_const(py, synta_certificate::oids::SUBJECT_ALT_NAME),
491 )?;
492 m.add(
493 "ISSUER_ALT_NAME",
494 oid_const(py, synta_certificate::oids::ISSUER_ALT_NAME),
495 )?;
496 m.add(
497 "BASIC_CONSTRAINTS",
498 oid_const(py, synta_certificate::oids::BASIC_CONSTRAINTS),
499 )?;
500 m.add(
501 "CRL_DISTRIBUTION_POINTS",
502 oid_const(py, synta_certificate::oids::CRL_DISTRIBUTION_POINTS),
503 )?;
504 m.add(
505 "NAME_CONSTRAINTS",
506 oid_const(py, synta_certificate::oids::NAME_CONSTRAINTS),
507 )?;
508 m.add(
509 "CERTIFICATE_POLICIES",
510 oid_const(py, synta_certificate::oids::CERTIFICATE_POLICIES),
511 )?;
512 m.add(
513 "AUTHORITY_KEY_IDENTIFIER",
514 oid_const(py, synta_certificate::oids::AUTHORITY_KEY_IDENTIFIER),
515 )?;
516 m.add(
517 "EXTENDED_KEY_USAGE",
518 oid_const(py, synta_certificate::oids::EXTENDED_KEY_USAGE),
519 )?;
520 m.add(
521 "AUTHORITY_INFO_ACCESS",
522 oid_const(py, synta_certificate::oids::AUTHORITY_INFO_ACCESS),
523 )?;
524 m.add(
525 "CT_PRECERT_SCTS",
526 oid_const(py, synta_certificate::oids::CT_PRECERT_SCTS),
527 )?;
528 m.add(
529 "PE_ACME_IDENTIFIER",
530 oid_const(py, synta_certificate::oids::PE_ACME_IDENTIFIER),
531 )?;
532
533 m.add(
535 "KP_SERVER_AUTH",
536 oid_const(py, synta_certificate::oids::KP_SERVER_AUTH),
537 )?;
538 m.add(
539 "KP_CLIENT_AUTH",
540 oid_const(py, synta_certificate::oids::KP_CLIENT_AUTH),
541 )?;
542 m.add(
543 "KP_CODE_SIGNING",
544 oid_const(py, synta_certificate::oids::KP_CODE_SIGNING),
545 )?;
546 m.add(
547 "KP_EMAIL_PROTECTION",
548 oid_const(py, synta_certificate::oids::KP_EMAIL_PROTECTION),
549 )?;
550 m.add(
551 "KP_TIME_STAMPING",
552 oid_const(py, synta_certificate::oids::KP_TIME_STAMPING),
553 )?;
554 m.add(
555 "KP_OCSP_SIGNING",
556 oid_const(py, synta_certificate::oids::KP_OCSP_SIGNING),
557 )?;
558 m.add(
559 "ANY_EXTENDED_KEY_USAGE",
560 oid_const(py, synta_certificate::oids::ANY_EXTENDED_KEY_USAGE),
561 )?;
562
563 m.add(
565 "PKINIT_SAN",
566 oid_const(py, synta_certificate::oids::ID_PKINIT_SAN),
567 )?;
568 m.add(
569 "PKINIT_KP_CLIENT_AUTH",
570 oid_const(py, synta_certificate::oids::ID_PKINIT_KPCLIENT_AUTH),
571 )?;
572 m.add(
573 "PKINIT_KP_KDC",
574 oid_const(py, synta_certificate::oids::ID_PKINIT_KPKDC),
575 )?;
576 m.add(
577 "PKINIT_AUTH_DATA",
578 oid_const(py, synta_certificate::oids::ID_PKINIT_AUTH_DATA),
579 )?;
580 m.add(
581 "PKINIT_DHKEY_DATA",
582 oid_const(py, synta_certificate::oids::ID_PKINIT_DHKEY_DATA),
583 )?;
584 m.add(
585 "PKINIT_RKEY_DATA",
586 oid_const(py, synta_certificate::oids::ID_PKINIT_RKEY_DATA),
587 )?;
588 m.add(
589 "PKINIT_KDF",
590 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF),
591 )?;
592 m.add(
593 "PKINIT_KDF_SHA1",
594 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA1),
595 )?;
596 m.add(
597 "PKINIT_KDF_SHA256",
598 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA256),
599 )?;
600 m.add(
601 "PKINIT_KDF_SHA384",
602 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA384),
603 )?;
604 m.add(
605 "PKINIT_KDF_SHA512",
606 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA512),
607 )?;
608
609 m.add(
611 "MS_SAN_UPN",
612 oid_const(py, synta_certificate::oids::ID_MS_SAN_UPN),
613 )?;
614 m.add(
615 "MS_CERTIFICATE_TEMPLATE_NAME",
616 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE_NAME),
617 )?;
618 m.add(
619 "MS_CERTIFICATE_TEMPLATE",
620 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE),
621 )?;
622 m.add(
623 "MS_KP_SMARTCARD_LOGON",
624 oid_const(py, synta_certificate::oids::ID_MS_KP_SMARTCARD_LOGON),
625 )?;
626 m.add(
627 "MS_NTDS_REPLICATION",
628 oid_const(py, synta_certificate::oids::ID_MS_NTDS_REPLICATION),
629 )?;
630
631 m.add("CMS_DATA", oid_const(py, synta_certificate::oids::CMS_DATA))?;
633 m.add(
634 "CMS_SIGNED_DATA",
635 oid_const(py, synta_certificate::oids::CMS_SIGNED_DATA),
636 )?;
637 m.add(
638 "CMS_ENVELOPED_DATA",
639 oid_const(py, synta_certificate::oids::CMS_ENVELOPED_DATA),
640 )?;
641 m.add(
642 "CMS_DIGESTED_DATA",
643 oid_const(py, synta_certificate::oids::CMS_DIGESTED_DATA),
644 )?;
645 m.add(
646 "CMS_ENCRYPTED_DATA",
647 oid_const(py, synta_certificate::oids::CMS_ENCRYPTED_DATA),
648 )?;
649 m.add(
650 "CMS_AUTH_DATA",
651 oid_const(py, synta_certificate::oids::CMS_AUTH_DATA),
652 )?;
653 m.add("CMS_ORI", oid_const(py, synta_certificate::oids::CMS_ORI))?;
655 m.add(
656 "CMS_ORI_KEM",
657 oid_const(py, synta_certificate::oids::CMS_ORI_KEM),
658 )?;
659
660 m.add(
662 "PKCS9_EMAIL_ADDRESS",
663 oid_const(py, synta_certificate::oids::PKCS9_EMAIL_ADDRESS),
664 )?;
665 m.add(
666 "PKCS9_CONTENT_TYPE",
667 oid_const(py, synta_certificate::oids::PKCS9_CONTENT_TYPE),
668 )?;
669 m.add(
670 "PKCS9_MESSAGE_DIGEST",
671 oid_const(py, synta_certificate::oids::PKCS9_MESSAGE_DIGEST),
672 )?;
673 m.add(
674 "PKCS9_SIGNING_TIME",
675 oid_const(py, synta_certificate::oids::PKCS9_SIGNING_TIME),
676 )?;
677 m.add(
678 "PKCS9_COUNTERSIGNATURE",
679 oid_const(py, synta_certificate::oids::PKCS9_COUNTERSIGNATURE),
680 )?;
681 m.add(
682 "PKCS9_CHALLENGE_PASSWORD",
683 oid_const(py, synta_certificate::oids::PKCS9_CHALLENGE_PASSWORD),
684 )?;
685 m.add(
686 "PKCS9_EXTENSION_REQUEST",
687 oid_const(py, synta_certificate::oids::PKCS9_EXTENSION_REQUEST),
688 )?;
689 m.add(
690 "PKCS9_FRIENDLY_NAME",
691 oid_const(py, synta_certificate::oids::PKCS9_FRIENDLY_NAME),
692 )?;
693 m.add(
694 "PKCS9_LOCAL_KEY_ID",
695 oid_const(py, synta_certificate::oids::PKCS9_LOCAL_KEY_ID),
696 )?;
697
698 m.add(
700 "ALG_UNSIGNED",
701 oid_const(py, synta_certificate::oids::ALG_UNSIGNED),
702 )?;
703 m.add(
704 "RDNA_UNSIGNED",
705 oid_const(py, synta_certificate::oids::RDNA_UNSIGNED),
706 )?;
707
708 m.add_function(wrap_pyfunction!(identify_signature_algorithm, &m)?)?;
710 m.add_function(wrap_pyfunction!(identify_public_key_algorithm, &m)?)?;
711 m.add_function(wrap_pyfunction!(ec_curve_short_name, &m)?)?;
712 m.add_function(wrap_pyfunction!(ec_curve_nist_name, &m)?)?;
713 m.add_function(wrap_pyfunction!(ec_curve_key_bits, &m)?)?;
714 m.add_function(wrap_pyfunction!(extension_oid_name, &m)?)?;
715
716 let attr = PyModule::new(py, "attr")?;
718 attr.add(
719 "__doc__",
720 "OIDs for X.500 Distinguished Name attribute types (RFC 4519).",
721 )?;
722 attr.add(
723 "COMMON_NAME",
724 oid_const(py, synta_certificate::oids::attr::COMMON_NAME),
725 )?;
726 attr.add(
727 "COUNTRY",
728 oid_const(py, synta_certificate::oids::attr::COUNTRY),
729 )?;
730 attr.add("STATE", oid_const(py, synta_certificate::oids::attr::STATE))?;
731 attr.add(
732 "LOCALITY",
733 oid_const(py, synta_certificate::oids::attr::LOCALITY),
734 )?;
735 attr.add(
736 "ORGANIZATION",
737 oid_const(py, synta_certificate::oids::attr::ORGANIZATION),
738 )?;
739 attr.add(
740 "ORG_UNIT",
741 oid_const(py, synta_certificate::oids::attr::ORG_UNIT),
742 )?;
743 attr.add(
744 "ORG_IDENTIFIER",
745 oid_const(py, synta_certificate::oids::attr::ORG_IDENTIFIER),
746 )?;
747 attr.add(
748 "STREET",
749 oid_const(py, synta_certificate::oids::attr::STREET),
750 )?;
751 attr.add(
752 "SURNAME",
753 oid_const(py, synta_certificate::oids::attr::SURNAME),
754 )?;
755 attr.add(
756 "GIVEN_NAME",
757 oid_const(py, synta_certificate::oids::attr::GIVEN_NAME),
758 )?;
759 attr.add(
760 "INITIALS",
761 oid_const(py, synta_certificate::oids::attr::INITIALS),
762 )?;
763 attr.add("TITLE", oid_const(py, synta_certificate::oids::attr::TITLE))?;
764 attr.add(
765 "SERIAL_NUMBER",
766 oid_const(py, synta_certificate::oids::attr::SERIAL_NUMBER),
767 )?;
768 attr.add(
769 "EMAIL_ADDRESS",
770 oid_const(py, synta_certificate::oids::attr::EMAIL_ADDRESS),
771 )?;
772 attr.add(
773 "USER_ID",
774 oid_const(py, synta_certificate::oids::attr::USER_ID),
775 )?;
776 attr.add(
777 "DOMAIN_COMPONENT",
778 oid_const(py, synta_certificate::oids::attr::DOMAIN_COMPONENT),
779 )?;
780 attr.add(
781 "BUSINESS_CATEGORY",
782 oid_const(py, synta_certificate::oids::attr::BUSINESS_CATEGORY),
783 )?;
784 attr.add(
785 "POSTAL_CODE",
786 oid_const(py, synta_certificate::oids::attr::POSTAL_CODE),
787 )?;
788 attr.add(
789 "GENERATION_QUALIFIER",
790 oid_const(py, synta_certificate::oids::attr::GENERATION_QUALIFIER),
791 )?;
792 attr.add(
793 "DN_QUALIFIER",
794 oid_const(py, synta_certificate::oids::attr::DN_QUALIFIER),
795 )?;
796 attr.add(
797 "PSEUDONYM",
798 oid_const(py, synta_certificate::oids::attr::PSEUDONYM),
799 )?;
800 attr.add(
801 "JURISDICTION_LOCALITY",
802 oid_const(py, synta_certificate::oids::attr::JURISDICTION_LOCALITY),
803 )?;
804 attr.add(
805 "JURISDICTION_STATE",
806 oid_const(py, synta_certificate::oids::attr::JURISDICTION_STATE),
807 )?;
808 attr.add(
809 "JURISDICTION_COUNTRY",
810 oid_const(py, synta_certificate::oids::attr::JURISDICTION_COUNTRY),
811 )?;
812
813 crate::install_submodule(&m, &attr, "synta.oids.attr", None)?;
814 crate::install_submodule(
815 parent,
816 &m,
817 "synta.oids",
818 Some("OID constants for X.509 signature, public-key, and extension algorithms."),
819 )
820}
821
822fn register_general_name_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
825 let py = parent.py();
826 let m = PyModule::new(py, "general_name")?;
827
828 m.add("OTHER_NAME", synta_certificate::general_name::OTHER_NAME)?;
830 m.add("RFC822_NAME", synta_certificate::general_name::RFC822_NAME)?;
831 m.add("DNS_NAME", synta_certificate::general_name::DNS_NAME)?;
832 m.add(
833 "X400_ADDRESS",
834 synta_certificate::general_name::X400_ADDRESS,
835 )?;
836 m.add(
837 "DIRECTORY_NAME",
838 synta_certificate::general_name::DIRECTORY_NAME,
839 )?;
840 m.add(
841 "EDI_PARTY_NAME",
842 synta_certificate::general_name::EDI_PARTY_NAME,
843 )?;
844 m.add("URI", synta_certificate::general_name::URI)?;
845 m.add("IP_ADDRESS", synta_certificate::general_name::IP_ADDRESS)?;
846 m.add(
847 "REGISTERED_ID",
848 synta_certificate::general_name::REGISTERED_ID,
849 )?;
850
851 m.add_class::<general_name::PyOtherName>()?;
853 m.add_class::<general_name::PyRfc822Name>()?;
854 m.add_class::<general_name::PyDnsName>()?;
855 m.add_class::<general_name::PyX400Address>()?;
856 m.add_class::<general_name::PyDirectoryName>()?;
857 m.add_class::<general_name::PyEdiPartyName>()?;
858 m.add_class::<general_name::PyUri>()?;
859 m.add_class::<general_name::PyIPAddress>()?;
860 m.add_class::<general_name::PyRegisteredId>()?;
861
862 crate::install_submodule(
863 parent,
864 &m,
865 "synta.general_name",
866 Some(concat!(
867 "Context-specific tag numbers for the ``GeneralName`` CHOICE type ",
868 "(RFC 5280 \u{a7}4.2.1.6).\n\n",
869 "These integer constants correspond to the first element of tuples returned by\n",
870 ":func:`~synta.parse_general_names` and ",
871 ":meth:`~synta.Certificate.subject_alt_names`.\n\n",
872 "Example usage::\n\n",
873 " import synta.general_name as gn\n",
874 " for tag, content in cert.subject_alt_names():\n",
875 " if tag == gn.DNS_NAME:\n",
876 " print('DNS:', content.decode())\n",
877 " elif tag == gn.IP_ADDRESS:\n",
878 " print('IP:', content.hex())",
879 )),
880 )
881}