diff --git a/x509-cert/src/attr.rs b/x509-cert/src/attr.rs index 3d32c2515..2b4336ad0 100644 --- a/x509-cert/src/attr.rs +++ b/x509-cert/src/attr.rs @@ -1,6 +1,7 @@ //! Attribute-related definitions as defined in X.501 (and updated by RFC 5280). use alloc::vec::Vec; +use const_oid::db::rfc4519::{COUNTRY_NAME, DOMAIN_COMPONENT}; use core::fmt::{self, Write}; use const_oid::db::DB; @@ -181,8 +182,14 @@ impl AttributeTypeAndValue<'_> { parser.add(c)?; } + let tag = match oid { + COUNTRY_NAME => Tag::PrintableString, + DOMAIN_COMPONENT => Tag::Ia5String, + _ => Tag::Utf8String, + }; + // Serialize. - let value = AnyRef::new(Tag::Utf8String, parser.as_bytes())?; + let value = AnyRef::new(tag, parser.as_bytes())?; let atv = AttributeTypeAndValue { oid, value }; atv.to_vec() } diff --git a/x509-cert/tests/name.rs b/x509-cert/tests/name.rs index 6a4a5fa0b..e52b2c72c 100644 --- a/x509-cert/tests/name.rs +++ b/x509-cert/tests/name.rs @@ -1,7 +1,7 @@ //! Name tests use const_oid::ObjectIdentifier; -use der::asn1::{OctetStringRef, SetOfVec, Utf8StringRef}; +use der::asn1::{Ia5StringRef, OctetStringRef, PrintableStringRef, SetOfVec, Utf8StringRef}; use der::{AnyRef, Decode, Encode, Tag, Tagged}; use hex_literal::hex; use x509_cert::attr::AttributeTypeAndValue; @@ -207,7 +207,7 @@ fn rdns_serde() { &[ AttributeTypeAndValue { oid: const_oid::db::rfc4519::C, - value: AnyRef::from(Utf8StringRef::new("baz").unwrap()), + value: AnyRef::from(PrintableStringRef::new("baz").unwrap()), }, AttributeTypeAndValue { oid: const_oid::db::rfc4519::L, @@ -226,11 +226,11 @@ fn rdns_serde() { }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("example").unwrap()), + value: AnyRef::from(Ia5StringRef::new("example").unwrap()), }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("net").unwrap()), + value: AnyRef::from(Ia5StringRef::new("net").unwrap()), }], ], ), @@ -250,11 +250,11 @@ fn rdns_serde() { ], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("example").unwrap()), + value: AnyRef::from(Ia5StringRef::new("example").unwrap()), }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("net").unwrap()), + value: AnyRef::from(Ia5StringRef::new("net").unwrap()), }], ], ), @@ -268,11 +268,11 @@ fn rdns_serde() { }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("example").unwrap()), + value: AnyRef::from(Ia5StringRef::new("example").unwrap()), }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("net").unwrap()), + value: AnyRef::from(Ia5StringRef::new("net").unwrap()), }], ], ), @@ -286,11 +286,11 @@ fn rdns_serde() { }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("example").unwrap()), + value: AnyRef::from(Ia5StringRef::new("example").unwrap()), }], &[AttributeTypeAndValue { oid: const_oid::db::rfc4519::DC, - value: AnyRef::from(Utf8StringRef::new("net").unwrap()), + value: AnyRef::from(Ia5StringRef::new("net").unwrap()), }], ], ),