From 172617bf31a2ad33bf479dcc2bc34c3ed6d0936c Mon Sep 17 00:00:00 2001 From: Tom Leavy Date: Mon, 14 Nov 2022 17:10:40 -0500 Subject: [PATCH 1/2] countryName should always be PrintableString --- x509-cert/src/attr.rs | 8 +++++++- x509-cert/tests/name.rs | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/x509-cert/src/attr.rs b/x509-cert/src/attr.rs index 3d32c2515..b82e78da3 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; use core::fmt::{self, Write}; use const_oid::db::DB; @@ -181,8 +182,13 @@ impl AttributeTypeAndValue<'_> { parser.add(c)?; } + let tag = match oid { + COUNTRY_NAME => Tag::PrintableString, + _ => 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..69a174085 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::{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, From 9f90cd03a0f7d6287314f810d43eb36e957bf02f Mon Sep 17 00:00:00 2001 From: Tom Leavy Date: Mon, 14 Nov 2022 18:25:33 -0500 Subject: [PATCH 2/2] Represent DomainComponent as Ia5String --- x509-cert/src/attr.rs | 3 ++- x509-cert/tests/name.rs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/x509-cert/src/attr.rs b/x509-cert/src/attr.rs index b82e78da3..2b4336ad0 100644 --- a/x509-cert/src/attr.rs +++ b/x509-cert/src/attr.rs @@ -1,7 +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; +use const_oid::db::rfc4519::{COUNTRY_NAME, DOMAIN_COMPONENT}; use core::fmt::{self, Write}; use const_oid::db::DB; @@ -184,6 +184,7 @@ impl AttributeTypeAndValue<'_> { let tag = match oid { COUNTRY_NAME => Tag::PrintableString, + DOMAIN_COMPONENT => Tag::Ia5String, _ => Tag::Utf8String, }; diff --git a/x509-cert/tests/name.rs b/x509-cert/tests/name.rs index 69a174085..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, PrintableStringRef, 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; @@ -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()), }], ], ),