1use std::str::FromStr;
11
12use pyo3::prelude::*;
13
14use synta::ObjectIdentifier;
15
16use crate::types::{PyObjectIdentifier, PyRelativeOid};
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::<PyRelativeOid>()?;
112 m.add_class::<PyPolicyQualifier>()?;
113 m.add_class::<PyPolicyInformation>()?;
114 m.add_class::<PyCertificate>()?;
115 m.add_class::<PyCertificateBuilder>()?;
116 m.add_class::<PyCsrBuilder>()?;
117 m.add_class::<PyNameBuilder>()?;
118 m.add_class::<PyCsr>()?;
119 m.add_class::<PyCrl>()?;
120 m.add_class::<PyCertificateListBuilder>()?;
121 m.add_class::<PyOcspResponse>()?;
122 m.add_class::<PyOcspRequest>()?;
123 m.add_class::<PyCertID>()?;
124 m.add_class::<PyOCSPSingleResponse>()?;
125 m.add_class::<PyOCSPResponseBuilder>()?;
126 m.add_class::<PyOCSPCertIDSpec>()?;
127 m.add_class::<PyOCSPRequestBuilder>()?;
128 m.add_class::<PyMlDsaPrivateKey>()?;
129 m.add_class::<PyMlDsaPublicKey>()?;
130 m.add_class::<PyRsaPublicKey>()?;
131 m.add_class::<PyRsassaPssParams>()?;
132 let py = m.py();
136 m.add(
137 "ML_DSA_44",
138 oid_const(py, synta_certificate::oids::ML_DSA_44),
139 )?;
140 m.add(
141 "ML_DSA_65",
142 oid_const(py, synta_certificate::oids::ML_DSA_65),
143 )?;
144 m.add(
145 "ML_DSA_87",
146 oid_const(py, synta_certificate::oids::ML_DSA_87),
147 )?;
148 m.add_function(wrap_pyfunction!(load_der_pkcs7_certificates, m)?)?;
149 m.add_function(wrap_pyfunction!(load_pem_pkcs7_certificates, m)?)?;
150 m.add_function(wrap_pyfunction!(load_pkcs12_certificates, m)?)?;
151 m.add_function(wrap_pyfunction!(load_pkcs12_keys, m)?)?;
152 m.add_function(wrap_pyfunction!(load_pkcs12, m)?)?;
153 m.add_function(wrap_pyfunction!(read_pki_blocks, m)?)?;
154 m.add_function(wrap_pyfunction!(create_pkcs12, m)?)?;
155 register_tsp_classes(m)?;
156 register_ess_classes(m)?;
157 register_logotype_classes(m)?;
158 register_ace88_classes(m)?;
159 register_oids_submodule(m)?;
160 register_cms_submodule(m)?;
161 register_general_name_submodule(m)?;
162 register_pkixalgs_submodule(m)?;
163 register_kem_submodule(m)?;
164 register_ac_submodule(m)?;
165 register_crmf_submodule(m)?;
166 register_cmp_submodule(m)?;
167 register_ms_pki_submodule(m)?;
168 register_pkcs8_submodule(m)?;
169 register_pkcs9_submodule(m)?;
170 register_pkcs5_submodule(m)?;
171 register_acme_submodule(m)?;
172 Ok(())
173}
174
175#[pyfunction]
188fn identify_signature_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<&'static str> {
189 let inner = oid_from_pyany(oid)?;
190 Ok(synta_certificate::identify_signature_algorithm(&inner))
191}
192
193#[pyfunction]
201fn identify_public_key_algorithm(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
202 let inner = oid_from_pyany(oid)?;
203 Ok(synta_certificate::identify_public_key_algorithm(&inner))
204}
205
206#[pyfunction]
213fn ec_curve_short_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
214 let inner = oid_from_pyany(oid)?;
215 Ok(synta_certificate::ec_curve_short_name(inner.components()))
216}
217
218#[pyfunction]
225fn ec_curve_nist_name(oid: &Bound<'_, PyAny>) -> PyResult<Option<&'static str>> {
226 let inner = oid_from_pyany(oid)?;
227 Ok(synta_certificate::ec_curve_nist_name(inner.components()))
228}
229
230#[pyfunction]
238fn ec_curve_key_bits(oid: &Bound<'_, PyAny>) -> PyResult<Option<usize>> {
239 let inner = oid_from_pyany(oid)?;
240 Ok(synta_certificate::ec_curve_key_bits(inner.components()))
241}
242
243#[pyfunction]
251fn extension_oid_name(oid: &Bound<'_, PyAny>) -> PyResult<String> {
252 let inner = oid_from_pyany(oid)?;
253 Ok(synta_certificate::extension_oid_name(&inner))
254}
255
256fn register_oids_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
263 let py = parent.py();
264 let m = PyModule::new(py, "oids")?;
265
266 m.add(
268 "ML_DSA_44",
269 oid_const(py, synta_certificate::oids::ML_DSA_44),
270 )?;
271 m.add(
272 "ML_DSA_65",
273 oid_const(py, synta_certificate::oids::ML_DSA_65),
274 )?;
275 m.add(
276 "ML_DSA_87",
277 oid_const(py, synta_certificate::oids::ML_DSA_87),
278 )?;
279
280 m.add(
282 "ML_KEM_512",
283 oid_const(py, synta_certificate::oids::ML_KEM_512),
284 )?;
285 m.add(
286 "ML_KEM_768",
287 oid_const(py, synta_certificate::oids::ML_KEM_768),
288 )?;
289 m.add(
290 "ML_KEM_1024",
291 oid_const(py, synta_certificate::oids::ML_KEM_1024),
292 )?;
293
294 m.add(
296 "SLH_DSA_SHA2_128S",
297 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128S),
298 )?;
299 m.add(
300 "SLH_DSA_SHA2_128F",
301 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_128F),
302 )?;
303 m.add(
304 "SLH_DSA_SHA2_192S",
305 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192S),
306 )?;
307 m.add(
308 "SLH_DSA_SHA2_192F",
309 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_192F),
310 )?;
311 m.add(
312 "SLH_DSA_SHA2_256S",
313 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256S),
314 )?;
315 m.add(
316 "SLH_DSA_SHA2_256F",
317 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHA2_256F),
318 )?;
319 m.add(
320 "SLH_DSA_SHAKE_128S",
321 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128S),
322 )?;
323 m.add(
324 "SLH_DSA_SHAKE_128F",
325 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_128F),
326 )?;
327 m.add(
328 "SLH_DSA_SHAKE_192S",
329 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192S),
330 )?;
331 m.add(
332 "SLH_DSA_SHAKE_192F",
333 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_192F),
334 )?;
335 m.add(
336 "SLH_DSA_SHAKE_256S",
337 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256S),
338 )?;
339 m.add(
340 "SLH_DSA_SHAKE_256F",
341 oid_const(py, synta_certificate::oids::ID_SLH_DSA_SHAKE_256F),
342 )?;
343
344 m.add(
346 "COMPOSITE_MLDSA_ARC",
347 oid_const(py, synta_certificate::oids::COMPOSITE_MLDSA_ARC),
348 )?;
349 m.add(
350 "MLDSA44_RSA2048_PSS_SHA256",
351 oid_const(py, synta_certificate::oids::MLDSA44_RSA2048_PSS_SHA256),
352 )?;
353 m.add(
354 "MLDSA44_RSA2048_PKCS15_SHA256",
355 oid_const(py, synta_certificate::oids::MLDSA44_RSA2048_PKCS15_SHA256),
356 )?;
357 m.add(
358 "MLDSA44_ED25519_SHA512",
359 oid_const(py, synta_certificate::oids::MLDSA44_ED25519_SHA512),
360 )?;
361 m.add(
362 "MLDSA44_ECDSA_P256_SHA256",
363 oid_const(py, synta_certificate::oids::MLDSA44_ECDSA_P256_SHA256),
364 )?;
365 m.add(
366 "MLDSA65_RSA3072_PSS_SHA512",
367 oid_const(py, synta_certificate::oids::MLDSA65_RSA3072_PSS_SHA512),
368 )?;
369 m.add(
370 "MLDSA65_RSA3072_PKCS15_SHA512",
371 oid_const(py, synta_certificate::oids::MLDSA65_RSA3072_PKCS15_SHA512),
372 )?;
373 m.add(
374 "MLDSA65_RSA4096_PSS_SHA512",
375 oid_const(py, synta_certificate::oids::MLDSA65_RSA4096_PSS_SHA512),
376 )?;
377 m.add(
378 "MLDSA65_RSA4096_PKCS15_SHA512",
379 oid_const(py, synta_certificate::oids::MLDSA65_RSA4096_PKCS15_SHA512),
380 )?;
381 m.add(
382 "MLDSA65_ECDSA_P256_SHA512",
383 oid_const(py, synta_certificate::oids::MLDSA65_ECDSA_P256_SHA512),
384 )?;
385 m.add(
386 "MLDSA65_ECDSA_P384_SHA512",
387 oid_const(py, synta_certificate::oids::MLDSA65_ECDSA_P384_SHA512),
388 )?;
389 m.add(
390 "MLDSA65_ECDSA_BRAINPOOL_P256R1_SHA512",
391 oid_const(
392 py,
393 synta_certificate::oids::MLDSA65_ECDSA_BRAINPOOL_P256R1_SHA512,
394 ),
395 )?;
396 m.add(
397 "MLDSA65_ED25519_SHA512",
398 oid_const(py, synta_certificate::oids::MLDSA65_ED25519_SHA512),
399 )?;
400 m.add(
401 "MLDSA87_ECDSA_P384_SHA512",
402 oid_const(py, synta_certificate::oids::MLDSA87_ECDSA_P384_SHA512),
403 )?;
404 m.add(
405 "MLDSA87_ECDSA_BRAINPOOL_P384R1_SHA512",
406 oid_const(
407 py,
408 synta_certificate::oids::MLDSA87_ECDSA_BRAINPOOL_P384R1_SHA512,
409 ),
410 )?;
411 m.add(
412 "MLDSA87_ED448_SHAKE256",
413 oid_const(py, synta_certificate::oids::MLDSA87_ED448_SHAKE256),
414 )?;
415 m.add(
416 "MLDSA87_RSA3072_PSS_SHA512",
417 oid_const(py, synta_certificate::oids::MLDSA87_RSA3072_PSS_SHA512),
418 )?;
419 m.add(
420 "MLDSA87_RSA4096_PSS_SHA512",
421 oid_const(py, synta_certificate::oids::MLDSA87_RSA4096_PSS_SHA512),
422 )?;
423 m.add(
424 "MLDSA87_ECDSA_P521_SHA512",
425 oid_const(py, synta_certificate::oids::MLDSA87_ECDSA_P521_SHA512),
426 )?;
427
428 m.add("ED25519", oid_const(py, synta_certificate::oids::ED25519))?;
430 m.add("ED448", oid_const(py, synta_certificate::oids::ED448))?;
431
432 m.add(
434 "RSA_ENCRYPTION",
435 oid_const(py, synta_certificate::oids::RSA_ENCRYPTION),
436 )?;
437 m.add(
438 "MD5_WITH_RSA",
439 oid_const(py, synta_certificate::oids::MD5_WITH_RSA),
440 )?;
441 m.add(
442 "SHA1_WITH_RSA",
443 oid_const(py, synta_certificate::oids::SHA1_WITH_RSA),
444 )?;
445 m.add(
446 "SHA256_WITH_RSA",
447 oid_const(py, synta_certificate::oids::SHA256_WITH_RSA),
448 )?;
449 m.add(
450 "SHA384_WITH_RSA",
451 oid_const(py, synta_certificate::oids::SHA384_WITH_RSA),
452 )?;
453 m.add(
454 "SHA512_WITH_RSA",
455 oid_const(py, synta_certificate::oids::SHA512_WITH_RSA),
456 )?;
457 m.add("RSA", oid_const(py, synta_certificate::oids::RSA))?;
459 m.add(
461 "MD2_WITH_RSA",
462 oid_const(py, synta_certificate::oids::MD2_WITH_RSA),
463 )?;
464 m.add(
465 "SHA512_224_WITH_RSA",
466 oid_const(py, synta_certificate::oids::SHA512_224_WITH_RSA),
467 )?;
468 m.add(
469 "SHA512_256_WITH_RSA",
470 oid_const(py, synta_certificate::oids::SHA512_256_WITH_RSA),
471 )?;
472 m.add(
473 "RSASSA_PSS",
474 oid_const(py, synta_certificate::oids::RSASSA_PSS),
475 )?;
476 m.add(
477 "RSAES_OAEP",
478 oid_const(py, synta_certificate::oids::RSAES_OAEP),
479 )?;
480 m.add("MGF1", oid_const(py, synta_certificate::oids::MGF1))?;
481 m.add(
482 "P_SPECIFIED",
483 oid_const(py, synta_certificate::oids::P_SPECIFIED),
484 )?;
485
486 m.add(
488 "EC_PUBLIC_KEY",
489 oid_const(py, synta_certificate::oids::EC_PUBLIC_KEY),
490 )?;
491 m.add(
492 "ECDSA_WITH_SHA1",
493 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA1),
494 )?;
495 m.add(
496 "ECDSA_WITH_SHA256",
497 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA256),
498 )?;
499 m.add(
500 "ECDSA_WITH_SHA384",
501 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA384),
502 )?;
503 m.add(
504 "ECDSA_WITH_SHA512",
505 oid_const(py, synta_certificate::oids::ECDSA_WITH_SHA512),
506 )?;
507 m.add("ECDSA", oid_const(py, synta_certificate::oids::ECDSA_SIG))?;
509
510 m.add(
512 "EC_CURVE_P256",
513 oid_const(py, synta_certificate::oids::EC_CURVE_P256),
514 )?;
515 m.add(
516 "EC_CURVE_P384",
517 oid_const(py, synta_certificate::oids::EC_CURVE_P384),
518 )?;
519 m.add(
520 "EC_CURVE_P521",
521 oid_const(py, synta_certificate::oids::EC_CURVE_P521),
522 )?;
523 m.add(
524 "EC_CURVE_SECP256K1",
525 oid_const(py, synta_certificate::oids::EC_CURVE_SECP256K1),
526 )?;
527
528 m.add("SHA224", oid_const(py, synta_certificate::oids::ID_SHA224))?;
530 m.add("SHA256", oid_const(py, synta_certificate::oids::ID_SHA256))?;
531 m.add("SHA384", oid_const(py, synta_certificate::oids::ID_SHA384))?;
532 m.add("SHA512", oid_const(py, synta_certificate::oids::ID_SHA512))?;
533 m.add(
534 "SHA512_224",
535 oid_const(py, synta_certificate::oids::ID_SHA512_224),
536 )?;
537 m.add(
538 "SHA512_256",
539 oid_const(py, synta_certificate::oids::ID_SHA512_256),
540 )?;
541
542 m.add(
544 "SHA3_224",
545 oid_const(py, synta_certificate::oids::ID_SHA3_224),
546 )?;
547 m.add(
548 "SHA3_256",
549 oid_const(py, synta_certificate::oids::ID_SHA3_256),
550 )?;
551 m.add(
552 "SHA3_384",
553 oid_const(py, synta_certificate::oids::ID_SHA3_384),
554 )?;
555 m.add(
556 "SHA3_512",
557 oid_const(py, synta_certificate::oids::ID_SHA3_512),
558 )?;
559 m.add(
560 "SHAKE128",
561 oid_const(py, synta_certificate::oids::ID_SHAKE128),
562 )?;
563 m.add(
564 "SHAKE256",
565 oid_const(py, synta_certificate::oids::ID_SHAKE256),
566 )?;
567
568 m.add(
570 "SUBJECT_KEY_IDENTIFIER",
571 oid_const(py, synta_certificate::oids::SUBJECT_KEY_IDENTIFIER),
572 )?;
573 m.add(
574 "KEY_USAGE",
575 oid_const(py, synta_certificate::oids::KEY_USAGE),
576 )?;
577 m.add(
578 "SUBJECT_ALT_NAME",
579 oid_const(py, synta_certificate::oids::SUBJECT_ALT_NAME),
580 )?;
581 m.add(
582 "ISSUER_ALT_NAME",
583 oid_const(py, synta_certificate::oids::ISSUER_ALT_NAME),
584 )?;
585 m.add(
586 "BASIC_CONSTRAINTS",
587 oid_const(py, synta_certificate::oids::BASIC_CONSTRAINTS),
588 )?;
589 m.add(
590 "CRL_NUMBER",
591 oid_const(py, synta_certificate::oids::CRL_NUMBER),
592 )?;
593 m.add(
594 "CRL_DISTRIBUTION_POINTS",
595 oid_const(py, synta_certificate::oids::CRL_DISTRIBUTION_POINTS),
596 )?;
597 m.add(
598 "NAME_CONSTRAINTS",
599 oid_const(py, synta_certificate::oids::NAME_CONSTRAINTS),
600 )?;
601 m.add(
602 "CERTIFICATE_POLICIES",
603 oid_const(py, synta_certificate::oids::CERTIFICATE_POLICIES),
604 )?;
605 m.add(
606 "AUTHORITY_KEY_IDENTIFIER",
607 oid_const(py, synta_certificate::oids::AUTHORITY_KEY_IDENTIFIER),
608 )?;
609 m.add(
610 "EXTENDED_KEY_USAGE",
611 oid_const(py, synta_certificate::oids::EXTENDED_KEY_USAGE),
612 )?;
613 m.add(
614 "AUTHORITY_INFO_ACCESS",
615 oid_const(py, synta_certificate::oids::AUTHORITY_INFO_ACCESS),
616 )?;
617 m.add(
618 "CT_PRECERT_SCTS",
619 oid_const(py, synta_certificate::oids::CT_PRECERT_SCTS),
620 )?;
621 m.add(
622 "PE_ACME_IDENTIFIER",
623 oid_const(py, synta_certificate::oids::PE_ACME_IDENTIFIER),
624 )?;
625
626 m.add(
628 "KP_SERVER_AUTH",
629 oid_const(py, synta_certificate::oids::KP_SERVER_AUTH),
630 )?;
631 m.add(
632 "KP_CLIENT_AUTH",
633 oid_const(py, synta_certificate::oids::KP_CLIENT_AUTH),
634 )?;
635 m.add(
636 "KP_CODE_SIGNING",
637 oid_const(py, synta_certificate::oids::KP_CODE_SIGNING),
638 )?;
639 m.add(
640 "KP_EMAIL_PROTECTION",
641 oid_const(py, synta_certificate::oids::KP_EMAIL_PROTECTION),
642 )?;
643 m.add(
644 "KP_TIME_STAMPING",
645 oid_const(py, synta_certificate::oids::KP_TIME_STAMPING),
646 )?;
647 m.add(
648 "KP_OCSP_SIGNING",
649 oid_const(py, synta_certificate::oids::KP_OCSP_SIGNING),
650 )?;
651 m.add(
652 "ANY_EXTENDED_KEY_USAGE",
653 oid_const(py, synta_certificate::oids::ANY_EXTENDED_KEY_USAGE),
654 )?;
655
656 m.add(
658 "PKINIT_SAN",
659 oid_const(py, synta_certificate::oids::ID_PKINIT_SAN),
660 )?;
661 m.add(
662 "PKINIT_KP_CLIENT_AUTH",
663 oid_const(py, synta_certificate::oids::ID_PKINIT_KPCLIENT_AUTH),
664 )?;
665 m.add(
666 "PKINIT_KP_KDC",
667 oid_const(py, synta_certificate::oids::ID_PKINIT_KPKDC),
668 )?;
669 m.add(
670 "PKINIT_AUTH_DATA",
671 oid_const(py, synta_certificate::oids::ID_PKINIT_AUTH_DATA),
672 )?;
673 m.add(
674 "PKINIT_DHKEY_DATA",
675 oid_const(py, synta_certificate::oids::ID_PKINIT_DHKEY_DATA),
676 )?;
677 m.add(
678 "PKINIT_RKEY_DATA",
679 oid_const(py, synta_certificate::oids::ID_PKINIT_RKEY_DATA),
680 )?;
681 m.add(
682 "PKINIT_KDF",
683 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF),
684 )?;
685 m.add(
686 "PKINIT_KDF_SHA1",
687 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA1),
688 )?;
689 m.add(
690 "PKINIT_KDF_SHA256",
691 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA256),
692 )?;
693 m.add(
694 "PKINIT_KDF_SHA384",
695 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA384),
696 )?;
697 m.add(
698 "PKINIT_KDF_SHA512",
699 oid_const(py, synta_certificate::oids::ID_PKINIT_KDF_AH_SHA512),
700 )?;
701
702 m.add(
704 "MS_SAN_UPN",
705 oid_const(py, synta_certificate::oids::ID_MS_SAN_UPN),
706 )?;
707 m.add(
708 "MS_CERTIFICATE_TEMPLATE_NAME",
709 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE_NAME),
710 )?;
711 m.add(
712 "MS_CERTIFICATE_TEMPLATE",
713 oid_const(py, synta_certificate::oids::ID_MS_CERTIFICATE_TEMPLATE),
714 )?;
715 m.add(
716 "MS_KP_SMARTCARD_LOGON",
717 oid_const(py, synta_certificate::oids::ID_MS_KP_SMARTCARD_LOGON),
718 )?;
719 m.add(
720 "MS_NTDS_REPLICATION",
721 oid_const(py, synta_certificate::oids::ID_MS_NTDS_REPLICATION),
722 )?;
723
724 m.add("CMS_DATA", oid_const(py, synta_certificate::oids::CMS_DATA))?;
726 m.add(
727 "CMS_SIGNED_DATA",
728 oid_const(py, synta_certificate::oids::CMS_SIGNED_DATA),
729 )?;
730 m.add(
731 "CMS_ENVELOPED_DATA",
732 oid_const(py, synta_certificate::oids::CMS_ENVELOPED_DATA),
733 )?;
734 m.add(
735 "CMS_DIGESTED_DATA",
736 oid_const(py, synta_certificate::oids::CMS_DIGESTED_DATA),
737 )?;
738 m.add(
739 "CMS_ENCRYPTED_DATA",
740 oid_const(py, synta_certificate::oids::CMS_ENCRYPTED_DATA),
741 )?;
742 m.add(
743 "CMS_AUTH_DATA",
744 oid_const(py, synta_certificate::oids::CMS_AUTH_DATA),
745 )?;
746 m.add("CMS_ORI", oid_const(py, synta_certificate::oids::CMS_ORI))?;
748 m.add(
749 "CMS_ORI_KEM",
750 oid_const(py, synta_certificate::oids::CMS_ORI_KEM),
751 )?;
752
753 m.add(
755 "PKCS9_EMAIL_ADDRESS",
756 oid_const(py, synta_certificate::oids::PKCS9_EMAIL_ADDRESS),
757 )?;
758 m.add(
759 "PKCS9_CONTENT_TYPE",
760 oid_const(py, synta_certificate::oids::PKCS9_CONTENT_TYPE),
761 )?;
762 m.add(
763 "PKCS9_MESSAGE_DIGEST",
764 oid_const(py, synta_certificate::oids::PKCS9_MESSAGE_DIGEST),
765 )?;
766 m.add(
767 "PKCS9_SIGNING_TIME",
768 oid_const(py, synta_certificate::oids::PKCS9_SIGNING_TIME),
769 )?;
770 m.add(
771 "PKCS9_COUNTERSIGNATURE",
772 oid_const(py, synta_certificate::oids::PKCS9_COUNTERSIGNATURE),
773 )?;
774 m.add(
775 "PKCS9_CHALLENGE_PASSWORD",
776 oid_const(py, synta_certificate::oids::PKCS9_CHALLENGE_PASSWORD),
777 )?;
778 m.add(
779 "PKCS9_EXTENSION_REQUEST",
780 oid_const(py, synta_certificate::oids::PKCS9_EXTENSION_REQUEST),
781 )?;
782 m.add(
783 "PKCS9_FRIENDLY_NAME",
784 oid_const(py, synta_certificate::oids::PKCS9_FRIENDLY_NAME),
785 )?;
786 m.add(
787 "PKCS9_LOCAL_KEY_ID",
788 oid_const(py, synta_certificate::oids::PKCS9_LOCAL_KEY_ID),
789 )?;
790
791 m.add(
793 "ALG_UNSIGNED",
794 oid_const(py, synta_certificate::oids::ALG_UNSIGNED),
795 )?;
796 m.add(
797 "RDNA_UNSIGNED",
798 oid_const(py, synta_certificate::oids::RDNA_UNSIGNED),
799 )?;
800
801 m.add_function(wrap_pyfunction!(identify_signature_algorithm, &m)?)?;
803 m.add_function(wrap_pyfunction!(identify_public_key_algorithm, &m)?)?;
804 m.add_function(wrap_pyfunction!(ec_curve_short_name, &m)?)?;
805 m.add_function(wrap_pyfunction!(ec_curve_nist_name, &m)?)?;
806 m.add_function(wrap_pyfunction!(ec_curve_key_bits, &m)?)?;
807 m.add_function(wrap_pyfunction!(extension_oid_name, &m)?)?;
808
809 let attr = PyModule::new(py, "attr")?;
811 attr.add(
812 "__doc__",
813 "OIDs for X.500 Distinguished Name attribute types (RFC 4519).",
814 )?;
815 attr.add(
816 "COMMON_NAME",
817 oid_const(py, synta_certificate::oids::attr::COMMON_NAME),
818 )?;
819 attr.add(
820 "COUNTRY",
821 oid_const(py, synta_certificate::oids::attr::COUNTRY),
822 )?;
823 attr.add("STATE", oid_const(py, synta_certificate::oids::attr::STATE))?;
824 attr.add(
825 "LOCALITY",
826 oid_const(py, synta_certificate::oids::attr::LOCALITY),
827 )?;
828 attr.add(
829 "ORGANIZATION",
830 oid_const(py, synta_certificate::oids::attr::ORGANIZATION),
831 )?;
832 attr.add(
833 "ORG_UNIT",
834 oid_const(py, synta_certificate::oids::attr::ORG_UNIT),
835 )?;
836 attr.add(
837 "ORG_IDENTIFIER",
838 oid_const(py, synta_certificate::oids::attr::ORG_IDENTIFIER),
839 )?;
840 attr.add(
841 "STREET",
842 oid_const(py, synta_certificate::oids::attr::STREET),
843 )?;
844 attr.add(
845 "SURNAME",
846 oid_const(py, synta_certificate::oids::attr::SURNAME),
847 )?;
848 attr.add(
849 "GIVEN_NAME",
850 oid_const(py, synta_certificate::oids::attr::GIVEN_NAME),
851 )?;
852 attr.add(
853 "INITIALS",
854 oid_const(py, synta_certificate::oids::attr::INITIALS),
855 )?;
856 attr.add("TITLE", oid_const(py, synta_certificate::oids::attr::TITLE))?;
857 attr.add(
858 "SERIAL_NUMBER",
859 oid_const(py, synta_certificate::oids::attr::SERIAL_NUMBER),
860 )?;
861 attr.add(
862 "EMAIL_ADDRESS",
863 oid_const(py, synta_certificate::oids::attr::EMAIL_ADDRESS),
864 )?;
865 attr.add(
866 "USER_ID",
867 oid_const(py, synta_certificate::oids::attr::USER_ID),
868 )?;
869 attr.add(
870 "DOMAIN_COMPONENT",
871 oid_const(py, synta_certificate::oids::attr::DOMAIN_COMPONENT),
872 )?;
873 attr.add(
874 "BUSINESS_CATEGORY",
875 oid_const(py, synta_certificate::oids::attr::BUSINESS_CATEGORY),
876 )?;
877 attr.add(
878 "POSTAL_CODE",
879 oid_const(py, synta_certificate::oids::attr::POSTAL_CODE),
880 )?;
881 attr.add(
882 "GENERATION_QUALIFIER",
883 oid_const(py, synta_certificate::oids::attr::GENERATION_QUALIFIER),
884 )?;
885 attr.add(
886 "DN_QUALIFIER",
887 oid_const(py, synta_certificate::oids::attr::DN_QUALIFIER),
888 )?;
889 attr.add(
890 "PSEUDONYM",
891 oid_const(py, synta_certificate::oids::attr::PSEUDONYM),
892 )?;
893 attr.add(
894 "JURISDICTION_LOCALITY",
895 oid_const(py, synta_certificate::oids::attr::JURISDICTION_LOCALITY),
896 )?;
897 attr.add(
898 "JURISDICTION_STATE",
899 oid_const(py, synta_certificate::oids::attr::JURISDICTION_STATE),
900 )?;
901 attr.add(
902 "JURISDICTION_COUNTRY",
903 oid_const(py, synta_certificate::oids::attr::JURISDICTION_COUNTRY),
904 )?;
905
906 crate::install_submodule(&m, &attr, "synta.oids.attr", None)?;
907 crate::install_submodule(
908 parent,
909 &m,
910 "synta.oids",
911 Some("OID constants for X.509 signature, public-key, and extension algorithms."),
912 )
913}
914
915fn register_general_name_submodule(parent: &Bound<'_, PyModule>) -> PyResult<()> {
918 let py = parent.py();
919 let m = PyModule::new(py, "general_name")?;
920
921 m.add("OTHER_NAME", synta_certificate::general_name::OTHER_NAME)?;
923 m.add("RFC822_NAME", synta_certificate::general_name::RFC822_NAME)?;
924 m.add("DNS_NAME", synta_certificate::general_name::DNS_NAME)?;
925 m.add(
926 "X400_ADDRESS",
927 synta_certificate::general_name::X400_ADDRESS,
928 )?;
929 m.add(
930 "DIRECTORY_NAME",
931 synta_certificate::general_name::DIRECTORY_NAME,
932 )?;
933 m.add(
934 "EDI_PARTY_NAME",
935 synta_certificate::general_name::EDI_PARTY_NAME,
936 )?;
937 m.add("URI", synta_certificate::general_name::URI)?;
938 m.add("IP_ADDRESS", synta_certificate::general_name::IP_ADDRESS)?;
939 m.add(
940 "REGISTERED_ID",
941 synta_certificate::general_name::REGISTERED_ID,
942 )?;
943
944 m.add_class::<general_name::PyOtherName>()?;
946 m.add_class::<general_name::PyRfc822Name>()?;
947 m.add_class::<general_name::PyDnsName>()?;
948 m.add_class::<general_name::PyX400Address>()?;
949 m.add_class::<general_name::PyDirectoryName>()?;
950 m.add_class::<general_name::PyEdiPartyName>()?;
951 m.add_class::<general_name::PyUri>()?;
952 m.add_class::<general_name::PyIPAddress>()?;
953 m.add_class::<general_name::PyRegisteredId>()?;
954
955 crate::install_submodule(
956 parent,
957 &m,
958 "synta.general_name",
959 Some(concat!(
960 "Context-specific tag numbers for the ``GeneralName`` CHOICE type ",
961 "(RFC 5280 \u{a7}4.2.1.6).\n\n",
962 "These integer constants correspond to the first element of tuples returned by\n",
963 ":func:`~synta.parse_general_names` and ",
964 ":meth:`~synta.Certificate.subject_alt_names`.\n\n",
965 "Example usage::\n\n",
966 " import synta.general_name as gn\n",
967 " for tag, content in cert.subject_alt_names():\n",
968 " if tag == gn.DNS_NAME:\n",
969 " print('DNS:', content.decode())\n",
970 " elif tag == gn.IP_ADDRESS:\n",
971 " print('IP:', content.hex())",
972 )),
973 )
974}