|
1 | 1 | #![cfg(feature = "pem")] |
2 | 2 |
|
3 | | -use std::cell::RefCell; |
4 | | -use std::io::{Error, ErrorKind, Read, Result as ioResult, Write}; |
5 | | -use std::rc::Rc; |
6 | | - |
7 | 3 | use openssl::asn1::{Asn1Integer, Asn1Time}; |
8 | 4 | use openssl::bn::BigNum; |
9 | 5 | use openssl::pkey::PKey; |
10 | 6 | use openssl::ssl::{HandshakeError, SslAcceptor, SslConnector, SslMethod}; |
11 | 7 | use openssl::stack::Stack; |
12 | 8 | use openssl::x509::store::{X509Store, X509StoreBuilder}; |
13 | 9 | use openssl::x509::{CrlStatus, X509Crl, X509Req, X509StoreContext, X509}; |
| 10 | +use std::cell::RefCell; |
| 11 | +use std::io::{Error, ErrorKind, Read, Result as ioResult, Write}; |
| 12 | +use std::rc::Rc; |
| 13 | +use std::str::FromStr; |
14 | 14 |
|
15 | 15 | use rcgen::{ |
16 | | - BasicConstraints, Certificate, CertificateParams, DnType, DnValue, GeneralSubtree, IsCa, |
17 | | - KeyPair, NameConstraints, |
| 16 | + BasicConstraints, Certificate, CertificateParams, DnType, DnValue, GeneralSubtree, Ia5String, |
| 17 | + IsCa, KeyPair, NameConstraints, |
18 | 18 | }; |
19 | 19 |
|
20 | 20 | mod util; |
@@ -540,3 +540,62 @@ fn test_openssl_pkcs1_and_sec1_keys() { |
540 | 540 | let pkcs8_ec_key_der = PrivateKeyDer::try_from(ec_key.private_key_to_pkcs8().unwrap()).unwrap(); |
541 | 541 | KeyPair::try_from(&pkcs8_ec_key_der).unwrap(); |
542 | 542 | } |
| 543 | + |
| 544 | +/// Command used to generate: |
| 545 | +/// `openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365 -subj "/C=US/ST=California/L=San Francisco/O=Example Company/OU=IT Department/CN=www.example.com/DC=example/DC=com"` |
| 546 | +/// Contains two distinct "DC" entries. |
| 547 | +const CERT_WITH_MULTI_DC: &str = r#"-----BEGIN CERTIFICATE----- |
| 548 | +MIIGSzCCBDOgAwIBAgIUECjoFzATY6rTCtu7HKjBtfXnB/owDQYJKoZIhvcNAQEL |
| 549 | +BQAwgbQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH |
| 550 | +DA1TYW4gRnJhbmNpc2NvMRgwFgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxFjAUBgNV |
| 551 | +BAsMDUlUIERlcGFydG1lbnQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEXMBUG |
| 552 | +CgmSJomT8ixkARkWB2V4YW1wbGUxEzARBgoJkiaJk/IsZAEZFgNjb20wHhcNMjQx |
| 553 | +MTIxMDkxNTE2WhcNMjUxMTIxMDkxNTE2WjCBtDELMAkGA1UEBhMCVVMxEzARBgNV |
| 554 | +BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xGDAWBgNVBAoM |
| 555 | +D0V4YW1wbGUgQ29tcGFueTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDEYMBYGA1UE |
| 556 | +AwwPd3d3LmV4YW1wbGUuY29tMRcwFQYKCZImiZPyLGQBGRYHZXhhbXBsZTETMBEG |
| 557 | +CgmSJomT8ixkARkWA2NvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB |
| 558 | +ANla4cBCTS+6JdEw6kVQHskanjtHbw7F25TZ2tZWC1f/UJuQnpF/JJqADdV6R3ta |
| 559 | +xjcGj2ubJnKS1npcdiVN6A95jYggbQqjfZV+Z0cxjL8L4dQ+UPDsNyP8W0+S6UnK |
| 560 | ++W813DG/QGXxEFrT8nZIfhyD4qZEtOSFGgp/ZA2f687Svx1+SKiutHeRovEf/OTb |
| 561 | +fK4NHhewa1IxiV7shYNy7hhJmDqcsRIhVfuiWn4TU++qB6JTiPATYmzFRALli7B6 |
| 562 | +g5m8KhvWcdAssgb2+bNpbs3fTcytrqwiNnNYtZ5a7DV0WWH4+wfor7KlomPMviPg |
| 563 | +jiFwWWKW/N5dQ+f9vpo7SDOT9Jl26BWj0vJYTceLgkOGwYMXsg7pbWmPH4sL+GNv |
| 564 | +WpRG7fDmual98y4DFwD8vHp4Mvax2OWKxfxe6xPqdn7or7D3ZSSyBu//ZlhQ6yMd |
| 565 | +F6tLTl2/5VcWdJy0W+FDEnZIHnPm3zyCiplEP4bxY2Blpdnqf5Cx80mz8YSQhddn |
| 566 | +gVNrM7iaNnIvRLjFS88w4KMOKbYSPbxEt2eWO4ggVcn1akcifDFTpyInRKQxQkXa |
| 567 | +SXH/iu2dm7kuyGwSwrIW1l41vUkT+Lsm/9TFQ3a+UWWzut4oux9oGmcuUP5EiUZb |
| 568 | +rWw2GIP2DaluKsZNUh8QIWVccBmX6AaKw3+K0r/tFqShAgMBAAGjUzBRMB0GA1Ud |
| 569 | +DgQWBBTru/FFL1lBGB6d1a1xe3Tn3wV/RzAfBgNVHSMEGDAWgBTru/FFL1lBGB6d |
| 570 | +1a1xe3Tn3wV/RzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCY |
| 571 | +dKu+CYxHb7drJqDhfMXUq2ogZiYI0fYyPEf+rpNpM5A8C0PyG9Um7WZwKAfp38IE |
| 572 | +a/McBidxI7TuNq9ojruIyY79LCThz64Z1Nc5rb3sthcygZLd1t98Zh8vaG07kk7s |
| 573 | +n2/BMLgHPvm47cUJ1VaQpLwx2tSBaFB+Osroq0ZXMqyO6s7Gyk+hrI+l6b+gqryA |
| 574 | +b8kHzbeslxPK6QkDz9Kt+qPkZVRgfKgyqyd0YGoe1LaAwctMdrTPZRzkFRDLYDls |
| 575 | +JK/PFi027oljJJzFZ07k9c8WJBeM3xiIHFlxIJ5XehVpLLFEhxX1ypnvku7GeINq |
| 576 | +I9356ueSmMPn1BIsLonTOYR3k1hue+giO5AiD6J3yl8OhJStouG3FOZbB5dDRae+ |
| 577 | +9bdhU4npsmKTmBX/CDUFYJl4yqavEGfvw40p77gaqIOShEBB54ASKDaSyuLSeYbi |
| 578 | +3TQsa+JyWmJ5iNmqVsAy8YfioKveNmyl023hRTjtqJgKQY1UzY6M0bnHa0IlgZq/ |
| 579 | +l4A7hDDsvi3rDFiqvKg/WTEZd5G87E9hwIcHF/bJPc+0+MjelRoxFTSty2bpbniR |
| 580 | +p3mmtsYxi+XCHdwUwRLhbBrdu93z5Iy3AWIb7vGeTKznnnDweJzYpfHCXuWZdr/d |
| 581 | +z6cbmudPzN1l99Op5eH9i1JikA+DQ8BQv1OgkNBw2A== |
| 582 | +-----END CERTIFICATE----- |
| 583 | +"#; |
| 584 | + |
| 585 | +#[test] |
| 586 | +#[cfg(feature = "x509-parser")] |
| 587 | +fn test_parse_certificate_with_multiple_domain_components() { |
| 588 | + let param = CertificateParams::from_ca_cert_pem(CERT_WITH_MULTI_DC).unwrap(); |
| 589 | + |
| 590 | + let domain_component_values = param.distinguished_name.get(&DnType::CustomDnType(vec![ |
| 591 | + 0, 9, 2342, 19200300, 100, 1, 25, |
| 592 | + ])); |
| 593 | + |
| 594 | + assert_eq!( |
| 595 | + domain_component_values, |
| 596 | + vec![ |
| 597 | + &DnValue::Ia5String(Ia5String::from_str("com").unwrap()), |
| 598 | + &DnValue::Ia5String(Ia5String::from_str("example").unwrap()), |
| 599 | + ] |
| 600 | + ) |
| 601 | +} |
0 commit comments