<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.27 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hendrickson-pp-public-metadata-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.0 -->
  <front>
    <title abbrev="Public Metadata Issuance">Public Metadata Issuance</title>
    <seriesInfo name="Internet-Draft" value="draft-hendrickson-pp-public-metadata-00"/>
    <author fullname="Scott Hendrickson">
      <organization>Google</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="29"/>
    <area>Security</area>
    <workgroup>Privacy Pass</workgroup>
    <keyword>public metadata issuance</keyword>
    <abstract>
      <t>This document specifies a Privacy Pass token type that encodes public metadata visible to the Client, Attester, Issuer, and Origin.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://smhendrickson.github.io/draft-hendrickson-privacypass-public-metadata-issuance/draft-hendrickson-pp-public-metadata.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-hendrickson-pp-public-metadata/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Pass Working Group mailing list (<eref target="mailto:privacy-pass@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/privacy-pass/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/privacy-pass/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/smhendrickson/draft-hendrickson-privacypass-public-metadata-issuance"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies a Privacy Pass token type that encodes public metadata visible to the Client, Attester, Issuer, and Origin. This allows deployments to encode a small amount of information visible to
all parties participating in the protocol.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>Public metadata enables Privacy Pass deployments that share information between clients, attesters, issuers and origins. In a 0x01 (VOPRF) or 0x02 (Blind RSA) deployment, the only information available to all parties is the <tt>issuer_name</tt>. If one wants to differentiate bits of information at the origin, many TokenChallenges must be sent - one for each <tt>issuer_name</tt> that attests to the bit required.</t>
      <t>For example, if a deployment was built that attested to an app’s published state in an app store, it requires 1 bit {<tt>published</tt>, <tt>not_published</tt>} and can be built with a single issuer. To build an app version attester, we need one <tt>issuer_name</tt> for each app version, and one challenge per version the origin needs to differentiate on each origin load. For each new app version that requires attesting, a new <tt>issuer_name</tt> must be deployed. If we build this system with public metadata a single TokenChallenge for a single <tt>issuer_name</tt> can be used. Deployment specific logic could allow adding a new app version into the metadata once sufficient users are on the new version, ensuring users are private when providing attested metadata bits to the origins.</t>
      <section anchor="alternatives">
        <name>Alternatives</name>
        <t>To implement this scheme without new cryptographic primitives, one could deploy an issuer signing key per metadata value, and publish each key’s bit assignment in Issuer Configuration. This many-key metadata deployment should provide metadata visible to all parties in the same way as the <xref target="PBLINDRSA"/> proposal outlined here, however it has reliability and scalability tradeoffs. Imagine a Privacy Pass deployment using a client cached redemption context where max-age cannot be used to expire signed tokens due to the cache, yet the deployment requires fast token expiration. Handling this requires either deploying one key per expiration period or rotating keys quickly. Many simultaneous deployed keys could be difficult to scale - for example some HSM implementations have fixed per-key costs, slow key generation, and minimum key lifetimes. Quick key rotation creates reliability risk to the system, as a pause or slowdown in key rotation could cause the system to run out of active signing or verification keys. <xref target="PBLINDRSA"/> allows deployments to change metadata sets without publishing new keys, and challenge expiry can be encoded within metadata. It pushes all metadata design into the deployment domain, instead of defining them in issuer configuration.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>The following terms are used throughout this document.</t>
      <ul spacing="normal">
        <li>Public Metadata: Information that can be viewed by the Client, Attester, Issuer, and Origin, and cryptographically bound to a token.</li>
      </ul>
    </section>
    <section anchor="notation">
      <name>Notation</name>
      <t>The following terms are used throughout this document to describe the protocol operations in this document:</t>
      <ul spacing="normal">
        <li>len(s): the length of a byte string, in bytes.</li>
        <li>concat(x0, ..., xN): Concatenation of byte strings. For example, concat(0x01, 0x0203, 0x040506) = 0x010203040506</li>
        <li>int_to_bytes: Convert a non-negative integer to a byte string. int_to_bytes is implemented as I2OSP as described in <xref section="4.1" sectionFormat="of" target="RFC8017"/>. Note that these functions operate on byte strings in big-endian byte order.</li>
      </ul>
    </section>
    <section anchor="public-flow">
      <name>Issuance Protocol for Publicly Verifiable Tokens</name>
      <t>This section describes a variant of the issuance protocol in <xref section="6" sectionFormat="of" target="PROTOCOL"/>
for producing publicly verifiable tokens including public metadata using cryptography specified in <xref target="PBLINDRSA"/>.
In particular, this variant of the issuance protocol works for the
<tt>RSAPBSSA-SHA384-PSSZERO-Deterministic</tt> or <tt>RSAPBSSA-SHA384-PSS-Deterministic</tt> variant of the blind RSA protocol variants described in <xref section="6" sectionFormat="of" target="PBLINDRSA"/>.</t>
      <t>The public metadata issuance protocol differs from the protocol in
<xref section="6" sectionFormat="of" target="PROTOCOL"/> in that the issuance and redemption protocols carry metadata provided by the Client and visible to the Attester, Issuer, and Origin. This means Clients can set arbitrary metadata when requesting a token, but specific values of metadata may be rejected by any of Attester, Issuer, or Origin. Similar to a token nonce, metadata is cryptographically bound to a token and cannot be altered.</t>
      <t>Clients provide the following as input to the issuance protocol:</t>
      <ul spacing="normal">
        <li>Issuer Request URI: A URI to which token request messages are sent. This can
be a URL derived from the "issuer-request-uri" value in the Issuer's
directory resource, or it can be another Client-configured URL. The value
of this parameter depends on the Client configuration and deployment model.
For example, in the 'Split Origin, Attester, Issuer' deployment model, the
Issuer Request URI might be correspond to the Client's configured Attester,
and the Attester is configured to relay requests to the Issuer.</li>
        <li>Issuer name: An identifier for the Issuer. This is typically a host name that
can be used to construct HTTP requests to the Issuer.</li>
        <li>Issuer Public Key: <tt>pkI</tt>, with a key identifier <tt>token_key_id</tt> computed as
described in <xref target="public-issuer-configuration"/>.</li>
        <li>Challenge value: <tt>challenge</tt>, an opaque byte string. For example, this might
be provided by the redemption protocol in <xref target="AUTHSCHEME"/>.</li>
        <li>Public Metadata: <tt>metadata</tt>, an opaque byte string of length at most 2<sup>16-1</sup> bytes.</li>
      </ul>
      <t>Given this configuration and these inputs, the two messages exchanged in
this protocol are described below. The constant <tt>Nk</tt> is defined as 256 for token type 0xDA7A.</t>
      <section anchor="public-request">
        <name>Client-to-Issuer Request</name>
        <t>The Client first creates an issuance request message for a random value
<tt>nonce</tt> using the input challenge and Issuer key identifier as follows:</t>
        <artwork><![CDATA[
nonce = random(32)
challenge_digest = SHA256(challenge)
token_input = concat(0xDA7A, // Token type field is 2 bytes long
                     int_to_bytes(len(metadata), 2),
                     metadata,
                     nonce,
                     challenge_digest,
                     token_key_id)
blinded_msg, blind_inv = Blind(pkI, PrepareIdentity(token_input), metadata)
]]></artwork>
        <t>Where  <tt>PrepareIdentity</tt> is defined in <xref section="6" sectionFormat="of" target="PBLINDRSA"/> and <tt>Blind</tt> is defined in <xref section="4.2" sectionFormat="of" target="PBLINDRSA"/></t>
        <t>The Client stores the nonce, challenge_digest, and metadata values locally for use
when finalizing the issuance protocol to produce a token (as described
in <xref target="public-finalize"/>).</t>
        <t>The Client then creates a TokenRequest structured as follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xDA7A; /* Type Public Metadata Blind RSA (2048-bit) */
  uint8_t truncated_token_key_id;
  opaque metadata<1..2^16-1>;
  uint8_t blinded_msg[Nk];
} MetadataTokenRequest;
]]></artwork>
        <t>The structure fields are defined as follows:</t>
        <ul spacing="normal">
          <li>"token_type" is a 2-octet integer, which matches the type in the challenge.</li>
          <li>"truncated_token_key_id" is the least significant byte of the <tt>token_key_id</tt>
(<xref target="public-issuer-configuration"/>) in network byte order (in other words, the
last 8 bits of <tt>token_key_id</tt>).</li>
          <li>"metadata" is the opaque metadata value input to the issuance protocol.</li>
          <li>"blinded_msg" is the Nk-octet request defined above.</li>
        </ul>
        <t>The Client then generates an HTTP POST request to send to the Issuer Request
URI, with the TokenRequest as the content. The media type for this request
is "application/private-token-request". An example request is shown below:</t>
        <artwork><![CDATA[
:method = POST
:scheme = https
:authority = issuer.example.net
:path = /request
accept = application/private-token-response
cache-control = no-cache, no-store
content-type = application/private-token-request
content-length = <Length of TokenRequest>

<Bytes containing the TokenRequest>
]]></artwork>
      </section>
      <section anchor="public-response">
        <name>Issuer-to-Client Response</name>
        <t>Upon receipt of the request, the Issuer validates the following conditions:</t>
        <ul spacing="normal">
          <li>The TokenRequest contains a supported token_type.</li>
          <li>The TokenRequest.truncated_token_key_id corresponds to the truncated key
ID of an Issuer Public Key.</li>
          <li>The TokenRequest.blinded_msg is of the correct size.</li>
        </ul>
        <t>If any of these conditions is not met, the Issuer MUST return an HTTP 400 error
to the Client, which will forward the error to the client. Otherwise, if the
Issuer is willing to produce a token token to the Client for the provided metadata value, the Issuer
completes the issuance flow by computing a blinded response as follows:</t>
        <artwork><![CDATA[
blind_sig = BlindSign(skI, TokenRequest.blinded_msg, metadata)
]]></artwork>
        <t>Where  <tt>BlindSign</tt> is defined in <xref section="4.3" sectionFormat="of" target="PBLINDRSA"/>.</t>
        <t>The result is encoded and transmitted to the client in the following
TokenResponse structure:</t>
        <artwork><![CDATA[
struct {
  uint8_t blind_sig[Nk];
} MetadataTokenResponse;
]]></artwork>
        <t>The Issuer generates an HTTP response with status code 200 whose content
consists of TokenResponse, with the content type set as
"application/private-token-response".</t>
        <artwork><![CDATA[
:status = 200
content-type = application/private-token-response
content-length = <Length of TokenResponse>

<Bytes containing the TokenResponse>
]]></artwork>
      </section>
      <section anchor="public-finalize">
        <name>Finalization</name>
        <t>Upon receipt, the Client handles the response and, if successful, processes the
content as follows:</t>
        <artwork><![CDATA[
authenticator = Finalize(pkI, nonce, metadata, blind_sig, blind_inv)
]]></artwork>
        <t>Where <tt>Finalize</tt> function is defined in <xref section="4.4" sectionFormat="of" target="PBLINDRSA"/>.</t>
        <t>If this succeeds, the Client then constructs a Token as described in <xref target="AUTHSCHEME"/> as
follows:</t>
        <artwork><![CDATA[
struct {
  uint16_t token_type = 0xDA7A; /* Type Partially Blind RSA (2048-bit) */
  opaque metadata<1..2^16-1>;
  uint8_t nonce[32];
  uint8_t challenge_digest[32];
  uint8_t token_key_id[32];
  uint8_t authenticator[Nk];
} Token;
]]></artwork>
        <t>The Token.nonce value is that which was sampled in <xref section="5.1" sectionFormat="of" target="PROTOCOL"/>.
If the Finalize function fails, the Client aborts the protocol.</t>
      </section>
      <section anchor="token-verification">
        <name>Token Verification</name>
        <t>Verifying a Token requires checking that Token.authenticator is a valid
signature over the remainder of the token input using the Augmented Issuer Public Key.</t>
        <artwork><![CDATA[
pkM = AugmentPublicKey(pkI, Token.metadata)
token_input = concat(0xDA7A, // Token type field is 2 bytes long
                     int_to_bytes(len(Token.metadata), 2),
                     Token.metadata,
                     Token.nonce,
                     Token.challenge_digest,
                     Token.token_key_id)
token_authenticator_input =  concat("msg",
    int_to_bytes(len(Token.metadata), 2),
    Token.metadata,
    token_input)
valid = RSASSA-PSS-VERIFY(pkM,
                          token_authenticator_input,
                          Token.authenticator)
]]></artwork>
        <t>Where <tt>AugmentPublicKey</tt> is defined in <xref section="4.6" sectionFormat="of" target="PBLINDRSA"/>,
and message verification is redefined in <xref section="4.5" sectionFormat="of" target="PBLINDRSA"/>.</t>
        <t>The function <tt>RSASSA-PSS-VERIFY</tt> is defined in <xref section="8.1.2" sectionFormat="of" target="RFC8017"/>,
using SHA-384 as the Hash function, MGF1 with SHA-384 as the PSS mask
generation function (MGF), and a 48-byte salt length (sLen).</t>
      </section>
      <section anchor="public-issuer-configuration">
        <name>Issuer Configuration</name>
        <t>Issuers are configured with Private and Public Key pairs, each denoted skI and
pkI, respectively, used to produce tokens. Each key pair SHALL be generated as
as specified in FIPS 186-4 <xref target="DSS"/>, where n is 2048 bits in length. These key
pairs MUST NOT be reused in other protocols. Each key pair MUST comply with all requirements as specified in <xref section="5.2" sectionFormat="of" target="PBLINDRSA"/>.</t>
        <t>The key identifier for a keypair (skI, pkI), denoted <tt>token_key_id</tt>, is
computed as SHA256(encoded_key), where encoded_key is a DER-encoded
SubjectPublicKeyInfo (SPKI) object carrying pkI. The SPKI object MUST use the
RSASSA-PSS OID <xref target="RFC5756"/>, which specifies the hash algorithm and salt size.
The salt size MUST match the output size of the hash function associated with
the public key and token type.</t>
        <t>Since Clients truncate <tt>token_key_id</tt> in each <tt>TokenRequest</tt>, Issuers should
ensure that the truncated form of new key IDs do not collide with other
truncated key IDs in rotation.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This extends the token type registry defined in <xref section="8.2.1" sectionFormat="of" target="PROTOCOL"/> with a new token type of value <tt>0xDA7A</tt>:</t>
      <ul spacing="normal">
        <li>Value: 0xDA7A</li>
        <li>Name: Partially Blind RSA (2048-bit)</li>
        <li>Token Structure: As defined in <xref target="public-request"/></li>
        <li>TokenChallenge Structure: As defined in <xref section="2.1" sectionFormat="of" target="AUTHSCHEME"/></li>
        <li>Publicly Verifiable: Y</li>
        <li>Public Metadata: Y</li>
        <li>Private Metadata: N</li>
        <li>Nk: 256</li>
        <li>Nid: 32</li>
        <li>Notes: The RSABSSA-SHA384-PSS-Deterministic and
RSABSSA-SHA384-PSSZERO-Deterministic variants are supported</li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="AUTHSCHEME">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="6" month="March" year="2023"/>
            <abstract>
              <t>   This document defines an HTTP authentication scheme that can be used
   by clients to redeem Privacy Pass tokens with an origin.  It can also
   be used by origins to challenge clients to present an acceptable
   Privacy Pass token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-auth-scheme-09"/>
        </reference>
        <reference anchor="PROTOCOL">
          <front>
            <title>Privacy Pass Issuance Protocol</title>
            <author fullname="Sofia Celi" initials="S." surname="Celi">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Alex Davidson" initials="A." surname="Davidson">
              <organization>Brave Software</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Steven Valdez" initials="S." surname="Valdez">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="6" month="March" year="2023"/>
            <abstract>
              <t>   This document specifies two variants of the two-message issuance
   protocol for Privacy Pass tokens: one that produces tokens that are
   privately verifiable using the issuance private key, and another that
   produces tokens that are publicly verifiable using the issuance
   public key.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-protocol-10"/>
        </reference>
        <reference anchor="PBLINDRSA">
          <front>
            <title>Partially Blind RSA Signatures</title>
            <author fullname="Ghous A. Amjad" initials="G. A." surname="Amjad">
              <organization>Google</organization>
            </author>
            <author fullname="Scott Hendrickson" initials="S." surname="Hendrickson">
              <organization>Google</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Kevin W. L. Yeo" initials="K. W. L." surname="Yeo">
              <organization>Google</organization>
            </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   This document specifies a blind RSA signature protocol that supports
   public metadata.  It is an extension to the RSABSSA protocol recently
   specified by the CFRG.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the Crypto Forum Research
   Group mailing list (cfrg@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/search/?email_list=cfrg.

   Source for this draft and an issue tracker can be found at
   https://github.com/chris-wood/draft-amjad-cfrg-partially-blind-rsa.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-amjad-cfrg-partially-blind-rsa-00"/>
        </reference>
        <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="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty">
              <organization/>
            </author>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski">
              <organization/>
            </author>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson">
              <organization/>
            </author>
            <author fullname="A. Rusch" initials="A." surname="Rusch">
              <organization/>
            </author>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series.  By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC5756">
          <front>
            <title>Updates for RSAES-OAEP and RSASSA-PSS Algorithm Parameters</title>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <author fullname="D. Brown" initials="D." surname="Brown">
              <organization/>
            </author>
            <author fullname="K. Yiu" initials="K." surname="Yiu">
              <organization/>
            </author>
            <author fullname="R. Housley" initials="R." surname="Housley">
              <organization/>
            </author>
            <author fullname="T. Polk" initials="T." surname="Polk">
              <organization/>
            </author>
            <date month="January" year="2010"/>
            <abstract>
              <t>This document updates RFC 4055.  It updates the conventions for using the RSA Encryption Scheme - Optimal Asymmetric Encryption Padding (RSAES-OAEP) key transport algorithm in the Internet X.509 Public Key Infrastructure (PKI).  Specifically, it updates the conventions for algorithm parameters in an X.509 certificate's subjectPublicKeyInfo field.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5756"/>
          <seriesInfo name="DOI" value="10.17487/RFC5756"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="DSS">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2013"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81b63IbR3b+P0/RC/0w6QLAiy5WYHOzlChZqBUvS1DeclwO
0Rg0gFkOZrDTMyRhFV15jfzLs+RR8iT5zjndcwNIKZuqVPzDxMz05Vy/c+lW
r9cL8iiPzUB1LopJHIXq1OR6qnOthtYWOglNJ9CTSWZunxwS6tzM02w9UFEy
S4NgmoaJXmLZaaZneW9hkmkWhTc2TXqrVW/F6/SWbp1ejNk2D2wxWUbWRmmS
r1eYO3x39V6pZ0rHNsXuUTI1KyxkkrzTVZ3h8Rv8STP8urx63wmSYjkx2SDA
imYQhGliTWILO1B5VpgA5D8PdGY0FhqZsMiifN0J7tLsZp6lxYqYy6JbHa7V
hba2E9yYNT5OB4HqKSFXeXJV5NgObk1SYC+ltq+hlPDR+Su2iZK5+pGG0ful
jmK8X8nw3grD/xSZfNZPszl911m4wPdFnq/sYG+PhtOr6Nb0/bA9erE3ydI7
a/bqC+3RAvMoXxQTLGGXNdnvbdGGzKSJG2qJSvUqJSqq0dRYuC/79aP0H9xi
27QNO+kv8mXcCQJd5Is0I9WAMKVmRRyLsY3CNM/Vh2oR/g5h6ST6TecwrIH6
MU3nseEPxqnB0rQ/2To/YbrERkmaLTHtlnV8/Onqw+jth3en72CZvZO+UEzq
aHBIxPVsuDBL2uTi8vzq/O35xyenrLI0T8M0pvFvPg7PTi5Hx/UJevk3Pe2F
s2wOBWd5pON43YNkkmkvszoIgl6vp/TE5pkO8yC4WkRWwQGLJTxF2ZUJo1lk
rNKqbp4qT29Mwhaq8oXOlUnCdIphbWu/jWw0iTEoxTij3sYRlu2q45wMwmRd
RgH6q5OpOs+ieZT0haRlNJ1C1MEzNUzyLJ0WIang/wWBimmAIOE+CrASp2si
hjZ1+4Aau8QApZdpATLTGUMbG0Sa1DYNaBDrhWijv2G0wiD4e5QwRV6/fRLF
aQqD0iKIixYnJtFY0zbF0KCO5GAXwLEGMROT3xnIKmTWLTh1vONnxMxbZj5l
5m0f+gB7+/f7B2rnp/OLy/e7hKN4PlQ7b8iuFCxwt7Zzl/lIk3jd2FffEjA5
2dfFEFmeMJbNr8k7x9h1hiWMutNO0NNoNjMZlo8ALmoS4W1LyuCWN2a6u4DN
ZK2uyCzeLrCdSebYa1nYHBJQloypxztgAWV0uGgSINIT0VhvLdhVZebvRZSZ
KfTznmbe6+UqNhDdDFKqhADCrZoUUZzXVzJTZh60rlb/9W//7swTYDJVNie+
YATyFc9pRsuWO1p1wAR8HpeTxl01TtL8unrxwKoLNanZbX8HtCX7hI1B9sIj
TDrlz1O/3S3ULkL0jnBnVGJAGMmoKZpSYrWJ4jA0NvTSViuTletWmuFVt6gU
g3hRNypO9bSv3vutEnPXoJOFWkpGqAaHIIOHNgn2Whf1QHdkXXfGSSAn77Zr
cL0UYbUxoxRe05pYDuW35o5OA4WlzU4qq3D4FYK9Of4fpgWpgJBF6emUYEBv
sBolzvxKglIEQWWLGRYiH6ZtyGkzFiKNpCVKxVBmk9HS1TAOKJD5HcIYIc5t
JHt7Iy13Yj9z23tAADA9U8cxjCTheGcB0qmKyA2YR5EnBzWWZ1rkTFCYrVd5
Os/0agHWQcIy4uldMRsWhWiIjFLECenOEyINKRbbUwXkOi6MWJ0zfzEUDGTP
IlcBImI6EwWLEmRXb9NkFs2LjEHDYTthRY+2KJevebJdMGkiJrM1lDTgTFRg
NbGvwYvA2+fPfyjj9cMDrbZKrY4VpAMQhcwXhvx9kd4ZaI78foGZmYkjPYli
JKDMqg117J8Rwacmnc0IopcaqjHtoFhjorBiXIL6sM+QQAc4ZpYrRk/kwLm5
z8kkYCBLfd/TMHHYMQDGmzIHvPsVXI71wi/gEdioKCMqr9xVayNoXCOh9NaZ
hjtKwObVnCY+gMGYqGQDKkcbmBAEIgvRZ7IWbw7VfHqMUgpbChFUQipGWYVl
wpt43VenFBBstCziXCcmLWyJBzJQLJBgIiLPKgi6U5a4QaiYVWCvbArdfhid
VkbPJFio7BawEN1jSZDDFhWmloKsJRen57lJjFAsxruMEpC05G9xNDN5tDTQ
6F+Ian4p3JCGUJDAPxs2kUX2xkteIKxLBqdhjVAYCYM2nqZ3BCOt5ZjdkMdV
02mxrEjILCm+IkeEi5ZemDKgE4DJGiS3ftu0tydKCAuEmaX3WIP3Hh6cB9MW
hBS0rEinCias6bUHVkm7prwAGCuTfjWkxRAKOV+ruzOxUEFpzSynKTJ7KAPQ
lhs9Ja6nZhYlYomQSFSCUdiAjoAytCuTQYMp4HxNuapYJhWDVnVOP42uqPik
v+rsnH9fvvvLp+HluxP6Pfpw/PFj+SNwI0Yfzj99PKl+VTPfnp+evjs7kcl4
qxqvgs7p8c8dEVvn/OJqeH52/LEjcFRPoQn/IYUJJRvA8FVmCPG1DSCjMIsm
eMCcN28v/vM/Dl6Qbi/fvz08OPgnaFYeXh989wIPFDt81EeqJ48Q2DpA8DI6
41wGOgj1KspRlbNhAkthigQxJD6S1ywlc2FhQ5QSngRrFiiA52weDQaoXlCt
5gIKoFoiyLmBM5TbyNxhscn6q9N9Z3j1YEU1lJogs5f0TbCLE/Qz503/IC+c
BTmxN7J/la4cStgNDQ4C6jPAK3bs7oBnkYcgbyF/BaeI66juOBnCVHpGzMYM
WC/cdud+v6v6/X5X3Z9h+lt+aRKRHFaozbcu//IprluASoEuFwD7z/nvi/2X
+6921REXCfRW3tCeMLHrPL1mIngzwEdOOQ5q9sTMOX9gO5zDvVi2tf37jelU
J5R4yxarhofnowv60TDdz59HhotH9aJ/QCyRze4ffPfw0Cd9uQIRcgPwzYok
FCmLwDmDqouARRjNeyj3I+0+wbuRQrP7+6YW4q5THMUJsU7YzE8Mllz0XEmk
/PzM9SlmsJQHV95aR69ngwD8VmfYkEGYVOx7H5WFNDh9ReP+4BsIDw8BkbHi
MprMceUJuq0IcqE7SsK4mFaDKsyUlKHmCOuy/HZyrqF+P0CZKAVtEeusKyb7
RSaop2ZZZvgejLHUxZvR6LgHRHz++kXvYjT6l3eX570TkzPORkjywzGFoW1D
28Nau098sVpt70Y8akBOrHU22dEfa/JVK0ttA9aydNn07CgJHtebOLurZMtV
CZBqqZpfCimLzrJa0upS1Bbc8fRW3+Mr+h1Lo2EesoRlOEXIBqQhsc50fVcu
IihdkxLM42MX5VWt4OF8nWv2cuIS2TFwLzN/gzSEakrRMGSTPKjcUzdC4QAT
q0ExwUkIgKrp4ysA3JfKLsHVVNFwXe959hl/3oB2TT6zKnIvyg3dDyhAuWLj
UsSiPl0OB+qY/tC0O5C0cEQ4wYF2azW1KChoUHvCqQEEBorpw+yPMFQk+JBV
aVcdyU16bp0eSr2OCNtXIkLKNxbLTJFRh3kK7SGzTouMhJZyseHCpYYwKNsW
EfR8woMNsTlRZGRtrMVeFXEXC6VOLik6YNL6ItRZXyNpYpnXkq8lsrgY0akZ
aBzh34xWSHLLsNw2im82FuL8A4ttCh9p9nzBag7TDLyvUjGFis5vrKpxW+5F
/XUaWvMZtq5qKCXMJtZrr8myXhYq+pUxSN/5GOkkHUsQjmYe+vxg0Tl1xNYr
Z7YaNSGYoMkMDaCo1l3g1BrxK8+KMFcfrq4uvkyHS57+bNYDNV7dDMdd3ySi
5LVG3JhN9Bpvr6PpGPssYfeSLKo2ZLqw5qyxoXSCzZ6q+iZsQdi6TO7HBD+I
wBqENxOAhlmwubEixSPacLcFIoW2qhsvpGxkj2OPHI9RQtbusixNxgaFHP5g
i9UfD171Dn7Yo18+0wp+hIO6lG3T9iXtYACx0ijN79LK+c291Ekk1EDcy3NC
uFDJfGIAR+KQrH6Kc+OzmzHZDpcvkiEdvnwlJla1x/fvT46/O5YujnPzPO21
XKZMU5wxPUjccy49izKM8fWoa9YwBrbQzLXIMnAOuBLkGDNYj116wQjKcFqV
eiQnR0/LILV1QGwBsr///nvAayHzlB12nh/uBuU619NoTrQcKaQIEMRO+WU3
EMOWjY+qxJYk01V7e5KtibywMepkiPVQNKziNJnzkdDGf/V0dYcSdG9Wu111
uNvdPsmPeeSzhLbt39qsPjKs7sW7AadBZnq9tCgQ+AFyuIUUuJm/AzzoIps1
gHUzZMnn652auHarMLvLKgj+yh0jNW5Napji01kVa3zM+z8+60X/sD2vYZTc
MJdem0sHNsQjDZdGB5HUKThLpgpEDTidwf46jn4rLXQjvwO2SnptynRip16I
BHVQdKuZh4fdfoPmnPYq/UiszrugQDqHmA2zd3D/GfouYHQHr65dQ+2aTfbI
Ofn3au9bdUVv2ofx5cGN2jncf/G6h6RuV32759Z7TctlBVeG0+u6+XxPgV/Q
0cvxh4N+//BfCQf/+H1tfs3Mfjm7+fX74KHcvc7m92JDJJOSYXE56xCvxLJK
BD3VqbjtkMVoddhLkUTmvpjsuiRrqfNw4cyCZeNyi9I2+rLcVm47/mwqNtSy
5C4Y9b6gOSkEpbBohknIYOcL4XBX8TFITtVPraRUO3gt+Rd3kHw6E9Pmr8sz
r+Z2u8KA10ZJcktLZUr4VOYqS9U0V652duPE6wG+1MskvTVbjNq1OSU8cFpy
cT66KqdTY9VUKVgz+gRI2FxKQh8bXuG66dytlhyZeERt7sCa0ynXPqal8LOj
V8gjpWO5504+eixDH906fcrKfHfX0xj5dhXHWud5Awh0kU7hYsRPMHDnHEeK
rzoEA7luQK3ZI3/W5tbtQ+HBYKXB1ZHa8/TpMDQrikFPEUnpKpCJW+tkS3kG
BDoCzPVctx2/GP4CJ5eeg4Evcl5OcMnNkfrhY9lMqgv+j0HwwxsOfzRDl+3R
1iB25mfPnEIpsXBGcemYqGcW8gYo/gk/IPbQRKuyWncEduv2ARuOpmxUzZIM
JE0jbuMwOFy1jcaRTDCBTG2VZrk/umAE6W+Z09+OCLXyocyvy5GUrVD1ccKd
uGQz3d66Uc3dyOQc+7xPSJjzG7nXcOZLY0kgK45pDlWwsMuGrLjpnBngaVK6
4Iv9fWWyLM2C1vUHwcq7KOb+1Z3OpOLhseXBDo/tq3MCqLvIypk3IZTbMbK8
AhvGZnT0/6+Xhr74KRP59ulexU9AxUdsvO5L6KI2GuX/UptI+8FJVHkL24yf
kvYAz33aMwK071hKfR7TzaNpTzn/qdTl+SONJJBI50yY6E80uEhAOmuXUe7u
C1TS99GrNP3AkesYLUPo9jyhjMvE+iNRWVaqhWWn3U1AL8XLSE33FwpCh6lR
h7CzO1StJU7zDbvISvxqbFTDeTdWgJx7TTZ4ErtlhU7fIbOj4Ii2/58AoUfX
LyOhjPwSFPpRHgvfS/YnNWDV//U5YRP+unX/WNCJqLP4ypiTKXueLRA6rJ0V
cZcciH7LUM/JptlTcKLkHIKA5x15yowk/a0mWrcylVqd0DD+sV9gXDbSn/CB
F1t8YOiaSMyMcSlPMzv2zY0yQd5o+P9S1fe/ktH8b3Nlf23uiSz563Jglugv
zw9/rb9sVyXt7/Vw0/7WUKB3YBZKzWH5uS+Vscv63GUwB/N0DscpSUtFL+W4
pOpG90U/pjSUSs0zHcVNbSETzHK7cYftmVPaT7Vz4yDgp7XA9VXZB+XzfiQ0
4Y24FEgWZpqGG8n5CHKBgFJyzTVDSrcmxFHoPJfSaRdKJfJI5ls1HY6LuTtI
2hKmWZirm1NYhxsnX/FRfEXIqiLC/1E/obXtE12F5sgnBz3VYZARX9lnkMHN
boM8NfRXisnLqUOVhqz59RxvY7DepgjYQLAL3JeOieh86Kd3l8P3P0ODp49w
UGuXbCH5qUlb7LQJlW07eipb2GiQdAPpXEhTrXEFg2udR9Z5+UjWUXrxeEM4
j5P1un/gOjDleWo3EH8afTjuPX/9whdnH7RdlHt01emP7w8kyrfGYVfU5/Ym
qO7EVKTtYNqudGy0IuzlZqxGsuQC9I5FfN7lY9hnW+92VbF2axUeuLxV+gy1
hj6TeuFuyNH+FTKolY7onizfNJsa5N10c/NmSMMCBgYK04YvzcTrbtmh98mw
nLn21Tt3U43XU3z9gxraPsfiDjuhdP249f3wYqQOXr/q0aWMfz4ZjY5Ozof9
g/3+q/3D13tnw9FVn4b0eQh0425ysYVQ9JL+Ad2sZPlx6Wz5vkrAXCl/TUXO
5Jj0sh9RHjm2aedJnJuv3SECagiH5XL3p81HPd5sdPT61SWa1iEJH07wlpKn
Q9owD6+DZk+ELjIHtdMK3wB2OTYN2/Xyqb2TwHLy7rLnXgajYkJnk6XT0i0T
tTO6+PNwV6X8SY5g+fj8ZijtCPrsv7J43A2roHI2dY4iUW7TvPzu5SvRFsXm
6n47OciCHEnHc2ooLJZyAZA8QIpC7pn5R9mJu13S/ilyAln+5OLgou6WdDcy
DSM2NtJbkFfH2iQKLkPKoAW1jCLKJ/zRqK9520dEkbvEO66XUWN/YmfdXcqA
r6RWFzFqJTTd4iGC3TUwFNN08YUrXJhfTMexbGZslkGj9OaxIMDfcJMbGv7f
7xA2WEx3t2pgZ+cn5+VXucxxfHa8OYzSU3Of88lmlU5wKM/MHEVNtn4MMA8l
oaqf77uDNmKvthAGSaY2lpxhjNz1W/WTnJPJKzyf8fnh0+kphkmuMSpLQXXc
QvTW0c6Dn1Od0D0x2XPneKsfrWGdLTdfBurn8kPtyI1fOpCt3p4RmzcDOrei
X9F0oJ4f0q+ULxCRyYPfJ+99MBarLcM2b5JU9z/40N23hgL3r2QmOrwhuzgO
b5L0DukyR3AbfB7IPx8z06POTMcoQR+cOelyJFzmvwHou8ClMDcAAA==

-->

</rfc>
