Internet DRAFT - draft-dkg-openpgp-userid-conventions
draft-dkg-openpgp-userid-conventions
openpgp D. K. Gillmor
Internet-Draft ACLU
Intended status: Informational 25 August 2023
Expires: 26 February 2024
OpenPGP User ID Conventions
draft-dkg-openpgp-userid-conventions-00
Abstract
OpenPGP User IDs are UTF-8 strings. Existing documents claim that by
conventione, they contain "an RFC 2822 name-addr object", but that's
not the case. This document attempts to better describe the actual
conventions about User IDs in the deployed OpenPGP ecosystem.
About This Document
This note is to be removed before publishing as an RFC.
The latest revision of this draft can be found at
https://dkg.gitlab.io/openpgp-userid-conventions/. Status
information for this document may be found at
https://datatracker.ietf.org/doc/draft-dkg-openpgp-userid-
conventions/.
Discussion of this document takes place on the OpenPGP Working Group
mailing list (mailto:openpgp@ietf.org), which is archived at
https://mailarchive.ietf.org/arch/browse/openpgp/. Subscribe at
https://www.ietf.org/mailman/listinfo/openpgp/.
Source for this draft and an issue tracker can be found at
https://gitlab.com/dkg/openpgp-userid-conventions.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
Gillmor Expires 26 February 2024 [Page 1]
Internet-Draft OpenPGP User ID Conventions August 2023
This Internet-Draft will expire on 26 February 2024.
Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components
extracted from this document must include Revised BSD License text as
described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Revised BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3
2. OpenPGP User ID Conventions . . . . . . . . . . . . . . . . . 3
3. Internationalized Domain Names . . . . . . . . . . . . . . . 4
4. Example User IDs . . . . . . . . . . . . . . . . . . . . . . 4
4.1. Conventional User IDs . . . . . . . . . . . . . . . . . . 4
4.2. Examples of Atypical User IDs . . . . . . . . . . . . . . 4
4.2.1. RFC 2047 Encoding of non-ASCII Characters . . . . . . 4
4.2.2. quoted-string Parts . . . . . . . . . . . . . . . . . 4
4.2.3. FWS . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.2.4. Comments . . . . . . . . . . . . . . . . . . . . . . 5
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 5
6. Security Considerations . . . . . . . . . . . . . . . . . . . 6
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 6
7.1. Normative References . . . . . . . . . . . . . . . . . . 6
7.2. Informative References . . . . . . . . . . . . . . . . . 6
Appendix A. Python Example . . . . . . . . . . . . . . . . . . . 7
Appendix B. Document History . . . . . . . . . . . . . . . . . . 8
B.1. Substantive Changes from Origin to
draft-ietf-openpgp-userid-conventions-00 . . . . . . . . 8
B.2. Origin . . . . . . . . . . . . . . . . . . . . . . . . . 9
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 9
1. Introduction
OpenPGP certificates contain User IDs. An OpenPGP User ID packet
contains a simple UTF-8 string. According to [RFC4880] and its
successor [I-D.ietf-openpgp-crypto-refresh]:
By convention, it includes an [RFC2822] mail name-addr
Gillmor Expires 26 February 2024 [Page 2]
Internet-Draft OpenPGP User ID Conventions August 2023
But in practice, this is not what most OpenPGP implementations
generate or expect. This document tries to better describe the
actual convention used.
1.1. Terminology
The term "OpenPGP Certificate" is used in this document
interchangeably with "OpenPGP Transferable Public Key", as defined in
Section 10.1 of [I-D.ietf-openpgp-crypto-refresh].
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
2. OpenPGP User ID Conventions
An OpenPGP User ID has no formal constraints other than being a UTF-8
string, but common conventions govern its use in specific contexts.
In the context of sending and receiving signed and encrypted e-mail
messages, a User ID typically contains an e-mail address. While
[RFC5322] and [RFC6531] describe an addr-spec as it is used e-mail
message headers (us-ascii in the former, and Unicode in the latter),
the common OpenPGP User ID convention is somewhat simpler, while
still permitting extraction of a valid addr-spec. An e-mail-oriented
OpenPGP implementation that follows this simpler convention is more
likely to be interoperable with Transferable Public Keys found in the
wild.
In particular, the common convention for an OpenPGP User ID related
to e-mail can be described with the following ABNF (see [RFC5234]),
which uses the Unicode-augmented definitions of atext and dot-atom-
text found in [RFC6532]:
openpgp-addr-spec = dot-atom-text "@" dot-atom-text
openpgp-email-prefix-char = atext / specials / SPACE
openpgp-email-wrapped-addr = *openpgp-uid-prefix-char
"<" openpgp-addr-spec ">"
openpgp-email-uid-convention = openpgp-addr-spec /
openpgp-email-wrapped-addr
Gillmor Expires 26 February 2024 [Page 3]
Internet-Draft OpenPGP User ID Conventions August 2023
Note that any openpgp-addr-spec described in the above sequence is
also a valid Unicode addr-spec. The only addr-specs not matched are
obsolete forms, or those with CWFS or quoted-string in the local
part, or those with domain literals for the domain part. Using such
a non-matching addr-spec in an OpenPGP User ID is likely to lead to
interoperability problems.
3. Internationalized Domain Names
FIXME: if a domain name in the openpgp-addr-spec contains non-ASCII
characters, will existing implementations accept A-labels? Or should
we encourage standardization on U-labels (see [RFC5980])?
4. Example User IDs
4.1. Conventional User IDs
Most tools will work fine with the following User IDs, even though
most of them are not technically [RFC5322] name-addr objects:
* Alice Jones <alice@example.org>
* Alice T. Jones <alice@example.org>
* Sean O'Brian <sean@example.org>
* Jörg Schmidt <js@example.org>
* Mr. Ed, the Talking Horse <ed@example.org>
* alice@example.org
4.2. Examples of Atypical User IDs
The following examples are UTF-8 strings that are valid [RFC5322]
name-addr objects, but would most likely cause interoperability
problems if they were used as an OpenPGP User ID:
4.2.1. RFC 2047 Encoding of non-ASCII Characters
Do not use [RFC2047] encoding:
=?utf-8?Q?J=C3=B6rg?= Schmidt <js@example.org>
4.2.2. quoted-string Parts
Do not use [RFC5322] quoted-string parts:
Gillmor Expires 26 February 2024 [Page 4]
Internet-Draft OpenPGP User ID Conventions August 2023
"Sean O'Brian" <sean@example.org>
4.2.3. FWS
Do not use Folding Whitespace (FWS) (Section 3.2.2 of [RFC5322]).
Alice Jones <alice@example.org>
It's probably not a good idea to include any control character or
whitespace character at all, other than " " (SPACE, U+0020) in an
OpenPGP User ID. Do not include newline, carriage returns, tab
characters, non-folding characters, byte order marks, etc.
Also, leading or trailing whitespace is likely to cause
interoperability failures in any context where the User ID must be
cleanly parsed.
4.2.4. Comments
Avoid Comments (Section 3.2.2 of [RFC5322]) with the possible
exception of a single comment just before the angle-bracket that
delimits the openpgp-addr-spec
FIXME: should we discourage comments entirely? See, for example, the
litany of complaints at https://dkg.fifthhorseman.net/blog/openpgp-
user-id-comments-considered-harmful.html
Alice (the Great) Jones <alice@example.org>
or
(The Great) Alice Jones <alice@example.org>
or
Alice Jones <alice@example.org> (The Great)
5. IANA Considerations
This draft asks IANA to make one change to the OpenPGP protocol
group.
In the "Packet Types/Tags registry", update row 13 ("User ID Packet")
by adding this document to the "Reference" field.
Gillmor Expires 26 February 2024 [Page 5]
Internet-Draft OpenPGP User ID Conventions August 2023
6. Security Considerations
This document describes widespread conventions about User IDs in the
OpenPGP ecosystem.
Generating an OpenPGP certificate with a User ID that does not match
these conventions may result in security failures when a peer tries
to find a certificate but cannot
7. References
7.1. Normative References
[RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
Thayer, "OpenPGP Message Format", RFC 4880,
DOI 10.17487/RFC4880, November 2007,
<https://www.rfc-editor.org/info/rfc4880>.
[I-D.ietf-openpgp-crypto-refresh]
Wouters, P., Huigens, D., Winter, J., and N. Yutaka,
"OpenPGP", Work in Progress, Internet-Draft, draft-ietf-
openpgp-crypto-refresh-10, 21 June 2023,
<https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-
crypto-refresh-10>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
Specifications: ABNF", STD 68, RFC 5234,
DOI 10.17487/RFC5234, January 2008,
<https://www.rfc-editor.org/info/rfc5234>.
[RFC6532] Yang, A., Steele, S., and N. Freed, "Internationalized
Email Headers", RFC 6532, DOI 10.17487/RFC6532, February
2012, <https://www.rfc-editor.org/info/rfc6532>.
7.2. Informative References
[RFC2822] Resnick, P., Ed., "Internet Message Format", RFC 2822,
DOI 10.17487/RFC2822, April 2001,
<https://www.rfc-editor.org/info/rfc2822>.
Gillmor Expires 26 February 2024 [Page 6]
Internet-Draft OpenPGP User ID Conventions August 2023
[RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
DOI 10.17487/RFC5322, October 2008,
<https://www.rfc-editor.org/info/rfc5322>.
[RFC6531] Yao, J. and W. Mao, "SMTP Extension for Internationalized
Email", RFC 6531, DOI 10.17487/RFC6531, February 2012,
<https://www.rfc-editor.org/info/rfc6531>.
[RFC5980] Sanda, T., Ed., Fu, X., Jeong, S., Manner, J., and H.
Tschofenig, "NSIS Protocol Operation in Mobile
Environments", RFC 5980, DOI 10.17487/RFC5980, March 2011,
<https://www.rfc-editor.org/info/rfc5980>.
[RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions)
Part Three: Message Header Extensions for Non-ASCII Text",
RFC 2047, DOI 10.17487/RFC2047, November 1996,
<https://www.rfc-editor.org/info/rfc2047>.
Appendix A. Python Example
The following Python example can be used to parse a conventional
OpenPGP User ID:
Gillmor Expires 26 February 2024 [Page 7]
Internet-Draft OpenPGP User ID Conventions August 2023
#!/usr/bin/python3
from typing import Optional, Tuple
import re
def openpgp_userid(test: str) -> Optional[Tuple[str, str]]:
'''Returns a None if `test` is not a conventional User ID.
if `test` is a conventional User ID, returns a Tuple containing
the User ID and the embedded e-mail address.'''
specials = r'[()<>\[\]:;@\\,."]'
atext = "[-A-Za-z0-9!#$%&'*+/=?^_`{|}~\x80-\U0010ffff]"
dot_atom_text = atext + r"+(?:\." + atext + "+)*"
pgp_addr_spec = dot_atom_text + "@" + dot_atom_text
pgp_uid_prefix_char = "(?:" + atext + "|" + specials + "| )"
addr_spec_raw = "(?P<addr_spec_raw>" + pgp_addr_spec + ")"
addr_spec_wrapped = pgp_uid_prefix_char + \
"*<(?P<addr_spec_wrapped>" + pgp_addr_spec + ")>"
pgp_uid_convention = "^(?:" + addr_spec_raw + "|" + \
addr_spec_wrapped + ")$"
pgp_uid_convention_re = re.compile(pgp_uid_convention,
re.UNICODE)
m = pgp_uid_convention_re.search(test)
if m:
return (m[0], m['addr_spec_wrapped'] or m['addr_spec_raw'])
else:
return None
Appendix B. Document History
RFC Editor Note: Please delete this section before publication.
B.1. Substantive Changes from Origin to draft-ietf-openpgp-userid-
conventions-00
* added positive and negative examples
* added Python implementation
* added FIXME about internationalized domain names
Gillmor Expires 26 February 2024 [Page 8]
Internet-Draft OpenPGP User ID Conventions August 2023
B.2. Origin
This was originally discussed on the mailing list at
https://mailarchive.ietf.org/arch/msg/openpgp/
wNo27-0STfGR9JZSlC7s6OYOJkI and was formulated as a patch to the
OpenPGP specification at
https://mailarchive.ietf.org/arch/msg/openpgp/
wNo27-0STfGR9JZSlC7s6OYOJkI .
Author's Address
Daniel Kahn Gillmor
ACLU
Email: dkg@fifthhorseman.net
Gillmor Expires 26 February 2024 [Page 9]