<?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-privacypass-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-privacypass-public-metadata-00"/>
    <author fullname="Scott Hendrickson">
      <organization>Google</organization>
      <address>
        <email>scott@shendrickson.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="30"/>
    <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-privacypass-public-metadata.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-hendrickson-privacypass-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:
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
6wbUmj30Z21u3S4UHvQWGlwdqh1Pnw5Ds6AY9BSRlK4Cmbi1TraUZ0CgQ8Bc
x3Xb8YvhL3By6TgY+Crn5QSX3ByqNx/LZlJd8D8GwZu3HP5ohi7boyuD2Jmf
PXMKpcTCGcWlY6KeWcgboPgn/IDYQxMtymrdEdiu2wdsOBqzUTVLMpA0jriN
w+BwtWo0jmSCCWRqizTL/dEFI0h3w5zuZkSolQ9lfl2OpGyFqo9j7sQl6+n2
xo1q7kYm59jnfULCnN/IvfoTXxpLAllxTHOogoVdNmTFTefMAE+T0gUPdneV
ybI0C1auPwhW3kUx96/udCYVD48tD3Z4bFedE0DdRVbOvAmh3I6R5RXYMNaj
o/9/vTT0xU+ZyK+e7lX8BFR8xMbrvoQuaqNR/i+1ibQfnESVt7D1+ClpD/Dc
pz0DQPuWpdTnMd08mvaU859KXZ4/0kgCiXTOhIn+RIOLBKSzdh7l7r5AJX0f
vUrTDxy5jtEyhG7OE8q4TKw/EpVlpVpYdtpdB/RSvIzUdH+hIHQYG7UPO7tD
1VriNF+1i6zEr8ZGNZx3YwXIuddkgyexW1ZodR0yOwoOafs/AoQeXb+OhDLy
a1DoR3ks/CDZn9SAVf/X54RN+GvX/WNGJ6LO4itjTsbsebZA6LB2UsRtciD6
LUM9J+tmT8GJknMIAp536CkzkvSvNNHalanU6oSG8Q/9AsOykf6EDxxs8IG+
ayIxM8alPM3s2Dc3ygR5reH/S1Xf/0pG87/Nlf21uSey5G/LgVmivzzf/7X+
crUqWf1eDzer3xoK9A7MQqk5LD93pTJ2WZ+7DOZgns7hOCVZUdELOS6putFd
0Y8pDaVS80RHcVNbyASz3K7dYXvmlPa5dm4cBPy0FLi+KvugfN6PhCa8EZcC
ycJM03AjOR9BLhBQSq65Zkjp1oQ4Cp3nUjrtQqlEHsl8q6bDUTF1B0kbwjQL
c3FzCutw4+QrPoqvCFlVRPg/6iesbPtEV6E58slBT3UYZMQ39hlkcLPbIE8N
/ZVi8nJqUaUha347x5sYrLcpAjYQ7AL3pWMiOh/6/P6y/+FnaPD0EQ5q7ZIN
JD81aYOdNqFy1Y6eyhbWGiTtQDoX0lRrXMHgWueRdV48knWUXjxcE87jZL3q
7rkOTHme2g7EnwYnR53nrw58cXai7azco61Of/qwJ1F+ZRx2RX1ub4LqTkxF
2hambUvHRivCXm7GaiRLLkBvWcTnbT6GfbbxblcVazdW4YHLW6XPUGvoM6kX
7oYc7V8hg1roiO7J8k2zsUHeTTc3b/o0LGBgoDBt+NJMvGyXHXqfDMuZa1e9
dzfVeD3F1z+ooe1zLO6wE0rXj1s/9C8Gau/Vyw5dyvjn48Hg8Pi8393b7b7c
3X+1c9YfXHVpSJeHQDfuJhdbCEUv6R/QzUqWH5fOlu+rBMyV8tdU5EyOSS/7
EeWR4yrtPIlz86U7REAN4bBc7v6s8lGPN2sdvW51iWblkIQPJ3hLydMhbZiH
10GzJ0IXmYPaaYVvALscm4Zte/nU3klgOX5/2XEvg0ExorPJ0mnplonaGlz8
pb+tUv4kR7B8fH7Tl3YEffZfWTzuhlVQOZs6R5Eot2le/PDipWiLYnN1v50c
ZEaOpOMpNRRmc7kASB4gRSH3zPyj7MTdLmn/FDmBLH9ycXBWd0u6G5mGERsb
6S3Iq2NtEgWXIWXQgloGEeUT/mjU17yrR0SRu8Q7rJdRQ39iZ91dyoCvpFYX
MWolNN3iIYLdNTAU03TxhStcmF9Mx7FsZmyWQaP05rEgwN9wkxsa/h/yEDZY
THe3amBn58fn5Ve5zHF0drQ+jNJTc5/zyWaVTnAoz8wURU22fAww9yWhqp/v
u4M2Yq+2EAZJpjaUnGGI3PV79VnOyeQVns/4/PDp9BTDJNcYlKWgOlpB9JWj
nQc/pzqhe2Ky587xVj9awzobbr701M/lh9qRG790IFu9PSM2b3p0bkW/onFP
Pd+nXylfICKTB79P3vtgLFYbhq3fJKnuf/Chu28NBe5fyYx0eEN2cRTeJOkd
0mWO4Db40pN/R2bGh62JjlGCPjhz0uVIuMz/AGZKuH5CNwAA

-->

</rfc>
