| rfc9162xml2.original.xml | rfc9162.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
| <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.4.11 --> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc [ | |||
| <!ENTITY nbsp " "> | ||||
| <!ENTITY zwsp "​"> | ||||
| <!ENTITY nbhy "‑"> | ||||
| <!ENTITY wj "⁠"> | ||||
| ]> | ]> | |||
| <?rfc toc="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
| <?rfc sortrefs="yes"?> | -ietf-trans-rfc6962-bis-42" number="9162" obsoletes="6962" updates="" submission | |||
| <?rfc symrefs="yes"?> | Type="IETF" category="exp" consensus="true" xml:lang="en" tocInclude="true" sort | |||
| Refs="true" symRefs="true" version="3"> | ||||
| <rfc ipr="trust200902" docName="draft-ietf-trans-rfc6962-bis-42" category="exp" | ||||
| obsoletes="6962"> | ||||
| <!-- xml2rfc v2v3 conversion 3.9.1 --> | ||||
| <front> | <front> | |||
| <title>Certificate Transparency Version 2.0</title> | <title>Certificate Transparency Version 2.0</title> | |||
| <seriesInfo name="RFC" value="9162"/> | ||||
| <author initials="B." surname="Laurie" fullname="Ben Laurie"> | <author initials="B." surname="Laurie" fullname="Ben Laurie"> | |||
| <organization abbrev="Google">Google UK Ltd.</organization> | <organization abbrev="Google">Google UK Ltd.</organization> | |||
| <address> | <address> | |||
| <email>benl@google.com</email> | <email>benl@google.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="A." surname="Langley" fullname="Adam Langley"> | ||||
| <organization abbrev="Google">Google Inc.</organization> | ||||
| <address> | ||||
| <email>agl@google.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="E." surname="Kasper" fullname="Emilia Kasper"> | ||||
| <organization abbrev="Google">Google Switzerland GmbH</organization> | ||||
| <address> | ||||
| <email>ekasper@google.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="E." surname="Messeri" fullname="Eran Messeri"> | <author initials="E." surname="Messeri" fullname="Eran Messeri"> | |||
| <organization abbrev="Google">Google UK Ltd.</organization> | <organization abbrev="Google">Google UK Ltd.</organization> | |||
| <address> | <address> | |||
| <email>eranm@google.com</email> | <email>eranm@google.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="R." surname="Stradling" fullname="Rob Stradling"> | <author initials="R." surname="Stradling" fullname="Rob Stradling"> | |||
| <organization abbrev="Sectigo">Sectigo Ltd.</organization> | <organization abbrev="Sectigo">Sectigo Ltd.</organization> | |||
| <address> | <address> | |||
| <email>rob@sectigo.com</email> | <email>rob@sectigo.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2021" month="November"/> | ||||
| <date year="2021" month="August" day="31"/> | ||||
| <area>Security</area> | <area>Security</area> | |||
| <workgroup>TRANS (Public Notary Transparency)</workgroup> | <workgroup>TRANS (Public Notary Transparency)</workgroup> | |||
| <keyword>certificates</keyword> | ||||
| <keyword>pkix</keyword> | ||||
| <keyword>tls</keyword> | ||||
| <keyword>website</keyword> | ||||
| <keyword>webpki</keyword> | ||||
| <keyword>browsers</keyword> | ||||
| <abstract> | <abstract> | |||
| <t>This document describes version 2.0 of the Certificate Transparency (CT | ||||
| <t>This document describes version 2.0 of the Certificate Transparency (CT) | ) | |||
| protocol for publicly logging the existence of Transport Layer Security (TLS) | protocol for publicly logging the existence of Transport Layer Security (TLS) | |||
| server certificates as they are issued or observed, in a manner that allows | server certificates as they are issued or observed, in a manner that allows | |||
| anyone to audit certification authority (CA) activity and notice the issuance of | anyone to audit certification authority (CA) activity and notice the issuance of | |||
| suspect certificates as well as to audit the certificate logs themselves. The | suspect certificates as well as to audit the certificate logs themselves. The | |||
| intent is that eventually clients would refuse to honor certificates that do not | intent is that eventually clients would refuse to honor certificates that do not | |||
| appear in a log, effectively forcing CAs to add all issued certificates to the | appear in a log, effectively forcing CAs to add all issued certificates to the | |||
| logs.</t> | logs.</t> | |||
| <t>This document obsoletes RFC 6962. It also specifies a new TLS extensio | ||||
| <t>This document obsoletes RFC 6962. It also specifies a new TLS extension that | n that is | |||
| is | ||||
| used to send various CT log artifacts.</t> | used to send various CT log artifacts.</t> | |||
| <t>Logs are network services that implement the protocol operations for su | ||||
| <t>Logs are network services that implement the protocol operations for submissi | bmissions | |||
| ons | ||||
| and queries that are defined in this document.</t> | and queries that are defined in this document.</t> | |||
| <t>[RFC Editor: please update 'RFCXXXX' to refer to this document, | ||||
| once its RFC number is known, through the document. Also, the OID | ||||
| assigned below must also appear in the appendix as indicated. ]</t> | ||||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="introduction" numbered="true" toc="default"> | ||||
| <section anchor="introduction" title="Introduction"> | <name>Introduction</name> | |||
| <t>Certificate Transparency aims to mitigate the problem of misissued cert | ||||
| <t>Certificate Transparency aims to mitigate the problem of misissued certificat | ificates | |||
| es | ||||
| by providing append-only logs of issued certificates. The logs do not themselves | by providing append-only logs of issued certificates. The logs do not themselves | |||
| prevent misissuance, but they ensure that interested parties (particularly those | prevent misissuance, but they ensure that interested parties (particularly those | |||
| named in certificates) can detect such misissuance. Note that this is a general | named in certificates) can detect such misissuance. Note that this is a general | |||
| mechanism that could be used for transparently logging any form of binary data, | mechanism that could be used for transparently logging any form of binary data, | |||
| subject to some kind of inclusion criteria. In this document, we only describe | subject to some kind of inclusion criteria. In this document, we only describe | |||
| its use for public TLS server certificates (i.e., where the inclusion criteria | its use for public TLS server certificates (i.e., where the inclusion criteria | |||
| is a valid certificate issued by a public certification authority (CA)). | is a valid certificate issued by a public certification authority (CA)). | |||
| A typical definition of "public" can be found in <xref target="CABBR"></xref>.</ | A typical definition of "public" can be found in <xref target="CABBR" format="de | |||
| t> | fault"/>.</t> | |||
| <t>Each log contains certificate chains, which can be submitted by anyone. | ||||
| <t>Each log contains certificate chains, which can be submitted by anyone. It is | It is | |||
| expected that public CAs will contribute all their newly issued certificates to | expected that public CAs will contribute all their newly issued certificates to | |||
| one or more logs; however, certificate holders can also contribute their own | one or more logs; however, certificate holders can also contribute their own | |||
| certificate chains, as can third parties. In order to avoid logs being rendered | certificate chains, as can third parties. In order to avoid logs being rendered | |||
| useless by the submission of large numbers of spurious certificates, it is | useless by the submission of large numbers of spurious certificates, it is | |||
| required that each chain ends with a trust anchor that is accepted by the log. | required that each chain ends with a trust anchor that is accepted by the log. | |||
| A log may also limit the length of the chain it is willing to accept; | A log may also limit the length of the chain it is willing to accept; | |||
| such chains must also end with an acceptable trust anchor. | such chains must also end with an acceptable trust anchor. | |||
| When a chain is accepted by a log, a signed timestamp is returned, which can | When a chain is accepted by a log, a signed timestamp is returned, which can | |||
| later be used to provide evidence to TLS clients that the chain has been | later be used to provide evidence to TLS clients that the chain has been | |||
| submitted. TLS clients can thus require that all certificates they accept as | submitted. TLS clients can thus require that all certificates they accept as | |||
| valid are accompanied by signed timestamps.</t> | valid are accompanied by signed timestamps.</t> | |||
| <t>Those who are concerned about misissuance can monitor the logs, asking | ||||
| <t>Those who are concerned about misissuance can monitor the logs, asking them | them | |||
| regularly for all new entries, and can thus check whether domains for which they | regularly for all new entries, and can thus check whether domains for which they | |||
| are responsible have had certificates issued that they did not expect. What | are responsible have had certificates issued that they did not expect. What | |||
| they do with this information, particularly when they find that a misissuance | they do with this information, particularly when they find that a misissuance | |||
| has happened, is beyond the scope of this document. However, broadly speaking, | has happened, is beyond the scope of this document. However, broadly speaking, | |||
| they can invoke existing business mechanisms for dealing with misissued | they can invoke existing business mechanisms for dealing with misissued | |||
| certificates, such as working with the CA to get the certificate revoked, or | certificates, such as working with the CA to get the certificate revoked or | |||
| with maintainers of trust anchor lists to get the CA removed. Of course, anyone | with maintainers of trust anchor lists to get the CA removed. Of course, anyone | |||
| who wants can monitor the logs and, if they believe a certificate is incorrectly | who wants can monitor the logs and, if they believe a certificate is incorrectly | |||
| issued, take action as they see fit.</t> | issued, take action as they see fit.</t> | |||
| <t>Similarly, those who have seen signed timestamps from a particular log | ||||
| <t>Similarly, those who have seen signed timestamps from a particular log can la | can later | |||
| ter | ||||
| demand a proof of inclusion from that log. If the log is unable to provide this | demand a proof of inclusion from that log. If the log is unable to provide this | |||
| (or, indeed, if the corresponding certificate is absent from monitors' copies of | (or, indeed, if the corresponding certificate is absent from monitors' copies of | |||
| that log), that is evidence of the incorrect operation of the log. The checking | that log), that is evidence of the incorrect operation of the log. The checking | |||
| operation is asynchronous to allow clients to proceed without delay, despite | operation is asynchronous to allow clients to proceed without delay, despite | |||
| possible issues such as network connectivity and the vagaries of firewalls.</t> | possible issues, such as network connectivity and the vagaries of firewalls.</t> | |||
| <t>The append-only property of each log is achieved using Merkle Trees, wh | ||||
| <t>The append-only property of each log is achieved using Merkle Trees, which ca | ich can | |||
| n | ||||
| be used to efficiently prove that any particular instance of the log is a | be used to efficiently prove that any particular instance of the log is a | |||
| superset of any particular previous instance and to efficiently detect various | superset of any particular previous instance and to efficiently detect various | |||
| misbehaviors of the log (e.g., issuing a signed timestamp for a certificate that | misbehaviors of the log (e.g., issuing a signed timestamp for a certificate that | |||
| is not subsequently logged).</t> | is not subsequently logged).</t> | |||
| <t>The log auditing mechanisms described in this document can | ||||
| <t>It is necessary to treat each log as a trusted third party, because the log | be circumvented by a misbehaving log that shows different, inconsistent | |||
| auditing mechanisms described in this document can be circumvented by a | views of itself to different clients. Therefore, it is necessary to treat each l | |||
| misbehaving log that shows different, inconsistent views of itself to different | og | |||
| clients. While mechanisms are being developed to address these | as a trusted third party. While mechanisms are being developed to address these | |||
| shortcomings and thereby avoid the need to blindly trust logs, | shortcomings and thereby avoid the need to blindly trust logs, | |||
| such mechanisms are outside the scope of this document.</t> | such mechanisms are outside the scope of this document.</t> | |||
| <section anchor="requirements-language" numbered="true" toc="default"> | ||||
| <section anchor="requirements-language" title="Requirements Language"> | <name>Requirements Language</name> | |||
| <t> | ||||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
| "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> < | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| xref target="RFC8174"/> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| when, and only when, they appear in all capitals, as shown here.</t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
| be interpreted as | ||||
| </section> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| <section anchor="data_structures" title="Data Structures"> | when, and only when, they appear in all capitals, as shown here. | |||
| </t> | ||||
| <t>Data structures are defined and encoded according to the conventions laid out | </section> | |||
| in Section 3 of <xref target="RFC8446"></xref>.</t> | <section anchor="data_structures" numbered="true" toc="default"> | |||
| <name>Data Structures</name> | ||||
| <t>This document uses object identifiers (OIDs) to identify Log IDs (see | <t>Data structures are defined and encoded according to the conventions | |||
| <xref target="log_id"/>), the precertificate CMS <spanx style="verb">eContentTyp | laid out | |||
| e</spanx> (see <xref target="precertificates"/>), | in <xref target="RFC8446" sectionFormat="of" section="3"/>.</t> | |||
| and X.509v3 extensions in certificates (see <xref target="cert_transinfo_extensi | <t>This document uses object identifiers (OIDs) to identify Log IDs (see | |||
| on"/>) and | <xref target="log_id" format="default"/>), the precertificate Cryptograph | |||
| OCSP responses (see <xref target="ocsp_transinfo_extension"/>). The OIDs are def | ic Message | |||
| ined in an | Syntax (CMS) <tt>eContentType</tt> (see <xref target="precertificates" | |||
| arc that was selected due to its short encoding.</t> | format="default"/>), X.509v3 extensions in certificates (see <xref | |||
| target="cert_transinfo_extension" format="default"/>), and | ||||
| </section> | Online Certificate Status Protocol (OCSP) responses (see <xref | |||
| <section anchor="major-differences-from-ct-10" title="Major Differences from CT | target="ocsp_transinfo_extension" format="default"/>). The OIDs are defin | |||
| 1.0"> | ed in an | |||
| arc that was selected due to its short encoding.</t> | ||||
| <t>This document revises and obsoletes the CT 1.0 <xref target="RFC6962"></xref> | </section> | |||
| protocol, drawing on | <section anchor="major-differences-from-ct-10" numbered="true" toc="defaul | |||
| insights gained from CT 1.0 deployments and on feedback from the community. The | t"> | |||
| major changes are:</t> | <name>Major Differences from CT 1.0</name> | |||
| <t>This document revises and obsoletes the CT 1.0 protocol <xref target= | ||||
| <t><list style="symbols"> | "RFC6962" | |||
| <t>Hash and signature algorithm agility: permitted algorithms are now specifie | format="default"/>, drawing on | |||
| d | insights gained from CT 1.0 deployments and on feedback from the communit | |||
| in IANA registries.</t> | y. The | |||
| <t>Precertificate format: precertificates are now CMS objects rather than X.50 | major changes are:</t> | |||
| 9 | <ul spacing="normal"> | |||
| certificates, which avoids violating the certificate serial number uniqueness | <li>Hash and signature algorithm agility: Permitted algorithms are now | |||
| requirement in Section 4.1.2.2 of <xref target="RFC5280"></xref>.</t> | specified | |||
| <t>Removed precertificate signing certificates and the precertificate poison | in IANA registries.</li> | |||
| extension: the change of precertificate format means that these are no longer | <li>Precertificate format: Precertificates are now CMS objects rather | |||
| needed.</t> | than X.509 | |||
| <t>Logs IDs: each log is now identified by an OID rather than by the hash of i | certificates, which avoids violating the certificate serial number uniq | |||
| ts | ueness | |||
| public key. OID allocations are managed by an IANA registry.</t> | requirement in <xref target="RFC5280" sectionFormat="of" section="4.1.2 | |||
| <t><spanx style="verb">TransItem</spanx> structure: this new data structure is | .2"/>.</li> | |||
| used to encapsulate most | <li>Removal of precertificate signing certificates and the precertific | |||
| types of CT data. A <spanx style="verb">TransItemList</spanx>, consisting of one | ate poison | |||
| or more <spanx style="verb">TransItem</spanx> | extension: The change of precertificate format means that these are no | |||
| structures, can be used anywhere that <spanx style="verb">SignedCertificateTimes | longer | |||
| tampList</spanx> was | needed.</li> | |||
| used in <xref target="RFC6962"></xref>.</t> | <li>Logs IDs: Each log is now identified by an OID rather than by the | |||
| <t>Merkle tree leaves: the <spanx style="verb">MerkleTreeLeaf</spanx> structur | hash of its | |||
| e has been replaced by the | public key. OID allocations are available from an IANA registry.</li> | |||
| <spanx style="verb">TransItem</spanx> structure, which eases extensibility and s | <li><tt>TransItem</tt> structure: This new data structure is used to e | |||
| implifies the leaf | ncapsulate | |||
| structure by removing one layer of abstraction.</t> | most types of CT data. A <tt>TransItemList</tt>, consisting of one or m | |||
| <t>Unified leaf format: the structure for both certificate and precertificate | ore | |||
| entries now includes only the TBSCertificate (whereas certificate entries in | <tt>TransItem</tt> structures, can be used anywhere that | |||
| <xref target="RFC6962"></xref> included the entire certificate).</t> | <tt>SignedCertificateTimestampList</tt> was | |||
| <t>Log Artifact Extensions: these are now typed and managed by an IANA registr | used in <xref target="RFC6962" format="default"/>.</li> | |||
| y, | <li>Merkle Tree leaves: The <tt>MerkleTreeLeaf</tt> structure has been | |||
| and they can now appear not only in SCTs but also in STHs.</t> | replaced by | |||
| <t>API outputs: complete <spanx style="verb">TransItem</spanx> structures are | the <tt>TransItem</tt> structure, which eases extensibility and simplif | |||
| returned, rather than the | ies the leaf | |||
| constituent parts of each structure.</t> | structure by removing one layer of abstraction.</li> | |||
| <t>get-all-by-hash: new client API for obtaining an inclusion proof and the | <li>Unified leaf format: The structure for both certificate and precer | |||
| corresponding consistency proof at the same time.</t> | tificate | |||
| <t>submit-entry: new client API, replacing add-chain and add-pre-chain.</t> | entries now includes only the TBSCertificate (whereas certificate entri | |||
| <t>Presenting SCTs with proofs: TLS servers may present SCTs together with the | es in | |||
| corresponding inclusion proofs using any of the mechanisms that <xref target="RF | <xref target="RFC6962" format="default"/> included the entire certifica | |||
| C6962"></xref> | te).</li> | |||
| defined for presenting SCTs only. (Presenting SCTs only is still supported).</t> | <li>Log artifact extensions: These are now typed and managed by an IAN | |||
| <t>CT TLS extension: the <spanx style="verb">signed_certificate_timestamp</spa | A registry, | |||
| nx> TLS extension has been | and they can now appear not only in Signed Certificate Timestamps (SCTs | |||
| replaced by the <spanx style="verb">transparency_info</spanx> TLS extension.</t> | ) but also | |||
| <t>Verification algorithms: added detailed algorithms for verifying inclusion | in Signed Tree Heads (STHs).</li> | |||
| proofs, for verifying consistency between two STHs, and for verifying a root | <li>API outputs: Complete <tt>TransItem</tt> structures are returned r | |||
| hash given a complete list of the relevant leaf input entries.</t> | ather than | |||
| <t>Extensive clarifications and editorial work.</t> | the constituent parts of each structure.</li> | |||
| </list></t> | <li><tt>get-all-by-hash</tt>: This is a new client API for obtaining a | |||
| n inclusion proof and | ||||
| </section> | the corresponding consistency proof at the same time.</li> | |||
| </section> | <li><tt>submit-entry</tt>: This is a new client API, replacing <tt>add | |||
| <section anchor="cryptographic-components" title="Cryptographic Components"> | -chain</tt> and | |||
| <tt>add-pre-chain</tt>.</li> | ||||
| <section anchor="mht" title="Merkle Hash Trees"> | <li>Presenting SCTs with proofs: TLS servers may present SCTs together | |||
| with the | ||||
| <t>A full description of Merkle Hash Tree is beyond the scope of this | corresponding inclusion proofs, using any of the mechanisms that <xref | |||
| document. Briefly, it is a binary tree where each non-leaf node is a | target="RFC6962" format="default"/> | |||
| hash of its children. For CT, the number of children is at most two. | defined for presenting SCTs only. (Presenting SCTs only is still suppor | |||
| Additional information can be found in the Introduction and Reference | ted).</li> | |||
| section of <xref target="RFC8391"/>.</t> | <li>CT TLS extension: The <tt>signed_certificate_timestamp</tt> TLS ex | |||
| tension has | ||||
| <section anchor="mht_definition" title="Definition of the Merkle Tree"> | been replaced by the <tt>transparency_info</tt> TLS extension.</li> | |||
| <li>Verification algorithms: Detailed algorithms for verifying inclusi | ||||
| <t>The log uses a binary Merkle Hash Tree for efficient auditing. The hash | on | |||
| algorithm used is one of the log's parameters (see <xref target="log_parameters" | proofs, for verifying consistency between two STHs, and for verifying a | |||
| />). | root | |||
| This document establishes a registry of acceptable hash algorithms (see | hash given a complete list of the relevant leaf input entries have been | |||
| <xref target="hash_algorithms"/>). Throughout this document, the hash algorithm | added.</li> | |||
| in use is | <li>Extensive clarifications and editorial work.</li> | |||
| referred to as HASH and the size of its output in bytes as HASH_SIZE. The input | </ul> | |||
| to the Merkle Tree Hash is a list of data entries; these entries will be | </section> | |||
| hashed to form the leaves of the Merkle Hash Tree. The output is a single | </section> | |||
| HASH_SIZE Merkle Tree Hash. Given an ordered list of n inputs, D_n = | <section anchor="cryptographic-components" numbered="true" toc="default"> | |||
| {d[0], d[1], …, d[n-1]}, the Merkle Tree Hash (MTH) is thus defined as | <name>Cryptographic Components</name> | |||
| follows:</t> | <section anchor="mht" numbered="true" toc="default"> | |||
| <name>Merkle Trees</name> | ||||
| <t>The hash of an empty list is the hash of an empty string:</t> | <t>A full description of the Merkle Tree is beyond the scope of this | |||
| document. Briefly, it is a binary tree where each non-leaf node is a | ||||
| <figure><artwork><![CDATA[ | hash of its children. For CT, the number of children is at most two. | |||
| Additional information can be found in the Introduction and Reference | ||||
| sections of <xref target="RFC8391" format="default"/>.</t> | ||||
| <section anchor="mht_definition" numbered="true" toc="default"> | ||||
| <name>Definition of the Merkle Tree</name> | ||||
| <t>The log uses a binary Merkle Tree for efficient auditing. The hash | ||||
| algorithm used is one of the log's parameters (see <xref target="log_pa | ||||
| rameters" | ||||
| format="default"/>). This document establishes a registry of acceptable | ||||
| hash | ||||
| algorithms (see <xref target="hash_algorithms" format="default"/>). Thr | ||||
| oughout this | ||||
| document, the hash algorithm in use is referred to as HASH and the size | ||||
| of its | ||||
| output in bytes is referred to as HASH_SIZE. The input | ||||
| to the Merkle Tree Hash is a list of data entries; these entries will b | ||||
| e | ||||
| hashed to form the leaves of the Merkle Tree. The output is a single | ||||
| HASH_SIZE Merkle Tree Hash. Given an ordered list of n inputs, D_n = | ||||
| {d[0], d[1], ..., d[n-1]}, the Merkle Tree Hash (MTH) is thus defined a | ||||
| s | ||||
| follows:</t> | ||||
| <t>The hash of an empty list is the hash of an empty string:</t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| MTH({}) = HASH(). | MTH({}) = HASH(). | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The hash of a list with one entry (also known as a leaf hash) is:</ | ||||
| <t>The hash of a list with one entry (also known as a leaf hash) is:</t> | t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| MTH({d[0]}) = HASH(0x00 || d[0]). | MTH({d[0]}) = HASH(0x00 || d[0]). | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>For n > 1, let k be the largest power of two smaller than n | ||||
| <t>For n > 1, let k be the largest power of two smaller than n | (i.e., k < n <= 2k). | |||
| (i.e., k < n <= 2k). | The Merkle Tree Hash of an n-element list D_n is then defined recursive | |||
| The Merkle Tree Hash of an n-element list D_n is then defined recursively as</t> | ly as:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| MTH(D_n) = HASH(0x01 || MTH(D[0:k]) || MTH(D[k:n])), | MTH(D_n) = HASH(0x01 || MTH(D[0:k]) || MTH(D[k:n])), | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>where:</t> | ||||
| <t>where:</t> | <ul spacing="normal"> | |||
| <li>|| denotes concatenation</li> | ||||
| <t><list style="symbols"> | <li>: denotes concatenation of lists</li> | |||
| <t>|| denotes concatenation</t> | <li>D[k1:k2] = D'_(k2-k1) denotes the list {d'[0] = d[k1], d'[1] = d | |||
| <t>: denotes concatenation of lists</t> | [k1+1], | |||
| <t>D[k1:k2] = D'_(k2-k1) denotes the list {d'[0] = d[k1], d'[1] = d[k1+1], | ..., d'[k2-k1-1] = d[k2-1]} of length (k2 - k1).</li> | |||
| …, d'[k2-k1-1] = d[k2-1]} of length (k2 - k1).</t> | </ul> | |||
| </list></t> | <t>Note that the hash calculations for leaves and nodes differ; this d | |||
| omain | ||||
| <t>Note that the hash calculations for leaves and nodes differ; this domain | ||||
| separation is required to give second preimage resistance.</t> | separation is required to give second preimage resistance.</t> | |||
| <t>Note that we do not require the length of the input list to be a po | ||||
| <t>Note that we do not require the length of the input list to be a power of two | wer of two. | |||
| . | ||||
| The resulting Merkle Tree may thus not be balanced; however, its shape is | The resulting Merkle Tree may thus not be balanced; however, its shape is | |||
| uniquely determined by the number of leaves. (Note: This Merkle Tree is | uniquely determined by the number of leaves. (Note: This Merkle Tree is | |||
| essentially the same as the history tree <xref target="CrosbyWallach"></xref> pr | essentially the same as the history tree proposed by <xref target="CrosbyWallach | |||
| oposal, except our | " format="default"/>, except our | |||
| definition handles non-full trees differently).</t> | definition handles non-full trees differently.)</t> | |||
| </section> | ||||
| </section> | <section anchor="verify_hash" numbered="true" toc="default"> | |||
| <section anchor="verify_hash" title="Verifying a Tree Head Given Entries"> | <name>Verifying a Tree Head Given Entries</name> | |||
| <t>When a client has a complete list of <tt>entries</tt> from <tt>0</t | ||||
| <t>When a client has a complete list of <spanx style="verb">entries</spanx> from | t> up to | |||
| <spanx style="verb">0</spanx> up to | <tt>tree_size - 1</tt> and wishes to verify this list against a tree head <tt>ro | |||
| <spanx style="verb">tree_size - 1</spanx> and wishes to verify this list against | ot_hash</tt> | |||
| a tree head <spanx style="verb">root_hash</spanx> | returned by the log for the same <tt>tree_size</tt>, the following algorithm may | |||
| returned by the log for the same <spanx style="verb">tree_size</spanx>, the foll | be | |||
| owing algorithm may be | ||||
| used:</t> | used:</t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t><list style="numbers"> | <li>Set <tt>stack</tt> to an empty stack.</li> | |||
| <t>Set <spanx style="verb">stack</spanx> to an empty stack.</t> | <li> | |||
| <t>For each <spanx style="verb">i</spanx> from <spanx style="verb">0</spanx> u | <t>For each <tt>i</tt> from <tt>0</tt> up to <tt>tree_size - 1</tt | |||
| p to <spanx style="verb">tree_size - 1</spanx>: <list style="numbers"> | >:</t> | |||
| <t>Push <spanx style="verb">HASH(0x00 || entries[i])</spanx> to <spanx sty | <ol spacing="normal" type="a"> | |||
| le="verb">stack</spanx>.</t> | <li>Push <tt>HASH(0x00 || entries[i])</tt> to <tt>stack</tt>.</li | |||
| <t>Set <spanx style="verb">merge_count</spanx> to the lowest value (<spanx | > | |||
| style="verb">0</spanx> included) such that <spanx style="verb">LSB(i >> | <li>Set <tt>merge_count</tt> to the lowest value (<tt>0</tt> inc | |||
| merge_count)</spanx> is not set, where <spanx style="verb">LSB</spanx> means the | luded) | |||
| least significant bit. | such that <tt>LSB(i >> merge_count)</tt> is not set, where | |||
| In other words, set <spanx style="verb">merge_count</spanx> to the number | <tt>LSB</tt> means the least significant | |||
| of consecutive <spanx style="verb">1</spanx>s found starting at the least signif | bit. In other words, set <tt>merge_count</tt> to the number | |||
| icant bit of <spanx style="verb">i</spanx>.</t> | of consecutive <tt>1</tt>s found starting at the least significan | |||
| <t>Repeat <spanx style="verb">merge_count</spanx> times: <list style= | t bit of | |||
| "numbers"> | <tt>i</tt>.</li> | |||
| <t>Pop <spanx style="verb">right</spanx> from <spanx style="verb">stac | <li> | |||
| k</spanx>.</t> | <t>Repeat <tt>merge_count</tt> times:</t> | |||
| <t>Pop <spanx style="verb">left</spanx> from <spanx style="verb">stack | <ol spacing="normal" type="i"> | |||
| </spanx>.</t> | <li>Pop <tt>right</tt> from <tt>stack</tt>.</li> | |||
| <t>Push <spanx style="verb">HASH(0x01 || left || right)</spanx> to <sp | <li>Pop <tt>left</tt> from <tt>stack</tt>.</li> | |||
| anx style="verb">stack</spanx>.</t> | <li>Push <tt>HASH(0x01 || left || right)</tt> to <tt>stack</ | |||
| </list></t> | tt>.</li> | |||
| </list></t> | </ol> | |||
| <t>If there is more than one element in the <spanx style="verb">stack</spanx>, | </li> | |||
| repeat the same merge | </ol> | |||
| procedure (the sub-items of Step 2.3 above) until only a single element | </li> | |||
| remains.</t> | <li>If there is more than one element in the <tt>stack</tt>, repeat | |||
| <t>The remaining element in <spanx style="verb">stack</spanx> is the Merkle Tr | the same merge | |||
| ee hash for the given | procedure (the sub-items of Step 2(c) above) until only a single element | |||
| <spanx style="verb">tree_size</spanx> and should be compared by equality against | remains.</li> | |||
| the supplied | <li>The remaining element in <tt>stack</tt> is the Merkle Tree Hash | |||
| <spanx style="verb">root_hash</spanx>.</t> | for the given | |||
| </list></t> | <tt>tree_size</tt> and should be compared by equality against the supplied | |||
| <tt>root_hash</tt>.</li> | ||||
| </section> | </ol> | |||
| <section anchor="merkle_inclusion_proof" title="Merkle Inclusion Proofs"> | </section> | |||
| <section anchor="merkle_inclusion_proof" numbered="true" toc="default"> | ||||
| <t>A Merkle inclusion proof for a leaf in a Merkle Hash Tree is the shortest lis | <name>Merkle Inclusion Proofs</name> | |||
| t | <t>A Merkle inclusion proof for a leaf in a Merkle Tree is the shortes | |||
| t list | ||||
| of additional nodes in the Merkle Tree required to compute the Merkle Tree Hash | of additional nodes in the Merkle Tree required to compute the Merkle Tree Hash | |||
| for that tree. Each node in the tree is either a leaf node or is computed from | for that tree. Each node in the tree is either a leaf node or is computed from | |||
| the two nodes immediately below it (i.e., towards the leaves). At each step up | the two nodes immediately below it (i.e., towards the leaves). At each step up | |||
| the tree (towards the root), a node from the inclusion proof is combined with | the tree (towards the root), a node from the inclusion proof is combined with | |||
| the node computed so far. In other words, the inclusion proof consists of the | the node computed so far. In other words, the inclusion proof consists of the | |||
| list of missing nodes required to compute the nodes leading from a leaf to the | list of missing nodes required to compute the nodes leading from a leaf to the | |||
| root of the tree. If the root computed from the inclusion proof matches the true | root of the tree. If the root computed from the inclusion proof matches the true | |||
| root, then the inclusion proof proves that the leaf exists in the tree.</t> | root, then the inclusion proof proves that the leaf exists in the tree.</t> | |||
| <section anchor="generating-an-inclusion-proof" numbered="true" toc="d | ||||
| <section anchor="generating-an-inclusion-proof" title="Generating an Inclusion P | efault"> | |||
| roof"> | <name>Generating an Inclusion Proof</name> | |||
| <t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], | ||||
| <t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], …, | ..., | |||
| d[n-1]}, the Merkle inclusion proof PATH(m, D_n) for the (m+1)th input d[m], | d[n-1]}, the Merkle inclusion proof PATH(m, D_n) for the (m+1)th input d[m], | |||
| 0 <= m < n, is defined as follows:</t> | 0 <= m < n, is defined as follows:</t> | |||
| <t>The proof for the single leaf in a tree with a one-element input | ||||
| <t>The proof for the single leaf in a tree with a one-element input list D[1] = | list D[1] = | |||
| {d[0]} is empty:</t> | {d[0]} is empty:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| PATH(0, {d[0]}) = {} | PATH(0, {d[0]}) = {} | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>For n > 1, let k be the largest power of two smaller than n. T | ||||
| <t>For n > 1, let k be the largest power of two smaller than n. The proof for | he proof for the | |||
| the | (m+1)th element d[m] in a list of n > m elements is then defined recursively | |||
| (m+1)th element d[m] in a list of n > m elements is then defined recursively | as:</t> | |||
| as</t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| PATH(m, D_n) = PATH(m, D[0:k]) : MTH(D[k:n]) for m < k; and | PATH(m, D_n) = PATH(m, D[0:k]) : MTH(D[k:n]) for m < k; and | |||
| PATH(m, D_n) = PATH(m - k, D[k:n]) : MTH(D[0:k]) for m >= k, | PATH(m, D_n) = PATH(m - k, D[k:n]) : MTH(D[0:k]) for m >= k, | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The : operator and D[k1:k2] are defined the same as in <xref targ | ||||
| <t>The : operator and D[k1:k2] are defined the same as in <xref target="mht_defi | et="mht_definition" format="default"/>.</t> | |||
| nition"/>.</t> | </section> | |||
| <section anchor="verify_inclusion" numbered="true" toc="default"> | ||||
| </section> | <name>Verifying an Inclusion Proof</name> | |||
| <section anchor="verify_inclusion" title="Verifying an Inclusion Proof"> | <t>When a client has received an inclusion proof (e.g., in a <tt>Tra | |||
| nsItem</tt> of type | ||||
| <t>When a client has received an inclusion proof (e.g., in a <spanx style="verb" | <tt>inclusion_proof_v2</tt>) and wishes to verify inclusion of an input <tt>hash | |||
| >TransItem</spanx> of type | </tt> for a | |||
| <spanx style="verb">inclusion_proof_v2</spanx>) and wishes to verify inclusion o | given <tt>tree_size</tt> and <tt>root_hash</tt>, the following algorithm may be | |||
| f an input <spanx style="verb">hash</spanx> for a | used to prove | |||
| given <spanx style="verb">tree_size</spanx> and <spanx style="verb">root_hash</s | the <tt>hash</tt> was included in the <tt>root_hash</tt>:</t> | |||
| panx>, the following algorithm may be used to prove | <ol spacing="normal" type="1"> | |||
| the <spanx style="verb">hash</spanx> was included in the <spanx style="verb">roo | <li>Compare <tt>leaf_index</tt> from the <tt>inclusion_proof_v2</tt | |||
| t_hash</spanx>:</t> | > structure | |||
| against <tt>tree_size</tt>. If <tt>leaf_index</tt> is greater than | ||||
| <t><list style="numbers"> | or | |||
| <t>Compare <spanx style="verb">leaf_index</spanx> from the <spanx style="verb" | equal to <tt>tree_size</tt>, then fail the proof verification.</li> | |||
| >inclusion_proof_v2</spanx> structure | <li>Set <tt>fn</tt> to <tt>leaf_index</tt> and <tt>sn</tt> to <tt> | |||
| against <spanx style="verb">tree_size</spanx>. If <spanx style="verb">leaf_index | tree_size - | |||
| </spanx> is greater than or | 1</tt>.</li> | |||
| equal to <spanx style="verb">tree_size</spanx> then fail the proof verification. | <li>Set <tt>r</tt> to <tt>hash</tt>.</li> | |||
| </t> | <li> | |||
| <t>Set <spanx style="verb">fn</spanx> to <spanx style="verb">leaf_index</spanx | <t>For each value <tt>p</tt> in the <tt>inclusion_path</tt> arra | |||
| > and <spanx style="verb">sn</spanx> to <spanx style="verb">tree_size - 1</spanx | y:</t> | |||
| >.</t> | <ol spacing="normal" type="a"> | |||
| <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">hash</spanx>.</t> | <li>If <tt>sn</tt> is 0, then stop the iteration and fail the | |||
| <t>For each value <spanx style="verb">p</spanx> in the <spanx style="verb">inc | proof verification.</li> | |||
| lusion_path</spanx> array: <vspace blankLines='1'/> | <li> | |||
| If <spanx style="verb">sn</spanx> is 0, stop the iteration and fail the proof ve | <t>If <tt>LSB(fn)</tt> is set, or if <tt>fn</tt> is equal to | |||
| rification. <vspace blankLines='1'/> | <tt>sn</tt>, then:</t> | |||
| If <spanx style="verb">LSB(fn)</spanx> is set, or if <spanx style="verb">fn</spa | <ol spacing="normal" type="i"> | |||
| nx> is equal to <spanx style="verb">sn</spanx>, then: <list style="numbers"> | <li>Set <tt>r</tt> to <tt>HASH(0x01 || p || r)</tt>.</li> | |||
| <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">HASH(0x01 || p | <li>If <tt>LSB(fn)</tt> is not set, then right-shift both | |||
| || r)</spanx></t> | <tt>fn</tt> and | |||
| <t>If <spanx style="verb">LSB(fn)</spanx> is not set, then right-shift bot | <tt>sn</tt> equally until either <tt>LSB(fn)</tt> is set | |||
| h <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally | or <tt>fn</tt> is <tt>0</tt>.</li> | |||
| until either <spanx style="verb">LSB(fn)</spanx> is set or <spanx style="verb">f | </ol> | |||
| n</spanx> is <spanx style="verb">0</spanx>.</t> | <t>Otherwise:</t> | |||
| </list> | <ol spacing="normal" type="i"> | |||
| Otherwise: <list style="numbers"> | <li>Set <tt>r</tt> to <tt>HASH(0x01 || r || p)</tt>.</li> | |||
| <t>Set <spanx style="verb">r</spanx> to <spanx style="verb">HASH(0x01 || r | </ol> | |||
| || p)</spanx></t> | </li> | |||
| </list> | <li>Finally, right-shift both <tt>fn</tt> and <tt>sn</tt> one | |||
| Finally, right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb" | time.</li> | |||
| >sn</spanx> one time.</t> | </ol> | |||
| <t>Compare <spanx style="verb">sn</spanx> to 0. Compare <spanx style="verb">r< | </li> | |||
| /spanx> against the <spanx style="verb">root_hash</spanx>. If <spanx style="verb | <li>Compare <tt>sn</tt> to 0. Compare <tt>r</tt> against the | |||
| ">sn</spanx> is equal to | <tt>root_hash</tt>. If <tt>sn</tt> is equal to | |||
| 0, and <spanx style="verb">r</spanx> and the <spanx style="verb">root_hash</span | 0 and <tt>r</tt> and the <tt>root_hash</tt> are equal, then the log | |||
| x> are equal, then the log has proven the | has proven | |||
| inclusion of <spanx style="verb">hash</spanx>. Otherwise, fail the proof verific | the inclusion of <tt>hash</tt>. Otherwise, fail the proof verificat | |||
| ation.</t> | ion.</li> | |||
| </list></t> | </ol> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="consistency" numbered="true" toc="default"> | |||
| <section anchor="consistency" title="Merkle Consistency Proofs"> | <name>Merkle Consistency Proofs</name> | |||
| <t>Merkle consistency proofs prove the append-only property of the tre | ||||
| <t>Merkle consistency proofs prove the append-only property of the tree. A Merkl | e. A Merkle | |||
| e | ||||
| consistency proof for a Merkle Tree Hash MTH(D_n) and a previously advertised | consistency proof for a Merkle Tree Hash MTH(D_n) and a previously advertised | |||
| hash MTH(D[0:m]) of the first m leaves, m <= n, is the list of nodes in the | hash MTH(D[0:m]) of the first m leaves, m <= n, is the list of nodes in the | |||
| Merkle Tree required to verify that the first m inputs D[0:m] are equal in both | Merkle Tree required to verify that the first m inputs D[0:m] are equal in both | |||
| trees. Thus, a consistency proof must contain a set of intermediate nodes (i.e., | trees. Thus, a consistency proof must contain a set of intermediate nodes (i.e., | |||
| commitments to inputs) sufficient to verify MTH(D_n), such that (a subset of) | commitments to inputs) sufficient to verify MTH(D_n), such that (a subset of) | |||
| the same nodes can be used to verify MTH(D[0:m]). We define an algorithm that | the same nodes can be used to verify MTH(D[0:m]). We define an algorithm that | |||
| outputs the (unique) minimal consistency proof.</t> | outputs the (unique) minimal consistency proof.</t> | |||
| <section anchor="generating-a-consistency-proof" numbered="true" toc=" | ||||
| <section anchor="generating-a-consistency-proof" title="Generating a Consistency | default"> | |||
| Proof"> | <name>Generating a Consistency Proof</name> | |||
| <t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], | ||||
| <t>Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], …, | ..., | |||
| d[n-1]}, the Merkle consistency proof PROOF(m, D_n) for a previous Merkle Tree | d[n-1]}, the Merkle consistency proof PROOF(m, D_n) for a previous Merkle Tree | |||
| Hash MTH(D[0:m]), 0 < m < n, is defined as:</t> | Hash MTH(D[0:m]), 0 < m < n, is defined as:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| PROOF(m, D_n) = SUBPROOF(m, D_n, true) | PROOF(m, D_n) = SUBPROOF(m, D_n, true) | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>In SUBPROOF, the boolean value represents whether the subtree cre | ||||
| <t>In SUBPROOF, the boolean value represents whether the subtree created from | ated from | |||
| D[0:m] is a complete subtree of the Merkle Tree created from D_n, and, | D[0:m] is a complete subtree of the Merkle Tree created from D_n and, | |||
| consequently, whether the subtree Merkle Tree Hash MTH(D[0:m]) is known. The | consequently, whether the subtree Merkle Tree Hash MTH(D[0:m]) is kno | |||
| initial call to SUBPROOF sets this to be true, and SUBPROOF is then defined as | wn. The | |||
| follows:</t> | initial call to SUBPROOF sets this to be true, and SUBPROOF is then d | |||
| efined as | ||||
| <t>The subproof for m = n is empty if m is the value for which PROOF was origina | follows:</t> | |||
| lly | <t>The subproof for m = n is empty if m is the value for which PROOF | |||
| requested (meaning that the subtree created from D[0:m] is a complete subtree | was | |||
| of the Merkle Tree created from the original D_n for which PROOF was | originally requested (meaning that the subtree created from D[0:m] is | |||
| requested, and the subtree Merkle Tree Hash MTH(D[0:m]) is known):</t> | a complete | |||
| subtree of the Merkle Tree created from the original D_n for which PR | ||||
| <figure><artwork><![CDATA[ | OOF was | |||
| requested and the subtree Merkle Tree Hash MTH(D[0:m]) is known):</t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| SUBPROOF(m, D_m, true) = {} | SUBPROOF(m, D_m, true) = {} | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>Otherwise, the subproof for m = n is the Merkle Tree Hash committ | ||||
| <t>Otherwise, the subproof for m = n is the Merkle Tree Hash committing inputs | ing inputs | |||
| D[0:m]:</t> | D[0:m]:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| SUBPROOF(m, D_m, false) = {MTH(D_m)} | SUBPROOF(m, D_m, false) = {MTH(D_m)} | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>For m < n, let k be the largest power of two smaller than n. T | ||||
| <t>For m < n, let k be the largest power of two smaller than n. The subproof | he subproof is | |||
| is | then defined recursively, using the appropriate step below:</t> | |||
| then defined recursively, using the appropriate step below:</t> | <t>If m <= k, the right subtree entries D[k:n] only exist in the | |||
| current tree. | ||||
| <t>If m <= k, the right subtree entries D[k:n] only exist in the current tree | We prove that the left subtree entries D[0:k] are consistent and add | |||
| . | a | |||
| We prove that the left subtree entries D[0:k] are consistent and add a | commitment to D[k:n]:</t> | |||
| commitment to D[k:n]:</t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| SUBPROOF(m, D_n, b) = SUBPROOF(m, D[0:k], b) : MTH(D[k:n]) | SUBPROOF(m, D_n, b) = SUBPROOF(m, D[0:k], b) : MTH(D[k:n]) | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>If m > k, the left subtree entries D[0:k] are identical in bo | ||||
| <t>If m > k, the left subtree entries D[0:k] are identical in both trees. We | th trees. We | |||
| prove | prove that the right subtree entries D[k:n] are consistent and add a | |||
| that the right subtree entries D[k:n] are consistent and add a commitment to | commitment | |||
| D[0:k].</t> | to D[0:k]:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| SUBPROOF(m, D_n, b) = SUBPROOF(m - k, D[k:n], false) : MTH(D[0:k]) | SUBPROOF(m, D_n, b) = SUBPROOF(m - k, D[k:n], false) : MTH(D[0:k]) | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The number of nodes in the resulting proof is bounded above by ce | ||||
| <t>The number of nodes in the resulting proof is bounded above by ceil(log2(n)) | il(log2(n)) + | |||
| + | ||||
| 1.</t> | 1.</t> | |||
| <t>The : operator and D[k1:k2] are defined the same as in <xref targ | ||||
| <t>The : operator and D[k1:k2] are defined the same as in <xref target="mht_defi | et="mht_definition" format="default"/>.</t> | |||
| nition"/>.</t> | </section> | |||
| <section anchor="verify_consistency" numbered="true" toc="default"> | ||||
| </section> | <name>Verifying Consistency between Two Tree Heads</name> | |||
| <section anchor="verify_consistency" title="Verifying Consistency between Two Tr | <t>When a client has a tree head <tt>first_hash</tt> for tree size | |||
| ee Heads"> | <tt>first</tt>, has a tree head | |||
| <tt>second_hash</tt> for tree size <tt>second</tt> where <tt>0 < f | ||||
| <t>When a client has a tree head <spanx style="verb">first_hash</spanx> for tree | irst < | |||
| size <spanx style="verb">first</spanx>, a tree head | second</tt>, and has received a consistency proof between the two (e. | |||
| <spanx style="verb">second_hash</spanx> for tree size <spanx style="verb">second | g., in a | |||
| </spanx> where <spanx style="verb">0 < first < second</spanx>, and has | <tt>TransItem</tt> of type | |||
| received a consistency proof between the two (e.g., in a <spanx style="verb">Tra | <tt>consistency_proof_v2</tt>), the following algorithm may be used t | |||
| nsItem</spanx> of type | o verify the | |||
| <spanx style="verb">consistency_proof_v2</spanx>), the following algorithm may b | consistency proof:</t> | |||
| e used to verify the | <ol spacing="normal" type="1"> | |||
| consistency proof:</t> | <li>If <tt>consistency_path</tt> is an empty array, stop and fail t | |||
| he proof | ||||
| <t><list style="numbers"> | verification.</li> | |||
| <t>If <spanx style="verb">consistency_path</spanx> is an empty array, stop and | <li>If <tt>first</tt> is an exact power of 2, then prepend <tt>fir | |||
| fail the proof | st_hash</tt> | |||
| verification.</t> | to the <tt>consistency_path</tt> array.</li> | |||
| <t>If <spanx style="verb">first</spanx> is an exact power of 2, then prepend < | <li>Set <tt>fn</tt> to <tt>first - 1</tt> and <tt>sn</tt> to <tt>s | |||
| spanx style="verb">first_hash</spanx> to the | econd - | |||
| <spanx style="verb">consistency_path</spanx> array.</t> | 1</tt>.</li> | |||
| <t>Set <spanx style="verb">fn</spanx> to <spanx style="verb">first - 1</spanx> | <li>If <tt>LSB(fn)</tt> is set, then right-shift both <tt>fn</tt> | |||
| and <spanx style="verb">sn</spanx> to <spanx style="verb">second - 1</spanx>.</ | and | |||
| t> | <tt>sn</tt> equally until <tt>LSB(fn)</tt> is not set.</li> | |||
| <t>If <spanx style="verb">LSB(fn)</spanx> is set, then right-shift both <spanx | <li>Set both <tt>fr</tt> and <tt>sr</tt> to the first value in the | |||
| style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally until | <tt>consistency_path</tt> array.</li> | |||
| <spanx style="verb">LSB(fn)</spanx> is not set.</t> | <li> | |||
| <t>Set both <spanx style="verb">fr</spanx> and <spanx style="verb">sr</spanx> | <t>For each subsequent value <tt>c</tt> in the <tt>consistency_p | |||
| to the first value in the <spanx style="verb">consistency_path</spanx> array.</t | ath</tt> array:</t> | |||
| > | <ol spacing="normal" type="a"> | |||
| <t>For each subsequent value <spanx style="verb">c</spanx> in the <spanx style | <li>If <tt>sn</tt> is 0, then stop the iteration and fail the | |||
| ="verb">consistency_path</spanx> array: <vspace blankLines='1'/> | proof verification.</li> | |||
| If <spanx style="verb">sn</spanx> is 0, stop the iteration and fail the proof ve | <li> | |||
| rification. <vspace blankLines='1'/> | <t>If <tt>LSB(fn)</tt> is set, or if <tt>fn</tt> is equal to | |||
| If <spanx style="verb">LSB(fn)</spanx> is set, or if <spanx style="verb">fn</spa | <tt>sn</tt>, then:</t> | |||
| nx> is equal to <spanx style="verb">sn</spanx>, then: <list style="numbers"> | <ol spacing="normal" type="i"> | |||
| <t>Set <spanx style="verb">fr</spanx> to <spanx style="verb">HASH(0x01 || | <li>Set <tt>fr</tt> to <tt>HASH(0x01 || c || fr)</tt>.</li | |||
| c || fr)</spanx><vspace /> | > | |||
| Set <spanx style="verb">sr</spanx> to <spanx style="verb">HASH(0x01 || c || sr)< | <li>Set <tt>sr</tt> to <tt>HASH(0x01 || c || sr)</tt>.</li | |||
| /spanx></t> | > | |||
| <t>If <spanx style="verb">LSB(fn)</spanx> is not set, then right-shift bot | <li>If <tt>LSB(fn)</tt> is not set, then right-shift both | |||
| h <spanx style="verb">fn</spanx> and <spanx style="verb">sn</spanx> equally | <tt>fn</tt> and <tt>sn</tt> | |||
| until either <spanx style="verb">LSB(fn)</spanx> is set or <spanx style="verb">f | equally until either <tt>LSB(fn)</tt> is set or <tt>fn</ | |||
| n</spanx> is <spanx style="verb">0</spanx>.</t> | tt> is <tt>0</tt>.</li> | |||
| </list> | </ol> | |||
| Otherwise: <list style="numbers"> | <t>Otherwise:</t> | |||
| <t>Set <spanx style="verb">sr</spanx> to <spanx style="verb">HASH(0x01 || | <ol spacing="normal" type="i"> | |||
| sr || c)</spanx></t> | <li>Set <tt>sr</tt> to <tt>HASH(0x01 || sr || c)</tt>.</li | |||
| </list> | > | |||
| Finally, right-shift both <spanx style="verb">fn</spanx> and <spanx style="verb" | </ol> | |||
| >sn</spanx> one time.</t> | </li> | |||
| <t>After completing iterating through the <spanx style="verb">consistency_path | <li>Finally, right-shift both <tt>fn</tt> and <tt>sn</tt> one | |||
| </spanx> array as described | time.</li> | |||
| above, verify that the <spanx style="verb">fr</spanx> calculated is equal to the | </ol> | |||
| <spanx style="verb">first_hash</spanx> supplied, | </li> | |||
| that the <spanx style="verb">sr</spanx> calculated is equal to the <spanx style= | <li>After completing iterating through the <tt>consistency_path</t | |||
| "verb">second_hash</spanx> supplied and that <spanx style="verb">sn</spanx> | t> array as | |||
| is 0.</t> | described above, verify that the <tt>fr</tt> calculated is equal to | |||
| </list></t> | the | |||
| <tt>first_hash</tt> supplied, that the <tt>sr</tt> calculated is eq | ||||
| </section> | ual to the | |||
| </section> | <tt>second_hash</tt> supplied, and that <tt>sn</tt> is 0.</li> | |||
| <section anchor="example" title="Example"> | </ol> | |||
| </section> | ||||
| <t>The binary Merkle Tree with 7 leaves:</t> | </section> | |||
| <section anchor="example" numbered="true" toc="default"> | ||||
| <figure><artwork><![CDATA[ | <name>Example</name> | |||
| <t>The following is a binary Merkle Tree with 7 leaves:</t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| hash | hash | |||
| / \ | / \ | |||
| / \ | / \ | |||
| / \ | / \ | |||
| / \ | / \ | |||
| / \ | / \ | |||
| k l | k l | |||
| / \ / \ | / \ / \ | |||
| / \ / \ | / \ / \ | |||
| / \ / \ | / \ / \ | |||
| g h i j | g h i j | |||
| / \ / \ / \ | | / \ / \ / \ | | |||
| a b c d e f d6 | a b c d e f d6 | |||
| | | | | | | | | | | | | | | |||
| d0 d1 d2 d3 d4 d5 | d0 d1 d2 d3 d4 d5 | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The inclusion proof for <tt>d0</tt> is [<tt>b</tt>, <tt>h</tt>, <tt | ||||
| <t>The inclusion proof for d0 is [b, h, l].</t> | >l</tt>].</t> | |||
| <t>The inclusion proof for <tt>d3</tt> is [<tt>c</tt>, <tt>g</tt>, <tt | ||||
| <t>The inclusion proof for d3 is [c, g, l].</t> | >l</tt>].</t> | |||
| <t>The inclusion proof for <tt>d4</tt> is [<tt>f</tt>, <tt>j</tt>, <tt | ||||
| <t>The inclusion proof for d4 is [f, j, k].</t> | >k</tt>].</t> | |||
| <t>The inclusion proof for <tt>d6</tt> is [<tt>i</tt>, <tt>k</tt>].</t | ||||
| <t>The inclusion proof for d6 is [i, k].</t> | > | |||
| <t>The same tree, built incrementally in four steps:</t> | ||||
| <t>The same tree, built incrementally in four steps:</t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| hash0 hash1=k | hash0 hash1=k | |||
| / \ / \ | / \ / \ | |||
| / \ / \ | / \ / \ | |||
| / \ / \ | / \ / \ | |||
| g c g h | g c g h | |||
| / \ | / \ / \ | / \ | / \ / \ | |||
| a b d2 a b c d | a b d2 a b c d | |||
| | | | | | | | | | | | | | | |||
| d0 d1 d0 d1 d2 d3 | d0 d1 d0 d1 d2 d3 | |||
| skipping to change at line 526 ¶ | skipping to change at line 489 ¶ | |||
| / \ / \ | / \ / \ | |||
| k i k l | k i k l | |||
| / \ / \ / \ / \ | / \ / \ / \ / \ | |||
| / \ e f / \ / \ | / \ e f / \ / \ | |||
| / \ | | / \ / \ | / \ | | / \ / \ | |||
| g h d4 d5 g h i j | g h d4 d5 g h i j | |||
| / \ / \ / \ / \ / \ | | / \ / \ / \ / \ / \ | | |||
| a b c d a b c d e f d6 | a b c d a b c d e f d6 | |||
| | | | | | | | | | | | | | | | | | | | | | | |||
| d0 d1 d2 d3 d0 d1 d2 d3 d4 d5 | d0 d1 d2 d3 d0 d1 d2 d3 d4 d5 | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The consistency proof between <tt>hash0</tt> and <tt>hash</tt> is P | ||||
| <t>The consistency proof between hash0 and hash is PROOF(3, D[7]) = [c, d, g, l] | ROOF(3, D[7]) = [<tt>c</tt>, <tt>d</tt>, <tt>g</tt>, <tt>l</tt>]. | |||
| . | Non-leaf nodes <tt>c</tt>, <tt>g</tt> are used to verify <tt>hash0</tt>, and non | |||
| c, g are used to verify hash0, and d, l are additionally used to show hash is | -leaf nodes <tt>d</tt>, <tt>l</tt> are additionally used to show <tt>hash</tt> i | |||
| consistent with hash0.</t> | s | |||
| consistent with <tt>hash0</tt>.</t> | ||||
| <t>The consistency proof between hash1 and hash is PROOF(4, D[7]) = [l]. hash ca | <t>The consistency proof between <tt>hash1</tt> and <tt>hash</tt> is P | |||
| n | ROOF(4, D[7]) = [<tt>l</tt>]. <tt>hash</tt> can | |||
| be verified using hash1=k and l.</t> | be verified using <tt>hash1</tt>=<tt>k</tt> and <tt>l</tt>.</t> | |||
| <t>The consistency proof between <tt>hash2</tt> and <tt>hash</tt> is P | ||||
| <t>The consistency proof between hash2 and hash is PROOF(6, D[7]) = [i, j, k]. | ROOF(6, D[7]) = [<tt>i</tt>, <tt>j</tt>, <tt>k</tt>]. | |||
| k, i are used to verify hash2, and j is additionally used to show hash is | Non-leaf nodes <tt>k</tt>, <tt>i</tt> are used to verify <tt>hash2</tt>, and non | |||
| consistent with hash2.</t> | -leaf node <tt>j</tt> is additionally used to show <tt>hash</tt> is | |||
| consistent with <tt>hash2</tt>.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="signatures" title="Signatures"> | <section anchor="signatures" numbered="true" toc="default"> | |||
| <name>Signatures</name> | ||||
| <t>When signing data structures, a log MUST use one of | <t>When signing data structures, a log <bcp14>MUST</bcp14> use one of | |||
| the signature algorithms from the IANA CT Signature Algorithms registry, | the signature algorithms from the IANA "Signature Algorithms" registry, | |||
| described in <xref target="signature_algorithms"/>.</t> | described in <xref target="signature_algorithms" format="default"/>.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="submitters" numbered="true" toc="default"> | |||
| <section anchor="submitters" title="Submitters"> | <name>Submitters</name> | |||
| <t>Submitters submit certificates or preannouncements of certificates prio | ||||
| <t>Submitters submit certificates or preannouncements of certificates prior to | r to | |||
| issuance (precertificates) to logs for public auditing, as described below. In | issuance (precertificates) to logs for public auditing, as described below. In | |||
| order to enable attribution of each logged certificate or precertificate to its | order to enable attribution of each logged certificate or precertificate to its | |||
| issuer, each submission MUST be accompanied by all additional certificates | issuer, each submission <bcp14>MUST</bcp14> be accompanied by all additional cer | |||
| required to verify the chain up to an accepted trust anchor (<xref target="get-a | tificates | |||
| nchors"/>). | required to verify the chain up to an accepted trust anchor (<xref target="get-a | |||
| The trust anchor (a root or intermediate CA certificate) MAY be omitted from the | nchors" format="default"/>). | |||
| The trust anchor (a root or intermediate CA certificate) <bcp14>MAY</bcp14> be o | ||||
| mitted from the | ||||
| submission.</t> | submission.</t> | |||
| <t>If a log accepts a submission, it will return a Signed Certificate Time | ||||
| <t>If a log accepts a submission, it will return a Signed Certificate Timestamp | stamp | |||
| (SCT) (see <xref target="sct"/>). The submitter SHOULD validate the returned SCT | (SCT) (see <xref target="sct" format="default"/>). The submitter <bcp14>SHOULD</ | |||
| as described | bcp14> validate the returned SCT, as described | |||
| in <xref target="tls_clients"/> if they understand its format and they intend to | in <xref target="tls_clients" format="default"/>, if they understand its format | |||
| use it | and they intend to use it | |||
| directly in a TLS handshake or to construct a certificate. If the submitter does | directly in a TLS handshake or to construct a certificate. If the submitter does | |||
| not need the SCT (for example, the certificate is being submitted simply to make | not need the SCT (for example, the certificate is being submitted simply to make | |||
| it available in the log), it MAY validate the SCT.</t> | it available in the log), it <bcp14>MAY</bcp14> validate the SCT.</t> | |||
| <section anchor="certificates" numbered="true" toc="default"> | ||||
| <section anchor="certificates" title="Certificates"> | <name>Certificates</name> | |||
| <t>Any entity can submit a certificate (<xref target="submit-entry" form | ||||
| <t>Any entity can submit a certificate (<xref target="submit-entry"/>) to a log. | at="default"/>) to a log. Since it is | |||
| Since it is | ||||
| anticipated that TLS clients will reject certificates that are not logged, it is | anticipated that TLS clients will reject certificates that are not logged, it is | |||
| expected that certificate issuers and subjects will be strongly motivated to | expected that certificate issuers and subjects will be strongly motivated to | |||
| submit them.</t> | submit them.</t> | |||
| </section> | ||||
| </section> | <section anchor="precertificates" numbered="true" toc="default"> | |||
| <section anchor="precertificates" title="Precertificates"> | <name>Precertificates</name> | |||
| <t>CAs may preannounce a certificate prior to issuance by submitting a | ||||
| <t>CAs may preannounce a certificate prior to issuance by submitting a | precertificate (<xref target="submit-entry" format="default"/>) that the log can | |||
| precertificate (<xref target="submit-entry"/>) that the log can use to create an | use to create an entry that | |||
| entry that | will be valid against the issued certificate. The CA <bcp14>MAY</bcp14> incorpor | |||
| will be valid against the issued certificate. The CA MAY incorporate the | ate the | |||
| returned SCT in the issued certificate. One example of where the returned SCT is | returned SCT in the issued certificate. One example of where the returned SCT is | |||
| not incorporated in the issued certificate is when a CA sends the precertificate | not incorporated in the issued certificate is when a CA sends the precertificate | |||
| to multiple logs, but only incorporates the SCTs that are returned first.</t> | to multiple logs but only incorporates the SCTs that are returned first.</t> | |||
| <t>A precertificate is a CMS <xref target="RFC5652" format="default"/> < | ||||
| <t>A precertificate is a CMS <xref target="RFC5652"></xref> <spanx style="verb"> | tt>signed-data</tt> object that conforms to the | |||
| signed-data</spanx> object that conforms to the | ||||
| following profile:</t> | following profile:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>It <bcp14>MUST</bcp14> be DER encoded, as described in <xref targe | |||
| <t>It MUST be DER encoded as described in <xref target="X690"></xref>.</t> | t="X690" | |||
| <t><spanx style="verb">SignedData.version</spanx> MUST be v3(3).</t> | format="default"/>.</li> | |||
| <t><spanx style="verb">SignedData.digestAlgorithms</spanx> MUST be the same as | <li><tt>SignedData.version</tt> <bcp14>MUST</bcp14> be v3(3).</li> | |||
| the | <li><tt>SignedData.digestAlgorithms</tt> <bcp14>MUST</bcp14> be the sa | |||
| <spanx style="verb">SignerInfo.digestAlgorithm</spanx> OID value (see below).</t | me as the | |||
| > | <tt>SignerInfo.digestAlgorithm</tt> OID value (see below).</li> | |||
| <t><spanx style="verb">SignedData.encapContentInfo</spanx>: | <li> | |||
| <list style="symbols"> | <t><tt>SignedData.encapContentInfo</tt>:</t> | |||
| <t><spanx style="verb">eContentType</spanx> MUST be the OID 1.3.101.78.</t | <ul spacing="normal"> | |||
| > | <li><tt>eContentType</tt> <bcp14>MUST</bcp14> be the OID 1.3.101.7 | |||
| <t><spanx style="verb">eContent</spanx> MUST contain a TBSCertificate <xre | 8.</li> | |||
| f target="RFC5280"></xref> that will be identical to | <li><tt>eContent</tt> <bcp14>MUST</bcp14> contain a TBSCertificate | |||
| the TBSCertificate in the issued certificate, except that the Transparency | <xref | |||
| Information (<xref target="x509v3_transinfo_extension"/>) extension MUST be omit | target="RFC5280" format="default"/> that will be identical to | |||
| ted.</t> | the TBSCertificate in the issued certificate, except that the Trans | |||
| </list></t> | parency | |||
| <t><spanx style="verb">SignedData.certificates</spanx> MUST be omitted.</t> | Information (<xref target="x509v3_transinfo_extension" format="defa | |||
| <t><spanx style="verb">SignedData.crls</spanx> MUST be omitted.</t> | ult"/>) | |||
| <t><spanx style="verb">SignedData.signerInfos</spanx> MUST contain one <spanx | extension <bcp14>MUST</bcp14> be omitted.</li> | |||
| style="verb">SignerInfo</spanx>: | </ul> | |||
| <list style="symbols"> | </li> | |||
| <t><spanx style="verb">version</spanx> MUST be v3(3).</t> | <li><tt>SignedData.certificates</tt> <bcp14>MUST</bcp14> be omitted.</ | |||
| <t><spanx style="verb">sid</spanx> MUST use the <spanx style="verb">subjec | li> | |||
| tKeyIdentifier</spanx> option.</t> | <li><tt>SignedData.crls</tt> <bcp14>MUST</bcp14> be omitted.</li> | |||
| <t><spanx style="verb">digestAlgorithm</spanx> MUST be one of the hash alg | <li><t><tt>SignedData.signerInfos</tt> <bcp14>MUST</bcp14> contain one | |||
| orithm OIDs listed in | <tt>SignerInfo</tt>:</t> | |||
| the IANA CT Hash Algorithms Registry, described in | <ul spacing="normal"> | |||
| <xref target="hash_algorithms"/>.</t> | <li><tt>version</tt> <bcp14>MUST</bcp14> be v3(3).</li> | |||
| <t><spanx style="verb">signedAttrs</spanx> MUST be present and MUST contai | <li><tt>sid</tt> <bcp14>MUST</bcp14> use the <tt>subjectKeyIdentif | |||
| n two attributes: | ier</tt> | |||
| <list style="symbols"> | option.</li> | |||
| <t>A content-type attribute whose value is the same as | <li><tt>digestAlgorithm</tt> <bcp14>MUST</bcp14> be one of the has | |||
| <spanx style="verb">SignedData.encapContentInfo.eContentType</spanx>.</t> | h algorithm | |||
| <t>A message-digest attribute whose value is the message digest of | OIDs listed in the IANA "Hash Algorithms" registry, described in | |||
| <spanx style="verb">SignedData.encapContentInfo.eContent</spanx>.</t> | <xref target="hash_algorithms" format="default"/>.</li> | |||
| </list></t> | <li> | |||
| <t><spanx style="verb">signatureAlgorithm</spanx> MUST be the same OID as | <t><tt>signedAttrs</tt> <bcp14>MUST</bcp14> be present and | |||
| <spanx style="verb">TBSCertificate.signature</spanx>.</t> | <bcp14>MUST</bcp14> contain two attributes:</t> | |||
| <t><spanx style="verb">signature</spanx> MUST be from the same (root or in | <ul spacing="normal"> | |||
| termediate) CA that intends to | <li>a content-type attribute whose value is the same as | |||
| issue the corresponding certificate (see <xref target="binding_intent_to_issue"/ | <tt>SignedData.encapContentInfo.eContentType</tt> and</li> | |||
| >).</t> | <li>a message-digest attribute whose value is the message dige | |||
| <t><spanx style="verb">unsignedAttrs</spanx> MUST be omitted.</t> | st of | |||
| </list></t> | <tt>SignedData.encapContentInfo.eContent</tt>.</li> | |||
| </list></t> | </ul> | |||
| </li> | ||||
| <t><spanx style="verb">SignerInfo.signedAttrs</spanx> is included in the message | <li><tt>signatureAlgorithm</tt> <bcp14>MUST</bcp14> be the same OI | |||
| digest calculation process | D as | |||
| (see Section 5.4 of <xref target="RFC5652"></xref>), which ensures that the <spa | <tt>TBSCertificate.signature</tt>.</li> | |||
| nx style="verb">SignerInfo.signature</spanx> | <li><tt>signature</tt> <bcp14>MUST</bcp14> be from the same (root | |||
| or | ||||
| intermediate) CA that intends to | ||||
| issue the corresponding certificate (see <xref target="binding_inte | ||||
| nt_to_issue" | ||||
| format="default"/>).</li> | ||||
| <li><tt>unsignedAttrs</tt> <bcp14>MUST</bcp14> be omitted.</li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t><tt>SignerInfo.signedAttrs</tt> is included in the message digest cal | ||||
| culation process | ||||
| (see <xref target="RFC5652" sectionFormat="of" section="5.4"/>), which ensures t | ||||
| hat the <tt>SignerInfo.signature</tt> | ||||
| value will not be a valid X.509v3 signature that could be used in conjunction | value will not be a valid X.509v3 signature that could be used in conjunction | |||
| with the TBSCertificate (from <spanx style="verb">SignedData.encapContentInfo.eC ontent</spanx>) to | with the TBSCertificate (from <tt>SignedData.encapContentInfo.eContent</tt>) to | |||
| construct a valid certificate.</t> | construct a valid certificate.</t> | |||
| <section anchor="binding_intent_to_issue" numbered="true" toc="default"> | ||||
| <section anchor="binding_intent_to_issue" title="Binding Intent to Issue"> | <name>Binding Intent to Issue</name> | |||
| <t>Under normal circumstances, there will be a short delay between pre | ||||
| <t>Under normal circumstances, there will be a short delay between precertificat | certificate | |||
| e | ||||
| submission and issuance of the corresponding certificate. Longer delays are to | submission and issuance of the corresponding certificate. Longer delays are to | |||
| be expected occasionally (e.g., due to log server downtime), and in some cases | be expected occasionally (e.g., due to log server downtime); in some cases, | |||
| the CA might not actually issue the corresponding certificate. Nevertheless, a | the CA might not actually issue the corresponding certificate. Nevertheless, a | |||
| precertificate's <spanx style="verb">signature</spanx> indicates the CA's bindin g intent to issue the | precertificate's <tt>signature</tt> indicates the CA's binding intent to issue t he | |||
| corresponding certificate, which means that:</t> | corresponding certificate, which means that:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>Misissuance of a precertificate is considered equivalent to misi | |||
| <t>Misissuance of a precertificate is considered equivalent to misissuance of | ssuance of | |||
| the corresponding certificate. The CA should expect to be held to account, | the corresponding certificate. The CA should expect to be held accoun | |||
| even if the corresponding certificate has not actually been issued.</t> | table, | |||
| <t>Upon observing a precertificate, a client can reasonably presume that the | even if the corresponding certificate has not actually been issued.</ | |||
| corresponding certificate has been issued. A client may wish to obtain status | li> | |||
| information (e.g., by using the Online Certificate Status Protocol <xref target= | <li>Upon observing a precertificate, a client can reasonably presume | |||
| "RFC6960"></xref> | that the | |||
| or by checking a Certificate Revocation List <xref target="RFC5280"></xref>) abo | corresponding certificate has been issued. A client may wish to obtai | |||
| ut a certificate | n status | |||
| that is presumed to exist, especially if there is evidence or suspicion that | information (e.g., by using the Online Certificate Status Protocol <x | |||
| the corresponding precertificate was misissued.</t> | ref | |||
| <t>TLS clients may have policies that require CAs to be able to revoke, and to | target="RFC6960" format="default"/> | |||
| provide certificate status services for, each certificate that is presumed to | or by checking a Certificate Revocation List <xref target="RFC5280" | |||
| exist based on the existence of a corresponding precertificate.</t> | format="default"/>) about a certificate | |||
| </list></t> | that is presumed to exist, especially if there is evidence or suspici | |||
| on that | ||||
| </section> | the corresponding precertificate was misissued.</li> | |||
| </section> | <li>TLS clients may have policies that require CAs to be able to rev | |||
| </section> | oke and to | |||
| <section anchor="log-format-and-operation" title="Log Format and Operation"> | provide certificate status services for each certificate that is pres | |||
| umed to | ||||
| <t>A log is a single, append-only Merkle Tree of submitted certificate and | exist based on the existence of a corresponding precertificate.</li> | |||
| </ul> | ||||
| </section> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="log-format-and-operation" numbered="true" toc="default"> | ||||
| <name>Log Format and Operation</name> | ||||
| <t>A log is a single, append-only Merkle Tree of submitted certificate and | ||||
| precertificate entries.</t> | precertificate entries.</t> | |||
| <t>When it receives and accepts a valid submission, the log <bcp14>MUST</b | ||||
| <t>When it receives and accepts a valid submission, the log MUST return an SCT t | cp14> return an SCT that | |||
| hat | ||||
| corresponds to the submitted certificate or precertificate. If the log has | corresponds to the submitted certificate or precertificate. If the log has | |||
| previously seen this valid submission, it SHOULD return the same SCT as it | previously seen this valid submission, it <bcp14>SHOULD</bcp14> return the same | |||
| returned before, as discussed in <xref target="misbehaving_logs"/>. | SCT as it | |||
| returned before, as discussed in <xref target="misbehaving_logs" format="default | ||||
| "/>. | ||||
| If different SCTs are produced for the same | If different SCTs are produced for the same | |||
| submission, multiple log entries will have to be created, one for each SCT (as | submission, multiple log entries will have to be created, one for each SCT (as | |||
| the timestamp is a part of the leaf structure). Note that if a certificate was | the timestamp is a part of the leaf structure). Note that if a certificate was | |||
| previously logged as a precertificate, then the precertificate's SCT of type | previously logged as a precertificate, then the precertificate's SCT of type | |||
| <spanx style="verb">precert_sct_v2</spanx> would not be appropriate; instead, a | <tt>precert_sct_v2</tt> would not be appropriate; instead, a fresh SCT of type | |||
| fresh SCT of type | <tt>x509_sct_v2</tt> should be generated.</t> | |||
| <spanx style="verb">x509_sct_v2</spanx> should be generated.</t> | <t>An SCT is the log's promise to append to its Merkle Tree an entry for t | |||
| he | ||||
| <t>An SCT is the log's promise to append to its Merkle Tree an entry for the | accepted submission. Upon producing an SCT, the log <bcp14>MUST</bcp14> fu | |||
| accepted submission. Upon producing an SCT, the log MUST fulfil this promise by | lfill this | |||
| performing the following actions within a fixed amount of time known as the | promise by performing the following actions within a fixed amount of time | |||
| Maximum Merge Delay (MMD), which is one of the log's parameters (see | known as the | |||
| <xref target="log_parameters"/>):</t> | Maximum Merge Delay (MMD), which is one of the log's parameters (see | |||
| <xref target="log_parameters" format="default"/>):</t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>Allocate a tree index to the entry representing the accepted submission.</t | <li>Allocate a tree index to the entry representing the accepted submiss | |||
| > | ion.</li> | |||
| <t>Calculate the root of the tree.</t> | <li>Calculate the root of the tree.</li> | |||
| <t>Sign the root of the tree (see <xref target="sth"/>).</t> | <li>Sign the root of the tree (see <xref target="sth" format="default"/> | |||
| </list></t> | ).</li> | |||
| </ul> | ||||
| <t>The log may append multiple entries before signing the root of the tree.</t> | <t>The log may append multiple entries before signing the root of the tree | |||
| .</t> | ||||
| <t>Log operators SHOULD NOT impose any conditions on retrieving or sharing data | <t>Log operators <bcp14>SHOULD NOT</bcp14> impose any conditions on retrie | |||
| ving or sharing data | ||||
| from the log.</t> | from the log.</t> | |||
| <section anchor="log_parameters" numbered="true" toc="default"> | ||||
| <section anchor="log_parameters" title="Log Parameters"> | <name>Log Parameters</name> | |||
| <t>A log is defined by a collection of immutable parameters, which are u | ||||
| <t>A log is defined by a collection of immutable parameters, which are used by | sed by | |||
| clients to communicate with the log and to verify log artifacts. Except for the | clients to communicate with the log and to verify log artifacts. Except for the | |||
| Final Signed Tree Head (STH), each of these parameters MUST be established | Final STH, each of these parameters <bcp14>MUST</bcp14> be established | |||
| before the log operator begins to operate the log.</t> | before the log operator begins to operate the log.</t> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>Base URL:</dt> | |||
| <t hangText="Base URL:"> | <dd>The prefix used to construct URLs <xref target="RFC3986" format="d | |||
| The prefix used to construct URLs (<xref target="RFC3986"></xref>) for client | efault"/> | |||
| messages (see | for client messages (see <xref target="client_messages" format="default | |||
| <xref target="client_messages"/>). The base URL MUST be an "https" URL, MAY cont | "/>). The | |||
| ain a port, | base URL <bcp14>MUST</bcp14> be an "https" URL, <bcp14>MAY</bcp14> cont | |||
| MAY contain a path with any number of path segments, but MUST NOT contain a | ain a port, | |||
| query string, fragment, or trailing "/". | and <bcp14>MAY</bcp14> contain a path with any number of path segments | |||
| Example: https://ct.example.org/blue</t> | but | |||
| <t hangText="Hash Algorithm:"> | <bcp14>MUST NOT</bcp14> contain a query string, fragment, or trailing " | |||
| The hash algorithm used for the Merkle Tree (see <xref target="hash_algorithms | /". | |||
| "/>).</t> | Example: https://ct.example.org/blue.</dd> | |||
| <t hangText="Signature Algorithm:"> | <dt>Hash Algorithm:</dt> | |||
| The signature algorithm used (see <xref target="signatures"/>).</t> | <dd>The hash algorithm used for the Merkle Tree (see <xref target="has | |||
| <t hangText="Public Key:"> | h_algorithms" | |||
| The public key used to verify signatures generated by the log. A log MUST NOT | format="default"/>).</dd> | |||
| use the same keypair as any other log.</t> | <dt>Signature Algorithm:</dt> | |||
| <t hangText="Log ID:"> | <dd>The signature algorithm used (see <xref target="signatures" | |||
| The OID that uniquely identifies the log.</t> | format="default"/>).</dd> | |||
| <t hangText="Maximum Merge Delay:"> | <dt>Public Key:</dt> | |||
| The MMD the log has committed to. | <dd>The public key used to verify signatures generated by the log. A l | |||
| This document deliberately does not specify any limits on the value, to allow | og | |||
| for experimentation.</t> | <bcp14>MUST NOT</bcp14> use the same keypair as any other log.</dd> | |||
| <t hangText="Version:"> | <dt>Log ID:</dt> | |||
| The version of the protocol supported by the log (currently 1 or 2).</t> | <dd>The OID that uniquely identifies the log.</dd> | |||
| <t hangText="Maximum Chain Length:"> | <dt>Maximum Merge Delay:</dt> | |||
| The longest certificate chain submission the log is willing to accept, if the | <dd>The MMD the log has committed to. This document deliberately does | |||
| log imposes | not specify | |||
| any limit.</t> | any limits on the value to allow for experimentation.</dd> | |||
| <t hangText="STH Frequency Count:"> | <dt>Version:</dt> | |||
| The maximum number of STHs the log may produce in any period equal to the | <dd>The version of the protocol supported by the log (currently 1 or 2 | |||
| <spanx style="verb">Maximum Merge Delay</spanx> (see <xref target="sth"/>).</t> | ).</dd> | |||
| <t hangText="Final STH:"> | <dt>Maximum Chain Length:</dt> | |||
| If a log has been closed down (i.e., no longer accepts new entries), existing | <dd>The longest certificate chain submission the log is willing to acc | |||
| entries may still be valid. In this case, the client should know the final | ept, if the | |||
| valid STH in the log to ensure no new entries can be added without detection. | log imposes any limit.</dd> | |||
| This value MUST be provided in the form of a TransItem of type | <dt>STH Frequency Count:</dt> | |||
| <spanx style="verb">signed_tree_head_v2</spanx>. | <dd>The maximum number of STHs the log may produce in any period equal | |||
| If a log is still accepting entries, this value should not be provided.</t> | to the | |||
| </list></t> | <tt>Maximum Merge Delay</tt> (see <xref target="sth" format="default"/> | |||
| ).</dd> | ||||
| <t><xref target="JSON.Metadata"></xref> is an example of a metadata format which | <dt>Final STH:</dt> | |||
| includes the above | <dd>If a log has been closed down (i.e., no longer accepts new entries | |||
| elements.</t> | ), existing | |||
| entries may still be valid. In this case, the client should know the fi | ||||
| </section> | nal | |||
| <section anchor="evaluating-submissions" title="Evaluating Submissions"> | valid STH in the log to ensure no new entries can be added without dete | |||
| ction. | ||||
| <t>A log determines whether to accept or reject a submission by evaluating it | This value <bcp14>MUST</bcp14> be provided in the form of a <tt>TransIt | |||
| against the minimum acceptance criteria (see <xref target="minimum_criteria"/>) | em</tt> of | |||
| and against | type <tt>signed_tree_head_v2</tt>. | |||
| the log's discretionary acceptance criteria (see <xref target="discretionary_cri | If a log is still accepting entries, this value should not be provided. | |||
| teria"/>).</t> | </dd> | |||
| </dl> | ||||
| <t>If the acceptance criteria are met, the log SHOULD accept the submission. (A | <t><xref target="JSON.Metadata" format="default"/> is an example of a me | |||
| log | tadata format | |||
| that includes the above elements.</t> | ||||
| </section> | ||||
| <section anchor="evaluating-submissions" numbered="true" toc="default"> | ||||
| <name>Evaluating Submissions</name> | ||||
| <t>A log determines whether to accept or reject a submission by evaluati | ||||
| ng it | ||||
| against the minimum acceptance criteria (see <xref target="minimum_criteria" for | ||||
| mat="default"/>) and against | ||||
| the log's discretionary acceptance criteria (see <xref target="discretionary_cri | ||||
| teria" format="default"/>).</t> | ||||
| <t>If the acceptance criteria are met, the log <bcp14>SHOULD</bcp14> acc | ||||
| ept the submission. (A log | ||||
| may decide, for example, to temporarily reject acceptable submissions to protect | may decide, for example, to temporarily reject acceptable submissions to protect | |||
| itself against denial-of-service attacks).</t> | itself against denial-of-service attacks.)</t> | |||
| <t>The log <bcp14>SHALL</bcp14> allow retrieval of its list of accepted | ||||
| <t>The log SHALL allow retrieval of its list of accepted trust anchors (see | trust anchors (see | |||
| <xref target="get-anchors"/>), each of which is a root or intermediate CA certif | <xref target="get-anchors" format="default"/>), each of which is a root or inter | |||
| icate. This | mediate CA certificate. This | |||
| list might usefully be the union of root certificates trusted by major browser | list might usefully be the union of root certificates trusted by major browser | |||
| vendors.</t> | vendors.</t> | |||
| <section anchor="minimum_criteria" numbered="true" toc="default"> | ||||
| <section anchor="minimum_criteria" title="Minimum Acceptance Criteria"> | <name>Minimum Acceptance Criteria</name> | |||
| <t>To ensure that logged certificates and precertificates are attribut | ||||
| <t>To ensure that logged certificates and precertificates are attributable to an | able to an | |||
| accepted trust anchor, to set clear expectations for what monitors would | accepted trust anchor, to set clear expectations for what monitors would | |||
| find in the log, and to avoid being overloaded by invalid submissions, the log | find in the log, and to avoid being overloaded by invalid submissions, the log | |||
| MUST reject a submission if any of the following conditions are not met:</t> | <bcp14>MUST</bcp14> reject a submission if any of the following conditions are n | |||
| ot met:</t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>The <spanx style="verb">submission</spanx>, <spanx style="verb">type</spanx | <li>The <tt>submission</tt>, <tt>type</tt>, and <tt>chain</tt> input | |||
| > and <spanx style="verb">chain</spanx> inputs MUST be set as described in | s | |||
| <xref target="submit-entry"/>. The log MUST NOT accommodate misordered CA certif | <bcp14>MUST</bcp14> be set as described in | |||
| icates or | <xref target="submit-entry" format="default"/>. The log <bcp14>MUST N | |||
| use any other source of intermediate CA certificates to attempt certification | OT</bcp14> | |||
| path construction.</t> | accommodate misordered CA certificates or | |||
| <t>Each of the zero or more intermediate CA certificates in the chain MUST hav | use any other source of intermediate CA certificates to attempt certi | |||
| e | fication | |||
| one or both of the following features: | path construction.</li> | |||
| <list style="symbols"> | <li> | |||
| <t>The Basic Constraints extension with the cA boolean asserted.</t> | <t>Each of the zero or more intermediate CA certificates in the cha | |||
| <t>The Key Usage extension with the keyCertSign bit asserted.</t> | in | |||
| </list></t> | <bcp14>MUST</bcp14> have one or both of the following features:</t> | |||
| <t>Each certificate in the chain MUST fall within the limits imposed by the ze | <ul spacing="normal"> | |||
| ro | <li>The Basic Constraints extension with the cA boolean asserted | |||
| or more Basic Constraints pathLenConstraint values found higher up the chain.</t | .</li> | |||
| > | <li>The Key Usage extension with the keyCertSign bit asserted.</ | |||
| <t>Precertificate submissions MUST conform to all of the requirements in | li> | |||
| <xref target="precertificates"/>.</t> | </ul> | |||
| </list></t> | </li> | |||
| <li>Each certificate in the chain <bcp14>MUST</bcp14> fall within th | ||||
| </section> | e limits | |||
| <section anchor="discretionary_criteria" title="Discretionary Acceptance Criteri | imposed by the zero | |||
| a"> | or more Basic Constraints pathLenConstraint values found higher up th | |||
| e chain.</li> | ||||
| <t>If the minimum acceptance criteria are met but the submission is not fully | <li>Precertificate submissions <bcp14>MUST</bcp14> conform to all of | |||
| valid according to <xref target="RFC5280"></xref> verification rules (e.g., the | the | |||
| certificate or | requirements in | |||
| precertificate has expired, is not yet valid, has been revoked, exhibits ASN.1 | <xref target="precertificates" format="default"/>.</li> | |||
| DER encoding errors but the log can still parse it, etc), then the acceptability | </ul> | |||
| of the submission is left to the log's discretion. It is useful for logs to | </section> | |||
| accept such submissions in order to accommodate quirks of CA certificate-issuing | <section anchor="discretionary_criteria" numbered="true" toc="default"> | |||
| software and to facilitate monitoring of CA compliance with applicable policies | <name>Discretionary Acceptance Criteria</name> | |||
| and technical standards. However, it is impractical for this document to | <t>If the minimum acceptance criteria are met but the submission is no | |||
| enumerate, and for logs to consider, all of the ways that a submission might | t fully | |||
| fail to comply with <xref target="RFC5280"></xref>.</t> | valid according to <xref target="RFC5280" format="default"/> verificati | |||
| on rules | ||||
| <t>Logs SHOULD limit the length of chain they will accept. The maximum chain len | (e.g., the certificate or | |||
| gth | precertificate has expired, is not yet valid, has been revoked, exhibit | |||
| is one of the log's parameters (see <xref target="log_parameters"/>).</t> | s ASN.1 | |||
| DER encoding errors but the log can still parse it, etc.), then the acc | ||||
| </section> | eptability | |||
| </section> | of the submission is left to the log's discretion. It is useful for log | |||
| <section anchor="log_entries" title="Log Entries"> | s to | |||
| accept such submissions in order to accommodate quirks of CA certificat | ||||
| <t>If a submission is accepted and an SCT issued, the accepting log MUST store t | e-issuing | |||
| he | software and to facilitate monitoring of CA compliance with applicable | |||
| entire chain used for verification. This chain MUST include the certificate or | policies | |||
| and technical standards. However, it is impractical for this document t | ||||
| o | ||||
| enumerate, and for logs to consider, all of the ways that a submission | ||||
| might | ||||
| fail to comply with <xref target="RFC5280" format="default"/>.</t> | ||||
| <t>Logs <bcp14>SHOULD</bcp14> limit the length of chain they will acce | ||||
| pt. The | ||||
| maximum chain length is one of the log's parameters (see <xref | ||||
| target="log_parameters" format="default"/>).</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="log_entries" numbered="true" toc="default"> | ||||
| <name>Log Entries</name> | ||||
| <t>If a submission is accepted and an SCT is issued, the accepting log < | ||||
| bcp14>MUST</bcp14> store the | ||||
| entire chain used for verification. This chain <bcp14>MUST</bcp14> include the c | ||||
| ertificate or | ||||
| precertificate itself, the zero or more intermediate CA certificates provided by | precertificate itself, the zero or more intermediate CA certificates provided by | |||
| the submitter, and the trust anchor used to verify the chain (even if it was | the submitter, and the trust anchor used to verify the chain (even if it was | |||
| omitted from the submission). The log MUST provide this chain for auditing upon | omitted from the submission). The log <bcp14>MUST</bcp14> provide this chain for | |||
| request (see <xref target="get-entries"/>) so that the CA cannot avoid blame by | auditing upon | |||
| request (see <xref target="get-entries" format="default"/>) so that the CA canno | ||||
| t avoid blame by | ||||
| logging a partial or empty chain. | logging a partial or empty chain. | |||
| Each log entry is a <spanx style="verb">TransItem</spanx> structure of type <spa | Each log entry is a <tt>TransItem</tt> structure of type <tt>x509_entry_v2</tt> | |||
| nx style="verb">x509_entry_v2</spanx> or | or | |||
| <spanx style="verb">precert_entry_v2</spanx>. However, a log may store its entri | <tt>precert_entry_v2</tt>. However, a log may store its entries in any format. I | |||
| es in any format. If a | f a | |||
| log does not store this <spanx style="verb">TransItem</spanx> in full, it must s | log does not store this <tt>TransItem</tt> in full, it must store the <tt>timest | |||
| tore the <spanx style="verb">timestamp</spanx> | amp</tt> | |||
| and <spanx style="verb">sct_extensions</spanx> of the corresponding <spanx style | and <tt>sct_extensions</tt> of the corresponding <tt>TimestampedCertificateEntry | |||
| ="verb">TimestampedCertificateEntryDataV2</spanx> | DataV2</tt> | |||
| structure. The <spanx style="verb">TransItem</spanx> can be reconstructed from t | structure. The <tt>TransItem</tt> can be reconstructed from these fields and the | |||
| hese fields and the entire | entire | |||
| chain that the log used to verify the submission.</t> | chain that the log used to verify the submission.</t> | |||
| </section> | ||||
| </section> | <section anchor="log_id" numbered="true" toc="default"> | |||
| <section anchor="log_id" title="Log ID"> | <name>Log ID</name> | |||
| <t>Each log is identified by an OID, which is one of the log's parameter | ||||
| <t>Each log is identified by an OID, which is one of the log's parameters (see | s (see | |||
| <xref target="log_parameters"/>) and which MUST NOT be used to identify any othe | <xref target="log_parameters" format="default"/>) and which <bcp14>MUST NOT</bcp | |||
| r log. A | 14> be used to identify any other log. A | |||
| log's operator MUST either allocate the OID themselves or request an OID from | log's operator <bcp14>MUST</bcp14> either allocate the OID themselves or request | |||
| the Log ID registry (see <xref target="log_id_registry"/>). | an OID from | |||
| the Log ID registry (see <xref target="log_id_registry" format="default"/>). | ||||
| One way to get an OID arc, from which OIDs can be allocated, is to request | One way to get an OID arc, from which OIDs can be allocated, is to request | |||
| a Private Enterprise Number from IANA, by completing the | a Private Enterprise Number from IANA by completing the | |||
| <eref target="https://pen.iana.org/pen/PenApplication.page">registration form</e ref>. | <eref target="https://pen.iana.org/pen/PenApplication.page">registration form</e ref>. | |||
| The only advantage of the registry is that the DER encoding can be small. | The only advantage of the registry is that the DER encoding can be small. | |||
| (Recall that OID allocations do not require a central registration, although | (Recall that OID allocations do not require a central registration, although | |||
| logs will most likely want to make themselves known to potential clients | logs will most likely want to make themselves known to potential clients | |||
| through out of band means.) | through out-of-band means.) | |||
| Various data structures include | Various data structures include | |||
| the DER encoding of this OID, excluding the ASN.1 tag and length bytes, in an | the DER encoding of this OID, excluding the ASN.1 tag and length bytes, in an | |||
| opaque vector:</t> | opaque vector:</t> | |||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| opaque LogID<2..127>; | opaque LogID<2..127>; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>Note that the ASN.1 length and the opaque vector length are identical | ||||
| <t>Note that the ASN.1 length and the opaque vector length are identical in size | in size (1 | |||
| (1 | ||||
| byte) and value, so the full DER encoding (including the tag and length) | byte) and value, so the full DER encoding (including the tag and length) | |||
| of the OID can be reproduced simply by | of the OID can be reproduced simply by | |||
| prepending an OBJECT IDENTIFIER tag (0x06) to the opaque vector length and | prepending an OBJECT IDENTIFIER tag (0x06) to the opaque vector length and | |||
| contents.</t> | contents.</t> | |||
| <t>The OID used to identify a log is limited such that the DER encoding | ||||
| <t>The OID used to identify a log is limited such that the DER encoding of its | of its | |||
| value, excluding the tag and length, MUST be no longer than 127 octets.</t> | value, excluding the tag and length, <bcp14>MUST</bcp14> be no longer than 127 o | |||
| ctets.</t> | ||||
| </section> | </section> | |||
| <section anchor="transitem-structure" title="TransItem Structure"> | <section anchor="transitem-structure" numbered="true" toc="default"> | |||
| <name>TransItem Structure</name> | ||||
| <t>Various data structures are encapsulated in the <spanx style="verb">TransItem | <t>Various data structures are encapsulated in the <tt>TransItem</tt> st | |||
| </spanx> structure to ensure | ructure to ensure | |||
| that the type and version of each one is identified in a common fashion:</t> | that the type and version of each one is identified in a common fashion:</t> | |||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| enum { | enum { | |||
| x509_entry_v2(0x0100), precert_entry_v2(0x0101), | x509_entry_v2(0x0100), precert_entry_v2(0x0101), | |||
| x509_sct_v2(0x0102), precert_sct_v2(0x0103), | x509_sct_v2(0x0102), precert_sct_v2(0x0103), | |||
| signed_tree_head_v2(0x0104), consistency_proof_v2(0x0105), | signed_tree_head_v2(0x0104), consistency_proof_v2(0x0105), | |||
| inclusion_proof_v2(0x0106), | inclusion_proof_v2(0x0106), | |||
| /* Reserved Code Points */ | /* Reserved Code Points */ | |||
| reserved_rfc6962(0x0000..0x00FF), | reserved_rfc6962(0x0000..0x00FF), | |||
| reserved_experimentaluse(0xE000..0xEFFF), | reserved_experimentaluse(0xE000..0xEFFF), | |||
| reserved_privateuse(0xF000..0xFFFF), | reserved_privateuse(0xF000..0xFFFF), | |||
| skipping to change at line 872 ¶ | skipping to change at line 825 ¶ | |||
| select (versioned_type) { | select (versioned_type) { | |||
| case x509_entry_v2: TimestampedCertificateEntryDataV2; | case x509_entry_v2: TimestampedCertificateEntryDataV2; | |||
| case precert_entry_v2: TimestampedCertificateEntryDataV2; | case precert_entry_v2: TimestampedCertificateEntryDataV2; | |||
| case x509_sct_v2: SignedCertificateTimestampDataV2; | case x509_sct_v2: SignedCertificateTimestampDataV2; | |||
| case precert_sct_v2: SignedCertificateTimestampDataV2; | case precert_sct_v2: SignedCertificateTimestampDataV2; | |||
| case signed_tree_head_v2: SignedTreeHeadDataV2; | case signed_tree_head_v2: SignedTreeHeadDataV2; | |||
| case consistency_proof_v2: ConsistencyProofDataV2; | case consistency_proof_v2: ConsistencyProofDataV2; | |||
| case inclusion_proof_v2: InclusionProofDataV2; | case inclusion_proof_v2: InclusionProofDataV2; | |||
| } data; | } data; | |||
| } TransItem; | } TransItem; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>versioned_type</tt> is a value from the IANA registry in <xref ta | ||||
| <t><spanx style="verb">versioned_type</spanx> is a value from the IANA registry | rget="versioned_trans_types" format="default"/> | |||
| in <xref target="versioned_trans_types"/> | ||||
| that identifies the type of the encapsulated data structure and the earliest | that identifies the type of the encapsulated data structure and the earliest | |||
| version of this protocol to which it conforms. This document is v2.</t> | version of this protocol to which it conforms. This document is v2.</t> | |||
| <t><tt>data</tt> is the encapsulated data structure. The various structu | ||||
| <t><spanx style="verb">data</spanx> is the encapsulated data structure. The vari | res named with the | |||
| ous structures named with the | <tt>DataV2</tt> suffix are defined in later sections of this document.</t> | |||
| <spanx style="verb">DataV2</spanx> suffix are defined in later sections of this | <t>Note that <tt>VersionedTransType</tt> combines the v1 type enumeratio | |||
| document.</t> | ns | |||
| <tt>Version</tt>, <tt>LogEntryType</tt>, <tt>SignatureType</tt>, and <tt>MerkleL | ||||
| <t>Note that <spanx style="verb">VersionedTransType</spanx> combines the v1 <xre | eafType</tt> <xref target="RFC6962" format="default"/>. Note also that | |||
| f target="RFC6962"></xref> type enumerations | v1 did not define <tt>TransItem</tt>, but this document provides guidelines (see | |||
| <spanx style="verb">Version</spanx>, <spanx style="verb">LogEntryType</spanx>, < | <xref target="v1_coexistence" format="default"/>) on how v2 implementations can | |||
| spanx style="verb">SignatureType</spanx> and <spanx style="verb">MerkleLeafType< | coexist with v1 | |||
| /spanx>. Note also that | ||||
| v1 did not define <spanx style="verb">TransItem</spanx>, but this document provi | ||||
| des guidelines (see | ||||
| <xref target="v1_coexistence"/>) on how v2 implementations can co-exist with v1 | ||||
| implementations.</t> | implementations.</t> | |||
| <t>Future versions of this protocol may reuse <tt>VersionedTransType</tt | ||||
| <t>Future versions of this protocol may reuse <spanx style="verb">VersionedTrans | > values defined | |||
| Type</spanx> values defined | in this document as long as the corresponding data structures are not modified | |||
| in this document as long as the corresponding data structures are not modified, | and may add new <tt>VersionedTransType</tt> values for new or modified data stru | |||
| and may add new <spanx style="verb">VersionedTransType</spanx> values for new or | ctures.</t> | |||
| modified data structures.</t> | </section> | |||
| <section anchor="log-artifact-extensions" numbered="true" toc="default"> | ||||
| </section> | <name>Log Artifact Extensions</name> | |||
| <section anchor="log-artifact-extensions" title="Log Artifact Extensions"> | <sourcecode type="tls-presentation"><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| enum { | enum { | |||
| reserved(65535) | reserved(65535) | |||
| } ExtensionType; | } ExtensionType; | |||
| struct { | struct { | |||
| ExtensionType extension_type; | ExtensionType extension_type; | |||
| opaque extension_data<0..2^16-1>; | opaque extension_data<0..2^16-1>; | |||
| } Extension; | } Extension; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>The <tt>Extension</tt> structure provides a generic extensibility for | ||||
| <t>The <spanx style="verb">Extension</spanx> structure provides a generic extens | log artifacts, | |||
| ibility for log artifacts, | including SCTs (<xref target="sct" format="default"/>) and STHs | |||
| including SCTs (<xref target="sct"/>) and STHs | (<xref target="sth" format="default"/>). The interpretation of the <tt>extension | |||
| (<xref target="sth"/>). The interpretation of the <spanx style="verb">extension_ | _data</tt> field is determined solely | |||
| data</spanx> field is determined solely | by the value of the <tt>extension_type</tt> field.</t> | |||
| by the value of the <spanx style="verb">extension_type</spanx> field.</t> | <t>This document does not define any extensions, but it does establish a | |||
| registry | ||||
| <t>This document does not define any extensions, but it does establish a registr | for future <tt>ExtensionType</tt> values (see <xref target="log_artifact_extensi | |||
| y | on_registry" format="default"/>). | |||
| for future <spanx style="verb">ExtensionType</spanx> values (see <xref target="l | Each document that registers a new <tt>ExtensionType</tt> must specify the conte | |||
| og_artifact_extension_registry"/>). | xt in | |||
| Each document that registers a new <spanx style="verb">ExtensionType</spanx> mus | ||||
| t specify the context in | ||||
| which it may be used (e.g., SCT, STH, or both) and describe how to interpret the | which it may be used (e.g., SCT, STH, or both) and describe how to interpret the | |||
| corresponding <spanx style="verb">extension_data</spanx>.</t> | corresponding <tt>extension_data</tt>.</t> | |||
| </section> | ||||
| </section> | <section anchor="tree_leaves" numbered="true" toc="default"> | |||
| <section anchor="tree_leaves" title="Merkle Tree Leaves"> | <name>Merkle Tree Leaves</name> | |||
| <t>The leaves of a log's Merkle Tree correspond to the log's entries (se | ||||
| <t>The leaves of a log's Merkle Tree correspond to the log's entries (see | e | |||
| <xref target="log_entries"/>). Each leaf is the leaf hash (<xref target="mht"/>) | <xref target="log_entries" format="default"/>). Each leaf is the leaf hash (<xre | |||
| of a <spanx style="verb">TransItem</spanx> | f target="mht" format="default"/>) of a <tt>TransItem</tt> | |||
| structure of type <spanx style="verb">x509_entry_v2</spanx> or <spanx style="ver | structure of type <tt>x509_entry_v2</tt> or <tt>precert_entry_v2</tt>, which enc | |||
| b">precert_entry_v2</spanx>, which encapsulates a | apsulates a | |||
| <spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structure. Note th | <tt>TimestampedCertificateEntryDataV2</tt> structure. Note that leaf hashes are | |||
| at leaf hashes are | calculated as <tt>HASH(0x00 || TransItem)</tt>, where the hash algorithm is one | |||
| calculated as HASH(0x00 || TransItem), where the hash algorithm is one of the | of the | |||
| log's parameters.</t> | log's parameters.</t> | |||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| opaque TBSCertificate<1..2^24-1>; | opaque TBSCertificate<1..2^24-1>; | |||
| struct { | struct { | |||
| uint64 timestamp; | uint64 timestamp; | |||
| opaque issuer_key_hash<32..2^8-1>; | opaque issuer_key_hash<32..2^8-1>; | |||
| TBSCertificate tbs_certificate; | TBSCertificate tbs_certificate; | |||
| Extension sct_extensions<0..2^16-1>; | Extension sct_extensions<0..2^16-1>; | |||
| } TimestampedCertificateEntryDataV2; | } TimestampedCertificateEntryDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>timestamp</tt> is the date and time at which the certificate or p | ||||
| <t><spanx style="verb">timestamp</spanx> is the date and time at which the certi | recertificate | |||
| ficate or precertificate was | was accepted by the log, in the form of a 64-bit unsigned number of milli | |||
| accepted by the log, in the form of a 64-bit unsigned number of milliseconds | seconds | |||
| elapsed since the Unix Epoch (1 January 1970 00:00:00 UTC - see <xref target="UN | elapsed since the Unix Epoch (1 January 1970 00:00:00 UTC -- see <xref | |||
| IXTIME"></xref>), | target="UNIXTIME" format="default"/>), | |||
| ignoring leap seconds, in network byte order. Note that the leaves of a log's | ignoring leap seconds, in network byte order. Note that the leaves of a l | |||
| Merkle Tree are not required to be in strict chronological order.</t> | og's | |||
| Merkle Tree are not required to be in strict chronological order.</t> | ||||
| <t><spanx style="verb">issuer_key_hash</spanx> is the HASH of the public key of | <t><tt>issuer_key_hash</tt> is the HASH of the public key of the CA that | |||
| the CA that issued the | issued the | |||
| certificate or precertificate, calculated over the DER encoding of the key | certificate or precertificate, calculated over the DER encoding of the key | |||
| represented as SubjectPublicKeyInfo <xref target="RFC5280"></xref>. This is need ed to bind the CA to | represented as SubjectPublicKeyInfo <xref target="RFC5280" format="default"/>. T his is needed to bind the CA to | |||
| the certificate or precertificate, making it impossible for the corresponding | the certificate or precertificate, making it impossible for the corresponding | |||
| SCT to be valid for any other certificate or precertificate whose TBSCertificate | SCT to be valid for any other certificate or precertificate whose TBSCertificate | |||
| matches <spanx style="verb">tbs_certificate</spanx>. The length of the <spanx st yle="verb">issuer_key_hash</spanx> MUST match | matches <tt>tbs_certificate</tt>. The length of the <tt>issuer_key_hash</tt> <bc p14>MUST</bcp14> match | |||
| HASH_SIZE.</t> | HASH_SIZE.</t> | |||
| <t><tt>tbs_certificate</tt> is the DER-encoded TBSCertificate from the s | ||||
| <t><spanx style="verb">tbs_certificate</spanx> is the DER encoded TBSCertificate | ubmission. | |||
| from the submission. (Note | (Note that a precertificate's TBSCertificate can be reconstructed from th | |||
| that a precertificate's TBSCertificate can be reconstructed from the | e | |||
| corresponding certificate as described in <xref target="reconstructing_tbscertif | corresponding certificate, as described in <xref | |||
| icate"/>).</t> | target="reconstructing_tbscertificate" format="default"/>).</t> | |||
| <t><tt>sct_extensions</tt> is byte-for-byte identical to the SCT extensi | ||||
| <t><spanx style="verb">sct_extensions</spanx> is byte-for-byte identical to the | ons of the | |||
| SCT extensions of the | corresponding SCT.</t> | |||
| corresponding SCT.</t> | <t>The type of the <tt>TransItem</tt> corresponds to the value of the <t | |||
| t>type</tt> parameter | ||||
| <t>The type of the <spanx style="verb">TransItem</spanx> corresponds to the valu | supplied in the <xref target="submit-entry" format="default"/> call.</t> | |||
| e of the <spanx style="verb">type</spanx> parameter | </section> | |||
| supplied in the <xref target="submit-entry"/> call.</t> | <section anchor="sct" numbered="true" toc="default"> | |||
| <name>Signed Certificate Timestamp (SCT)</name> | ||||
| </section> | <t>An SCT is a <tt>TransItem</tt> structure of type <tt>x509_sct_v2</tt> | |||
| <section anchor="sct" title="Signed Certificate Timestamp (SCT)"> | or <tt>precert_sct_v2</tt>, | |||
| which encapsulates a <tt>SignedCertificateTimestampDataV2</tt> structure:</t> | ||||
| <t>An SCT is a <spanx style="verb">TransItem</spanx> structure of type <spanx st | <sourcecode type="tls-presentation"><![CDATA[ | |||
| yle="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx>, | ||||
| which encapsulates a <spanx style="verb">SignedCertificateTimestampDataV2</spanx | ||||
| > structure:</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| struct { | struct { | |||
| LogID log_id; | LogID log_id; | |||
| uint64 timestamp; | uint64 timestamp; | |||
| Extension sct_extensions<0..2^16-1>; | Extension sct_extensions<0..2^16-1>; | |||
| opaque signature<1..2^16-1>; | opaque signature<1..2^16-1>; | |||
| } SignedCertificateTimestampDataV2; | } SignedCertificateTimestampDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>log_id</tt> is this log's unique ID, encoded in an opaque vector, | ||||
| <t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opa | as described | |||
| que vector as described in | in <xref target="log_id" format="default"/>.</t> | |||
| <xref target="log_id"/>.</t> | <t><tt>timestamp</tt> is equal to the timestamp from the corresponding | |||
| <tt>TimestampedCertificateEntryDataV2</tt> structure.</t> | ||||
| <t><spanx style="verb">timestamp</spanx> is equal to the timestamp from the corr | <t><tt>sct_extensions</tt> is a vector of 0 or more SCT extensions. This | |||
| esponding | vector | |||
| <spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structure.</t> | <bcp14>MUST NOT</bcp14> include more than one extension with the same | |||
| <tt>extension_type</tt>. The | ||||
| <t><spanx style="verb">sct_extensions</spanx> is a vector of 0 or more SCT exten | extensions in the vector <bcp14>MUST</bcp14> be ordered by the value of t | |||
| sions. This vector MUST NOT | he | |||
| include more than one extension with the same <spanx style="verb">extension_type | <tt>extension_type</tt> field, smallest value first. | |||
| </spanx>. The | All SCT extensions are similar to noncritical X.509v3 extensions (i.e., | |||
| extensions in the vector MUST be ordered by the value of the | the <tt>mustUnderstand</tt> field is not set), and a recipient <bcp14>SHO | |||
| <spanx style="verb">extension_type</spanx> field, smallest value first. | ULD</bcp14> | |||
| All SCT extensions are similar to non-critical X.509v3 extensions (i.e., | ignore any extension it does not understand. | |||
| the <spanx style="verb">mustUnderstand</spanx> field is not set), and a recipien | Furthermore, an implementation <bcp14>MAY</bcp14> choose to ignore any ex | |||
| t SHOULD ignore any | tension(s) | |||
| extension it does not understand. | that it does understand.</t> | |||
| Furthermore, an implementation MAY choose to ignore any extension(s) that it | <t><tt>signature</tt> is computed over a <tt>TransItem</tt> structure of | |||
| does understand.</t> | type | |||
| <tt>x509_entry_v2</tt> or <tt>precert_entry_v2</tt> (see <xref target="tr | ||||
| <t><spanx style="verb">signature</spanx> is computed over a <spanx style="verb"> | ee_leaves" | |||
| TransItem</spanx> structure of type <spanx style="verb">x509_entry_v2</spanx> | format="default"/>) using the signature algorithm | |||
| or <spanx style="verb">precert_entry_v2</spanx> (see <xref target="tree_leaves"/ | declared in the log's parameters (see <xref target="log_parameters" | |||
| >) using the signature algorithm | format="default"/>).</t> | |||
| declared in the log's parameters (see <xref target="log_parameters"/>).</t> | </section> | |||
| <section anchor="tree_head" numbered="true" toc="default"> | ||||
| </section> | <name>Merkle Tree Head</name> | |||
| <section anchor="tree_head" title="Merkle Tree Head"> | <t>The log stores information about its Merkle Tree in a <tt>TreeHeadDat | |||
| aV2</tt>:</t> | ||||
| <t>The log stores information about its Merkle Tree in a <spanx style="verb">Tre | <sourcecode type="tls-presentation"><![CDATA[ | |||
| eHeadDataV2</spanx>:</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| opaque NodeHash<32..2^8-1>; | opaque NodeHash<32..2^8-1>; | |||
| struct { | struct { | |||
| uint64 timestamp; | uint64 timestamp; | |||
| uint64 tree_size; | uint64 tree_size; | |||
| NodeHash root_hash; | NodeHash root_hash; | |||
| Extension sth_extensions<0..2^16-1>; | Extension sth_extensions<0..2^16-1>; | |||
| } TreeHeadDataV2; | } TreeHeadDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>The length of NodeHash <bcp14>MUST</bcp14> match HASH_SIZE of the log | ||||
| <t>The length of NodeHash MUST match HASH_SIZE of the log.</t> | .</t> | |||
| <t><tt>timestamp</tt> is the current date and time, using the format def | ||||
| <t><spanx style="verb">timestamp</spanx> is the current date and time, using the | ined in | |||
| format defined in | <xref target="tree_leaves" format="default"/>.</t> | |||
| <xref target="tree_leaves"/>.</t> | <t><tt>tree_size</tt> is the number of entries currently in the log's Me | |||
| rkle Tree.</t> | ||||
| <t><spanx style="verb">tree_size</spanx> is the number of entries currently in t | <t><tt>root_hash</tt> is the root of the Merkle Tree.</t> | |||
| he log's Merkle Tree.</t> | <t><tt>sth_extensions</tt> is a vector of 0 or more STH extensions. This | |||
| vector <bcp14>MUST NOT</bcp14> | ||||
| <t><spanx style="verb">root_hash</spanx> is the root of the Merkle Hash Tree.</t | include more than one extension with the same <tt>extension_type</tt>. The | |||
| > | extensions in the vector <bcp14>MUST</bcp14> be ordered by the value of the | |||
| <tt>extension_type</tt> field, smallest value first. If an implementation sees a | ||||
| <t><spanx style="verb">sth_extensions</spanx> is a vector of 0 or more STH exten | n | |||
| sions. This vector MUST NOT | extension that it does not understand, it <bcp14>SHOULD</bcp14> ignore that exte | |||
| include more than one extension with the same <spanx style="verb">extension_type | nsion. | |||
| </spanx>. The | Furthermore, an implementation <bcp14>MAY</bcp14> choose to ignore any extension | |||
| extensions in the vector MUST be ordered by the value of the | (s) that it | |||
| <spanx style="verb">extension_type</spanx> field, smallest value first. If an im | ||||
| plementation sees an | ||||
| extension that it does not understand, it SHOULD ignore that extension. | ||||
| Furthermore, an implementation MAY choose to ignore any extension(s) that it | ||||
| does understand.</t> | does understand.</t> | |||
| </section> | ||||
| </section> | <section anchor="sth" numbered="true" toc="default"> | |||
| <section anchor="sth" title="Signed Tree Head (STH)"> | <name>Signed Tree Head (STH)</name> | |||
| <t>Periodically, each log <bcp14>SHOULD</bcp14> sign its current tree he | ||||
| <t>Periodically each log SHOULD sign its current tree head information (see | ad | |||
| <xref target="tree_head"/>) to produce an STH. When a client requests a log's la | information (see <xref target="tree_head" format="default"/>) to produce | |||
| test STH (see | an STH. When | |||
| <xref target="get-sth"/>), the log MUST return an STH that is no older than the | a client requests a log's latest STH (see | |||
| log's MMD. | <xref target="get-sth" format="default"/>), the log <bcp14>MUST</bcp14> r | |||
| However, since STHs could be used to mark individual clients (by producing a new | eturn an STH | |||
| STH for each query), a log MUST NOT produce STHs more frequently than its | that is no older than the log's MMD. | |||
| parameters declare (see <xref target="log_parameters"/>). In general, there is n | However, since STHs could be used to mark individual clients (by producin | |||
| o need to | g a new | |||
| produce a new STH unless there are new entries in the log; however, in the event | STH for each query), a log <bcp14>MUST NOT</bcp14> produce STHs more freq | |||
| that a log does not accept any submissions during an MMD period, the log MUST | uently than | |||
| sign the same Merkle Tree Hash with a fresh timestamp.</t> | its parameters declare (see <xref target="log_parameters" format="default | |||
| "/>). In | ||||
| <t>An STH is a <spanx style="verb">TransItem</spanx> structure of type <spanx st | general, there is no need to | |||
| yle="verb">signed_tree_head_v2</spanx>, which | produce a new STH unless there are new entries in the log; however, in th | |||
| encapsulates a <spanx style="verb">SignedTreeHeadDataV2</spanx> structure:</t> | e event | |||
| that a log does not accept any submissions during an MMD period, the log | ||||
| <figure><artwork><![CDATA[ | <bcp14>MUST</bcp14> sign the same Merkle Tree Hash with a fresh timestamp | |||
| .</t> | ||||
| <t>An STH is a <tt>TransItem</tt> structure of type <tt>signed_tree_head | ||||
| _v2</tt>, | ||||
| which encapsulates a <tt>SignedTreeHeadDataV2</tt> structure:</t> | ||||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| struct { | struct { | |||
| LogID log_id; | LogID log_id; | |||
| TreeHeadDataV2 tree_head; | TreeHeadDataV2 tree_head; | |||
| opaque signature<1..2^16-1>; | opaque signature<1..2^16-1>; | |||
| } SignedTreeHeadDataV2; | } SignedTreeHeadDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>log_id</tt> is this log's unique ID encoded in an opaque vector, | ||||
| <t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opa | as described | |||
| que vector as described in | in <xref target="log_id" format="default"/>.</t> | |||
| <xref target="log_id"/>.</t> | <t>The <tt>timestamp</tt> in <tt>tree_head</tt> <bcp14>MUST</bcp14> be a | |||
| t least as | ||||
| <t>The <spanx style="verb">timestamp</spanx> in <spanx style="verb">tree_head</s | recent as the most recent SCT | |||
| panx> MUST be at least as recent as the most recent SCT | timestamp in the tree. Each subsequent timestamp <bcp14>MUST</bcp14> be m | |||
| timestamp in the tree. Each subsequent timestamp MUST be more recent than the | ore recent | |||
| timestamp of the previous update.</t> | than the timestamp of the previous update.</t> | |||
| <t><tt>tree_head</tt> contains the latest tree head information (see <xr | ||||
| <t><spanx style="verb">tree_head</spanx> contains the latest tree head informati | ef target="tree_head" format="default"/>).</t> | |||
| on (see <xref target="tree_head"/>).</t> | <t><tt>signature</tt> is computed over the <tt>tree_head</tt> field usin | |||
| g the signature algorithm | ||||
| <t><spanx style="verb">signature</spanx> is computed over the <spanx style="verb | declared in the log's parameters (see <xref target="log_parameters" format="defa | |||
| ">tree_head</spanx> field using the signature algorithm | ult"/>).</t> | |||
| declared in the log's parameters (see <xref target="log_parameters"/>).</t> | </section> | |||
| <section anchor="merkle-consistency-proofs" numbered="true" toc="default"> | ||||
| </section> | <name>Merkle Consistency Proofs</name> | |||
| <section anchor="merkle-consistency-proofs" title="Merkle Consistency Proofs"> | <t>To prepare a Merkle consistency proof for distribution to clients, th | |||
| e log | ||||
| <t>To prepare a Merkle Consistency Proof for distribution to clients, the log | produces a <tt>TransItem</tt> structure of type <tt>consistency_proof_v2</tt>, w | |||
| produces a <spanx style="verb">TransItem</spanx> structure of type <spanx style= | hich | |||
| "verb">consistency_proof_v2</spanx>, which | encapsulates a <tt>ConsistencyProofDataV2</tt> structure:</t> | |||
| encapsulates a <spanx style="verb">ConsistencyProofDataV2</spanx> structure:</t> | <sourcecode type="tls-presentation"><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| struct { | struct { | |||
| LogID log_id; | LogID log_id; | |||
| uint64 tree_size_1; | uint64 tree_size_1; | |||
| uint64 tree_size_2; | uint64 tree_size_2; | |||
| NodeHash consistency_path<0..2^16-1>; | NodeHash consistency_path<0..2^16-1>; | |||
| } ConsistencyProofDataV2; | } ConsistencyProofDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>log_id</tt> is this log's unique ID encoded in an opaque vector, | ||||
| <t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opa | as described | |||
| que vector as described in | in <xref target="log_id" format="default"/>.</t> | |||
| <xref target="log_id"/>.</t> | <t><tt>tree_size_1</tt> is the size of the older tree.</t> | |||
| <t><tt>tree_size_2</tt> is the size of the newer tree.</t> | ||||
| <t><spanx style="verb">tree_size_1</spanx> is the size of the older tree.</t> | <t><tt>consistency_path</tt> is a vector of Merkle Tree nodes proving th | |||
| e consistency | ||||
| <t><spanx style="verb">tree_size_2</spanx> is the size of the newer tree.</t> | of two STHs, as described in <xref target="consistency" format="default"/ | |||
| >.</t> | ||||
| <t><spanx style="verb">consistency_path</spanx> is a vector of Merkle Tree nodes | </section> | |||
| proving the consistency of | <section anchor="merkle-inclusion-proofs" numbered="true" toc="default"> | |||
| two STHs as described in <xref target="consistency"/>.</t> | <name>Merkle Inclusion Proofs</name> | |||
| <t>To prepare a Merkle inclusion proof for distribution to clients, the | ||||
| </section> | log | |||
| <section anchor="merkle-inclusion-proofs" title="Merkle Inclusion Proofs"> | produces a <tt>TransItem</tt> structure of type <tt>inclusion_proof_v2</tt>, whi | |||
| ch | ||||
| <t>To prepare a Merkle Inclusion Proof for distribution to clients, the log | encapsulates an <tt>InclusionProofDataV2</tt> structure:</t> | |||
| produces a <spanx style="verb">TransItem</spanx> structure of type <spanx style= | <sourcecode type="tls-presentation"><![CDATA[ | |||
| "verb">inclusion_proof_v2</spanx>, which | ||||
| encapsulates an <spanx style="verb">InclusionProofDataV2</spanx> structure:</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| struct { | struct { | |||
| LogID log_id; | LogID log_id; | |||
| uint64 tree_size; | uint64 tree_size; | |||
| uint64 leaf_index; | uint64 leaf_index; | |||
| NodeHash inclusion_path<0..2^16-1>; | NodeHash inclusion_path<0..2^16-1>; | |||
| } InclusionProofDataV2; | } InclusionProofDataV2; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>log_id</tt> is this log's unique ID encoded in an opaque vector, | ||||
| <t><spanx style="verb">log_id</spanx> is this log's unique ID, encoded in an opa | as described | |||
| que vector as described in | in <xref target="log_id" format="default"/>.</t> | |||
| <xref target="log_id"/>.</t> | <t><tt>tree_size</tt> is the size of the tree on which this inclusion pr | |||
| oof is | ||||
| <t><spanx style="verb">tree_size</spanx> is the size of the tree on which this i | based.</t> | |||
| nclusion proof is based.</t> | <t><tt>leaf_index</tt> is the 0-based index of the log entry correspondi | |||
| ng to this | ||||
| <t><spanx style="verb">leaf_index</spanx> is the 0-based index of the log entry | ||||
| corresponding to this | ||||
| inclusion proof.</t> | inclusion proof.</t> | |||
| <t><tt>inclusion_path</tt> is a vector of Merkle Tree nodes proving the | ||||
| <t><spanx style="verb">inclusion_path</spanx> is a vector of Merkle Tree nodes p | inclusion of the | |||
| roving the inclusion of the | chosen certificate or precertificate, as described in <xref target="merkle_inclu | |||
| chosen certificate or precertificate as described in <xref target="merkle_inclus | sion_proof" format="default"/>.</t> | |||
| ion_proof"/>.</t> | </section> | |||
| <section anchor="log_shutdown" numbered="true" toc="default"> | ||||
| </section> | <name>Shutting Down a Log</name> | |||
| <section anchor="log_shutdown" title="Shutting down a log"> | <t>Log operators may decide to shut down a log for various reasons, such | |||
| as | ||||
| <t>Log operators may decide to shut down a log for various reasons, such as | ||||
| deprecation of the signature algorithm. If there are entries in the log for | deprecation of the signature algorithm. If there are entries in the log for | |||
| certificates that have not yet expired, simply making TLS clients stop | certificates that have not yet expired, simply making TLS clients stop | |||
| recognizing that log will have the effect of invalidating SCTs from that log. | recognizing that log will have the effect of invalidating SCTs from that log. | |||
| In order to avoid that, the following actions SHOULD be taken:</t> | In order to avoid that, the following actions <bcp14>SHOULD</bcp14> be taken:</t | |||
| > | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>Make it known to clients and monitors that the log will be frozen. | <li>Make it known to clients and monitors that the log will be frozen. | |||
| This is not part of the API, so it will have to be done via a relevant | This is not part of the API, so it will have to be done via a relevant | |||
| out-of-band mechanism.</t> | out-of-band mechanism.</li> | |||
| <t>Stop accepting new submissions (the error code "shutdown" should be returne | <li>Stop accepting new submissions (the error code "shutdown" should b | |||
| d | e returned | |||
| for such requests).</t> | for such requests).</li> | |||
| <t>Once MMD from the last accepted submission has passed and all pending | <li>Once MMD from the last accepted submission has passed and all pend | |||
| submissions are incorporated, issue a final STH and publish it as one of the | ing | |||
| log's parameters. Having an STH with a timestamp that is after the MMD has | submissions are incorporated, issue a final STH and publish it as one o | |||
| passed from the last SCT issuance allows clients to audit this log regularly | f the | |||
| without special handling for the final STH. At this point the log's private | log's parameters. Having an STH with a timestamp that is after the MMD | |||
| key is no longer needed and can be destroyed.</t> | has | |||
| <t>Keep the log running until the certificates in all of its entries have expi | passed from the last SCT issuance allows clients to audit this log regu | |||
| red | larly | |||
| or exist in other logs (this can be determined by scanning other logs or | without special handling for the final STH. At this point, the log's pr | |||
| connecting to domains mentioned in the certificates and inspecting the SCTs | ivate | |||
| served).</t> | key is no longer needed and can be destroyed.</li> | |||
| </list></t> | <li>Keep the log running until the certificates in all of its entries | |||
| have expired | ||||
| </section> | or exist in other logs (this can be determined by scanning other logs o | |||
| </section> | r | |||
| <section anchor="client_messages" title="Log Client Messages"> | connecting to domains mentioned in the certificates and inspecting the | |||
| SCTs | ||||
| <t>Messages are sent as HTTPS GET or POST requests. Parameters for POSTs and all | served).</li> | |||
| responses are encoded as JavaScript Object Notation (JSON) objects <xref target= | </ul> | |||
| "RFC8259"></xref>. | </section> | |||
| </section> | ||||
| <section anchor="client_messages" numbered="true" toc="default"> | ||||
| <name>Log Client Messages</name> | ||||
| <t>Messages are sent as HTTPS GET or POST requests. Parameters for POSTs a | ||||
| nd all | ||||
| responses are encoded as JavaScript Object Notation (JSON) objects <xref target= | ||||
| "RFC8259" format="default"/>. | ||||
| Parameters for GETs are encoded as order-independent key/value URL parameters, | Parameters for GETs are encoded as order-independent key/value URL parameters, | |||
| using the "application/x-www-form-urlencoded" format described in the "HTML 4.01 | using the "application/x-www-form-urlencoded" format described in the "HTML 4.01 | |||
| Specification" <xref target="HTML401"></xref>. Binary data is base64 encoded acc | Specification" <xref target="HTML401" format="default"/>. Binary data is base64 | |||
| ording to | encoded according to | |||
| section 4 of <xref target="RFC4648"></xref> as specified | <xref target="RFC4648" sectionFormat="of" section="4"/>, as specified | |||
| in the individual messages.</t> | in the individual messages.</t> | |||
| <t>Clients are configured with a log's base URL, which is one of the log's | ||||
| <t>Clients are configured with a log's base URL, which is one of the log's | ||||
| parameters. Clients construct URLs for requests by appending suffixes to this | parameters. Clients construct URLs for requests by appending suffixes to this | |||
| base URL. This structure places some degree of restriction on how log operators | base URL. This structure places some degree of restriction on how log operators | |||
| can deploy these services, as noted in <xref target="RFC8820"></xref>. However, operational | can deploy these services, as noted in <xref target="RFC8820" format="default"/> . However, operational | |||
| experience with version 1 of this protocol has not indicated that these | experience with version 1 of this protocol has not indicated that these | |||
| restrictions are a problem in practice.</t> | restrictions are a problem in practice.</t> | |||
| <t>Note that JSON objects and URL parameters may contain fields not specif | ||||
| <t>Note that JSON objects and URL parameters may contain fields not specified he | ied here | |||
| re, | to allow for experimentation. Any fields that are not understood <bcp14>SHOULD</ | |||
| to allow for experimentation. Any fields that are not understood SHOULD | bcp14> | |||
| be ignored.</t> | be ignored.</t> | |||
| <t>In practice, log servers may include multiple front-end machines. Since | ||||
| <t>In practice, log servers may include multiple front-end machines. Since it is | it is | |||
| impractical to keep these machines in perfect sync, errors may occur that are | impractical to keep these machines in perfect sync, errors that are | |||
| caused by skew between the machines. Where such errors are possible, the | caused by skew between the machines may occur. Where such errors are possible, t | |||
| front-end will return additional information (as specified below) making it | he | |||
| possible for clients to make progress, if progress is possible. Front-ends MUST | front end will return additional information (as specified below), making it | |||
| only serve data that is free of gaps (that is, for example, no front-end will | possible for clients to make progress, if progress is possible. Front ends <bcp1 | |||
| 4>MUST</bcp14> | ||||
| only serve data that is free of gaps (that is, for example, no front end will | ||||
| respond with an STH unless it is also able to prove consistency from all log | respond with an STH unless it is also able to prove consistency from all log | |||
| entries logged within that STH).</t> | entries logged within that STH).</t> | |||
| <t>For example, when a consistency proof between two STHs is requested, th | ||||
| <t>For example, when a consistency proof between two STHs is requested, the | e | |||
| front-end reached may not yet be aware of one or both STHs. In the case where it | front end reached may not yet be aware of one or both STHs. In the case where it | |||
| is unaware of both, it will return the latest STH it is aware of. Where it is | is unaware of both, it will return the latest STH it is aware of. Where it is | |||
| aware of the first but not the second, it will return the latest STH it is aware | aware of the first but not the second, it will return the latest STH it is aware | |||
| of and a consistency proof from the first STH to the returned STH. The case | of and a consistency proof from the first STH to the returned STH. The case | |||
| where it knows the second but not the first should not arise (see the "no gaps" | where it knows the second but not the first should not arise (see the "no gaps" | |||
| requirement above).</t> | requirement above).</t> | |||
| <t>If the log is unable to process a client's request, it <bcp14>MUST</bcp | ||||
| <t>If the log is unable to process a client's request, it MUST return an HTTP | 14> return an HTTP | |||
| response code of 4xx/5xx (see <xref target="RFC7231"></xref>), and, in place of | response code of 4xx/5xx (see <xref target="RFC7231" format="default"/>), and, i | |||
| the responses | n place of the responses | |||
| outlined in the subsections below, the body SHOULD be a JSON Problem Details | outlined in the subsections below, the body <bcp14>SHOULD</bcp14> be a JSON prob | |||
| Object (see <xref target="RFC7807"></xref> Section 3), containing:</t> | lem details | |||
| object (see <xref target="RFC7807" sectionFormat="of" section="3"/>) containing: | ||||
| <t><list style="hanging"> | </t> | |||
| <t hangText="type:"> | <dl newline="false" spacing="normal"> | |||
| A URN reference identifying the problem. To facilitate automated response | <dt>type:</dt> | |||
| to errors, this document defines a set of standard tokens for use in the | <dd>A URN reference identifying the problem. To facilitate automated res | |||
| <spanx style="verb">type</spanx> field, within the URN namespace of: "urn:ietf:p | ponse | |||
| arams:trans:error:".</t> | to errors, this document defines a set of standard tokens for use in the | |||
| <t hangText="detail:"> | <tt>type</tt> field within the URN namespace of: "urn:ietf:params:trans:e | |||
| A human-readable string describing the error that prevented the log from | rror:".</dd> | |||
| processing the request, ideally with sufficient detail to enable the error to | <dt>detail:</dt> | |||
| be rectified.</t> | <dd>A human-readable string describing the error that prevented the log | |||
| </list></t> | from | |||
| processing the request, ideally with sufficient detail to enable the erro | ||||
| <t>e.g., In response to a request of | r to | |||
| <spanx style="verb"><Base URL>/ct/v2/get-entries?start=100&end=99</spa | be rectified.</dd> | |||
| nx>, the log would return a | </dl> | |||
| <spanx style="verb">400 Bad Request</spanx> response code with a body similar to | <t>For example, in response to a request of | |||
| the following:</t> | <tt><Base URL>/ct/v2/get-entries?start=100&end=99</tt>, the log would | |||
| return a | ||||
| <figure><artwork><![CDATA[ | <tt>400 Bad Request</tt> response code with a body similar to the following:</t> | |||
| <sourcecode type="json"><![CDATA[ | ||||
| { | { | |||
| "type": "urn:ietf:params:trans:error:endBeforeStart", | "type": "urn:ietf:params:trans:error:endBeforeStart", | |||
| "detail": "'start' cannot be greater than 'end'" | "detail": "'start' cannot be greater than 'end'" | |||
| } | } | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>Most error types are specific to the type of request and are defined in | ||||
| <t>Most error types are specific to the type of request and are defined in the | the | |||
| respective subsections below. The one exception is the "malformed" error type, | respective subsections below. The one exception is the "malformed" error type, | |||
| which indicates that the log server could not parse the client's request because | which indicates that the log server could not parse the client's request because | |||
| it did not comply with this document:</t> | it did not comply with this document:</t> | |||
| <table align="center"> | ||||
| <texttable> | <thead> | |||
| <ttcol align='left'>type</ttcol> | <tr> | |||
| <ttcol align='left'>detail</ttcol> | <th align="left">type</th> | |||
| <c>malformed</c> | <th align="left">detail</th> | |||
| <c>The request could not be parsed.</c> | </tr> | |||
| </texttable> | </thead> | |||
| <tbody> | ||||
| <t>Clients SHOULD treat <spanx style="verb">500 Internal Server Error</spanx> an | <tr> | |||
| d <spanx style="verb">503 Service Unavailable</spanx> | <td align="left">malformed</td> | |||
| responses as transient failures and MAY retry the same request without | <td align="left">The request could not be parsed.</td> | |||
| modification at a later date. Note that as per <xref target="RFC7231"></xref>, i | </tr> | |||
| n the case of a 503 | </tbody> | |||
| response the log MAY include a <spanx style="verb">Retry-After:</spanx> header f | </table> | |||
| ield in order to request a | <t>Clients <bcp14>SHOULD</bcp14> treat <tt>500 Internal Server Error</tt> | |||
| minimum time for the client to wait before retrying the request. | and <tt>503 | |||
| In the absence of this header field, this document does not specify a minimum.</ | Service Unavailable</tt> | |||
| t> | responses as transient failures and <bcp14>MAY</bcp14> retry the same requ | |||
| est without | ||||
| <t>Clients SHOULD treat any 4xx error as a problem with the request and not | modification at a later date. Note that in the case of a 503 response, the | |||
| attempt to resubmit without some modification to the request. The full | log | |||
| status code MAY provide additional details.</t> | <bcp14>MAY</bcp14> include a <tt>Retry-After</tt> header field per <xref t | |||
| arget="RFC7231" format="default"/> in | ||||
| <t>This document deliberately does not provide more specific guidance | order to request a minimum time for the client to wait before retrying the | |||
| on the use of HTTP status codes.</t> | request. | |||
| In the absence of this header field, this document does not specify a mini | ||||
| <section anchor="submit-entry" title="Submit Entry to Log"> | mum.</t> | |||
| <t>Clients <bcp14>SHOULD</bcp14> treat any 4xx error as a problem with the | ||||
| <t>POST <Base URL>/ct/v2/submit-entry</t> | request and | |||
| not attempt to resubmit without some modification to the request. The full | ||||
| <t><list style="hanging"> | status code <bcp14>MAY</bcp14> provide additional details.</t> | |||
| <t hangText="Inputs:"> | <t>This document deliberately does not provide more specific guidance | |||
| <list style="hanging"> | on the use of HTTP status codes.</t> | |||
| <t hangText="submission:"> | <section anchor="submit-entry" numbered="true" toc="default"> | |||
| The base64 encoded certificate or precertificate.</t> | <name>Submit Entry to Log</name> | |||
| <t hangText="type:"> | <t>POST <Base URL>/ct/v2/submit-entry</t> | |||
| The <spanx style="verb">VersionedTransType</spanx> integer value that in | <dl newline="true" spacing="normal"> | |||
| dicates the type of the | <dt>Inputs:</dt> | |||
| <spanx style="verb">submission</spanx>: 1 for <spanx style="verb">x509_entry_v2< | <dd> | |||
| /spanx>, or 2 for <spanx style="verb">precert_entry_v2</spanx>.</t> | <dl newline="false" spacing="normal"> | |||
| <t hangText="chain:"> | <dt>submission:</dt> | |||
| An array of zero or more JSON strings, | <dd>The base64-encoded certificate or precertificate.</dd> | |||
| each of which is a base64 encoded CA certificate. The first element | <dt>type:</dt> | |||
| is the certifier of the <spanx style="verb">submission</spanx>; the second certi | <dd>The <tt>VersionedTransType</tt> integer value that indicates t | |||
| fies the first; etc. | he type of the | |||
| The last element of <spanx style="verb">chain</spanx> (or, if <spanx style="verb | <tt>submission</tt>: 1 for <tt>x509_entry_v2</tt> or 2 for | |||
| ">chain</spanx> is an empty array, the | <tt>precert_entry_v2</tt>.</dd> | |||
| <spanx style="verb">submission</spanx>) is certified by an accepted trust anchor | <dt>chain:</dt> | |||
| .</t> | <dd>An array of zero or more JSON strings, | |||
| </list> | each of which is a base64-encoded CA certificate. The first element | |||
| </t> | is the certifier of the <tt>submission</tt>, the second certifies t | |||
| <t hangText="Outputs:"> | he first, | |||
| <list style="hanging"> | etc. The last element of <tt>chain</tt> (or, if <tt>chain</tt> is a | |||
| <t hangText="sct:"> | n empty | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | array, the <tt>submission</tt>) is certified by an accepted trust a | |||
| yle="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</spanx>, | nchor.</dd> | |||
| signed by this log, that corresponds to the <spanx style="verb">submission</span | </dl> | |||
| x>.</t> | </dd> | |||
| </list> | <dt>Outputs:</dt> | |||
| <dd> | ||||
| If the submitted entry is immediately appended to (or already exists in) this | <dl newline="false" spacing="normal"> | |||
| log's tree, then the log SHOULD also output: | <dt>sct:</dt> | |||
| <list style="hanging"> | <dd><t>A base64-encoded <tt>TransItem</tt> of type <tt>x509_sct_v2 | |||
| <t hangText="sth:"> | </tt> or | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | <tt>precert_sct_v2</tt>, signed by this log, that corresponds to th | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | e | |||
| log.</t> | <tt>submission</tt>.</t></dd> | |||
| <t hangText="inclusion:"> | </dl> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | <t>If the submitted entry is immediately appended to (or already e | |||
| yle="verb">inclusion_proof_v2</spanx> whose | xists in) this | |||
| <spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the | log's tree, then the log <bcp14>SHOULD</bcp14> also output:</t> | |||
| inclusion of the | <dl newline="false" spacing="normal" indent="3"> | |||
| <spanx style="verb">submission</spanx> in the returned <spanx style="verb">sth</ | <dt>sth:</dt> | |||
| spanx>.</t> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>signed_tree_he | |||
| </list> | ad_v2</tt> | |||
| </t> | signed by this log.</dd> | |||
| </list></t> | <dt>inclusion:</dt> | |||
| <dd>A base64-encoded <tt>TransItem</tt> of type <tt>inclusion_proo | ||||
| <t>Error codes:</t> | f_v2</tt> | |||
| whose <tt>inclusion_path</tt> array of Merkle Tree nodes proves the | ||||
| <texttable> | inclusion | |||
| <ttcol align='left'>type</ttcol> | of the <tt>submission</tt> in the returned <tt>sth</tt>.</dd> | |||
| <ttcol align='left'>detail</ttcol> | </dl> | |||
| <c>badSubmission</c> | </dd> | |||
| <c><spanx style="verb">submission</spanx> is neither a valid certificate n | </dl> | |||
| or a valid precertificate.</c> | <t>Error codes:</t> | |||
| <c>badType</c> | <table align="center"> | |||
| <c><spanx style="verb">type</spanx> is neither 1 nor 2.</c> | <thead> | |||
| <c>badChain</c> | <tr> | |||
| <c>The first element of <spanx style="verb">chain</spanx> is not the certi | <th align="left">type</th> | |||
| fier of the <spanx style="verb">submission</spanx>, or the second element does n | <th align="left">detail</th> | |||
| ot certify the first, etc.</c> | </tr> | |||
| <c>badCertificate</c> | </thead> | |||
| <c>One or more certificates in the <spanx style="verb">chain</spanx> are n | <tbody> | |||
| ot valid (e.g., not properly encoded).</c> | <tr> | |||
| <c>unknownAnchor</c> | <td align="left">badSubmission</td> | |||
| <c>The last element of <spanx style="verb">chain</spanx> (or, if <spanx st | <td align="left"> | |||
| yle="verb">chain</spanx> is an empty array, the <spanx style="verb">submission</ | <tt>submission</tt> is neither a valid certificate nor a valid p | |||
| spanx>) both is not, and is not certified by, an accepted trust anchor.</c> | recertificate.</td> | |||
| <c>shutdown</c> | </tr> | |||
| <c>The log is no longer accepting submissions.</c> | <tr> | |||
| </texttable> | <td align="left">badType</td> | |||
| <td align="left"> | ||||
| <t>If the version of <spanx style="verb">sct</spanx> is not v2, then a v2 client | <tt>type</tt> is neither 1 nor 2.</td> | |||
| may be unable to verify the | </tr> | |||
| signature. It MUST NOT construe this as an error. This is to avoid forcing an | <tr> | |||
| <td align="left">badChain</td> | ||||
| <td align="left">The first element of <tt>chain</tt> is not the ce | ||||
| rtifier of the <tt>submission</tt>, or the second element does not certify the f | ||||
| irst, etc.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">badCertificate</td> | ||||
| <td align="left">One or more certificates in <tt>chain</tt> are no | ||||
| t valid (e.g., not properly encoded).</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">unknownAnchor</td> | ||||
| <td align="left">The last element of <tt>chain</tt> (or, if <tt>ch | ||||
| ain</tt> is an empty array, the <tt>submission</tt>) is not, nor is it certified | ||||
| by, an accepted trust anchor.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">shutdown</td> | ||||
| <td align="left">The log is no longer accepting submissions.</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>If the version of <tt>sct</tt> is not v2, then a v2 client may be una | ||||
| ble to verify the | ||||
| signature. It <bcp14>MUST NOT</bcp14> construe this as an error. This is to avoi | ||||
| d forcing an | ||||
| upgrade of compliant v2 clients that do not use the returned SCTs.</t> | upgrade of compliant v2 clients that do not use the returned SCTs.</t> | |||
| <t>If a log detects bad encoding in a chain that otherwise verifies corr | ||||
| <t>If a log detects bad encoding in a chain that otherwise verifies correctly th | ectly, then | |||
| en | the log <bcp14>MUST</bcp14> either log the certificate or return the "badCertifi | |||
| the log MUST either log the certificate or return the "bad certificate" error. | cate" error. | |||
| If the certificate is logged, an SCT MUST be issued. Logging the certificate is | If the certificate is logged, an SCT <bcp14>MUST</bcp14> be issued. Logging the | |||
| useful, because monitors (<xref target="monitor"/>) can then detect these encodi | certificate is | |||
| ng errors, | useful, because monitors (<xref target="monitor" format="default"/>) can then de | |||
| tect these encoding errors, | ||||
| which may be accepted by some TLS clients.</t> | which may be accepted by some TLS clients.</t> | |||
| <t>If <tt>submission</tt> is an accepted trust anchor whose certifier is | ||||
| <t>If <spanx style="verb">submission</spanx> is an accepted trust anchor whose c | neither an | |||
| ertifier is neither an | accepted trust anchor nor the first element of <tt>chain</tt>, then the log <bcp | |||
| accepted trust anchor nor the first element of <spanx style="verb">chain</spanx> | 14>MUST</bcp14> return | |||
| , then the log MUST return | the "unknownAnchor" error. A log is not able to generate an SCT for a | |||
| the "unknown anchor" error. A log is not able to generate an SCT for a | ||||
| submission if it | submission if it | |||
| does not have access to the issuer's public key.</t> | does not have access to the issuer's public key.</t> | |||
| <t>If the returned <tt>sct</tt> is intended to be provided to TLS client | ||||
| <t>If the returned <spanx style="verb">sct</spanx> is intended to be provided to | s, then <tt>sth</tt> and | |||
| TLS clients, then <spanx style="verb">sth</spanx> and | <tt>inclusion</tt> (if returned) <bcp14>SHOULD</bcp14> also be provided to TLS c | |||
| <spanx style="verb">inclusion</spanx> (if returned) SHOULD also be provided to T | lients. For | |||
| LS clients. For | ||||
| example, if | example, if | |||
| <spanx style="verb">type</spanx> was 2 (indicating <spanx style="verb">precert_s ct_v2</spanx>) then all three <spanx style="verb">TransItem</spanx>s could be | <tt>type</tt> was 2 (indicating <tt>precert_sct_v2</tt>), then all three <tt>Tra nsItem</tt>s could be | |||
| embedded in the certificate.</t> | embedded in the certificate.</t> | |||
| </section> | ||||
| </section> | <section anchor="get-sth" numbered="true" toc="default"> | |||
| <section anchor="get-sth" title="Retrieve Latest STH"> | <name>Retrieve Latest STH</name> | |||
| <t>GET <Base URL>/ct/v2/get-sth</t> | ||||
| <t>GET <Base URL>/ct/v2/get-sth</t> | <t>No inputs.</t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <t>No inputs.</t> | <dt>Outputs:</dt> | |||
| <dd> | ||||
| <t><list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Outputs:"> | <dt>sth:</dt> | |||
| <list style="hanging"> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>signed_tree_he | |||
| <t hangText="sth:"> | ad_v2</tt> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | signed by this log that is no older than the log's MMD.</dd> | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | </dl> | |||
| log, that is no older than the log's MMD.</t> | </dd> | |||
| </list> | </dl> | |||
| </t> | </section> | |||
| </list></t> | <section anchor="get-sth-consistency" numbered="true" toc="default"> | |||
| <name>Retrieve Merkle Consistency Proof between Two STHs</name> | ||||
| </section> | <t>GET <Base URL>/ct/v2/get-sth-consistency</t> | |||
| <section anchor="get-sth-consistency" title="Retrieve Merkle Consistency Proof b | <dl newline="true" spacing="normal"> | |||
| etween Two STHs"> | <dt>Inputs:</dt> | |||
| <dd> | ||||
| <t>GET <Base URL>/ct/v2/get-sth-consistency</t> | <dl newline="false" spacing="normal"> | |||
| <dt>first:</dt> | ||||
| <t><list style="hanging"> | <dd>The <tt>tree_size</tt> of the older tree, in decimal.</dd> | |||
| <t hangText="Inputs:"> | <dt>second:</dt> | |||
| <list style="hanging"> | <dd>The <tt>tree_size</tt> of the newer tree, in decimal (optional) | |||
| <t hangText="first:"> | .</dd> | |||
| The tree_size of the older tree, in decimal.</t> | </dl> | |||
| <t hangText="second:"> | <t>Both tree sizes must be from existing v2 STHs. However, because of | |||
| The tree_size of the newer tree, in decimal (optional).</t> | skew, the | |||
| </list> | receiving front end may not know one or both of the existing STHs. If b | |||
| </t> | oth are | |||
| </list></t> | known, then only the <tt>consistency</tt> output is returned. If the fi | |||
| rst is known | ||||
| <t><list style='empty'> | but the second is not (or has been omitted), then the latest known STH | |||
| <t>Both tree sizes must be from existing v2 STHs. However, because of skew, th | is | |||
| e | returned, along with a consistency proof between the first STH and the | |||
| receiving front-end may not know one or both of the existing STHs. If both are | latest. | |||
| known, then only the <spanx style="verb">consistency</spanx> output is returned. | If neither are known, then the latest known STH is returned without a | |||
| If the first is known | consistency proof.</t> | |||
| but the second is not (or has been omitted), then the latest known STH is | </dd> | |||
| returned, along with a consistency proof between the first STH and the latest. | </dl> | |||
| If neither are known, then the latest known STH is returned without a | <dl newline="true" spacing="normal"> | |||
| consistency proof.</t> | <dt>Outputs:</dt> | |||
| </list></t> | <dd> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>consistency:</dt> | |||
| <t hangText="Outputs:"> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>consistency_pr | |||
| <list style="hanging"> | oof_v2</tt> | |||
| <t hangText="consistency:"> | whose <tt>tree_size_1</tt> <bcp14>MUST</bcp14> match the <tt>first< | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | /tt> input. | |||
| yle="verb">consistency_proof_v2</spanx>, whose | If the <tt>sth</tt> output is omitted, | |||
| <spanx style="verb">tree_size_1</spanx> MUST match the <spanx style="verb">first | then <tt>tree_size_2</tt> <bcp14>MUST</bcp14> match the <tt>second< | |||
| </spanx> input. If the <spanx style="verb">sth</spanx> output is omitted, | /tt> input. | |||
| then <spanx style="verb">tree_size_2</spanx> MUST match the <spanx style="verb"> | If <tt>first</tt> and <tt>second</tt> are equal and correspond to a | |||
| second</spanx> input. | known STH, | |||
| If <spanx style="verb">first</spanx> and <spanx style="verb">second</spanx> are | the returned consistency proof <bcp14>MUST</bcp14> be empty (a | |||
| equal and correspond to a known STH, the | <tt>consistency_path</tt> array with zero elements).</dd> | |||
| returned consistency proof MUST be empty (a <spanx style="verb">consistency_path | <dt>sth:</dt> | |||
| </spanx> array with | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>signed_tree_he | |||
| zero elements).</t> | ad_v2</tt>, | |||
| <t hangText="sth:"> | signed by this log.</dd> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | </dl> | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | <t>Note that no signature is required for the <tt>consistency</tt> out | |||
| log.</t> | put, as it is | |||
| </list> | used to verify the consistency between two signed STHs.</t> | |||
| </t> | </dd> | |||
| </list></t> | </dl> | |||
| <t>Error codes:</t> | ||||
| <t><list style='empty'> | <table align="center"> | |||
| <t>Note that no signature is required for the <spanx style="verb">consistency< | <thead> | |||
| /spanx> output as it is used | <tr> | |||
| to verify the consistency between two STHs, which are signed.</t> | <th align="left">type</th> | |||
| </list></t> | <th align="left">detail</th> | |||
| </tr> | ||||
| <t>Error codes:</t> | </thead> | |||
| <tbody> | ||||
| <texttable> | <tr> | |||
| <ttcol align='left'>type</ttcol> | <td align="left">firstUnknown</td> | |||
| <ttcol align='left'>detail</ttcol> | <td align="left"><tt>first</tt> is before the latest known STH but | |||
| <c>firstUnknown</c> | is not from | |||
| <c><spanx style="verb">first</spanx> is before the latest known STH but is | an existing STH.</td> | |||
| not from an existing STH.</c> | </tr> | |||
| <c>secondUnknown</c> | <tr> | |||
| <c><spanx style="verb">second</spanx> is before the latest known STH but i | <td align="left">secondUnknown</td> | |||
| s not from an existing STH.</c> | <td align="left"><tt>second</tt> is before the latest known STH bu | |||
| <c>secondBeforeFirst</c> | t is not from | |||
| <c><spanx style="verb">second</spanx> is smaller than <spanx style="verb"> | an existing STH.</td> | |||
| first</spanx>.</c> | </tr> | |||
| </texttable> | <tr> | |||
| <td align="left">secondBeforeFirst</td> | ||||
| <t>See <xref target="verify_consistency"/> for an outline of how to use the <spa | <td align="left"><tt>second</tt> is smaller than <tt>first</tt>.</ | |||
| nx style="verb">consistency</spanx> | td> | |||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>See <xref target="verify_consistency" format="default"/> for an outli | ||||
| ne of how to use the <tt>consistency</tt> | ||||
| output.</t> | output.</t> | |||
| </section> | ||||
| </section> | <section anchor="get-proof-by-hash" numbered="true" toc="default"> | |||
| <section anchor="get-proof-by-hash" title="Retrieve Merkle Inclusion Proof from | <name>Retrieve Merkle Inclusion Proof from Log by Leaf Hash</name> | |||
| Log by Leaf Hash"> | <t>GET <Base URL>/ct/v2/get-proof-by-hash</t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <t>GET <Base URL>/ct/v2/get-proof-by-hash</t> | <dt>Inputs:</dt> | |||
| <dd> | ||||
| <t><list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Inputs:"> | <dt>hash:</dt> | |||
| <list style="hanging"> | <dd>A base64-encoded v2 leaf hash.</dd> | |||
| <t hangText="hash:"> | <dt>tree_size:</dt> | |||
| A base64 encoded v2 leaf hash.</t> | <dd>The <tt>tree_size</tt> of the tree on which to base the proof, | |||
| <t hangText="tree_size:"> | in decimal.</dd> | |||
| The tree_size of the tree on which to base the proof, in decimal.</t> | </dl> | |||
| </list> | <t>The <tt>hash</tt> must be calculated as defined in <xref target="tr | |||
| </t> | ee_leaves" | |||
| </list></t> | format="default"/>. A v2 STH must | |||
| exist for the <tt>tree_size</tt>. Because of skew, the front end may n | ||||
| <t><list style='empty'> | ot know | |||
| <t>The <spanx style="verb">hash</spanx> must be calculated as defined in <xref | the requested tree head. In that case, it will return the latest STH it | |||
| target="tree_leaves"/>. A v2 STH must | knows, along | |||
| exist for the <spanx style="verb">tree_size</spanx>. Because of skew, the front | with an inclusion proof to that STH. If the front end knows the request | |||
| -end may not know | ed tree head, | |||
| the requested tree head. In that case, it will return the latest STH it knows, a | then only <tt>inclusion</tt> is returned.</t> | |||
| long | </dd> | |||
| with an inclusion proof to that STH. If the front-end knows the requested tree h | </dl> | |||
| ead | <dl newline="true" spacing="normal"> | |||
| then only <spanx style="verb">inclusion</spanx> is returned.</t> | <dt>Outputs:</dt> | |||
| </list></t> | <dd> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>inclusion:</dt> | |||
| <t hangText="Outputs:"> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>inclusion_proo | |||
| <list style="hanging"> | f_v2</tt> | |||
| <t hangText="inclusion:"> | whose <tt>inclusion_path</tt> array of Merkle Tree nodes proves the | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | inclusion | |||
| yle="verb">inclusion_proof_v2</spanx> whose | of the certificate (as specified by the <tt>hash</tt> parameter) in | |||
| <spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the | the | |||
| inclusion of the | selected STH.</dd> | |||
| certificate (as specified by the <spanx style="verb">hash</spanx> parameter) in | <dt>sth:</dt> | |||
| the selected STH.</t> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>signed_tree_he | |||
| <t hangText="sth:"> | ad_v2</tt>, | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | signed by this log.</dd> | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | </dl> | |||
| log.</t> | <t>Note that no signature is required for the <tt>inclusion</tt> out | |||
| </list> | put, as it is | |||
| </t> | used to verify inclusion in the selected STH, which is signed.</t> | |||
| </list></t> | </dd> | |||
| </dl> | ||||
| <t><list style='empty'> | <t>Error codes:</t> | |||
| <t>Note that no signature is required for the <spanx style="verb">inclusion</s | <table align="center"> | |||
| panx> output as it is used to | <thead> | |||
| verify inclusion in the selected STH, which is signed.</t> | <tr> | |||
| </list></t> | <th align="left">type</th> | |||
| <th align="left">detail</th> | ||||
| <t>Error codes:</t> | </tr> | |||
| </thead> | ||||
| <texttable> | <tbody> | |||
| <ttcol align='left'>type</ttcol> | <tr> | |||
| <ttcol align='left'>detail</ttcol> | <td align="left">hashUnknown</td> | |||
| <c>hashUnknown</c> | <td align="left"> | |||
| <c><spanx style="verb">hash</spanx> is not the hash of a known leaf (may b | <tt>hash</tt> is not the hash of a known leaf (may be caused by | |||
| e caused by skew or by a known certificate not yet merged).</c> | skew or by a known certificate not yet merged).</td> | |||
| <c>treeSizeUnknown</c> | </tr> | |||
| <c><spanx style="verb">hash</spanx> is before the latest known STH but is | <tr> | |||
| not from an existing STH.</c> | <td align="left">treeSizeUnknown</td> | |||
| </texttable> | <td align="left"> | |||
| <tt>hash</tt> is before the latest known STH but is not from an | ||||
| <t>See <xref target="verify_inclusion"/> for an outline of how to use the <spanx | existing STH.</td> | |||
| style="verb">inclusion</spanx> output.</t> | </tr> | |||
| </tbody> | ||||
| </section> | </table> | |||
| <section anchor="get-all-by-hash" title="Retrieve Merkle Inclusion Proof, STH an | <t>See <xref target="verify_inclusion" format="default"/> for an outline | |||
| d Consistency Proof by Leaf Hash"> | of how to use the <tt>inclusion</tt> output.</t> | |||
| </section> | ||||
| <t>GET <Base URL>/ct/v2/get-all-by-hash</t> | <section anchor="get-all-by-hash" numbered="true" toc="default"> | |||
| <name>Retrieve Merkle Inclusion Proof, STH, and Consistency Proof by Lea | ||||
| <t><list style="hanging"> | f Hash</name> | |||
| <t hangText="Inputs:"> | <t>GET <Base URL>/ct/v2/get-all-by-hash</t> | |||
| <list style="hanging"> | <dl newline="true" spacing="normal"> | |||
| <t hangText="hash:"> | <dt>Inputs:</dt> | |||
| A base64 encoded v2 leaf hash.</t> | <dd> | |||
| <t hangText="tree_size:"> | <dl newline="false" spacing="normal"> | |||
| The tree_size of the tree on which to base the proofs, in decimal.</t> | <dt>hash:</dt> | |||
| </list> | <dd>A base64-encoded v2 leaf hash.</dd> | |||
| </t> | <dt>tree_size:</dt> | |||
| </list></t> | <dd>The <tt>tree_size</tt> of the tree on which to base the proofs, | |||
| in decimal.</dd> | ||||
| <t><list style='empty'> | </dl> | |||
| <t>The <spanx style="verb">hash</spanx> must be calculated as defined in <xref | <t>The <tt>hash</tt> must be calculated as defined in <xref target=" | |||
| target="tree_leaves"/>. A v2 STH must | tree_leaves" | |||
| exist for the <spanx style="verb">tree_size</spanx>.</t> | format="default"/>. A v2 STH must exist for the <tt>tree_size</tt>.</t> | |||
| </list></t> | </dd> | |||
| </dl> | ||||
| <t>Because of skew, the front-end may not know the requested tree head or the re | <t>Because of skew, the front end may not know the requested tree head o | |||
| quested | r the | |||
| hash, which leads to a number of cases:</t> | requested hash, which leads to a number of cases:</t> | |||
| <table align="center"> | ||||
| <texttable> | <thead> | |||
| <ttcol align='left'>Case</ttcol> | <tr> | |||
| <ttcol align='left'>Response</ttcol> | <th align="left">Case</th> | |||
| <c>latest STH < requested tree head</c> | <th align="left">Response</th> | |||
| <c>Return latest STH</c> | </tr> | |||
| <c>latest STH > requested tree head</c> | </thead> | |||
| <c>Return latest STH and a consistency proof between it and the requested | <tbody> | |||
| tree head (see <xref target="get-sth-consistency"/>)</c> | <tr> | |||
| <c>index of requested hash < latest STH</c> | <td align="left">latest STH < requested tree head</td> | |||
| <c>Return <spanx style="verb">inclusion</spanx></c> | <td align="left">Return latest STH.</td> | |||
| </texttable> | </tr> | |||
| <tr> | ||||
| <t>Note that more than one case can be true, in which case the returned data is | <td align="left">latest STH > requested tree head</td> | |||
| their union. It is also possible for none to be true, in which case the | <td align="left">Return latest STH and a consistency proof between | |||
| front-end MUST return an empty response.</t> | it and the requested tree head (see <xref target="get-sth-consistency" format=" | |||
| default"/>).</td> | ||||
| <t><list style="hanging"> | </tr> | |||
| <t hangText="Outputs:"> | <tr> | |||
| <list style="hanging"> | <td align="left">index of requested hash < latest STH</td> | |||
| <t hangText="inclusion:"> | <td align="left">Return <tt>inclusion</tt>.</td> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | </tr> | |||
| yle="verb">inclusion_proof_v2</spanx> whose | </tbody> | |||
| <spanx style="verb">inclusion_path</spanx> array of Merkle Tree nodes proves the | </table> | |||
| inclusion of the | <t>Note that more than one case can be true; in which case, the returned | |||
| certificate (as specified by the <spanx style="verb">hash</spanx> parameter) in | data is | |||
| the selected STH.</t> | their union. It is also possible for none to be true; in which case, the | |||
| <t hangText="sth:"> | front end <bcp14>MUST</bcp14> return an empty response.</t> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | <dl newline="true" spacing="normal"> | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | <dt>Outputs:</dt> | |||
| log.</t> | <dd> | |||
| <t hangText="consistency:"> | <dl newline="false" spacing="normal"> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | <dt>inclusion:</dt> | |||
| yle="verb">consistency_proof_v2</spanx> that proves the | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>inclusion_proo | |||
| consistency of the requested tree head and the returned STH.</t> | f_v2</tt> | |||
| </list> | whose <tt>inclusion_path</tt> array of Merkle Tree nodes proves the | |||
| </t> | inclusion | |||
| </list></t> | of the certificate (as specified by the <tt>hash</tt> parameter) in | |||
| the | ||||
| <t><list style='empty'> | selected STH.</dd> | |||
| <t>Note that no signature is required for the <spanx style="verb">inclusion</s | <dt>sth:</dt> | |||
| panx> or <spanx style="verb">consistency</spanx> | <dd>A base64-encoded <tt>TransItem</tt> of type <tt>signed_tree_he | |||
| outputs as they are used to verify inclusion in and consistency of STHs, which | ad_v2</tt>, | |||
| are signed.</t> | signed by this log.</dd> | |||
| </list></t> | <dt>consistency:</dt> | |||
| <dd>A base64-encoded <tt>TransItem</tt> of type <tt>consistency_pr | ||||
| <t>Errors are the same as in <xref target="get-proof-by-hash"/>.</t> | oof_v2</tt> | |||
| that proves the consistency of the requested tree head and the retu | ||||
| <t>See <xref target="verify_inclusion"/> for an outline of how to use the <spanx | rned | |||
| style="verb">inclusion</spanx> output, | STH.</dd> | |||
| and see <xref target="verify_consistency"/> for an outline of how to use the <sp | </dl> | |||
| anx style="verb">consistency</spanx> | <t>Note that no signature is required for the <tt>inclusion</tt> or | |||
| <tt>consistency</tt> outputs, as they are used to verify inclusion in | ||||
| and | ||||
| consistency of signed STHs.</t> | ||||
| </dd> | ||||
| </dl> | ||||
| <t>Errors are the same as in <xref target="get-proof-by-hash" format="de | ||||
| fault"/>.</t> | ||||
| <t>See <xref target="verify_inclusion" format="default"/> for an outline | ||||
| of how to use the <tt>inclusion</tt> output, | ||||
| and see <xref target="verify_consistency" format="default"/> for an outline of h | ||||
| ow to use the <tt>consistency</tt> | ||||
| output.</t> | output.</t> | |||
| </section> | ||||
| </section> | <section anchor="get-entries" numbered="true" toc="default"> | |||
| <section anchor="get-entries" title="Retrieve Entries and STH from Log"> | <name>Retrieve Entries and STH from Log</name> | |||
| <t>GET <Base URL>/ct/v2/get-entries</t> | ||||
| <t>GET <Base URL>/ct/v2/get-entries</t> | <dl newline="true" spacing="normal"> | |||
| <dt>Inputs:</dt> | ||||
| <t><list style="hanging"> | <dd> | |||
| <t hangText="Inputs:"> | <dl newline="false" spacing="normal"> | |||
| <list style="hanging"> | <dt>start:</dt> | |||
| <t hangText="start:"> | <dd>0-based index of first entry to retrieve, in decimal.</dd> | |||
| 0-based index of first entry to retrieve, in decimal.</t> | <dt>end:</dt> | |||
| <t hangText="end:"> | <dd>0-based index of last entry to retrieve, in decimal.</dd> | |||
| 0-based index of last entry to retrieve, in decimal.</t> | </dl> | |||
| </list> | </dd> | |||
| </t> | <dt>Outputs:</dt> | |||
| <t hangText="Outputs:"> | <dd> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="entries:"> | <dt>entries:</dt> | |||
| An array of objects, each consisting of | <dd> | |||
| <t>An array of objects, each consisting of:</t> | ||||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="log_entry:"> | <dt>log_entry:</dt> | |||
| The base64 encoded <spanx style="verb">TransItem</spanx> structure | <dd>The base64-encoded <tt>TransItem</tt> structure of type | |||
| of type <spanx style="verb">x509_entry_v2</spanx> or | <tt>x509_entry_v2</tt> or | |||
| <spanx style="verb">precert_entry_v2</spanx> (see <xref target="log_entries"/>). | <tt>precert_entry_v2</tt> (see <xref target="log_entries" | |||
| </t> | format="default"/>).</dd> | |||
| <t hangText="submitted_entry:"> | <dt>submitted_entry:</dt> | |||
| JSON object equivalent to inputs that were submitted to | <dd>JSON object equivalent to inputs that were submitted to | |||
| <spanx style="verb">submit-entry</spanx>, with the addition of the trust anchor | <tt>submit-entry</tt>, with the addition of the trust anchor to | |||
| to the <spanx style="verb">chain</spanx> | the | |||
| field if the submission did not include it.</t> | <tt>chain</tt> field if the submission did not include it.</dd> | |||
| <t hangText="sct:"> | <dt>sct:</dt> | |||
| The base64 encoded <spanx style="verb">TransItem</spanx> of type < | <dd>The base64-encoded <tt>TransItem</tt> of type <tt>x509_sct | |||
| spanx style="verb">x509_sct_v2</spanx> or <spanx style="verb">precert_sct_v2</sp | _v2</tt> or | |||
| anx> | <tt>precert_sct_v2</tt>, corresponding to this log entry.</dd> | |||
| corresponding to this log entry.</t> | <dt>sth:</dt> | |||
| </list> | <dd>A base64-encoded <tt>TransItem</tt> of type | |||
| </t> | <tt>signed_tree_head_v2</tt>, signed by this log.</dd> | |||
| <t hangText="sth:"> | </dl> | |||
| A base64 encoded <spanx style="verb">TransItem</spanx> of type <spanx st | </dd> | |||
| yle="verb">signed_tree_head_v2</spanx>, signed by this | </dl> | |||
| log.</t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <t>Note that this message is not signed -- the <tt>entries</tt> data can | |||
| </list></t> | be verified by | |||
| <t>Note that this message is not signed -- the <spanx style="verb">entries</span | ||||
| x> data can be verified by | ||||
| constructing the Merkle Tree Hash corresponding to a retrieved STH. All leaves | constructing the Merkle Tree Hash corresponding to a retrieved STH. All leaves | |||
| MUST be v2. However, a compliant v2 client MUST NOT construe an unrecognized | <bcp14>MUST</bcp14> be v2. However, a compliant v2 client <bcp14>MUST NOT</bcp14 | |||
| TransItem type as an error. This means it may be unable to parse some entries, | > construe an unrecognized | |||
| <tt>TransItem</tt> type as an error. This means it may be unable to parse some e | ||||
| ntries, | ||||
| but note that each client can inspect the entries it does recognize as well as | but note that each client can inspect the entries it does recognize as well as | |||
| verify the integrity of the data by treating unrecognized leaves as opaque input | verify the integrity of the data by treating unrecognized leaves as opaque input | |||
| to the tree.</t> | to the tree.</t> | |||
| <t>The <tt>start</tt> and <tt>end</tt> parameters <bcp14>SHOULD</bcp14> | ||||
| <t>The <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx> par | be within the range 0 <= x < <tt>tree_size</tt>, | |||
| ameters SHOULD be within the range 0 <= x < <spanx style="verb">tree_size< | as returned by <tt>get-sth</tt> in <xref target="get-sth" format="default"/>.</t | |||
| /spanx> | > | |||
| as returned by <spanx style="verb">get-sth</spanx> in <xref target="get-sth"/>.< | <t>The <tt>start</tt> parameter <bcp14>MUST</bcp14> be less than or equa | |||
| /t> | l to the <tt>end</tt> parameter.</t> | |||
| <t>Each <tt>submitted_entry</tt> output parameter <bcp14>MUST</bcp14> in | ||||
| <t>The <spanx style="verb">start</spanx> parameter MUST be less than or equal to | clude the trust anchor that the | |||
| the <spanx style="verb">end</spanx> parameter.</t> | log used to verify the <tt>submission</tt>, even if that trust anchor was not pr | |||
| ovided | ||||
| <t>Each <spanx style="verb">submitted_entry</spanx> output parameter MUST includ | to <tt>submit-entry</tt> (see <xref target="submit-entry" format="default"/>). I | |||
| e the trust anchor that the | f the <tt>submission</tt> does not certify | |||
| log used to verify the <spanx style="verb">submission</spanx>, even if that trus | itself, then the first element of <tt>chain</tt> <bcp14>MUST</bcp14> be present | |||
| t anchor was not provided | and <bcp14>MUST</bcp14> certify the | |||
| to <spanx style="verb">submit-entry</spanx> (see <xref target="submit-entry"/>). | <tt>submission</tt>.</t> | |||
| If the <spanx style="verb">submission</spanx> does not certify | <t>Log servers <bcp14>MUST</bcp14> honor requests where 0 <= <tt>star | |||
| itself, then the first element of <spanx style="verb">chain</spanx> MUST be pres | t</tt> < <tt>tree_size</tt> and <tt>end</tt> >= | |||
| ent and MUST certify the | <tt>tree_size</tt> by returning a partial response covering only the valid entri | |||
| <spanx style="verb">submission</spanx>.</t> | es in | |||
| the specified range. <tt>end</tt> >= <tt>tree_size</tt> could be caused by sk | ||||
| <t>Log servers MUST honor requests where 0 <= <spanx style="verb">start</span | ew. Note that the | |||
| x> < <spanx style="verb">tree_size</spanx> and <spanx style="verb">end</spanx | ||||
| > >= | ||||
| <spanx style="verb">tree_size</spanx> by returning a partial response covering o | ||||
| nly the valid entries in | ||||
| the specified range. <spanx style="verb">end</spanx> >= <spanx style="verb">t | ||||
| ree_size</spanx> could be caused by skew. Note that the | ||||
| following restriction may also apply:</t> | following restriction may also apply:</t> | |||
| <t>Logs <bcp14>MAY</bcp14> restrict the number of entries that can be re | ||||
| <t>Logs MAY restrict the number of entries that can be retrieved per <spanx styl | trieved per <tt>get-entries</tt> | |||
| e="verb">get-entries</spanx> | ||||
| request. If a client requests more than the permitted number of entries, the log | request. If a client requests more than the permitted number of entries, the log | |||
| SHALL return the maximum number of entries permissible. These entries SHALL be | <bcp14>SHALL</bcp14> return the maximum number of entries permissible. These ent | |||
| sequential beginning with the entry specified by <spanx style="verb">start</span | ries <bcp14>SHALL</bcp14> be | |||
| x>. | sequential beginning with the entry specified by <tt>start</tt>. | |||
| Note that limit on the number of entries is not immutable and therefore | Note that a limit on the number of entries is not immutable, and therefore | |||
| the restriction may be changed or lifted at any time and is not listed | the restriction may be changed or lifted at any time and is not listed | |||
| with the other Log Parameters in <xref target="log_parameters"/>.</t> | with the other Log Parameters in <xref target="log_parameters" format="default"/ | |||
| >.</t> | ||||
| <t>Because of skew, it is possible the log server will not have any entries betw | <t>Because of skew, it is possible the log server will not have any entr | |||
| een | ies between | |||
| <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx>. In this c | <tt>start</tt> and <tt>end</tt>. In this case, it <bcp14>MUST</bcp14> return an | |||
| ase it MUST return an empty <spanx style="verb">entries</spanx> array.</t> | empty <tt>entries</tt> array.</t> | |||
| <t>In any case, the log server <bcp14>MUST</bcp14> return the latest STH | ||||
| <t>In any case, the log server MUST return the latest STH it knows about.</t> | it knows about.</t> | |||
| <t>See <xref target="verify_hash" format="default"/> for an outline of h | ||||
| <t>See <xref target="verify_hash"/> for an outline of how to use a complete list | ow to use a complete list of <tt>log_entry</tt> | |||
| of <spanx style="verb">log_entry</spanx> | entries to verify the <tt>root_hash</tt>.</t> | |||
| entries to verify the <spanx style="verb">root_hash</spanx>.</t> | <t>Error codes:</t> | |||
| <table align="center"> | ||||
| <t>Error codes:</t> | <thead> | |||
| <tr> | ||||
| <texttable> | <th align="left">type</th> | |||
| <ttcol align='left'>type</ttcol> | <th align="left">detail</th> | |||
| <ttcol align='left'>detail</ttcol> | </tr> | |||
| <c>startUnknown</c> | </thead> | |||
| <c><spanx style="verb">start</spanx> is greater than the number of entries | <tbody> | |||
| in the Merkle tree.</c> | <tr> | |||
| <c>endBeforeStart</c> | <td align="left">startUnknown</td> | |||
| <c><spanx style="verb">start</spanx> cannot be greater than <spanx style=" | <td align="left"> | |||
| verb">end</spanx>.</c> | <tt>start</tt> is greater than the number of entries in the Merk | |||
| </texttable> | le Tree.</td> | |||
| </tr> | ||||
| </section> | <tr> | |||
| <section anchor="get-anchors" title="Retrieve Accepted Trust Anchors"> | <td align="left">endBeforeStart</td> | |||
| <td align="left"> | ||||
| <t>GET <Base URL>/ct/v2/get-anchors</t> | <tt>start</tt> cannot be greater than <tt>end</tt>.</td> | |||
| </tr> | ||||
| <t>No inputs.</t> | </tbody> | |||
| </table> | ||||
| <t><list style="hanging"> | </section> | |||
| <t hangText="Outputs:"> | <section anchor="get-anchors" numbered="true" toc="default"> | |||
| <list style="hanging"> | <name>Retrieve Accepted Trust Anchors</name> | |||
| <t hangText="certificates:"> | <t>GET <Base URL>/ct/v2/get-anchors</t> | |||
| An array of JSON strings, each of which | <t>No inputs.</t> | |||
| is a base64 encoded CA certificate that is acceptable to the log.</t> | <dl newline="true" spacing="normal"> | |||
| <t hangText="max_chain_length:"> | <dt>Outputs:</dt> | |||
| If the server has chosen to limit the length of chains it accepts, this | <dd> | |||
| is | <dl newline="false" spacing="normal"> | |||
| the maximum number of certificates in the chain, in decimal. If there is no | <dt>certificates:</dt> | |||
| limit, this is omitted.</t> | <dd>An array of JSON strings, each of which | |||
| </list> | is a base64-encoded CA certificate that is acceptable to the log.</ | |||
| </t> | dd> | |||
| </list></t> | <dt>max_chain_length:</dt> | |||
| <dd>If the server has chosen to limit the length of chains it acce | ||||
| <t><list style='empty'> | pts, this is | |||
| <t>This data is not signed and the protocol depends on the security guarantees | the maximum number of certificates in the chain, in decimal. If the | |||
| of TLS to ensure correctness.</t> | re is no | |||
| </list></t> | limit, this is omitted.</dd> | |||
| </dl> | ||||
| </section> | <t>This data is not signed, and the protocol depends on the security | |||
| </section> | guarantees | |||
| <section anchor="tls_servers" title="TLS Servers"> | of TLS to ensure correctness.</t> | |||
| </dd> | ||||
| <t>CT-using TLS servers MUST use at least one of the mechanisms described below | </dl> | |||
| </section> | ||||
| </section> | ||||
| <section anchor="tls_servers" numbered="true" toc="default"> | ||||
| <name>TLS Servers</name> | ||||
| <t>CT-using TLS servers <bcp14>MUST</bcp14> use at least one of the mechan | ||||
| isms described below | ||||
| to present one or more SCTs from one or more logs to each TLS client during full | to present one or more SCTs from one or more logs to each TLS client during full | |||
| TLS handshakes, when requested by the client, where each SCT corresponds to the server certificate. | TLS handshakes, when requested by the client, where each SCT corresponds to the server certificate. | |||
| (Of course, a server can only send a TLS extension if the client has | (Of course, a server can only send a TLS extension if the client has | |||
| specified it first.) | specified it first.) | |||
| Servers | Servers | |||
| SHOULD also present corresponding inclusion proofs and STHs.</t> | <bcp14>SHOULD</bcp14> also present corresponding inclusion proofs and STHs.</t> | |||
| <t>A server can provide SCTs using | ||||
| <t>A server can provide SCTs using | a TLS 1.3 extension (<xref target="RFC8446" sectionFormat="of" section="4.2"/>) | |||
| a TLS 1.3 extension (Section 4.2 of <xref target="RFC8446"></xref>) with type <s | with type <tt>transparency_info</tt> | |||
| panx style="verb">transparency_info</spanx> | (see <xref target="tls_transinfo_extension" format="default"/>). This mechanism | |||
| (see <xref target="tls_transinfo_extension"/>). This mechanism allows TLS server | allows TLS servers to | |||
| s to | ||||
| participate in CT without the cooperation of CAs, unlike the other two | participate in CT without the cooperation of CAs, unlike the other two | |||
| mechanisms. It also allows SCTs and inclusion proofs to be updated on the fly.</ t> | mechanisms. It also allows SCTs and inclusion proofs to be updated on the fly.</ t> | |||
| <t>The server may also use an Online Certificate Status Protocol (OCSP) | ||||
| <t>The server may also use an Online Certificate Status Protocol (OCSP) | <xref target="RFC6960" format="default"/> response extension (see <xref target=" | |||
| <xref target="RFC6960"></xref> response extension (see <xref target="ocsp_transi | ocsp_transinfo_extension" format="default"/>), | |||
| nfo_extension"/>), | ||||
| providing the OCSP response as part of the TLS handshake. Providing | providing the OCSP response as part of the TLS handshake. Providing | |||
| a response during a TLS handshake is popularly known as "OCSP stapling." | a response during a TLS handshake is popularly known as "OCSP stapling". | |||
| For TLS | For TLS | |||
| 1.3, the information is encoded as an extension in the <spanx style="verb">statu | 1.3, the information is encoded as an extension in the <tt>status_request</tt> | |||
| s_request</spanx> | extension data; see <xref target="RFC8446" sectionFormat="of" section="4.4.2.1"/ | |||
| extension data; see Section 4.4.2.1 of <xref target="RFC8446"></xref>. For TLS 1 | >. For TLS 1.2 <xref target="RFC5246" format="default"/>, the information | |||
| .2 (<xref target="RFC5246"></xref>), the information | is encoded in the <tt>CertificateStatus</tt> message; see <xref target="RFC6066" | |||
| is encoded in the <spanx style="verb">CertificateStatus</spanx> message; see Sec | sectionFormat="of" section="8"/>. Using stapling also | |||
| tion 8 | ||||
| of <xref target="RFC6066"></xref>. Using stapling also | ||||
| allows SCTs and inclusion proofs to be updated on the fly.</t> | allows SCTs and inclusion proofs to be updated on the fly.</t> | |||
| <t>CT information can also be encoded as an extension in the X.509v3 certi | ||||
| <t>CT information can also be encoded as an extension in the X.509v3 certificate | ficate | |||
| (see <xref target="cert_transinfo_extension"/>). This | (see <xref target="cert_transinfo_extension" format="default"/>). This | |||
| mechanism allows the use of unmodified TLS servers, but the SCTs and inclusion | mechanism allows the use of unmodified TLS servers, but the SCTs and inclusion | |||
| proofs cannot be updated on the fly. Since the logs from which the SCTs and | proofs cannot be updated on the fly. Since the logs from which the SCTs and | |||
| inclusion proofs originated won't necessarily be accepted by TLS clients for | inclusion proofs originated won't necessarily be accepted by TLS clients for | |||
| the full lifetime of the certificate, there is a risk that TLS clients may | the full lifetime of the certificate, there is a risk that TLS clients may | |||
| subsequently consider the certificate to be non-compliant and in need of | subsequently consider the certificate to be noncompliant. In such an event, one | |||
| re-issuance or the use of one of the other two methods for delivering CT | of | |||
| information.</t> | the other two mechanisms will need to be used to deliver CT information, or, if | |||
| this is | ||||
| <section anchor="tls-client-authentication" title="TLS Client Authentication"> | not possible, the certificate will need to be reissued.</t> | |||
| <section anchor="tls-client-authentication" numbered="true" toc="default"> | ||||
| <t>This specification includes no description of how a TLS server can | <name>TLS Client Authentication</name> | |||
| <t>This specification includes no description of how a TLS server can | ||||
| use CT for TLS client certificates. | use CT for TLS client certificates. | |||
| While this may be useful, it is not documented here for the following | While this may be useful, it is not documented here for the following | |||
| reasons:</t> | reasons:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>The greater security exposure is for clients to end up interacting | |||
| <t>The greater security exposure is for clients to end up interacting with an | with an | |||
| illegitimate server.</t> | illegitimate server.</li> | |||
| <t>In general, TLS client certificates are not expected to be submitted to | <li>In general, TLS client certificates are not expected to be submitt | |||
| CT logs, particularly those intended for general public use.</t> | ed to | |||
| </list></t> | CT logs, particularly those intended for general public use.</li> | |||
| </ul> | ||||
| <t>A future version could include such information.</t> | <t>A future version could include such information.</t> | |||
| </section> | ||||
| </section> | <section anchor="multiple-scts" numbered="true" toc="default"> | |||
| <section anchor="multiple-scts" title="Multiple SCTs"> | <name>Multiple SCTs</name> | |||
| <t>CT-using TLS servers <bcp14>SHOULD</bcp14> send SCTs from multiple lo | ||||
| <t>CT-using TLS servers SHOULD send SCTs from multiple logs, because:</t> | gs because:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>The set of logs trusted by TLS clients is neither unified nor stat | |||
| <t>One or more logs may not have become acceptable to all CT-using TLS clients | ic; each | |||
| . | client vendor may maintain an independent list of trusted logs, and, o | |||
| Note that client discovery, trust, and distrust of logs is expected to | ver time, new logs | |||
| be handled out-of-band and is out of scope of this document.</t> | may become trusted and current logs may become distrusted. | |||
| <t>If a CA and a log collude, it is possible to temporarily hide misissuance f | Note that client discovery, trust, and distrust of logs are expected to | |||
| rom | be handled out of band and are out of scope of this document.</li> | |||
| clients. When a TLS client requires SCTs from multiple logs to be provided, it | <li>If a CA and a log collude, it is possible to temporarily hide misi | |||
| is more difficult to mount this attack.</t> | ssuance from | |||
| <t>If a log misbehaves or suffers a key compromise, a consequence may be that | clients. When a TLS client requires SCTs from multiple logs to be provi | |||
| clients cease to trust it. Since the time an SCT may be in use can be | ded, it | |||
| considerable (several years is common in current practice when embedded in a | is more difficult to mount this attack.</li> | |||
| certificate), including SCTs from multiple logs reduces the probability of the | <li>If a log misbehaves or suffers a key compromise, a consequence may | |||
| certificate being rejected by TLS clients.</t> | be that | |||
| <t>TLS clients may have policies related to the above risks requiring TLS serv | clients cease to trust it. Since the time an SCT may be in use can be | |||
| ers | considerable (several years is common in current practice when embedded | |||
| to present multiple SCTs. For example, at the time of writing, Chromium | in a | |||
| <xref target="Chromium.Log.Policy"></xref> requires multiple SCTs to be presente | certificate), including SCTs from multiple logs reduces the probability | |||
| d with EV | of the | |||
| certificates in order for the EV indicator to be shown.</t> | certificate being rejected by TLS clients.</li> | |||
| </list></t> | <li>TLS clients may have policies related to the above risks requiring | |||
| TLS servers | ||||
| <t>To select the logs from which to obtain SCTs, a TLS server can, for example, | to present multiple SCTs. For example, at the time of writing, Chromium | |||
| <xref target="Chromium.Log.Policy" format="default"/> requires multiple | ||||
| SCTs to be | ||||
| presented with Extended Validation (EV) | ||||
| certificates in order for the EV indicator to be shown.</li> | ||||
| </ul> | ||||
| <t>To select the logs from which to obtain SCTs, a TLS server can, for e | ||||
| xample, | ||||
| examine the set of logs popular TLS clients accept and recognize.</t> | examine the set of logs popular TLS clients accept and recognize.</t> | |||
| </section> | ||||
| </section> | <section anchor="transitemlist-structure" numbered="true" toc="default"> | |||
| <section anchor="transitemlist-structure" title="TransItemList Structure"> | <name>TransItemList Structure</name> | |||
| <t>Multiple SCTs, inclusion proofs, and indeed <tt>TransItem</tt> struct | ||||
| <t>Multiple SCTs, inclusion proofs, and indeed <spanx style="verb">TransItem</sp | ures of any | |||
| anx> structures of any type, | type are combined into a list as follows:</t> | |||
| are combined into a list as follows:</t> | <sourcecode type="tls-presentation"><![CDATA[ | |||
| <figure><artwork><![CDATA[ | ||||
| opaque SerializedTransItem<1..2^16-1>; | opaque SerializedTransItem<1..2^16-1>; | |||
| struct { | struct { | |||
| SerializedTransItem trans_item_list<1..2^16-1>; | SerializedTransItem trans_item_list<1..2^16-1>; | |||
| } TransItemList; | } TransItemList; | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>Here, <tt>SerializedTransItem</tt> is an opaque byte string that cont | ||||
| <t>Here, <spanx style="verb">SerializedTransItem</spanx> is an opaque byte strin | ains the | |||
| g that contains the | serialized <tt>TransItem</tt> structure. This encoding ensures that TLS c | |||
| serialized <spanx style="verb">TransItem</spanx> structure. This encoding ensure | lients can | |||
| s that TLS clients can | decode each <tt>TransItem</tt> individually (so, for example, if there is | |||
| decode each <spanx style="verb">TransItem</spanx> individually (so, for example, | a version | |||
| if there is a version | upgrade, out-of-date clients can still parse old <tt>TransItem</tt> struc | |||
| upgrade, out-of-date clients can still parse old <spanx style="verb">TransItem</ | tures while | |||
| spanx> structures while | skipping over new <tt>TransItem</tt> structures whose versions they don't | |||
| skipping over new <spanx style="verb">TransItem</spanx> structures whose version | understand).</t> | |||
| s they don't understand).</t> | </section> | |||
| <section anchor="presenting_transitems" numbered="true" toc="default"> | ||||
| </section> | <name>Presenting SCTs, Inclusions Proofs, and STHs</name> | |||
| <section anchor="presenting_transitems" title="Presenting SCTs, inclusions proof | <t>In each <tt>TransItemList</tt> that is sent during a TLS handshake, t | |||
| s and STHs"> | he TLS | |||
| server <bcp14>MUST</bcp14> include a <tt>TransItem</tt> structure of type <tt>x5 | ||||
| <t>In each <spanx style="verb">TransItemList</spanx> that is sent during a TLS h | 09_sct_v2</tt> or | |||
| andshake, the TLS | <tt>precert_sct_v2</tt>.</t> | |||
| server MUST include a <spanx style="verb">TransItem</spanx> structure of type <s | <t>Presenting inclusion proofs and STHs in the TLS handshake helps to pr | |||
| panx style="verb">x509_sct_v2</spanx> or | otect the | |||
| <spanx style="verb">precert_sct_v2</spanx>.</t> | client's privacy (see <xref target="fetching_inclusion_proofs" format="default"/ | |||
| >) and reduces load on log | ||||
| <t>Presenting inclusion proofs and STHs in the TLS handshake helps to protect th | servers. Therefore, if the TLS server can obtain them, it <bcp14>SHOULD</bcp14> | |||
| e | also include | |||
| client's privacy (see <xref target="fetching_inclusion_proofs"/>) and reduces lo | <tt>TransItem</tt>s of type <tt>inclusion_proof_v2</tt> and <tt>signed_tree_head | |||
| ad on log | _v2</tt> in the | |||
| servers. Therefore, if the TLS server can obtain them, it SHOULD also include | <tt>TransItemList</tt>.</t> | |||
| <spanx style="verb">TransItem</spanx>s of type <spanx style="verb">inclusion_pro | </section> | |||
| of_v2</spanx> and <spanx style="verb">signed_tree_head_v2</spanx> in the | <section anchor="tls_transinfo_extension" numbered="true" toc="default"> | |||
| <spanx style="verb">TransItemList</spanx>.</t> | <name>transparency_info TLS Extension</name> | |||
| <t>Provided that a TLS client includes the <tt>transparency_info</tt> ex | ||||
| </section> | tension type in | |||
| <section anchor="tls_transinfo_extension" title="transparency_info TLS Extension | the ClientHello and the TLS server supports the <tt>transparency_info</tt> exten | |||
| "> | sion:</t> | |||
| <ul spacing="normal"> | ||||
| <t>Provided that a TLS client includes the <spanx style="verb">transparency_info | <li>The TLS server <bcp14>MUST</bcp14> verify that the received | |||
| </spanx> extension type in | <tt>extension_data</tt> is empty.</li> | |||
| the ClientHello and the TLS server supports the <spanx style="verb">transparency | <li>The TLS server <bcp14>MUST</bcp14> construct a <tt>TransItemList</ | |||
| _info</spanx> extension:</t> | tt> of | |||
| relevant <tt>TransItem</tt>s (see | ||||
| <t><list style="symbols"> | <xref target="presenting_transitems" format="default"/>), which | |||
| <t>The TLS server MUST verify that the received <spanx style="verb">extension_ | <bcp14>SHOULD</bcp14> omit any <tt>TransItem</tt>s that are | |||
| data</spanx> is empty.</t> | already embedded in the server certificate or the stapled OCSP response | |||
| <t>The TLS server MUST construct a <spanx style="verb">TransItemList</spanx> o | (see | |||
| f relevant <spanx style="verb">TransItem</spanx>s (see | <xref target="x509v3_transinfo_extension" format="default"/>). If the c | |||
| <xref target="presenting_transitems"/>), which SHOULD omit any <spanx style="ver | onstructed | |||
| b">TransItem</spanx>s that are | <tt>TransItemList</tt> is not | |||
| already embedded in the server certificate or the stapled OCSP response (see | empty, then the TLS server <bcp14>MUST</bcp14> include the | |||
| <xref target="x509v3_transinfo_extension"/>). If the constructed <spanx style="v | <tt>transparency_info</tt> extension with | |||
| erb">TransItemList</spanx> is not | the <tt>extension_data</tt> set to this <tt>TransItemList</tt>. If the | |||
| empty, then the TLS server MUST include the <spanx style="verb">transparency_inf | list is | |||
| o</spanx> extension with | empty, then the server <bcp14>SHOULD</bcp14> omit the <tt>extension_dat | |||
| the <spanx style="verb">extension_data</spanx> set to this <spanx style="verb">T | a</tt> | |||
| ransItemList</spanx>. If the list is empty | element but <bcp14>MAY</bcp14> send it with an empty array.</li> | |||
| then the server SHOULD omit the <spanx style="verb">extension_data</spanx> eleme | </ul> | |||
| nt, but MAY send | <t>TLS servers <bcp14>MUST</bcp14> only include this extension in the fo | |||
| it with an empty array.</t> | llowing messages:</t> | |||
| </list></t> | <ul spacing="normal"> | |||
| <li>the ServerHello message (for TLS 1.2 or earlier)</li> | ||||
| <t>TLS servers MUST only include this extension in the following messages:</t> | <li>the Certificate or CertificateRequest message (for TLS 1.3)</li> | |||
| </ul> | ||||
| <t><list style="symbols"> | <t>TLS servers <bcp14>MUST NOT</bcp14> process or include this extension | |||
| <t>the ServerHello message (for TLS 1.2 or earlier).</t> | when a TLS session is | |||
| <t>the Certificate or CertificateRequest message (for TLS 1.3).</t> | ||||
| </list></t> | ||||
| <t>TLS servers MUST NOT process or include this extension when a TLS session is | ||||
| resumed, since session resumption uses the original session information.</t> | resumed, since session resumption uses the original session information.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="certification-authorities" numbered="true" toc="default"> | |||
| <section anchor="certification-authorities" title="Certification Authorities"> | <name>Certification Authorities</name> | |||
| <section anchor="x509v3_transinfo_extension" numbered="true" toc="default" | ||||
| <section anchor="x509v3_transinfo_extension" title="Transparency Information X.5 | > | |||
| 09v3 Extension"> | <name>Transparency Information X.509v3 Extension</name> | |||
| <t>The Transparency Information X.509v3 extension, which has OID 1.3.101 | ||||
| <t>The Transparency Information X.509v3 extension, which has OID 1.3.101.75 and | .75 and | |||
| SHOULD be non-critical, contains one or more <spanx style="verb">TransItem</span | <bcp14>SHOULD</bcp14> be noncritical, contains one or more <tt>TransItem< | |||
| x> structures in a | /tt> | |||
| <spanx style="verb">TransItemList</spanx>. This extension MAY be included in OCS | structures in a <tt>TransItemList</tt>. This extension <bcp14>MAY</bcp14> | |||
| P responses (see | be | |||
| <xref target="ocsp_transinfo_extension"/>) and certificates (see | included in OCSP responses (see | |||
| <xref target="cert_transinfo_extension"/>). Since RFC5280 requires the <spanx st | <xref target="ocsp_transinfo_extension" format="default"/>) and certifica | |||
| yle="verb">extnValue</spanx> field (an | tes (see | |||
| OCTET STRING) of each X.509v3 extension to include the DER encoding of an ASN.1 | <xref target="cert_transinfo_extension" format="default"/>). Since <xref | |||
| value, a <spanx style="verb">TransItemList</spanx> MUST NOT be included directly | target="RFC5280" format="default"/> requires the <tt>extnValue</tt> field | |||
| . Instead, it MUST be | (an | |||
| wrapped inside an additional OCTET STRING, which is then put into the | OCTET STRING) of each X.509v3 extension to include the DER encoding of an | |||
| <spanx style="verb">extnValue</spanx> field:</t> | ASN.1 | |||
| value, a <tt>TransItemList</tt> <bcp14>MUST NOT</bcp14> be included direc | ||||
| <figure><artwork><![CDATA[ | tly. | |||
| Instead, it <bcp14>MUST</bcp14> be | ||||
| wrapped inside an additional OCTET STRING, which is then put into the | ||||
| <tt>extnValue</tt> field:</t> | ||||
| <sourcecode type="asn.1"><![CDATA[ | ||||
| TransparencyInformationSyntax ::= OCTET STRING | TransparencyInformationSyntax ::= OCTET STRING | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t><tt>TransparencyInformationSyntax</tt> contains a <tt>TransItemList</ | ||||
| <t><spanx style="verb">TransparencyInformationSyntax</spanx> contains a <spanx s | tt>.</t> | |||
| tyle="verb">TransItemList</spanx>.</t> | <section anchor="ocsp_transinfo_extension" numbered="true" toc="default" | |||
| > | ||||
| <section anchor="ocsp_transinfo_extension" title="OCSP Response Extension"> | <name>OCSP Response Extension</name> | |||
| <t>A certification authority <bcp14>MAY</bcp14> include a Transparency | ||||
| <t>A certification authority MAY include a Transparency Information X.509v3 | Information | |||
| extension in the <spanx style="verb">singleExtensions</spanx> of a <spanx style= | X.509v3 extension in the <tt>singleExtensions</tt> of a <tt>SingleRespo | |||
| "verb">SingleResponse</spanx> in an OCSP response. | nse</tt> in | |||
| All included SCTs and inclusion proofs MUST be for the certificate identified by | an OCSP response. All included SCTs and inclusion proofs <bcp14>MUST</b | |||
| the <spanx style="verb">certID</spanx> of that <spanx style="verb">SingleRespons | cp14> be for | |||
| e</spanx>, or for a precertificate that corresponds | the certificate identified by the <tt>certID</tt> of that <tt>SingleRes | |||
| to that certificate.</t> | ponse</tt> | |||
| or for a precertificate that corresponds to that certificate.</t> | ||||
| </section> | </section> | |||
| <section anchor="cert_transinfo_extension" title="Certificate Extension"> | <section anchor="cert_transinfo_extension" numbered="true" toc="default" | |||
| > | ||||
| <t>A certification authority MAY include a Transparency Information X.509v3 | <name>Certificate Extension</name> | |||
| extension in a certificate. All included SCTs and inclusion proofs MUST be for a | <t>A certification authority <bcp14>MAY</bcp14> include a Transparency | |||
| Information X.509v3 | ||||
| extension in a certificate. All included SCTs and inclusion proofs <bcp14>MUST</ | ||||
| bcp14> be for a | ||||
| precertificate that corresponds to this certificate.</t> | precertificate that corresponds to this certificate.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="tls-feature-x509v3-extension" numbered="true" toc="defaul | |||
| <section anchor="tls-feature-x509v3-extension" title="TLS Feature X.509v3 Extens | t"> | |||
| ion"> | <name>TLS Feature X.509v3 Extension</name> | |||
| <t>A certification authority <bcp14>SHOULD NOT</bcp14> issue any certifi | ||||
| <t>A certification authority SHOULD NOT issue any certificate that identifies th | cate that identifies the | |||
| e | <tt>transparency_info</tt> TLS extension in a TLS feature extension <xref target | |||
| <spanx style="verb">transparency_info</spanx> TLS extension in a TLS feature ext | ="RFC7633" format="default"/>, because | |||
| ension <xref target="RFC7633"></xref>, because | TLS servers are not required to support the <tt>transparency_info</tt> TLS exten | |||
| TLS servers are not required to support the <spanx style="verb">transparency_inf | sion in | |||
| o</spanx> TLS extension in | order to participate in CT (see <xref target="tls_servers" format="default"/>).< | |||
| order to participate in CT (see <xref target="tls_servers"/>).</t> | /t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="clients" numbered="true" toc="default"> | |||
| <section anchor="clients" title="Clients"> | <name>Clients</name> | |||
| <t>There are various different functions clients of logs might perform. We | ||||
| <t>There are various different functions clients of logs might perform. We descr | describe | |||
| ibe | here some typical clients and how they should function. Any inconsistency | |||
| here some typical clients and how they should function. Any inconsistency may be | may be | |||
| used as evidence that a log has not behaved correctly, and the signatures on the | used as evidence that a log has not behaved correctly, and the signatures | |||
| data structures prevent the log from denying that misbehavior.</t> | on the | |||
| data structures prevent the log from denying that misbehavior.</t> | ||||
| <t>All clients need various parameters in order to communicate with logs and ver | <t>All clients need various parameters in order to communicate with logs a | |||
| ify | nd verify | |||
| their responses. These parameters are described in <xref target="log_parameters" | their responses. These parameters are described in <xref target="log_param | |||
| />, but note | eters" | |||
| that this document does not describe how the parameters are obtained, which is | format="default"/>, but note | |||
| implementation-dependent (see, for example, <xref target="Chromium.Policy"></xre | that this document does not describe how the parameters are obtained, whic | |||
| f>).</t> | h is | |||
| implementation dependent (for example, see <xref target="Chromium.Policy" | ||||
| <section anchor="tls_clients" title="TLS Client"> | format="default"/>).</t> | |||
| <section anchor="tls_clients" numbered="true" toc="default"> | ||||
| <section anchor="receiving_transitems" title="Receiving SCTs and inclusion proof | <name>TLS Client</name> | |||
| s"> | <section anchor="receiving_transitems" numbered="true" toc="default"> | |||
| <name>Receiving SCTs and Inclusion Proofs</name> | ||||
| <t>TLS clients receive SCTs and inclusion proofs alongside or in certificates. | <t>TLS clients receive SCTs and inclusion proofs alongside or in certi | |||
| CT-using TLS clients MUST implement all of the three mechanisms by which TLS | ficates. | |||
| servers may present SCTs (see <xref target="tls_servers"/>).</t> | CT-using TLS clients <bcp14>MUST</bcp14> implement all of the three mec | |||
| hanisms by | ||||
| <t>TLS clients that support the <spanx style="verb">transparency_info</spanx> TL | which TLS servers may present SCTs (see <xref target="tls_servers" | |||
| S extension | format="default"/>).</t> | |||
| (see <xref target="tls_transinfo_extension"/>) SHOULD include it in ClientHello | <t>TLS clients that support the <tt>transparency_info</tt> TLS extensi | |||
| messages, | on | |||
| with empty <spanx style="verb">extension_data</spanx>. If a TLS server includes | (see <xref target="tls_transinfo_extension" format="default"/>) | |||
| the <spanx style="verb">transparency_info</spanx> | <bcp14>SHOULD</bcp14> include it in ClientHello messages, | |||
| TLS extension when resuming a TLS session, the TLS client MUST abort the | with empty <tt>extension_data</tt>. If a TLS server includes the | |||
| handshake.</t> | <tt>transparency_info</tt> TLS extension when resuming a TLS session, t | |||
| he TLS | ||||
| </section> | client <bcp14>MUST</bcp14> abort the handshake.</t> | |||
| <section anchor="reconstructing_tbscertificate" title="Reconstructing the TBSCer | </section> | |||
| tificate"> | <section anchor="reconstructing_tbscertificate" numbered="true" toc="def | |||
| ault"> | ||||
| <t>Validation of an SCT for a certificate (where the <spanx style="verb">type</s | <name>Reconstructing the TBSCertificate</name> | |||
| panx> of the <spanx style="verb">TransItem</spanx> is | <t>Validation of an SCT for a certificate (where the <tt>type</tt> of | |||
| <spanx style="verb">x509_sct_v2</spanx>) uses the unmodified TBSCertificate comp | the <tt>TransItem</tt> is | |||
| onent of the certificate.</t> | <tt>x509_sct_v2</tt>) uses the unmodified TBSCertificate component of the certif | |||
| icate.</t> | ||||
| <t>Before an SCT for a precertificate (where the <spanx style="verb">type</spanx | <t>Before an SCT for a precertificate (where the <tt>type</tt> of the | |||
| > of the <spanx style="verb">TransItem</spanx> is | <tt>TransItem</tt> is | |||
| <spanx style="verb">precert_sct_v2</spanx>) can be validated, the TBSCertificate | <tt>precert_sct_v2</tt>) can be validated, the TBSCertificate component of the | |||
| component of the | ||||
| precertificate needs to be reconstructed from the TBSCertificate component of | precertificate needs to be reconstructed from the TBSCertificate component of | |||
| the certificate as follows:</t> | the certificate as follows:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>Remove the Transparency Information extension | |||
| <t>Remove the Transparency Information extension | (see <xref target="x509v3_transinfo_extension" format="default"/>).</ | |||
| (see <xref target="x509v3_transinfo_extension"/>).</t> | li> | |||
| <t>Remove embedded v1 SCTs, identified by OID 1.3.6.1.4.1.11129.2.4.2 (see | <li>Remove embedded v1 SCTs, identified by OID 1.3.6.1.4.1.11129.2.4 | |||
| section 3.3 of <xref target="RFC6962"></xref>). This allows embedded v1 and v2 S | .2 (see | |||
| CTs to co-exist in | <xref target="RFC6962" sectionFormat="of" section="3.3"/>). This allo | |||
| a certificate (see <xref target="v1_coexistence"/>).</t> | ws embedded | |||
| </list></t> | v1 and v2 SCTs to co-exist in | |||
| a certificate (see <xref target="v1_coexistence" format="default"/>). | ||||
| </section> | </li> | |||
| <section anchor="validating-scts" title="Validating SCTs"> | </ul> | |||
| </section> | ||||
| <t>In order to make use of a received SCT, the TLS client MUST first validate it | <section anchor="validating-scts" numbered="true" toc="default"> | |||
| as | <name>Validating SCTs</name> | |||
| <t>In order to make use of a received SCT, the TLS client <bcp14>MUST< | ||||
| /bcp14> first validate it as | ||||
| follows:</t> | follows:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>Compute the signature input by constructing a <spanx style="verb">TransItem | <t>Compute the signature input by constructing a <tt>TransItem</tt | |||
| </spanx> of type | > of type | |||
| <spanx style="verb">x509_entry_v2</spanx> or <spanx style="verb">precert_entry_v | <tt>x509_entry_v2</tt> or <tt>precert_entry_v2</tt>, depending on t | |||
| 2</spanx>, depending on the SCT's <spanx style="verb">TransItem</spanx> | he SCT's | |||
| type. The <spanx style="verb">TimestampedCertificateEntryDataV2</spanx> structur | <tt>TransItem</tt> | |||
| e is constructed in the | type. The <tt>TimestampedCertificateEntryDataV2</tt> structure is c | |||
| following manner: | onstructed | |||
| <list style="symbols"> | in the following manner: | |||
| <t><spanx style="verb">timestamp</spanx> is copied from the SCT.</t> | </t> | |||
| <t><spanx style="verb">tbs_certificate</spanx> is the reconstructed TBSCer | <ul spacing="normal"> | |||
| tificate portion of the server | <li><tt>timestamp</tt> is copied from the SCT.</li> | |||
| certificate, as described in <xref target="reconstructing_tbscertificate"/>.</t | <li><tt>tbs_certificate</tt> is the reconstructed TBSCertificate | |||
| > | portion of | |||
| <t><spanx style="verb">issuer_key_hash</spanx> is computed as described in | the server certificate, as described in <xref | |||
| <xref target="tree_leaves"/>.</t> | target="reconstructing_tbscertificate" format="default"/>.</li> | |||
| <t><spanx style="verb">sct_extensions</spanx> is copied from the SCT.</t> | <li><tt>issuer_key_hash</tt> is computed as described in <xref | |||
| </list></t> | target="tree_leaves" format="default"/>.</li> | |||
| <t>Verify the SCT's <spanx style="verb">signature</spanx> against the computed | <li><tt>sct_extensions</tt> is copied from the SCT.</li> | |||
| signature input using the | </ul> | |||
| public key of the corresponding log, which is identified by the <spanx style="ve | </li> | |||
| rb">log_id</spanx>. The | <li>Verify the SCT's <tt>signature</tt> against the computed signatu | |||
| required signature algorithm is one of the log's parameters.</t> | re input using the | |||
| </list></t> | public key of the corresponding log, which is identified by the <tt>log_id</tt>. | |||
| The | ||||
| <t>If the TLS client does not have the corresponding log's parameters, it cannot | required signature algorithm is one of the log's parameters.</li> | |||
| </ul> | ||||
| <t>If the TLS client does not have the corresponding log's parameters, | ||||
| it cannot | ||||
| attempt to validate the SCT. When evaluating compliance (see | attempt to validate the SCT. When evaluating compliance (see | |||
| <xref target="evaluating_compliance"/>), the TLS client will consider only those SCTs that it | <xref target="evaluating_compliance" format="default"/>), the TLS client will co nsider only those SCTs that it | |||
| was able to validate.</t> | was able to validate.</t> | |||
| <t>Note that SCT validation is not a substitute for the normal validat | ||||
| <t>Note that SCT validation is not a substitute for the normal validation of the | ion of the | |||
| server certificate and its chain.</t> | server certificate and its chain.</t> | |||
| </section> | ||||
| </section> | <section anchor="fetching_inclusion_proofs" numbered="true" toc="default | |||
| <section anchor="fetching_inclusion_proofs" title="Fetching inclusion proofs"> | "> | |||
| <name>Fetching Inclusion Proofs</name> | ||||
| <t>When a TLS client has validated a received SCT but does not yet possess | <t>When a TLS client has validated a received SCT but does not yet pos | |||
| a corresponding inclusion proof, the TLS client MAY request the inclusion | sess | |||
| proof directly from a log using <spanx style="verb">get-proof-by-hash</spanx> (< | a corresponding inclusion proof, the TLS client <bcp14>MAY</bcp14> request the i | |||
| xref target="get-proof-by-hash"/>) or | nclusion | |||
| <spanx style="verb">get-all-by-hash</spanx> (<xref target="get-all-by-hash"/>).< | proof directly from a log using <tt>get-proof-by-hash</tt> (<xref target="get-pr | |||
| /t> | oof-by-hash" format="default"/>) or | |||
| <tt>get-all-by-hash</tt> (<xref target="get-all-by-hash" format="default"/>).</t | ||||
| <t>Note that fetching inclusion proofs directly from a log will disclose to the | > | |||
| <t>Note that fetching inclusion proofs directly from a log will disclo | ||||
| se to the | ||||
| log which TLS server the client has been communicating with. This may be | log which TLS server the client has been communicating with. This may be | |||
| regarded as a significant privacy concern, and so it is preferable for the TLS | regarded as a significant privacy concern, and so it is preferable for the TLS | |||
| server to send the inclusion proofs (see <xref target="presenting_transitems"/>) | server to send the inclusion proofs (see <xref target="presenting_transitems" fo | |||
| .</t> | rmat="default"/>).</t> | |||
| </section> | ||||
| </section> | <section anchor="validating_inclusion_proofs" numbered="true" toc="defau | |||
| <section anchor="validating_inclusion_proofs" title="Validating inclusion proofs | lt"> | |||
| "> | <name>Validating Inclusion Proofs</name> | |||
| <t>When a TLS client has received, or fetched, an inclusion proof (and | ||||
| <t>When a TLS client has received, or fetched, an inclusion proof (and an STH), | an STH), | |||
| it SHOULD proceed to verifying the inclusion proof to the provided STH. | it <bcp14>SHOULD</bcp14> proceed to verify the inclusion proof to the provided S | |||
| The TLS client SHOULD also verify consistency between the provided STH | TH. | |||
| The TLS client <bcp14>SHOULD</bcp14> also verify consistency between the provide | ||||
| d STH | ||||
| and an STH it knows about.</t> | and an STH it knows about.</t> | |||
| <t>If the TLS client holds an STH that predates the SCT, it <bcp14>MAY | ||||
| <t>If the TLS client holds an STH that predates the SCT, it MAY, in the process | </bcp14>, in the process of | |||
| of | auditing, request a new STH from the log (<xref target="get-sth" format="default | |||
| auditing, request a new STH from the log (<xref target="get-sth"/>), then verify | "/>) and then verify it by | |||
| it by | requesting a consistency proof (<xref target="get-sth-consistency" format="defau | |||
| requesting a consistency proof (<xref target="get-sth-consistency"/>). Note that | lt"/>). Note that if the TLS | |||
| if the TLS | client uses <tt>get-all-by-hash</tt>, then it will already have the new STH.</t> | |||
| client uses <spanx style="verb">get-all-by-hash</spanx>, then it will already ha | </section> | |||
| ve the new STH.</t> | <section anchor="evaluating_compliance" numbered="true" toc="default"> | |||
| <name>Evaluating Compliance</name> | ||||
| </section> | <t>It is up to a client's local policy to specify the quantity and for | |||
| <section anchor="evaluating_compliance" title="Evaluating compliance"> | m of | |||
| evidence (SCTs, inclusion proofs, or a combination) needed to achieve | ||||
| <t>It is up to a client's local policy to specify the quantity and form of | compliance and how to handle noncompliance.</t> | |||
| evidence (SCTs, inclusion proofs or a combination) needed to achieve | <t>A TLS client can only evaluate compliance if it has given the TLS s | |||
| compliance and how to handle non-compliance.</t> | erver the | |||
| <t>A TLS client can only evaluate compliance if it has given the TLS server the | ||||
| opportunity to send SCTs and inclusion proofs by any of the three mechanisms | opportunity to send SCTs and inclusion proofs by any of the three mechanisms | |||
| that are mandatory to implement for CT-using TLS clients (see | that are mandatory to implement for CT-using TLS clients (see | |||
| <xref target="receiving_transitems"/>). Therefore, a TLS client MUST NOT evaluat | <xref target="receiving_transitems" format="default"/>). Therefore, a TLS client | |||
| e compliance | <bcp14>MUST NOT</bcp14> evaluate compliance | |||
| if it did not include both the <spanx style="verb">transparency_info</spanx> and | if it did not include both the <tt>transparency_info</tt> and <tt>status_request | |||
| <spanx style="verb">status_request</spanx> TLS | </tt> TLS | |||
| extensions in the ClientHello.</t> | extensions in the ClientHello.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="monitor" numbered="true" toc="default"> | |||
| <section anchor="monitor" title="Monitor"> | <name>Monitor</name> | |||
| <t>Monitors watch logs to check for correct behavior, for certificates o | ||||
| <t>Monitors watch logs to check that they behave correctly, for certificates of | f | |||
| interest, or both. For example, a monitor may be configured to report on all | interest, or for both. For example, a monitor may be configured to report on all | |||
| certificates that apply to a specific domain name when fetching new entries for | certificates that apply to a specific domain name when fetching new entries for | |||
| consistency validation.</t> | consistency validation.</t> | |||
| <t>A monitor <bcp14>MUST</bcp14> at least inspect every new entry in eve | ||||
| <t>A monitor MUST at least inspect every new entry in every log it watches, and | ry log it watches, and it | |||
| it | <bcp14>MAY</bcp14> also choose to keep copies of entire logs.</t> | |||
| MAY also choose to keep copies of entire logs.</t> | <t>To inspect all of the existing entries, the monitor <bcp14>SHOULD</bc | |||
| p14> follow these steps | ||||
| <t>To inspect all of the existing entries, the monitor SHOULD follow these steps | ||||
| once for each log:</t> | once for each log:</t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t><list style="numbers"> | <li>Fetch the current STH (<xref target="get-sth" format="default"/>).< | |||
| <t>Fetch the current STH (<xref target="get-sth"/>).</t> | /li> | |||
| <t>Verify the STH signature.</t> | <li>Verify the STH signature.</li> | |||
| <t>Fetch all the entries in the tree corresponding to the STH (<xref target="g | <li>Fetch all the entries in the tree corresponding to the STH (<xref | |||
| et-entries"/>).</t> | target="get-entries" format="default"/>).</li> | |||
| <t>If applicable, check each entry to see if it's a certificate of interest.</ | <li>If applicable, check each entry to see if it's a certificate of in | |||
| t> | terest.</li> | |||
| <t>Confirm that the tree made from the fetched entries produces the same hash | <li>Confirm that the tree made from the fetched entries produces the s | |||
| as | ame hash as | |||
| that in the STH.</t> | that in the STH.</li> | |||
| </list></t> | </ol> | |||
| <t>To inspect new entries, the monitor <bcp14>SHOULD</bcp14> follow thes | ||||
| <t>To inspect new entries, the monitor SHOULD follow these steps repeatedly for | e steps | |||
| each log:</t> | repeatedly for each log:</t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t><list style="numbers"> | <li>Fetch the current STH (<xref target="get-sth" format="default"/>). | |||
| <t>Fetch the current STH (<xref target="get-sth"/>). Repeat until the STH chan | Repeat until | |||
| ges. | the STH changes. To allow for experimentation, this document does not s | |||
| This document does not specify the polling frequency, to allow for | pecify the polling frequency.</li> | |||
| experimentation.</t> | <li>Verify the STH signature.</li> | |||
| <t>Verify the STH signature.</t> | <li>Fetch all the new entries in the tree corresponding to the STH | |||
| <t>Fetch all the new entries in the tree corresponding to the STH | (<xref target="get-entries" format="default"/>). If they remain unavail | |||
| (<xref target="get-entries"/>). If they remain unavailable for an extended perio | able for an | |||
| d, then | extended period, then this should be viewed as misbehavior on the part | |||
| this should be viewed as misbehavior on the part of the log.</t> | of the | |||
| <t>If applicable, check each entry to see if it's a certificate of interest.</ | log.</li> | |||
| t> | <li>If applicable, check each entry to see if it's a certificate of in | |||
| <t>Either: <list style="numbers"> | terest.</li> | |||
| <t>Verify that the updated list of all entries generates a tree with the | <li> | |||
| same hash as the new STH.</t> | <t>Either:</t> | |||
| </list> | <ol spacing="normal" type="a"> | |||
| Or, if it is not keeping all log entries: <list style="numbers"> | <li>Verify that the updated list of all entries generates a tree wi | |||
| <t>Fetch a consistency proof for the new STH with the previous STH | th the | |||
| (<xref target="get-sth-consistency"/>).</t> | same hash as the new STH.</li> | |||
| <t>Verify the consistency proof.</t> | </ol> | |||
| <t>Verify that the new entries generate the corresponding elements in the | <t>Or, if it is not keeping all log entries:</t> | |||
| consistency proof.</t> | <ol spacing="normal" type="a"> | |||
| </list></t> | <li>Fetch a consistency proof for the new STH with the previous STH | |||
| <t>Repeat from step 1.</t> | (<xref target="get-sth-consistency" format="default"/>).</li> | |||
| </list></t> | <li>Verify the consistency proof.</li> | |||
| <li>Verify that the new entries generate the corresponding element | ||||
| </section> | s in the | |||
| <section anchor="auditing" title="Auditing"> | consistency proof.</li> | |||
| </ol> | ||||
| <t>Auditing ensures that the current published state of a log is reachable from | </li> | |||
| previously published states that are known to be good, and that the promises | <li>Repeat from Step 1.</li> | |||
| made by the log in the form of SCTs have been kept. Audits are performed by | </ol> | |||
| </section> | ||||
| <section anchor="auditing" numbered="true" toc="default"> | ||||
| <name>Auditing</name> | ||||
| <t>Auditing ensures that the current published state of a log is reachab | ||||
| le from | ||||
| previously published states that are known to be good and that the promises | ||||
| made by the log, in the form of SCTs, have been kept. Audits are performed by | ||||
| monitors or TLS clients.</t> | monitors or TLS clients.</t> | |||
| <t>In particular, there are four properties of log behavior that should | ||||
| <t>In particular, there are four log behavior properties that should be checked: | be checked:</t> | |||
| </t> | <ul spacing="normal"> | |||
| <li>the Maximum Merge Delay (MMD)</li> | ||||
| <t><list style="symbols"> | <li>the STH Frequency Count</li> | |||
| <t>The Maximum Merge Delay (MMD).</t> | <li>the append-only property</li> | |||
| <t>The STH Frequency Count.</t> | <li>the consistency of the log view presented to all query sources</li | |||
| <t>The append-only property.</t> | > | |||
| <t>The consistency of the log view presented to all query sources.</t> | </ul> | |||
| </list></t> | <t>A benign, conformant log publishes a series of STHs over time, each d | |||
| erived from | ||||
| <t>A benign, conformant log publishes a series of STHs over time, each derived f | ||||
| rom | ||||
| the previous STH and the submitted entries incorporated into the log since | the previous STH and the submitted entries incorporated into the log since | |||
| publication of the previous STH. This can be proven through auditing of STHs. | publication of the previous STH. This can be proven through auditing of STHs. | |||
| SCTs returned to TLS clients can be audited by verifying against the | SCTs returned to TLS clients can be audited by verifying against the | |||
| accompanying certificate, and using Merkle Inclusion Proofs, against the log's | accompanying certificate and using Merkle inclusion proofs against the log's | |||
| Merkle tree.</t> | Merkle Tree.</t> | |||
| <t>The action taken by the auditor, if an audit fails, is not specified, | ||||
| <t>The action taken by the auditor if an audit fails is not specified, but note | but note | |||
| that in general if audit fails, the auditor is in possession of signed proof of | that in general, if an audit fails, the auditor is in possession of signed proof | |||
| of | ||||
| the log's misbehavior.</t> | the log's misbehavior.</t> | |||
| <t>A monitor (<xref target="monitor" format="default"/>) can audit by ve | ||||
| <t>A monitor (<xref target="monitor"/>) can audit by verifying the consistency o | rifying the consistency of STHs it | |||
| f STHs it | receives, ensuring that each entry can be fetched and that the STH is indeed the | |||
| receives, ensure that each entry can be fetched and that the STH is indeed the | ||||
| result of making a tree from all fetched entries.</t> | result of making a tree from all fetched entries.</t> | |||
| <t>A TLS client (<xref target="tls_clients" format="default"/>) can audi | ||||
| <t>A TLS client (<xref target="tls_clients"/>) can audit by verifying an SCT aga | t by verifying an SCT against any STH | |||
| inst any STH | ||||
| dated after the SCT timestamp + the Maximum Merge Delay by requesting a Merkle | dated after the SCT timestamp + the Maximum Merge Delay by requesting a Merkle | |||
| inclusion proof (<xref target="get-proof-by-hash"/>). It can also verify that th e SCT | inclusion proof (<xref target="get-proof-by-hash" format="default"/>). It can al so verify that the SCT | |||
| corresponds to the server certificate it arrived with (i.e., the log entry is | corresponds to the server certificate it arrived with (i.e., the log entry is | |||
| that certificate, or is a precertificate corresponding to that certificate).</t> | that certificate or is a precertificate corresponding to that certificate).</t> | |||
| <t>Checking of the consistency of the log view presented to all entities | ||||
| <t>Checking of the consistency of the log view presented to all entities is more | is more | |||
| difficult to perform because it requires a way to share log responses among a | difficult to perform because it requires a way to share log responses among a | |||
| set of CT-using entities, and is discussed in <xref target="misbehaving_logs"/>. | set of CT-using entities and is discussed in <xref target="misbehaving_logs" for | |||
| </t> | mat="default"/>.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | <section anchor="algorithm-agility" numbered="true" toc="default"> | |||
| <section anchor="algorithm-agility" title="Algorithm Agility"> | <name>Algorithm Agility</name> | |||
| <t>It is not possible for a log to change either of its algorithms part wa | ||||
| <t>It is not possible for a log to change any of its algorithms part way through | y through | |||
| its lifetime:</t> | its lifetime:</t> | |||
| <dl newline="false" spacing="normal"> | ||||
| <t><list style="hanging"> | <dt>Signature algorithm:</dt> | |||
| <t hangText="Signature algorithm:"> | <dd>SCT signatures must remain valid so signature algorithms can only be | |||
| SCT signatures must remain valid so signature algorithms can only be added, | added, | |||
| not removed.</t> | not removed.</dd> | |||
| <t hangText="Hash algorithm:"> | <dt>Hash algorithm:</dt> | |||
| A log would have to support the old and new hash algorithms to allow | <dd>A log would have to support the old and new hash algorithms to allow | |||
| backwards-compatibility with clients that are not aware of a hash algorithm | backwards compatibility with clients that are not aware of a hash algorit | |||
| change.</t> | hm | |||
| </list></t> | change.</dd> | |||
| </dl> | ||||
| <t>Allowing multiple signature or hash algorithms for a log would require that a | <t>Allowing multiple signature or hash algorithms for a log would require | |||
| ll | that all | |||
| data structures support it and would significantly complicate client | data structures support it and would significantly complicate client | |||
| implementation, which is why it is not supported by this document.</t> | implementation, which is why it is not supported by this document.</t> | |||
| <t>If it should become necessary to deprecate an algorithm used by a live | ||||
| <t>If it should become necessary to deprecate an algorithm used by a live log, t | log, then | |||
| hen | the log <bcp14>MUST</bcp14> be frozen, as specified in <xref target="log_shutdow | |||
| the log MUST be frozen as specified in <xref target="log_shutdown"/> and a new l | n" format="default"/>, and a new log <bcp14>SHOULD</bcp14> be | |||
| og SHOULD be | ||||
| started. Certificates in the frozen log that have not yet expired and require | started. Certificates in the frozen log that have not yet expired and require | |||
| new SCTs SHOULD be submitted to the new log and the SCTs from that log used | new SCTs <bcp14>SHOULD</bcp14> be submitted to the new log and the SCTs from tha t log used | |||
| instead.</t> | instead.</t> | |||
| </section> | ||||
| </section> | <section anchor="iana-considerations" numbered="true" toc="default"> | |||
| <section anchor="iana-considerations" title="IANA Considerations"> | <name>IANA Considerations</name> | |||
| <t>The assignment policy criteria mentioned in this section refer to the p | ||||
| <t>The assignment policy criteria mentioned in this section refer to the policie | olicies | |||
| s | outlined in <xref target="RFC8126" format="default"/>.</t> | |||
| outlined in <xref target="RFC8126"></xref>.</t> | <section anchor="additions-to-existing-registries" numbered="true" toc="de | |||
| fault"> | ||||
| <section anchor="additions-to-existing-registries" title="Additions to existing | <name>Additions to Existing Registries</name> | |||
| registries"> | <t>This subsection defines additions to existing registries.</t> | |||
| <section anchor="new-entry-to-the-tls-extensiontype-registry" numbered=" | ||||
| <t>This sub-section defines additions to existing registries.</t> | true" toc="default"> | |||
| <name>New Entry to the TLS ExtensionType Registry</name> | ||||
| <section anchor="new-entry-to-the-tls-extensiontype-registry" title="New Entry t | <t>IANA has added the following entry | |||
| o the TLS ExtensionType Registry"> | to the "TLS ExtensionType Values" registry defined in <xref target="RFC8446" for | |||
| mat="default"/>, | ||||
| <t>IANA is asked to add the following entry | ||||
| to the "TLS ExtensionType Values" registry defined in <xref target="RFC8446"></x | ||||
| ref>, | ||||
| with an assigned Value:</t> | with an assigned Value:</t> | |||
| <table align="center"> | ||||
| <texttable> | <thead> | |||
| <ttcol align='left'>Value</ttcol> | <tr> | |||
| <ttcol align='left'>Extension Name</ttcol> | <th align="left">Value</th> | |||
| <ttcol align='left'>TLS 1.3</ttcol> | <th align="left">Extension Name</th> | |||
| <ttcol align='left'>Recommended</ttcol> | <th align="left">TLS 1.3</th> | |||
| <ttcol align='left'>Reference</ttcol> | <th align="left">DTLS-Only</th> | |||
| <c>TBD</c> | <th align="left">Recommended</th> | |||
| <c>transparency_info</c> | <th align="left">Reference</th> | |||
| <c>CH, CR, CT</c> | </tr> | |||
| <c>Y</c> | </thead> | |||
| <c>RFCXXXX</c> | <tbody> | |||
| </texttable> | <tr> | |||
| <td align="left">52</td> | ||||
| </section> | <td align="left">transparency_info</td> | |||
| <section anchor="urn-sub-namespace-for-trans-urnietfparamstrans" title="URN Sub- | <td align="left">CH, CR, CT</td> | |||
| namespace for TRANS (urn:ietf:params:trans)"> | <td align="left">N</td> | |||
| <td align="left">Y</td> | ||||
| <t>IANA is requested to add a new entry in the | <td align="left">RFC 9162</td> | |||
| "IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" | </tr> | |||
| registry, following the template in <xref target="RFC3553"/>:</t> | </tbody> | |||
| </table> | ||||
| <t>Registry name: trans</t> | </section> | |||
| <section anchor="urn-sub-namespace-for-trans-urnietfparamstrans" numbere | ||||
| <t>Specification: RFCXXXX</t> | d="true" toc="default"> | |||
| <name>URN Sub-namespace for TRANS (urn:ietf:params:trans)</name> | ||||
| <t>Repository: https://www.iana.org/assignments/trans</t> | <t>IANA has added a new entry in the | |||
| "IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" | ||||
| <t>Index value: No transformation needed.</t> | registry, following the template in <xref target="RFC3553" format="defa | |||
| ult"/>:</t> | ||||
| </section> | <dl newline="false" spacing="compact"> | |||
| </section> | <dt>Registry name:</dt> | |||
| <section anchor="new-ct-related-registries" title="New CT-Related registries"> | <dd>trans</dd> | |||
| <dt>Specification:</dt> | ||||
| <t>IANA is requested to add a new protocol registry, "Public Notary | <dd>RFC 9162</dd> | |||
| <dt>Repository:</dt> | ||||
| <dd><eref brackets="angle" | ||||
| target="https://www.iana.org/assignments/trans"/></dd> | ||||
| <dt>Index value:</dt> | ||||
| <dd>No transformation needed.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="new-ct-related-registries" numbered="true" toc="default"> | ||||
| <name>New CT-Related Registries</name> | ||||
| <t>IANA has added a new protocol registry, "Public Notary | ||||
| Transparency", to the list that appears at | Transparency", to the list that appears at | |||
| https://www.iana.org/assignments/</t> | <eref brackets="angle" target="https://www.iana.org/assignments/"/></t> | |||
| <t>The rest of this section defines the subregistries that have been cre | ||||
| <t>The rest of this section defines sub-registries to be | ated within the new "Public Notary Transparency" registry.</t> | |||
| created within the new Public Notary Transparency registry.</t> | <section anchor="hash_algorithms" numbered="true" toc="default"> | |||
| <name>Hash Algorithms</name> | ||||
| <section anchor="hash_algorithms" title="Hash Algorithms"> | <t>IANA has established a registry of hash algorithm values, named | |||
| "Hash Algorithms", with the following registration procedures:</t> | ||||
| <t>IANA is asked to establish a registry of hash algorithm values, named | <table align="center"> | |||
| "Hash Algorithms", that initially consists of:</t> | <thead> | |||
| <tr> | ||||
| <texttable> | <th align="left">Range</th> | |||
| <ttcol align='left'>Value</ttcol> | <th align="left">Registration Procedures</th> | |||
| <ttcol align='left'>Hash Algorithm</ttcol> | </tr> | |||
| <ttcol align='left'>OID</ttcol> | </thead> | |||
| <ttcol align='left'>Reference / Assignment Policy</ttcol> | <tbody> | |||
| <c>0x00</c> | <tr> | |||
| <c>SHA-256</c> | <td>0x00-0xDF</td> | |||
| <c>2.16.840.1.101.3.4.2.1</c> | <td>Specification Required</td> | |||
| <c><xref target="RFC6234"></xref></c> | </tr> | |||
| <c>0x01 - 0xDF</c> | <tr> | |||
| <c>Unassigned</c> | <td>0xE0-0xEF</td> | |||
| <c> </c> | <td>Experimental Use</td> | |||
| <c>Specification Required</c> | </tr> | |||
| <c>0xE0 - 0xEF</c> | <tr> | |||
| <c>Reserved</c> | <td>0xF0-0xFF</td> | |||
| <c> </c> | <td>Private Use</td> | |||
| <c>Experimental Use</c> | </tr> | |||
| <c>0xF0 - 0xFF</c> | </tbody> | |||
| <c>Reserved</c> | </table> | |||
| <c> </c> | <t>The "Hash Algorithms" registry initially consists of:</t> | |||
| <c>Private Use</c> | <table align="center"> | |||
| </texttable> | <thead> | |||
| <tr> | ||||
| <t>The Designated Expert(s) should ensure that the proposed algorithm has a publ | <th align="left">Value</th> | |||
| ic | <th align="left">Hash Algorithm</th> | |||
| <th align="left">OID</th> | ||||
| <th align="left">Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left">0x00</td> | ||||
| <td align="left">SHA-256</td> | ||||
| <td align="left">2.16.840.1.101.3.4.2.1</td> | ||||
| <td align="left"> | ||||
| <xref target="RFC6234" format="default"/></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x01 - 0xDF</td> | ||||
| <td align="left">Unassigned</td> | ||||
| <td align="left"> </td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xE0 - 0xEF</td> | ||||
| <td align="left">Reserved for Experimental Use</td> | ||||
| <td align="left"> </td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xF0 - 0xFF</td> | ||||
| <td align="left">Reserved for Private Use</td> | ||||
| <td align="left"> </td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The designated expert(s) should ensure that the proposed algorithm | ||||
| has a public | ||||
| specification and is suitable for use as a cryptographic hash algorithm with no | specification and is suitable for use as a cryptographic hash algorithm with no | |||
| known preimage or collision attacks. These attacks can damage the integrity of | known preimage or collision attacks. These attacks can damage the integrity of | |||
| the log.</t> | the log.</t> | |||
| </section> | ||||
| </section> | <section anchor="signature_algorithms" numbered="true" toc="default"> | |||
| <section anchor="signature_algorithms" title="Signature Algorithms"> | <name>Signature Algorithms</name> | |||
| <t>IANA has established a registry of signature algorithm values, name | ||||
| <t>IANA is asked to establish a registry of signature algorithm values, named | d | |||
| "Signature Algorithms".</t> | "Signature Algorithms".</t> | |||
| <t>The following notes have been added to the registry:</t> | ||||
| <blockquote> | ||||
| <dl newline="true"> | ||||
| <dt><strong>Note:</strong></dt> | ||||
| <dd>This is a subset of the "TLS SignatureScheme" registry, limi | ||||
| ted to those | ||||
| algorithms that are appropriate for CT. A major advantage of this is | ||||
| leveraging the expertise of the TLS Working Group and its designated | ||||
| expert(s).</dd> | ||||
| </dl> | ||||
| </blockquote> | ||||
| <blockquote> | ||||
| <dl newline="true"> | ||||
| <dt><strong>Note:</strong></dt> | ||||
| <dd>The value <tt>0x0403</tt> appears twice. While this may be c | ||||
| onfusing, | ||||
| it is okay because the verification | ||||
| process is the same for both algorithms, and the choice of which to u | ||||
| se | ||||
| when generating a signature is purely internal to the log server.</dd | ||||
| > | ||||
| </dl> | ||||
| </blockquote> | ||||
| <t>The "Signature Algorithms" registry has the following registration | ||||
| procedures:</t> | ||||
| <table align="center"> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">Range</th> | ||||
| <th align="left">Registration Procedures</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>0x0000-0x0807</td> | ||||
| <td>Specification Required</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>0x0808-0xFDFF</td> | ||||
| <td>Expert Review</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>0xFE00-0xFEFF</td> | ||||
| <td>Experimental Use</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>0xFF00-0xFFFF</td> | ||||
| <td>Private Use</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The following notes should be added:</t> | <t>The "Signature Algorithms" registry initially consists of:</t> | |||
| <table align="center"> | ||||
| <t><list style="symbols"> | <thead> | |||
| <t>This is a subset of the TLS SignatureScheme Registry, limited to those | <tr> | |||
| algorithms that are appropriate for CT. A major advantage of this is | <th align="left">SignatureScheme Value</th> | |||
| leveraging the expertise of the TLS working group and its Designated | <th align="left">Signature Algorithm</th> | |||
| Expert(s).</t> | <th align="left">Reference</th> | |||
| <t>The value <spanx style="verb">0x0403</spanx> appears twice. While this may | </tr> | |||
| be confusing, | </thead> | |||
| it is okay because the verification | <tbody> | |||
| process is the same for both algorithms, and the choice of which to use | <tr> | |||
| when generating a signature is purely internal to the log server.</t> | <td align="left">0x0000 - 0x0402</td> | |||
| </list></t> | <td align="left">Unassigned</td> | |||
| <td align="left"> </td> | ||||
| <t>The registry should initially consist of:</t> | </tr> | |||
| <tr> | ||||
| <texttable> | <td align="left">ecdsa_secp256r1_sha256 (0x0403)</td> | |||
| <ttcol align='left'>SignatureScheme Value</ttcol> | <td align="left">ECDSA (NIST P-256) with SHA-256</td> | |||
| <ttcol align='left'>Signature Algorithm</ttcol> | <td align="left"> | |||
| <ttcol align='left'>Reference / Assignment Policy</ttcol> | <xref target="FIPS186-4" format="default"/></td> | |||
| <c>0x0000 - 0x0402</c> | </tr> | |||
| <c>Unassigned</c> | <tr> | |||
| <c>Specification Required</c> | <td align="left">ecdsa_secp256r1_sha256 (0x0403)</td> | |||
| <c>ecdsa_secp256r1_sha256(0x0403)</c> | <td align="left">Deterministic ECDSA (NIST P-256) with HMAC-SHA2 | |||
| <c>ECDSA (NIST P-256) with SHA-256</c> | 56</td> | |||
| <c><xref target="FIPS186-4"></xref></c> | <td align="left"> | |||
| <c>ecdsa_secp256r1_sha256(0x0403)</c> | <xref target="RFC6979" format="default"/></td> | |||
| <c>Deterministic ECDSA (NIST P-256) with HMAC-SHA256</c> | </tr> | |||
| <c><xref target="RFC6979"></xref></c> | <tr> | |||
| <c>0x0404 - 0x0806</c> | <td align="left">0x0404 - 0x0806</td> | |||
| <c>Unassigned</c> | <td align="left">Unassigned</td> | |||
| <c>Specification Required</c> | <td align="left"> </td> | |||
| <c>ed25519(0x0807)</c> | </tr> | |||
| <c>Ed25519 (PureEdDSA with the edwards25519 curve)</c> | <tr> | |||
| <c><xref target="RFC8032"></xref></c> | <td align="left">ed25519 (0x0807)</td> | |||
| <c>0x0808 - 0xFDFF</c> | <td align="left">Ed25519 (PureEdDSA with the edwards25519 curve) | |||
| <c>Unassigned</c> | </td> | |||
| <c>Expert Review</c> | <td align="left"> | |||
| <c>0xFE00 - 0xFEFF</c> | <xref target="RFC8032" format="default"/></td> | |||
| <c>Reserved</c> | </tr> | |||
| <c>Experimental Use</c> | <tr> | |||
| <c>0xFF00 - 0xFFFF</c> | <td align="left">0x0808 - 0xFDFF</td> | |||
| <c>Reserved</c> | <td align="left">Unassigned</td> | |||
| <c>Private Use</c> | <td align="left"> </td> | |||
| </texttable> | </tr> | |||
| <tr> | ||||
| <t>The Designated Expert(s) should ensure that the proposed algorithm has a publ | <td align="left">0xFE00 - 0xFEFF</td> | |||
| ic | <td align="left">Reserved for Experimental Use</td> | |||
| specification, has a value assigned to it in the TLS SignatureScheme Registry | <td align="left">RFC 9162</td> | |||
| (that IANA was asked to establish in <xref target="RFC8446"></xref>), and is sui | </tr> | |||
| table for use as a | <tr> | |||
| <td align="left">0xFF00 - 0xFFFF</td> | ||||
| <td align="left">Reserved for Private Use</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The designated expert(s) should ensure that the proposed algorithm | ||||
| has a public | ||||
| specification, has a value assigned to it in the "TLS SignatureScheme" registry | ||||
| (which was established by <xref target="RFC8446" format="default"/>), and is sui | ||||
| table for use as a | ||||
| cryptographic signature algorithm.</t> | cryptographic signature algorithm.</t> | |||
| </section> | ||||
| </section> | <section anchor="versioned_trans_types" numbered="true" toc="default"> | |||
| <section anchor="versioned_trans_types" title="VersionedTransTypes"> | <name>VersionedTransTypes</name> | |||
| <t>IANA has established a registry of <tt>VersionedTransType</tt> valu | ||||
| <t>IANA is asked to establish a registry of <spanx style="verb">VersionedTransTy | es, named | |||
| pe</spanx> values, named | ||||
| "VersionedTransTypes".</t> | "VersionedTransTypes".</t> | |||
| <t>The following note has been added:</t> | ||||
| <t>The following note should be added:</t> | <blockquote> | |||
| <dl newline="true"> | ||||
| <t><list style="symbols"> | <dt><strong>Note:</strong></dt> | |||
| <t>The range 0x0000..0x00FF is reserved so that v1 SCTs are distinguishable fr | <dd>The range 0x0000..0x00FF is reserved so that v1 SCTs are disting | |||
| om v2 | uishable from | |||
| SCTs and other <spanx style="verb">TransItem</spanx> structures.</t> | v2 SCTs and other <tt>TransItem</tt> structures.</dd> | |||
| </list></t> | </dl> | |||
| </blockquote> | ||||
| <t>The registry should initially consist of:</t> | <t>The registration procedures for the "VersionedTransTypes" registry | |||
| are the following:</t> | ||||
| <texttable> | <table align="center"> | |||
| <ttcol align='left'>Value</ttcol> | <thead> | |||
| <ttcol align='left'>Type and Version</ttcol> | <tr> | |||
| <ttcol align='left'>Reference / Assignment Policy</ttcol> | <th align="left">Range</th> | |||
| <c>0x0000 - 0x00FF</c> | <th align="left">Registration Procedures</th> | |||
| <c>Reserved</c> | </tr> | |||
| <c><xref target="RFC6962"></xref></c> | </thead> | |||
| <c>0x0100</c> | <tbody> | |||
| <c>x509_entry_v2</c> | <tr> | |||
| <c>RFCXXXX</c> | <td>0x0100-0xDFFF</td> | |||
| <c>0x0101</c> | <td>Specification Required</td> | |||
| <c>precert_entry_v2</c> | </tr> | |||
| <c>RFCXXXX</c> | <tr> | |||
| <c>0x0102</c> | <td>0xE000-0xEFFF</td> | |||
| <c>x509_sct_v2</c> | <td>Experimental Use</td> | |||
| <c>RFCXXXX</c> | </tr> | |||
| <c>0x0103</c> | <tr> | |||
| <c>precert_sct_v2</c> | <td>0xF000-0xFFFF</td> | |||
| <c>RFCXXXX</c> | <td>Private Use</td> | |||
| <c>0x0104</c> | </tr> | |||
| <c>signed_tree_head_v2</c> | </tbody> | |||
| <c>RFCXXXX</c> | </table> | |||
| <c>0x0105</c> | <t>The "VersionedTransTypes" registry initially consists of:</t> | |||
| <c>consistency_proof_v2</c> | <table align="center"> | |||
| <c>RFCXXXX</c> | <thead> | |||
| <c>0x0106</c> | <tr> | |||
| <c>inclusion_proof_v2</c> | <th align="left">Value</th> | |||
| <c>RFCXXXX</c> | <th align="left">Type and Version</th> | |||
| <c>0x0107 - 0xDFFF</c> | <th align="left">Reference</th> | |||
| <c>Unassigned</c> | </tr> | |||
| <c>Specification Required</c> | </thead> | |||
| <c>0xE000 - 0xEFFF</c> | <tbody> | |||
| <c>Reserved</c> | <tr> | |||
| <c>Experimental Use</c> | <td align="left">0x0000 - 0x00FF</td> | |||
| <c>0xF000 - 0xFFFF</c> | <td align="left">Reserved</td> | |||
| <c>Reserved</c> | <td align="left"> | |||
| <c>Private Use</c> | <xref target="RFC6962" format="default"/></td> | |||
| </texttable> | </tr> | |||
| <tr> | ||||
| <t>The Designated Expert(s) should review the public specification to ensure tha | <td align="left">0x0100</td> | |||
| t it is | <td align="left">x509_entry_v2</td> | |||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0101</td> | ||||
| <td align="left">precert_entry_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0102</td> | ||||
| <td align="left">x509_sct_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0103</td> | ||||
| <td align="left">precert_sct_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0104</td> | ||||
| <td align="left">signed_tree_head_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0105</td> | ||||
| <td align="left">consistency_proof_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0106</td> | ||||
| <td align="left">inclusion_proof_v2</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x0107 - 0xDFFF</td> | ||||
| <td align="left">Unassigned</td> | ||||
| <td align="left"> </td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xE000 - 0xEFFF</td> | ||||
| <td align="left">Reserved for Experimental Use</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xF000 - 0xFFFF</td> | ||||
| <td align="left">Reserved for Private Use</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The designated expert(s) should review the public specification to | ||||
| ensure that it is | ||||
| detailed enough to ensure implementation interoperability.</t> | detailed enough to ensure implementation interoperability.</t> | |||
| </section> | ||||
| </section> | <section anchor="log_artifact_extension_registry" numbered="true" toc="d | |||
| <section anchor="log_artifact_extension_registry" title="Log Artifact Extension | efault"> | |||
| Registry"> | <name>Log Artifact Extensions</name> | |||
| <t>IANA has established a registry of <tt>ExtensionType</tt> values, n | ||||
| <t>IANA is asked to establish a registry of <spanx style="verb">ExtensionType</s | amed "Log | |||
| panx> values, named "Log | Artifact Extensions".</t> | |||
| Artifact Extensions", that initially consists of:</t> | <t>The registration procedures for the "Log Artifact Extensions" regis | |||
| try are the following:</t> | ||||
| <texttable> | <table align="center"> | |||
| <ttcol align='left'>ExtensionType</ttcol> | <thead> | |||
| <ttcol align='left'>Status</ttcol> | <tr> | |||
| <ttcol align='left'>Use</ttcol> | <th align="left">Range</th> | |||
| <ttcol align='left'>Reference / Assignment Policy</ttcol> | <th align="left">Registration Procedures</th> | |||
| <c>0x0000 - 0xDFFF</c> | </tr> | |||
| <c>Unassigned</c> | </thead> | |||
| <c>n/a</c> | <tbody> | |||
| <c>Specification Required</c> | <tr> | |||
| <c>0xE000 - 0xEFFF</c> | <td>0x0000-0xDFFF</td> | |||
| <c>Reserved</c> | <td>Specification Required</td> | |||
| <c>n/a</c> | </tr> | |||
| <c>Experimental Use</c> | <tr> | |||
| <c>0xF000 - 0xFFFF</c> | <td>0xE000-0xEFFF</td> | |||
| <c>Reserved</c> | <td>Experimental Use</td> | |||
| <c>n/a</c> | </tr> | |||
| <c>Private Use</c> | <tr> | |||
| </texttable> | <td>0xF000-0xFFFF</td> | |||
| <td>Private Use</td> | ||||
| <t>The "Use" column should contain one or both of the following values:</t> | </tr> | |||
| </tbody> | ||||
| <t><list style="symbols"> | </table> | |||
| <t>"SCT", for extensions specified for use in Signed Certificate Timestamps.</ | <t>The "Log Artifact Extensions" registry initially consists of:</t> | |||
| t> | <table align="center"> | |||
| <t>"STH", for extensions specified for use in Signed Tree Heads.</t> | <thead> | |||
| </list></t> | <tr> | |||
| <th align="left">ExtensionType</th> | ||||
| <t>The Designated Expert(s) should review the public specification to ensure tha | <th align="left">Status</th> | |||
| t it is | <th align="left">Use</th> | |||
| <th align="left">Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left">0x0000 - 0xDFFF</td> | ||||
| <td align="left">Unassigned</td> | ||||
| <td align="left">n/a</td> | ||||
| <td align="left"> </td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xE000 - 0xEFFF</td> | ||||
| <td align="left">Reserved for Experimental Use</td> | ||||
| <td align="left">n/a</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0xF000 - 0xFFFF</td> | ||||
| <td align="left">Reserved for Private Use</td> | ||||
| <td align="left">n/a</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The "Use" column should contain one or both of the following values | ||||
| :</t> | ||||
| <ul spacing="normal"> | ||||
| <li>"SCT", for extensions specified for use in Signed Certificate Ti | ||||
| mestamps.</li> | ||||
| <li>"STH", for extensions specified for use in Signed Tree Heads.</l | ||||
| i> | ||||
| </ul> | ||||
| <t>The designated expert(s) should review the public specification to | ||||
| ensure that it is | ||||
| detailed enough to ensure implementation interoperability. They should | detailed enough to ensure implementation interoperability. They should | |||
| also verify that the extension is appropriate to the contexts in which it is | also verify that the extension is appropriate to the contexts in which it is | |||
| specified to be used (SCT, STH, or both).</t> | specified to be used (SCT, STH, or both).</t> | |||
| </section> | ||||
| </section> | <section anchor="log_id_registry" numbered="true" toc="default"> | |||
| <section anchor="log_id_registry" title="Log IDs Registry"> | <name>Log IDs</name> | |||
| <t>IANA has established a registry of Log IDs, named "Log IDs".</t> | ||||
| <t>IANA is asked to establish a registry of Log IDs, named "Log IDs", | <t>The registry's registration procedure is First Come First Served.</ | |||
| that initially consists of:</t> | t> | |||
| <t>The "Log IDs" registry initially consists of:</t> | ||||
| <texttable> | <table align="center"> | |||
| <ttcol align='left'>Log ID</ttcol> | <thead> | |||
| <ttcol align='left'>Log Base URL</ttcol> | <tr> | |||
| <ttcol align='left'>Log Operator</ttcol> | <th align="left">Log ID</th> | |||
| <ttcol align='left'>Reference / Assignment Policy</ttcol> | <th align="left">Log Base URL</th> | |||
| <c>1.3.101.8192 - 1.3.101.16383</c> | <th align="left">Log Operator</th> | |||
| <c>Unassigned</c> | <th align="left">Reference</th> | |||
| <c>Unassigned</c> | </tr> | |||
| <c>First Come First Served</c> | </thead> | |||
| <c>1.3.101.80.0 - 1.3.101.80.*</c> | <tbody> | |||
| <c>Unassigned</c> | <tr> | |||
| <c>Unassigned</c> | <td align="left">1.3.101.8192 - 1.3.101.16383</td> | |||
| <c>First Come First Served</c> | <td align="left">Unassigned</td> | |||
| </texttable> | <td align="left">Unassigned</td> | |||
| <td align="left"> </td> | ||||
| <t>All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have been set aside | </tr> | |||
| <tr> | ||||
| <td align="left">1.3.101.80.0 - 1.3.101.80.*</td> | ||||
| <td align="left">Unassigned</td> | ||||
| <td align="left">Unassigned</td> | ||||
| <td align="left"> </td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The following notes have been added to the registry:</t> | ||||
| <blockquote> | ||||
| <dl newline="true"> | ||||
| <dt><strong>Note:</strong></dt> | ||||
| <dd>All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have be | ||||
| en set aside | ||||
| for Log IDs. | for Log IDs. | |||
| This is a limited resource of 8,192 OIDs, each of which has an encoded length of | This is a limited resource of 8,192 OIDs, each of which has an encoded length of | |||
| 4 octets.</t> | 4 octets.</dd> | |||
| </dl> | ||||
| <t>The 1.3.101.80 arc has also been set aside for Log IDs. | </blockquote> | |||
| <blockquote> | ||||
| <dl newline="true"> | ||||
| <dt><strong>Note:</strong></dt> | ||||
| <dd>The 1.3.101.80 arc has also been set aside for Log IDs. | ||||
| This is an unlimited resource, but only | This is an unlimited resource, but only | |||
| the 128 OIDs from 1.3.101.80.0 to 1.3.101.80.127 have an encoded length of only | the 128 OIDs from 1.3.101.80.0 to 1.3.101.80.127 have an encoded length of only | |||
| 4 octets.</t> | 4 octets.</dd> | |||
| </dl> | ||||
| <t>Each application for the allocation of a Log ID MUST be accompanied by:</t> | </blockquote> | |||
| <t>Each application for the allocation of a Log ID <bcp14>MUST</bcp14> | ||||
| <t><list style="symbols"> | be accompanied by:</t> | |||
| <t>the Log's Base URL (see <xref target="log_parameters"/>).</t> | <ul spacing="normal"> | |||
| <t>the Log Operator's contact details.</t> | <li>the Log's Base URL (see <xref target="log_parameters" | |||
| </list></t> | format="default"/>) and</li> | |||
| <li>the Log Operator's contact details.</li> | ||||
| <t>IANA is asked to reject any request to update a Log ID or Log Base URL in thi | </ul> | |||
| s | <t>IANA is asked to reject any request to update a Log ID or Log Base | |||
| registry, because these fields are immutable (see <xref target="log_parameters"/ | URL in this | |||
| >).</t> | registry because these fields are immutable (see <xref target="log_parameters" f | |||
| ormat="default"/>).</t> | ||||
| <t>IANA is asked to accept requests from log operators to update their contact | <t>IANA is asked to accept requests from log operators to update their | |||
| contact | ||||
| details in this registry.</t> | details in this registry.</t> | |||
| <t>Since log operators can choose to not use this registry (see <xref | ||||
| <t>Since log operators can choose to not use this registry (see <xref target="lo | target="log_id" format="default"/>), it is | |||
| g_id"/>), it is | ||||
| not expected to be a global directory of all logs.</t> | not expected to be a global directory of all logs.</t> | |||
| </section> | ||||
| </section> | <section anchor="error-types-registry" numbered="true" toc="default"> | |||
| <section anchor="error-types-registry" title="Error Types Registry"> | <name>Error Types</name> | |||
| <t>IANA has created a new registry for errors, | ||||
| <t>IANA is requested to create a new registry for errors, | ||||
| the "Error Types" registry.</t> | the "Error Types" registry.</t> | |||
| <t>The registration procedure for this registry is Specification Requi | ||||
| <t>Requirements for this registry are Specification Required.</t> | red.</t> | |||
| <t>This registry has the following three fields:</t> | ||||
| <t>This registry should have the following three fields:</t> | <table align="center"> | |||
| <thead> | ||||
| <texttable> | <tr> | |||
| <ttcol align='left'>Field Name</ttcol> | <th align="left">Field Name</th> | |||
| <ttcol align='left'>Type</ttcol> | <th align="left">Type</th> | |||
| <ttcol align='left'>Reference</ttcol> | <th align="left">Reference</th> | |||
| <c>identifier</c> | </tr> | |||
| <c>string</c> | </thead> | |||
| <c>RFCXXXX</c> | <tbody> | |||
| <c>meaning</c> | <tr> | |||
| <c>string</c> | <td align="left">Identifier</td> | |||
| <c>RFCXXXX</c> | <td align="left">string</td> | |||
| <c>reference</c> | <td align="left">RFC 9162</td> | |||
| <c>string</c> | </tr> | |||
| <c>RFCXXXX</c> | <tr> | |||
| </texttable> | <td align="left">Meaning</td> | |||
| <td align="left">string</td> | ||||
| <t>The initial values are as follows, taken from the text above:</t> | <td align="left">RFC 9162</td> | |||
| </tr> | ||||
| <texttable> | <tr> | |||
| <ttcol align='left'>Identifier</ttcol> | <td align="left">Reference</td> | |||
| <ttcol align='left'>Meaning</ttcol> | <td align="left">string</td> | |||
| <ttcol align='left'>Reference</ttcol> | <td align="left">RFC 9162</td> | |||
| <c>malformed</c> | </tr> | |||
| <c>The request could not be parsed.</c> | </tbody> | |||
| <c>RFCXXXX</c> | </table> | |||
| <c>badSubmission</c> | <t>The initial values of the "Error Types" registry, which are taken f | |||
| <c><spanx style="verb">submission</spanx> is neither a valid certificate n | rom the text in <xref target="client_messages" format="default"/>, are as follow | |||
| or a valid precertificate</c> | s:</t> | |||
| <c>RFCXXXX</c> | <table align="center"> | |||
| <c>badType</c> | <thead> | |||
| <c><spanx style="verb">type</spanx> is neither 1 nor 2</c> | <tr> | |||
| <c>RFCXXXX</c> | <th align="left">Identifier</th> | |||
| <c>badChain</c> | <th align="left">Meaning</th> | |||
| <c>The first element of <spanx style="verb">chain</spanx> is not the certi | <th align="left">Reference</th> | |||
| fier of the <spanx style="verb">submission</spanx>, or the second element does n | </tr> | |||
| ot certify the first, etc.</c> | </thead> | |||
| <c>RFCXXXX</c> | <tbody> | |||
| <c>badCertificate</c> | <tr> | |||
| <c>One or more certificates in the <spanx style="verb">chain</spanx> are n | <td align="left">malformed</td> | |||
| ot valid (e.g., not properly encoded)</c> | <td align="left">The request could not be parsed.</td> | |||
| <c>RFCXXXX</c> | <td align="left">RFC 9162</td> | |||
| <c>unknownAnchor</c> | </tr> | |||
| <c>The last element of <spanx style="verb">chain</spanx> (or, if <spanx st | <tr> | |||
| yle="verb">chain</spanx> is an empty array, the <spanx style="verb">submission</ | <td align="left">badSubmission</td> | |||
| spanx>) both is not, and is not certified by, an accepted trust anchor</c> | <td align="left"><tt>submission</tt> is neither a valid certific | |||
| <c>RFCXXXX</c> | ate nor a | |||
| <c>shutdown</c> | valid precertificate.</td> | |||
| <c>The log is no longer accepting submissions</c> | <td align="left">RFC 9162</td> | |||
| <c>RFCXXXX</c> | </tr> | |||
| <c>firstUnknown</c> | <tr> | |||
| <c><spanx style="verb">first</spanx> is before the latest known STH but is | <td align="left">badType</td> | |||
| not from an existing STH.</c> | <td align="left"><tt>type</tt> is neither 1 nor 2.</td> | |||
| <c>RFCXXXX</c> | <td align="left">RFC 9162</td> | |||
| <c>secondUnknown</c> | </tr> | |||
| <c><spanx style="verb">second</spanx> is before the latest known STH but i | <tr> | |||
| s not from an existing STH.</c> | <td align="left">badChain</td> | |||
| <c>RFCXXXX</c> | <td align="left">The first element of <tt>chain</tt> is not the | |||
| <c>secondBeforeFirst</c> | certifier of | |||
| <c><spanx style="verb">second</spanx> is smaller than <spanx style="verb"> | the <tt>submission</tt>, or the second element does not certify t | |||
| first</spanx>.</c> | he first, | |||
| <c>RFCXXXX</c> | etc.</td> | |||
| <c>hashUnknown</c> | <td align="left">RFC 9162</td> | |||
| <c><spanx style="verb">hash</spanx> is not the hash of a known leaf (may b | </tr> | |||
| e caused by skew or by a known certificate not yet merged).</c> | <tr> | |||
| <c>RFCXXXX</c> | <td align="left">badCertificate</td> | |||
| <c>treeSizeUnknown</c> | <td align="left">One or more certificates in <tt>chain</tt> are | |||
| <c><spanx style="verb">hash</spanx> is before the latest known STH but is | not valid | |||
| not from an existing STH.</c> | (e.g., not properly encoded).</td> | |||
| <c>RFCXXXX</c> | <td align="left">RFC 9162</td> | |||
| <c>startUnknown</c> | </tr> | |||
| <c><spanx style="verb">start</spanx> is greater than the number of entries | <tr> | |||
| in the Merkle tree.</c> | <td align="left">unknownAnchor</td> | |||
| <c>RFCXXXX</c> | <td align="left">The last element of <tt>chain</tt> (or, if <tt> | |||
| <c>endBeforeStart</c> | chain</tt> is | |||
| <c><spanx style="verb">start</spanx> cannot be greater than <spanx style=" | an empty array, the <tt>submission</tt>) is not, nor is it certif | |||
| verb">end</spanx>.</c> | ied | |||
| <c>RFCXXXX</c> | by, an accepted trust anchor.</td> | |||
| </texttable> | <td align="left">RFC 9162</td> | |||
| </tr> | ||||
| </section> | <tr> | |||
| </section> | <td align="left">shutdown</td> | |||
| <section anchor="oid-assignment" title="OID Assignment"> | <td align="left">The log is no longer accepting submissions.</td | |||
| > | ||||
| <t>IANA is asked to assign one object identifier from the "SMI | <td align="left">RFC 9162</td> | |||
| </tr> | ||||
| <tr> | ||||
| <td align="left">firstUnknown</td> | ||||
| <td align="left"><tt>first</tt> is before the latest known STH b | ||||
| ut is not | ||||
| from an existing STH.</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">secondUnknown</td> | ||||
| <td align="left"><tt>second</tt> is before the latest known STH | ||||
| but is not | ||||
| from an existing STH.</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">secondBeforeFirst</td> | ||||
| <td align="left"><tt>second</tt> is smaller than <tt>first</tt>. | ||||
| </td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">hashUnknown</td> | ||||
| <td align="left"><tt>hash</tt> is not the hash of a known leaf ( | ||||
| may be caused | ||||
| by skew or by a known certificate not yet merged).</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">treeSizeUnknown</td> | ||||
| <td align="left"><tt>hash</tt> is before the latest known STH bu | ||||
| t is not from | ||||
| an existing STH.</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">startUnknown</td> | ||||
| <td align="left"><tt>start</tt> is greater than the number of en | ||||
| tries in the | ||||
| Merkle Tree.</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">endBeforeStart</td> | ||||
| <td align="left"><tt>start</tt> cannot be greater than <tt>end</ | ||||
| tt>.</td> | ||||
| <td align="left">RFC 9162</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="oid-assignment" numbered="true" toc="default"> | ||||
| <name>OID Assignment</name> | ||||
| <t>IANA has assigned an object identifier from the "SMI | ||||
| Security for PKIX Module Identifier" registry to identify the | Security for PKIX Module Identifier" registry to identify the | |||
| ASN.1 module in <xref target="asn1_module"/> of this document with an assigned | ASN.1 module in <xref target="asn1_module" format="default"/> of this document.< | |||
| Decimal value.</t> | /t> | |||
| <table align="center"> | ||||
| <texttable> | <thead> | |||
| <ttcol align='left'>Decimal</ttcol> | <tr> | |||
| <ttcol align='left'>Description</ttcol> | <th align="left">Decimal</th> | |||
| <ttcol align='left'>References</ttcol> | <th align="left">Description</th> | |||
| <c>TBD</c> | <th align="left">References</th> | |||
| <c>id-mod-public-notary-v2</c> | </tr> | |||
| <c>RFCXXXX</c> | </thead> | |||
| </texttable> | <tbody> | |||
| <tr> | ||||
| </section> | <td align="left">102</td> | |||
| </section> | <td align="left">id-mod-public-notary-v2</td> | |||
| <section anchor="security-considerations" title="Security Considerations"> | <td align="left">RFC 9162</td> | |||
| </tr> | ||||
| <t>With CAs, logs, and servers performing the actions described here, TLS client | </tbody> | |||
| s | </table> | |||
| </section> | ||||
| </section> | ||||
| <section anchor="security-considerations" numbered="true" toc="default"> | ||||
| <name>Security Considerations</name> | ||||
| <t>With CAs, logs, and servers performing the actions described here, TLS | ||||
| clients | ||||
| can use logs and signed timestamps to reduce the likelihood that they will | can use logs and signed timestamps to reduce the likelihood that they will | |||
| accept misissued certificates. If a server presents a valid signed timestamp for | accept misissued certificates. If a server presents a valid signed timestamp for | |||
| a certificate, then the client knows that a log has committed to publishing the | a certificate, then the client knows that a log has committed to publishing the | |||
| certificate. From this, the client knows that monitors acting for the subject of | certificate. From this, the client knows that monitors acting for the subject of | |||
| the certificate have had some time to notice the misissuance and take some | the certificate have had some time to notice the misissuance and take some | |||
| action, such as asking a CA to revoke a misissued certificate. A signed | action, such as asking a CA to revoke a misissued certificate. A signed | |||
| timestamp does not guarantee this though, since appropriate monitors might not | timestamp does not guarantee this, though, since appropriate monitors might not | |||
| have checked the logs or the CA might have refused to revoke the certificate.</t > | have checked the logs or the CA might have refused to revoke the certificate.</t > | |||
| <t>In addition, if TLS clients will not accept unlogged certificates, then | ||||
| <t>In addition, if TLS clients will not accept unlogged certificates, then site | site | |||
| owners will have a greater incentive to submit certificates to logs, possibly | owners will have a greater incentive to submit certificates to logs, possibly | |||
| with the assistance of their CA, increasing the overall transparency of the | with the assistance of their CA, increasing the overall transparency of the | |||
| system.</t> | system.</t> | |||
| <section anchor="misissued-certificates" numbered="true" toc="default"> | ||||
| <section anchor="misissued-certificates" title="Misissued Certificates"> | <name>Misissued Certificates</name> | |||
| <t>Misissued certificates that have not been publicly logged, and thus d | ||||
| <t>Misissued certificates that have not been publicly logged, and thus do not ha | o not have | |||
| ve | ||||
| a valid SCT, are not considered compliant. Misissued certificates that do have | a valid SCT, are not considered compliant. Misissued certificates that do have | |||
| an SCT from a log will appear in that public log within the Maximum Merge Delay, | an SCT from a log will appear in that public log within the Maximum Merge Delay, | |||
| assuming the log is operating correctly. Since a log is allowed to serve an STH | assuming the log is operating correctly. Since a log is allowed to serve an STH | |||
| of any age up to the MMD, the maximum period of time during which a misissued | of any age up to the MMD, the maximum period of time during which a misissued | |||
| certificate can be used without being available for audit is twice the MMD.</t> | certificate can be used without being available for audit is twice the MMD.</t> | |||
| </section> | ||||
| </section> | <section anchor="detection-of-misissue" numbered="true" toc="default"> | |||
| <section anchor="detection-of-misissue" title="Detection of Misissue"> | <name>Detection of Misissue</name> | |||
| <t>The logs do not themselves detect misissued certificates; they rely i | ||||
| <t>The logs do not themselves detect misissued certificates; they rely instead o | nstead on | |||
| n | ||||
| interested parties, such as domain owners, to monitor them and take corrective | interested parties, such as domain owners, to monitor them and take corrective | |||
| action when a misissue is detected.</t> | action when a misissue is detected.</t> | |||
| </section> | ||||
| </section> | <section anchor="misbehaving_logs" numbered="true" toc="default"> | |||
| <section anchor="misbehaving_logs" title="Misbehaving Logs"> | <name>Misbehaving Logs</name> | |||
| <t>A log can misbehave in several ways. Examples include the following: | ||||
| <t>A log can misbehave in several ways. Examples include: failing to incorporate | failing to incorporate a | |||
| a | ||||
| certificate with an SCT in the Merkle Tree within the MMD; presenting different, | certificate with an SCT in the Merkle Tree within the MMD; presenting different, | |||
| conflicting views of the Merkle Tree at different times and/or to different | conflicting views of the Merkle Tree at different times and/or to different | |||
| parties; issuing STHs too frequently; mutating the signature of a logged | parties; issuing STHs too frequently; mutating the signature of a logged | |||
| certificate; and failing to present a chain containing the certifier of a logged | certificate; and failing to present a chain containing the certifier of a logged | |||
| certificate.</t> | certificate.</t> | |||
| <t>Violation of the MMD contract is detected by log clients requesting a | ||||
| <t>Violation of the MMD contract is detected by log clients requesting a Merkle | Merkle | |||
| inclusion proof (<xref target="get-proof-by-hash"/>) for each observed SCT. Thes | inclusion proof (<xref target="get-proof-by-hash" format="default"/>) for each o | |||
| e checks can | bserved SCT. These checks can | |||
| be asynchronous and need only be done once per certificate. However, note that | be asynchronous and need only be done once per certificate. However, note that | |||
| there may be privacy concerns (see <xref target="fetching_inclusion_proofs"/>).< | there may be privacy concerns (see <xref target="fetching_inclusion_proofs" form | |||
| /t> | at="default"/>).</t> | |||
| <t>Violation of the append-only property or the STH issuance rate limit | ||||
| <t>Violation of the append-only property or the STH issuance rate limit can be | can be | |||
| detected by multiple clients comparing their instances of the STHs. | detected by multiple clients comparing their instances of the STHs. | |||
| This technique, known as "gossip," is an active area of research and not | This technique, known as "gossip", is an active area of research and not | |||
| defined here. | defined here. | |||
| Proof of misbehavior in such cases would be: a series of STHs that were | Proof of misbehavior in such cases would be either a series of STHs that | |||
| issued too closely together, proving violation of the STH issuance rate limit; | were | |||
| or an STH with a root hash that does not match the one calculated from a copy of | issued too closely together, proving violation of the STH issuance rate l | |||
| the log, proving violation of the append-only property.</t> | imit, | |||
| or an STH with a root hash that does not match the one calculated from a | ||||
| <t>Clients that report back SCTs can be tracked or traced if a log | copy of | |||
| the log, proving violation of the append-only property.</t> | ||||
| <t>Clients that report back SCTs can be tracked or traced if a log | ||||
| produces multiple STHs or SCTs with the same timestamp and data but different | produces multiple STHs or SCTs with the same timestamp and data but different | |||
| signatures. Logs SHOULD mitigate this risk by either:</t> | signatures. Logs <bcp14>SHOULD</bcp14> mitigate this risk by either:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>using deterministic signature schemes or</li> | |||
| <t>Using deterministic signature schemes, or</t> | <li>producing no more than one SCT for each distinct submission and no | |||
| <t>Producing no more than one SCT for each distinct submission and no more tha | more than one | |||
| n one | STH for each distinct <tt>tree_size</tt>. Each of these SCTs and STHs c | |||
| STH for each distinct tree_size. Each of these SCTs and STHs can be stored by | an be stored by | |||
| the log and served to other clients that submit the same certificate or request | the log and served to other clients that submit the same certificate or | |||
| the same STH.</t> | request | |||
| </list></t> | the same STH.</li> | |||
| </ul> | ||||
| </section> | </section> | |||
| <section anchor="requiring_multiple_scts" title="Multiple SCTs"> | <section anchor="requiring_multiple_scts" numbered="true" toc="default"> | |||
| <name>Multiple SCTs</name> | ||||
| <t>By requiring TLS servers to offer multiple SCTs, each from a different log, T | <t>By requiring TLS servers to offer multiple SCTs, each from a differen | |||
| LS | t log, TLS | |||
| clients reduce the effectiveness of an attack where a CA and a log collude | clients reduce the effectiveness of an attack where a CA and a log collude | |||
| (see <xref target="multiple-scts"/>).</t> | (see <xref target="multiple-scts" format="default"/>).</t> | |||
| </section> | ||||
| </section> | <section anchor="leakage-of-dns-information" numbered="true" toc="default" | |||
| <section anchor="leakage-of-dns-information" title="Leakage of DNS Information"> | > | |||
| <name>Leakage of DNS Information</name> | ||||
| <t>Malicious monitors can use logs to learn about the existence of domain names | <t>Malicious monitors can use logs to learn about the existence of domai | |||
| n names | ||||
| that might not otherwise be easy to discover. Some subdomain labels may reveal | that might not otherwise be easy to discover. Some subdomain labels may reveal | |||
| information about the service and software for which the subdomain is used, | information about the service and software for which the subdomain is used, | |||
| which in turn might facilitate targeted attacks.</t> | which in turn might facilitate targeted attacks.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section anchor="acknowledgements" title="Acknowledgements"> | ||||
| <t>The authors would like to thank Erwann Abelea, Robin Alden, Andrew Ayer, Rich | ||||
| ard | ||||
| Barnes, Al Cutter, David Drysdale, Francis Dupont, Adam Eijdenberg, Stephen | ||||
| Farrell, Daniel Kahn Gillmor, Paul Hadfield, Brad Hill, Jeff Hodges, Paul | ||||
| Hoffman, Jeffrey Hutzelman, Kat Joyce, Stephen Kent, SM, Alexey Melnikov, Linus | ||||
| Nordberg, Chris Palmer, Trevor Perrin, Pierre Phaneuf, Eric Rescorla, Rich Salz, | ||||
| Melinda Shore, Ryan Sleevi, Martin Smith, Carl Wallace and Paul Wouters for | ||||
| their valuable contributions.</t> | ||||
| <t>A big thank you to Symantec for kindly donating the OIDs from the 1.3.101 arc | ||||
| that are used in this document.</t> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2119.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3986.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4648.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5246.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5280.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5652.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6066.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6234.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6960.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6979.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7231.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7633.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7807.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8032.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8174.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8259.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8391.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8446.xml"/> | ||||
| <references title='Normative References'> | <reference anchor="HTML401" target="https://www.w3.org/TR/2018/SPSD-html | |||
| 401-20180327"> | ||||
| <reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'> | <front> | |||
| <front> | <title>HTML 4.01 Specification</title> | |||
| <title>Key words for use in RFCs to Indicate Requirement Levels</title> | <author initials="D." surname="Raggett" fullname="David Raggett"> | |||
| <author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></a | <organization/> | |||
| uthor> | </author> | |||
| <date month='March' year='1997'/> | <author initials="A." surname="Le Hors" fullname="Arnaud Le Hors"> | |||
| <abstract><t>In many standards track documents several words are used to signify | <organization/> | |||
| the requirements in the specification. These words are often capitalized. This | </author> | |||
| document defines these words as they should be interpreted in IETF documents. | <author initials="I." surname="Jacobs" fullname="Ian Jacobs"> | |||
| This document specifies an Internet Best Current Practices for the Internet Comm | <organization/> | |||
| unity, and requests discussion and suggestions for improvements.</t></abstract> | </author> | |||
| </front> | <date year="2018" month="March"/> | |||
| <seriesInfo name='BCP' value='14'/> | </front> | |||
| <seriesInfo name='RFC' value='2119'/> | <seriesInfo name="W3C Recommendation" value="SPSD-html401-20180327"/> | |||
| <seriesInfo name='DOI' value='10.17487/RFC2119'/> | </reference> | |||
| </reference> | ||||
| <reference anchor='RFC3986' target='https://www.rfc-editor.org/info/rfc3986'> | ||||
| <front> | ||||
| <title>Uniform Resource Identifier (URI): Generic Syntax</title> | ||||
| <author fullname='T. Berners-Lee' initials='T.' surname='Berners-Lee'><organizat | ||||
| ion/></author> | ||||
| <author fullname='R. Fielding' initials='R.' surname='Fielding'><organization/>< | ||||
| /author> | ||||
| <author fullname='L. Masinter' initials='L.' surname='Masinter'><organization/>< | ||||
| /author> | ||||
| <date month='January' year='2005'/> | ||||
| <abstract><t>A Uniform Resource Identifier (URI) is a compact sequence of charac | ||||
| ters that identifies an abstract or physical resource. This specification defin | ||||
| es the generic URI syntax and a process for resolving URI references that might | ||||
| be in relative form, along with guidelines and security considerations for the u | ||||
| se of URIs on the Internet. The URI syntax defines a grammar that is a superset | ||||
| of all valid URIs, allowing an implementation to parse the common components of | ||||
| a URI reference without knowing the scheme-specific requirements of every possi | ||||
| ble identifier. This specification does not define a generative grammar for URI | ||||
| s; that task is performed by the individual specifications of each URI scheme. | ||||
| [STANDARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='66'/> | ||||
| <seriesInfo name='RFC' value='3986'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC3986'/> | ||||
| </reference> | ||||
| <reference anchor='RFC4648' target='https://www.rfc-editor.org/info/rfc4648'> | ||||
| <front> | ||||
| <title>The Base16, Base32, and Base64 Data Encodings</title> | ||||
| <author fullname='S. Josefsson' initials='S.' surname='Josefsson'><organization/ | ||||
| ></author> | ||||
| <date month='October' year='2006'/> | ||||
| <abstract><t>This document describes the commonly used base 64, base 32, and bas | ||||
| e 16 encoding schemes. It also discusses the use of line-feeds in encoded data, | ||||
| use of padding in encoded data, use of non-alphabet characters in encoded data, | ||||
| use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK | ||||
| ]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='4648'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC4648'/> | ||||
| </reference> | ||||
| <reference anchor='RFC5246' target='https://www.rfc-editor.org/info/rfc5246'> | ||||
| <front> | ||||
| <title>The Transport Layer Security (TLS) Protocol Version 1.2</title> | ||||
| <author fullname='T. Dierks' initials='T.' surname='Dierks'><organization/></aut | ||||
| hor> | ||||
| <author fullname='E. Rescorla' initials='E.' surname='Rescorla'><organization/>< | ||||
| /author> | ||||
| <date month='August' year='2008'/> | ||||
| <abstract><t>This document specifies Version 1.2 of the Transport Layer Security | ||||
| (TLS) protocol. The TLS protocol provides communications security over the Int | ||||
| ernet. The protocol allows client/server applications to communicate in a way t | ||||
| hat is designed to prevent eavesdropping, tampering, or message forgery. [STAND | ||||
| ARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='5246'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC5246'/> | ||||
| </reference> | ||||
| <reference anchor='RFC5280' target='https://www.rfc-editor.org/info/rfc5280'> | ||||
| <front> | ||||
| <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revo | ||||
| cation List (CRL) Profile</title> | ||||
| <author fullname='D. Cooper' initials='D.' surname='Cooper'><organization/></aut | ||||
| hor> | ||||
| <author fullname='S. Santesson' initials='S.' surname='Santesson'><organization/ | ||||
| ></author> | ||||
| <author fullname='S. Farrell' initials='S.' surname='Farrell'><organization/></a | ||||
| uthor> | ||||
| <author fullname='S. Boeyen' initials='S.' surname='Boeyen'><organization/></aut | ||||
| hor> | ||||
| <author fullname='R. Housley' initials='R.' surname='Housley'><organization/></a | ||||
| uthor> | ||||
| <author fullname='W. Polk' initials='W.' surname='Polk'><organization/></author> | ||||
| <date month='May' year='2008'/> | ||||
| <abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificat | ||||
| e revocation list (CRL) for use in the Internet. An overview of this approach a | ||||
| nd model is provided as an introduction. The X.509 v3 certificate format is des | ||||
| cribed in detail, with additional information regarding the format and semantics | ||||
| of Internet name forms. Standard certificate extensions are described and two | ||||
| Internet-specific extensions are defined. A set of required certificate extensi | ||||
| ons is specified. The X.509 v2 CRL format is described in detail along with sta | ||||
| ndard and Internet-specific extensions. An algorithm for X.509 certification pa | ||||
| th validation is described. An ASN.1 module and examples are provided in the ap | ||||
| pendices. [STANDARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='5280'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC5280'/> | ||||
| </reference> | ||||
| <reference anchor='RFC5652' target='https://www.rfc-editor.org/info/rfc5652'> | ||||
| <front> | ||||
| <title>Cryptographic Message Syntax (CMS)</title> | ||||
| <author fullname='R. Housley' initials='R.' surname='Housley'><organization/></a | ||||
| uthor> | ||||
| <date month='September' year='2009'/> | ||||
| <abstract><t>This document describes the Cryptographic Message Syntax (CMS). Th | ||||
| is syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary | ||||
| message content. [STANDARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='70'/> | ||||
| <seriesInfo name='RFC' value='5652'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC5652'/> | ||||
| </reference> | ||||
| <reference anchor='RFC6066' target='https://www.rfc-editor.org/info/rfc6066'> | ||||
| <front> | ||||
| <title>Transport Layer Security (TLS) Extensions: Extension Definitions</title> | ||||
| <author fullname='D. Eastlake 3rd' initials='D.' surname='Eastlake 3rd'><organiz | ||||
| ation/></author> | ||||
| <date month='January' year='2011'/> | ||||
| <abstract><t>This document provides specifications for existing TLS extensions. | ||||
| It is a companion document for RFC 5246, "The Transport Layer Security (TL | ||||
| S) Protocol Version 1.2". The extensions specified are server_name, max_fr | ||||
| agment_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and stat | ||||
| us_request. [STANDARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6066'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6066'/> | ||||
| </reference> | ||||
| <reference anchor='RFC6234' target='https://www.rfc-editor.org/info/rfc6234'> | ||||
| <front> | ||||
| <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title> | ||||
| <author fullname='D. Eastlake 3rd' initials='D.' surname='Eastlake 3rd'><organiz | ||||
| ation/></author> | ||||
| <author fullname='T. Hansen' initials='T.' surname='Hansen'><organization/></aut | ||||
| hor> | ||||
| <date month='May' year='2011'/> | ||||
| <abstract><t>Federal Information Processing Standard, FIPS</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6234'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6234'/> | ||||
| </reference> | ||||
| <reference anchor='RFC6960' target='https://www.rfc-editor.org/info/rfc6960'> | ||||
| <front> | ||||
| <title>X.509 Internet Public Key Infrastructure Online Certificate Status Protoc | ||||
| ol - OCSP</title> | ||||
| <author fullname='S. Santesson' initials='S.' surname='Santesson'><organization/ | ||||
| ></author> | ||||
| <author fullname='M. Myers' initials='M.' surname='Myers'><organization/></autho | ||||
| r> | ||||
| <author fullname='R. Ankney' initials='R.' surname='Ankney'><organization/></aut | ||||
| hor> | ||||
| <author fullname='A. Malpani' initials='A.' surname='Malpani'><organization/></a | ||||
| uthor> | ||||
| <author fullname='S. Galperin' initials='S.' surname='Galperin'><organization/>< | ||||
| /author> | ||||
| <author fullname='C. Adams' initials='C.' surname='Adams'><organization/></autho | ||||
| r> | ||||
| <date month='June' year='2013'/> | ||||
| <abstract><t>This document specifies a protocol useful in determining the curren | ||||
| t status of a digital certificate without requiring Certificate Revocation Lists | ||||
| (CRLs). Additional mechanisms addressing PKIX operational requirements are spec | ||||
| ified in separate documents. This document obsoletes RFCs 2560 and 6277. It al | ||||
| so updates RFC 5912.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6960'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6960'/> | ||||
| </reference> | ||||
| <reference anchor='RFC6979' target='https://www.rfc-editor.org/info/rfc6979'> | ||||
| <front> | ||||
| <title>Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic | ||||
| Curve Digital Signature Algorithm (ECDSA)</title> | ||||
| <author fullname='T. Pornin' initials='T.' surname='Pornin'><organization/></aut | ||||
| hor> | ||||
| <date month='August' year='2013'/> | ||||
| <abstract><t>This document defines a deterministic digital signature generation | ||||
| procedure. Such signatures are compatible with standard Digital Signature Algor | ||||
| ithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) digital signat | ||||
| ures and can be processed with unmodified verifiers, which need not be aware of | ||||
| the procedure described therein. Deterministic signatures retain the cryptograp | ||||
| hic security features associated with digital signatures but can be more easily | ||||
| implemented in various environments, since they do not need access to a source o | ||||
| f high-quality randomness.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6979'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6979'/> | ||||
| </reference> | ||||
| <reference anchor='RFC7231' target='https://www.rfc-editor.org/info/rfc7231'> | ||||
| <front> | ||||
| <title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title> | ||||
| <author fullname='R. Fielding' initials='R.' role='editor' surname='Fielding'><o | ||||
| rganization/></author> | ||||
| <author fullname='J. Reschke' initials='J.' role='editor' surname='Reschke'><org | ||||
| anization/></author> | ||||
| <date month='June' year='2014'/> | ||||
| <abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application | ||||
| - level protocol for distributed, collaborative, hypertext information systems. | ||||
| This document defines the semantics of HTTP/1.1 messages, as expressed by reque | ||||
| st methods, request header fields, response status codes, and response header fi | ||||
| elds, along with the payload of messages (metadata and body content) and mechani | ||||
| sms for content negotiation.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='7231'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC7231'/> | ||||
| </reference> | ||||
| <reference anchor='RFC7633' target='https://www.rfc-editor.org/info/rfc7633'> | ||||
| <front> | ||||
| <title>X.509v3 Transport Layer Security (TLS) Feature Extension</title> | ||||
| <author fullname='P. Hallam-Baker' initials='P.' surname='Hallam-Baker'><organiz | ||||
| ation/></author> | ||||
| <date month='October' year='2015'/> | ||||
| <abstract><t>The purpose of the TLS feature extension is to prevent downgrade at | ||||
| tacks that are not otherwise prevented by the TLS protocol. In particular, the | ||||
| TLS feature extension may be used to mandate support for revocation checking fea | ||||
| tures in the TLS protocol such as Online Certificate Status Protocol (OCSP) stap | ||||
| ling. Informing clients that an OCSP status response will always be stapled per | ||||
| mits an immediate failure in the case that the response is not stapled. This in | ||||
| turn prevents a denial-of-service attack that might otherwise be possible.</t>< | ||||
| /abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='7633'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC7633'/> | ||||
| </reference> | ||||
| <reference anchor='RFC7807' target='https://www.rfc-editor.org/info/rfc7807'> | ||||
| <front> | ||||
| <title>Problem Details for HTTP APIs</title> | ||||
| <author fullname='M. Nottingham' initials='M.' surname='Nottingham'><organizatio | ||||
| n/></author> | ||||
| <author fullname='E. Wilde' initials='E.' surname='Wilde'><organization/></autho | ||||
| r> | ||||
| <date month='March' year='2016'/> | ||||
| <abstract><t>This document defines a "problem detail" as a way to carr | ||||
| y machine- readable details of errors in a HTTP response to avoid the need to de | ||||
| fine new error response formats for HTTP APIs.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='7807'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC7807'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8032' target='https://www.rfc-editor.org/info/rfc8032'> | ||||
| <front> | ||||
| <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title> | ||||
| <author fullname='S. Josefsson' initials='S.' surname='Josefsson'><organization/ | ||||
| ></author> | ||||
| <author fullname='I. Liusvaara' initials='I.' surname='Liusvaara'><organization/ | ||||
| ></author> | ||||
| <date month='January' year='2017'/> | ||||
| <abstract><t>This document describes elliptic curve signature scheme Edwards-cur | ||||
| ve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with reco | ||||
| mmended parameters for the edwards25519 and edwards448 curves. An example imple | ||||
| mentation and test vectors are provided.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='8032'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8032'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8174' target='https://www.rfc-editor.org/info/rfc8174'> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
| <author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></autho | ||||
| r> | ||||
| <date month='May' year='2017'/> | ||||
| <abstract><t>RFC 2119 specifies common key words that may be used in protocol s | ||||
| pecifications. This document aims to reduce the ambiguity by clarifying that on | ||||
| ly UPPERCASE usage of the key words have the defined special meanings.</t></abs | ||||
| tract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='14'/> | ||||
| <seriesInfo name='RFC' value='8174'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8174'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8259' target='https://www.rfc-editor.org/info/rfc8259'> | ||||
| <front> | ||||
| <title>The JavaScript Object Notation (JSON) Data Interchange Format</title> | ||||
| <author fullname='T. Bray' initials='T.' role='editor' surname='Bray'><organizat | ||||
| ion/></author> | ||||
| <date month='December' year='2017'/> | ||||
| <abstract><t>JavaScript Object Notation (JSON) is a lightweight, text-based, lan | ||||
| guage-independent data interchange format. It was derived from the ECMAScript P | ||||
| rogramming Language Standard. JSON defines a small set of formatting rules for | ||||
| the portable representation of structured data.</t><t>This document removes inco | ||||
| nsistencies with other specifications of JSON, repairs specification errors, and | ||||
| offers experience-based interoperability guidance.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='90'/> | ||||
| <seriesInfo name='RFC' value='8259'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8259'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8391' target='https://www.rfc-editor.org/info/rfc8391'> | <reference anchor="FIPS186-4" target="http://nvlpubs.nist.gov/nistpubs/F | |||
| <front> | IPS/NIST.FIPS.186-4.pdf"> | |||
| <title>XMSS: eXtended Merkle Signature Scheme</title> | <front> | |||
| <author fullname='A. Huelsing' initials='A.' surname='Huelsing'><organization/>< | <title>Digital Signature Standard (DSS)</title> | |||
| /author> | <author> | |||
| <author fullname='D. Butin' initials='D.' surname='Butin'><organization/></autho | <organization>National Institute of Standards and Technology</orga | |||
| r> | nization> | |||
| <author fullname='S. Gazdag' initials='S.' surname='Gazdag'><organization/></aut | </author> | |||
| hor> | <date year="2013" month="July"/> | |||
| <author fullname='J. Rijneveld' initials='J.' surname='Rijneveld'><organization/ | </front> | |||
| ></author> | <seriesInfo name="FIPS PUB" value="186-4"/> | |||
| <author fullname='A. Mohaisen' initials='A.' surname='Mohaisen'><organization/>< | </reference> | |||
| /author> | ||||
| <date month='May' year='2018'/> | ||||
| <abstract><t>This note describes the eXtended Merkle Signature Scheme (XMSS), a | ||||
| hash-based digital signature system that is based on existing descriptions in sc | ||||
| ientific literature. This note specifies Winternitz One-Time Signature Plus (WO | ||||
| TS+), a one-time signature scheme; XMSS, a single-tree scheme; and XMSS^MT, a mu | ||||
| lti-tree variant of XMSS. Both XMSS and XMSS^MT use WOTS+ as a main building bl | ||||
| ock. XMSS provides cryptographic digital signatures without relying on the conje | ||||
| ctured hardness of mathematical problems. Instead, it is proven that it only re | ||||
| lies on the properties of cryptographic hash functions. XMSS provides strong se | ||||
| curity guarantees and is even secure when the collision resistance of the underl | ||||
| ying hash function is broken. It is suitable for compact implementations, is re | ||||
| latively simple to implement, and naturally resists side-channel attacks. Unlike | ||||
| most other signature systems, hash-based signatures can so far withstand known | ||||
| attacks using quantum computers.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='8391'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8391'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8446' target='https://www.rfc-editor.org/info/rfc8446'> | <reference anchor="UNIXTIME" target="http://pubs.opengroup.org/onlinepub | |||
| <front> | s/9699919799.2016edition/basedefs/V1_chap04.html#tag_04_16"> | |||
| <title>The Transport Layer Security (TLS) Protocol Version 1.3</title> | <front> | |||
| <author fullname='E. Rescorla' initials='E.' surname='Rescorla'><organization/>< | <title>The Open Group Base Specifications Issue 7</title> | |||
| /author> | <author> | |||
| <date month='August' year='2018'/> | <organization>IEEE</organization> | |||
| <abstract><t>This document specifies version 1.3 of the Transport Layer Security | </author> | |||
| (TLS) protocol. TLS allows client/server applications to communicate over the | <date year="2016"/> | |||
| Internet in a way that is designed to prevent eavesdropping, tampering, and mess | </front> | |||
| age forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs | <seriesInfo name="IEEE Std" value="1003.1-2008"/> | |||
| 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 | <refcontent>Section 4.16 Seconds Since the Epoch</refcontent> | |||
| implementations.</t></abstract> | </reference> | |||
| </front> | ||||
| <seriesInfo name='RFC' value='8446'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8446'/> | ||||
| </reference> | ||||
| <reference anchor="HTML401" target="http://www.w3.org/TR/1999/REC-html401-199912 | <reference anchor="X690"> | |||
| 24"> | <front> | |||
| <front> | <title>Information technology - ASN.1 encoding rules: Specification | |||
| <title>HTML 4.01 Specification</title> | of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished | |||
| <author initials="D." surname="Raggett" fullname="David Raggett"> | Encoding Rules (DER)</title> | |||
| <organization></organization> | <author> | |||
| </author> | <organization>ITU-T</organization> | |||
| <author initials="A." surname="Le Hors" fullname="Arnaud Le Hors"> | </author> | |||
| <organization></organization> | <date year="2021" month="February"/> | |||
| </author> | </front> | |||
| <author initials="I." surname="Jacobs" fullname="Ian Jacobs"> | <seriesInfo name="ITU-T Recommendation" value="X.690"/> | |||
| <organization></organization> | <seriesInfo name="ISO/IEC" value="8825-1"/> | |||
| </author> | </reference> | |||
| <date year="1999" month="December" day="24"/> | ||||
| </front> | ||||
| <seriesInfo name="World Wide Web Consortium Recommendation" value="REC-html401 | ||||
| -19991224"/> | ||||
| </reference> | ||||
| <reference anchor="FIPS186-4" target="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST | ||||
| .FIPS.186-4.pdf"> | ||||
| <front> | ||||
| <title>FIPS PUB 186-4</title> | ||||
| <author > | ||||
| <organization>NIST</organization> | ||||
| </author> | ||||
| <date year="2013" month="July" day="01"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="UNIXTIME" target="http://pubs.opengroup.org/onlinepubs/969991 | ||||
| 9799.2016edition/basedefs/V1_chap04.html#tag_04_16"> | ||||
| <front> | ||||
| <title>The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008, 2016 | ||||
| Edition</title> | ||||
| <author > | ||||
| <organization>IEEE</organization> | ||||
| </author> | ||||
| <date year="n.d."/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="X690" > | ||||
| <front> | ||||
| <title>Information technology - ASN.1 encoding Rules: Specification of Basic | ||||
| Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding | ||||
| Rules (DER)</title> | ||||
| <author > | ||||
| <organization>ITU-T</organization> | ||||
| </author> | ||||
| <date year="2015" month="November"/> | ||||
| </front> | ||||
| <seriesInfo name="ISO/IEC" value="8825-1:2002"/> | ||||
| </reference> | ||||
| <reference anchor='RFC3553' target='https://www.rfc-editor.org/info/rfc3553'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| <front> | FC.3553.xml"/> | |||
| <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title> | </references> | |||
| <author fullname='M. Mealling' initials='M.' surname='Mealling'><organization/>< | <references> | |||
| /author> | <name>Informative References</name> | |||
| <author fullname='L. Masinter' initials='L.' surname='Masinter'><organization/>< | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| /author> | FC.6962.xml"/> | |||
| <author fullname='T. Hardie' initials='T.' surname='Hardie'><organization/></aut | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| hor> | FC.8126.xml"/> | |||
| <author fullname='G. Klyne' initials='G.' surname='Klyne'><organization/></autho | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| r> | FC.8820.xml"/> | |||
| <date month='June' year='2003'/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| <abstract><t>This document describes a new sub-delegation for the 'ietf' URN nam | FC.5912.xml"/> | |||
| espace for registered protocol items. The 'ietf' URN namespace is defined in RF | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| C 2648 as a root for persistent URIs that refer to IETF- defined resources. Thi | FC.6268.xml"/> | |||
| s document specifies an Internet Best Current Practices for the Internet Communi | ||||
| ty, and requests discussion and suggestions for improvements.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='73'/> | ||||
| <seriesInfo name='RFC' value='3553'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC3553'/> | ||||
| </reference> | ||||
| </references> | <reference anchor="CrosbyWallach" target="http://static.usenix.org/event | |||
| /sec09/tech/full_papers/crosby.pdf"> | ||||
| <front> | ||||
| <title>Efficient Data Structures for Tamper-Evident Logging</title> | ||||
| <author initials="S." surname="Crosby" fullname="Scott A. Crosby"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="D." surname="Wallach" fullname="Dan S. Wallach"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2009" month="August"/> | ||||
| </front> | ||||
| <refcontent>Proceedings of the 18th USENIX Security Symposium, Montrea | ||||
| l</refcontent> | ||||
| </reference> | ||||
| <references title='Informative References'> | <reference anchor="Chromium.Policy" target="https://googlechrome.github. | |||
| io/CertificateTransparency/ct_policy.html"> | ||||
| <front> | ||||
| <title>Chromium Certificate Transparency Policy</title> | ||||
| <author> | ||||
| <organization>The Chromium Projects</organization> | ||||
| </author> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor='RFC6962' target='https://www.rfc-editor.org/info/rfc6962'> | <reference anchor="JSON.Metadata" target="https://www.gstatic.com/ct/log | |||
| <front> | _list/log_list_schema.json"> | |||
| <title>Certificate Transparency</title> | <front> | |||
| <author fullname='B. Laurie' initials='B.' surname='Laurie'><organization/></aut | <title>Chromium Log Metadata JSON Schema</title> | |||
| hor> | <author> | |||
| <author fullname='A. Langley' initials='A.' surname='Langley'><organization/></a | <organization>The Chromium Projects</organization> | |||
| uthor> | </author> | |||
| <author fullname='E. Kasper' initials='E.' surname='Kasper'><organization/></aut | </front> | |||
| hor> | </reference> | |||
| <date month='June' year='2013'/> | ||||
| <abstract><t>This document describes an experimental protocol for publicly loggi | ||||
| ng the existence of Transport Layer Security (TLS) certificates as they are issu | ||||
| ed or observed, in a manner that allows anyone to audit certificate authority (C | ||||
| A) activity and notice the issuance of suspect certificates as well as to audit | ||||
| the certificate logs themselves. The intent is that eventually clients would re | ||||
| fuse to honor certificates that do not appear in a log, effectively forcing CAs | ||||
| to add all issued certificates to the logs.</t><t>Logs are network services that | ||||
| implement the protocol operations for submissions and queries that are defined | ||||
| in this document.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6962'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6962'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8126' target='https://www.rfc-editor.org/info/rfc8126'> | <reference anchor="Chromium.Log.Policy" target="https://googlechrome.git | |||
| <front> | hub.io/CertificateTransparency/log_policy.html"> | |||
| <title>Guidelines for Writing an IANA Considerations Section in RFCs</title> | <front> | |||
| <author fullname='M. Cotton' initials='M.' surname='Cotton'><organization/></aut | <title>Chromium Certificate Transparency Log Policy</title> | |||
| hor> | <author> | |||
| <author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></autho | <organization>The Chromium Projects</organization> | |||
| r> | </author> | |||
| <author fullname='T. Narten' initials='T.' surname='Narten'><organization/></aut | </front> | |||
| hor> | </reference> | |||
| <date month='June' year='2017'/> | ||||
| <abstract><t>Many protocols make use of points of extensibility that use constan | ||||
| ts to identify various protocol parameters. To ensure that the values in these | ||||
| fields do not have conflicting uses and to promote interoperability, their alloc | ||||
| ations are often coordinated by a central record keeper. For IETF protocols, th | ||||
| at role is filled by the Internet Assigned Numbers Authority (IANA).</t><t>To ma | ||||
| ke assignments in a given registry prudently, guidance describing the conditions | ||||
| under which new values should be assigned, as well as when and how modification | ||||
| s to existing values can be made, is needed. This document defines a framework | ||||
| for the documentation of these guidelines by specification authors, in order to | ||||
| assure that the provided guidance for the IANA Considerations is clear and addre | ||||
| sses the various issues that are likely in the operation of a registry.</t><t>Th | ||||
| is is the third edition of this document; it obsoletes RFC 5226.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='26'/> | ||||
| <seriesInfo name='RFC' value='8126'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8126'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8820' target='https://www.rfc-editor.org/info/rfc8820'> | <reference anchor="CABBR" target="https://cabforum.org/wp-content/upload | |||
| <front> | s/CA-Browser-Forum-BR-1.7.3.pdf"> | |||
| <title>URI Design and Ownership</title> | <front> | |||
| <author fullname='M. Nottingham' initials='M.' surname='Nottingham'><organizatio | <title>Baseline Requirements for the Issuance and Management of Publ | |||
| n/></author> | icly-Trusted Certificates</title> | |||
| <date month='June' year='2020'/> | <author> | |||
| <abstract><t>Section 1.1.1 of RFC 3986 defines URI syntax as "a federated a | <organization>CA/Browser Forum</organization> | |||
| nd extensible naming system wherein each scheme's specification may further rest | </author> | |||
| rict the syntax and semantics of identifiers using that scheme." In other | <date month="October" year="2020"/> | |||
| words, the structure of a URI is defined by its scheme. While it is common for s | </front> | |||
| chemes to further delegate their substructure to the URI's owner, publishing ind | <seriesInfo name="Version" value="1.7.3"/> | |||
| ependent standards that mandate particular forms of substructure in URIs is ofte | </reference> | |||
| n problematic.</t><t>This document provides guidance on the specification of URI | ||||
| substructure in standards.</t><t>This document obsoletes RFC 7320 and updates R | ||||
| FC 3986.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='190'/> | ||||
| <seriesInfo name='RFC' value='8820'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8820'/> | ||||
| </reference> | ||||
| <reference anchor="CrosbyWallach" target="http://static.usenix.org/event/sec09/t | <reference anchor="X.680"> | |||
| ech/full_papers/crosby.pdf"> | <front> | |||
| <front> | <title>Information technology - Abstract Syntax Notation One (ASN.1) | |||
| <title>Efficient Data Structures for Tamper-Evident Logging</title> | : Specification of basic notation</title> | |||
| <author initials="S." surname="Crosby" fullname="Scott A. Crosby"> | <author> | |||
| <organization></organization> | <organization>ITU-T</organization> | |||
| </author> | </author> | |||
| <author initials="D." surname="Wallach" fullname="Dan S. Wallach"> | <date year="2021" month="February"/> | |||
| <organization></organization> | </front> | |||
| </author> | <seriesInfo name="ITU-T Recommendation" value="X.680"/> | |||
| <date year="2009" month="August"/> | </reference> | |||
| </front> | ||||
| <seriesInfo name="Proceedings of the 18th USENIX Security Symposium," value="M | ||||
| ontreal"/> | ||||
| </reference> | ||||
| <reference anchor="Chromium.Policy" target="http://www.chromium.org/Home/chromiu | ||||
| m-security/certificate-transparency"> | ||||
| <front> | ||||
| <title>Chromium Certificate Transparency</title> | ||||
| <author > | ||||
| <organization>The Chromium Projects</organization> | ||||
| </author> | ||||
| <date year="2014"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="JSON.Metadata" target="https://www.gstatic.com/ct/log_list/lo | ||||
| g_list_schema.json"> | ||||
| <front> | ||||
| <title>Chromium Log Metadata JSON Schema</title> | ||||
| <author > | ||||
| <organization>The Chromium Projects</organization> | ||||
| </author> | ||||
| <date year="2014"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Chromium.Log.Policy" target="http://www.chromium.org/Home/chr | ||||
| omium-security/certificate-transparency/log-policy"> | ||||
| <front> | ||||
| <title>Chromium Certificate Transparency Log Policy</title> | ||||
| <author > | ||||
| <organization>The Chromium Projects</organization> | ||||
| </author> | ||||
| <date year="2014"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="CABBR" target="https://cabforum.org/wp-content/uploads/CA-Bro | ||||
| wser-Forum-BR-1.7.3.pdf"> | ||||
| <front> | ||||
| <title>Baseline Requirements for the Issuance and Management of Publicly-Tru | ||||
| sted Certificates</title> | ||||
| <author > | ||||
| <organization>CA/Browser Forum</organization> | ||||
| </author> | ||||
| <date year="2020"/> | ||||
| </front> | ||||
| <format type="PDF" target="https://cabforum.org/wp-content/uploads/CA-Browser- | ||||
| Forum-BR-1.7.3.pdf"/> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <section anchor="v1_coexistence" title="Supporting v1 and v2 simultaneously (Inf | <section anchor="v1_coexistence" numbered="true" toc="default"> | |||
| ormative)"> | <name>Supporting v1 and v2 Simultaneously (Informative)</name> | |||
| <t>Certificate Transparency logs have to be either v1 (conforming to <xref | ||||
| <t>Certificate Transparency logs have to be either v1 (conforming to <xref targe | target="RFC6962" format="default"/>) or | |||
| t="RFC6962"></xref>) or | v2 (conforming to this document), as the data structures are incompatible, and s | |||
| v2 (conforming to this document), as the data structures are incompatible and so | o | |||
| a v2 log could not issue a valid v1 SCT.</t> | a v2 log could not issue a valid v1 SCT.</t> | |||
| <t>CT clients, however, can support v1 and v2 SCTs for the same certificat | ||||
| <t>CT clients, however, can support v1 and v2 SCTs, for the same certificate, | e | |||
| simultaneously, as v1 SCTs are delivered in different TLS, X.509 and OCSP | simultaneously, as v1 SCTs are delivered in different TLS, X.509, and OCSP | |||
| extensions than v2 SCTs.</t> | extensions than v2 SCTs.</t> | |||
| <t>v1 and v2 SCTs for X.509 certificates can be validated independently. F | ||||
| <t>v1 and v2 SCTs for X.509 certificates can be validated independently. For | or | |||
| precertificates, v2 SCTs should be embedded in the TBSCertificate before | precertificates, v2 SCTs should be embedded in the TBSCertificate before | |||
| submission of the TBSCertificate (inside a v1 precertificate, as described in | submission of the TBSCertificate (inside a v1 precertificate, as described in | |||
| Section 3.1. of <xref target="RFC6962"></xref>) to a v1 log so that TLS clients | <xref target="RFC6962" sectionFormat="of" section="3.1"/>) to a v1 log so that T | |||
| conforming to | LS clients conforming to | |||
| <xref target="RFC6962"></xref> but not this document are oblivious to the embedd | <xref target="RFC6962" format="default"/> but not this document are oblivious to | |||
| ed v2 SCTs. An issuer | the embedded v2 SCTs. An issuer | |||
| can follow these steps to produce an X.509 certificate with embedded v1 and v2 | can follow these steps to produce an X.509 certificate with embedded v1 and v2 | |||
| SCTs:</t> | SCTs:</t> | |||
| <ul spacing="normal"> | ||||
| <t><list style="symbols"> | <li>Create a CMS precertificate, as described in <xref target="precertif | |||
| <t>Create a CMS precertificate as described in <xref target="precertificates"/ | icates" | |||
| > and submit it | format="default"/>, and submit it to v2 logs.</li> | |||
| to v2 logs.</t> | <li>Embed the obtained v2 SCTs in the TBSCertificate, as described in | |||
| <t>Embed the obtained v2 SCTs in the TBSCertificate, as described in | <xref target="cert_transinfo_extension" format="default"/>.</li> | |||
| <xref target="cert_transinfo_extension"/>.</t> | <li>Use that TBSCertificate to create a v1 precertificate, as described | |||
| <t>Use that TBSCertificate to create a v1 precertificate, as described in | in | |||
| Section 3.1. of <xref target="RFC6962"></xref> and submit it to v1 logs.</t> | <xref target="RFC6962" sectionFormat="of" section="3.1"/>, and submit it | |||
| <t>Embed the v1 SCTs in the TBSCertificate, as described in Section 3.3 of | to v1 | |||
| <xref target="RFC6962"></xref>.</t> | logs.</li> | |||
| <t>Sign that TBSCertificate (which now contains v1 and v2 SCTs) to issue the | <li>Embed the v1 SCTs in the TBSCertificate, as described in | |||
| final X.509 certificate.</t> | <xref target="RFC6962" sectionFormat="of" section="3.3"/>.</li> | |||
| </list></t> | <li>Sign that TBSCertificate (which now contains v1 and v2 SCTs) to issu | |||
| e the | ||||
| </section> | final X.509 certificate.</li> | |||
| <section anchor="asn1_module" title="An ASN.1 Module (Informative)"> | </ul> | |||
| </section> | ||||
| <t>The following ASN.1 module may be useful to implementors.</t> | <section anchor="asn1_module" numbered="true" toc="default"> | |||
| <name>An ASN.1 Module (Informative)</name> | ||||
| <figure><artwork><![CDATA[ | <t>The following ASN.1 <xref target="X.680" format="default"/> module may | |||
| be useful to implementors. This module references <xref target="RFC5912" format= | ||||
| "default"/> and <xref target="RFC6268" format="default"/>.</t> | ||||
| <sourcecode type="asn.1"><![CDATA[ | ||||
| CertificateTransparencyV2Module-2021 | CertificateTransparencyV2Module-2021 | |||
| -- { id-mod-public-notary-v2 from above, in | -- { id-mod-public-notary-v2 from above, in | |||
| iso(1) identified-organization(3) ... | iso(1) identified-organization(3) ... | |||
| form } | form } | |||
| DEFINITIONS IMPLICIT TAGS ::= BEGIN | DEFINITIONS IMPLICIT TAGS ::= BEGIN | |||
| -- EXPORTS ALL -- | -- EXPORTS ALL -- | |||
| IMPORTS | IMPORTS | |||
| EXTENSION | EXTENSION | |||
| skipping to change at line 3048 ¶ | skipping to change at line 2928 ¶ | |||
| IDENTIFIED BY id-ce-embeddedSCT-CTv1 | IDENTIFIED BY id-ce-embeddedSCT-CTv1 | |||
| CRITICALITY { FALSE } } | CRITICALITY { FALSE } } | |||
| id-ce-embeddedSCT-CTv1 OBJECT IDENTIFIER ::= { | id-ce-embeddedSCT-CTv1 OBJECT IDENTIFIER ::= { | |||
| 1 3 6 1 4 1 11129 2 4 2 } | 1 3 6 1 4 1 11129 2 4 2 } | |||
| SignedCertificateTimestampList ::= OCTET STRING | SignedCertificateTimestampList ::= OCTET STRING | |||
| END | END | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| </section> | ||||
| </section> | <section anchor="acknowledgements" numbered="false" toc="default"> | |||
| <name>Acknowledgements</name> | ||||
| <t>The authors would like to thank <contact fullname="Erwann Abelea"/>, <c | ||||
| ontact | ||||
| fullname="Robin Alden"/>, <contact fullname="Andrew Ayer"/>, <contact full | ||||
| name="Richard | ||||
| Barnes"/>, <contact fullname="Al Cutter"/>, <contact fullname="David Drysd | ||||
| ale"/>, | ||||
| <contact fullname="Francis Dupont"/>, <contact fullname="Adam Eijdenberg"/ | ||||
| >, <contact | ||||
| fullname="Stephen Farrell"/>, <contact fullname="Daniel Kahn Gillmor"/>, < | ||||
| contact | ||||
| fullname="Paul Hadfield"/>, <contact fullname="Brad Hill"/>, <contact full | ||||
| name="Jeff | ||||
| Hodges"/>, <contact fullname="Paul | ||||
| Hoffman"/>, <contact fullname="Jeffrey Hutzelman"/>, <contact fullname="Ka | ||||
| t Joyce"/>, | ||||
| <contact fullname="Emilia Kasper"/>, <contact fullname="Stephen Kent"/>, < | ||||
| contact | ||||
| fullname="Adam Langley"/>, <contact fullname="SM"/>, <contact fullname="Al | ||||
| exey | ||||
| Melnikov"/>, <contact fullname="Linus | ||||
| Nordberg"/>, <contact fullname="Chris Palmer"/>, <contact fullname="Trevor | ||||
| Perrin"/>, | ||||
| <contact fullname="Pierre Phaneuf"/>, <contact fullname="Eric Rescorla"/>, | ||||
| <contact | ||||
| fullname="Rich Salz"/>, <contact fullname="Melinda Shore"/>, <contact full | ||||
| name="Ryan | ||||
| Sleevi"/>, <contact fullname="Martin Smith"/>, <contact fullname="Carl Wal | ||||
| lace"/>, | ||||
| and <contact fullname="Paul Wouters"/> for their valuable contributions.</ | ||||
| t> | ||||
| <t>A big thank you to Symantec for kindly donating the OIDs from the 1.3.1 | ||||
| 01 arc | ||||
| that are used in this document.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| <!-- ##markdown-source: | ||||
| H4sIALh5LmEAA+y9aVsbWbYu+D1+RVzyeTqhSpIBD2mTWdmXxLjMKU9tcFad | ||||
| znSjQAogCkmhowiBKdv3t/d617CHiBDgnE7dfppzKg1SxJ73mte7+v1+Uhf1 | ||||
| JN9J1/byRV2cFqOsztOjRTar5tkin42u0x/zRVWUs3R7sLmWjMvRLJvS8+NF | ||||
| dlr3i7w+7dd4ur84HT168mi7f1JU/QfbSXlSlZO8zqudFB8naPesXFzvpPmH | ||||
| eZIU8wX1WS+WVb29uflkc3stoe6ynfQwHy0XRX2dXJ3tpEdvd18dputvlieT | ||||
| YpS+KutscR0NbiNJqjqbjY+zSTmjUV3nVVJNs0V9/F/LkjsvT0+TebGT/lSX | ||||
| o15alYt6kZ9W9Nv1FL+8T5JsWZ+Xi50k7Scp/cj0fshn6YuMRpLzh+WCRvPX | ||||
| sjyb5Om7v6Uv6vGAP89OThb5pX3FH+XTrJjspCf5bPI/z/jjwaicxq3vjrMp | ||||
| NT+jL69b7R/MRrc1np2tbnt/WkyKLP1bVs3zRavxw6ui/le+mNCapX+dnjy/ | ||||
| paP8gptZ3RntRfoyr6p8UfzChcqpienKDt6WJ+khHbDxpJid+R7olNTFWdlu | ||||
| X78IO1iUJ/+zko+5/WRWLqZZXVzmtOfp22d721tbT/TX+08eP9JfHzx68Fh/ | ||||
| fbj94JH79fGm/fro4bb++mjzkT3waPv+A/v1yaNN9+s31sU32/e37NdH9+/b | ||||
| r483v9FfH2/et3Yfb31jjT3efmgtPL7/xFp4/EBG9vzo5YsHm/xpmtItOcvr | ||||
| nfS8ruc79+5dXV0Nru4PaN3uHb29t/XkyZN7b/f3+uf1dEKv9PHB1vb2A3lV | ||||
| iAGaSx8MNrfSw3k+EqpAJEBW2q4L//T13zQtZnTbng7St9kZ9V67z2Ufn2aX | ||||
| xbjxXePd3UH6Ik+fl4uq8e7uYpYtx40vGy8fDNL/yEZEdBrvHtD5DL4YExXa | ||||
| STHl/tZ2XyeNw5tXxey0tFmt/b1cTMbp34txnv49P0n3yhkoR7Gcpm9zOkPT | ||||
| fDbmFVmjE9q9ls8O3hxuPX7Uf9C5J7PLyXx5Ug1mRVUPzsrLe/gFn9zDe/de | ||||
| HRweDfDbgJsYzMen4fbgm/TNux9S/rZjV/iOoJFg0tubW/f7m9/0N7fow3ev | ||||
| Dv5xdPByv3NwPLJyns/OFuVyzgennNH9y3mATx5hknSenwyoyUf5uMBC3DvJ | ||||
| qnxMBPXej1vHo/NsvvlggFX5qs7OjjcfHG89CidwdJ6nr6mD9K/oIf2B3o1P | ||||
| WpUeVNUyT79JD/b394kCjNOtzc37g60+cYvHPUzmUbovXa+aP96kv//x6Mnm | ||||
| Ttj52gHtNFMAYmp1PjqflZPy7Drtp7uHrwZbKfGVckzUJn27nICDRAMjfoLh | ||||
| Ejfajx5L13/Yf7vRS/eyWTmjZyet7/fo+xRk9yltNX2+LKrzfNx67Ck9thZs | ||||
| 26vyMp+e5AtM+eHKqR696x+tOMsHh6/vHezv7aSPiYT0t3ZoAbeJ/9oaOCoI | ||||
| Lu3IzraRM3qJV29vUVYn13/PJpNsdN55aogP18VosKzyWfGBD01+mc/qe0R6 | ||||
| N5/cwzrfO11OJsfzjBhKdW/EDTZP9v4pLXRBrxHBqDNQ/uWoXi5oYWi46VE2 | ||||
| pXf7+0RK8MiL8uzMuMKNVOlwoONvEIfDUVnXoDvRt22SptNukbQZWg6/tJu2 | ||||
| +aS/+XgVbXmzKEd5jj2vcJpqugtbj+vz9N3hPt1KJwClh9fTeVkRzekRlXlZ | ||||
| zkhwySbYivNFOaWPB29KkoquV9L8kT2HvXheTvN79km/0j7ujbzQJ2KcylXh | ||||
| nlh/6SoJcdWpxC13L9Os/0lMuIrWaQvE6z8OX78avMzrjD7N2rOpdDpnesCI | ||||
| /N4b1ffoyh5P6Ca5X46r0Tlx/ME/KyUJzeHTcUmtG+6U9h9v/Mrhu+2g9n/P | ||||
| LcFE+3Nu/4t2h+f9xr/3K2a6+8MPb7s3aJSd0AXViV3N+yM6rrj8y/mkzMbV | ||||
| vb3d/g+L8opuQ/8Znuv/8La/NfhmcL9JAL7XcYElgOUQv/2vZbHIiePWQgRw | ||||
| X8AcstkoZ3r6MptlZ/wAXSd9XTSGyXX/CBoGkdlgdapVy7C3e08HmfIgoxXY | ||||
| 3uQ/hWraa2+ePvut1iDp9/skxVa05aM6SY7OiyolZWvJ8xrn1WhRnBAZvPTK | ||||
| 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 | ||||
| </rfc> | </rfc> | |||
| End of changes. 191 change blocks. | ||||
| 3878 lines changed or deleted | 3145 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||