<?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-03" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.8.0 -->
  <front>
    <title>Stateless OpenPGP Command Line Interface</title>
    <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-stateless-cli-03"/>
    <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="2021" month="October" day="25"/>
    <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 provides 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-01" 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 generate-key "Bob Babbage <bob@openpgp.example>" > bob.sec
sop extract-cert < bob.sec > bob.pgp

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

sop encrypt --sign-with=alice.sec --as=mime bob.pgp < msg.eml > ciphertext.asc
sop decrypt bob.sec < ciphertext.asc > cleartext.eml
]]></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 [--backend|--extended]
]]></artwork>
        <ul spacing="normal">
          <li>Standard Input: ignored</li>
          <li>Standard Output: version information</li>
        </ul>
        <t>This subcommand emits version information as UTF-8-encoded text.</t>
        <t>With no arguments, 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>If <tt>--backend</tt> is supplied, the implementation should produce a comparable line of implementation and version information about the primary underlying OpenPGP toolkit.</t>
        <t>If <tt>--extended</tt> is supplied, the implementation may emit multiple lines of version information.
The first line MUST match the information produced by a simple invocation, but the rest of the text has no defined structure.</t>
        <t><tt>--backend</tt> and <tt>--extended</tt> are mutually-exclusive options.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop version
ExampleSop 0.2.1
$ sop version --backend
LibExamplePGP 3.4.2
$ sop version --extended
ExampleSop 0.2.1
Running on MonkeyScript 4.5
LibExamplePGP 3.4.2
LibExampleCrypto 3.1.1
LibXCompression 4.0.2
See https://pgp.example/sop/ for more information
$ 
]]></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>KEYS</tt> (<xref target="keys" 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 key in <tt>KEYS</tt> with <tt>sop extract-cert</tt>.</li>
          <li>The key in <tt>KEYS</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 key in <tt>KEYS</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>KEYS</tt> (<xref target="keys" format="default"/>)</li>
          <li>Standard Output: <tt>CERTS</tt> (<xref target="certs" format="default"/>)</li>
        </ul>
        <t>The output should contain one OpenPGP certificate in <tt>CERTS</tt> per OpenPGP Transferable Secret Key found in <tt>KEYS</tt>.
There is no guarantee what order the <tt>CERTS</tt> will be in.</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] [--micalg-out=MICALG]
     [--as={binary|text}] [--] KEYS [KEYS...]
]]></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 key in the supplied <tt>KEYS</tt> arguments.</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>When generating PGP/MIME messages (<xref target="RFC3156" format="default"/>), it is useful to know what digest algorithm was used for the generated signature.
When <tt>--micalg-out</tt> is supplied, <tt>sop sign</tt> emits the digest algorithm used to the specified <tt>MICALG</tt> file in a way that can be used to populate the <tt>micalg</tt> parameter for the Content-Type (see <xref target="micalg" format="default"/>).
If the specified <tt>MICALG</tt> file already exists in the filesystem, <tt>sop sign</tt> will fail with <tt>OUTPUT_EXISTS</tt>.</t>
        <t>When signing with multiple keys, <tt>sop sign</tt> SHOULD use the same digest algorithm for every signature generated in a single run, unless there is some internal constraint on the <tt>KEYS</tt> objects.
If <tt>--micalg-out</tt> is requested, and multiple incompatibly-constrained <tt>KEYS</tt> objects are supplied, <tt>sop sign</tt> MUST emit the empty string to the designated <tt>MICALG</tt>.</t>
        <t>If any key in the <tt>KEYS</tt> objects is not capable of producing a signature, <tt>sop sign</tt> will fail with <tt>KEY_CANNOT_SIGN</tt>.</t>
        <t><tt>sop sign</tt> MUST NOT produce any extra signatures beyond those from <tt>KEYS</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=KEYS...]
    [--] [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 for each secret key found in the supplied <tt>KEYS</tt> object (this can also be used multiple times if signatures from keys found in separaate files are desired).
If any key in any supplied <tt>KEYS</tt> objects is not capable of producing a signature, <tt>sop sign</tt> will fail with <tt>KEY_CANNOT_SIGN</tt>.</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>KEYS</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] ]
    [--] [KEYS...]
]]></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>KEYS</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>KEYS</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>KEYS</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>KEYS</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 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 [--no-armor] --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-out</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-out</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-out</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-out</tt> already exists in the filesystem, <tt>sop detach-inband-signature-and-message</tt> will fail with <tt>OUTPUT_EXISTS</tt>.</t>
        <t>Note that <tt>--no-armor</tt> here governs the data written to the <tt>--signatures-out</tt> destination.
Standard output is always the raw message, not an OpenPGP packet.</t>
        <t>Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
$ sop detach-inband-signature-and-message --signatures-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 receives 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="keys" numbered="true" toc="default">
        <name>KEYS</name>
        <t>One or more OpenPGP Transferable Secret Keys (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 any secret key material is locked with a password, <tt>sop</tt> may fail with error <tt>KEY_IS_PROTECTED</tt>.</t>
        <t>Although some existing workflows may prefer to use one <tt>KEYS</tt> object with multiple keys in it (a "secret keyring"), supplying exactly one key per <tt>KEYS</tt> input will make error reporting clearer and easier.</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="micalg" numbered="true" toc="default">
        <name>MICALG</name>
        <t>This output indicates the cryptographic digest used when making a signature.
It is useful specifically when generating signed PGP/MIME objects, which want a <tt>micalg=</tt> parameter for the <tt>multipart/signed</tt> content type as described in section 5 of <xref target="RFC3156" format="default"/>.</t>
        <t>It will typically be a string like <tt>pgp-sha512</tt>, but in some situations (multiple signatures using different digests) it will be the empty string.
If the user of <tt>sop</tt> is assembling a PGP/MIME signed object, and the <tt>MICALG</tt> output is the empty string,
the user should omit the <tt>micalg=</tt> parameter entirely.</t>
      </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>KEYS</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>KEYS</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>
          <tr>
            <td align="right">79</td>
            <td align="left">
              <tt>KEY_CANNOT_SIGN</tt></td>
            <td align="left">Key not signature-capable (e.g., expired, revoked, unacceptable usage flags) (<tt>sop sign</tt> and <tt>sop encrypt</tt> with <tt>--sign-with</tt>)</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="alternate-interfaces" numbered="true" toc="default">
      <name>Alternate Interfaces</name>
      <t>This draft primarily defines a command line interface, but future versions may try to outline a comparable idiomatic interface for C or some other widely-used programming language.</t>
      <t>Comparable idiomatic interfaces are already active in the wild for different programming languages, in particular:</t>
      <ul spacing="normal">
        <li>Rust: <xref target="RUST-SOP" format="default"/></li>
        <li>Java: <xref target="SOP-JAVA" format="default"/></li>
        <li>Python: <xref target="PYTHON-SOP" format="default"/></li>
      </ul>
      <t>These programmatic interfaces are typically coupled with a wrapper that can automatically generate a command-line tool compatible with this draft.</t>
      <t>An implemention that uses one of these languages should target the corresponding idiomatic interface for ease of development and interoperability.</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>KEYS</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>KEYS</tt>, because the bytestream for the <tt>KEYS</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 -02 and -03:</t>
        <ul spacing="normal">
          <li>Added <tt>--micalg-out</tt> parameter to <tt>sign</tt></li>
          <li>Change from <tt>KEY</tt> to <tt>KEYS</tt> (permit multiple secret keys in each blob)</li>
          <li>New error code: <tt>KEY_CANNOT_SIGN</tt></li>
          <li>
            <tt>version</tt> now has <tt>--backend</tt> and <tt>--extended</tt> options</li>
        </ul>
        <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>
          <li>does <tt>detach-inband-signature-and-message</tt> need to be able to split an OpenPGP signed message that <em>isn't</em> using the clearsigned framework (e.g., the output of <tt>gpg --sign</tt>, in addition to handling <tt>gpg --clearsign</tt>)?</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>Paul Schaub</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>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <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>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC3156" target="https://www.rfc-editor.org/info/rfc3156">
          <front>
            <title>MIME Security with OpenPGP</title>
            <author fullname="M. Elkins" initials="M." surname="Elkins">
              <organization/>
            </author>
            <author fullname="D. Del Torto" initials="D." surname="Del Torto">
              <organization/>
            </author>
            <author fullname="R. Levien" initials="R." surname="Levien">
              <organization/>
            </author>
            <author fullname="T. Roessler" initials="T." surname="Roessler">
              <organization/>
            </author>
            <date month="August" year="2001"/>
            <abstract>
              <t>This document describes how the OpenPGP Message Format can be used to provide privacy and authentication using the Multipurpose Internet Mail Extensions (MIME) security content types described in RFC 1847. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3156"/>
          <seriesInfo name="DOI" value="10.17487/RFC3156"/>
        </reference>
        <reference anchor="RFC3629" target="https://www.rfc-editor.org/info/rfc3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau">
              <organization/>
            </author>
            <date month="November" year="2003"/>
            <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>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </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>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <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>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC4880" target="https://www.rfc-editor.org/info/rfc4880">
          <front>
            <title>OpenPGP Message Format</title>
            <author fullname="J. Callas" initials="J." surname="Callas">
              <organization/>
            </author>
            <author fullname="L. Donnerhacke" initials="L." surname="Donnerhacke">
              <organization/>
            </author>
            <author fullname="H. Finney" initials="H." surname="Finney">
              <organization/>
            </author>
            <author fullname="D. Shaw" initials="D." surname="Shaw">
              <organization/>
            </author>
            <author fullname="R. Thayer" initials="R." surname="Thayer">
              <organization/>
            </author>
            <date month="November" year="2007"/>
            <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>
          <seriesInfo name="RFC" value="4880"/>
          <seriesInfo name="DOI" value="10.17487/RFC4880"/>
        </reference>
        <reference anchor="I-D.ietf-openpgp-rfc4880bis" target="https://www.ietf.org/archive/id/draft-ietf-openpgp-rfc4880bis-10.txt">
          <front>
            <title>OpenPGP Message Format</title>
            <author fullname="Werner Koch">
              <organization>GnuPG e.V.</organization>
            </author>
            <author fullname="brian m. carlson">
	 </author>
            <author fullname="Ronald Henry Tse">
              <organization>Ribose</organization>
            </author>
            <author fullname="Derek Atkins">
	 </author>
            <author fullname="Daniel Kahn Gillmor">
	 </author>
            <date day="31" month="August" year="2020"/>
            <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>
          <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-rfc4880bis-10"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.draft-bre-openpgp-samples-01" target="https://www.ietf.org/archive/id/draft-bre-openpgp-samples-01.txt">
          <front>
            <title>OpenPGP Example Keys and Certificates</title>
            <author fullname="Bjarni Rúnar Einarsson" initials="B. R." surname="Einarsson">
              <organization>Mailpile ehf</organization>
            </author>
            <author fullname="&quot;juga&quot;" initials="" surname="&quot;juga&quot;">
              <organization>Independent</organization>
            </author>
            <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
              <organization>American Civil Liberties Union</organization>
            </author>
            <date day="20" month="December" 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>
          <seriesInfo name="Internet-Draft" value="draft-bre-openpgp-samples-01"/>
        </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="2021" month="October" day="25"/>
          </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="PYTHON-SOP" target="https://pypi.org/project/sop/">
          <front>
            <title>SOP for python</title>
            <author initials="D." surname="Gillmor" fullname="Daniel Kahn Gillmor">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RUST-SOP" target="https://sequoia-pgp.gitlab.io/sop-rs/">
          <front>
            <title>A Rust implementation of the Stateless OpenPGP Protocol</title>
            <author initials="J." surname="Winter" fullname="Justus Winter">
              <organization>Sequoia</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="SOP-JAVA" target="https://github.com/pgpainless/pgpainless/tree/master/sop-java">
          <front>
            <title>Stateless OpenPGP Protocol for Java.</title>
            <author initials="P." surname="Schaub" fullname="Paul Schaub">
              <organization/>
            </author>
            <date>n.d.</date>
          </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>
            <author fullname="J. Postel" initials="J." surname="Postel">
              <organization/>
            </author>
            <author fullname="J. Reynolds" initials="J." surname="Reynolds">
              <organization/>
            </author>
            <date month="October" year="1985"/>
            <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>
          <seriesInfo name="STD" value="9"/>
          <seriesInfo name="RFC" value="959"/>
          <seriesInfo name="DOI" value="10.17487/RFC0959"/>
        </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>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <date month="November" year="1996"/>
            <abstract>
              <t>This initial document specifies the various headers used to describe the structure of MIME messages.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2045"/>
          <seriesInfo name="DOI" value="10.17487/RFC2045"/>
        </reference>
        <reference anchor="RFC5321" target="https://www.rfc-editor.org/info/rfc5321">
          <front>
            <title>Simple Mail Transfer Protocol</title>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <date month="October" year="2008"/>
            <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>
          <seriesInfo name="RFC" value="5321"/>
          <seriesInfo name="DOI" value="10.17487/RFC5321"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
z0J6xacJ0DJGKa/bH/qHJy/t4DuxU52eXfa6x+f97uXL168uj193Tk573V7v
4PjyHE1Qhye9i5NXR6eH593zV52jV71XnVevj05O4fn55enlq/PeBeAXFSaC
k5KqU67hpCHyN6q4i6TqE4nXFN654Jagge1VG9h1vnTPrETa8dglw8TyrCuH
SfKfKgeO0fNoDuPVftlUUmvEfBkYyQsebKSUH7ZRVNsHaVKsPRhcnowb7HBC
uDGTRMagycXnqUPCPDg5OBQjTyzGviIuV9IPY7fB8SOJFaaVEwOyIIOY8sFQ
PIFVWko7IchXanp1FIjW0WKcMOQ19ASaDERdOsRUETN27epM3NrK7o2TqVpX
TcBHe1keUSFzlS4AOKWENHP3jUGuUpw82FZHAMFqFZTniNh9IrDjdRmpslvK
N+fW/VewZFkC/UdiuDR6FJaZdJL1uJmAHX4rtW7qiQ7/jZU3CdT4tCwHgJYT
aq8qT2nzqGvPYbJNnpol7VAF+G6Mfu5jJip9wPptHtll4Lm0RkG2NzjcqKlq
uSPAGAuqij6u5IrQVGLHwcr0xucuV04ZEStB2ljhV1l5H+57XFYKLcf4y2WM
vYeWOZV+M/5oHApF6N1FoO4lpWvuNXxjp3dKRgWJ1JYOtyuVDnin1gf7HDUk
9gEg249ceh9hR3M9Y4ve7hRBj0DZcw3naA+gbDdU8LFRNJvOm81WuhtB3SjP
sf0OV6EiGvKLsnIggySzlCZkoM3UQG8s943FmMUKzIEU5GoQRFIjaz8/GXPv
R+weG6+ta4M9PlA6tDKGlHEoYPsK42SuJqR51ATK/w0XF9a8b5cqZvsv4MKU
DE8/j6o+uCa/jdc77fRfXhy9POx0ugfnp4eH3YOTzmn/1auXB68PTl+eHJ52
+yeXl6+93vF57/Di4vzoda/XP315/Pqkf94/7R1eHnZenh4cvDrtHL3un/Re
1qtQY8tzDC5Hj1eXPV6B8nj1lN68b90xiqryPE0w2XAVKJKHcVFIE4VsSo+D
gZgdVeqF/bP2+gfcY1VaXqjkDLHQV4r0cX5ELc33A+b5chFZU39lZIyqrn8c
70Sapb5aDRW/KXTDP6lZUVqGcZE0hQVsqkJxya1qvCtsVQMwdVvXtCquEbVE
nY0lDUgo8WeRRgus/cDKZgqCKcqBJDPq0qZS9ILrcRVmxTJkx9vF6mws/VFp
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
2dUY//kD5iIBLzrPo7hcZAW89L8Bd1nC3q/XAAA=

-->

</rfc>
