<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version  (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-dkg-openpgp-stateless-cli-05" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Stateless OpenPGP Command Line Interface</title>

    <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="2023" month="February" day="22"/>

    <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 <spanx style="verb">sop</spanx>.
It aims for a minimal, well-structured API covering OpenPGP object security.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://dkg.gitlab.io/openpgp-stateless-cli/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-dkg-openpgp-stateless-cli/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/dkg/openpgp-stateless-cli/"/>.</t>
    </note>


  </front>

  <middle>


<section anchor="introduction"><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"/>.</t>

<t>This document defines a generic stateless command-line interface for dealing with OpenPGP messages, known here by the placeholder <spanx style="verb">sop</spanx>.
It aims for a minimal, well-structured API.</t>

<t>An OpenPGP implementation should not name its executable <spanx style="verb">sop</spanx> to implement this specification.  It just needs to provide a program that conforms to this interface.</t>

<t>A <spanx style="verb">sop</spanx> 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"><name>Requirements Language</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>This document uses the term "key" to refer exclusively to OpenPGP Transferable Secret Keys (see <xref section="11.2" sectionFormat="of" target="RFC4880"/>).</t>

<t>It uses the term "certificate" to refer to OpenPGP Transferable Public Key (see <xref section="11.1" sectionFormat="of" target="RFC4880"/>).</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 <spanx style="verb">sop</spanx> 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" (<xref section="5.2.3.23" sectionFormat="of" target="RFC4880"/>), 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"><name>Using sop in a Test Suite</name>

<t>If an OpenPGP implementation provides a <spanx style="verb">sop</spanx> interface, it can be used to test interoperability (e.g., <xref target="OpenPGP-Interoperability-Test-Suite"></xref>).</t>

<t>Such an interop test suite can, for example, use custom code (<em>not</em> <spanx style="verb">sop</spanx>) to generate a new OpenPGP object that incorporates new primitives, and feed that object to a stable of <spanx style="verb">sop</spanx> implementations, to determine whether those implementations can consume the new form.</t>

<t>Or, the test suite can drive each <spanx style="verb">sop</spanx> implementation with a simple input, and observe which cryptographic primitives each implementation chooses to use as it produces output.</t>

</section>
<section anchor="semantics-vs-wire-format"><name>Semantics vs. Wire Format</name>

<t>The semantics of <spanx style="verb">sop</spanx> are deliberately simple and very high-level compared to the vast complexity and nuance available within the OpenPGP specification.
This reflects the perspective of nearly every piece of tooling that relies on OpenPGP to accomplish its task: most toolchains don't care about the specifics, they just want the high-level object security properties.</t>

<t>Given this framing, this document generally tries to avoid overconstraining the details of the wire format objects emitted, or what kinds of wire format structures should be acceptable or unacceptable.
This allows a test suite to evaluate and contrast the wire format choices made by different implementations in as close to their native configuration as possible.
It also makes it easier to promote interoperability by ensuring that the native wire formats emitted by one implementation can be consumed by another, without relying on their choices of wire format being constrained by this draft.</t>

<t>Where this draft does identify specific wire format requirements, that might be due to an ambiguity in the existing specifications (which maybe needs fixing elsewhere), or to a bug in this specification that could be improved.</t>

</section>
</section>
<section anchor="examples"><name>Examples</name>

<t>These examples show no error checking, but give a flavor of how <spanx style="verb">sop</spanx> might be used in practice from a shell.</t>

<t>The key and certificate files described in them (e.g. <spanx style="verb">alice.sec</spanx>) could be for example those found in <xref target="I-D.draft-bre-openpgp-samples-01"/>.</t>

<figure><artwork><![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 bob.pgp < msg.eml > ciphertext.asc
sop decrypt bob.sec < ciphertext.asc > cleartext.eml
]]></artwork></figure>

<t>See <xref target="failure-modes"/> for more information about errors and error handling.</t>

</section>
<section anchor="subcommands"><name>Subcommands</name>

<t><spanx style="verb">sop</spanx> uses a subcommand interface, similar to those popularized by systems like <spanx style="verb">git</spanx> and <spanx style="verb">svn</spanx>.</t>

<t>If the user supplies a subcommand that <spanx style="verb">sop</spanx> does not implement, it fails with <spanx style="verb">UNSUPPORTED_SUBCOMMAND</spanx>.
If a <spanx style="verb">sop</spanx> implementation does not handle a supplied option for a given subcommand, it fails with <spanx style="verb">UNSUPPORTED_OPTION</spanx>.</t>

<t>All subcommands that produce OpenPGP material on standard output produce ASCII-armored (<xref section="6" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>) objects by default (except for <spanx style="verb">sop dearmor</spanx>).
These subcommands have a <spanx style="verb">--no-armor</spanx> 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"/>) and behave accordingly.</t>

<t>See <xref target="indirect-types"/> for details about how various forms of OpenPGP material are expected to be structured.</t>

<section anchor="version"><name>version: Version Information</name>

<figure><artwork><![CDATA[
sop version [--backend|--extended]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: ignored</t>
  <t>Standard Output: version information</t>
</list></t>

<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 <spanx style="verb">sop</spanx> implementation, followed by a single space, followed by the version number.
A <spanx style="verb">sop</spanx> implementation should use a version number that respects an established standard that is easily comparable and parsable, like <xref target="SEMVER"></xref>.</t>

<t>If <spanx style="verb">--backend</spanx> is supplied, the implementation should produce a comparable line of implementation and version information about the primary underlying OpenPGP toolkit.</t>

<t>If <spanx style="verb">--extended</spanx> is supplied, the implementation may emit multiple lines of version information.
The first line <bcp14>MUST</bcp14> match the information produced by a simple invocation, but the rest of the text has no defined structure.</t>

<t><spanx style="verb">--backend</spanx> and <spanx style="verb">--extended</spanx> are mutually-exclusive options.</t>

<t>Example:</t>

<figure><artwork><![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></figure>

</section>
<section anchor="list-profiles"><name>list-profiles: Describe Available Profiles</name>

<figure><artwork><![CDATA[
sop list-profiles SUBCOMMAND
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: ignored</t>
  <t>Standard Output: PROFILELIST (<xref target="profilelist"/>)</t>
</list></t>

<t>This subcommand emits a list of profiles supported by the identified subcommand.</t>

<t>If the indicated <spanx style="verb">SUBCOMMAND</spanx> does not accept a <spanx style="verb">--profile</spanx> option, it returns <spanx style="verb">UNSUPPORTED_PROFILE</spanx>.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop list-profiles generate-key
default: use the implementer's recommendations
rfc4880: use algorithms from RFC 4880
$
]]></artwork></figure>

</section>
<section anchor="generate-key"><name>generate-key: Generate a Secret Key</name>

<figure><artwork><![CDATA[
sop generate-key [--no-armor]
    [--with-key-password=PASSWORD]
    [--profile=PROFILE]
    [--] [USERID...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: ignored</t>
  <t>Standard Output: <spanx style="verb">KEYS</spanx> (<xref target="keys"/>)</t>
</list></t>

<t>Generate a single default OpenPGP key with zero or more User IDs.</t>

<t>The generated secret key <bcp14>SHOULD</bcp14> be usable for as much of the <spanx style="verb">sop</spanx> functionality as possible.
In particular:</t>

<t><list style="symbols">
  <t>It should be possible to extract an OpenPGP certificate from the key in <spanx style="verb">KEYS</spanx> with <spanx style="verb">sop extract-cert</spanx>.</t>
  <t>The key in <spanx style="verb">KEYS</spanx> should be able to create signatures (with <spanx style="verb">sop sign</spanx>) that are verifiable by using <spanx style="verb">sop verify</spanx> with the extracted certificate.</t>
  <t>The key in <spanx style="verb">KEYS</spanx> should be able to decrypt messages (with <spanx style="verb">sop decrypt</spanx>) that are encrypted by using <spanx style="verb">sop encrypt</spanx> with the extracted certificate.</t>
</list></t>

<t>The detailed internal structure of the certificate is left to the discretion of the <spanx style="verb">sop</spanx> implementation.</t>

<t>If the <spanx style="verb">--with-key-password</spanx> option is supplied, the generated key will be password-protected (locked) with the supplied password.
Note that <spanx style="verb">PASSWORD</spanx> is an indirect data type from which the actual password is acquired (<xref target="indirect-types"/>).
See also the guidance on ensuring that the password is human-readable in <xref target="generating-human-readable"/>.</t>

<t>If the <spanx style="verb">--profile</spanx> argument is supplied and the indicated <spanx style="verb">PROFILE</spanx> is not supported by the implementation, <spanx style="verb">sop</spanx> will fail with <spanx style="verb">UNSUPPORTED_PROFILE</spanx>.</t>

<t>If no <spanx style="verb">--with-key-password</spanx> option is supplied, the generated key will be unencrypted.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop generate-key 'Alice Lovelace <alice@openpgp.example>' > alice.sec
$ head -n1 < alice.sec
-----BEGIN PGP PRIVATE KEY BLOCK-----
$
]]></artwork></figure>

</section>
<section anchor="extract-cert"><name>extract-cert: Extract a Certificate from a Secret Key</name>

<figure><artwork><![CDATA[
sop extract-cert [--no-armor]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">KEYS</spanx> (<xref target="keys"/>)</t>
  <t>Standard Output: <spanx style="verb">CERTS</spanx> (<xref target="certs"/>)</t>
</list></t>

<t>The output should contain one OpenPGP certificate in <spanx style="verb">CERTS</spanx> per OpenPGP Transferable Secret Key found in <spanx style="verb">KEYS</spanx>.
There is no guarantee what order the <spanx style="verb">CERTS</spanx> will be in.</t>

<t><spanx style="verb">sop extract-cert</spanx> <bcp14>SHOULD</bcp14> work even if any of the keys in <spanx style="verb">KEYS</spanx> is password-protected.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop extract-cert < alice.sec > alice.pgp
$ head -n1 < alice.pgp
-----BEGIN PGP PUBLIC KEY BLOCK-----
$
]]></artwork></figure>

</section>
<section anchor="sign"><name>sign: Create Detached Signatures</name>

<figure><artwork><![CDATA[
sop sign [--no-armor] [--micalg-out=MICALG]
     [--with-key-password=PASSWORD...]
     [--as={binary|text}] [--] KEYS [KEYS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
  <t>Standard Output: <spanx style="verb">SIGNATURES</spanx> (<xref target="signature"/>)</t>
</list></t>

<t>Exactly one signature will be made by each key in the supplied <spanx style="verb">KEYS</spanx> arguments.</t>

<t><spanx style="verb">--as</spanx> defaults to <spanx style="verb">binary</spanx>.  If <spanx style="verb">--as=text</spanx> and the input <spanx style="verb">DATA</spanx> is
not valid <spanx style="verb">UTF-8</spanx> (<xref target="utf8"/>), <spanx style="verb">sop sign</spanx> fails with <spanx style="verb">EXPECTED_TEXT</spanx>.</t>

<t><spanx style="verb">--as=binary</spanx> <bcp14>SHOULD</bcp14> result in OpenPGP signatures of type 0x00 ("Signature of a binary document").
<spanx style="verb">--as=text</spanx> <bcp14>SHOULD</bcp14> result in OpenPGP signatures of type 0x01 ("Signature of a canonical text document").
See <xref section="5.2.1" sectionFormat="of" target="RFC4880"/> for more details.</t>

<t>When generating PGP/MIME messages (<xref target="RFC3156"/>), it is useful to know what digest algorithm was used for the generated signature.
When <spanx style="verb">--micalg-out</spanx> is supplied, <spanx style="verb">sop sign</spanx> emits the digest algorithm used to the specified <spanx style="verb">MICALG</spanx> file in a way that can be used to populate the <spanx style="verb">micalg</spanx> parameter for the Content-Type (see <xref target="micalg"/>).
If the specified <spanx style="verb">MICALG</spanx> file already exists in the filesystem, <spanx style="verb">sop sign</spanx> will fail with <spanx style="verb">OUTPUT_EXISTS</spanx>.</t>

<t>When signing with multiple keys, <spanx style="verb">sop sign</spanx> <bcp14>SHOULD</bcp14> use the same digest algorithm for every signature generated in a single run, unless there is some internal constraint on the <spanx style="verb">KEYS</spanx> objects.
If <spanx style="verb">--micalg-out</spanx> is requested, and multiple incompatibly-constrained <spanx style="verb">KEYS</spanx> objects are supplied, <spanx style="verb">sop sign</spanx> <bcp14>MUST</bcp14> emit the empty string to the designated <spanx style="verb">MICALG</spanx>.</t>

<t>If the signing key material in any key in the <spanx style="verb">KEYS</spanx> objects is password-protected, <spanx style="verb">sop sign</spanx> <bcp14>SHOULD</bcp14> try all supplied <spanx style="verb">--with-key-password</spanx> options to unlock the key material until it finds one that enables the use of the key for signing.
If none of the <spanx style="verb">PASSWORD</spanx> options unlock the key (or if no such option is supplied), <spanx style="verb">sop sign</spanx> will fail with <spanx style="verb">KEY_IS_PROTECTED</spanx>.
Note that <spanx style="verb">PASSWORD</spanx> is an indirect data type from which the actual password is acquired (<xref target="indirect-types"/>).
Note also the guidance for retrying variants of a non-human-readable password in <xref target="consuming-passwords"/>.</t>

<t>If any key in the <spanx style="verb">KEYS</spanx> objects is not capable of producing a signature, <spanx style="verb">sop sign</spanx> will fail with <spanx style="verb">KEY_CANNOT_SIGN</spanx>.</t>

<t><spanx style="verb">sop sign</spanx> <bcp14>MUST NOT</bcp14> produce any extra signatures beyond those from <spanx style="verb">KEYS</spanx> objects supplied on the command line.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop sign --as=text alice.sec < message.txt > message.txt.asc
$ head -n1 < message.txt.asc
-----BEGIN PGP SIGNATURE-----
$
]]></artwork></figure>

</section>
<section anchor="verify"><name>verify: Verify Detached Signatures</name>

<figure><artwork><![CDATA[
sop verify [--not-before=DATE] [--not-after=DATE]
    [--] SIGNATURES CERTS [CERTS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
  <t>Standard Output: <spanx style="verb">VERIFICATIONS</spanx> (<xref target="verifications"/>)</t>
</list></t>

<t><spanx style="verb">--not-before</spanx> and <spanx style="verb">--not-after</spanx> indicate that signatures with dates outside certain range <bcp14>MUST NOT</bcp14> be considered valid.</t>

<t><spanx style="verb">--not-before</spanx> defaults to the beginning of time.
Accepts the special value <spanx style="verb">-</spanx> to indicate the beginning of time (i.e. no lower boundary).</t>

<t><spanx style="verb">--not-after</spanx> defaults to the current system time (<spanx style="verb">now</spanx>).
Accepts the special value <spanx style="verb">-</spanx> to indicate the end of time (i.e. no upper boundary).</t>

<t><spanx style="verb">sop verify</spanx> only returns <spanx style="verb">OK</spanx> if at least one certificate included in any <spanx style="verb">CERTS</spanx> object made a valid signature in the time window specified over the <spanx style="verb">DATA</spanx> supplied.</t>

<t>For details about the valid signatures, the user <bcp14>MUST</bcp14> inspect the <spanx style="verb">VERIFICATIONS</spanx> output.</t>

<t>If no <spanx style="verb">CERTS</spanx> are supplied, <spanx style="verb">sop verify</spanx> fails with <spanx style="verb">MISSING_ARG</spanx>.</t>

<t>If no valid signatures are found, <spanx style="verb">sop verify</spanx> fails with <spanx style="verb">NO_SIGNATURE</spanx>.</t>

<t>See <xref target="signature-verification"/> 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>

<figure><artwork><![CDATA[
$ sop verify message.txt.asc alice.pgp < message.txt
2019-10-29T18:36:45Z EB85BB5FA33A75E15E944E63F231550C4F47E38E EB85BB5FA33A75E15E944E63F231550C4F47E38E mode:text signed by alice.pgp
$ echo $?
0
$ tr a-z A-Z < message.txt | sop verify message.txt.asc alice.pgp
$ echo $?
3
$
]]></artwork></figure>

</section>
<section anchor="encrypt"><name>encrypt: Encrypt a Message</name>

<figure><artwork><![CDATA[
sop encrypt [--as={binary|text}]
    [--no-armor]
    [--with-password=PASSWORD...]
    [--sign-with=KEYS...]
    [--with-key-password=PASSWORD...]
    [--] [CERTS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
  <t>Standard Output: <spanx style="verb">CIPHERTEXT</spanx> (<xref target="ciphertext"/>)</t>
</list></t>

<t><spanx style="verb">--as</spanx> defaults to <spanx style="verb">binary</spanx>.
The setting of <spanx style="verb">--as</spanx> corresponds to the one octet format field found in the Literal Data packet at the core of the output <spanx style="verb">CIPHERTEXT</spanx>.
If <spanx style="verb">--as</spanx> is set to <spanx style="verb">binary</spanx>, the octet is <spanx style="verb">b</spanx> (<spanx style="verb">0x62</spanx>).
If it is <spanx style="verb">text</spanx>, the format octet is <spanx style="verb">u</spanx> (<spanx style="verb">0x75</spanx>).</t>

<t><spanx style="verb">--with-password</spanx> enables symmetric encryption (and can be used multiple times if multiple passwords are desired).</t>

<t><spanx style="verb">--sign-with</spanx> creates exactly one signature by for each secret key found in the supplied <spanx style="verb">KEYS</spanx> object (this can also be used multiple times if signatures from keys found in separaate files are desired).
If any key in any supplied <spanx style="verb">KEYS</spanx> object is not capable of producing a signature, <spanx style="verb">sop sign</spanx> will fail with <spanx style="verb">KEY_CANNOT_SIGN</spanx>.
If any signing key material in any supplied <spanx style="verb">KEYS</spanx> object is password-protected, <spanx style="verb">sop encrypt</spanx> <bcp14>SHOULD</bcp14> try all supplied <spanx style="verb">--with-key-password</spanx> options to unlock the key material until it finds one that enables the use of the key for signing.
If none of the <spanx style="verb">--with-key-password=PASSWORD</spanx> options can unlock any locked signing key material (or if no such option is supplied), <spanx style="verb">sop encrypt</spanx> will fail with <spanx style="verb">KEY_IS_PROTECTED</spanx>.
All signatures made must be placed inside the encryption produced by <spanx style="verb">sop encrypt</spanx>.</t>

<t>Note that both <spanx style="verb">--with-password</spanx> and <spanx style="verb">--with-key-password</spanx> supply <spanx style="verb">PASSWORD</spanx> arguments, but they do so in different contexts which are not interchangeable.
A <spanx style="verb">PASSWORD</spanx> supplied for symmetric encryption (<spanx style="verb">--with-password</spanx>) <bcp14>MUST NOT</bcp14> be used to try to unlock a signing key (<spanx style="verb">--with-key-password</spanx>) and a <spanx style="verb">PASSWORD</spanx> supplied to unlock a signing key <bcp14>MUST NOT</bcp14> be used to symmetrically encrypt the message.
Regardless of context, each <spanx style="verb">PASSWORD</spanx> argument is presented as an indirect data type from which the actual password is acquired (<xref target="indirect-types"/>).
If <spanx style="verb">sop encrypt</spanx> encounters a password which is not a valid <spanx style="verb">UTF-8</spanx> string (<xref target="utf8"/>), or is otherwise not robust in its representation to humans,
it fails with <spanx style="verb">PASSWORD_NOT_HUMAN_READABLE</spanx>.
If <spanx style="verb">sop encrypt</spanx> sees trailing whitespace at the end of a password,
it will trim the trailing whitespace before using the password.
See <xref target="human-readable-passwords"/> for more discussion about passwords.</t>

<t>If <spanx style="verb">--as</spanx> is set to <spanx style="verb">binary</spanx>, then <spanx style="verb">--sign-with</spanx> will sign as a binary document (OpenPGP signature type <spanx style="verb">0x00</spanx>).</t>

<t>If <spanx style="verb">--as</spanx> is set to <spanx style="verb">text</spanx>, then <spanx style="verb">--sign-with</spanx> will sign as a canonical text document (OpenPGP signature type <spanx style="verb">0x01</spanx>).
In this case, if the input <spanx style="verb">DATA</spanx> is not valid <spanx style="verb">UTF-8</spanx>  (<xref target="utf8"/>), <spanx style="verb">sop encrypt</spanx> fails with <spanx style="verb">EXPECTED_TEXT</spanx>.</t>

<t>If <spanx style="verb">--sign-with</spanx> is supplied for input <spanx style="verb">DATA</spanx> that is not valid <spanx style="verb">UTF-8</spanx>, <spanx style="verb">sop encrypt</spanx> <bcp14>MAY</bcp14> sign as a binary document (OpenPGP signature type <spanx style="verb">0x00</spanx>).</t>

<t><spanx style="verb">sop encrypt</spanx> <bcp14>MUST NOT</bcp14> produce any extra signatures beyond those from <spanx style="verb">KEYS</spanx> objects identified by <spanx style="verb">--sign-with</spanx>.</t>

<t>The resulting <spanx style="verb">CIPHERTEXT</spanx> should be decryptable by the secret keys corresponding to every certificate included in all <spanx style="verb">CERTS</spanx>, as well as each password given with <spanx style="verb">--with-password</spanx>.</t>

<t>If no <spanx style="verb">CERTS</spanx> or <spanx style="verb">--with-password</spanx> options are present, <spanx style="verb">sop encrypt</spanx> fails with <spanx style="verb">MISSING_ARG</spanx>.</t>

<t>If at least one of the identified certificates requires encryption to an unsupported asymmetric algorithm, <spanx style="verb">sop encrypt</spanx> fails with <spanx style="verb">UNSUPPORTED_ASYMMETRIC_ALGO</spanx>.</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), <spanx style="verb">sop encrypt</spanx> fails with <spanx style="verb">CERT_CANNOT_ENCRYPT</spanx>.</t>

<t>If <spanx style="verb">sop encrypt</spanx> fails for any reason, it emits no <spanx style="verb">CIPHERTEXT</spanx>.</t>

<t>Example:</t>

<t>(In this example, <spanx style="verb">bob.bin</spanx> is a file containing Bob's binary-formatted OpenPGP certificate.
Alice is encrypting a message to both herself and Bob.)</t>

<figure><artwork><![CDATA[
$ sop encrypt --as=text --sign-with=alice.key alice.asc bob.bin < message.eml > encrypted.asc
$ head -n1 encrypted.asc
-----BEGIN PGP MESSAGE-----
$
]]></artwork></figure>

</section>
<section anchor="decrypt"><name>decrypt: Decrypt a Message</name>

<figure><artwork><![CDATA[
sop decrypt [--session-key-out=SESSIONKEY]
    [--with-session-key=SESSIONKEY...]
    [--with-password=PASSWORD...]
    [--with-key-password=PASSWORD...]
    [--verifications-out=VERIFICATIONS
     [--verify-with=CERTS...]
     [--verify-not-before=DATE]
     [--verify-not-after=DATE] ]
    [--] [KEYS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">CIPHERTEXT</spanx> (<xref target="ciphertext"/>)</t>
  <t>Standard Output: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
</list></t>

<t>The caller can ask <spanx style="verb">sop</spanx> for the session key discovered during decryption by supplying the <spanx style="verb">--session-key-out</spanx> option.
If the specified file already exists in the filesystem, <spanx style="verb">sop decrypt</spanx> will fail with <spanx style="verb">OUTPUT_EXISTS</spanx>.
When decryption is successful, <spanx style="verb">sop decrypt</spanx> writes the discovered session key to the specified file.</t>

<t><spanx style="verb">--with-session-key</spanx> enables decryption of the <spanx style="verb">CIPHERTEXT</spanx> using the session key directly against the <spanx style="verb">SEIPD</spanx> packet.
This option can be used multiple times if several possible session keys should be tried.
<spanx style="verb">SESSIONKEY</spanx> is an indirect data type from which the actual <spanx style="verb">sessionkey</spanx> value is acquired (<xref target="indirect-types"/>).</t>

<t><spanx style="verb">--with-password</spanx> enables decryption based on any <spanx style="verb">SKESK</spanx> (<xref section="5.3" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>) packets in the <spanx style="verb">CIPHERTEXT</spanx>.
This option can be used multiple times if the user wants to try more than one password.</t>

<t><spanx style="verb">--with-key-password</spanx> lets the user use password-protected (locked) secret key material.
If the decryption-capable secret key material in any key in the <spanx style="verb">KEYS</spanx> objects is password-protected, <spanx style="verb">sop decrypt</spanx> <bcp14>SHOULD</bcp14> try all supplied <spanx style="verb">--with-key-password</spanx> options to unlock the key material until it finds one that enables the use of the key for decryption.
If none of the <spanx style="verb">--with-key-password</spanx> options unlock the key (or if no such option is supplied), and the message cannot be decrypted with any other <spanx style="verb">KEYS</spanx>, <spanx style="verb">--with-session-key</spanx>, or <spanx style="verb">--with-password</spanx> options, <spanx style="verb">sop decrypt</spanx> will fail with <spanx style="verb">KEY_IS_PROTECTED</spanx>.</t>

<t>Note that the two kinds of <spanx style="verb">PASSWORD</spanx> options are for different domains: <spanx style="verb">--with-password</spanx> is for unlocking an <spanx style="verb">SKESK</spanx>, and <spanx style="verb">--with-key-password</spanx> is for unlocking secret key material in <spanx style="verb">KEYS</spanx>.
<spanx style="verb">sop decrypt</spanx> <bcp14>SHOULD NOT</bcp14> apply the <spanx style="verb">--with-key-password</spanx> argument to any <spanx style="verb">SKESK</spanx>, or the <spanx style="verb">--with-password</spanx> argument to any <spanx style="verb">KEYS</spanx>.</t>

<t>Each <spanx style="verb">PASSWORD</spanx> argument is an indirect data type from which the actual password is acquired (<xref target="indirect-types"/>).
If <spanx style="verb">sop decrypt</spanx> tries and fails to use a password supplied by a <spanx style="verb">PASSWORD</spanx>,
and it observes that there is trailing <spanx style="verb">UTF-8</spanx> whitespace at the end of the password,
it will retry with the trailing whitespace stripped.
See <xref target="consuming-passwords"/> for more discussion about consuming password-protected key material.</t>

<t><spanx style="verb">--verifications-out</spanx> produces signature verification status to the designated file.
If the designated file already exists in the filesystem, <spanx style="verb">sop decrypt</spanx> will fail with <spanx style="verb">OUTPUT_EXISTS</spanx>.</t>

<t>The return code of <spanx style="verb">sop decrypt</spanx> is not affected by the results of signature verification.
The caller <bcp14>MUST</bcp14> check the returned <spanx style="verb">VERIFICATIONS</spanx> to confirm signature status.
An empty <spanx style="verb">VERIFICATIONS</spanx> output indicates that no valid signatures were found.</t>

<t><spanx style="verb">--verify-with</spanx> 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 <spanx style="verb">--verifications-out</spanx> and at least one <spanx style="verb">--verify-with</spanx> must be supplied.
If only one of these options is supplied, <spanx style="verb">sop decrypt</spanx> fails with <spanx style="verb">INCOMPLETE_VERIFICATION</spanx>.</t>

<t><spanx style="verb">--verify-not-before</spanx> and <spanx style="verb">--verify-not-after</spanx> provide a date range for acceptable signatures,
by analogy with the options for <spanx style="verb">sop verify</spanx> (see <xref target="verify"/>).
They should only be supplied when doing signature verification.</t>

<t>See <xref target="signature-verification"/> for more details about signature verification.</t>

<t>If no <spanx style="verb">KEYS</spanx> or <spanx style="verb">--with-password</spanx> or <spanx style="verb">--with-session-key</spanx> options are present, <spanx style="verb">sop decrypt</spanx> fails with <spanx style="verb">MISSING_ARG</spanx>.</t>

<t>If unable to decrypt, <spanx style="verb">sop decrypt</spanx> fails with <spanx style="verb">CANNOT_DECRYPT</spanx>.</t>

<t><spanx style="verb">sop decrypt</spanx> 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>

<figure><artwork><![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></figure>

<section anchor="historic-options-for-sop-decrypt"><name>Historic Options for sop decrypt</name>

<t>The <spanx style="verb">sop decrypt</spanx> option <spanx style="verb">--verifications-out</spanx> used to be named <spanx style="verb">--verify-out</spanx>.
An implementation <bcp14>SHOULD</bcp14> accept either form of this option, and <bcp14>SHOULD</bcp14> produce a deprecation warning to standard error if the old form is used.</t>

</section>
</section>
<section anchor="armor-convert-binary-to-ascii"><name>armor: Convert Binary to ASCII</name>

<figure><artwork><![CDATA[
sop armor [--label={auto|sig|key|cert|message}]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: OpenPGP material (<spanx style="verb">SIGNATURES</spanx>, <spanx style="verb">KEYS</spanx>, <spanx style="verb">CERTS</spanx>, <spanx style="verb">CIPHERTEXT</spanx>, or <spanx style="verb">INLINESIGNED</spanx>)</t>
  <t>Standard Output: the same material with ASCII-armoring added, if not already present</t>
</list></t>

<t>The user can choose to specify the label used in the header and tail of the armoring.</t>

<t>The default for <spanx style="verb">--label</spanx> is <spanx style="verb">auto</spanx>, in which case, <spanx style="verb">sop</spanx> inspects the input and chooses the label appropriately, based on the OpenPGP packets encountered.
If the type of the first OpenPGP packet is:</t>

<t><list style="symbols">
  <t><spanx style="verb">0x05</spanx> (Secret-Key), the packet stream should be parsed as a <spanx style="verb">KEYS</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP PRIVATE KEY BLOCK</spanx>).</t>
  <t><spanx style="verb">0x06</spanx> (Public-Key), the packet stream should be parsed as a <spanx style="verb">CERTS</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP PUBLIC KEY BLOCK</spanx>).</t>
  <t><spanx style="verb">0x01</spanx> (Public-key Encrypted Session Key) or <spanx style="verb">0x03</spanx> (Symmetric-key Encrypted Session Key), the packet stream should be parsed as a <spanx style="verb">CIPHERTEXT</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP MESSAGE</spanx>).</t>
  <t><spanx style="verb">0x04</spanx> (One-Pass Signature), the packet stream should be parsed as an <spanx style="verb">INLINESIGNED</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP MESSAGE</spanx>).</t>
  <t><spanx style="verb">0x02</spanx> (Signature), the packet stream may be either a <spanx style="verb">SIGNATURES</spanx> input or an <spanx style="verb">INLINESIGNED</spanx> input.
If the packet stream contains only Signature packets, it should be parsed as a<spanx style="verb">SIGNATURES</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP SIGNATURE</spanx>).
If it contains any packet other than a Signature packet, it should be parsed as an <spanx style="verb">INLINESIGNED</spanx> input (with Armor Header <spanx style="verb">BEGIN PGP MESSAGE</spanx>).</t>
</list></t>

<t>If the input packet stream does not match the expected sequence of packet types, <spanx style="verb">sop armor</spanx> fails with <spanx style="verb">BAD_DATA</spanx>.</t>

<t>Note that <spanx style="verb">--label=message</spanx> may be used for either <spanx style="verb">INLINESIGNED</spanx> or <spanx style="verb">CIPHERTEXT</spanx> inputs.</t>

<t>Since <spanx style="verb">sop armor</spanx> accepts ASCII-armored input as well as binary input, this operation is idempotent on well-structured data.
A caller can use this subcommand blindly to ensure that any well-formed OpenPGP packet stream is 7-bit clean.</t>

<t>FIXME: what to do if the input is a CSF <spanx style="verb">INLINESIGNED</spanx> message?
Three choices:</t>

<t><list style="symbols">
  <t>Leave it untouched -- this violates the claim about blindly ensuring 7-bit clean, since UTF-8-encoded message text is not necessarily 7-bit clean.</t>
  <t>Convert to ASCII-armored <spanx style="verb">INLINESIGNED</spanx> -- this requires synthesis of OPS packet (from the CSF <spanx style="verb">Hash</spanx> header) and Literal Data packet (from the message body).</t>
  <t>Raise a specific error.</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop armor < bob.bin > bob.pgp
$ head -n1 bob.pgp
-----BEGIN PGP PUBLIC KEY BLOCK-----
$
]]></artwork></figure>

</section>
<section anchor="dearmor-convert-ascii-to-binary"><name>dearmor: Convert ASCII to Binary</name>

<figure><artwork><![CDATA[
sop dearmor
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: OpenPGP material (<spanx style="verb">SIGNATURES</spanx>, <spanx style="verb">KEYS</spanx>, <spanx style="verb">CERTS</spanx>, <spanx style="verb">CIPHERTEXT</spanx>, or <spanx style="verb">INLINESIGNED</spanx>)</t>
  <t>Standard Output: the same material with any ASCII-armoring removed</t>
</list></t>

<t>If the input packet stream does not match any of the expected sequence of packet types, <spanx style="verb">sop dearmor</spanx> fails with <spanx style="verb">BAD_DATA</spanx>.  See also <xref target="optional-input-armoring"/>.</t>

<t>Since <spanx style="verb">sop dearmor</spanx> 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>FIXME: what to do if the input is a CSF <spanx style="verb">INLINESIGNED</spanx>?
Three choices:</t>

<t><list style="symbols">
  <t>Leave it untouched -- output data is not really in binary format.</t>
  <t>Convert to binary-format <spanx style="verb">INLINESIGNED</spanx> -- this requires synthesis of OPS packet (from CSF <spanx style="verb">Hash</spanx> header) and Literal Data packet (from the message body).</t>
  <t>Raise a specific error.</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop dearmor < message.txt.asc > message.txt.sig
$
]]></artwork></figure>

</section>
<section anchor="inline-detach"><name>inline-detach: Split Signatures from an Inline-Signed Message</name>

<figure><artwork><![CDATA[
sop inline-detach [--no-armor] --signatures-out=SIGNATURES
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">INLINESIGNED</spanx></t>
  <t>Standard Output: <spanx style="verb">DATA</spanx> (the message without any signatures)</t>
</list></t>

<t>In some contexts, the user may expect an inline-signed message of some form or another (<spanx style="verb">INLINESIGNED</spanx>, see <xref target="inlinesigned"/>) rather than a message and its detached signature.
<spanx style="verb">sop inline-detach</spanx> takes such an inline-signed message on standard input, and splits it into:</t>

<t><list style="symbols">
  <t>the potentially signed material on standard output, and</t>
  <t>a detached signature block to the destination identified by <spanx style="verb">--signatures-out</spanx></t>
</list></t>

<t>Note that no cryptographic verification of the signatures is done by this subcommand.
Once the inline-signed message is separated, verification of the detached signature can be done with <spanx style="verb">sop verify</spanx>.</t>

<t>If no <spanx style="verb">--signatures-out</spanx> is supplied, <spanx style="verb">sop inline-detach</spanx> fails with <spanx style="verb">MISSING_ARG</spanx>.</t>

<t>Note that there may be more than one Signature packet in an inline-signed message.
All signatures found in the inline-signed message will be emitted to the <spanx style="verb">--signatures-out</spanx> destination.</t>

<t>If the inline-signed message uses the Cleartext Signature Framework, it may be dash-escaped (see <xref section="7.1" sectionFormat="of" target="RFC4880"/>).
The output of <spanx style="verb">sop detach-inband-signature-and-message</spanx> will have any dash-escaping removed.</t>

<t>If the input is not an <spanx style="verb">INLINESIGNED</spanx> message, <spanx style="verb">sop inline-detach</spanx> fails with <spanx style="verb">BAD_DATA</spanx>.
If the input contains more than one object that could be interpreted as an <spanx style="verb">INLINESIGNED</spanx> message, <spanx style="verb">sop inline-detach</spanx> also fails with <spanx style="verb">BAD_DATA</spanx>.
A <spanx style="verb">sop</spanx> implementation <bcp14>MAY</bcp14> accept (and discard) leading and trailing data when the incoming <spanx style="verb">INLINESIGNED</spanx> message uses the Cleartext Signature Framework.</t>

<t>If the file designated by <spanx style="verb">--signatures-out</spanx> already exists in the filesystem, <spanx style="verb">sop detach-inband-signature-and-message</spanx> will fail with <spanx style="verb">OUTPUT_EXISTS</spanx>.</t>

<t>Note that <spanx style="verb">--no-armor</spanx> here governs the data written to the <spanx style="verb">--signatures-out</spanx> destination.
Standard output is always the raw message, not an OpenPGP packet.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop inline-detach --signatures-out=Release.pgp < InRelease >Release
$ sop verify Release.pgp archive-keyring.pgp < Release
$
]]></artwork></figure>

</section>
<section anchor="inline-verify"><name>inline-verify: Verify an Inline-Signed Message</name>

<figure><artwork><![CDATA[
sop inline-verify [--not-before=DATE] [--not-after=DATE]
    [--verifications-out=VERIFICATIONS]
    [--] CERTS [CERTS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">INLINESIGNED</spanx> (<xref target="inlinesigned"/>)</t>
  <t>Standard Output: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
</list></t>

<t>This command is similar to <spanx style="verb">sop verify</spanx> (<xref target="verify"/>) except that it takes an <spanx style="verb">INLINESIGNED</spanx> message (see <xref target="inlinesigned"/>) and produces the message body (without signatures) on standard output.
It is also similar to <spanx style="verb">sop inline-detach</spanx> (<xref target="inline-detach"/>) except that it actually performs signature verification.</t>

<t><spanx style="verb">--not-before</spanx> and <spanx style="verb">--not-after</spanx> indicate that signatures with dates outside certain range <bcp14>MUST NOT</bcp14> be considered valid.</t>

<t><spanx style="verb">--not-before</spanx> defaults to the beginning of time.
Accepts the special value <spanx style="verb">-</spanx> to indicate the beginning of time (i.e. no lower boundary).</t>

<t><spanx style="verb">--not-after</spanx> defaults to the current system time (<spanx style="verb">now</spanx>).
Accepts the special value <spanx style="verb">-</spanx> to indicate the end of time (i.e. no upper boundary).</t>

<t><spanx style="verb">sop inline-verify</spanx> only returns <spanx style="verb">OK</spanx> if <spanx style="verb">INLINESIGNED</spanx> contains at least one valid signature made during the time window specified by a certificate included in any <spanx style="verb">CERTS</spanx> object.</t>

<t>For details about the valid signatures, the user <bcp14>MUST</bcp14> inspect the <spanx style="verb">VERIFICATIONS</spanx> output.</t>

<t>If no <spanx style="verb">CERTS</spanx> are supplied, <spanx style="verb">sop inline-verify</spanx> fails with <spanx style="verb">MISSING_ARG</spanx>.</t>

<t>If no valid signatures are found, <spanx style="verb">sop inline-verify</spanx> fails with <spanx style="verb">NO_SIGNATURE</spanx> and emits nothing on standard output.</t>

<t>See <xref target="signature-verification"/> 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>

<figure><artwork><![CDATA[
$ sop inline-verify -- alice.pgp < message.txt
Hello, world!
$ echo $?
0
$ sed s/Hello/Goodbye/ < message.txt | sop inline-verify -- alice.pgp
$ echo $?
3
$
]]></artwork></figure>

</section>
<section anchor="inline-sign"><name>inline-sign: Create an Inline-Signed Message</name>

<figure><artwork><![CDATA[
sop inline-sign [--no-armor]
     [--with-key-password=PASSWORD...]
     [--as={binary|text|clearsigned}]
     [--] KEYS [KEYS...]
]]></artwork></figure>

<t><list style="symbols">
  <t>Standard Input: <spanx style="verb">DATA</spanx> (<xref target="data"/>)</t>
  <t>Standard Output: <spanx style="verb">INLINESIGNED</spanx> (<xref target="inlinesigned"/>)</t>
</list></t>

<t>Exactly one signature will be made by each key in the supplied <spanx style="verb">KEYS</spanx> arguments.</t>

<t>The generated output stream will be an inline-signed message, by default producing an OpenPGP "Signed Message" packet stream.</t>

<t><spanx style="verb">--as</spanx> defaults to <spanx style="verb">binary</spanx>.
If <spanx style="verb">--as=</spanx> is set to either <spanx style="verb">text</spanx> or <spanx style="verb">clearsigned</spanx>, and the input <spanx style="verb">DATA</spanx> is not valid <spanx style="verb">UTF-8</spanx> (<xref target="utf8"/>), <spanx style="verb">sop inline-sign</spanx> fails with <spanx style="verb">EXPECTED_TEXT</spanx>.</t>

<t><spanx style="verb">--as=binary</spanx> <bcp14>SHOULD</bcp14> result in OpenPGP signatures of type 0x00 ("Signature of a binary document").
<spanx style="verb">--as=text</spanx> <bcp14>SHOULD</bcp14> result in an OpenPGP signature of type 0x01 ("Signature of a canonical text document").
See <xref section="5.2.1" sectionFormat="of" target="RFC4880"/> for more details.
<spanx style="verb">--as=clearsigned</spanx> <bcp14>SHOULD</bcp14> behave the same way as <spanx style="verb">--as=text</spanx> except that it produces an output stream using the Cleartext Signature Framework (see <xref section="7" sectionFormat="of" target="RFC4880"/> and <xref target="csf-risks"/>).</t>

<t>If both <spanx style="verb">--no-armor</spanx> and <spanx style="verb">--as=clearsigned</spanx>  are supplied, <spanx style="verb">sop inline-sign</spanx> fails with <spanx style="verb">INCOMPATIBLE_OPTIONS</spanx>.</t>

<t>If the signing key material in any key in the <spanx style="verb">KEYS</spanx> objects is password-protected, <spanx style="verb">sop inline-sign</spanx> <bcp14>SHOULD</bcp14> try all supplied <spanx style="verb">--with-key-password</spanx> options to unlock the key material until it finds one that enables the use of the key for signing.
If none of the <spanx style="verb">PASSWORD</spanx> options unlock the key (or if no such option is supplied), <spanx style="verb">sop inline-sign</spanx> will fail with <spanx style="verb">KEY_IS_PROTECTED</spanx>.
Note that <spanx style="verb">PASSWORD</spanx> is an indirect data type from which the actual password is acquired (<xref target="indirect-types"/>).
Note also the guidance for retrying variants of a non-human-readable password in <xref target="consuming-passwords"/>.</t>

<t>If any key in the <spanx style="verb">KEYS</spanx> objects is not capable of producing a signature, <spanx style="verb">sop inline-sign</spanx> will fail with <spanx style="verb">KEY_CANNOT_SIGN</spanx>.</t>

<t><spanx style="verb">sop inline-sign</spanx> <bcp14>MUST NOT</bcp14> produce any extra signatures beyond those from <spanx style="verb">KEYS</spanx> objects supplied on the command line.</t>

<t>Example:</t>

<figure><artwork><![CDATA[
$ sop inline-sign --as=clearsigned alice.sec < message.txt > message-signed.txt
$ head -n5 < message-signed.txt
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

This is the message.
-----BEGIN PGP SIGNATURE-----
$
]]></artwork></figure>

</section>
</section>
<section anchor="input-string-types"><name>Input String Types</name>

<t>Some material is passed to <spanx style="verb">sop</spanx> directly as a string on the command line.</t>

<section anchor="date"><name>DATE</name>

<t>An ISO-8601 formatted timestamp with time zone, or the special value <spanx style="verb">now</spanx> to indicate the current system time.</t>

<t>Examples:</t>

<t><list style="symbols">
  <t><spanx style="verb">now</spanx></t>
  <t><spanx style="verb">2019-10-29T12:11:04+00:00</spanx></t>
  <t><spanx style="verb">2019-10-24T23:48:29Z</spanx></t>
  <t><spanx style="verb">20191029T121104Z</spanx></t>
</list></t>

<t>In some cases where used to specify lower and upper boundaries, a <spanx style="verb">DATE</spanx> value can be set to <spanx style="verb">-</spanx> to indicate "no time limit".</t>

<t>A flexible implementation of <spanx style="verb">sop</spanx> <bcp14>MAY</bcp14> accept date inputs in other unambiguous forms.</t>

<t>Note that whenever <spanx style="verb">sop</spanx> emits a timestamp (e.g. in <xref target="verifications"/>) it <bcp14>MUST</bcp14> produce only a UTC-based ISO-8601 compliant representation with a resolution of one second, using the literal <spanx style="verb">Z</spanx> suffix to indicate timezone.</t>

</section>
<section anchor="userid"><name>USERID</name>

<t>This is an arbitrary <spanx style="verb">UTF-8</spanx> string (<xref target="utf8"/>).
By convention, most User IDs are of the form <spanx style="verb">Display Name &lt;email.address@example.com&gt;</spanx>, but they do not need to be.</t>

</section>
<section anchor="profile"><name>PROFILE</name>

<t>Some <spanx style="verb">sop</spanx> subcommands can accept a <spanx style="verb">--profile</spanx> option, which takes as an argument the name of a profile.</t>

<t>A profile name is a UTF-8 string that has no whitespace in it.</t>

<t>Which profiles are available depends on the <spanx style="verb">sop</spanx> implementation.</t>

<t>Similar to OpenPGP Notation names, profile names are divided into two namespaces: the IETF namespace and the user namespace.
A profile name in the user namespace ends with the <spanx style="verb">@</spanx> character (0x40) followed by a DNS domain name.
A profile name in the IETF namespace does not have an <spanx style="verb">@</spanx> character.</t>

<t>A profile name in the user space is owned and controlled by the owner of the domain in the suffix.
A <spanx style="verb">sop</spanx> implementation that implements a user profile but does not own the domain in question <bcp14>SHOULD</bcp14> hew as closely as possible to the semantics described by the owner of the domain.</t>

<t>A profile name in the IETF namespace that begins with the string <spanx style="verb">rfc</spanx> should have semantics that hew as closely as possible to the referenced RFC.
Similarly, a profile name in the IETF namespace that begins with the string <spanx style="verb">draft-</spanx> should have semantics that hew as closely as possible to the referenced Internet Draft.</t>

<t>The reserved profile name <spanx style="verb">default</spanx> in the IETF namespace simply refers to the implementation's default choices.</t>

<t>Note that this profile mechanism is intended to provide a limited way for an implementation to select among a small set of options that the implementer has vetted and is satisfied with.
It is not intended to provide an arbitrary channel for complex configuration, and a <spanx style="verb">sop</spanx> implementation <bcp14>MUST NOT</bcp14> use it in that way.</t>

</section>
</section>
<section anchor="indirect-types"><name>Input/Output Indirect Types</name>

<t>Some material is passed to <spanx style="verb">sop</spanx> indirectly, typically by referring to a filename containing the data in question.
This type of data may also be passed to <spanx style="verb">sop</spanx> on Standard Input, or delivered by <spanx style="verb">sop</spanx> to Standard Output.</t>

<t>If any input data is specified explicitly to be read from a file that does not exist, <spanx style="verb">sop</spanx> will fail with <spanx style="verb">MISSING_INPUT</spanx>.</t>

<t>If any input data does not meet the requirements described below, <spanx style="verb">sop</spanx> will fail with <spanx style="verb">BAD_DATA</spanx>.</t>

<section anchor="special-designators"><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 <spanx style="verb">@</spanx>.
We describe two of those prefixes (<spanx style="verb">@ENV:</spanx> and <spanx style="verb">@FD:</spanx>) here.
A <spanx style="verb">sop</spanx> implementation that receives such a special designator but does not know how to handle a given prefix in that context <bcp14>MUST</bcp14> fail with <spanx style="verb">UNSUPPORTED_SPECIAL_PREFIX</spanx>.</t>

<t>If the filename for any indirect material used as input has the special form <spanx style="verb">@ENV:xxx</spanx>,
then contents of environment variable <spanx style="verb">$xxx</spanx> is used instead of looking in the filesystem.
<spanx style="verb">@ENV</spanx> is for input only: if the prefix <spanx style="verb">@ENV:</spanx> is used for any output argument, <spanx style="verb">sop</spanx> fails with <spanx style="verb">UNSUPPORTED_SPECIAL_PREFIX</spanx>.</t>

<t>If the filename for any indirect material used as either input or output has the special form <spanx style="verb">@FD:nnn</spanx> where <spanx style="verb">nnn</spanx> is a decimal integer,
then the associated data is read from file descriptor <spanx style="verb">nnn</spanx>.</t>

<t>See <xref target="special-designators-guidance"/> for more details about safe handling of these special designators.</t>

</section>
<section anchor="certs"><name>CERTS</name>

<t>One or more OpenPGP certificates (<xref section="11.1" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>), aka "Transferable Public Key".
May be armored (see <xref target="optional-input-armoring"/>).</t>

<t>Although some existing workflows may prefer to use one <spanx style="verb">CERTS</spanx> object with multiple certificates in it (a "keyring"), supplying exactly one certificate per <spanx style="verb">CERTS</spanx> input will make error reporting clearer and easier.</t>

</section>
<section anchor="keys"><name>KEYS</name>

<t>One or more OpenPGP Transferable Secret Keys (<xref section="11.2" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>).
May be armored (see <xref target="optional-input-armoring"/>).</t>

<t>Secret key material is often locked with a password to ensure that it cannot be simply copied and reused.
If any secret key material is locked with a password and no <spanx style="verb">--with-key-password</spanx> option is supplied, <spanx style="verb">sop</spanx> may fail with error <spanx style="verb">KEY_IS_PROTECTED</spanx>.
However, when a cleartext secret key (that is, one not locked with a password) is available, <spanx style="verb">sop</spanx> should always be able to use it, whether a <spanx style="verb">--with-key-password</spanx> option is supplied or not.</t>

<t>Although some existing workflows may prefer to use one <spanx style="verb">KEYS</spanx> object with multiple keys in it (a "secret keyring"), supplying exactly one key per <spanx style="verb">KEYS</spanx> input will make error reporting clearer and easier.</t>

</section>
<section anchor="ciphertext"><name>CIPHERTEXT</name>

<t><spanx style="verb">sop</spanx> accepts only a restricted subset of the arbitrarily-nested grammar allowed by the OpenPGP Messages definition (<xref section="11.3" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>).</t>

<t>In particular, it accepts and generates only:</t>

<t>An OpenPGP message, consisting of a sequence of PKESKs (<xref section="5.1" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>) and SKESKs (<xref section="5.3" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>),
followed by one SEIPD (<xref section="5.13" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>).</t>

<t>The SEIPD can decrypt into one of two things:</t>

<t><list style="symbols">
  <t>"Maybe Signed Data" (see below), or</t>
  <t>Compressed data packet that contains "Maybe Signed Data"</t>
</list></t>

<t>"Maybe Signed Data" is a sequence of:</t>

<t><list style="symbols">
  <t>N (zero or more) one-pass signature packets, followed by</t>
  <t>zero or more signature packets, followed by</t>
  <t>one Literal data packet, followed by</t>
  <t>N signature packets (corresponding to the outer one-pass signatures packets)</t>
</list></t>

<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"/>).</t>

</section>
<section anchor="inlinesigned"><name>INLINESIGNED</name>

<t>An inline-signed message may take any one of three different forms:</t>

<t><list style="symbols">
  <t>A binary sequence of OpenPGP packets that matches a subset of the "Signed Message" element in the grammar in <xref section="11.3" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/></t>
  <t>The same sequence of packets, but ASCII-armored (see <xref target="optional-input-armoring"/>)</t>
  <t>A message using the Cleartext Signature Framework described in <xref section="7" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/></t>
</list></t>

<t>The subset of the packet grammar expected in the first two forms consists of either:</t>

<t><list style="symbols">
  <t>a series of Signature packets followed by a Literal Data packet</t>
  <t>a series of One-Pass Signature (OPS) packets, followed by one Literal Data packet, followed by an equal number of Signature packets corresponding to the OPS packets</t>
</list></t>

<t>When the message is in the third form (Cleartext Signature Framework), it has the following properties:</t>

<t><list style="symbols">
  <t>The stream <bcp14>SHOULD</bcp14> consist solely of <spanx style="verb">UTF-8</spanx> text</t>
  <t>Every Signature packet found in the stream <bcp14>SHOULD</bcp14> have Signature Type 0x01 (canonical text document).</t>
  <t>It <bcp14>SHOULD NOT</bcp14> contain leading text (before the <spanx style="verb">-----BEGIN PGP SIGNED MESSAGE-----</spanx> cleartext header) or trailing text (after the <spanx style="verb">-----END PGP SIGNATURE-----</spanx> armor tail).</t>
</list></t>

<t>While some OpenPGP implementations <bcp14>MAY</bcp14> produce more complicated inline signed messages, a <spanx style="verb">sop</spanx> implementation <bcp14>SHOULD</bcp14> limit itself to producing these straightforward forms.</t>

</section>
<section anchor="signature"><name>SIGNATURES</name>

<t>One or more OpenPGP Signature packets.  May be armored (see <xref target="optional-input-armoring"/>).</t>

</section>
<section anchor="sessionkey"><name>SESSIONKEY</name>

<t>This documentation uses the GnuPG defacto <spanx style="verb">ASCII</spanx> representation:</t>

<t><spanx style="verb">ALGONUM:HEXKEY</spanx></t>

<t>where <spanx style="verb">ALGONUM</spanx> is the decimal value associated with the OpenPGP Symmetric Key Algorithms (<xref section="9.3" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>) and <spanx style="verb">HEXKEY</spanx> is the hexadecimal
representation of the binary key.</t>

<t>Example AES-256 session key:</t>

<figure><artwork><![CDATA[
9:FCA4BEAF687F48059CACC14FB019125CD57392BAB7037C707835925CBF9F7BCD
]]></artwork></figure>

<t>A <spanx style="verb">sop</spanx> implementation <bcp14>SHOULD</bcp14> produce session key data in this format.
When consuming such a session key, <spanx style="verb">sop</spanx> <bcp14>SHOULD</bcp14> be willing to accept either upper or lower case hexadecimal digits, and to gracefully ignore any trailing whitespace.</t>

</section>
<section anchor="micalg"><name>MICALG</name>

<t>This output-only type indicates the cryptographic digest used when making a signature.
It is useful specifically when generating signed PGP/MIME objects, which want a <spanx style="verb">micalg=</spanx> parameter for the <spanx style="verb">multipart/signed</spanx> content type as described in <xref section="5" sectionFormat="of" target="RFC3156"/>.</t>

<t>It will typically be a string like <spanx style="verb">pgp-sha512</spanx>, but in some situations (multiple signatures using different digests) it will be the empty string.
If the user of <spanx style="verb">sop</spanx> is assembling a PGP/MIME signed object, and the <spanx style="verb">MICALG</spanx> output is the empty string,
the user should omit the <spanx style="verb">micalg=</spanx> parameter entirely.</t>

</section>
<section anchor="password"><name>PASSWORD</name>

<t>This input-only is expected to be a <spanx style="verb">UTF-8</spanx> string (<xref target="utf8"/>), but for <spanx style="verb">sop decrypt</spanx>, any bytestring that the user supplies will be accepted.
Note the details in <spanx style="verb">sop encrypt</spanx> and <spanx style="verb">sop decrypt</spanx> about trailing whitespace!</t>

<t>See also <xref target="human-readable-passwords"/> for more discussion.</t>

</section>
<section anchor="verifications"><name>VERIFICATIONS</name>

<t>This output-only type consists of 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>

<t><list style="symbols">
  <t>ISO-8601 UTC datestamp of the signature, to one second precision, using the <spanx style="verb">Z</spanx> suffix</t>
  <t>Fingerprint of the signing key (may be a subkey)</t>
  <t>Fingerprint of primary key of signing certificate (if signed by primary key, same as the previous field)</t>
  <t>(optional) a string describing the mode of the signature, either <spanx style="verb">mode:text</spanx> or <spanx style="verb">mode:binary</spanx></t>
  <t>message describing the verification (free form)</t>
</list></t>

<t>Note that while <xref target="date"/> permits a <spanx style="verb">sop</spanx> implementation to accept other unambiguous date representations,
its date output here <bcp14>MUST</bcp14> be a strict ISO-8601 UTC date timestamp.
In particular:</t>

<t><list style="symbols">
  <t>the date and time fields <bcp14>MUST</bcp14> be separated by <spanx style="verb">T</spanx>, not by whitespace, since whitespace is used as a delimiter</t>
  <t>the time <bcp14>MUST</bcp14> be emitted in UTC, with the explicit suffix <spanx style="verb">Z</spanx></t>
  <t>the time <bcp14>MUST</bcp14> be emitted with one-second precision</t>
</list></t>

<t>Example:</t>

<figure><artwork><![CDATA[
2019-10-24T23:48:29Z C90E6D36200A1B922A1509E77618196529AE5FF8 C4BC2DDB38CCE96485EBE9C2F20691179038E5C6 mode:binary certificate from dkg.asc
]]></artwork></figure>

</section>
<section anchor="data"><name>DATA</name>

<t>Cleartext, arbitrary data.  This is either a bytestream or <spanx style="verb">UTF-8</spanx> text.</t>

<t>It <bcp14>MUST</bcp14> only be <spanx style="verb">UTF-8</spanx> text in the case of input supplied to <spanx style="verb">sop sign --as=text</spanx> or <spanx style="verb">sop encrypt --as=text</spanx>.
If <spanx style="verb">sop</spanx> receives <spanx style="verb">DATA</spanx> containing non-<spanx style="verb">UTF-8</spanx> octets in this case, it will fail (see <xref target="utf8"/>) with <spanx style="verb">EXPECTED_TEXT</spanx>.</t>

</section>
<section anchor="profilelist"><name>PROFILELIST</name>

<t>This output-only type consists of simple UTF-8 textual output, with one line per profile.
Each line consists of the profile name optionally followed by a colon (0x31), a space (0x20), and a brief human-readable description of the intended semantics of the profile.
Each line may be at most 1000 bytes, and no more than 4 profiles may be listed.</t>

<t>These limits are intended to force <spanx style="verb">sop</spanx> implementers to make hard decisions and to keep things simple.</t>

<t>The first profile <bcp14>MAY</bcp14> be explicitly named <spanx style="verb">default</spanx>.
If it is not named <spanx style="verb">default</spanx>, then <spanx style="verb">default</spanx> is an alias for the first profile listed.
No profile after the first listed may be named <spanx style="verb">default</spanx>.</t>

<t>See <xref target="profile"/> for more discussion about the namespace and intended semantics of each profile.</t>

</section>
</section>
<section anchor="failure-modes"><name>Failure Modes</name>

<t><spanx style="verb">sop</spanx> return codes have both mnemonics and numeric values.</t>

<t>When <spanx style="verb">sop</spanx> succeeds, it will return 0 (<spanx style="verb">OK</spanx>) and emit nothing to Standard Error.
When <spanx style="verb">sop</spanx> fails, it fails with a non-zero return code, and emits one or more warning messages on Standard Error.
Known return codes include:</t>

<texttable title="Error return codes">
      <ttcol align='right'>Value</ttcol>
      <ttcol align='left'>Mnemonic</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c>0</c>
      <c><spanx style="verb">OK</spanx></c>
      <c>Success</c>
      <c>3</c>
      <c><spanx style="verb">NO_SIGNATURE</spanx></c>
      <c>No acceptable signatures found (<spanx style="verb">sop verify</spanx>)</c>
      <c>13</c>
      <c><spanx style="verb">UNSUPPORTED_ASYMMETRIC_ALGO</spanx></c>
      <c>Asymmetric algorithm unsupported (<spanx style="verb">sop encrypt</spanx>)</c>
      <c>17</c>
      <c><spanx style="verb">CERT_CANNOT_ENCRYPT</spanx></c>
      <c>Certificate not encryption-capable (e.g., expired, revoked, unacceptable usage flags) (<spanx style="verb">sop encrypt</spanx>)</c>
      <c>19</c>
      <c><spanx style="verb">MISSING_ARG</spanx></c>
      <c>Missing required argument</c>
      <c>23</c>
      <c><spanx style="verb">INCOMPLETE_VERIFICATION</spanx></c>
      <c>Incomplete verification instructions (<spanx style="verb">sop decrypt</spanx>)</c>
      <c>29</c>
      <c><spanx style="verb">CANNOT_DECRYPT</spanx></c>
      <c>Unable to decrypt (<spanx style="verb">sop decrypt</spanx>)</c>
      <c>31</c>
      <c><spanx style="verb">PASSWORD_NOT_HUMAN_READABLE</spanx></c>
      <c>Non-<spanx style="verb">UTF-8</spanx> or otherwise unreliable password (<spanx style="verb">sop encrypt</spanx>, <spanx style="verb">sop generate-key</spanx>)</c>
      <c>37</c>
      <c><spanx style="verb">UNSUPPORTED_OPTION</spanx></c>
      <c>Unsupported option</c>
      <c>41</c>
      <c><spanx style="verb">BAD_DATA</spanx></c>
      <c>Invalid data type (no secret key where <spanx style="verb">KEYS</spanx> expected, etc)</c>
      <c>53</c>
      <c><spanx style="verb">EXPECTED_TEXT</spanx></c>
      <c>Non-text input where text expected</c>
      <c>59</c>
      <c><spanx style="verb">OUTPUT_EXISTS</spanx></c>
      <c>Output file already exists</c>
      <c>61</c>
      <c><spanx style="verb">MISSING_INPUT</spanx></c>
      <c>Input file does not exist</c>
      <c>67</c>
      <c><spanx style="verb">KEY_IS_PROTECTED</spanx></c>
      <c>A <spanx style="verb">KEYS</spanx> input is password-protected (locked), and <spanx style="verb">sop</spanx> cannot unlock it with any of the <spanx style="verb">--with-key-password</spanx> options</c>
      <c>69</c>
      <c><spanx style="verb">UNSUPPORTED_SUBCOMMAND</spanx></c>
      <c>Unsupported subcommand</c>
      <c>71</c>
      <c><spanx style="verb">UNSUPPORTED_SPECIAL_PREFIX</spanx></c>
      <c>An indirect parameter is a special designator (it starts with <spanx style="verb">@</spanx>) but <spanx style="verb">sop</spanx> does not know how to handle the prefix</c>
      <c>73</c>
      <c><spanx style="verb">AMBIGUOUS_INPUT</spanx></c>
      <c>A indirect input parameter is a special designator (it starts with <spanx style="verb">@</spanx>), and a filename matching the designator is actually present</c>
      <c>79</c>
      <c><spanx style="verb">KEY_CANNOT_SIGN</spanx></c>
      <c>Key not signature-capable (e.g., expired, revoked, unacceptable usage flags) (<spanx style="verb">sop sign</spanx> and <spanx style="verb">sop encrypt</spanx> with <spanx style="verb">--sign-with</spanx>)</c>
      <c>83</c>
      <c><spanx style="verb">INCOMPATIBLE_OPTIONS</spanx></c>
      <c>Options were supplied that are incompatible with each other</c>
      <c>89</c>
      <c><spanx style="verb">UNSUPPORTED_PROFILE</spanx></c>
      <c>The requested profile is unsupported (<spanx style="verb">sop generate-key</spanx>), or the indicated subcommand does not accept profiles (<spanx style="verb">sop list-profiles</spanx>)</c>
</texttable>

<t>If a <spanx style="verb">sop</spanx> implementation fails in some way not contemplated by this document, it <bcp14>MAY</bcp14> return any non-zero error code, not only those listed above.</t>

</section>
<section anchor="known-implementations"><name>Known Implementations</name>

<t>The following implementations are known at the time of this draft:</t>

<texttable title="Known implementations">
      <ttcol align='left'>Project name</ttcol>
      <ttcol align='left'>URL</ttcol>
      <ttcol align='left'>cli name</ttcol>
      <ttcol align='left'>notes</ttcol>
      <c>Sequoia SOP</c>
      <c>https://gitlab.com/sequoia-pgp/sequoia-sop</c>
      <c><spanx style="verb">sqop</spanx></c>
      <c>Implemented in Rust using the <spanx style="verb">sequoia-openpgp</spanx> crate</c>
      <c>gosop</c>
      <c>https://github.com/ProtonMail/gosop</c>
      <c><spanx style="verb">gosop</spanx></c>
      <c>Implemented in golang (Go) using GOpenPGP</c>
      <c>PGPainless SOP</c>
      <c>https://codeberg.org/PGPainless/pgpainless/src/branch/master/pgpainless-sop</c>
      <c><spanx style="verb">pgpainless-cli</spanx></c>
      <c>Implemented in Java using PGPainless</c>
      <c>sopgpy</c>
      <c>https://gitlab.com/sequoia-pgp/openpgp-interoperability-test-suite/-/blob/main/glue/sopgpy</c>
      <c><spanx style="verb">sopgpy</spanx></c>
      <c>Implemented in Python using PGPy</c>
      <c>sop-openpgp.js</c>
      <c>https://github.com/openpgpjs/sop-openpgpjs</c>
      <c><spanx style="verb">sop-openpgp</spanx></c>
      <c>Implemented in JavaScript using OpenPGP.js</c>
      <c>gpgme-sop</c>
      <c>https://gitlab.com/sequoia-pgp/gpgme-sop</c>
      <c><spanx style="verb">gpgme-sop</spanx></c>
      <c>A Rust wrapper around the gpgme C library</c>
      <c>RNP-sop</c>
      <c>https://gitlab.com/sequoia-pgp/rnp-sop</c>
      <c><spanx style="verb">rnp-sop</spanx></c>
      <c>A Rust wrapper around the librnp C library</c>
      <c>dkg-sop</c>
      <c>https://git.savannah.nongnu.org/cgit/dkgpg.git/tree/tools/dkg-sop.cc</c>
      <c><spanx style="verb">dkg-sop</spanx></c>
      <c>Implemented in C++ using the LibTMCG library</c>
</texttable>

</section>
<section anchor="alternate-interfaces"><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>

<t><list style="symbols">
  <t>Rust: <xref target="RUST-SOP"/></t>
  <t>Java: <xref target="SOP-JAVA"/></t>
  <t>Python: <xref target="PYTHON-SOP"/></t>
</list></t>

<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 implementation 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"><name>Guidance for Implementers</name>

<t><spanx style="verb">sop</spanx> uses a few assumptions that implementers might want to consider.</t>

<section anchor="one-openpgp-message-at-a-time"><name>One OpenPGP Message at a Time</name>

<t><spanx style="verb">sop</spanx> 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"><name>Simplified Subset of OpenPGP Message</name>

<t>While the formal grammar for OpenPGP Message is arbitrarily nestable, <spanx style="verb">sop</spanx> constrains itself to what it sees as a single "layer" (see <xref target="ciphertext"/>).</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.
<spanx style="verb">sop</spanx> 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 <spanx style="verb">sop decrypt</spanx> <bcp14>MAY</bcp14> 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"><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, <spanx style="verb">sop</spanx> expects that the caller can identify those relevant signers ahead of time.</t>

</section>
<section anchor="optional-input-armoring"><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 <spanx style="verb">sop</spanx> 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:
<xref section="4.2" sectionFormat="of" target="RFC4880"/> 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, <spanx style="verb">sop</spanx> <bcp14>MAY</bcp14> reject an input based on any of the following variations (see <xref section="6.2" sectionFormat="of" target="RFC4880"/> for precise definitions):</t>

<t><list style="symbols">
  <t>An unknown Armor Header Line</t>
  <t>Any text before the Armor Header Line</t>
  <t>Malformed lines in the Armor Headers section</t>
  <t>Any non-whitespace data after the Armor Tail</t>
  <t>Any Radix-64 encoded line with more than 76 characters</t>
  <t>Invalid characters in the Radix-64-encoded data</t>
  <t>An invalid Armor Checksum</t>
  <t>A mismatch between the Armor Header Line and the Armor Tail</t>
</list></t>

<t>For robustness, <spanx style="verb">sop</spanx> <bcp14>SHOULD</bcp14> 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, <spanx style="verb">sop</spanx> <bcp14>SHOULD</bcp14> reject any material that doesn't produce a valid stream of OpenPGP packets.
For example, <spanx style="verb">sop</spanx> <bcp14>SHOULD</bcp14> 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.,  <spanx style="verb">SIGNATURES</spanx>, <spanx style="verb">CERTS</spanx>, <spanx style="verb">KEYS</spanx>, <spanx style="verb">INLINESIGNED</spanx>, or <spanx style="verb">CIPHERTEXT</spanx>), <spanx style="verb">sop</spanx> <bcp14>SHOULD</bcp14> also reject any input that does not conform to the expected packet stream.
See <xref target="indirect-types"/> for the expected packet stream for different types.</t>

</section>
<section anchor="csf-risks"><name>Complexities of the Cleartext Signature Framework</name>

<t><spanx style="verb">sop</spanx> prefers a detached signature as the baseline form of OpenPGP signature, but provides affordances for dealing with inline-signed messages (see <spanx style="verb">INLINESIGNED</spanx>, <xref target="inlinesigned"/>) as well.</t>

<t>The most complex form of inline-signed messages is the Cleartext Signature Framework (CSF).
Handling the CSF structure requires parsing to delimit the multiple parts of the document, including at least:</t>

<t><list style="symbols">
  <t>any preamble before the message</t>
  <t>the inline message header (delimiter line, OpenPGP headers)</t>
  <t>the message itself</t>
  <t>the divider between the message and the signature (including any OpenPGP headers there)</t>
  <t>the signature</t>
  <t>the divider that terminates the signature</t>
  <t>any suffix after the signature</t>
</list></t>

<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"></xref>.</t>

<t>A user of <spanx style="verb">sop</spanx> that receives an inline-signed message (whether the message uses the CSF or not) can detach the signature from the message with <spanx style="verb">sop inline-detach</spanx> (see <xref target="inline-detach"/>).</t>

<t>Alternately, the user can send the message through <spanx style="verb">sop inline-verify</spanx> to confirm required signatures, and then (if signatures are valid) supply its output to the consumer of the signed message.</t>

</section>
<section anchor="cert-validity-performance"><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 <spanx style="verb">sop</spanx>.</t>

</section>
<section anchor="utf8"><name>Text is always UTF-8</name>

<t>Various places in this specification require UTF-8 <xref target="RFC3629"/> when encoding text. <spanx style="verb">sop</spanx> implementations <bcp14>SHOULD NOT</bcp14> consider textual data in any other character encoding.</t>

<t>OpenPGP Implementations <bcp14>MUST</bcp14> already handle UTF-8, because various parts of <xref target="RFC4880"/> require it, including:</t>

<t><list style="symbols">
  <t>User ID</t>
  <t>Notation name</t>
  <t>Reason for revocation</t>
  <t>ASCII-armor Comment: header</t>
</list></t>

<t>Dealing with messages in other charsets leads to weird security failures like <xref target="Charset-Switching"/>, especially when the charset indication is not covered by any sort of cryptographic integrity check.
Restricting textual data to <spanx style="verb">UTF-8</spanx> universally across the OpenPGP ecosystem eliminates any such risk without losing functionality, since <spanx style="verb">UTF-8</spanx> can encode all known characters.</t>

</section>
<section anchor="human-readable-passwords"><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 it is important to ensure that there is a reliable bidirectional mapping between strings and bytes.
The maximally robust behavior here is for <spanx style="verb">sop encrypt</spanx> and <spanx style="verb">sop generate-key</spanx> (that is, commands that use a password to encrypt) to constrain the choice of passwords to strings that have such a mapping,
and for <spanx style="verb">sop decrypt</spanx> and <spanx style="verb">sop sign</spanx> (and <spanx style="verb">sop inline-sign</spanx>, as well as<spanx style="verb">sop encrypt</spanx> when decrypting a signing key; that is, commands that use a password to decrypt) to try multiple plausible versions of any password supplied by <spanx style="verb">PASSWORD</spanx>.</t>

<section anchor="generating-human-readable"><name>Generating Material with Human-Readable Passwords</name>

<t>When generating material based on a password, <spanx style="verb">sop encrypt</spanx> and <spanx style="verb">sop generate-key</spanx> enforce that the password is actually meaningfully human-transferable.
In particular, an implementation generating material based on a new paasword <bcp14>SHOULD</bcp14> apply the following considerations to the supplied password:</t>

<t><list style="symbols">
  <t>require <spanx style="verb">UTF-8</spanx></t>
  <t>trim trailing whitespace</t>
</list></t>

<t>Some <spanx style="verb">sop encrypt</spanx> and <spanx style="verb">sop generate-key</spanx> 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 <spanx style="verb">sop encrypt</spanx> or <spanx style="verb">sop generate-key</spanx> <bcp14>MAY</bcp14> also:</t>

<t><list style="symbols">
  <t>forbid leading whitespace</t>
  <t>forbid non-printing characters other than <spanx style="verb">SPACE (U+0020)</spanx>, such as <spanx style="verb">ZERO WIDTH NON-JOINER (U+200C)</spanx> or <spanx style="verb">TAB (U+0009)</spanx></t>
  <t>require the password to be in Unicode Normal Form C (<xref target="UNICODE-NORMALIZATION"/>)</t>
</list></t>

<t>Violations of these more-strict policies <bcp14>SHOULD</bcp14> result in an error of <spanx style="verb">PASSWORD_NOT_HUMAN_READABLE</spanx>.</t>

<t>A <spanx style="verb">sop encrypt</spanx> or <spanx style="verb">sop generate-key</spanx> implementation typically <bcp14>SHOULD NOT</bcp14> attempt enforce a minimum "password strength",
but in the event that some implementation does, it <bcp14>MUST NOT</bcp14> represent a weak password with <spanx style="verb">PASSWORD_NOT_HUMAN_READABLE</spanx>.</t>

</section>
<section anchor="consuming-passwords"><name>Consuming Password-protected Material</name>

<t>When <spanx style="verb">sop decrypt</spanx> receives a <spanx style="verb">PASSWORD</spanx> input, either from a <spanx style="verb">--with-key-password</spanx> or <spanx style="verb">--with-password</spanx> option, it sees its content as a bytestring.
<spanx style="verb">sop sign</spanx> also sees the content of any <spanx style="verb">PASSWORD</spanx> input supplied to its <spanx style="verb">--with-key-password</spanx>  option as a bytestring.
If the bytestring fails to work as a password, but ends in <spanx style="verb">UTF-8</spanx> 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 <spanx style="verb">sop decrypt</spanx> or <spanx style="verb">sop sign</spanx> implementation that finds neither of the above two attempts work for a given <spanx style="verb">PASSWORD</spanx> <bcp14>MAY</bcp14> try additional variations if they produce a different bytestring, such as:</t>

<t><list style="symbols">
  <t>trimming any leading whitespace, if discovered</t>
  <t>trimming any internal non-printable characters other than <spanx style="verb">SPACE (U+0020)</spanx></t>
  <t>converting the supplied <spanx style="verb">PASSWORD</spanx> into Unicode Normal Form C (<xref target="UNICODE-NORMALIZATION"/>)</t>
</list></t>

<t>A <spanx style="verb">sop decrypt</spanx> or <spanx style="verb">sop sign</spanx> implementation that stages multiple decryption attempts like this <bcp14>SHOULD</bcp14> consider the computational resources consumed by each attempt, to avoid presenting an attack surface for resource exhaustion in the face of a non-standard <spanx style="verb">PASSWORD</spanx> input.</t>

</section>
</section>
<section anchor="special-designators-guidance"><name>Be Careful with Special Designators</name>

<t>As documented in <xref target="special-designators"/>, special designators for indirect inputs like <spanx style="verb">@ENV:</spanx> and <spanx style="verb">@FD:</spanx> (and indirect outputs using <spanx style="verb">@FD:</spanx>) 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 <spanx style="verb">sop</spanx> receives an indirect output parameter that starts with an <u>@</u> it <bcp14>MUST NOT</bcp14> write to the filesystem for that parameter.
A <spanx style="verb">sop</spanx> implementation that receives such a parameter as input <bcp14>MAY</bcp14> test for the presence of such a file in the filesystem and fail with <spanx style="verb">AMBIGUOUS_INPUT</spanx> 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, <spanx style="verb">sop</spanx> should be careful with such an input, and minimize its leakage to other processes.
In particular, <spanx style="verb">sop</spanx> <bcp14>SHOULD NOT</bcp14> leak any environment variable identified by <spanx style="verb">@ENV:</spanx> or file descriptor identified by <spanx style="verb">@FD:</spanx> to any subprocess unless the subprocess specifically needs access to that data.</t>

</section>
</section>
<section anchor="guidance-for-consumers"><name>Guidance for Consumers</name>

<t>While <spanx style="verb">sop</spanx> 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 <spanx style="verb">sop decrypt</spanx> twice, once without <spanx style="verb">--verify-*</spanx> and again with the expected identity material?</t>

<section anchor="choosing-between-astext-and-asbinary"><name>Choosing Between --as=text and --as=binary</name>

<t>A program that invokes <spanx style="verb">sop</spanx> to generate an OpenPGP signature typically needs to decide whether it is making a text or binary signature.</t>

<t>By default, <spanx style="verb">sop</spanx> will make a binary signature.
The caller of <spanx style="verb">sop sign</spanx> should choose <spanx style="verb">--as=text</spanx> only when it knows that:
 - the data being signed is in fact textual, and encoded in <spanx style="verb">UTF-8</spanx>, 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"/>) and SMTP (<xref target="RFC5321"/>).</t>

</section>
<section anchor="special-designators-and-unusual-filenames"><name>Special Designators and Unusual Filenames</name>

<t>In some cases, a user of <spanx style="verb">sop</spanx> 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 <spanx style="verb">--</spanx>, it might be confused by <spanx style="verb">sop</spanx> for an option.
If one of the files has a name that starts with <spanx style="verb">@</spanx>, it might be confused by <spanx style="verb">sop</spanx> as a special designator (<xref target="special-designators"/>).</t>

<t>If the user wants to deliberately refer to such an ambiguously-named file in the filesystem, they should prefix the filename with  <spanx style="verb">./</spanx> or use an absolute path.</t>

<t>Any specific <spanx style="verb">@FD:</spanx> special designator <bcp14>SHOULD NOT</bcp14> be supplied more than once to an invocation of <spanx style="verb">sop</spanx>.
If a <spanx style="verb">sop</spanx> invocation sees multiple copies of a specific <spanx style="verb">@FD:n</spanx> input (e.g., <spanx style="verb">sop sign @FD:3 @FD:3</spanx>),
it <bcp14>MAY</bcp14> fail with <spanx style="verb">MISSING_INPUT</spanx> even if file descriptor 3 contains a valid <spanx style="verb">KEYS</spanx>, because the bytestream for the <spanx style="verb">KEYS</spanx> was consumed by the first argument.
Doubling up on the same <spanx style="verb">@FD:</spanx> for output (e.g., <spanx style="verb">sop decrypt --session-key-out=@FD:3 --verifications-out=@FD:3</spanx>) also results in an ambiguous data stream.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>The OpenPGP object security model is typically used for confidentiality and authenticity purposes.</t>

<section anchor="signature-verification"><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 <spanx style="verb">sop</spanx> checks a signature (e.g. via <spanx style="verb">sop verify</spanx> or <spanx style="verb">sop decrypt --verify-with</spanx>), it <bcp14>MUST NOT</bcp14> consider it to be verified unless all of these conditions are met:</t>

<t><list style="symbols">
  <t>The signature must be made by a signing-capable public key that is present in one of the supplied certificates</t>
  <t>The certificate and signing subkey must have been created before or at the signature time</t>
  <t>The certificate and signing subkey must not have been expired at the signature time</t>
  <t>The certificate and signing subkey must not be revoked with a "hard" revocation</t>
  <t>If the certificate or signing subkey is revoked with a "soft" revocation, then the signature time must predate the revocation</t>
  <t>The signing subkey must be properly bound to the primary key, and cross-signed</t>
  <t>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 <spanx style="verb">MD5</spanx> or a 1024-bit <spanx style="verb">RSA</spanx> key)</t>
</list></t>

<t>Implementers <bcp14>MAY</bcp14> 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"/>), and this documentation cannot list all possible details.</t>

</section>
<section anchor="compression"><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"><name>Privacy Considerations</name>

<t>Material produced by <spanx style="verb">sop encrypt</spanx> may be placed on an untrusted machine (e.g., sent through the public <spanx style="verb">SMTP</spanx> network).
That material may contain metadata that leaks associational information (e.g., recipient identifiers in PKESK packets (<xref section="5.1" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh-07"/>)).
FIXME: document things like PURBs and <spanx style="verb">--hidden-recipient</spanx>)</t>

<section anchor="object-security-vs-transport-security"><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>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='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='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'>
<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-crypto-refresh-07'>
   <front>
      <title>OpenPGP Message Format</title>
      <author fullname='Paul Wouters' initials='P.' surname='Wouters'>
         <organization>Aiven</organization>
      </author>
      <author fullname='Daniel Huigens' initials='D.' surname='Huigens'>
         <organization>Proton AG</organization>
      </author>
      <author fullname='Justus Winter' initials='J.' surname='Winter'>
         <organization>Sequoia-PGP</organization>
      </author>
      <author fullname='Niibe Yutaka' initials='N.' surname='Yutaka'>
         <organization>FSIJ</organization>
      </author>
      <date day='23' month='October' year='2022'/>
      <abstract>
	 <t>   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.

   This document obsoletes: RFC 4880 (OpenPGP), RFC 5581 (Camellia in
   OpenPGP) and RFC 6637 (Elliptic Curves in OpenPGP).

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-ietf-openpgp-crypto-refresh-07'/>
   
</reference>



<reference anchor='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'>
<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>




    </references>

    <references title='Informative References'>

<reference anchor="OpenPGP-Interoperability-Test-Suite" target="https://tests.sequoia-pgp.org/">
  <front>
    <title>OpenPGP Interoperability Test Suite</title>
    <author >
      <organization></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></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></organization>
    </author>
    <date year="n.d."/>
  </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></organization>
    </author>
    <author initials="C." surname="Dresen" fullname="Christian Dresen">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </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></organization>
    </author>
    <date year="n.d."/>
  </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 year="n.d."/>
  </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></organization>
    </author>
    <date year="2013" month="June" day="18"/>
  </front>
</reference>
<reference anchor="SOP-JAVA" target="https://github.com/pgpainless/sop-java">
  <front>
    <title>Stateless OpenPGP Protocol for Java.</title>
    <author initials="P." surname="Schaub" fullname="Paul Schaub">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </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='I-D.draft-bre-openpgp-samples-01'>
   <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='RFC0959'>
<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='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 &quot;mail submission&quot; protocol for &quot;split-UA&quot; (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>


<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This work was inspired by Justus Winter's <xref target="OpenPGP-Interoperability-Test-Suite"/>.</t>

<t>The following people contributed helpful feedback and considerations to this draft, but are not responsible for its problems:</t>

<t><list style="symbols">
  <t>Allan Nordhøy</t>
  <t>Antoine Beaupré</t>
  <t>Edwin Taylor</t>
  <t>Heiko Schaefer</t>
  <t>Jameson Rollins</t>
  <t>Justus Winter</t>
  <t>Paul Schaub</t>
  <t>Vincent Breitmoser</t>
</list></t>

</section>
<section anchor="future-work"><name>Future Work</name>

<t><list style="symbols">
  <t>certificate transformation into popular publication forms:
  <list style="symbols">
      <t>WKD</t>
      <t>DANE OPENPGPKEY</t>
      <t>Autocrypt</t>
    </list></t>
  <t><spanx style="verb">sop encrypt</spanx> -- specify compression? (see <xref target="compression"/>)</t>
  <t><spanx style="verb">sop encrypt</spanx> -- specify padding policy/mechanism?</t>
  <t><spanx style="verb">sop decrypt</spanx> -- how can it more safely handle zip bombs?</t>
  <t><spanx style="verb">sop decrypt</spanx> -- what should it do when encountering weakly-encrypted (or unencrypted) input?</t>
  <t><spanx style="verb">sop encrypt</spanx> -- minimize metadata (e.g. <spanx style="verb">--throw-keyids</spanx>)?</t>
  <t>specify an error if a <spanx style="verb">DATE</spanx> arrives as input without a time zone?</t>
  <t>add considerations about what it means for armored <spanx style="verb">CERTS</spanx> to contain multiple certificates -- multiple armorings?  one big blob?</t>
  <t>do we need an interface or option (for performance?) with the semantics that <spanx style="verb">sop</spanx> doesn't validate certificates internally, it just accepts whatever's given as legit data? (see <xref target="cert-validity-performance"/>)</t>
  <t>do we need to be able to convert a message with a text-based signature to a CSF <spanx style="verb">INLINESIGNED</spanx> message? I'd rather not, given the additional complications.</t>
</list></t>

</section>
<section anchor="document-history"><name>Document History</name>

<section anchor="substantive-changes-beteween-04-and-05"><name>Substantive Changes beteween -04 and -05:</name>

<t><list style="symbols">
  <t><spanx style="verb">decrypt</spanx>: change <spanx style="verb">--verify-out</spanx> to <spanx style="verb">--verifications-out</spanx></t>
  <t><spanx style="verb">encrypt</spanx>: add missing <spanx style="verb">--with-key-password</spanx></t>
  <t>add the concept of "profiles", use with <spanx style="verb">generate-key</spanx></t>
  <t>include table of known implementations</t>
  <t><spanx style="verb">VERIFICATIONS</spanx> can now indicate the type of the signature (<spanx style="verb">mode:text</spanx> or <spanx style="verb">mode:binary</spanx>)</t>
</list></t>

</section>
<section anchor="substantive-changes-between-03-and-04"><name>Substantive Changes between -03 and -04:</name>

<t><list style="symbols">
  <t>Reinforce that PASSWORD and SESSIONKEY are indirect data types</t>
  <t><spanx style="verb">encrypt</spanx>: remove <spanx style="verb">--as=mime</spanx> option</t>
  <t>Handle password-locked secret key material: add <spanx style="verb">--with-key-password</spanx> options to <spanx style="verb">generate-key</spanx>, <spanx style="verb">sign</spanx>, and <spanx style="verb">decrypt</spanx>.</t>
  <t>Introduce <spanx style="verb">INLINESIGNED</spanx> message type (<xref target="inlinesigned"/>)</t>
  <t>Rename <spanx style="verb">detach-inband-signature-and-message</spanx> to <spanx style="verb">inline-detach</spanx>, clarify its possible inputs</t>
  <t>Add <spanx style="verb">inline-verify</spanx></t>
  <t>Add <spanx style="verb">inline-sign</spanx></t>
</list></t>

</section>
<section anchor="substantive-changes-between-02-and-03"><name>Substantive Changes between -02 and -03:</name>

<t><list style="symbols">
  <t>Added <spanx style="verb">--micalg-out</spanx> parameter to <spanx style="verb">sign</spanx></t>
  <t>Change from <spanx style="verb">KEY</spanx> to <spanx style="verb">KEYS</spanx> (permit multiple secret keys in each blob)</t>
  <t>New error code: <spanx style="verb">KEY_CANNOT_SIGN</spanx></t>
  <t><spanx style="verb">version</spanx> now has <spanx style="verb">--backend</spanx> and <spanx style="verb">--extended</spanx> options</t>
</list></t>

</section>
<section anchor="substantive-changes-between-01-and-02"><name>Substantive Changes between -01 and -02:</name>

<t><list style="symbols">
  <t>Added mnemonics for return codes</t>
  <t><spanx style="verb">decrypt</spanx> should fail when asked to output to a pre-existing file</t>
  <t>Removed superfluous <spanx style="verb">--armor</spanx> option</t>
  <t>Much more specific about what <spanx style="verb">armor --label=auto</spanx> should do</t>
  <t><spanx style="verb">armor</spanx> and <spanx style="verb">dearmor</spanx> are now fully idempotent, but work only well-formed OpenPGP streams</t>
  <t>Dropped <spanx style="verb">armor --allow-nested</spanx></t>
  <t>Specified what <spanx style="verb">encrypt --as=</spanx> means</t>
  <t>New error code: <spanx style="verb">KEY_IS_PROTECTED</spanx></t>
  <t>Documented expectations around human-readable, human-transferable passwords</t>
  <t>New subcommand: <spanx style="verb">detach-inband-signature-and-message</spanx></t>
  <t>More specific guidance about special designators like <spanx style="verb">@FD:</spanx> and <spanx style="verb">@ENV:</spanx>, including new error codes <spanx style="verb">UNSUPPORTED_SPECIAL_PREFIX</spanx> and <spanx style="verb">AMBIGUOUS_INPUT</spanx></t>
</list></t>

</section>
<section anchor="substantive-changes-between-00-and-01"><name>Substantive Changes between -00 and -01:</name>

<t><list style="symbols">
  <t>Changed <spanx style="verb">generate</spanx> subcommand to <spanx style="verb">generate-key</spanx></t>
  <t>Changed <spanx style="verb">convert</spanx> subcommand to <spanx style="verb">extract-cert</spanx></t>
  <t>Added "Input String Types" section as distinct from indirect I/O</t>
  <t>Made implicit arguments potentially explicit (e.g. <spanx style="verb">sop armor --label=auto</spanx>)</t>
  <t>Added <spanx style="verb">--allow-nested</spanx> to <spanx style="verb">sop armor</spanx> to make it idempotent by default</t>
  <t>Added fingerprint of signing (sub)key to <spanx style="verb">VERIFICATIONS</spanx> output</t>
  <t>Dropped <spanx style="verb">--mode</spanx> and <spanx style="verb">--session-key</spanx> arguments for <spanx style="verb">sop encrypt</spanx> (no plausible use, not needed for interop)</t>
  <t>Added <spanx style="verb">--with-session-key</spanx> argument to <spanx style="verb">sop decrypt</spanx> to allow for session-key-based decryption</t>
  <t>Added examples to each subcommand</t>
  <t>More detailed error codes for <spanx style="verb">sop encrypt</spanx></t>
  <t>Move from <spanx style="verb">CERT</spanx> to <spanx style="verb">CERTS</spanx> (each <spanx style="verb">CERTS</spanx> argument might contain multiple certificates)</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
IGu6A/G2kz6aOaYKLWirphMvXElm/DbF+Edv+ZKiC6zh0xHwlTKJvtroiYvL
vrbxa+s7MhX8EryXXcJ/RiFO2Wq320e/oFGI/uvp/2nBfv3Cicm/BAOWUVvB
c3zmJ8z+EpxnzcXFxey26Sbtb7X2aIx1DdDg925DPzWv4dqmpwDAqC9x1Kbm
Y/D8xOFw6xulmf5opmMaCD92bQsSwKhL2lYdhNcIgpuejMcQFwVXV5E8H41c
ae3TPqwq/A6/9VMO+ysrMh4G2qDsz/qqp/ZstfYJiEp1cXh0Uy1OXvvy+R5+
ua4DJx21wyNzp+nnIgWdMvbTjfwNkrwg9UlS0XWY9WUVGzjbjWG2582MqnVA
QJrINtolzse0SVebmPVl/epiZWOHsWqxcNLleKt1SGfgc21ZpQgi5F+mEeiB
ft86pH3266LAEwmobOgw0Xqx56IHR/8R/OYDP36w9YK2phZOgLfD93835vWZ
NkPbRjseagCFJMvFpdPh5gltdlovXlcPa3BzDPgLWHJaPTCbf9B6uVf7zA/L
wiU54YXWVsEe0HqY3WbsRxoOvwGyjlYHyU1aE4FnY8xaL+n0u++P+29uLm4G
9ky6FhYtyPhbIFI5ycSakf/ORLzajykPUIt8SOnul6/19N1EOXiGpl5cm609
8LtpGOfbGSOK08+ac1vxd25/sdV65ZCtSn4q4r+ER1N7ECuxU/nFXCojzYGM
ISAcNINSApGR1qsadonojANfSxAsB1molIOqXI0p+BTGJI+pZdRFTYspovAa
eZKHQqlJs2WK4RbH6jYrzVO1TJFFEePLKVkSzZnwoiqppetHIJkCpUXh5ngP
jVTBoSwsVFByBKkHFMcqshyIY/csWbHo0PddOiKaGuda1eOD5/GBPtQWU/Es
MrX6KWvAEzx4ksooIHtc5hnF9xCGAw24egf/PU5ifQDAR0VLBBD9f5A3/3OR
xWEwuLiEd+7Kcl4c7ezcwlThCDOgdgp+oT2/nZt/45EAihT/ifv/i10wa+hX
CzJuG+uRfiUeD6B+iBWt24yHcea8W/CcsJQyS9/DSe7oW0P6R8Nst1kSotnz
TbYlk74Rt0wL/h9USmr/7S8PT3MU5bedLL/dsW/tAHT6zyIf74zyMB3f7cxC
OObc+VHX7zyBfW6A7S/hfShA2Vla8PXtfPn4bquHiGquUWnWUZzE5bKN6ny7
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

-->

</rfc>

