Skip to content

Commit 76845fc

Browse files
committed
Enable public_key to decode empty RDNs
1 parent 2a6112b commit 76845fc

3 files changed

Lines changed: 107 additions & 19 deletions

File tree

lib/public_key/asn1/OTP-PKIX.asn1

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ IMPORTS
4242
at-x520OrganizationName, at-x520OrganizationalUnitName, at-x520Title,
4343
at-x520dnQualifier, at-x520SerialNumber, at-x520Pseudonym,
4444
at-domainComponent, at-emailAddress,
45-
id-at-countryName, id-emailAddress,
46-
ub-emailaddress-length,
45+
id-at-name, id-at-surname, id-at-givenName, id-at-initials, id-at-generationQualifier,
46+
id-at-commonName, id-at-localityName, id-at-stateOrProvinceName, id-at-organizationName,
47+
id-at-organizationalUnitName, id-at-title, id-at-countryName, id-at-serialNumber,
48+
id-at-pseudonym, id-emailAddress,
49+
ub-name, ub-common-name, ub-locality-name, ub-state-name, ub-organization-name,
50+
ub-organizational-unit-name, ub-title, ub-serial-number, ub-pseudonym, ub-emailaddress-length,
4751
Validity, Version, SubjectPublicKeyInfo,
4852
UniqueIdentifier,
4953
id-qt-unotice, id-qt-cps
@@ -137,32 +141,89 @@ OTPRelativeDistinguishedName ::=
137141
SET SIZE (1 .. MAX) OF SingleAttribute { {OTPSupportedAttributes} }
138142

139143
OTPSupportedAttributes ATTRIBUTE ::= {
140-
at-name | at-surname | at-givenName | at-initials |
141-
at-generationQualifier | at-x520CommonName |
142-
at-x520LocalityName | at-x520StateOrProvinceName |
143-
at-x520OrganizationName | at-x520OrganizationalUnitName |
144-
at-x520Title | at-x520dnQualifier | otp-at-x520countryName |
145-
at-x520SerialNumber | at-x520Pseudonym | at-domainComponent |
144+
otp-at-name | otp-at-surname | otp-at-givenName | otp-at-initials |
145+
otp-at-generationQualifier | otp-at-x520CommonName |
146+
otp-at-x520LocalityName | otp-at-x520StateOrProvinceName |
147+
otp-at-x520OrganizationName | otp-at-x520OrganizationalUnitName |
148+
otp-at-x520Title | at-x520dnQualifier | otp-at-x520countryName |
149+
otp-at-x520SerialNumber | otp-at-x520Pseudonym | at-domainComponent |
146150
otp-at-emailAddress, ... }
147151

148-
otp-at-x520countryName ATTRIBUTE ::= {
149-
TYPE OTP-X520countryName IDENTIFIED BY id-at-countryName }
152+
OTPDirectoryString{INTEGER:maxSize} ::= CHOICE {
153+
teletexString TeletexString(SIZE (0..maxSize)),
154+
printableString PrintableString(SIZE (0..maxSize)),
155+
bmpString BMPString(SIZE (0..maxSize)),
156+
universalString UniversalString(SIZE (0..maxSize)),
157+
-- Note: The tag was spelled as `uTF8String` in the
158+
-- RFC for unknown reason. That breaks backward
159+
-- for public_key.
160+
utf8String UTF8String(SIZE (0..maxSize))
161+
}
150162

151-
otp-at-emailAddress ATTRIBUTE ::= {
152-
TYPE OTP-emailAddress IDENTIFIED BY id-emailAddress }
163+
OTP-X520name ::= OTPDirectoryString { ub-name }
164+
165+
otp-at-name ATTRIBUTE ::= {
166+
TYPE OTP-X520name IDENTIFIED BY id-at-name }
167+
168+
otp-at-surname ATTRIBUTE ::= {
169+
TYPE OTP-X520name IDENTIFIED BY id-at-surname }
170+
171+
otp-at-givenName ATTRIBUTE ::= {
172+
TYPE OTP-X520name IDENTIFIED BY id-at-givenName }
173+
174+
otp-at-initials ATTRIBUTE ::= {
175+
TYPE OTP-X520name IDENTIFIED BY id-at-initials }
176+
177+
otp-at-generationQualifier ATTRIBUTE ::= {
178+
TYPE OTP-X520name IDENTIFIED BY id-at-generationQualifier }
179+
180+
otp-at-x520LocalityName ATTRIBUTE ::= {
181+
TYPE OTP-X520localityName IDENTIFIED BY id-at-localityName }
182+
OTP-X520localityName ::= OTPDirectoryString { ub-locality-name }
153183

154-
-- We accept utf8String encoding of the US-ASCII
155-
-- country name code and the mix up with other country code systems
156-
-- that uses three characters instead of two.
184+
otp-at-x520StateOrProvinceName ATTRIBUTE ::= {
185+
TYPE OTP-X520stateOrProvinceName IDENTIFIED BY id-at-stateOrProvinceName }
186+
OTP-X520stateOrProvinceName ::= OTPDirectoryString { ub-state-name }
157187

188+
otp-at-x520CommonName ATTRIBUTE ::= {
189+
TYPE OTP-X520commonName IDENTIFIED BY id-at-commonName }
190+
OTP-X520commonName ::= OTPDirectoryString { ub-common-name }
191+
192+
otp-at-x520OrganizationName ATTRIBUTE ::= {
193+
TYPE OTP-X520organizationName IDENTIFIED BY id-at-organizationName }
194+
OTP-X520organizationName ::= OTPDirectoryString { ub-organization-name }
195+
196+
otp-at-x520OrganizationalUnitName ATTRIBUTE ::= {
197+
TYPE OTP-X520organizationalUnitName IDENTIFIED BY id-at-organizationalUnitName }
198+
OTP-X520organizationalUnitName ::= OTPDirectoryString { ub-organizational-unit-name }
199+
200+
otp-at-x520Title ATTRIBUTE ::= {
201+
TYPE OTP-X520title IDENTIFIED BY id-at-title }
202+
OTP-X520title ::= OTPDirectoryString { ub-title }
203+
204+
otp-at-x520countryName ATTRIBUTE ::= {
205+
TYPE OTP-X520countryName IDENTIFIED BY id-at-countryName }
206+
-- We accept utf8String encoding of the US-ASCII
207+
-- country name code and the mix up with other country code systems
208+
-- that uses three characters instead of two.
158209
OTP-X520countryName ::= CHOICE {
159-
correct PrintableString (SIZE (2..3)), -- Correct size is 2.
160-
wrong UTF8String (SIZE (2..3))
210+
correct PrintableString (SIZE(0) | SIZE (2..3)), -- Correct size is 2.
211+
wrong UTF8String (SIZE(0) | SIZE (2..3))
161212
}
162213

214+
otp-at-x520SerialNumber ATTRIBUTE ::= {
215+
TYPE OTP-X520serialNumber IDENTIFIED BY id-at-serialNumber }
216+
OTP-X520serialNumber ::= OTPDirectoryString { ub-serial-number }
217+
218+
otp-at-x520Pseudonym ATTRIBUTE ::= {
219+
TYPE OTP-X520pseudonym IDENTIFIED BY id-at-pseudonym }
220+
OTP-X520pseudonym ::= OTPDirectoryString { ub-pseudonym }
221+
222+
otp-at-emailAddress ATTRIBUTE ::= {
223+
TYPE OTP-emailAddress IDENTIFIED BY id-emailAddress }
163224
OTP-emailAddress ::= CHOICE {
164-
correct IA5String (SIZE (1..ub-emailaddress-length)),
165-
wrong UTF8String
225+
correct IA5String (SIZE (0..ub-emailaddress-length)),
226+
wrong UTF8String
166227
}
167228

168229
-- We use this variation of SingleAttribute/AttributeTypeAndValue

lib/public_key/test/public_key_SUITE.erl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@
9999
pkix_emailaddress/1,
100100
pkix_decode_cert/0,
101101
pkix_decode_cert/1,
102+
pkix_decode_empty_rdns_cert/0,
103+
pkix_decode_empty_rdns_cert/1,
102104
pkix_path_validation/0,
103105
pkix_path_validation/1,
104106
pkix_path_validation_root_expired/0,
@@ -185,6 +187,7 @@ all() ->
185187
pkix_countryname,
186188
pkix_emailaddress,
187189
pkix_decode_cert,
190+
pkix_decode_empty_rdns_cert,
188191
pkix_path_validation,
189192
pkix_path_validation_root_expired,
190193
pkix_ext_key_usage,
@@ -932,6 +935,17 @@ pkix_decode_cert(Config) when is_list(Config) ->
932935

933936
#'OTPCertificate'{} = public_key:pkix_decode_cert(Der, otp).
934937

938+
%%--------------------------------------------------------------------
939+
pkix_decode_empty_rdns_cert() ->
940+
[{doc, "Ensure that a certificate with empty RDNs in issuer and subject can be decoded"}].
941+
pkix_decode_empty_rdns_cert(Config) when is_list(Config) ->
942+
DataDir = proplists:get_value(data_dir, Config),
943+
{ok, Bin} = file:read_file(filename:join(DataDir, "empty_rdns_cert.pem")),
944+
945+
[{_, DerCert, _}] = public_key:pem_decode(Bin),
946+
_ = public_key:pkix_decode_cert(DerCert, otp),
947+
ok.
948+
935949
%%--------------------------------------------------------------------
936950
pkix_path_validation() ->
937951
[{doc, "Test PKIX path validation"}].
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBtDCCAR+gAwIBAgIFAJW/cv0wCwYJKoZIhvcNAQELMCExCTAHBgNVBAYTADEJ
3+
MAcGA1UEChMAMQkwBwYDVQQDEwAwHhcNMjUwNzE2MTU0ODU5WhcNMjYwNzE2MTU0
4+
ODU5WjAhMQkwBwYDVQQGEwAxCTAHBgNVBAoTADEJMAcGA1UEAxMAMIGdMAsGCSqG
5+
SIb3DQEBAQOBjQAwgYkCgYEAx0hpK+Lk9TLEnzZApeJc3MxCbeB9ejE5qE0s2tIj
6+
cuLnSrwjB/zzo0tFeMBTYGSVic0hhYK/UXwlPKwYOce9Jy9SCyy27L82PSytD343
7+
2k5Zt9tlxn0sXqe2YeCE41pCK6JVtArixC7ZWZu37SMputv7dlqjss7f54Eg6fMS
8+
KbkCAwEAATALBgkqhkiG9w0BAQsDgYEAlhPrebIs/4Yjzsob9w6s2LDY0K5cBG+0
9+
5/PGMKESdFKPMtO/aKkb62n3HkJyCoEr7K8GmmPqz+5p2kMCQ/CmhuMW4Zjoc2DJ
10+
z0sZQlWH+Ux8DVInxibEniroak0KknZIAU3Ep9jrPy3FiuIwsjszHNIn6bM5uTTm
11+
seFAC9XvydI=
12+
-----END CERTIFICATE-----
13+

0 commit comments

Comments
 (0)