<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version  -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dkg-openpgp-stateless-cli-02" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 2.40.1 -->
  <front>
    <title>Stateless OpenPGP Command Line Interface</title>
    <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-stateless-cli-02"/>
    <author initials="D.K." surname="Gillmor" fullname="Daniel Kahn Gillmor">
      <organization abbrev="ACLU">American Civil Liberties Union</organization>
      <address>
        <postal>
          <street>125 Broad St.</street>
          <city>New York, NY</city>
          <code>10004</code>
          <country>USA</country>
        </postal>
        <email>dkg@fifthhorseman.net</email>
      </address>
    </author>
    <date year="2020" month="March" day="06"/>
    <area>int</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines a generic stateless command-line interface for dealing with OpenPGP messages, known as <tt>sop</tt>.
It aims for a minimal, well-structured API covering OpenPGP object security.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Different OpenPGP implementations have many different requirements, which typically break down in two main categories: key/certificate management and object security.</t>
      <t>The purpose of this document is to provide a "stateless" interface that primarily handles the object security side of things, and assumes that secret key management and certificate management will be handled some other way.</t>
      <t>Isolating object security from key/certificate management should make it easier to provide interoperability testing for the object security side of OpenPGP implementations, as described in <xref target="test-suite" format="default"/>.</t>
      <t>This document defines a generic stateless command-line interface for dealing with OpenPGP messages, known here by the placeholder <tt>sop</tt>.
It aims for a minimal, well-structured API.</t>
      <t>An OpenPGP implementation should not name its executable <tt>sop</tt> to implement this specification.  It just needs to provide a program that conforms to this interface.</t>
      <t>A <tt>sop</tt> implementation should leave no trace on the system, and its behavior should not be affected by anything other than command-line arguments and input.</t>
      <t>Obviously, the user will need to manage their secret keys (and their peers' certificates) somehow,
but the goal of this interface is to separate out that task from the task of interacting with OpenPGP messages.</t>
      <t>While this document identifies a command-line interface,
the rough outlines of this interface should also be amenable to relatively straightforward library implementations in different languages.</t>
      <section anchor="requirements-language" numbered="true" toc="default">
        <name>Requirements Language</name>
        <t>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 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
      <section anchor="terminology" numbered="true" toc="default">
        <name>Terminology</name>
        <t>This document uses the term "key" to refer exclusively to OpenPGP Transferable Secret Keys (see section 11.2 of <xref target="RFC4880" format="default"/>).</t>
        <t>It uses the term "certificate" to refer to OpenPGP Transferable Public Key (see section 11.1 of <xref target="RFC4880" format="default"/>).</t>
        <t>"Stateless" in "Stateless OpenPGP" means avoiding secret key and certificate state.
The user is responsible for managing all OpenPGP certificates and secret keys themselves,
and passing them to <tt>sop</tt> as needed.
The user should also not be concerned that any state could affect the underlying operations.</t>
        <t>OpenPGP revocations can have "Reason for Revocation" (section 5.2.3.23 of <xref target="RFC4880" format="default"/>), which can be either "soft" or "hard".
The set of "soft" reasons is: "Key is superseded" and "Key is retired and no longer used".
All other reasons (and revocations that do not state a reason) are "hard" revocations.</t>
      </section>
      <section anchor="test-suite" numbered="true" toc="default">
        <name>Using sop in a Test Suite</name>
        <t>If an OpenPGP implementation provdids a <tt>sop</tt> interface, it can be used to test interoperability (e.g., <xref target="OpenPGP-Interoperability-Test-Suite" format="default"/>).</t>
        <t>Such an interop test suite can, for example, use custom code (<em>not</em> <tt>sop</tt>) to generate a new OpenPGP object that incorporates new primitives, and feed that object to a stable of <tt>sop</tt> implementations, to determine whether those implementations can consume the new form.</t>
        <t>Or, the test suite can drive each <tt>sop</tt> implementation with a simple input, and observe which cryptographic primitives each implementation chooses to use as it produces output.</t>
      </section>
    </section>
    <section anchor="examples" numbered="true" toc="default">
      <name>Examples</name>
      <t>These examples show no error checking, but give a flavor of how <tt>sop</tt> might be used in practice from a shell.</t>
      <t>The key and certificate files described in them (e.g. <tt>alice.sec</tt>) could be for example those found in <xref target="I-D.draft-bre-openpgp-samples-00" format="default"/>.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
sop generate-key "Alice Lovelace <alice@openpgp.example>" > alice.sec
sop extract-cert < alice.sec > alice.pgp

sop sign --as=text alice.sec < statement.txt > statement.txt.asc
sop verify announcement.txt.asc alice.pgp < announcement.txt

sop encrypt --sign-with=alice.sec --as=mime bob.pgp < msg.eml > encrypted.asc
sop decrypt alice.sec < ciphertext.asc > cleartext.out
]]></artwork>
      <t>See <xref target="failure-modes" format="default"/> for more information about errors and error handling.</t>
    </section>
    <section anchor="subcommands" numbered="true" toc="default">
      <name>Subcommands</name>
      <t><tt>sop</tt> uses a subcommand interface, similar to those popularized by systems like <tt>git</tt> and <tt>svn</tt>.</t>
      <t>If the user supplies a subcommand that <tt>sop</tt> does not implement, it fails with <tt>UNSUPPORTED_SUBCOMMAND</tt>.
If a <tt>sop</tt> implementation does not handle a supplied option for a given subcommand, it fails with <tt>UNSUPPORTED_OPTION</tt>.</t>
      <t>All subcommands that produce OpenPGP material on standard output produce ASCII-armored (section 6 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>) objects by default (except for <tt>sop dearmor</tt>).
These subcommands have a <tt>--no-armor</tt> option, which causes them to produce binary OpenPGP material instead.</t>
      <t>All subcommands that accept OpenPGP material on input should be able to accept either ASCII-armored or binary inputs (see <xref target="optional-input-armoring" format="default"/>) and behave accordingly.</t>
      <t>See <xref target="indirect-types" format="default"/> for details about how various forms of OpenPGP material are expected to be structured.</t>
      <section anchor="version" numbered="true" toc="default">
        <name>version: Version Information</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop version
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: ignored</li>
          <li>Standard Output: version string</li>
        </ul>
        <t>The version string emitted should contain the name of the <tt>sop</tt> implementation, followed by a single space, followed by the version number.
A <tt>sop</tt> implementation should use a version number that respects an established standard that is easily comparable and parsable, like <xref target="SEMVER" format="default"/>.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop version
ExampleSop 0.2.1
$
]]></artwork>
      </section>
      <section anchor="generate-key" numbered="true" toc="default">
        <name>generate-key: Generate a Secret Key</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop generate-key [--no-armor] [--] [USERID...]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: ignored</li>
          <li>Standard Output: <tt>KEY</tt> (<xref target="key" format="default"/>)</li>
        </ul>
        <t>Generate a single default OpenPGP key with zero or more User IDs.</t>
        <t>The generated secret key SHOULD be usable for as much of the <tt>sop</tt> functionality as possible.
In particular:</t>
        <ul spacing="normal">
          <li>It should be possible to extract an OpenPGP certificate from the <tt>KEY</tt> with <tt>sop extract-cert</tt>.</li>
          <li>The <tt>KEY</tt> should be able to create signatures (with <tt>sop sign</tt>) that are verifiable by using <tt>sop verify</tt> with the extracted certificate.</li>
          <li>The <tt>KEY</tt> should be able to decrypt messages (with <tt>sop decrypt</tt>) that are encrypted by using <tt>sop encrypt</tt> with the extracted certificate.</li>
        </ul>
        <t>The detailed internal structure of the certificate is left to the discretion of the <tt>sop</tt> implementation.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop generate-key 'Alice Lovelace <alice@openpgp.example>' > alice.sec
$ head -n1 < alice.sec
-----BEGIN PGP PRIVATE KEY BLOCK-----
$
]]></artwork>
      </section>
      <section anchor="extract-cert" numbered="true" toc="default">
        <name>extract-cert: Extract a Certificate from a Secret Key</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop extract-cert [--no-armor]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>KEY</tt> (<xref target="key" format="default"/>)</li>
          <li>Standard Output: <tt>CERTS</tt> (<xref target="certs" format="default"/>)</li>
        </ul>
        <t>Note that the resultant <tt>CERTS</tt> object will only ever contain one OpenPGP certificate, since <tt>KEY</tt> contains exactly one OpenPGP Transferable Secret Key.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop extract-cert < alice.sec > alice.pgp
$ head -n1 < alice.pgp
-----BEGIN PGP PUBLIC KEY BLOCK-----
$
]]></artwork>
      </section>
      <section anchor="sign" numbered="true" toc="default">
        <name>sign: Create Detached Signatures</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop sign [--no-armor]
     [--as={binary|text}] [--] KEY [KEY...]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>DATA</tt> (<xref target="data" format="default"/>)</li>
          <li>Standard Output: <tt>SIGNATURES</tt> (<xref target="signature" format="default"/>)</li>
        </ul>
        <t>Exactly one signature will be made by each supplied <tt>KEY</tt>.</t>
        <t><tt>--as</tt> defaults to <tt>binary</tt>.  If <tt>--as=text</tt> and the input <tt>DATA</tt> is
not valid <tt>UTF-8</tt> (<xref target="utf8" format="default"/>), <tt>sop sign</tt> fails with <tt>EXPECTED_TEXT</tt>.</t>
        <t><tt>--as=binary</tt> SHOULD result in an OpenPGP signature of type 0x00 ("Signature of a binary document").
<tt>--as=text</tt> SHOULD result in an OpenPGP signature of type 0x01 ("Signature of a canonical text document").
See section 5.2.1 of <xref target="RFC4880" format="default"/> for more details.</t>
        <t><tt>sop sign</tt> MUST NOT produce any extra signatures beyond those from <tt>KEY</tt> objects supplied on the command line.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop sign --as=text alice.sec < message.txt > message.txt.asc
$ head -n1 < message.txt.asc
-----BEGIN PGP SIGNATURE-----
$
]]></artwork>
      </section>
      <section anchor="verify" numbered="true" toc="default">
        <name>verify: Verify Detached Signatures</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop verify [--not-before=DATE] [--not-after=DATE]
    [--] SIGNATURES CERTS [CERTS...]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>DATA</tt> (<xref target="data" format="default"/>)</li>
          <li>Standard Output: <tt>VERIFICATIONS</tt> (<xref target="verifications" format="default"/>)</li>
        </ul>
        <t><tt>--not-before</tt> and <tt>--not-after</tt> indicate that signatures with dates outside certain range MUST NOT be considered valid.</t>
        <t><tt>--not-before</tt> defaults to the beginning of time.
Accepts the special value <tt>-</tt> to indicate the beginning of time (i.e. no lower boundary).</t>
        <t><tt>--not-after</tt> defaults to the current system time (<tt>now</tt>).
Accepts the special value <tt>-</tt> to indicate the end of time (i.e. no upper boundary).</t>
        <t><tt>sop verify</tt> only returns <tt>OK</tt> if at least one certificate included in any <tt>CERTS</tt> object made a valid signature in the range over the <tt>DATA</tt> supplied.</t>
        <t>For details about the valid signatures, the user MUST inspect the <tt>VERIFICATIONS</tt> output.</t>
        <t>If no <tt>CERTS</tt> are supplied, <tt>sop verify</tt> fails with <tt>MISSING_ARG</tt>.</t>
        <t>If no valid signatures are found, <tt>sop verify</tt> fails with <tt>NO_SIGNATURE</tt>.</t>
        <t>See <xref target="signature-verification" format="default"/> for more details about signature verification.</t>
        <t>Example:</t>
        <t>(In this example, we see signature verification succeed first, and then fail on a modified version of the message.)</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop verify message.txt.asc alice.pgp < message.txt
2019-10-29T18:36:45Z EB85BB5FA33A75E15E944E63F231550C4F47E38E EB85BB5FA33A75E15E944E63F231550C4F47E38E signed by alice.pgp
$ echo $?
0
$ tr a-z A-Z < message.txt | sop verify message.txt.asc alice.pgp
$ echo $?
3
$
]]></artwork>
      </section>
      <section anchor="encrypt" numbered="true" toc="default">
        <name>encrypt: Encrypt a Message</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop encrypt [--as={binary|text|mime}]
    [--no-armor]
    [--with-password=PASSWORD...]
    [--sign-with=KEY...]
    [--] [CERTS...]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>DATA</tt> (<xref target="data" format="default"/>)</li>
          <li>Standard Output: <tt>CIPHERTEXT</tt> (<xref target="ciphertext" format="default"/>)</li>
        </ul>
        <t><tt>--as</tt> defaults to <tt>binary</tt>.
The setting of <tt>--as</tt> corresponds to the one octet format field found in the Literal Data packet at the core of the output <tt>CIPHERTEXT</tt>.
If <tt>--as</tt> is set to <tt>binary</tt>, the octet is <tt>b</tt> (<tt>0x62</tt>).
If it is <tt>text</tt>, the format octet is <tt>u</tt> (<tt>0x75</tt>).
If it is <tt>mime</tt>, the format octet is <tt>m</tt> (<tt>0x6d</tt>).</t>
        <t><tt>--with-password</tt> enables symmetric encryption (and can be used multiple times if multiple passwords are desired).
If <tt>sop encrypt</tt> encounters a <tt>PASSWORD</tt> which is not a valid <tt>UTF-8</tt> string (<xref target="utf8" format="default"/>), or is otherwise not robust in its representation to humans,
it fails with <tt>PASSWORD_NOT_HUMAN_READABLE</tt>.
If <tt>sop encrypt</tt> sees trailing whitespace at the end of a <tt>PASSWORD</tt>,
it will trim the trailing whitespace before using the password.
See <xref target="human-readable-passwords" format="default"/> for more discussion about passwords.</t>
        <t><tt>--sign-with</tt> creates exactly one signature by the identified secret key (and can be used multiple times if signatures from multiple keys are desired).</t>
        <t>If <tt>--as</tt> is set to <tt>binary</tt>, then <tt>--sign-with</tt> will sign as a binary document (OpenPGP signature type <tt>0x00</tt>).</t>
        <t>If <tt>--as</tt> is set to <tt>text</tt>, then <tt>--sign-with</tt> will sign as a canonical text document (OpenPGP signature type <tt>0x01</tt>).
In this case, if the input <tt>DATA</tt> is not valid <tt>UTF-8</tt>  (<xref target="utf8" format="default"/>), <tt>sop encrypt</tt> fails with <tt>EXPECTED_TEXT</tt>.</t>
        <t><tt>sop</tt> should only be invoked with <tt>--as=mime</tt> when the input <tt>DATA</tt> is a MIME message (<xref target="RFC2045" format="default"/>.
If <tt>--sign-with</tt> is supplied for such a message, then if the input data is valid <tt>UTF-8</tt>,  <tt>sop</tt> SHOULD sign as a canonical text document (OpenPGP signature type <tt>0x01</tt>).
However, a MIME message itself might not be valid <tt>UTF-8</tt>, for example, if a MIME subpart contains a raw binary object.
If <tt>--sign-with</tt> is supplied for input <tt>DATA</tt> that is not valid <tt>UTF-8</tt>, <tt>sop encrypt</tt> MAY sign as a binary document (OpenPGP signature type <tt>0x00</tt>).</t>
        <t><tt>sop encrypt</tt> MUST NOT produce any extra signatures beyond those from <tt>KEY</tt> objects identified by <tt>--sign-with</tt>.</t>
        <t>The resulting <tt>CIPHERTEXT</tt> should be decryptable by the secret keys corresponding to every certificate included in all <tt>CERTS</tt>, as well as each password given with <tt>--with-password</tt>.</t>
        <t>If no <tt>CERTS</tt> or <tt>--with-password</tt> options are present, <tt>sop encrypt</tt> fails with <tt>MISSING_ARG</tt>.</t>
        <t>If at least one of the identified certificates requires encryption to an unsupported asymmetric algorithm, <tt>sop encrypt</tt> fails with <tt>UNSUPPORTED_ASYMMETRIC_ALGO</tt>.</t>
        <t>If at least one of the identified certificates is not encryption-capable (e.g., revoked, expired, no encryption-capable flags on primary key and valid subkeys), <tt>sop encrypt</tt> fails with <tt>CERT_CANNOT_ENCRYPT</tt>.</t>
        <t>If <tt>sop encrypt</tt> fails for any reason, it emits no <tt>CIPHERTEXT</tt>.</t>
        <t>Example:</t>
        <t>(In this example, <tt>bob.bin</tt> is a file containing Bob's binary-formatted OpenPGP certificate.
Alice is encrypting a message to both herself and Bob.)</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop encrypt --as=mime --sign-with=alice.key alice.asc bob.bin < message.eml > encrypted.asc
$ head -n1 encrypted.asc
-----BEGIN PGP MESSAGE-----
$
]]></artwork>
      </section>
      <section anchor="decrypt" numbered="true" toc="default">
        <name>decrypt: Decrypt a Message</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop decrypt [--session-key-out=SESSIONKEY]
    [--with-session-key=SESSIONKEY...]
    [--with-password=PASSWORD...]
    [--verify-out=VERIFICATIONS
     [--verify-with=CERTS...]
     [--verify-not-before=DATE]
     [--verify-not-after=DATE] ]
    [--] [KEY...]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>CIPHERTEXT</tt> (<xref target="ciphertext" format="default"/>)</li>
          <li>Standard Output: <tt>DATA</tt> (<xref target="data" format="default"/>)</li>
        </ul>
        <t>The caller can ask <tt>sop</tt> for the session key discovered during decryption by supplying the <tt>--session-key-out</tt> option.
If the specified file already exists in the filesystem, <tt>sop decrypt</tt> will fail with <tt>OUTPUT_EXISTS</tt>.
When decryption is successful, <tt>sop decrypt</tt> writes the discovered session key to the specified file.</t>
        <t><tt>--with-session-key</tt> enables decryption of the <tt>CIPHERTEXT</tt> using the session key directly against the <tt>SEIPD</tt> packet.
This option can be used multiple times if several possible session keys should be tried.</t>
        <t><tt>--with-password</tt> enables decryption based on any <tt>SKESK</tt> (section 5.3 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>) packets in the <tt>CIPHERTEXT</tt>.
This option can be used multiple times if the user wants to try more than one password.</t>
        <t>If <tt>sop decrypt</tt> tries and fails to use a supplied <tt>PASSWORD</tt>,
and it observes that there is trailing <tt>UTF-8</tt> whitespace at the end of the <tt>PASSWORD</tt>,
it will retry with the trailing whitespace stripped.
See <xref target="human-readable-passwords" format="default"/> for more discussion about passwords.</t>
        <t><tt>--verify-out</tt> produces signature verification status to the designated file.
If the designated file already exists in the filesystem, <tt>sop decrypt</tt> will fail with <tt>OUTPUT_EXISTS</tt>.</t>
        <t>The return code of <tt>sop decrypt</tt> is not affected by the results of signature verification.
The caller MUST check the returned <tt>VERIFICATIONS</tt> to confirm signature status.
An empty <tt>VERIFICATIONS</tt> output indicates that no valid signatures were found.</t>
        <t><tt>--verify-with</tt> identifies a set of certificates whose signatures would be acceptable for signatures over this message.</t>
        <t>If the caller is interested in signature verification, both <tt>--verify-out</tt> and at least one <tt>--verify-with</tt> must be supplied.
If only one of these arguments is supplied, <tt>sop decrypt</tt> fails with <tt>INCOMPLETE_VERIFICATION</tt>.</t>
        <t><tt>--verify-not-before</tt> and <tt>--verify-not-after</tt> provide a date range for acceptable signatures,
by analogy with the options for <tt>sop verify</tt> (see <xref target="verify" format="default"/>).
They should only be supplied when doing signature verification.</t>
        <t>See <xref target="signature-verification" format="default"/> for more details about signature verification.</t>
        <t>If no <tt>KEY</tt> or <tt>--with-password</tt> or <tt>--with-session-key</tt> options are present, <tt>sop decrypt</tt> fails with <tt>MISSING_ARG</tt>.</t>
        <t>If unable to decrypt, <tt>sop decrypt</tt> fails with <tt>CANNOT_DECRYPT</tt>.</t>
        <t><tt>sop decrypt</tt> only emits cleartext to Standard Output that was successfully decrypted.</t>
        <t>Example:</t>
        <t>(In this example, Alice stashes and re-uses the session key of an encrypted message.)</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop decrypt --session-key-out=session.key alice.sec < ciphertext.asc > cleartext.out
$ ls -l ciphertext.asc cleartext.out
-rw-r--r-- 1 user user   321 Oct 28 01:34 ciphertext.asc
-rw-r--r-- 1 user user   285 Oct 28 01:34 cleartext.out
$ sop decrypt --with-session-key=session.key < ciphertext.asc > cleartext2.out
$ diff cleartext.out cleartext2.out
$
]]></artwork>
      </section>
      <section anchor="armor-convert-binary-to-ascii" numbered="true" toc="default">
        <name>armor: Convert binary to ASCII</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop armor [--label={auto|sig|key|cert|message}]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: OpenPGP material (<tt>SIGNATURES</tt>, <tt>KEY</tt>, <tt>CERTS</tt>, or <tt>CIPHERTEXT</tt>)</li>
          <li>Standard Output: the same material with ASCII-armoring added, if not already present</li>
        </ul>
        <t>The user can choose to specify the label used in the header and tail of the armoring.</t>
        <t>The default for <tt>--label</tt> is <tt>auto</tt>, in which case, <tt>sop</tt> inspects the input and chooses the label appropriately, based on the type of the first OpenPGP packet.
If the type of the first OpenPGP packet is:</t>
        <ul spacing="normal">
          <li>
            <tt>0x02</tt> (Signature), the packet stream should be parsed as a <tt>SIGNATURES</tt> input (with Armor Header <tt>BEGIN PGP SIGNATURE</tt>).</li>
          <li>
            <tt>0x05</tt> (Secret-Key), the packet stream should be parsed as a <tt>KEY</tt> input (with Armor Header <tt>BEGIN PGP PRIVATE KEY BLOCK</tt>).</li>
          <li>
            <tt>0x06</tt> (Public-Key), the packet stream should be parsed as a <tt>CERTS</tt> input (with Armor Header <tt>BEGIN PGP PUBLIC KEY BLOCK</tt>).</li>
          <li>
            <tt>0x01</tt> (Public-key Encrypted Session Key) or <tt>0x03</tt> (Symmetric-key Encrypted Session Key), the packet stream should be parsed as a <tt>CIPHERTEXT</tt> input (with Armor Header <tt>BEGIN PGP MESSAGE</tt>).</li>
        </ul>
        <t>If the input packet stream does not match the expected sequence of packet types, <tt>sop armor</tt> fails with <tt>BAD_DATA</tt>.</t>
        <t>Since <tt>sop armor</tt> accepts ASCII-armored input as well as binary input, this operation is idempotent on well-structured data.
A caller can use this subcommand blindly ensure that any well-formed OpenPGP packet stream is 7-bit clean.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop armor < bob.bin > bob.pgp
$ head -n1 bob.pgp
-----BEGIN PGP PUBLIC KEY BLOCK-----
$
]]></artwork>
      </section>
      <section anchor="dearmor-convert-ascii-to-binary" numbered="true" toc="default">
        <name>dearmor: Convert ASCII to binary</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop dearmor
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: OpenPGP material (<tt>SIGNATURES</tt>, <tt>KEY</tt>, <tt>CERTS</tt>, or <tt>CIPHERTEXT</tt>)</li>
          <li>Standard Output: the same material with any ASCII-armoring removed</li>
        </ul>
        <t>If the input packet stream does not match any of the the expected sequence of packet types, <tt>sop dearmor</tt> fails with <tt>BAD_DATA</tt>.  See also <xref target="optional-input-armoring" format="default"/>.</t>
        <t>Since <tt>sop dearmor</tt> accepts binary-formatted input as well as ASCII-armored input, this operation is idempotent on well-structured data.
A caller can use this subcommand blindly ensure that any well-formed OpenPGP packet stream is in its standard binary representation.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop dearmor < message.txt.asc > message.txt.sig
$
]]></artwork>
      </section>
      <section anchor="detach-inband-signature-and-message-split-a-clearsigned-message" numbered="true" toc="default">
        <name>detach-inband-signature-and-message: split a clearsigned message</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
sop detach-inband-signature-and-message --signatures-out=SIGNATURES
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: <tt>DATA</tt> (clearsigned message)</li>
          <li>Standard Output: <tt>DATA</tt> (the message without the cleartext signature framework)</li>
        </ul>
        <t>In some contexts, the user may encounter a clearsigned ("inline PGP") message (section 7 of <xref target="RFC4880" format="default"/>) rather than a message and its detached signature.
This subcommand takes such a clearsigned message on standard input, and splits it into:</t>
        <ul spacing="normal">
          <li>the potentially signed material on standard output, and</li>
          <li>a detached signature block to the destination identified by <tt>--signatures-to</tt></li>
        </ul>
        <t>Note that no cryptographic verification of the signatures is done by this subcommand.
Once the clearsigned message is separated, verification of the detached signature can be done with <tt>sop verify</tt>.</t>
        <t>If no <tt>--signatures-to</tt> is supplied, <tt>sop detach-inband-signature-and-message</tt> fails with <tt>MISSING_ARG</tt>.</t>
        <t>Note that the signature block in a clearsigned message may contain multiple signatures.
All signatures found in the signature block will be emitted to the <tt>--signatures-to</tt> destination.</t>
        <t>The message body in the clearsigned message will be dash-escaped on standard input (see section 7.1 of <xref target="RFC4880" format="default"/>).
The output of <tt>sop detach-inband-signature-and-message</tt> will have dash-escaping removed.</t>
        <t>If the input <tt>DATA</tt> contains no clearsigned message, <tt>sop detach-inband-signature-and-message</tt> fails with <tt>BAD_DATA</tt>.
If the input <tt>DATA</tt> contains more than one clearsigned message, <tt>sop detach-inband-signature-and-message</tt> also fails with <tt>BAD_DATA</tt>.
A <tt>sop</tt> implementation MAY accept (and discard) leading and trailing data around the inline PGP clearsigned message.</t>
        <t>If the file designated by <tt>--signatures-to</tt> already exists in the filesystem, <tt>sop detach-inband-signature-and-message</tt> will fail with <tt>OUTPUT_EXISTS</tt>.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop detach-inband-signature-and-message --signature-out=Release.pgp < InRelease >Release
$ sop verify Release.pgp archive-keyring.pgp < Release
$
]]></artwork>
      </section>
    </section>
    <section anchor="input-string-types" numbered="true" toc="default">
      <name>Input String Types</name>
      <t>Some material is passed to <tt>sop</tt> directly as a string on the command line.</t>
      <section anchor="date" numbered="true" toc="default">
        <name>DATE</name>
        <t>An ISO-8601 formatted timestamp with time zone, or the special value <tt>now</tt> to indicate the current system time.</t>
        <t>Examples:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
now
2019-10-29T12:11:04+00:00
2019-10-24T23:48:29Z
20191029T121104Z
]]></artwork>
        <t>In some cases where used to specify lower and upper boundaries, a <tt>DATE</tt> value can be set to <tt>-</tt> to indicate "no time limit".</t>
        <t>A flexible implementation of <tt>sop</tt> MAY accept date inputs in other unambiguous forms.</t>
        <t>Note that whenever <tt>sop</tt> emits a timestamp (e.g. in <xref target="verifications" format="default"/>) it MUST produce only a UTC-based ISO-8601 compliant representation.</t>
      </section>
      <section anchor="userid" numbered="true" toc="default">
        <name>USERID</name>
        <t>This is an arbitrary <tt>UTF-8</tt> string (<xref target="utf8" format="default"/>).
By convention, most User IDs are of the form <tt>Display Name &lt;email.address@example.com&gt;</tt>, but they do not need to be.</t>
      </section>
    </section>
    <section anchor="indirect-types" numbered="true" toc="default">
      <name>Input/Output Indirect Types</name>
      <t>Some material is passed to <tt>sop</tt> indirectly, typically by referring to a filename containing the data in question.
This type of data may also be passed to <tt>sop</tt> on Standard Input, or delivered by <tt>sop</tt> to Standard Output.</t>
      <t>If any input data is specified explicitly to be read from a file that does not exist, <tt>sop</tt> will fail with <tt>MISSING_INPUT</tt>.</t>
      <t>If any input data does not meet the requirements described below, <tt>sop</tt> will fail with <tt>BAD_DATA</tt>.</t>
      <section anchor="special-designators" numbered="true" toc="default">
        <name>Special Designators for Indirect Types</name>
        <t>An indirect argument or parameter that starts with <u>@</u> is not treated as a filename, but is reserved for special handling, based on the prefix that follows the <tt>@</tt>.
We describe two of those prefixes (<tt>@ENV:</tt> and <tt>@FD:</tt>) here.
A <tt>sop</tt> implementation that recives such a special designator but does not know how to handle a given prefix in that context MUST fail with <tt>UNSUPPORTED_SPECIAL_PREFIX</tt>.</t>
        <t>If the filename for any indirect material used as input has the special form <tt>@ENV:xxx</tt>,
then contents of environment variable <tt>$xxx</tt> is used instead of looking in the filesystem.
<tt>@ENV</tt> is for input only: if the prefix <tt>@ENV:</tt> is used for any output argument, <tt>sop</tt> fails with <tt>UNSUPPORTED_SPECIAL_PREFIX</tt>.</t>
        <t>If the filename for any indirect material used as either input or output has the special form <tt>@FD:nnn</tt> where <tt>nnn</tt> is a decimal integer,
then the associated data is read from file descriptor <tt>nnn</tt>.</t>
        <t>See <xref target="special-designators-guidance" format="default"/> for more details about safe handling of these special designators.</t>
      </section>
      <section anchor="certs" numbered="true" toc="default">
        <name>CERTS</name>
        <t>One or more OpenPGP certificates (section 11.1 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>), aka "Transferable Public Key".
May be armored (see <xref target="optional-input-armoring" format="default"/>).</t>
        <t>Although some existing workflows may prefer to use one <tt>CERTS</tt> object with multiple certificates in it (a "keyring"), supplying exactly one certificate per <tt>CERTS</tt> input will make error reporting clearer and easier.</t>
      </section>
      <section anchor="key" numbered="true" toc="default">
        <name>KEY</name>
        <t>Exactly one OpenPGP Transferable Secret Key (section 11.2 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>).
May be armored (see <xref target="optional-input-armoring" format="default"/>).</t>
        <t>Secret key material should be in cleartext (that is, it should not be locked with a password).
If the secret key material is locked with a password, <tt>sop</tt> may fail with error <tt>KEY_IS_PROTECTED</tt>.</t>
      </section>
      <section anchor="ciphertext" numbered="true" toc="default">
        <name>CIPHERTEXT</name>
        <t><tt>sop</tt> accepts only a restricted subset of the arbitrarily-nested grammar allowed by the OpenPGP Messages definition (section 11.3 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>).</t>
        <t>In particular, it accepts and generates only:</t>
        <t>An OpenPGP message, consisting of a sequence of PKESKs (section 5.1 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>) and SKESKs (section 5.3 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>),
followed by one SEIPD (section 5.14 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>).</t>
        <t>The SEIPD can decrypt into one of two things:</t>
        <ul spacing="normal">
          <li>"Maybe Signed Data" (see below), or</li>
          <li>Compressed data packet that contains "Maybe Signed Data"</li>
        </ul>
        <t>"Maybe Signed Data" is a sequence of:</t>
        <ul spacing="normal">
          <li>N (zero or more) one-pass signature packets, followed by</li>
          <li>zero or more signature packets, followed by</li>
          <li>one Literal data packet, followed by</li>
          <li>N signature packets (corresponding to the outer one-pass signatures packets)</li>
        </ul>
        <t>FIXME: does any tool do compression inside signing?  Do we need to handle that?</t>
        <t>May be armored (see <xref target="optional-input-armoring" format="default"/>).</t>
      </section>
      <section anchor="signature" numbered="true" toc="default">
        <name>SIGNATURES</name>
        <t>One or more OpenPGP Signature packets.  May be armored (see <xref target="optional-input-armoring" format="default"/>).</t>
      </section>
      <section anchor="sessionkey" numbered="true" toc="default">
        <name>SESSIONKEY</name>
        <t>This documentation uses the GnuPG defacto <tt>ASCII</tt> representation:</t>
        <t><tt>ALGONUM:HEXKEY</tt></t>
        <t>where <tt>ALGONUM</tt> is the decimal value associated with the OpenPGP Symmetric Key Algorithms (section 9.3 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>) and <tt>HEXKEY</tt> is the hexadecimal
representation of the binary key.</t>
        <t>Example AES-256 session key:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
9:FCA4BEAF687F48059CACC14FB019125CD57392BAB7037C707835925CBF9F7BCD
]]></artwork>
      </section>
      <section anchor="password" numbered="true" toc="default">
        <name>PASSWORD</name>
        <t>This is expected to be a <tt>UTF-8</tt> string (<xref target="utf8" format="default"/>), but for <tt>sop decrypt</tt>, any bytestring that the user supplies will be accepted.
Note the details in <tt>sop encrypt</tt> and <tt>sop decrypt</tt> about trailing whitespace!</t>
        <t>See also <xref target="human-readable-passwords" format="default"/> for more discussion.</t>
      </section>
      <section anchor="verifications" numbered="true" toc="default">
        <name>VERIFICATIONS</name>
        <t>One line per successful signature verification.
Each line has three structured fields delimited by a single space,
followed by arbitrary text to the end of the line that forms a message describing the verification.</t>
        <ul spacing="normal">
          <li>ISO-8601 UTC datestamp</li>
          <li>Fingerprint of the signing key (may be a subkey)</li>
          <li>Fingerprint of primary key of signing certificate (if signed by primary key, same as the previous field)</li>
          <li>message describing the verification (free form)</li>
        </ul>
        <t>Note that while <xref target="date" format="default"/> permits a <tt>sop</tt> implementation to accept other unambiguous date representations,
its date output here MUST be a strict ISO-8601 UTC date timestamp.
In particular:</t>
        <ul spacing="normal">
          <li>the date and time fields MUST be separated by <tt>T</tt>, not by whitespace, since whitespace is used as a delimiter</li>
          <li>the time MUST be emitted in UTC, with the explicit suffix <tt>Z</tt></li>
        </ul>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
2019-10-24T23:48:29Z C90E6D36200A1B922A1509E77618196529AE5FF8 C4BC2DDB38CCE96485EBE9C2F20691179038E5C6 certificate from dkg.asc
]]></artwork>
      </section>
      <section anchor="data" numbered="true" toc="default">
        <name>DATA</name>
        <t>Cleartext, arbitrary data.  This is either a bytestream or <tt>UTF-8</tt> text.</t>
        <t>It MUST only be <tt>UTF-8</tt> text in the case of input supplied to <tt>sop sign --as=text</tt> or <tt>sop encrypt --as={mime|text}</tt>.
If <tt>sop</tt> receives <tt>DATA</tt> containing non-<tt>UTF-8</tt> octets in this case, it will fail (see <xref target="utf8" format="default"/>) with <tt>EXPECTED_TEXT</tt>.</t>
      </section>
    </section>
    <section anchor="failure-modes" numbered="true" toc="default">
      <name>Failure Modes</name>
      <t><tt>sop</tt> return codes have both mnemonics and numeric values.</t>
      <t>When <tt>sop</tt> succeeds, it will return 0 (<tt>OK</tt>) and emit nothing to Standard Error.
When <tt>sop</tt> fails, it fails with a non-zero return code, and emits one or more warning messages on Standard Error.
Known return codes include:</t>
      <table align="center">
        <thead>
          <tr>
            <th align="right">Value</th>
            <th align="left">Mnemonic</th>
            <th align="left">Meaning</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0</td>
            <td align="left">
              <tt>OK</tt></td>
            <td align="left">Success</td>
          </tr>
          <tr>
            <td align="right">3</td>
            <td align="left">
              <tt>NO_SIGNATURE</tt></td>
            <td align="left">No acceptable signatures found (<tt>sop verify</tt>)</td>
          </tr>
          <tr>
            <td align="right">13</td>
            <td align="left">
              <tt>UNSUPPORTED_ASYMMETRIC_ALGO</tt></td>
            <td align="left">Asymmetric algorithm unsupported (<tt>sop encrypt</tt>)</td>
          </tr>
          <tr>
            <td align="right">17</td>
            <td align="left">
              <tt>CERT_CANNOT_ENCRYPT</tt></td>
            <td align="left">Certificate not encryption-capable (e.g., expired, revoked, unacceptable usage flags) (<tt>sop encrypt</tt>)</td>
          </tr>
          <tr>
            <td align="right">19</td>
            <td align="left">
              <tt>MISSING_ARG</tt></td>
            <td align="left">Missing required argument</td>
          </tr>
          <tr>
            <td align="right">23</td>
            <td align="left">
              <tt>INCOMPLETE_VERIFICATION</tt></td>
            <td align="left">Incomplete verification instructions (<tt>sop decrypt</tt>)</td>
          </tr>
          <tr>
            <td align="right">29</td>
            <td align="left">
              <tt>CANNOT_DECRYPT</tt></td>
            <td align="left">Unable to decrypt (<tt>sop decrypt</tt>)</td>
          </tr>
          <tr>
            <td align="right">31</td>
            <td align="left">
              <tt>PASSWORD_NOT_HUMAN_READABLE</tt></td>
            <td align="left">Non-<tt>UTF-8</tt> or otherwise unreliable password (<tt>sop encrypt</tt>)</td>
          </tr>
          <tr>
            <td align="right">37</td>
            <td align="left">
              <tt>UNSUPPORTED_OPTION</tt></td>
            <td align="left">Unsupported option</td>
          </tr>
          <tr>
            <td align="right">41</td>
            <td align="left">
              <tt>BAD_DATA</tt></td>
            <td align="left">Invalid data type (no secret key where <tt>KEY</tt> expected, etc)</td>
          </tr>
          <tr>
            <td align="right">53</td>
            <td align="left">
              <tt>EXPECTED_TEXT</tt></td>
            <td align="left">Non-text input where text expected</td>
          </tr>
          <tr>
            <td align="right">59</td>
            <td align="left">
              <tt>OUTPUT_EXISTS</tt></td>
            <td align="left">Output file already exists</td>
          </tr>
          <tr>
            <td align="right">61</td>
            <td align="left">
              <tt>MISSING_INPUT</tt></td>
            <td align="left">Input file does not exist</td>
          </tr>
          <tr>
            <td align="right">67</td>
            <td align="left">
              <tt>KEY_IS_PROTECTED</tt></td>
            <td align="left">A <tt>KEY</tt> input is protected (locked) with a password, and <tt>sop</tt> cannot unlock it</td>
          </tr>
          <tr>
            <td align="right">69</td>
            <td align="left">
              <tt>UNSUPPORTED_SUBCOMMAND</tt></td>
            <td align="left">Unsupported subcommand</td>
          </tr>
          <tr>
            <td align="right">71</td>
            <td align="left">
              <tt>UNSUPPORTED_SPECIAL_PREFIX</tt></td>
            <td align="left">An indirect parameter is a special designator (it starts with <tt>@</tt>) but <tt>sop</tt> does not know how to handle the prefix</td>
          </tr>
          <tr>
            <td align="right">73</td>
            <td align="left">
              <tt>AMBIGUOUS_INPUT</tt></td>
            <td align="left">A indirect input parameter is a special designator (it starts with <tt>@</tt>), and a filename matching the designator is actually present</td>
          </tr>
        </tbody>
      </table>
      <t>If a <tt>sop</tt> implementation fails in some way not contemplated by this document, it MAY return any non-zero error code, not only those listed above.</t>
    </section>
    <section anchor="guidance-for-implementers" numbered="true" toc="default">
      <name>Guidance for Implementers</name>
      <t><tt>sop</tt> uses a few assumptions that implementers might want to consider.</t>
      <section anchor="one-openpgp-message-at-a-time" numbered="true" toc="default">
        <name>One OpenPGP Message at a Time</name>
        <t><tt>sop</tt> is intended to be a simple tool that operates on one OpenPGP object at a time.  It should be composable, if you want to use it to deal with multiple OpenPGP objects.</t>
        <t>FIXME: discuss what this means for streaming.
The stdio interface doesn't necessarily imply streamed output.</t>
      </section>
      <section anchor="simplified-subset-of-openpgp-message" numbered="true" toc="default">
        <name>Simplified Subset of OpenPGP Message</name>
        <t>While the formal grammar for OpenPGP Message is arbitrarily nestable, <tt>sop</tt> constrains itself to what it sees as a single "layer" (see <xref target="ciphertext" format="default"/>).</t>
        <t>This is a deliberate choice, because it is what most consumers expect.
Also, if an arbitrarily-nested structure is parsed with a recursive algorithm, this risks a denial of service vulnerability.
<tt>sop</tt> intends to be implementable with a parser that defensively declines to do recursive descent into an OpenPGP Message.</t>
        <t>Note that an implementation of <tt>sop decrypt</tt> MAY choose to handle more complex structures, but if it does, it should document the other structures it handles and why it chooses to do so.
We can use such documentation to improve future versions of this spec.</t>
      </section>
      <section anchor="validate-signatures-only-from-known-signers" numbered="true" toc="default">
        <name>Validate Signatures Only from Known Signers</name>
        <t>There are generally only a few signers who are relevant for a given OpenPGP message.
When verifying signatures, <tt>sop</tt> expects that the caller can identify those relevant signers ahead of time.</t>
      </section>
      <section anchor="optional-input-armoring" numbered="true" toc="default">
        <name>OpenPGP inputs can be either Binary or ASCII-armored</name>
        <t>OpenPGP material on input can be in either ASCII-armored or binary form.
This is a deliberate choice because there are typical scenarios where the program can't predict which form will appear.
Expecting the caller of <tt>sop</tt> to detect the form and adjust accordingly seems both redundant and error-prone.</t>
        <t>The simple way to detect possible ASCII-armoring is to see whether the high bit of the first octet is set:
section 4.2 of <xref target="RFC4880" format="default"/> indicates that bit 7 is always one in the first octet of an OpenPGP packet.
In standard ASCII-armor, the first character is <u>-</u>, so the high bit should be cleared.</t>
        <t>When considering an input as ASCII-armored OpenPGP material, <tt>sop</tt> MAY reject an input based on any of the following variations (see section 6.2 of <xref target="RFC4880" format="default"/> for precise definitions):</t>
        <ul spacing="normal">
          <li>An unknown Armor Header Line</li>
          <li>Any text before the Armor Header Line</li>
          <li>Malformed lines in the Armor Headers section</li>
          <li>Any non-whitespace data after the Armor Tail</li>
          <li>Any Radix-64 encoded line with more than 76 characters</li>
          <li>Invalid characters in the Radix-64-encoded data</li>
          <li>An invalid Armor Checksum</li>
          <li>A mismatch between the Armor Header Line and the Armor Tail</li>
        </ul>
        <t>For robustness, <tt>sop</tt> SHOULD be willing to ignore whitespace after the Armor Tail.</t>
        <t>When considering OpenPGP material as input, regardless of whether it is ASCII-armored or binary, <tt>sop</tt> SHOULD reject any material that doesn't produce a valid stream of OpenPGP packets.
For example, <tt>sop</tt> SHOULD raise an error if an OpenPGP packet header is malformed, or if there is trailing garbage after the end of a packet.</t>
        <t>For a given type of OpenPGP input material (i.e.,  <tt>SIGNATURES</tt>, <tt>CERTS</tt>, <tt>KEY</tt>, or <tt>CIPHERTEXT</tt>), <tt>sop</tt> SHOULD also reject any input that does not conform to the expected packet stream.
See <xref target="indirect-types" format="default"/> for the expected packet stream for different types.</t>
      </section>
      <section anchor="detached-signatures" numbered="true" toc="default">
        <name>Detached Signatures</name>
        <t><tt>sop</tt> deals with detached signatures as the baseline form of OpenPGP signatures.</t>
        <t>The primary alternative to detached signatures is inline signatures, but handling an inline signature requires parsing to delimit the multiple parts of the document, including at least:</t>
        <ul spacing="normal">
          <li>any preamble before the message</li>
          <li>the inline message header (delimiter line, OpenPGP headers)</li>
          <li>the message itself</li>
          <li>the divider between the message and the signature (including any OpenPGP headers there)</li>
          <li>the signature</li>
          <li>the divider that terminates the signature</li>
          <li>any suffix after the signature</li>
        </ul>
        <t>Note also that the preamble or the suffix might be arbitrary text, and might themselves contain OpenPGP messages (whether signatures or otherwise).</t>
        <t>If the parser that does this split differs in any way from the parser that does the verification, or parts of the message are confused,
it would be possible to produce a verification status and an actual signed message that don't correspond to one another.</t>
        <t>Blurred boundary problems like this can produce ugly attacks similar to those found in <xref target="EFAIL" format="default"/>.</t>
      </section>
      <section anchor="cert-validity-performance" numbered="true" toc="default">
        <name>Reliance on Supplied Certs and Keys</name>
        <t>A truly stateless implementation may find that it spends more time validating the internal consistency of certificates and keys than it does on the actual object security operations.</t>
        <t>For performance reasons, an implementation may choose to ignore validation on certificate and key material supplied to it.  The security implications of doing so depend on how the certs and keys are managed outside of <tt>sop</tt>.</t>
      </section>
      <section anchor="utf8" numbered="true" toc="default">
        <name>Text is always UTF-8</name>
        <t>Various places in this specification require UTF-8 <xref target="RFC3629" format="default"/> when encoding text. <tt>sop</tt> implementations SHOULD NOT consider textual data in any other character encoding.</t>
        <t>OpenPGP Implementations MUST already handle UTF-8, because various parts of <xref target="RFC4880" format="default"/> require it, including:</t>
        <ul spacing="normal">
          <li>User ID</li>
          <li>Notation name</li>
          <li>Reason for revocation</li>
          <li>ASCII-armor Comment: header</li>
        </ul>
        <t>Dealing with messages in other charsets leads to weird security failures like <xref target="Charset-Switching" format="default"/>, especially when the charset indication is not covered by any sort of cryptographic integrity check.
Restricting textual data to <tt>UTF-8</tt> universally across the OpenPGP ecosystem eliminates any such risk without losing functionality, since <tt>UTF-8</tt> can encode all known characters.</t>
      </section>
      <section anchor="human-readable-passwords" numbered="true" toc="default">
        <name>Passwords are Human-Readable</name>
        <t>Passwords are generally expected to be human-readable, as they are typically recorded and transmitted as human-visible, human-transferable strings.
However, they are used in the OpenPGP protocol as bytestrings, so ensuring that there is a reliable bidirectional mapping between strings and bytes.
The maximally robust behavior here is for <tt>sop encrypt</tt> to constrain the choice of passwords to strings that have such a mapping,
and for <tt>sop decrypt</tt> to try multiple plausible versions of any supplied <tt>PASSWORD</tt>.</t>
        <t>When generating material based on a password, <tt>sop encrypt</tt> enforces that the password is actually meaningfully human-transferable (requiring <tt>UTF-8</tt>, trimming trailing whitespace).
Some <tt>sop encrypt</tt> implementations may make even more strict requirements on input to ensure that they are transferable between humans in a robust way.</t>
        <t>For example, a more strict <tt>sop encrypt</tt> MAY also:</t>
        <ul spacing="normal">
          <li>forbid leading whitespace</li>
          <li>forbid non-printing characters other than <tt>SPACE (U+0020)</tt>, such as <tt>ZERO WIDTH NON-JOINER (U+200C)</tt> or <tt>TAB (U+0009)</tt></li>
          <li>require the password to be in Unicode Normal Form C (<xref target="UNICODE-NORMALIZATION" format="default"/>)</li>
        </ul>
        <t>Violations of these more-strict policies SHOULD result in an error of <tt>PASSWORD_NOT_HUMAN_READABLE</tt>.</t>
        <t>A <tt>sop encrypt</tt> implementation typically SHOULD NOT attempt enforce a minimum "password strength",
but in the event that some implementation does, it MUST NOT represent a weak password with <tt>PASSWORD_NOT_HUMAN_READABLE</tt>.</t>
        <t>When <tt>sop decrypt</tt> receives a <tt>PASSWORD</tt> input, it sees it as a bytestring.
If the bytestring fails to work as a password, but ends in <tt>UTF-8</tt> whitespace, it will try again with the trailing whitespace removed.
This handles a common pattern of using a file with a final newline, for example.
The pattern here is one of robustness in the face of typical errors in human-transferred textual data.</t>
        <t>A more robust <tt>sop decrypt</tt> implementation that finds neither of the above two attempts work for a given <tt>PASSWORD</tt> MAY try additional variations if they produce a different bytestring, such as:</t>
        <ul spacing="normal">
          <li>trimming any leading whitespace, if discovered</li>
          <li>trimming any internal non-printable characters other than  <tt>SPACE (U+0020)</tt></li>
          <li>converting the supplied <tt>PASSWORD</tt> into Unicode Normal Form C (<xref target="UNICODE-NORMALIZATION" format="default"/>)</li>
        </ul>
        <t>A <tt>sop decrypt</tt> implementation that stages multiple decryption attempts like this SHOULD consider the computational resources consumed by each attempt, to avoid presenting an attack surface for resource exhaustion in the face of a non-standard <tt>PASSWORD</tt> input.</t>
      </section>
      <section anchor="special-designators-guidance" numbered="true" toc="default">
        <name>Be careful with Special Designators</name>
        <t>As documented in <xref target="special-designators" format="default"/>, special designators for indirect inputs like <tt>@ENV:</tt> and <tt>@FD:</tt> (and indirect outputs using <tt>@FD:</tt>) warrant some special/cautious handling.</t>
        <t>For one thing, it's conceivable that the filesystem could contain a file with these literal names.
If <tt>sop</tt> receives an indirect output parameter that starts with an <u>@</u> it MUST NOT write to the filesystem for that parameter.
A <tt>sop</tt> implementation that receives such a parameter as input MAY test for the presence of such a file in the filesystem and fail with <tt>AMBIGUOUS_INPUT</tt> to warn the user of the ambiguity and possible confusion.</t>
        <t>These special designators are likely to be used to pass sensitive data (like secret key material or passwords) so that it doesn't need to touch the filesystem.
Given this sensitivity, <tt>sop</tt> should be careful with such an input, and minimize its leakage to other processes.
In particular, <tt>sop</tt> SHOULD NOT leak any environment variable identified by <tt>@ENV:</tt> or file descriptor identified by <tt>@FD:</tt> to any subprocess unless the subprocess specifically needs access to that data.</t>
      </section>
    </section>
    <section anchor="guidance-for-consumers" numbered="true" toc="default">
      <name>Guidance for Consumers</name>
      <t>While <tt>sop</tt> is originally conceived of as an interface for interoperability testing, it's conceivable that an application that uses OpenPGP for object security would want to use it.</t>
      <t>FIXME: more guidance for how to use such a tool safely and efficiently goes here.</t>
      <t>FIXME: if an encrypted OpenPGP message arrives without metadata, it is difficult to know which signers to consider when decrypting.
How do we do this efficiently without invoking <tt>sop decrypt</tt> twice, once without <tt>--verify-*</tt> and again with the expected identity material?</t>
      <section anchor="choosing-between-astext-and-asbinary" numbered="true" toc="default">
        <name>Choosing between -as=text  and -as=binary</name>
        <t>A program that invokes <tt>sop</tt> to generate an OpenPGP signature typically needs to decide whether it is making a text or binary signature.</t>
        <t>By default, <tt>sop</tt> will make a binary signature.
The caller of <tt>sop sign</tt> should choose <tt>--as=text</tt> only when it knows that:
 - the data being signed is in fact textual, and encoded in <tt>UTF-8</tt>, and
 - the signed data might be transmitted to the recipient (the verifier of the signature) over a channel that has the propensity to transform line-endings.</t>
        <t>Examples of such channels include FTP (<xref target="RFC0959" format="default"/>) and SMTP (<xref target="RFC5321" format="default"/>).</t>
      </section>
      <section anchor="special-designators-and-unusual-filenames" numbered="true" toc="default">
        <name>Special Designators and Unusual Filenames</name>
        <t>In some cases, a user of <tt>sop</tt> might want to pass all the files in a given directory as positional parameters (e.g., a list of CERTS files to test a signature against).</t>
        <t>If one of the files has a name that starts with <tt>--</tt>, it might be confused by <tt>sop</tt> for an option.
If one of the files has a name that starts with <tt>@</tt>, it might be confused by <tt>sop</tt> as a special designator (<xref target="special-designators" format="default"/>).</t>
        <t>If the user wants to deliberately refer to such an ambiguously-named file in the filesystem, they should prefix the filename with  <tt>./</tt> or use an absolute path.</t>
        <t>Any specific <tt>@FD:</tt> special designator SHOULD NOT be supplied more than once to an invocation of <tt>sop</tt>.
If a <tt>sop</tt> invocation sees multiple copies of a specific <tt>@FD:n</tt> input (e.g., <tt>sop sign @FD:3 @FD:3</tt>),
it MAY fail with <tt>MISSING_INPUT</tt> even if file descriptor 3 contains a valid <tt>KEY</tt>, because the bytestream for the <tt>KEY</tt> was consumed by the first argument.
Doubling up on the same <tt>@FD:</tt> for output (e.g., <tt>sop decrypt --session-key-out=@FD:3 --verify-out=@FD:3</tt>) also results in an ambiguous data stream.</t>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>The OpenPGP object security model is typically used for confidentiality and authenticity purposes.</t>
      <section anchor="signature-verification" numbered="true" toc="default">
        <name>Signature Verification</name>
        <t>In many contexts, an OpenPGP signature is verified to prove the origin and integrity of an underlying object.</t>
        <t>When <tt>sop</tt> checks a signature (e.g. via <tt>sop verify</tt> or <tt>sop decrypt --verify-with</tt>), it MUST NOT consider it to be verified unless all of these conditions are met:</t>
        <ul spacing="normal">
          <li>The signature must be made by a signing-capable public key that is present in one of the supplied certificates</li>
          <li>The certificate and signing subkey must have been created before or at the signature time</li>
          <li>The certificate and signing subkey must not have been expired at the signature time</li>
          <li>The certificate and signing subkey must not be revoked with a "hard" revocation</li>
          <li>If the certificate or signing subkey is revoked with a "soft" revocation, then the signature time must predate the revocation</li>
          <li>The signing subkey must be properly bound to the primary key, and cross-signed</li>
          <li>The signature (and any dependent signature, such as the cross-sig or subkey binding signatures) must be made with strong cryptographic algorithms (e.g., not <tt>MD5</tt> or a 1024-bit <tt>RSA</tt> key)</li>
        </ul>
        <t>Implementers MAY also consider other factors in addition to the origin and authenticity, including application-specific information.</t>
        <t>For example, consider the application domain of checking software updates.
If software package Foo version 13.3.2 was signed on 2019-10-04, and the user receives a copy of Foo version 12.4.8 that was signed on 2019-10-16, it may be authentic and have a more recent signature date.
But it is not an upgrade (12.4.8 &lt; 13.3.2), and therefore it should not be applied automatically.</t>
        <t>In such cases, it is critical that the application confirms that the other information verified is <em>also</em> protected by the relevant OpenPGP signature.</t>
        <t>Signature validity is a complex topic (see for example the discussion at <xref target="DISPLAYING-SIGNATURES" format="default"/>), and this documentation cannot list all possible details.</t>
      </section>
      <section anchor="compression" numbered="true" toc="default">
        <name>Compression</name>
        <t>The interface as currently specified does not allow for control of compression.
Compressing and encrypting data that may contain both attacker-supplied material and sensitive material could leak information about the sensitive material (see the CRIME attack).</t>
        <t>Unless an application knows for sure that no attacker-supplied material is present in the input, it should not compress during encryption.</t>
      </section>
    </section>
    <section anchor="privacy-considerations" numbered="true" toc="default">
      <name>Privacy Considerations</name>
      <t>Material produced by <tt>sop encrypt</tt> may be placed on an untrusted machine (e.g., sent through the public <tt>SMTP</tt> network).
That material may contain metadata that leaks associational information (e.g., recipient identifiers in PKESK packets (section 5.1 of <xref target="I-D.ietf-openpgp-rfc4880bis" format="default"/>)).
FIXME: document things like PURBs and <tt>--hidden-recipient</tt>)</t>
      <section anchor="object-security-vs-transport-security" numbered="true" toc="default">
        <name>Object Security vs. Transport Security</name>
        <t>OpenPGP offers an object security model, but says little to nothing about how the secured objects get to the relevant parties.</t>
        <t>When sending or receiving OpenPGP material, the implementer should consider what privacy leakage is implicit with the transport.</t>
      </section>
    </section>
    <section anchor="document-considerations" numbered="true" toc="default">
      <name>Document Considerations</name>
      <t>[ RFC Editor: please remove this section before publication ]</t>
      <t>This document is currently edited as markdown.
Minor editorial changes can be suggested via merge requests at https://gitlab.com/dkg/openpgp-stateless-cli or by e-mail to the authors.
Please direct all significant commentary to the public IETF OpenPGP mailing list: openpgp@ietf.org</t>
      <section anchor="document-history" numbered="true" toc="default">
        <name>Document History</name>
        <t>substantive changes between -01 and -02:</t>
        <ul spacing="normal">
          <li>Added mnemonics for return codes</li>
          <li>
            <tt>decrypt</tt> should fail when asked to output to a pre-existing file</li>
          <li>Removed superfluous <tt>--armor</tt> option</li>
          <li>Much more specific about what <tt>armor --label=auto</tt> should do</li>
          <li>
            <tt>armor</tt> and <tt>dearmor</tt> are now fully idempotent, but work only well-formed OpenPGP streams</li>
          <li>Dropped <tt>armor --allow-nested</tt></li>
          <li>Specified what <tt>encrypt --as=</tt> means</li>
          <li>New error code: <tt>KEY_IS_PROTECTED</tt></li>
          <li>Documented expectations around human-readable, human-transferable passwords</li>
          <li>New subcommand: <tt>detach-inband-signature-and-message</tt></li>
          <li>More specific guidance about special designators like <tt>@FD:</tt> and <tt>@ENV:</tt>, including new error codes <tt>UNSUPPORTED_SPECIAL_PREFIX</tt> and <tt>AMBIGUOUS_INPUT</tt></li>
        </ul>
        <t>substantive changes between -00 and -01:</t>
        <ul spacing="normal">
          <li>Changed <tt>generate</tt> subcommand to <tt>generate-key</tt></li>
          <li>Changed <tt>convert</tt> subcommand to <tt>extract-cert</tt></li>
          <li>Added "Input String Types" section as distinct from indirect I/O</li>
          <li>Made implicit arguments potentially explicit (e.g. <tt>sop armor --label=auto</tt>)</li>
          <li>Added <tt>--allow-nested</tt> to <tt>sop armor</tt> to make it idempotent by default</li>
          <li>Added fingerprint of signing (sub)key to <tt>VERIFICATIONS</tt> output</li>
          <li>Dropped <tt>--mode</tt> and <tt>--session-key</tt> arguments for <tt>sop encrypt</tt> (no plausible use, not needed for interop)</li>
          <li>Added <tt>--with-session-key</tt> argument to <tt>sop decrypt</tt> to allow for session-key-based decryption</li>
          <li>Added examples to each subcommand</li>
          <li>More detailed error codes for <tt>sop encrypt</tt></li>
          <li>Move from <tt>CERT</tt> to <tt>CERTS</tt> (each <tt>CERTS</tt> argument might contain multiple certificates)</li>
        </ul>
      </section>
      <section anchor="future-work" numbered="true" toc="default">
        <name>Future Work</name>
        <ul spacing="normal">
          <li>
            <t>certificate transformation into popular publication forms:
            </t>
            <ul spacing="normal">
              <li>WKD</li>
              <li>DANE OPENPGPKEY</li>
              <li>Autocrypt</li>
            </ul>
          </li>
          <li>
            <tt>sop encrypt</tt> - specify compression? (see <xref target="compression" format="default"/>)</li>
          <li>
            <tt>sop encrypt</tt> - specify padding policy/mechanism?</li>
          <li>
            <tt>sop decrypt</tt> - how can it more safely handle zip bombs?</li>
          <li>
            <tt>sop decrypt</tt> - what should it do when encountering weakly-encrypted (or unencrypted) input?</li>
          <li>
            <tt>sop encrypt</tt> - minimize metadata (e.g. <tt>--throw-keyids</tt>)?</li>
          <li>handling secret keys that are locked with passwords?</li>
          <li>specify an error if a <tt>DATE</tt> arrives as input without a time zone?</li>
          <li>add considerations about what it means for armored <tt>CERTS</tt> to contain multiple certificates - multiple armorings?  one big blob?</li>
          <li>do we need an interface or option (for performance?) with the semantics that <tt>sop</tt> doesn't validate certificates internally, it just accepts whatever's given as legit data? (see <xref target="cert-validity-performance" format="default"/>)</li>
          <li>do we need to be able to assemble a clearsigned message? I'd rather not, given the additional complications.</li>
        </ul>
      </section>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>This work was inspired by Justus Winter's <xref target="OpenPGP-Interoperability-Test-Suite" format="default"/>.</t>
      <t>The following people contributed helpful feedback and considerations to this draft, but are not responsible for its problems:</t>
      <ul spacing="normal">
        <li>Allan Nordhoey</li>
        <li>Antoine Beaupre</li>
        <li>Edwin Taylor</li>
        <li>Jameson Rollins</li>
        <li>Justus Winter</li>
        <li>Vincent Breitmoser</li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="BCP" value="14"/>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC3629" target="https://www.rfc-editor.org/info/rfc3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <seriesInfo name="DOI" value="10.17487/RFC3629"/>
            <seriesInfo name="RFC" value="3629"/>
            <seriesInfo name="STD" value="63"/>
            <author initials="F." surname="Yergeau" fullname="F. Yergeau">
              <organization/>
            </author>
            <date year="2003" month="November"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="BCP" value="14"/>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization/>
            </author>
            <date year="2017" month="May"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC4880" target="https://www.rfc-editor.org/info/rfc4880">
          <front>
            <title>OpenPGP Message Format</title>
            <seriesInfo name="DOI" value="10.17487/RFC4880"/>
            <seriesInfo name="RFC" value="4880"/>
            <author initials="J." surname="Callas" fullname="J. Callas">
              <organization/>
            </author>
            <author initials="L." surname="Donnerhacke" fullname="L. Donnerhacke">
              <organization/>
            </author>
            <author initials="H." surname="Finney" fullname="H. Finney">
              <organization/>
            </author>
            <author initials="D." surname="Shaw" fullname="D. Shaw">
              <organization/>
            </author>
            <author initials="R." surname="Thayer" fullname="R. Thayer">
              <organization/>
            </author>
            <date year="2007" month="November"/>
            <abstract>
              <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format.  It is not a step-by-step cookbook for writing an application.  It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network.  It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
              <t>OpenPGP software uses a combination of strong public-key and symmetric cryptography to provide security services for electronic communications and data storage.  These services include confidentiality, key management, authentication, and digital signatures.  This document specifies the message formats used in OpenPGP.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="I-D.ietf-openpgp-rfc4880bis" target="http://www.ietf.org/internet-drafts/draft-ietf-openpgp-rfc4880bis-08.txt">
          <front>
            <title>OpenPGP Message Format</title>
            <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-rfc4880bis-08"/>
            <author initials="W" surname="Koch" fullname="Werner Koch">
              <organization/>
            </author>
            <author initials="b" surname="carlson" fullname="brian carlson">
              <organization/>
            </author>
            <author initials="R" surname="Tse" fullname="Ronald Tse">
              <organization/>
            </author>
            <author initials="D" surname="Atkins" fullname="Derek Atkins">
              <organization/>
            </author>
            <author initials="D" surname="Gillmor" fullname="Daniel Gillmor">
              <organization/>
            </author>
            <date month="September" day="6" year="2019"/>
            <abstract>
              <t>{ Work in progress to update the OpenPGP specification from RFC4880 }  This document specifies the message formats used in OpenPGP.  OpenPGP provides encryption with public-key or symmetric cryptographic algorithms, digital signatures, compression and key management.  This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format.  It is not a step-by-step cookbook for writing an application.  It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network.  It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
            </abstract>
          </front>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.draft-bre-openpgp-samples-00" target="http://www.ietf.org/internet-drafts/draft-bre-openpgp-samples-00.txt">
          <front>
            <title>OpenPGP Example Keys and Certificates</title>
            <seriesInfo name="Internet-Draft" value="draft-bre-openpgp-samples-00"/>
            <author initials="B" surname="Einarsson" fullname="Bjarni Einarsson">
              <organization/>
            </author>
            <author initials="j" surname="juga" fullname="juga">
              <organization/>
            </author>
            <author initials="D" surname="Gillmor" fullname="Daniel Gillmor">
              <organization/>
            </author>
            <date month="October" day="15" year="2019"/>
            <abstract>
              <t>The OpenPGP development community benefits from sharing samples of signed or encrypted data.  This document facilitates such collaboration by defining a small set of OpenPGP certificates and keys for use when generating such samples.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="OpenPGP-Interoperability-Test-Suite" target="https://tests.sequoia-pgp.org/">
          <front>
            <title>OpenPGP Interoperability Test Suite</title>
            <author>
              <organization/>
            </author>
            <date year="2019" month="October" day="28"/>
          </front>
        </reference>
        <reference anchor="Charset-Switching" target="https://dkg.fifthhorseman.net/notes/inline-pgp-harmful/">
          <front>
            <title>Inline PGP Considered Harmful</title>
            <author initials="D.K." surname="Gillmor" fullname="Daniel Kahn Gillmor">
              <organization/>
            </author>
            <date year="2014" month="February" day="24"/>
          </front>
        </reference>
        <reference anchor="DISPLAYING-SIGNATURES" target="https://admin.hostpoint.ch/pipermail/enigmail-users_enigmail.net/2017-November/004683.html">
          <front>
            <title>On Displaying Signatures</title>
            <author initials="P." surname="Brunschwig" fullname="Patrick Brunschwig">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="EFAIL" target="https://efail.de">
          <front>
            <title>Efail: Breaking S/MIME and OpenPGP Email Encryption using Exfiltration Channels</title>
            <author initials="D." surname="Poddebniak" fullname="Damian Poddebniak">
              <organization/>
            </author>
            <author initials="C." surname="Dresen" fullname="Christian Dresen">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SEMVER" target="https://semver.org/">
          <front>
            <title>Semantic Versioning 2.0.0</title>
            <author initials="T." surname="Preston-Werner" fullname="Tom Preston-Werner">
              <organization/>
            </author>
            <date year="2013" month="June" day="18"/>
          </front>
        </reference>
        <reference anchor="UNICODE-NORMALIZATION" target="https://unicode.org/reports/tr15/">
          <front>
            <title>Unicode Normalization Forms</title>
            <author initials="K." surname="Whistler" fullname="Ken Whistler">
              <organization>Unicode Consortium</organization>
            </author>
            <date year="2019" month="February" day="04"/>
          </front>
        </reference>
        <reference anchor="RFC0959" target="https://www.rfc-editor.org/info/rfc959">
          <front>
            <title>File Transfer Protocol</title>
            <seriesInfo name="DOI" value="10.17487/RFC0959"/>
            <seriesInfo name="RFC" value="959"/>
            <seriesInfo name="STD" value="9"/>
            <author initials="J." surname="Postel" fullname="J. Postel">
              <organization/>
            </author>
            <author initials="J." surname="Reynolds" fullname="J. Reynolds">
              <organization/>
            </author>
            <date year="1985" month="October"/>
            <abstract>
              <t>This memo is the official specification of the File Transfer Protocol    (FTP) for the DARPA Internet community.  The primary intent is to    clarify and correct the documentation of the FTP specification, not to    change the protocol.  The following new optional commands are included    in this edition of the specification:  Change to Parent Directory    (CDUP), Structure Mount (SMNT), Store Unique (STOU), Remove Directory    (RMD), Make Directory (MKD), Print Directory (PWD), and System (SYST).    Note that this specification is compatible with the previous edition.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC2045" target="https://www.rfc-editor.org/info/rfc2045">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
            <seriesInfo name="DOI" value="10.17487/RFC2045"/>
            <seriesInfo name="RFC" value="2045"/>
            <author initials="N." surname="Freed" fullname="N. Freed">
              <organization/>
            </author>
            <author initials="N." surname="Borenstein" fullname="N. Borenstein">
              <organization/>
            </author>
            <date year="1996" month="November"/>
            <abstract>
              <t>This initial document specifies the various headers used to describe the structure of MIME messages.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC5321" target="https://www.rfc-editor.org/info/rfc5321">
          <front>
            <title>Simple Mail Transfer Protocol</title>
            <seriesInfo name="DOI" value="10.17487/RFC5321"/>
            <seriesInfo name="RFC" value="5321"/>
            <author initials="J." surname="Klensin" fullname="J. Klensin">
              <organization/>
            </author>
            <date year="2008" month="October"/>
            <abstract>
              <t>This document is a specification of the basic protocol for Internet electronic mail transport.  It consolidates, updates, and clarifies several previous documents, making all or parts of most of them obsolete.  It covers the SMTP extension mechanisms and best practices for the contemporary Internet, but does not provide details about particular extensions.  Although SMTP was designed as a mail transport and delivery protocol, this specification also contains information that is important to its use as a "mail submission" protocol for "split-UA" (User Agent) mail reading systems and mobile environments.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
xXz5FExuVLs7/Pn8vH9zPei96759c/knYBQMthA2J+GKDlXyqTAR7A4tMPV+
hYJglxJqqq9PF+EsDyiXC/P8H01ijNhi6zHixZOMEQ/uXa97gSK+f9G7/vnq
RlZU9w1FmJJHSV6j4D8GPHPGAVfle9L0GmFeCFClsFBM3dF8AjH3JB1/kQvV
Nll1w0Or8W9j9l3MSdB6ezBF0rAvjCSDKoS5q8THcG9gdN82s8ksOm2lmtZC
G0t/oT0j4DsmUF1qS8l9Vv2x5Do77w+H3Te+40wovhOcqqpRJD8+zyjSkSy0
WxSpQRjjaYIi9PUQJh5cXgC3qhpBzrvOe2Vj53n2EluHNKXnjvAc7/IS7b01
oGreKDv8Nr3jOACDsoX2pCf/Scur1larWHTE1rFMCEM1IYqjOx2SlWIU2V+i
XNRQ0QsEuB6tSbGXQ8MXMI0IBeOj1oFHlYPUrLalM4qkIIPcGBivX6CGjKIr
zotcG3aUOCcFE15ck1U7cngwr7i8vbm6BTbxz8EQmH2r8ROqKw6IJLsnEwBq
ul5UBstQnTcRSlmnu3wxRn2gHevMWa010JzpdbTTPTdrMvgbjUkroPOFM1RN
xEU27A+uwOBi27bF+eyS/PQJhR7lLOhcJlbuzJU74hvkjYqeNDfd8w5z9vKT
O3H4Q3/4w8jNhz54VsoTL8actc+jn79CW9sSJuKhBWlDZhVVyqDQszaZkR7m
8HHlnHfHckRnmTrxK8cm5LIdnc2am6hoxtUu2kDUJsBGS5NWXGNrgsKUPdpQ
fJ3FiYb1aqX+UgPTsr+Rzazd5H4E43xt/DNoD+JrhiaEvkvP/3ICF60UfeCc
gp2WD1b7JZxKKhu+plSvTb5ZhzOSfk2ZwvIxTog4UXJaY3JImkzjbOmMyjvV
wmo2tVwVjxtc3SYgIOhU57B+UNpj7R2YGCZuBZSUEnha3QMp/u5wJpmEghUm
Rcd5RXz+sItakTDZoLI3unZK5QVr7fX7uct6TgnLqJDTVUzLi1qiW2isnFgD
zE7WsFVjc7f2zTHPysjkapWDi97l+dXb/k3/nXsaI29fa0JgZbE9ckoGMeol
oRJSQ+2mOiGQBpXyhVidZAlcGyAmyVNHIiT/UQKPHznn87HsFTA8irwAUUpl
GZsiDn9xAEPMKzYka40r+9CTj5uNrtoDqxpd66SUA/XU52JAnPaNAeG/ywkr
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

-->

</rfc>
