rfc9162.original | rfc9162.txt | |||
---|---|---|---|---|
TRANS (Public Notary Transparency) B. Laurie | Internet Engineering Task Force (IETF) B. Laurie | |||
Internet-Draft A. Langley | Request for Comments: 9162 E. Messeri | |||
Obsoletes: 6962 (if approved) E. Kasper | Obsoletes: 6962 Google | |||
Intended status: Experimental E. Messeri | Category: Experimental R. Stradling | |||
Expires: 4 March 2022 Google | ISSN: 2070-1721 Sectigo | |||
R. Stradling | November 2021 | |||
Sectigo | ||||
31 August 2021 | ||||
Certificate Transparency Version 2.0 | Certificate Transparency Version 2.0 | |||
draft-ietf-trans-rfc6962-bis-42 | ||||
Abstract | Abstract | |||
This document describes version 2.0 of the Certificate Transparency | This document describes version 2.0 of the Certificate Transparency | |||
(CT) protocol for publicly logging the existence of Transport Layer | (CT) protocol for publicly logging the existence of Transport Layer | |||
Security (TLS) server certificates as they are issued or observed, in | Security (TLS) server certificates as they are issued or observed, in | |||
a manner that allows anyone to audit certification authority (CA) | a manner that allows anyone to audit certification authority (CA) | |||
activity and notice the issuance of suspect certificates as well as | activity and notice the issuance of suspect certificates as well as | |||
to audit the certificate logs themselves. The intent is that | to audit the certificate logs themselves. The intent is that | |||
eventually clients would refuse to honor certificates that do not | eventually clients would refuse to honor certificates that do not | |||
appear in a log, effectively forcing CAs to add all issued | appear in a log, effectively forcing CAs to add all issued | |||
certificates to the logs. | certificates to the logs. | |||
This document obsoletes RFC 6962. It also specifies a new TLS | This document obsoletes RFC 6962. It also specifies a new TLS | |||
extension that is used to send various CT log artifacts. | extension that is used to send various CT log artifacts. | |||
Logs are network services that implement the protocol operations for | Logs are network services that implement the protocol operations for | |||
submissions and queries that are defined in this document. | submissions and queries that are defined in this document. | |||
[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. ] | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This document is not an Internet Standards Track specification; it is | |||
provisions of BCP 78 and BCP 79. | published for examination, experimental implementation, and | |||
evaluation. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document defines an Experimental Protocol for the Internet | |||
and may be updated, replaced, or obsoleted by other documents at any | community. This document is a product of the Internet Engineering | |||
time. It is inappropriate to use Internet-Drafts as reference | Task Force (IETF). It represents the consensus of the IETF | |||
material or to cite them other than as "work in progress." | community. It has received public review and has been approved for | |||
publication by the Internet Engineering Steering Group (IESG). Not | ||||
all documents approved by the IESG are candidates for any level of | ||||
Internet Standard; see Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 4 March 2022. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9162. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Simplified BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
1.1. Requirements Language . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Language | |||
1.2. Data Structures . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Data Structures | |||
1.3. Major Differences from CT 1.0 . . . . . . . . . . . . . . 6 | 1.3. Major Differences from CT 1.0 | |||
2. Cryptographic Components . . . . . . . . . . . . . . . . . . 7 | 2. Cryptographic Components | |||
2.1. Merkle Hash Trees . . . . . . . . . . . . . . . . . . . . 7 | 2.1. Merkle Trees | |||
2.1.1. Definition of the Merkle Tree . . . . . . . . . . . . 7 | 2.1.1. Definition of the Merkle Tree | |||
2.1.2. Verifying a Tree Head Given Entries . . . . . . . . . 8 | 2.1.2. Verifying a Tree Head Given Entries | |||
2.1.3. Merkle Inclusion Proofs . . . . . . . . . . . . . . . 9 | 2.1.3. Merkle Inclusion Proofs | |||
2.1.4. Merkle Consistency Proofs . . . . . . . . . . . . . . 11 | 2.1.4. Merkle Consistency Proofs | |||
2.1.5. Example . . . . . . . . . . . . . . . . . . . . . . . 13 | 2.1.5. Example | |||
2.2. Signatures . . . . . . . . . . . . . . . . . . . . . . . 14 | 2.2. Signatures | |||
3. Submitters . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 3. Submitters | |||
3.1. Certificates . . . . . . . . . . . . . . . . . . . . . . 15 | 3.1. Certificates | |||
3.2. Precertificates . . . . . . . . . . . . . . . . . . . . . 15 | 3.2. Precertificates | |||
3.2.1. Binding Intent to Issue . . . . . . . . . . . . . . . 17 | 3.2.1. Binding Intent to Issue | |||
4. Log Format and Operation . . . . . . . . . . . . . . . . . . 17 | 4. Log Format and Operation | |||
4.1. Log Parameters . . . . . . . . . . . . . . . . . . . . . 18 | 4.1. Log Parameters | |||
4.2. Evaluating Submissions . . . . . . . . . . . . . . . . . 19 | 4.2. Evaluating Submissions | |||
4.2.1. Minimum Acceptance Criteria . . . . . . . . . . . . . 19 | 4.2.1. Minimum Acceptance Criteria | |||
4.2.2. Discretionary Acceptance Criteria . . . . . . . . . . 20 | 4.2.2. Discretionary Acceptance Criteria | |||
4.3. Log Entries . . . . . . . . . . . . . . . . . . . . . . . 20 | 4.3. Log Entries | |||
4.4. Log ID . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 4.4. Log ID | |||
4.5. TransItem Structure . . . . . . . . . . . . . . . . . . . 21 | 4.5. TransItem Structure | |||
4.6. Log Artifact Extensions . . . . . . . . . . . . . . . . . 22 | 4.6. Log Artifact Extensions | |||
4.7. Merkle Tree Leaves . . . . . . . . . . . . . . . . . . . 23 | 4.7. Merkle Tree Leaves | |||
4.8. Signed Certificate Timestamp (SCT) . . . . . . . . . . . 24 | 4.8. Signed Certificate Timestamp (SCT) | |||
4.9. Merkle Tree Head . . . . . . . . . . . . . . . . . . . . 25 | 4.9. Merkle Tree Head | |||
4.10. Signed Tree Head (STH) . . . . . . . . . . . . . . . . . 26 | 4.10. Signed Tree Head (STH) | |||
4.11. Merkle Consistency Proofs . . . . . . . . . . . . . . . . 26 | 4.11. Merkle Consistency Proofs | |||
4.12. Merkle Inclusion Proofs . . . . . . . . . . . . . . . . . 27 | 4.12. Merkle Inclusion Proofs | |||
4.13. Shutting down a log . . . . . . . . . . . . . . . . . . . 28 | 4.13. Shutting Down a Log | |||
5. Log Client Messages . . . . . . . . . . . . . . . . . . . . . 28 | 5. Log Client Messages | |||
5.1. Submit Entry to Log . . . . . . . . . . . . . . . . . . . 30 | 5.1. Submit Entry to Log | |||
5.2. Retrieve Latest STH . . . . . . . . . . . . . . . . . . . 32 | 5.2. Retrieve Latest STH | |||
5.3. Retrieve Merkle Consistency Proof between Two STHs . . . 32 | 5.3. Retrieve Merkle Consistency Proof between Two STHs | |||
5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash . . 33 | 5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash | |||
5.5. Retrieve Merkle Inclusion Proof, STH and Consistency Proof | 5.5. Retrieve Merkle Inclusion Proof, STH, and Consistency Proof | |||
by Leaf Hash . . . . . . . . . . . . . . . . . . . . . . 34 | by Leaf Hash | |||
5.6. Retrieve Entries and STH from Log . . . . . . . . . . . . 35 | 5.6. Retrieve Entries and STH from Log | |||
5.7. Retrieve Accepted Trust Anchors . . . . . . . . . . . . . 37 | 5.7. Retrieve Accepted Trust Anchors | |||
6. TLS Servers . . . . . . . . . . . . . . . . . . . . . . . . . 38 | 6. TLS Servers | |||
6.1. TLS Client Authentication . . . . . . . . . . . . . . . . 38 | 6.1. TLS Client Authentication | |||
6.2. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . . 39 | 6.2. Multiple SCTs | |||
6.3. TransItemList Structure . . . . . . . . . . . . . . . . . 39 | 6.3. TransItemList Structure | |||
6.4. Presenting SCTs, inclusions proofs and STHs . . . . . . . 40 | 6.4. Presenting SCTs, Inclusions Proofs, and STHs | |||
6.5. transparency_info TLS Extension . . . . . . . . . . . . . 40 | 6.5. transparency_info TLS Extension | |||
7. Certification Authorities . . . . . . . . . . . . . . . . . . 41 | 7. Certification Authorities | |||
7.1. Transparency Information X.509v3 Extension . . . . . . . 41 | 7.1. Transparency Information X.509v3 Extension | |||
7.1.1. OCSP Response Extension . . . . . . . . . . . . . . . 41 | 7.1.1. OCSP Response Extension | |||
7.1.2. Certificate Extension . . . . . . . . . . . . . . . . 41 | 7.1.2. Certificate Extension | |||
7.2. TLS Feature X.509v3 Extension . . . . . . . . . . . . . . 41 | 7.2. TLS Feature X.509v3 Extension | |||
8. Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 8. Clients | |||
8.1. TLS Client . . . . . . . . . . . . . . . . . . . . . . . 42 | 8.1. TLS Client | |||
8.1.1. Receiving SCTs and inclusion proofs . . . . . . . . . 42 | 8.1.1. Receiving SCTs and Inclusion Proofs | |||
8.1.2. Reconstructing the TBSCertificate . . . . . . . . . . 42 | 8.1.2. Reconstructing the TBSCertificate | |||
8.1.3. Validating SCTs . . . . . . . . . . . . . . . . . . . 42 | 8.1.3. Validating SCTs | |||
8.1.4. Fetching inclusion proofs . . . . . . . . . . . . . . 43 | 8.1.4. Fetching Inclusion Proofs | |||
8.1.5. Validating inclusion proofs . . . . . . . . . . . . . 43 | 8.1.5. Validating Inclusion Proofs | |||
8.1.6. Evaluating compliance . . . . . . . . . . . . . . . . 44 | 8.1.6. Evaluating Compliance | |||
8.2. Monitor . . . . . . . . . . . . . . . . . . . . . . . . . 44 | 8.2. Monitor | |||
8.3. Auditing . . . . . . . . . . . . . . . . . . . . . . . . 45 | 8.3. Auditing | |||
9. Algorithm Agility . . . . . . . . . . . . . . . . . . . . . . 46 | 9. Algorithm Agility | |||
10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | 10. IANA Considerations | |||
10.1. Additions to existing registries . . . . . . . . . . . . 47 | 10.1. Additions to Existing Registries | |||
10.1.1. New Entry to the TLS ExtensionType Registry . . . . 47 | 10.1.1. New Entry to the TLS ExtensionType Registry | |||
10.1.2. URN Sub-namespace for TRANS | 10.1.2. URN Sub-namespace for TRANS (urn:ietf:params:trans) | |||
(urn:ietf:params:trans) . . . . . . . . . . . . . . . 47 | 10.2. New CT-Related Registries | |||
10.2. New CT-Related registries . . . . . . . . . . . . . . . 47 | 10.2.1. Hash Algorithms | |||
10.2.1. Hash Algorithms . . . . . . . . . . . . . . . . . . 48 | 10.2.2. Signature Algorithms | |||
10.2.2. Signature Algorithms . . . . . . . . . . . . . . . . 48 | 10.2.3. VersionedTransTypes | |||
10.2.3. VersionedTransTypes . . . . . . . . . . . . . . . . 49 | 10.2.4. Log Artifact Extensions | |||
10.2.4. Log Artifact Extension Registry . . . . . . . . . . 50 | 10.2.5. Log IDs | |||
10.2.5. Log IDs Registry . . . . . . . . . . . . . . . . . . 51 | 10.2.6. Error Types | |||
10.2.6. Error Types Registry . . . . . . . . . . . . . . . . 52 | 10.3. OID Assignment | |||
10.3. OID Assignment . . . . . . . . . . . . . . . . . . . . . 54 | 11. Security Considerations | |||
11. Security Considerations . . . . . . . . . . . . . . . . . . . 54 | 11.1. Misissued Certificates | |||
11.1. Misissued Certificates . . . . . . . . . . . . . . . . . 55 | 11.2. Detection of Misissue | |||
11.2. Detection of Misissue . . . . . . . . . . . . . . . . . 55 | 11.3. Misbehaving Logs | |||
11.3. Misbehaving Logs . . . . . . . . . . . . . . . . . . . . 55 | 11.4. Multiple SCTs | |||
11.4. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . 56 | 11.5. Leakage of DNS Information | |||
11.5. Leakage of DNS Information . . . . . . . . . . . . . . . 56 | 12. References | |||
12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 56 | 12.1. Normative References | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 56 | 12.2. Informative References | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . 56 | Appendix A. Supporting v1 and v2 Simultaneously (Informative) | |||
13.2. Informative References . . . . . . . . . . . . . . . . . 59 | Appendix B. An ASN.1 Module (Informative) | |||
Appendix A. Supporting v1 and v2 simultaneously (Informative) . 60 | Acknowledgements | |||
Appendix B. An ASN.1 Module (Informative) . . . . . . . . . . . 60 | Authors' Addresses | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
1. Introduction | 1. Introduction | |||
Certificate Transparency aims to mitigate the problem of misissued | Certificate Transparency aims to mitigate the problem of misissued | |||
certificates by providing append-only logs of issued certificates. | certificates by providing append-only logs of issued certificates. | |||
The logs do not themselves prevent misissuance, but they ensure that | The logs do not themselves prevent misissuance, but they ensure that | |||
interested parties (particularly those named in certificates) can | interested parties (particularly those named in certificates) can | |||
detect such misissuance. Note that this is a general mechanism that | detect such misissuance. Note that this is a general mechanism that | |||
could be used for transparently logging any form of binary data, | could be used for transparently logging any form of binary data, | |||
subject to some kind of inclusion criteria. In this document, we | subject to some kind of inclusion criteria. In this document, we | |||
skipping to change at page 5, line 9 ¶ | skipping to change at line 189 ¶ | |||
they accept as valid are accompanied by signed timestamps. | they accept as valid are accompanied by signed timestamps. | |||
Those who are concerned about misissuance can monitor the logs, | Those who are concerned about misissuance can monitor the logs, | |||
asking them regularly for all new entries, and can thus check whether | asking them regularly for all new entries, and can thus check whether | |||
domains for which they are responsible have had certificates issued | domains for which they are responsible have had certificates issued | |||
that they did not expect. What they do with this information, | that they did not expect. What they do with this information, | |||
particularly when they find that a misissuance has happened, is | particularly when they find that a misissuance has happened, is | |||
beyond the scope of this document. However, broadly speaking, they | beyond the scope of this document. However, broadly speaking, they | |||
can invoke existing business mechanisms for dealing with misissued | can invoke existing business mechanisms for dealing with misissued | |||
certificates, such as working with the CA to get the certificate | certificates, such as working with the CA to get the certificate | |||
revoked, or with maintainers of trust anchor lists to get the CA | revoked or with maintainers of trust anchor lists to get the CA | |||
removed. Of course, anyone who wants can monitor the logs and, if | removed. Of course, anyone who wants can monitor the logs and, if | |||
they believe a certificate is incorrectly issued, take action as they | they believe a certificate is incorrectly issued, take action as they | |||
see fit. | see fit. | |||
Similarly, those who have seen signed timestamps from a particular | Similarly, those who have seen signed timestamps from a particular | |||
log can later demand a proof of inclusion from that log. If the log | log can later demand a proof of inclusion from that log. If the log | |||
is unable to provide this (or, indeed, if the corresponding | is unable to provide this (or, indeed, if the corresponding | |||
certificate is absent from monitors' copies of that log), that is | certificate is absent from monitors' copies of that log), that is | |||
evidence of the incorrect operation of the log. The checking | evidence of the incorrect operation of the log. The checking | |||
operation is asynchronous to allow clients to proceed without delay, | operation is asynchronous to allow clients to proceed without delay, | |||
despite possible issues such as network connectivity and the vagaries | despite possible issues, such as network connectivity and the | |||
of firewalls. | vagaries of firewalls. | |||
The append-only property of each log is achieved using Merkle Trees, | The append-only property of each log is achieved using Merkle Trees, | |||
which can be used to efficiently prove that any particular instance | which can be used to efficiently prove that any particular instance | |||
of the log is a superset of any particular previous instance and to | of the log is a superset of any particular previous instance and to | |||
efficiently detect various misbehaviors of the log (e.g., issuing a | efficiently detect various misbehaviors of the log (e.g., issuing a | |||
signed timestamp for a certificate that is not subsequently logged). | signed timestamp for a certificate that is not subsequently logged). | |||
It is necessary to treat each log as a trusted third party, because | The log auditing mechanisms described in this document can be | |||
the log auditing mechanisms described in this document can be | ||||
circumvented by a misbehaving log that shows different, inconsistent | circumvented by a misbehaving log that shows different, inconsistent | |||
views of itself to different clients. While mechanisms are being | views of itself to different clients. Therefore, it is necessary to | |||
treat each log as a trusted third party. While mechanisms are being | ||||
developed to address these shortcomings and thereby avoid the need to | developed to address these shortcomings and thereby avoid the need to | |||
blindly trust logs, such mechanisms are outside the scope of this | blindly trust logs, such mechanisms are outside the scope of this | |||
document. | document. | |||
1.1. Requirements Language | 1.1. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
1.2. Data Structures | 1.2. Data Structures | |||
Data structures are defined and encoded according to the conventions | Data structures are defined and encoded according to the conventions | |||
laid out in Section 3 of [RFC8446]. | laid out in Section 3 of [RFC8446]. | |||
This document uses object identifiers (OIDs) to identify Log IDs (see | This document uses object identifiers (OIDs) to identify Log IDs (see | |||
Section 4.4), the precertificate CMS "eContentType" (see | Section 4.4), the precertificate Cryptographic Message Syntax (CMS) | |||
Section 3.2), and X.509v3 extensions in certificates (see | eContentType (see Section 3.2), X.509v3 extensions in certificates | |||
Section 7.1.2) and OCSP responses (see Section 7.1.1). The OIDs are | (see Section 7.1.2), and Online Certificate Status Protocol (OCSP) | |||
defined in an arc that was selected due to its short encoding. | responses (see Section 7.1.1). The OIDs are defined in an arc that | |||
was selected due to its short encoding. | ||||
1.3. Major Differences from CT 1.0 | 1.3. Major Differences from CT 1.0 | |||
This document revises and obsoletes the CT 1.0 [RFC6962] protocol, | This document revises and obsoletes the CT 1.0 protocol [RFC6962], | |||
drawing on insights gained from CT 1.0 deployments and on feedback | drawing on insights gained from CT 1.0 deployments and on feedback | |||
from the community. The major changes are: | from the community. The major changes are: | |||
* Hash and signature algorithm agility: permitted algorithms are now | * Hash and signature algorithm agility: Permitted algorithms are now | |||
specified in IANA registries. | specified in IANA registries. | |||
* Precertificate format: precertificates are now CMS objects rather | * Precertificate format: Precertificates are now CMS objects rather | |||
than X.509 certificates, which avoids violating the certificate | than X.509 certificates, which avoids violating the certificate | |||
serial number uniqueness requirement in Section 4.1.2.2 of | serial number uniqueness requirement in Section 4.1.2.2 of | |||
[RFC5280]. | [RFC5280]. | |||
* Removed precertificate signing certificates and the precertificate | * Removal of precertificate signing certificates and the | |||
poison extension: the change of precertificate format means that | precertificate poison extension: The change of precertificate | |||
these are no longer needed. | format means that these are no longer needed. | |||
* Logs IDs: each log is now identified by an OID rather than by the | * Logs IDs: Each log is now identified by an OID rather than by the | |||
hash of its public key. OID allocations are managed by an IANA | hash of its public key. OID allocations are available from an | |||
registry. | IANA registry. | |||
* "TransItem" structure: this new data structure is used to | * TransItem structure: This new data structure is used to | |||
encapsulate most types of CT data. A "TransItemList", consisting | encapsulate most types of CT data. A TransItemList, consisting of | |||
of one or more "TransItem" structures, can be used anywhere that | one or more TransItem structures, can be used anywhere that | |||
"SignedCertificateTimestampList" was used in [RFC6962]. | SignedCertificateTimestampList was used in [RFC6962]. | |||
* Merkle tree leaves: the "MerkleTreeLeaf" structure has been | * Merkle Tree leaves: The MerkleTreeLeaf structure has been replaced | |||
replaced by the "TransItem" structure, which eases extensibility | by the TransItem structure, which eases extensibility and | |||
and simplifies the leaf structure by removing one layer of | simplifies the leaf structure by removing one layer of | |||
abstraction. | abstraction. | |||
* Unified leaf format: the structure for both certificate and | * Unified leaf format: The structure for both certificate and | |||
precertificate entries now includes only the TBSCertificate | precertificate entries now includes only the TBSCertificate | |||
(whereas certificate entries in [RFC6962] included the entire | (whereas certificate entries in [RFC6962] included the entire | |||
certificate). | certificate). | |||
* Log Artifact Extensions: these are now typed and managed by an | * Log artifact extensions: These are now typed and managed by an | |||
IANA registry, and they can now appear not only in SCTs but also | IANA registry, and they can now appear not only in Signed | |||
in STHs. | Certificate Timestamps (SCTs) but also in Signed Tree Heads | |||
(STHs). | ||||
* API outputs: complete "TransItem" structures are returned, rather | * API outputs: Complete TransItem structures are returned rather | |||
than the constituent parts of each structure. | than the constituent parts of each structure. | |||
* get-all-by-hash: new client API for obtaining an inclusion proof | * get-all-by-hash: This is a new client API for obtaining an | |||
and the corresponding consistency proof at the same time. | inclusion proof and the corresponding consistency proof at the | |||
same time. | ||||
* submit-entry: new client API, replacing add-chain and add-pre- | * submit-entry: This is a new client API, replacing add-chain and | |||
chain. | add-pre-chain. | |||
* Presenting SCTs with proofs: TLS servers may present SCTs together | * Presenting SCTs with proofs: TLS servers may present SCTs together | |||
with the corresponding inclusion proofs using any of the | with the corresponding inclusion proofs, using any of the | |||
mechanisms that [RFC6962] defined for presenting SCTs only. | mechanisms that [RFC6962] defined for presenting SCTs only. | |||
(Presenting SCTs only is still supported). | (Presenting SCTs only is still supported). | |||
* CT TLS extension: the "signed_certificate_timestamp" TLS extension | * CT TLS extension: The signed_certificate_timestamp TLS extension | |||
has been replaced by the "transparency_info" TLS extension. | has been replaced by the transparency_info TLS extension. | |||
* Verification algorithms: added detailed algorithms for verifying | * Verification algorithms: Detailed algorithms for verifying | |||
inclusion proofs, for verifying consistency between two STHs, and | inclusion proofs, for verifying consistency between two STHs, and | |||
for verifying a root hash given a complete list of the relevant | for verifying a root hash given a complete list of the relevant | |||
leaf input entries. | leaf input entries have been added. | |||
* Extensive clarifications and editorial work. | * Extensive clarifications and editorial work. | |||
2. Cryptographic Components | 2. Cryptographic Components | |||
2.1. Merkle Hash Trees | 2.1. Merkle Trees | |||
A full description of Merkle Hash Tree is beyond the scope of this | 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 | document. Briefly, it is a binary tree where each non-leaf node is a | |||
hash of its children. For CT, the number of children is at most two. | hash of its children. For CT, the number of children is at most two. | |||
Additional information can be found in the Introduction and Reference | Additional information can be found in the Introduction and Reference | |||
section of [RFC8391]. | sections of [RFC8391]. | |||
2.1.1. Definition of the Merkle Tree | 2.1.1. Definition of the Merkle Tree | |||
The log uses a binary Merkle Hash Tree for efficient auditing. The | The log uses a binary Merkle Tree for efficient auditing. The hash | |||
hash algorithm used is one of the log's parameters (see Section 4.1). | algorithm used is one of the log's parameters (see Section 4.1). | |||
This document establishes a registry of acceptable hash algorithms | This document establishes a registry of acceptable hash algorithms | |||
(see Section 10.2.1). Throughout this document, the hash algorithm | (see Section 10.2.1). Throughout this document, the hash algorithm | |||
in use is referred to as HASH and the size of its output in bytes as | in use is referred to as HASH and the size of its output in bytes is | |||
HASH_SIZE. The input to the Merkle Tree Hash is a list of data | referred to as HASH_SIZE. The input to the Merkle Tree Hash is a | |||
entries; these entries will be hashed to form the leaves of the | list of data entries; these entries will be hashed to form the leaves | |||
Merkle Hash Tree. The output is a single HASH_SIZE Merkle Tree Hash. | of the Merkle Tree. The output is a single HASH_SIZE Merkle Tree | |||
Given an ordered list of n inputs, D_n = {d[0], d[1], ..., d[n-1]}, | Hash. Given an ordered list of n inputs, D_n = {d[0], d[1], ..., | |||
the Merkle Tree Hash (MTH) is thus defined as follows: | d[n-1]}, the Merkle Tree Hash (MTH) is thus defined as follows: | |||
The hash of an empty list is the hash of an empty string: | The hash of an empty list is the hash of an empty string: | |||
MTH({}) = HASH(). | MTH({}) = HASH(). | |||
The hash of a list with one entry (also known as a leaf hash) is: | The hash of a list with one entry (also known as a leaf hash) is: | |||
MTH({d[0]}) = HASH(0x00 || d[0]). | MTH({d[0]}) = HASH(0x00 || d[0]). | |||
For n > 1, let k be the largest power of two smaller than n (i.e., k | For n > 1, let k be the largest power of two smaller than n (i.e., k | |||
< n <= 2k). The Merkle Tree Hash of an n-element list D_n is then | < n <= 2k). The Merkle Tree Hash of an n-element list D_n is then | |||
defined recursively as | defined recursively as: | |||
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])), | |||
where: | where: | |||
* || denotes concatenation | * || denotes concatenation | |||
* : denotes concatenation of lists | * : denotes concatenation of lists | |||
* D[k1:k2] = D'_(k2-k1) denotes the list {d'[0] = d[k1], d'[1] = | * 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). | d[k1+1], ..., d'[k2-k1-1] = d[k2-1]} of length (k2 - k1). | |||
Note that the hash calculations for leaves and nodes differ; this | Note that the hash calculations for leaves and nodes differ; this | |||
domain separation is required to give second preimage resistance. | domain separation is required to give second preimage resistance. | |||
Note that we do not require the length of the input list to be a | Note that we do not require the length of the input list to be a | |||
power of two. The resulting Merkle Tree may thus not be balanced; | power of two. The resulting Merkle Tree may thus not be balanced; | |||
however, its shape is uniquely determined by the number of leaves. | however, its shape is uniquely determined by the number of leaves. | |||
(Note: This Merkle Tree is essentially the same as the history tree | (Note: This Merkle Tree is essentially the same as the history tree | |||
[CrosbyWallach] proposal, except our definition handles non-full | proposed by [CrosbyWallach], except our definition handles non-full | |||
trees differently). | trees differently.) | |||
2.1.2. Verifying a Tree Head Given Entries | 2.1.2. Verifying a Tree Head Given Entries | |||
When a client has a complete list of "entries" from "0" up to | When a client has a complete list of entries from 0 up to tree_size - | |||
"tree_size - 1" and wishes to verify this list against a tree head | 1 and wishes to verify this list against a tree head root_hash | |||
"root_hash" returned by the log for the same "tree_size", the | returned by the log for the same tree_size, the following algorithm | |||
following algorithm may be used: | may be used: | |||
1. Set "stack" to an empty stack. | 1. Set stack to an empty stack. | |||
2. For each "i" from "0" up to "tree_size - 1": | 2. For each i from 0 up to tree_size - 1: | |||
1. Push "HASH(0x00 || entries[i])" to "stack". | a. Push HASH(0x00 || entries[i]) to stack. | |||
2. Set "merge_count" to the lowest value ("0" included) such | b. Set merge_count to the lowest value (0 included) such that | |||
that "LSB(i >> merge_count)" is not set, where "LSB" means | LSB(i >> merge_count) is not set, where LSB means the least | |||
the least significant bit. In other words, set "merge_count" | significant bit. In other words, set merge_count to the | |||
to the number of consecutive "1"s found starting at the least | number of consecutive 1s found starting at the least | |||
significant bit of "i". | significant bit of i. | |||
3. Repeat "merge_count" times: | c. Repeat merge_count times: | |||
1. Pop "right" from "stack". | i. Pop right from stack. | |||
2. Pop "left" from "stack". | ii. Pop left from stack. | |||
3. Push "HASH(0x01 || left || right)" to "stack". | iii. Push HASH(0x01 || left || right) to stack. | |||
3. If there is more than one element in the "stack", repeat the same | 3. If there is more than one element in the stack, repeat the same | |||
merge procedure (the sub-items of Step 2.3 above) until only a | merge procedure (the sub-items of Step 2(c) above) until only a | |||
single element remains. | single element remains. | |||
4. The remaining element in "stack" is the Merkle Tree hash for the | 4. The remaining element in stack is the Merkle Tree Hash for the | |||
given "tree_size" and should be compared by equality against the | given tree_size and should be compared by equality against the | |||
supplied "root_hash". | supplied root_hash. | |||
2.1.3. Merkle Inclusion Proofs | 2.1.3. Merkle Inclusion Proofs | |||
A Merkle inclusion proof for a leaf in a Merkle Hash Tree is the | A Merkle inclusion proof for a leaf in a Merkle Tree is the shortest | |||
shortest list of additional nodes in the Merkle Tree required to | list of additional nodes in the Merkle Tree required to compute the | |||
compute the Merkle Tree Hash for that tree. Each node in the tree is | Merkle Tree Hash for that tree. Each node in the tree is either a | |||
either a leaf node or is computed from the two nodes immediately | leaf node or is computed from the two nodes immediately below it | |||
below it (i.e., towards the leaves). At each step up the tree | (i.e., towards the leaves). At each step up the tree (towards the | |||
(towards the root), a node from the inclusion proof is combined with | root), a node from the inclusion proof is combined with the node | |||
the node computed so far. In other words, the inclusion proof | computed so far. In other words, the inclusion proof consists of the | |||
consists of the list of missing nodes required to compute the nodes | list of missing nodes required to compute the nodes leading from a | |||
leading from a leaf to the root of the tree. If the root computed | leaf to the root of the tree. If the root computed from the | |||
from the inclusion proof matches the true root, then the inclusion | inclusion proof matches the true root, then the inclusion proof | |||
proof proves that the leaf exists in the tree. | proves that the leaf exists in the tree. | |||
2.1.3.1. Generating an Inclusion Proof | 2.1.3.1. Generating an Inclusion Proof | |||
Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], | 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 | ..., 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: | input d[m], 0 <= m < n, is defined as follows: | |||
The proof for the single leaf in a tree with a one-element input list | The proof for the single leaf in a tree with a one-element input list | |||
D[1] = {d[0]} is empty: | D[1] = {d[0]} is empty: | |||
skipping to change at page 10, line 4 ¶ | skipping to change at line 419 ¶ | |||
2.1.3.1. Generating an Inclusion Proof | 2.1.3.1. Generating an Inclusion Proof | |||
Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], | 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 | ..., 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: | input d[m], 0 <= m < n, is defined as follows: | |||
The proof for the single leaf in a tree with a one-element input list | The proof for the single leaf in a tree with a one-element input list | |||
D[1] = {d[0]} is empty: | D[1] = {d[0]} is empty: | |||
PATH(0, {d[0]}) = {} | PATH(0, {d[0]}) = {} | |||
For n > 1, let k be the largest power of two smaller than n. The | For n > 1, let k be the largest power of two smaller than n. The | |||
proof for the (m+1)th element d[m] in a list of n > m elements is | proof for the (m+1)th element d[m] in a list of n > m elements is | |||
then defined recursively as | then defined recursively as: | |||
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, | |||
The : operator and D[k1:k2] are defined the same as in Section 2.1.1. | The : operator and D[k1:k2] are defined the same as in Section 2.1.1. | |||
2.1.3.2. Verifying an Inclusion Proof | 2.1.3.2. Verifying an Inclusion Proof | |||
When a client has received an inclusion proof (e.g., in a "TransItem" | When a client has received an inclusion proof (e.g., in a TransItem | |||
of type "inclusion_proof_v2") and wishes to verify inclusion of an | of type inclusion_proof_v2) and wishes to verify inclusion of an | |||
input "hash" for a given "tree_size" and "root_hash", the following | input hash for a given tree_size and root_hash, the following | |||
algorithm may be used to prove the "hash" was included in the | algorithm may be used to prove the hash was included in the | |||
"root_hash": | root_hash: | |||
1. Compare "leaf_index" from the "inclusion_proof_v2" structure | 1. Compare leaf_index from the inclusion_proof_v2 structure against | |||
against "tree_size". If "leaf_index" is greater than or equal to | tree_size. If leaf_index is greater than or equal to tree_size, | |||
"tree_size" then fail the proof verification. | then fail the proof verification. | |||
2. Set "fn" to "leaf_index" and "sn" to "tree_size - 1". | 2. Set fn to leaf_index and sn to tree_size - 1. | |||
3. Set "r" to "hash". | 3. Set r to hash. | |||
4. For each value "p" in the "inclusion_path" array: | 4. For each value p in the inclusion_path array: | |||
If "sn" is 0, stop the iteration and fail the proof verification. | a. If sn is 0, then stop the iteration and fail the proof | |||
verification. | ||||
If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | b. If LSB(fn) is set, or if fn is equal to sn, then: | |||
1. Set "r" to "HASH(0x01 || p || r)" | i. Set r to HASH(0x01 || p || r). | |||
2. If "LSB(fn)" is not set, then right-shift both "fn" and "sn" | ii. If LSB(fn) is not set, then right-shift both fn and sn | |||
equally until either "LSB(fn)" is set or "fn" is "0". | equally until either LSB(fn) is set or fn is 0. | |||
Otherwise: | Otherwise: | |||
1. Set "r" to "HASH(0x01 || r || p)" | i. Set r to HASH(0x01 || r || p). | |||
Finally, right-shift both "fn" and "sn" one time. | c. Finally, right-shift both fn and sn one time. | |||
5. Compare "sn" to 0. Compare "r" against the "root_hash". If "sn" | 5. Compare sn to 0. Compare r against the root_hash. If sn is | |||
is equal to 0, and "r" and the "root_hash" are equal, then the | equal to 0 and r and the root_hash are equal, then the log has | |||
log has proven the inclusion of "hash". Otherwise, fail the | proven the inclusion of hash. Otherwise, fail the proof | |||
proof verification. | verification. | |||
2.1.4. Merkle Consistency Proofs | 2.1.4. Merkle Consistency Proofs | |||
Merkle consistency proofs prove the append-only property of the tree. | Merkle consistency proofs prove the append-only property of the tree. | |||
A Merkle consistency proof for a Merkle Tree Hash MTH(D_n) and a | A Merkle 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, | previously advertised 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 | is the list of nodes in the Merkle Tree required to verify that the | |||
first m inputs D[0:m] are equal in both trees. Thus, a consistency | first m inputs D[0:m] are equal in both trees. Thus, a consistency | |||
proof must contain a set of intermediate nodes (i.e., commitments to | proof must contain a set of intermediate nodes (i.e., commitments to | |||
inputs) sufficient to verify MTH(D_n), such that (a subset of) the | inputs) sufficient to verify MTH(D_n), such that (a subset of) the | |||
skipping to change at page 11, line 26 ¶ | skipping to change at line 490 ¶ | |||
2.1.4.1. Generating a Consistency Proof | 2.1.4.1. Generating a Consistency Proof | |||
Given an ordered list of n inputs to the tree, D_n = {d[0], d[1], | 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 | ..., 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: | previous Merkle Tree Hash MTH(D[0:m]), 0 < m < n, is defined as: | |||
PROOF(m, D_n) = SUBPROOF(m, D_n, true) | PROOF(m, D_n) = SUBPROOF(m, D_n, true) | |||
In SUBPROOF, the boolean value represents whether the subtree created | In SUBPROOF, the boolean value represents whether the subtree created | |||
from D[0:m] is a complete subtree of the Merkle Tree created from | from D[0:m] is a complete subtree of the Merkle Tree created from D_n | |||
D_n, and, consequently, whether the subtree Merkle Tree Hash | and, consequently, whether the subtree Merkle Tree Hash MTH(D[0:m]) | |||
MTH(D[0:m]) is known. The initial call to SUBPROOF sets this to be | is known. The initial call to SUBPROOF sets this to be true, and | |||
true, and SUBPROOF is then defined as follows: | SUBPROOF is then defined as follows: | |||
The subproof for m = n is empty if m is the value for which PROOF was | The subproof for m = n is empty if m is the value for which PROOF was | |||
originally requested (meaning that the subtree created from D[0:m] is | originally requested (meaning that the subtree created from D[0:m] is | |||
a complete subtree of the Merkle Tree created from the original D_n | a complete subtree of the Merkle Tree created from the original D_n | |||
for which PROOF was requested, and the subtree Merkle Tree Hash | for which PROOF was requested and the subtree Merkle Tree Hash | |||
MTH(D[0:m]) is known): | MTH(D[0:m]) is known): | |||
SUBPROOF(m, D_m, true) = {} | SUBPROOF(m, D_m, true) = {} | |||
Otherwise, the subproof for m = n is the Merkle Tree Hash committing | Otherwise, the subproof for m = n is the Merkle Tree Hash committing | |||
inputs D[0:m]: | inputs D[0:m]: | |||
SUBPROOF(m, D_m, false) = {MTH(D_m)} | SUBPROOF(m, D_m, false) = {MTH(D_m)} | |||
For m < n, let k be the largest power of two smaller than n. The | For m < n, let k be the largest power of two smaller than n. The | |||
skipping to change at page 12, line 4 ¶ | skipping to change at line 517 ¶ | |||
For m < n, let k be the largest power of two smaller than n. The | For m < n, let k be the largest power of two smaller than n. The | |||
subproof is then defined recursively, using the appropriate step | subproof is then defined recursively, using the appropriate step | |||
below: | below: | |||
If m <= k, the right subtree entries D[k:n] only exist in the current | 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 | tree. We prove that the left subtree entries D[0:k] are consistent | |||
and add a commitment to D[k:n]: | and add a commitment to D[k:n]: | |||
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]) | |||
If m > k, the left subtree entries D[0:k] are identical in both | If m > k, the left subtree entries D[0:k] are identical in both | |||
trees. We prove that the right subtree entries D[k:n] are consistent | trees. We prove that the right subtree entries D[k:n] are consistent | |||
and add a commitment to D[0:k]. | and add a commitment to D[0:k]: | |||
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]) | |||
The number of nodes in the resulting proof is bounded above by | The number of nodes in the resulting proof is bounded above by | |||
ceil(log2(n)) + 1. | ceil(log2(n)) + 1. | |||
The : operator and D[k1:k2] are defined the same as in Section 2.1.1. | The : operator and D[k1:k2] are defined the same as in Section 2.1.1. | |||
2.1.4.2. Verifying Consistency between Two Tree Heads | 2.1.4.2. Verifying Consistency between Two Tree Heads | |||
When a client has a tree head "first_hash" for tree size "first", a | When a client has a tree head first_hash for tree size first, has a | |||
tree head "second_hash" for tree size "second" where "0 < first < | tree head second_hash for tree size second where 0 < first < second, | |||
second", and has received a consistency proof between the two (e.g., | and has received a consistency proof between the two (e.g., in a | |||
in a "TransItem" of type "consistency_proof_v2"), the following | TransItem of type consistency_proof_v2), the following algorithm may | |||
algorithm may be used to verify the consistency proof: | be used to verify the consistency proof: | |||
1. If "consistency_path" is an empty array, stop and fail the proof | 1. If consistency_path is an empty array, stop and fail the proof | |||
verification. | verification. | |||
2. If "first" is an exact power of 2, then prepend "first_hash" to | 2. If first is an exact power of 2, then prepend first_hash to the | |||
the "consistency_path" array. | consistency_path array. | |||
3. Set "fn" to "first - 1" and "sn" to "second - 1". | 3. Set fn to first - 1 and sn to second - 1. | |||
4. If "LSB(fn)" is set, then right-shift both "fn" and "sn" equally | 4. If LSB(fn) is set, then right-shift both fn and sn equally until | |||
until "LSB(fn)" is not set. | LSB(fn) is not set. | |||
5. Set both "fr" and "sr" to the first value in the | 5. Set both fr and sr to the first value in the consistency_path | |||
"consistency_path" array. | array. | |||
6. For each subsequent value "c" in the "consistency_path" array: | 6. For each subsequent value c in the consistency_path array: | |||
If "sn" is 0, stop the iteration and fail the proof verification. | a. If sn is 0, then stop the iteration and fail the proof | |||
verification. | ||||
If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | b. If LSB(fn) is set, or if fn is equal to sn, then: | |||
1. Set "fr" to "HASH(0x01 || c || fr)" | i. Set fr to HASH(0x01 || c || fr). | |||
Set "sr" to "HASH(0x01 || c || sr)" | ii. Set sr to HASH(0x01 || c || sr). | |||
2. If "LSB(fn)" is not set, then right-shift both "fn" and "sn" | iii. If LSB(fn) is not set, then right-shift both fn and sn | |||
equally until either "LSB(fn)" is set or "fn" is "0". | equally until either LSB(fn) is set or fn is 0. | |||
Otherwise: | Otherwise: | |||
1. Set "sr" to "HASH(0x01 || sr || c)" | i. Set sr to HASH(0x01 || sr || c). | |||
Finally, right-shift both "fn" and "sn" one time. | c. Finally, right-shift both fn and sn one time. | |||
7. After completing iterating through the "consistency_path" array | 7. After completing iterating through the consistency_path array as | |||
as described above, verify that the "fr" calculated is equal to | described above, verify that the fr calculated is equal to the | |||
the "first_hash" supplied, that the "sr" calculated is equal to | first_hash supplied, that the sr calculated is equal to the | |||
the "second_hash" supplied and that "sn" is 0. | second_hash supplied, and that sn is 0. | |||
2.1.5. Example | 2.1.5. Example | |||
The binary Merkle Tree with 7 leaves: | The following is a binary Merkle Tree with 7 leaves: | |||
hash | hash | |||
/ \ | / \ | |||
/ \ | / \ | |||
/ \ | / \ | |||
/ \ | / \ | |||
/ \ | / \ | |||
k l | k l | |||
/ \ / \ | / \ / \ | |||
/ \ / \ | / \ / \ | |||
skipping to change at page 14, line 32 ¶ | skipping to change at line 633 ¶ | |||
/ \ / \ / \ / \ | / \ / \ / \ / \ | |||
/ \ 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 | |||
The consistency proof between hash0 and hash is PROOF(3, D[7]) = [c, | The consistency proof between hash0 and hash is PROOF(3, D[7]) = [c, | |||
d, g, l]. c, g are used to verify hash0, and d, l are additionally | d, g, l]. Non-leaf nodes c, g are used to verify hash0, and non-leaf | |||
used to show hash is consistent with hash0. | nodes d, l are additionally used to show hash is consistent with | |||
hash0. | ||||
The consistency proof between hash1 and hash is PROOF(4, D[7]) = [l]. | The consistency proof between hash1 and hash is PROOF(4, D[7]) = [l]. | |||
hash can be verified using hash1=k and l. | hash can be verified using hash1=k and l. | |||
The consistency proof between hash2 and hash is PROOF(6, D[7]) = [i, | The consistency proof between hash2 and hash is PROOF(6, D[7]) = [i, | |||
j, k]. k, i are used to verify hash2, and j is additionally used to | j, k]. Non-leaf nodes k, i are used to verify hash2, and non-leaf | |||
show hash is consistent with hash2. | node j is additionally used to show hash is consistent with hash2. | |||
2.2. Signatures | 2.2. Signatures | |||
When signing data structures, a log MUST use one of the signature | When signing data structures, a log MUST use one of the signature | |||
algorithms from the IANA CT Signature Algorithms registry, described | algorithms from the IANA "Signature Algorithms" registry, described | |||
in Section 10.2.2. | in Section 10.2.2. | |||
3. Submitters | 3. Submitters | |||
Submitters submit certificates or preannouncements of certificates | Submitters submit certificates or preannouncements of certificates | |||
prior to issuance (precertificates) to logs for public auditing, as | prior to issuance (precertificates) to logs for public auditing, as | |||
described below. In order to enable attribution of each logged | described below. In order to enable attribution of each logged | |||
certificate or precertificate to its issuer, each submission MUST be | certificate or precertificate to its issuer, each submission MUST be | |||
accompanied by all additional certificates required to verify the | accompanied by all additional certificates required to verify the | |||
chain up to an accepted trust anchor (Section 5.7). The trust anchor | chain up to an accepted trust anchor (Section 5.7). The trust anchor | |||
(a root or intermediate CA certificate) MAY be omitted from the | (a root or intermediate CA certificate) MAY be omitted from the | |||
submission. | submission. | |||
If a log accepts a submission, it will return a Signed Certificate | If a log accepts a submission, it will return a Signed Certificate | |||
Timestamp (SCT) (see Section 4.8). The submitter SHOULD validate the | Timestamp (SCT) (see Section 4.8). The submitter SHOULD validate the | |||
returned SCT as described in Section 8.1 if they understand its | returned SCT, as described in Section 8.1, if they understand its | |||
format and they intend to use it directly in a TLS handshake or to | format and they intend to use it directly in a TLS handshake or to | |||
construct a certificate. If the submitter does not need the SCT (for | construct a certificate. If the submitter does not need the SCT (for | |||
example, the certificate is being submitted simply to make it | example, the certificate is being submitted simply to make it | |||
available in the log), it MAY validate the SCT. | available in the log), it MAY validate the SCT. | |||
3.1. Certificates | 3.1. Certificates | |||
Any entity can submit a certificate (Section 5.1) to a log. Since it | Any entity can submit a certificate (Section 5.1) to a log. Since it | |||
is anticipated that TLS clients will reject certificates that are not | is anticipated that TLS clients will reject certificates that are not | |||
logged, it is expected that certificate issuers and subjects will be | logged, it is expected that certificate issuers and subjects will be | |||
strongly motivated to submit them. | strongly motivated to submit them. | |||
3.2. Precertificates | 3.2. Precertificates | |||
CAs may preannounce a certificate prior to issuance by submitting a | CAs may preannounce a certificate prior to issuance by submitting a | |||
precertificate (Section 5.1) that the log can use to create an entry | precertificate (Section 5.1) that the log can use to create an entry | |||
that will be valid against the issued certificate. The CA MAY | that will be valid against the issued certificate. The CA MAY | |||
incorporate the returned SCT in the issued certificate. One example | incorporate the returned SCT in the issued certificate. One example | |||
of where the returned SCT is not incorporated in the issued | of where the returned SCT is not incorporated in the issued | |||
certificate is when a CA sends the precertificate to multiple logs, | certificate is when a CA sends the precertificate to multiple logs | |||
but only incorporates the SCTs that are returned first. | but only incorporates the SCTs that are returned first. | |||
A precertificate is a CMS [RFC5652] "signed-data" object that | A precertificate is a CMS [RFC5652] signed-data object that conforms | |||
conforms to the following profile: | to the following profile: | |||
* It MUST be DER encoded as described in [X690]. | * It MUST be DER encoded, as described in [X690]. | |||
* "SignedData.version" MUST be v3(3). | * SignedData.version MUST be v3(3). | |||
* "SignedData.digestAlgorithms" MUST be the same as the | * SignedData.digestAlgorithms MUST be the same as the | |||
"SignerInfo.digestAlgorithm" OID value (see below). | SignerInfo.digestAlgorithm OID value (see below). | |||
* "SignedData.encapContentInfo": | * SignedData.encapContentInfo: | |||
- "eContentType" MUST be the OID 1.3.101.78. | - eContentType MUST be the OID 1.3.101.78. | |||
- "eContent" MUST contain a TBSCertificate [RFC5280] that will be | - eContent MUST contain a TBSCertificate [RFC5280] that will be | |||
identical to the TBSCertificate in the issued certificate, | identical to the TBSCertificate in the issued certificate, | |||
except that the Transparency Information (Section 7.1) | except that the Transparency Information (Section 7.1) | |||
extension MUST be omitted. | extension MUST be omitted. | |||
* "SignedData.certificates" MUST be omitted. | * SignedData.certificates MUST be omitted. | |||
* "SignedData.crls" MUST be omitted. | * SignedData.crls MUST be omitted. | |||
* "SignedData.signerInfos" MUST contain one "SignerInfo": | * SignedData.signerInfos MUST contain one SignerInfo: | |||
- "version" MUST be v3(3). | - version MUST be v3(3). | |||
- "sid" MUST use the "subjectKeyIdentifier" option. | - sid MUST use the subjectKeyIdentifier option. | |||
- "digestAlgorithm" MUST be one of the hash algorithm OIDs listed | - digestAlgorithm MUST be one of the hash algorithm OIDs listed | |||
in the IANA CT Hash Algorithms Registry, described in | in the IANA "Hash Algorithms" registry, described in | |||
Section 10.2.1. | Section 10.2.1. | |||
- "signedAttrs" MUST be present and MUST contain two attributes: | - signedAttrs MUST be present and MUST contain two attributes: | |||
o A content-type attribute whose value is the same as | o a content-type attribute whose value is the same as | |||
"SignedData.encapContentInfo.eContentType". | SignedData.encapContentInfo.eContentType and | |||
o A message-digest attribute whose value is the message digest | o a message-digest attribute whose value is the message digest | |||
of "SignedData.encapContentInfo.eContent". | of SignedData.encapContentInfo.eContent. | |||
- "signatureAlgorithm" MUST be the same OID as | - signatureAlgorithm MUST be the same OID as | |||
"TBSCertificate.signature". | TBSCertificate.signature. | |||
- "signature" MUST be from the same (root or intermediate) CA | - signature MUST be from the same (root or intermediate) CA that | |||
that intends to issue the corresponding certificate (see | intends to issue the corresponding certificate (see | |||
Section 3.2.1). | Section 3.2.1). | |||
- "unsignedAttrs" MUST be omitted. | - unsignedAttrs MUST be omitted. | |||
"SignerInfo.signedAttrs" is included in the message digest | SignerInfo.signedAttrs is included in the message digest calculation | |||
calculation process (see Section 5.4 of [RFC5652]), which ensures | process (see Section 5.4 of [RFC5652]), which ensures that the | |||
that the "SignerInfo.signature" value will not be a valid X.509v3 | SignerInfo.signature value will not be a valid X.509v3 signature that | |||
signature that could be used in conjunction with the TBSCertificate | could be used in conjunction with the TBSCertificate (from | |||
(from "SignedData.encapContentInfo.eContent") to construct a valid | SignedData.encapContentInfo.eContent) to construct a valid | |||
certificate. | certificate. | |||
3.2.1. Binding Intent to Issue | 3.2.1. Binding Intent to Issue | |||
Under normal circumstances, there will be a short delay between | Under normal circumstances, there will be a short delay between | |||
precertificate submission and issuance of the corresponding | precertificate submission and issuance of the corresponding | |||
certificate. Longer delays are to be expected occasionally (e.g., | certificate. Longer delays are to be expected occasionally (e.g., | |||
due to log server downtime), and in some cases the CA might not | due to log server downtime); in some cases, the CA might not actually | |||
actually issue the corresponding certificate. Nevertheless, a | issue the corresponding certificate. Nevertheless, a | |||
precertificate's "signature" indicates the CA's binding intent to | precertificate's signature indicates the CA's binding intent to issue | |||
issue the corresponding certificate, which means that: | the corresponding certificate, which means that: | |||
* Misissuance of a precertificate is considered equivalent to | * Misissuance of a precertificate is considered equivalent to | |||
misissuance of the corresponding certificate. The CA should | misissuance of the corresponding certificate. The CA should | |||
expect to be held to account, even if the corresponding | expect to be held accountable, even if the corresponding | |||
certificate has not actually been issued. | certificate has not actually been issued. | |||
* Upon observing a precertificate, a client can reasonably presume | * Upon observing a precertificate, a client can reasonably presume | |||
that the corresponding certificate has been issued. A client may | that the corresponding certificate has been issued. A client may | |||
wish to obtain status information (e.g., by using the Online | wish to obtain status information (e.g., by using the Online | |||
Certificate Status Protocol [RFC6960] or by checking a Certificate | Certificate Status Protocol [RFC6960] or by checking a Certificate | |||
Revocation List [RFC5280]) about a certificate that is presumed to | Revocation List [RFC5280]) about a certificate that is presumed to | |||
exist, especially if there is evidence or suspicion that the | exist, especially if there is evidence or suspicion that the | |||
corresponding precertificate was misissued. | corresponding precertificate was misissued. | |||
* TLS clients may have policies that require CAs to be able to | * TLS clients may have policies that require CAs to be able to | |||
revoke, and to provide certificate status services for, each | revoke and to provide certificate status services for each | |||
certificate that is presumed to exist based on the existence of a | certificate that is presumed to exist based on the existence of a | |||
corresponding precertificate. | corresponding precertificate. | |||
4. Log Format and Operation | 4. Log Format and Operation | |||
A log is a single, append-only Merkle Tree of submitted certificate | A log is a single, append-only Merkle Tree of submitted certificate | |||
and precertificate entries. | and precertificate entries. | |||
When it receives and accepts a valid submission, the log MUST return | When it receives and accepts a valid submission, the log MUST return | |||
an SCT that corresponds to the submitted certificate or | an SCT that corresponds to the submitted certificate or | |||
precertificate. If the log has previously seen this valid | precertificate. If the log has previously seen this valid | |||
submission, it SHOULD return the same SCT as it returned before, as | submission, it SHOULD return the same SCT as it returned before, as | |||
discussed in Section 11.3. If different SCTs are produced for the | discussed in Section 11.3. If different SCTs are produced for the | |||
same submission, multiple log entries will have to be created, one | same submission, multiple log entries will have to be created, one | |||
for each SCT (as the timestamp is a part of the leaf structure). | for each SCT (as the timestamp is a part of the leaf structure). | |||
Note that if a certificate was previously logged as a precertificate, | Note that if a certificate was previously logged as a precertificate, | |||
then the precertificate's SCT of type "precert_sct_v2" would not be | then the precertificate's SCT of type precert_sct_v2 would not be | |||
appropriate; instead, a fresh SCT of type "x509_sct_v2" should be | appropriate; instead, a fresh SCT of type x509_sct_v2 should be | |||
generated. | generated. | |||
An SCT is the log's promise to append to its Merkle Tree an entry for | 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 MUST fulfil | the accepted submission. Upon producing an SCT, the log MUST fulfill | |||
this promise by performing the following actions within a fixed | this promise by performing the following actions within a fixed | |||
amount of time known as the Maximum Merge Delay (MMD), which is one | amount of time known as the Maximum Merge Delay (MMD), which is one | |||
of the log's parameters (see Section 4.1): | of the log's parameters (see Section 4.1): | |||
* Allocate a tree index to the entry representing the accepted | * Allocate a tree index to the entry representing the accepted | |||
submission. | submission. | |||
* Calculate the root of the tree. | * Calculate the root of the tree. | |||
* Sign the root of the tree (see Section 4.10). | * Sign the root of the tree (see Section 4.10). | |||
skipping to change at page 18, line 28 ¶ | skipping to change at line 811 ¶ | |||
The log may append multiple entries before signing the root of the | The log may append multiple entries before signing the root of the | |||
tree. | tree. | |||
Log operators SHOULD NOT impose any conditions on retrieving or | Log operators SHOULD NOT impose any conditions on retrieving or | |||
sharing data from the log. | sharing data from the log. | |||
4.1. Log Parameters | 4.1. Log Parameters | |||
A log is defined by a collection of immutable parameters, which are | A log is defined by a collection of immutable parameters, which are | |||
used by clients to communicate with the log and to verify log | used by clients to communicate with the log and to verify log | |||
artifacts. Except for the Final Signed Tree Head (STH), each of | artifacts. Except for the Final STH, each of these parameters MUST | |||
these parameters MUST be established before the log operator begins | be established before the log operator begins to operate the log. | |||
to operate the log. | ||||
Base URL: The prefix used to construct URLs ([RFC3986]) for client | Base URL: The prefix used to construct URLs [RFC3986] for client | |||
messages (see Section 5). The base URL MUST be an "https" URL, | messages (see Section 5). The base URL MUST be an "https" URL, | |||
MAY contain a port, MAY contain a path with any number of path | MAY contain a port, and MAY contain a path with any number of path | |||
segments, but MUST NOT contain a query string, fragment, or | segments but MUST NOT contain a query string, fragment, or | |||
trailing "/". Example: https://ct.example.org/blue | trailing "/". Example: https://ct.example.org/blue. | |||
Hash Algorithm: The hash algorithm used for the Merkle Tree (see | Hash Algorithm: The hash algorithm used for the Merkle Tree (see | |||
Section 10.2.1). | Section 10.2.1). | |||
Signature Algorithm: The signature algorithm used (see Section 2.2). | Signature Algorithm: The signature algorithm used (see Section 2.2). | |||
Public Key: The public key used to verify signatures generated by | Public Key: The public key used to verify signatures generated by | |||
the log. A log MUST NOT use the same keypair as any other log. | the log. A log MUST NOT use the same keypair as any other log. | |||
Log ID: The OID that uniquely identifies the log. | Log ID: The OID that uniquely identifies the log. | |||
Maximum Merge Delay: The MMD the log has committed to. This | Maximum Merge Delay: The MMD the log has committed to. This | |||
document deliberately does not specify any limits on the value, to | document deliberately does not specify any limits on the value to | |||
allow for experimentation. | allow for experimentation. | |||
Version: The version of the protocol supported by the log (currently | Version: The version of the protocol supported by the log (currently | |||
1 or 2). | 1 or 2). | |||
Maximum Chain Length: The longest certificate chain submission the | Maximum Chain Length: The longest certificate chain submission the | |||
log is willing to accept, if the log imposes any limit. | log is willing to accept, if the log imposes any limit. | |||
STH Frequency Count: The maximum number of STHs the log may produce | STH Frequency Count: The maximum number of STHs the log may produce | |||
in any period equal to the "Maximum Merge Delay" (see | in any period equal to the Maximum Merge Delay (see Section 4.10). | |||
Section 4.10). | ||||
Final STH: If a log has been closed down (i.e., no longer accepts | Final STH: If a log has been closed down (i.e., no longer accepts | |||
new entries), existing entries may still be valid. In this case, | new entries), existing entries may still be valid. In this case, | |||
the client should know the final valid STH in the log to ensure no | the client should know the final valid STH in the log to ensure no | |||
new entries can be added without detection. This value MUST be | new entries can be added without detection. This value MUST be | |||
provided in the form of a TransItem of type "signed_tree_head_v2". | provided in the form of a TransItem of type signed_tree_head_v2. | |||
If a log is still accepting entries, this value should not be | If a log is still accepting entries, this value should not be | |||
provided. | provided. | |||
[JSON.Metadata] is an example of a metadata format which includes the | [JSON.Metadata] is an example of a metadata format that includes the | |||
above elements. | above elements. | |||
4.2. Evaluating Submissions | 4.2. Evaluating Submissions | |||
A log determines whether to accept or reject a submission by | A log determines whether to accept or reject a submission by | |||
evaluating it against the minimum acceptance criteria (see | evaluating it against the minimum acceptance criteria (see | |||
Section 4.2.1) and against the log's discretionary acceptance | Section 4.2.1) and against the log's discretionary acceptance | |||
criteria (see Section 4.2.2). | criteria (see Section 4.2.2). | |||
If the acceptance criteria are met, the log SHOULD accept the | If the acceptance criteria are met, the log SHOULD accept the | |||
submission. (A log may decide, for example, to temporarily reject | submission. (A log may decide, for example, to temporarily reject | |||
acceptable submissions to protect itself against denial-of-service | acceptable submissions to protect itself against denial-of-service | |||
attacks). | attacks.) | |||
The log SHALL allow retrieval of its list of accepted trust anchors | The log SHALL allow retrieval of its list of accepted trust anchors | |||
(see Section 5.7), each of which is a root or intermediate CA | (see Section 5.7), each of which is a root or intermediate CA | |||
certificate. This list might usefully be the union of root | certificate. This list might usefully be the union of root | |||
certificates trusted by major browser vendors. | certificates trusted by major browser vendors. | |||
4.2.1. Minimum Acceptance Criteria | 4.2.1. Minimum Acceptance Criteria | |||
To ensure that logged certificates and precertificates are | To ensure that logged certificates and precertificates are | |||
attributable to an accepted trust anchor, to set clear expectations | attributable to an accepted trust anchor, to set clear expectations | |||
for what monitors would find in the log, and to avoid being | for what monitors would find in the log, and to avoid being | |||
overloaded by invalid submissions, the log MUST reject a submission | overloaded by invalid submissions, the log MUST reject a submission | |||
if any of the following conditions are not met: | if any of the following conditions are not met: | |||
* The "submission", "type" and "chain" inputs MUST be set as | * The submission, type, and chain inputs MUST be set as described in | |||
described in Section 5.1. The log MUST NOT accommodate misordered | Section 5.1. The log MUST NOT accommodate misordered CA | |||
CA certificates or use any other source of intermediate CA | certificates or use any other source of intermediate CA | |||
certificates to attempt certification path construction. | certificates to attempt certification path construction. | |||
* Each of the zero or more intermediate CA certificates in the chain | * Each of the zero or more intermediate CA certificates in the chain | |||
MUST have one or both of the following features: | MUST have one or both of the following features: | |||
- The Basic Constraints extension with the cA boolean asserted. | - The Basic Constraints extension with the cA boolean asserted. | |||
- The Key Usage extension with the keyCertSign bit asserted. | - The Key Usage extension with the keyCertSign bit asserted. | |||
* Each certificate in the chain MUST fall within the limits imposed | * Each certificate in the chain MUST fall within the limits imposed | |||
skipping to change at page 20, line 30 ¶ | skipping to change at line 904 ¶ | |||
* Precertificate submissions MUST conform to all of the requirements | * Precertificate submissions MUST conform to all of the requirements | |||
in Section 3.2. | in Section 3.2. | |||
4.2.2. Discretionary Acceptance Criteria | 4.2.2. Discretionary Acceptance Criteria | |||
If the minimum acceptance criteria are met but the submission is not | If the minimum acceptance criteria are met but the submission is not | |||
fully valid according to [RFC5280] verification rules (e.g., the | fully valid according to [RFC5280] verification rules (e.g., the | |||
certificate or precertificate has expired, is not yet valid, has been | certificate or precertificate has expired, is not yet valid, has been | |||
revoked, exhibits ASN.1 DER encoding errors but the log can still | revoked, exhibits ASN.1 DER encoding errors but the log can still | |||
parse it, etc), then the acceptability of the submission is left to | parse it, etc.), then the acceptability of the submission is left to | |||
the log's discretion. It is useful for logs to accept such | the log's discretion. It is useful for logs to accept such | |||
submissions in order to accommodate quirks of CA certificate-issuing | submissions in order to accommodate quirks of CA certificate-issuing | |||
software and to facilitate monitoring of CA compliance with | software and to facilitate monitoring of CA compliance with | |||
applicable policies and technical standards. However, it is | applicable policies and technical standards. However, it is | |||
impractical for this document to enumerate, and for logs to consider, | impractical for this document to enumerate, and for logs to consider, | |||
all of the ways that a submission might fail to comply with | all of the ways that a submission might fail to comply with | |||
[RFC5280]. | [RFC5280]. | |||
Logs SHOULD limit the length of chain they will accept. The maximum | Logs SHOULD limit the length of chain they will accept. The maximum | |||
chain length is one of the log's parameters (see Section 4.1). | chain length is one of the log's parameters (see Section 4.1). | |||
4.3. Log Entries | 4.3. Log Entries | |||
If a submission is accepted and an SCT issued, the accepting log MUST | If a submission is accepted and an SCT is issued, the accepting log | |||
store the entire chain used for verification. This chain MUST | MUST store the entire chain used for verification. This chain MUST | |||
include the certificate or precertificate itself, the zero or more | include the certificate or precertificate itself, the zero or more | |||
intermediate CA certificates provided by the submitter, and the trust | intermediate CA certificates provided by the submitter, and the trust | |||
anchor used to verify the chain (even if it was omitted from the | anchor used to verify the chain (even if it was omitted from the | |||
submission). The log MUST provide this chain for auditing upon | submission). The log MUST provide this chain for auditing upon | |||
request (see Section 5.6) so that the CA cannot avoid blame by | request (see Section 5.6) so that the CA cannot avoid blame by | |||
logging a partial or empty chain. Each log entry is a "TransItem" | logging a partial or empty chain. Each log entry is a TransItem | |||
structure of type "x509_entry_v2" or "precert_entry_v2". However, a | structure of type x509_entry_v2 or precert_entry_v2. However, a log | |||
log may store its entries in any format. If a log does not store | may store its entries in any format. If a log does not store this | |||
this "TransItem" in full, it must store the "timestamp" and | TransItem in full, it must store the timestamp and sct_extensions of | |||
"sct_extensions" of the corresponding | the corresponding TimestampedCertificateEntryDataV2 structure. The | |||
"TimestampedCertificateEntryDataV2" structure. The "TransItem" can | TransItem can be reconstructed from these fields and the entire chain | |||
be reconstructed from these fields and the entire chain that the log | that the log used to verify the submission. | |||
used to verify the submission. | ||||
4.4. Log ID | 4.4. Log ID | |||
Each log is identified by an OID, which is one of the log's | Each log is identified by an OID, which is one of the log's | |||
parameters (see Section 4.1) and which MUST NOT be used to identify | parameters (see Section 4.1) and which MUST NOT be used to identify | |||
any other log. A log's operator MUST either allocate the OID | any other log. A log's operator MUST either allocate the OID | |||
themselves or request an OID from the Log ID registry (see | themselves or request an OID from the Log ID registry (see | |||
Section 10.2.5). One way to get an OID arc, from which OIDs can be | Section 10.2.5). One way to get an OID arc, from which OIDs can be | |||
allocated, is to request a Private Enterprise Number from IANA, by | allocated, is to request a Private Enterprise Number from IANA by | |||
completing the registration form (https://pen.iana.org/pen/ | completing the registration form (https://pen.iana.org/pen/ | |||
PenApplication.page). The only advantage of the registry is that the | PenApplication.page). The only advantage of the registry is that the | |||
DER encoding can be small. (Recall that OID allocations do not | DER encoding can be small. (Recall that OID allocations do not | |||
require a central registration, although logs will most likely want | require a central registration, although logs will most likely want | |||
to make themselves known to potential clients through out of band | to make themselves known to potential clients through out-of-band | |||
means.) Various data structures include the DER encoding of this | means.) Various data structures include the DER encoding of this | |||
OID, excluding the ASN.1 tag and length bytes, in an opaque vector: | OID, excluding the ASN.1 tag and length bytes, in an opaque vector: | |||
opaque LogID<2..127>; | opaque LogID<2..127>; | |||
Note that the ASN.1 length and the opaque vector length are identical | Note that the ASN.1 length and the opaque vector length are identical | |||
in size (1 byte) and value, so the full DER encoding (including the | in size (1 byte) and value, so the full DER encoding (including the | |||
tag and length) of the OID can be reproduced simply by prepending an | tag and length) of the OID can be reproduced simply by prepending an | |||
OBJECT IDENTIFIER tag (0x06) to the opaque vector length and | OBJECT IDENTIFIER tag (0x06) to the opaque vector length and | |||
contents. | contents. | |||
The OID used to identify a log is limited such that the DER encoding | The OID used to identify a log is limited such that the DER encoding | |||
of its value, excluding the tag and length, MUST be no longer than | of its value, excluding the tag and length, MUST be no longer than | |||
127 octets. | 127 octets. | |||
4.5. TransItem Structure | 4.5. TransItem Structure | |||
Various data structures are encapsulated in the "TransItem" structure | Various data structures are encapsulated in the TransItem structure | |||
to ensure that the type and version of each one is identified in a | to ensure that the type and version of each one is identified in a | |||
common fashion: | common fashion: | |||
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 */ | |||
skipping to change at page 22, line 31 ¶ | skipping to change at line 993 ¶ | |||
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; | |||
"versioned_type" is a value from the IANA registry in Section 10.2.3 | versioned_type is a value from the IANA registry in Section 10.2.3 | |||
that identifies the type of the encapsulated data structure and the | that identifies the type of the encapsulated data structure and the | |||
earliest version of this protocol to which it conforms. This | earliest version of this protocol to which it conforms. This | |||
document is v2. | document is v2. | |||
"data" is the encapsulated data structure. The various structures | data is the encapsulated data structure. The various structures | |||
named with the "DataV2" suffix are defined in later sections of this | named with the DataV2 suffix are defined in later sections of this | |||
document. | document. | |||
Note that "VersionedTransType" combines the v1 [RFC6962] type | Note that VersionedTransType combines the v1 type enumerations | |||
enumerations "Version", "LogEntryType", "SignatureType" and | Version, LogEntryType, SignatureType, and MerkleLeafType [RFC6962]. | |||
"MerkleLeafType". Note also that v1 did not define "TransItem", but | Note also that v1 did not define TransItem, but this document | |||
this document provides guidelines (see Appendix A) on how v2 | provides guidelines (see Appendix A) on how v2 implementations can | |||
implementations can co-exist with v1 implementations. | coexist with v1 implementations. | |||
Future versions of this protocol may reuse "VersionedTransType" | Future versions of this protocol may reuse VersionedTransType values | |||
values defined in this document as long as the corresponding data | defined in this document as long as the corresponding data structures | |||
structures are not modified, and may add new "VersionedTransType" | are not modified and may add new VersionedTransType values for new or | |||
values for new or modified data structures. | modified data structures. | |||
4.6. Log Artifact Extensions | 4.6. Log Artifact Extensions | |||
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; | |||
The "Extension" structure provides a generic extensibility for log | The Extension structure provides a generic extensibility for log | |||
artifacts, including SCTs (Section 4.8) and STHs (Section 4.10). The | artifacts, including SCTs (Section 4.8) and STHs (Section 4.10). The | |||
interpretation of the "extension_data" field is determined solely by | interpretation of the extension_data field is determined solely by | |||
the value of the "extension_type" field. | the value of the extension_type field. | |||
This document does not define any extensions, but it does establish a | This document does not define any extensions, but it does establish a | |||
registry for future "ExtensionType" values (see Section 10.2.4). | registry for future ExtensionType values (see Section 10.2.4). Each | |||
Each document that registers a new "ExtensionType" must specify the | document that registers a new ExtensionType must specify the context | |||
context in which it may be used (e.g., SCT, STH, or both) and | in which it may be used (e.g., SCT, STH, or both) and describe how to | |||
describe how to interpret the corresponding "extension_data". | interpret the corresponding extension_data. | |||
4.7. Merkle Tree Leaves | 4.7. Merkle Tree Leaves | |||
The leaves of a log's Merkle Tree correspond to the log's entries | The leaves of a log's Merkle Tree correspond to the log's entries | |||
(see Section 4.3). Each leaf is the leaf hash (Section 2.1) of a | (see Section 4.3). Each leaf is the leaf hash (Section 2.1) of a | |||
"TransItem" structure of type "x509_entry_v2" or "precert_entry_v2", | TransItem structure of type x509_entry_v2 or precert_entry_v2, which | |||
which encapsulates a "TimestampedCertificateEntryDataV2" structure. | encapsulates a TimestampedCertificateEntryDataV2 structure. Note | |||
Note that leaf hashes are calculated as HASH(0x00 || TransItem), | that leaf hashes are calculated as HASH(0x00 || TransItem), where the | |||
where the hash algorithm is one of the log's parameters. | hash algorithm is one of the log's parameters. | |||
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; | |||
"timestamp" is the date and time at which the certificate or | timestamp is the date and time at which the certificate or | |||
precertificate was accepted by the log, in the form of a 64-bit | precertificate was accepted by the log, in the form of a 64-bit | |||
unsigned number of milliseconds elapsed since the Unix Epoch (1 | unsigned number of milliseconds elapsed since the Unix Epoch (1 | |||
January 1970 00:00:00 UTC - see [UNIXTIME]), ignoring leap seconds, | January 1970 00:00:00 UTC -- see [UNIXTIME]), ignoring leap seconds, | |||
in network byte order. Note that the leaves of a log's Merkle Tree | in network byte order. Note that the leaves of a log's Merkle Tree | |||
are not required to be in strict chronological order. | are not required to be in strict chronological order. | |||
"issuer_key_hash" is the HASH of the public key of the CA that issued | issuer_key_hash is the HASH of the public key of the CA that issued | |||
the certificate or precertificate, calculated over the DER encoding | the certificate or precertificate, calculated over the DER encoding | |||
of the key represented as SubjectPublicKeyInfo [RFC5280]. This is | of the key represented as SubjectPublicKeyInfo [RFC5280]. This is | |||
needed to bind the CA to the certificate or precertificate, making it | needed to bind the CA to the certificate or precertificate, making it | |||
impossible for the corresponding SCT to be valid for any other | impossible for the corresponding SCT to be valid for any other | |||
certificate or precertificate whose TBSCertificate matches | certificate or precertificate whose TBSCertificate matches | |||
"tbs_certificate". The length of the "issuer_key_hash" MUST match | tbs_certificate. The length of the issuer_key_hash MUST match | |||
HASH_SIZE. | HASH_SIZE. | |||
"tbs_certificate" is the DER encoded TBSCertificate from the | tbs_certificate is the DER-encoded TBSCertificate from the | |||
submission. (Note that a precertificate's TBSCertificate can be | submission. (Note that a precertificate's TBSCertificate can be | |||
reconstructed from the corresponding certificate as described in | reconstructed from the corresponding certificate, as described in | |||
Section 8.1.2). | Section 8.1.2). | |||
"sct_extensions" is byte-for-byte identical to the SCT extensions of | sct_extensions is byte-for-byte identical to the SCT extensions of | |||
the corresponding SCT. | the corresponding SCT. | |||
The type of the "TransItem" corresponds to the value of the "type" | The type of the TransItem corresponds to the value of the type | |||
parameter supplied in the Section 5.1 call. | parameter supplied in the Section 5.1 call. | |||
4.8. Signed Certificate Timestamp (SCT) | 4.8. Signed Certificate Timestamp (SCT) | |||
An SCT is a "TransItem" structure of type "x509_sct_v2" or | An SCT is a TransItem structure of type x509_sct_v2 or | |||
"precert_sct_v2", which encapsulates a | precert_sct_v2, which encapsulates a SignedCertificateTimestampDataV2 | |||
"SignedCertificateTimestampDataV2" structure: | structure: | |||
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; | |||
"log_id" is this log's unique ID, encoded in an opaque vector as | log_id is this log's unique ID, encoded in an opaque vector, as | |||
described in Section 4.4. | described in Section 4.4. | |||
"timestamp" is equal to the timestamp from the corresponding | timestamp is equal to the timestamp from the corresponding | |||
"TimestampedCertificateEntryDataV2" structure. | TimestampedCertificateEntryDataV2 structure. | |||
"sct_extensions" is a vector of 0 or more SCT extensions. This | sct_extensions is a vector of 0 or more SCT extensions. This vector | |||
vector MUST NOT include more than one extension with the same | MUST NOT include more than one extension with the same | |||
"extension_type". The extensions in the vector MUST be ordered by | extension_type. The extensions in the vector MUST be ordered by the | |||
the value of the "extension_type" field, smallest value first. All | value of the extension_type field, smallest value first. All SCT | |||
SCT extensions are similar to non-critical X.509v3 extensions (i.e., | extensions are similar to noncritical X.509v3 extensions (i.e., the | |||
the "mustUnderstand" field is not set), and a recipient SHOULD ignore | mustUnderstand field is not set), and a recipient SHOULD ignore any | |||
any extension it does not understand. Furthermore, an implementation | extension it does not understand. Furthermore, an implementation MAY | |||
MAY choose to ignore any extension(s) that it does understand. | choose to ignore any extension(s) that it does understand. | |||
"signature" is computed over a "TransItem" structure of type | signature is computed over a TransItem structure of type | |||
"x509_entry_v2" or "precert_entry_v2" (see Section 4.7) using the | x509_entry_v2 or precert_entry_v2 (see Section 4.7) using the | |||
signature algorithm declared in the log's parameters (see | signature algorithm declared in the log's parameters (see | |||
Section 4.1). | Section 4.1). | |||
4.9. Merkle Tree Head | 4.9. Merkle Tree Head | |||
The log stores information about its Merkle Tree in a | The log stores information about its Merkle Tree in a TreeHeadDataV2: | |||
"TreeHeadDataV2": | ||||
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; | |||
The length of NodeHash MUST match HASH_SIZE of the log. | The length of NodeHash MUST match HASH_SIZE of the log. | |||
"timestamp" is the current date and time, using the format defined in | timestamp is the current date and time, using the format defined in | |||
Section 4.7. | Section 4.7. | |||
"tree_size" is the number of entries currently in the log's Merkle | tree_size is the number of entries currently in the log's Merkle | |||
Tree. | Tree. | |||
"root_hash" is the root of the Merkle Hash Tree. | root_hash is the root of the Merkle Tree. | |||
"sth_extensions" is a vector of 0 or more STH extensions. This | sth_extensions is a vector of 0 or more STH extensions. This vector | |||
vector MUST NOT include more than one extension with the same | MUST NOT include more than one extension with the same | |||
"extension_type". The extensions in the vector MUST be ordered by | extension_type. The extensions in the vector MUST be ordered by the | |||
the value of the "extension_type" field, smallest value first. If an | value of the extension_type field, smallest value first. If an | |||
implementation sees an extension that it does not understand, it | implementation sees an extension that it does not understand, it | |||
SHOULD ignore that extension. Furthermore, an implementation MAY | SHOULD ignore that extension. Furthermore, an implementation MAY | |||
choose to ignore any extension(s) that it does understand. | choose to ignore any extension(s) that it does understand. | |||
4.10. Signed Tree Head (STH) | 4.10. Signed Tree Head (STH) | |||
Periodically each log SHOULD sign its current tree head information | Periodically, each log SHOULD sign its current tree head information | |||
(see Section 4.9) to produce an STH. When a client requests a log's | (see Section 4.9) to produce an STH. When a client requests a log's | |||
latest STH (see Section 5.2), the log MUST return an STH that is no | latest STH (see Section 5.2), the log MUST return an STH that is no | |||
older than the log's MMD. However, since STHs could be used to mark | older than the log's MMD. However, since STHs could be used to mark | |||
individual clients (by producing a new STH for each query), a log | individual clients (by producing a new STH for each query), a log | |||
MUST NOT produce STHs more frequently than its parameters declare | MUST NOT produce STHs more frequently than its parameters declare | |||
(see Section 4.1). In general, there is no need to produce a new STH | (see Section 4.1). In general, there is no need to produce a new STH | |||
unless there are new entries in the log; however, in the event that a | unless there are new entries in the log; however, in the event that a | |||
log does not accept any submissions during an MMD period, the log | log does not accept any submissions during an MMD period, the log | |||
MUST sign the same Merkle Tree Hash with a fresh timestamp. | MUST sign the same Merkle Tree Hash with a fresh timestamp. | |||
An STH is a "TransItem" structure of type "signed_tree_head_v2", | An STH is a TransItem structure of type signed_tree_head_v2, which | |||
which encapsulates a "SignedTreeHeadDataV2" structure: | encapsulates a SignedTreeHeadDataV2 structure: | |||
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; | |||
"log_id" is this log's unique ID, encoded in an opaque vector as | log_id is this log's unique ID encoded in an opaque vector, as | |||
described in Section 4.4. | described in Section 4.4. | |||
The "timestamp" in "tree_head" MUST be at least as recent as the most | The timestamp in tree_head MUST be at least as recent as the most | |||
recent SCT timestamp in the tree. Each subsequent timestamp MUST be | recent SCT timestamp in the tree. Each subsequent timestamp MUST be | |||
more recent than the timestamp of the previous update. | more recent than the timestamp of the previous update. | |||
"tree_head" contains the latest tree head information (see | tree_head contains the latest tree head information (see | |||
Section 4.9). | Section 4.9). | |||
"signature" is computed over the "tree_head" field using the | signature is computed over the tree_head field using the signature | |||
signature algorithm declared in the log's parameters (see | algorithm declared in the log's parameters (see Section 4.1). | |||
Section 4.1). | ||||
4.11. Merkle Consistency Proofs | 4.11. Merkle Consistency Proofs | |||
To prepare a Merkle Consistency Proof for distribution to clients, | To prepare a Merkle consistency proof for distribution to clients, | |||
the log produces a "TransItem" structure of type | the log produces a TransItem structure of type consistency_proof_v2, | |||
"consistency_proof_v2", which encapsulates a "ConsistencyProofDataV2" | which encapsulates a ConsistencyProofDataV2 structure: | |||
structure: | ||||
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; | |||
"log_id" is this log's unique ID, encoded in an opaque vector as | log_id is this log's unique ID encoded in an opaque vector, as | |||
described in Section 4.4. | described in Section 4.4. | |||
"tree_size_1" is the size of the older tree. | tree_size_1 is the size of the older tree. | |||
"tree_size_2" is the size of the newer tree. | tree_size_2 is the size of the newer tree. | |||
"consistency_path" is a vector of Merkle Tree nodes proving the | consistency_path is a vector of Merkle Tree nodes proving the | |||
consistency of two STHs as described in Section 2.1.4. | consistency of two STHs, as described in Section 2.1.4. | |||
4.12. Merkle Inclusion Proofs | 4.12. Merkle Inclusion Proofs | |||
To prepare a Merkle Inclusion Proof for distribution to clients, the | To prepare a Merkle inclusion proof for distribution to clients, the | |||
log produces a "TransItem" structure of type "inclusion_proof_v2", | log produces a TransItem structure of type inclusion_proof_v2, which | |||
which encapsulates an "InclusionProofDataV2" structure: | encapsulates an InclusionProofDataV2 structure: | |||
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; | |||
"log_id" is this log's unique ID, encoded in an opaque vector as | log_id is this log's unique ID encoded in an opaque vector, as | |||
described in Section 4.4. | described in Section 4.4. | |||
"tree_size" is the size of the tree on which this inclusion proof is | tree_size is the size of the tree on which this inclusion proof is | |||
based. | based. | |||
"leaf_index" is the 0-based index of the log entry corresponding to | leaf_index is the 0-based index of the log entry corresponding to | |||
this inclusion proof. | this inclusion proof. | |||
"inclusion_path" is a vector of Merkle Tree nodes proving the | inclusion_path is a vector of Merkle Tree nodes proving the inclusion | |||
inclusion of the chosen certificate or precertificate as described in | of the chosen certificate or precertificate, as described in | |||
Section 2.1.3. | Section 2.1.3. | |||
4.13. Shutting down a log | 4.13. Shutting Down a Log | |||
Log operators may decide to shut down a log for various reasons, such | Log operators may decide to shut down a log for various reasons, such | |||
as deprecation of the signature algorithm. If there are entries in | as deprecation of the signature algorithm. If there are entries in | |||
the log for certificates that have not yet expired, simply making TLS | the log for certificates that have not yet expired, simply making TLS | |||
clients stop recognizing that log will have the effect of | clients stop recognizing that log will have the effect of | |||
invalidating SCTs from that log. In order to avoid that, the | invalidating SCTs from that log. In order to avoid that, the | |||
following actions SHOULD be taken: | following actions SHOULD be taken: | |||
* Make it known to clients and monitors that the log will be frozen. | * 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 | This is not part of the API, so it will have to be done via a | |||
relevant out-of-band mechanism. | relevant out-of-band mechanism. | |||
* Stop accepting new submissions (the error code "shutdown" should | * Stop accepting new submissions (the error code "shutdown" should | |||
be returned for such requests). | be returned for such requests). | |||
* Once MMD from the last accepted submission has passed and all | * Once MMD from the last accepted submission has passed and all | |||
pending submissions are incorporated, issue a final STH and | pending submissions are incorporated, issue a final STH and | |||
publish it as one of the log's parameters. Having an STH with a | publish it as one of the log's parameters. Having an STH with a | |||
timestamp that is after the MMD has passed from the last SCT | timestamp that is after the MMD has passed from the last SCT | |||
issuance allows clients to audit this log regularly without | issuance allows clients to audit this log regularly without | |||
special handling for the final STH. At this point the log's | special handling for the final STH. At this point, the log's | |||
private key is no longer needed and can be destroyed. | private key is no longer needed and can be destroyed. | |||
* Keep the log running until the certificates in all of its entries | * Keep the log running until the certificates in all of its entries | |||
have expired or exist in other logs (this can be determined by | have expired or exist in other logs (this can be determined by | |||
scanning other logs or connecting to domains mentioned in the | scanning other logs or connecting to domains mentioned in the | |||
certificates and inspecting the SCTs served). | certificates and inspecting the SCTs served). | |||
5. Log Client Messages | 5. Log Client Messages | |||
Messages are sent as HTTPS GET or POST requests. Parameters for | Messages are sent as HTTPS GET or POST requests. Parameters for | |||
POSTs and all responses are encoded as JavaScript Object Notation | POSTs and all responses are encoded as JavaScript Object Notation | |||
(JSON) objects [RFC8259]. Parameters for GETs are encoded as order- | (JSON) objects [RFC8259]. Parameters for GETs are encoded as order- | |||
independent key/value URL parameters, using the "application/x-www- | independent key/value URL parameters, using the "application/x-www- | |||
form-urlencoded" format described in the "HTML 4.01 Specification" | form-urlencoded" format described in the "HTML 4.01 Specification" | |||
[HTML401]. Binary data is base64 encoded according to section 4 of | [HTML401]. Binary data is base64 encoded according to Section 4 of | |||
[RFC4648] as specified in the individual messages. | [RFC4648], as specified in the individual messages. | |||
Clients are configured with a log's base URL, which is one of the | Clients are configured with a log's base URL, which is one of the | |||
log's parameters. Clients construct URLs for requests by appending | log's parameters. Clients construct URLs for requests by appending | |||
suffixes to this base URL. This structure places some degree of | suffixes to this base URL. This structure places some degree of | |||
restriction on how log operators can deploy these services, as noted | restriction on how log operators can deploy these services, as noted | |||
in [RFC8820]. However, operational experience with version 1 of this | in [RFC8820]. However, operational experience with version 1 of this | |||
protocol has not indicated that these restrictions are a problem in | protocol has not indicated that these restrictions are a problem in | |||
practice. | practice. | |||
Note that JSON objects and URL parameters may contain fields not | Note that JSON objects and URL parameters may contain fields not | |||
specified here, to allow for experimentation. Any fields that are | specified here to allow for experimentation. Any fields that are not | |||
not understood SHOULD be ignored. | understood SHOULD be ignored. | |||
In practice, log servers may include multiple front-end machines. | In practice, log servers may include multiple front-end machines. | |||
Since it is impractical to keep these machines in perfect sync, | Since it is impractical to keep these machines in perfect sync, | |||
errors may occur that are caused by skew between the machines. Where | errors that are caused by skew between the machines may occur. Where | |||
such errors are possible, the front-end will return additional | such errors are possible, the front end will return additional | |||
information (as specified below) making it possible for clients to | information (as specified below), making it possible for clients to | |||
make progress, if progress is possible. Front-ends MUST only serve | make progress, if progress is possible. Front ends MUST only serve | |||
data that is free of gaps (that is, for example, no front-end will | 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 | respond with an STH unless it is also able to prove consistency from | |||
all log entries logged within that STH). | all log entries logged within that STH). | |||
For example, when a consistency proof between two STHs is requested, | For example, when a consistency proof between two STHs is requested, | |||
the front-end reached may not yet be aware of one or both STHs. In | the 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 | the case where it 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 is aware of. Where it is aware of the first but not the second, | |||
it will return the latest STH it is aware of and a consistency proof | it will return the latest STH it is aware of and a consistency proof | |||
from the first STH to the returned STH. The case where it knows the | 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" | second but not the first should not arise (see the "no gaps" | |||
requirement above). | requirement above). | |||
If the log is unable to process a client's request, it MUST return an | If the log is unable to process a client's request, it MUST return an | |||
HTTP response code of 4xx/5xx (see [RFC7231]), and, in place of the | HTTP response code of 4xx/5xx (see [RFC7231]), and, in place of the | |||
responses outlined in the subsections below, the body SHOULD be a | responses outlined in the subsections below, the body SHOULD be a | |||
JSON Problem Details Object (see [RFC7807] Section 3), containing: | JSON problem details object (see Section 3 of [RFC7807]) containing: | |||
type: A URN reference identifying the problem. To facilitate | type: A URN reference identifying the problem. To facilitate | |||
automated response to errors, this document defines a set of | automated response to errors, this document defines a set of | |||
standard tokens for use in the "type" field, within the URN | standard tokens for use in the type field within the URN namespace | |||
namespace of: "urn:ietf:params:trans:error:". | of: "urn:ietf:params:trans:error:". | |||
detail: A human-readable string describing the error that prevented | detail: A human-readable string describing the error that prevented | |||
the log from processing the request, ideally with sufficient | the log from processing the request, ideally with sufficient | |||
detail to enable the error to be rectified. | detail to enable the error to be rectified. | |||
e.g., In response to a request of "<Base URL>/ct/v2/get- | For example, in response to a request of <Base URL>/ct/v2/get- | |||
entries?start=100&end=99", the log would return a "400 Bad Request" | entries?start=100&end=99, the log would return a 400 Bad Request | |||
response code with a body similar to the following: | response code with a body similar to the following: | |||
{ | { | |||
"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'" | |||
} | } | |||
Most error types are specific to the type of request and are defined | Most error types are specific to the type of request and are defined | |||
in the respective subsections below. The one exception is the | in the respective subsections below. The one exception is the | |||
"malformed" error type, which indicates that the log server could not | "malformed" error type, which indicates that the log server could not | |||
skipping to change at page 30, line 19 ¶ | skipping to change at line 1335 ¶ | |||
document: | document: | |||
+===========+==================================+ | +===========+==================================+ | |||
| type | detail | | | type | detail | | |||
+===========+==================================+ | +===========+==================================+ | |||
| malformed | The request could not be parsed. | | | malformed | The request could not be parsed. | | |||
+-----------+----------------------------------+ | +-----------+----------------------------------+ | |||
Table 1 | Table 1 | |||
Clients SHOULD treat "500 Internal Server Error" and "503 Service | Clients SHOULD treat 500 Internal Server Error and 503 Service | |||
Unavailable" responses as transient failures and MAY retry the same | Unavailable responses as transient failures and MAY retry the same | |||
request without modification at a later date. Note that as per | request without modification at a later date. Note that in the case | |||
[RFC7231], in the case of a 503 response the log MAY include a | of a 503 response, the log MAY include a Retry-After header field per | |||
"Retry-After:" header field in order to request a minimum time for | [RFC7231] in order to request a minimum time for the client to wait | |||
the client to wait before retrying the request. In the absence of | before retrying the request. In the absence of this header field, | |||
this header field, this document does not specify a minimum. | this document does not specify a minimum. | |||
Clients SHOULD treat any 4xx error as a problem with the request and | Clients SHOULD treat any 4xx error as a problem with the request and | |||
not attempt to resubmit without some modification to the request. | not attempt to resubmit without some modification to the request. | |||
The full status code MAY provide additional details. | The full status code MAY provide additional details. | |||
This document deliberately does not provide more specific guidance on | This document deliberately does not provide more specific guidance on | |||
the use of HTTP status codes. | the use of HTTP status codes. | |||
5.1. Submit Entry to Log | 5.1. Submit Entry to Log | |||
POST <Base URL>/ct/v2/submit-entry | POST <Base URL>/ct/v2/submit-entry | |||
Inputs: submission: The base64 encoded certificate or | Inputs: | |||
precertificate. | submission: The base64-encoded certificate or precertificate. | |||
type: The "VersionedTransType" integer value that indicates | type: The VersionedTransType integer value that indicates the | |||
the type of the "submission": 1 for "x509_entry_v2", or 2 for | type of the submission: 1 for x509_entry_v2 or 2 for | |||
"precert_entry_v2". | precert_entry_v2. | |||
chain: An array of zero or more JSON strings, each of which | chain: An array of zero or more JSON strings, each of which is a | |||
is a base64 encoded CA certificate. The first element is the | base64-encoded CA certificate. The first element is the | |||
certifier of the "submission"; the second certifies the first; | certifier of the submission, the second certifies the first, | |||
etc. The last element of "chain" (or, if "chain" is an empty | etc. The last element of chain (or, if chain is an empty | |||
array, the "submission") is certified by an accepted trust | array, the submission) is certified by an accepted trust | |||
anchor. | anchor. | |||
Outputs: sct: A base64 encoded "TransItem" of type "x509_sct_v2" or | Outputs: | |||
"precert_sct_v2", signed by this log, that corresponds to the | sct: A base64-encoded TransItem of type x509_sct_v2 or | |||
"submission". | precert_sct_v2, signed by this log, that corresponds to the | |||
submission. | ||||
If the submitted entry is immediately appended to (or already | If the submitted entry is immediately appended to (or already | |||
exists in) this log's tree, then the log SHOULD also output: | exists in) this log's tree, then the log SHOULD also output: | |||
sth: A base64 encoded "TransItem" of type "signed_tree_head_v2", | sth: A base64-encoded TransItem of type signed_tree_head_v2 | |||
signed by this log. | signed by this log. | |||
inclusion: A base64 encoded "TransItem" of type | inclusion: A base64-encoded TransItem of type inclusion_proof_v2 | |||
"inclusion_proof_v2" whose "inclusion_path" array of Merkle | whose inclusion_path array of Merkle Tree nodes proves the | |||
Tree nodes proves the inclusion of the "submission" in the | inclusion of the submission in the returned sth. | |||
returned "sth". | ||||
Error codes: | Error codes: | |||
+================+==============================================+ | +================+===============================================+ | |||
| type | detail | | | type | detail | | |||
+================+==============================================+ | +================+===============================================+ | |||
| badSubmission | "submission" is neither a valid certificate | | | badSubmission | submission is neither a valid certificate nor | | |||
| | nor a valid precertificate. | | | | a valid precertificate. | | |||
+----------------+----------------------------------------------+ | +----------------+-----------------------------------------------+ | |||
| badType | "type" is neither 1 nor 2. | | | badType | type is neither 1 nor 2. | | |||
+----------------+----------------------------------------------+ | +----------------+-----------------------------------------------+ | |||
| badChain | The first element of "chain" is not the | | | badChain | The first element of chain is not the | | |||
| | certifier of the "submission", or the second | | | | certifier of the submission, or the second | | |||
| | element does not certify the first, etc. | | | | element does not certify the first, etc. | | |||
+----------------+----------------------------------------------+ | +----------------+-----------------------------------------------+ | |||
| badCertificate | One or more certificates in the "chain" are | | | badCertificate | One or more certificates in chain are not | | |||
| | not valid (e.g., not properly encoded). | | | | valid (e.g., not properly encoded). | | |||
+----------------+----------------------------------------------+ | +----------------+-----------------------------------------------+ | |||
| unknownAnchor | The last element of "chain" (or, if "chain" | | | unknownAnchor | The last element of chain (or, if chain is an | | |||
| | is an empty array, the "submission") both is | | | | empty array, the submission) is not, nor is | | |||
| | not, and is not certified by, an accepted | | | | it certified by, an accepted trust anchor. | | |||
| | trust anchor. | | +----------------+-----------------------------------------------+ | |||
+----------------+----------------------------------------------+ | | shutdown | The log is no longer accepting submissions. | | |||
| shutdown | The log is no longer accepting submissions. | | +----------------+-----------------------------------------------+ | |||
+----------------+----------------------------------------------+ | ||||
Table 2 | Table 2 | |||
If the version of "sct" is not v2, then a v2 client may be unable to | If the version of sct is not v2, then a v2 client may be unable to | |||
verify the signature. It MUST NOT construe this as an error. This | verify the signature. It MUST NOT construe this as an error. This | |||
is to avoid forcing an upgrade of compliant v2 clients that do not | is to avoid forcing an upgrade of compliant v2 clients that do not | |||
use the returned SCTs. | use the returned SCTs. | |||
If a log detects bad encoding in a chain that otherwise verifies | If a log detects bad encoding in a chain that otherwise verifies | |||
correctly then the log MUST either log the certificate or return the | correctly, then the log MUST either log the certificate or return the | |||
"bad certificate" error. If the certificate is logged, an SCT MUST | "badCertificate" error. If the certificate is logged, an SCT MUST be | |||
be issued. Logging the certificate is useful, because monitors | issued. Logging the certificate is useful, because monitors | |||
(Section 8.2) can then detect these encoding errors, which may be | (Section 8.2) can then detect these encoding errors, which may be | |||
accepted by some TLS clients. | accepted by some TLS clients. | |||
If "submission" is an accepted trust anchor whose certifier is | If submission is an accepted trust anchor whose certifier is neither | |||
neither an accepted trust anchor nor the first element of "chain", | an accepted trust anchor nor the first element of chain, then the log | |||
then the log MUST return the "unknown anchor" error. A log is not | MUST return the "unknownAnchor" error. A log is not able to generate | |||
able to generate an SCT for a submission if it does not have access | an SCT for a submission if it does not have access to the issuer's | |||
to the issuer's public key. | public key. | |||
If the returned "sct" is intended to be provided to TLS clients, then | If the returned sct is intended to be provided to TLS clients, then | |||
"sth" and "inclusion" (if returned) SHOULD also be provided to TLS | sth and inclusion (if returned) SHOULD also be provided to TLS | |||
clients. For example, if "type" was 2 (indicating "precert_sct_v2") | clients. For example, if type was 2 (indicating precert_sct_v2), | |||
then all three "TransItem"s could be embedded in the certificate. | then all three TransItems could be embedded in the certificate. | |||
5.2. Retrieve Latest STH | 5.2. Retrieve Latest STH | |||
GET <Base URL>/ct/v2/get-sth | GET <Base URL>/ct/v2/get-sth | |||
No inputs. | No inputs. | |||
Outputs: sth: A base64 encoded "TransItem" of type | Outputs: | |||
"signed_tree_head_v2", signed by this log, that is no older | sth: A base64-encoded TransItem of type signed_tree_head_v2 | |||
than the log's MMD. | signed by this log that is no older than the log's MMD. | |||
5.3. Retrieve Merkle Consistency Proof between Two STHs | 5.3. Retrieve Merkle Consistency Proof between Two STHs | |||
GET <Base URL>/ct/v2/get-sth-consistency | GET <Base URL>/ct/v2/get-sth-consistency | |||
Inputs: first: The tree_size of the older tree, in decimal. | Inputs: | |||
first: The tree_size of the older tree, in decimal. | ||||
second: The tree_size of the newer tree, in decimal | second: The tree_size of the newer tree, in decimal (optional). | |||
(optional). | ||||
Both tree sizes must be from existing v2 STHs. However, because | Both tree sizes must be from existing v2 STHs. However, because | |||
of skew, the receiving front-end may not know one or both of the | of skew, the receiving front end may not know one or both of the | |||
existing STHs. If both are known, then only the "consistency" | existing STHs. If both are known, then only the consistency | |||
output is returned. If the first is known but the second is not | output is returned. If the first is known but the second is not | |||
(or has been omitted), then the latest known STH is returned, | (or has been omitted), then the latest known STH is returned, | |||
along with a consistency proof between the first STH and the | along with a consistency proof between the first STH and the | |||
latest. If neither are known, then the latest known STH is | latest. If neither are known, then the latest known STH is | |||
returned without a consistency proof. | returned without a consistency proof. | |||
Outputs: consistency: A base64 encoded "TransItem" of type | Outputs: | |||
"consistency_proof_v2", whose "tree_size_1" MUST match the | consistency: A base64-encoded TransItem of type | |||
"first" input. If the "sth" output is omitted, then | consistency_proof_v2 whose tree_size_1 MUST match the first | |||
"tree_size_2" MUST match the "second" input. If "first" and | input. If the sth output is omitted, then tree_size_2 MUST | |||
"second" are equal and correspond to a known STH, the returned | match the second input. If first and second are equal and | |||
consistency proof MUST be empty (a "consistency_path" array | correspond to a known STH, the returned consistency proof MUST | |||
with zero elements). | be empty (a consistency_path array with zero elements). | |||
sth: A base64 encoded "TransItem" of type | sth: A base64-encoded TransItem of type signed_tree_head_v2, | |||
"signed_tree_head_v2", signed by this log. | signed by this log. | |||
Note that no signature is required for the "consistency" output as | Note that no signature is required for the consistency output, as | |||
it is used to verify the consistency between two STHs, which are | it is used to verify the consistency between two signed STHs. | |||
signed. | ||||
Error codes: | Error codes: | |||
+===================+======================================+ | +===================+======================================+ | |||
| type | detail | | | type | detail | | |||
+===================+======================================+ | +===================+======================================+ | |||
| firstUnknown | "first" is before the latest known | | | firstUnknown | first is before the latest known STH | | |||
| | STH but is not from an existing STH. | | | | but is not from an existing STH. | | |||
+-------------------+--------------------------------------+ | +-------------------+--------------------------------------+ | |||
| secondUnknown | "second" is before the latest known | | | secondUnknown | second is before the latest known | | |||
| | STH but is not from an existing STH. | | | | STH but is not from an existing STH. | | |||
+-------------------+--------------------------------------+ | +-------------------+--------------------------------------+ | |||
| secondBeforeFirst | "second" is smaller than "first". | | | secondBeforeFirst | second is smaller than first. | | |||
+-------------------+--------------------------------------+ | +-------------------+--------------------------------------+ | |||
Table 3 | Table 3 | |||
See Section 2.1.4.2 for an outline of how to use the "consistency" | See Section 2.1.4.2 for an outline of how to use the consistency | |||
output. | output. | |||
5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash | 5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash | |||
GET <Base URL>/ct/v2/get-proof-by-hash | GET <Base URL>/ct/v2/get-proof-by-hash | |||
Inputs: hash: A base64 encoded v2 leaf hash. | Inputs: | |||
hash: A base64-encoded v2 leaf hash. | ||||
tree_size: The tree_size of the tree on which to base the | tree_size: The tree_size of the tree on which to base the proof, | |||
proof, in decimal. | in decimal. | |||
The "hash" must be calculated as defined in Section 4.7. A v2 STH | The hash must be calculated as defined in Section 4.7. A v2 STH | |||
must exist for the "tree_size". Because of skew, the front-end | must exist for the tree_size. Because of skew, the front end may | |||
may not know the requested tree head. In that case, it will | not know the requested tree head. In that case, it will return | |||
return the latest STH it knows, along with an inclusion proof to | the latest STH it knows, along with an inclusion proof to that | |||
that STH. If the front-end knows the requested tree head then | STH. If the front end knows the requested tree head, then only | |||
only "inclusion" is returned. | inclusion is returned. | |||
Outputs: inclusion: A base64 encoded "TransItem" of type | Outputs: | |||
"inclusion_proof_v2" whose "inclusion_path" array of Merkle | inclusion: A base64-encoded TransItem of type inclusion_proof_v2 | |||
Tree nodes proves the inclusion of the certificate (as | whose inclusion_path array of Merkle Tree nodes proves the | |||
specified by the "hash" parameter) in the selected STH. | inclusion of the certificate (as specified by the hash | |||
parameter) in the selected STH. | ||||
sth: A base64 encoded "TransItem" of type | sth: A base64-encoded TransItem of type signed_tree_head_v2, | |||
"signed_tree_head_v2", signed by this log. | signed by this log. | |||
Note that no signature is required for the "inclusion" output as | Note that no signature is required for the inclusion output, as it | |||
it is used to verify inclusion in the selected STH, which is | is used to verify inclusion in the selected STH, which is signed. | |||
signed. | ||||
Error codes: | Error codes: | |||
+=================+=====================================+ | +=================+=====================================+ | |||
| type | detail | | | type | detail | | |||
+=================+=====================================+ | +=================+=====================================+ | |||
| hashUnknown | "hash" is not the hash of a known | | | hashUnknown | hash is not the hash of a known | | |||
| | leaf (may be caused by skew or by a | | | | leaf (may be caused by skew or by a | | |||
| | known certificate not yet merged). | | | | known certificate not yet merged). | | |||
+-----------------+-------------------------------------+ | +-----------------+-------------------------------------+ | |||
| treeSizeUnknown | "hash" is before the latest known | | | treeSizeUnknown | hash is before the latest known STH | | |||
| | STH but is not from an existing | | | | but is not from an existing STH. | | |||
| | STH. | | ||||
+-----------------+-------------------------------------+ | +-----------------+-------------------------------------+ | |||
Table 4 | Table 4 | |||
See Section 2.1.3.2 for an outline of how to use the "inclusion" | See Section 2.1.3.2 for an outline of how to use the inclusion | |||
output. | output. | |||
5.5. Retrieve Merkle Inclusion Proof, STH and Consistency Proof by Leaf | 5.5. Retrieve Merkle Inclusion Proof, STH, and Consistency Proof by | |||
Hash | Leaf Hash | |||
GET <Base URL>/ct/v2/get-all-by-hash | GET <Base URL>/ct/v2/get-all-by-hash | |||
Inputs: hash: A base64 encoded v2 leaf hash. | Inputs: | |||
hash: A base64-encoded v2 leaf hash. | ||||
tree_size: The tree_size of the tree on which to base the | tree_size: The tree_size of the tree on which to base the proofs, | |||
proofs, in decimal. | in decimal. | |||
The "hash" must be calculated as defined in Section 4.7. A v2 STH | The hash must be calculated as defined in Section 4.7. A v2 STH | |||
must exist for the "tree_size". | must exist for the tree_size. | |||
Because of skew, the front-end may not know the requested tree head | Because of skew, the front end may not know the requested tree head | |||
or the requested hash, which leads to a number of cases: | or the requested hash, which leads to a number of cases: | |||
+=====================+=====================================+ | +=====================+=====================================+ | |||
| Case | Response | | | Case | Response | | |||
+=====================+=====================================+ | +=====================+=====================================+ | |||
| latest STH < | Return latest STH | | | latest STH < | Return latest STH. | | |||
| requested tree head | | | | requested tree head | | | |||
+---------------------+-------------------------------------+ | +---------------------+-------------------------------------+ | |||
| latest STH > | Return latest STH and a consistency | | | latest STH > | Return latest STH and a consistency | | |||
| requested tree head | proof between it and the requested | | | requested tree head | proof between it and the requested | | |||
| | tree head (see Section 5.3) | | | | tree head (see Section 5.3). | | |||
+---------------------+-------------------------------------+ | +---------------------+-------------------------------------+ | |||
| index of requested | Return "inclusion" | | | index of requested | Return inclusion. | | |||
| hash < latest STH | | | | hash < latest STH | | | |||
+---------------------+-------------------------------------+ | +---------------------+-------------------------------------+ | |||
Table 5 | Table 5 | |||
Note that more than one case can be true, in which case the returned | Note that more than one case can be true; in which case, the returned | |||
data is their union. It is also possible for none to be true, in | data is their union. It is also possible for none to be true; in | |||
which case the front-end MUST return an empty response. | which case, the front end MUST return an empty response. | |||
Outputs: inclusion: A base64 encoded "TransItem" of type | Outputs: | |||
"inclusion_proof_v2" whose "inclusion_path" array of Merkle | inclusion: A base64-encoded TransItem of type inclusion_proof_v2 | |||
Tree nodes proves the inclusion of the certificate (as | whose inclusion_path array of Merkle Tree nodes proves the | |||
specified by the "hash" parameter) in the selected STH. | inclusion of the certificate (as specified by the hash | |||
parameter) in the selected STH. | ||||
sth: A base64 encoded "TransItem" of type | sth: A base64-encoded TransItem of type signed_tree_head_v2, | |||
"signed_tree_head_v2", signed by this log. | signed by this log. | |||
consistency: A base64 encoded "TransItem" of type | consistency: A base64-encoded TransItem of type | |||
"consistency_proof_v2" that proves the consistency of the | consistency_proof_v2 that proves the consistency of the | |||
requested tree head and the returned STH. | requested tree head and the returned STH. | |||
Note that no signature is required for the "inclusion" or | Note that no signature is required for the inclusion or | |||
"consistency" outputs as they are used to verify inclusion in and | consistency outputs, as they are used to verify inclusion in and | |||
consistency of STHs, which are signed. | consistency of signed STHs. | |||
Errors are the same as in Section 5.4. | Errors are the same as in Section 5.4. | |||
See Section 2.1.3.2 for an outline of how to use the "inclusion" | See Section 2.1.3.2 for an outline of how to use the inclusion | |||
output, and see Section 2.1.4.2 for an outline of how to use the | output, and see Section 2.1.4.2 for an outline of how to use the | |||
"consistency" output. | consistency output. | |||
5.6. Retrieve Entries and STH from Log | 5.6. Retrieve Entries and STH from Log | |||
GET <Base URL>/ct/v2/get-entries | GET <Base URL>/ct/v2/get-entries | |||
Inputs: start: 0-based index of first entry to retrieve, in | Inputs: | |||
decimal. | start: 0-based index of first entry to retrieve, in decimal. | |||
end: 0-based index of last entry to retrieve, in decimal. | end: 0-based index of last entry to retrieve, in decimal. | |||
Outputs: entries: An array of objects, each consisting of | Outputs: | |||
entries: An array of objects, each consisting of: | ||||
log_entry: The base64 encoded "TransItem" structure of type | log_entry: The base64-encoded TransItem structure of type | |||
"x509_entry_v2" or "precert_entry_v2" (see Section 4.3). | x509_entry_v2 or precert_entry_v2 (see Section 4.3). | |||
submitted_entry: JSON object equivalent to inputs that were | submitted_entry: JSON object equivalent to inputs that were | |||
submitted to "submit-entry", with the addition of the trust | submitted to submit-entry, with the addition of the trust | |||
anchor to the "chain" field if the submission did not | anchor to the chain field if the submission did not include | |||
include it. | it. | |||
sct: The base64 encoded "TransItem" of type "x509_sct_v2" or | sct: The base64-encoded TransItem of type x509_sct_v2 or | |||
"precert_sct_v2" corresponding to this log entry. | precert_sct_v2, corresponding to this log entry. | |||
sth: A base64 encoded "TransItem" of type | sth: A base64-encoded TransItem of type signed_tree_head_v2, | |||
"signed_tree_head_v2", signed by this log. | signed by this log. | |||
Note that this message is not signed -- the "entries" data can be | Note that this message is not signed -- the entries data can be | |||
verified by constructing the Merkle Tree Hash corresponding to a | verified by constructing the Merkle Tree Hash corresponding to a | |||
retrieved STH. All leaves MUST be v2. However, a compliant v2 | retrieved STH. All leaves MUST be v2. However, a compliant v2 | |||
client MUST NOT construe an unrecognized TransItem type as an error. | client MUST NOT construe an unrecognized TransItem type as an error. | |||
This means it may be unable to parse some entries, but note that each | This means it may be unable to parse some entries, but note that each | |||
client can inspect the entries it does recognize as well as verify | client can inspect the entries it does recognize as well as verify | |||
the integrity of the data by treating unrecognized leaves as opaque | the integrity of the data by treating unrecognized leaves as opaque | |||
input to the tree. | input to the tree. | |||
The "start" and "end" parameters SHOULD be within the range 0 <= x < | The start and end parameters SHOULD be within the range 0 <= x < | |||
"tree_size" as returned by "get-sth" in Section 5.2. | tree_size, as returned by get-sth in Section 5.2. | |||
The "start" parameter MUST be less than or equal to the "end" | The start parameter MUST be less than or equal to the end parameter. | |||
parameter. | ||||
Each "submitted_entry" output parameter MUST include the trust anchor | Each submitted_entry output parameter MUST include the trust anchor | |||
that the log used to verify the "submission", even if that trust | that the log used to verify the submission, even if that trust anchor | |||
anchor was not provided to "submit-entry" (see Section 5.1). If the | was not provided to submit-entry (see Section 5.1). If the | |||
"submission" does not certify itself, then the first element of | submission does not certify itself, then the first element of chain | |||
"chain" MUST be present and MUST certify the "submission". | MUST be present and MUST certify the submission. | |||
Log servers MUST honor requests where 0 <= "start" < "tree_size" and | Log servers MUST honor requests where 0 <= start < tree_size and end | |||
"end" >= "tree_size" by returning a partial response covering only | >= tree_size by returning a partial response covering only the valid | |||
the valid entries in the specified range. "end" >= "tree_size" could | entries in the specified range. end >= tree_size could be caused by | |||
be caused by skew. Note that the following restriction may also | skew. Note that the following restriction may also apply: | |||
apply: | ||||
Logs MAY restrict the number of entries that can be retrieved per | Logs MAY restrict the number of entries that can be retrieved per | |||
"get-entries" request. If a client requests more than the permitted | get-entries request. If a client requests more than the permitted | |||
number of entries, the log SHALL return the maximum number of entries | number of entries, the log SHALL return the maximum number of entries | |||
permissible. These entries SHALL be sequential beginning with the | permissible. These entries SHALL be sequential beginning with the | |||
entry specified by "start". Note that limit on the number of entries | entry specified by start. Note that a limit on the number of entries | |||
is not immutable and therefore the restriction may be changed or | is not immutable, and therefore the restriction may be changed or | |||
lifted at any time and is not listed with the other Log Parameters in | lifted at any time and is not listed with the other Log Parameters in | |||
Section 4.1. | Section 4.1. | |||
Because of skew, it is possible the log server will not have any | Because of skew, it is possible the log server will not have any | |||
entries between "start" and "end". In this case it MUST return an | entries between start and end. In this case, it MUST return an empty | |||
empty "entries" array. | entries array. | |||
In any case, the log server MUST return the latest STH it knows | In any case, the log server MUST return the latest STH it knows | |||
about. | about. | |||
See Section 2.1.2 for an outline of how to use a complete list of | See Section 2.1.2 for an outline of how to use a complete list of | |||
"log_entry" entries to verify the "root_hash". | log_entry entries to verify the root_hash. | |||
Error codes: | Error codes: | |||
+================+====================================+ | +================+==================================+ | |||
| type | detail | | | type | detail | | |||
+================+====================================+ | +================+==================================+ | |||
| startUnknown | "start" is greater than the number | | | startUnknown | start is greater than the number | | |||
| | of entries in the Merkle tree. | | | | of entries in the Merkle Tree. | | |||
+----------------+------------------------------------+ | +----------------+----------------------------------+ | |||
| endBeforeStart | "start" cannot be greater than | | | endBeforeStart | start cannot be greater than | | |||
| | "end". | | | | end. | | |||
+----------------+------------------------------------+ | +----------------+----------------------------------+ | |||
Table 6 | Table 6 | |||
5.7. Retrieve Accepted Trust Anchors | 5.7. Retrieve Accepted Trust Anchors | |||
GET <Base URL>/ct/v2/get-anchors | GET <Base URL>/ct/v2/get-anchors | |||
No inputs. | No inputs. | |||
Outputs: certificates: An array of JSON strings, each of which is a | Outputs: | |||
base64 encoded CA certificate that is acceptable to the log. | certificates: An array of JSON strings, each of which is a | |||
base64-encoded CA certificate that is acceptable to the log. | ||||
max_chain_length: If the server has chosen to limit the | max_chain_length: If the server has chosen to limit the length of | |||
length of chains it accepts, this is the maximum number of | chains it accepts, this is the maximum number of certificates | |||
certificates in the chain, in decimal. If there is no limit, | in the chain, in decimal. If there is no limit, this is | |||
this is omitted. | omitted. | |||
This data is not signed and the protocol depends on the security | This data is not signed, and the protocol depends on the security | |||
guarantees of TLS to ensure correctness. | guarantees of TLS to ensure correctness. | |||
6. TLS Servers | 6. TLS Servers | |||
CT-using TLS servers MUST use at least one of the mechanisms | CT-using TLS servers MUST use at least one of the mechanisms | |||
described below to present one or more SCTs from one or more logs to | described below to present one or more SCTs from one or more logs to | |||
each TLS client during full TLS handshakes, when requested by the | each TLS client during full TLS handshakes, when requested by the | |||
client, where each SCT corresponds to the server certificate. (Of | client, where each SCT corresponds to the server certificate. (Of | |||
course, a server can only send a TLS extension if the client has | course, a server can only send a TLS extension if the client has | |||
specified it first.) Servers SHOULD also present corresponding | specified it first.) Servers SHOULD also present corresponding | |||
inclusion proofs and STHs. | inclusion proofs and STHs. | |||
A server can provide SCTs using a TLS 1.3 extension (Section 4.2 of | A server can provide SCTs using a TLS 1.3 extension (Section 4.2 of | |||
[RFC8446]) with type "transparency_info" (see Section 6.5). This | [RFC8446]) with type transparency_info (see Section 6.5). This | |||
mechanism allows TLS servers to participate in CT without the | mechanism allows TLS servers to participate in CT without the | |||
cooperation of CAs, unlike the other two mechanisms. It also allows | cooperation of CAs, unlike the other two mechanisms. It also allows | |||
SCTs and inclusion proofs to be updated on the fly. | SCTs and inclusion proofs to be updated on the fly. | |||
The server may also use an Online Certificate Status Protocol (OCSP) | The server may also use an Online Certificate Status Protocol (OCSP) | |||
[RFC6960] response extension (see Section 7.1.1), providing the OCSP | [RFC6960] response extension (see Section 7.1.1), providing the OCSP | |||
response as part of the TLS handshake. Providing a response during a | response as part of the TLS handshake. Providing a response during a | |||
TLS handshake is popularly known as "OCSP stapling." For TLS 1.3, | TLS handshake is popularly known as "OCSP stapling". For TLS 1.3, | |||
the information is encoded as an extension in the "status_request" | the information is encoded as an extension in the status_request | |||
extension data; see Section 4.4.2.1 of [RFC8446]. For TLS 1.2 | extension data; see Section 4.4.2.1 of [RFC8446]. For TLS 1.2 | |||
([RFC5246]), the information is encoded in the "CertificateStatus" | [RFC5246], the information is encoded in the CertificateStatus | |||
message; see Section 8 of [RFC6066]. Using stapling also allows SCTs | message; see Section 8 of [RFC6066]. Using stapling also allows SCTs | |||
and inclusion proofs to be updated on the fly. | and inclusion proofs to be updated on the fly. | |||
CT information can also be encoded as an extension in the X.509v3 | CT information can also be encoded as an extension in the X.509v3 | |||
certificate (see Section 7.1.2). This mechanism allows the use of | certificate (see Section 7.1.2). This mechanism allows the use of | |||
unmodified TLS servers, but the SCTs and inclusion proofs cannot be | unmodified TLS servers, but the SCTs and inclusion proofs cannot be | |||
updated on the fly. Since the logs from which the SCTs and inclusion | updated on the fly. Since the logs from which the SCTs and inclusion | |||
proofs originated won't necessarily be accepted by TLS clients for | proofs originated won't necessarily be accepted by TLS clients for | |||
the full lifetime of the certificate, there is a risk that TLS | the full lifetime of the certificate, there is a risk that TLS | |||
clients may subsequently consider the certificate to be non-compliant | clients may subsequently consider the certificate to be noncompliant. | |||
and in need of re-issuance or the use of one of the other two methods | In such an event, one of the other two mechanisms will need to be | |||
for delivering CT information. | used to deliver CT information, or, if this is not possible, the | |||
certificate will need to be reissued. | ||||
6.1. TLS Client Authentication | 6.1. TLS Client Authentication | |||
This specification includes no description of how a TLS server can | This specification includes no description of how a TLS server can | |||
use CT for TLS client certificates. While this may be useful, it is | use CT for TLS client certificates. While this may be useful, it is | |||
not documented here for the following reasons: | not documented here for the following reasons: | |||
* The greater security exposure is for clients to end up interacting | * The greater security exposure is for clients to end up interacting | |||
with an illegitimate server. | with an illegitimate server. | |||
* In general, TLS client certificates are not expected to be | * In general, TLS client certificates are not expected to be | |||
submitted to CT logs, particularly those intended for general | submitted to CT logs, particularly those intended for general | |||
public use. | public use. | |||
A future version could include such information. | A future version could include such information. | |||
6.2. Multiple SCTs | 6.2. Multiple SCTs | |||
CT-using TLS servers SHOULD send SCTs from multiple logs, because: | CT-using TLS servers SHOULD send SCTs from multiple logs because: | |||
* One or more logs may not have become acceptable to all CT-using | * The set of logs trusted by TLS clients is neither unified nor | |||
TLS clients. Note that client discovery, trust, and distrust of | static; each client vendor may maintain an independent list of | |||
logs is expected to be handled out-of-band and is out of scope of | trusted logs, and, over time, new logs may become trusted and | |||
this document. | current logs may become distrusted. Note that client discovery, | |||
trust, and distrust of logs are expected to be handled out of band | ||||
and are out of scope of this document. | ||||
* If a CA and a log collude, it is possible to temporarily hide | * If a CA and a log collude, it is possible to temporarily hide | |||
misissuance from clients. When a TLS client requires SCTs from | misissuance from clients. When a TLS client requires SCTs from | |||
multiple logs to be provided, it is more difficult to mount this | multiple logs to be provided, it is more difficult to mount this | |||
attack. | attack. | |||
* If a log misbehaves or suffers a key compromise, a consequence may | * If a log misbehaves or suffers a key compromise, a consequence may | |||
be that clients cease to trust it. Since the time an SCT may be | be that clients cease to trust it. Since the time an SCT may be | |||
in use can be considerable (several years is common in current | in use can be considerable (several years is common in current | |||
practice when embedded in a certificate), including SCTs from | practice when embedded in a certificate), including SCTs from | |||
multiple logs reduces the probability of the certificate being | multiple logs reduces the probability of the certificate being | |||
rejected by TLS clients. | rejected by TLS clients. | |||
* TLS clients may have policies related to the above risks requiring | * TLS clients may have policies related to the above risks requiring | |||
TLS servers to present multiple SCTs. For example, at the time of | TLS servers to present multiple SCTs. For example, at the time of | |||
writing, Chromium [Chromium.Log.Policy] requires multiple SCTs to | writing, Chromium [Chromium.Log.Policy] requires multiple SCTs to | |||
be presented with EV certificates in order for the EV indicator to | be presented with Extended Validation (EV) certificates in order | |||
be shown. | for the EV indicator to be shown. | |||
To select the logs from which to obtain SCTs, a TLS server can, for | To select the logs from which to obtain SCTs, a TLS server can, for | |||
example, examine the set of logs popular TLS clients accept and | example, examine the set of logs popular TLS clients accept and | |||
recognize. | recognize. | |||
6.3. TransItemList Structure | 6.3. TransItemList Structure | |||
Multiple SCTs, inclusion proofs, and indeed "TransItem" structures of | Multiple SCTs, inclusion proofs, and indeed TransItem structures of | |||
any type, are combined into a list as follows: | any type are combined into a list as follows: | |||
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; | |||
Here, "SerializedTransItem" is an opaque byte string that contains | Here, SerializedTransItem is an opaque byte string that contains the | |||
the serialized "TransItem" structure. This encoding ensures that TLS | serialized TransItem structure. This encoding ensures that TLS | |||
clients can decode each "TransItem" individually (so, for example, if | clients can decode each TransItem individually (so, for example, if | |||
there is a version upgrade, out-of-date clients can still parse old | there is a version upgrade, out-of-date clients can still parse old | |||
"TransItem" structures while skipping over new "TransItem" structures | TransItem structures while skipping over new TransItem structures | |||
whose versions they don't understand). | whose versions they don't understand). | |||
6.4. Presenting SCTs, inclusions proofs and STHs | 6.4. Presenting SCTs, Inclusions Proofs, and STHs | |||
In each "TransItemList" that is sent during a TLS handshake, the TLS | In each TransItemList that is sent during a TLS handshake, the TLS | |||
server MUST include a "TransItem" structure of type "x509_sct_v2" or | server MUST include a TransItem structure of type x509_sct_v2 or | |||
"precert_sct_v2". | precert_sct_v2. | |||
Presenting inclusion proofs and STHs in the TLS handshake helps to | Presenting inclusion proofs and STHs in the TLS handshake helps to | |||
protect the client's privacy (see Section 8.1.4) and reduces load on | protect the client's privacy (see Section 8.1.4) and reduces load on | |||
log servers. Therefore, if the TLS server can obtain them, it SHOULD | log servers. Therefore, if the TLS server can obtain them, it SHOULD | |||
also include "TransItem"s of type "inclusion_proof_v2" and | also include TransItems of type inclusion_proof_v2 and | |||
"signed_tree_head_v2" in the "TransItemList". | signed_tree_head_v2 in the TransItemList. | |||
6.5. transparency_info TLS Extension | 6.5. transparency_info TLS Extension | |||
Provided that a TLS client includes the "transparency_info" extension | Provided that a TLS client includes the transparency_info extension | |||
type in the ClientHello and the TLS server supports the | type in the ClientHello and the TLS server supports the | |||
"transparency_info" extension: | transparency_info extension: | |||
* The TLS server MUST verify that the received "extension_data" is | * The TLS server MUST verify that the received extension_data is | |||
empty. | empty. | |||
* The TLS server MUST construct a "TransItemList" of relevant | * The TLS server MUST construct a TransItemList of relevant | |||
"TransItem"s (see Section 6.4), which SHOULD omit any "TransItem"s | TransItems (see Section 6.4), which SHOULD omit any TransItems | |||
that are already embedded in the server certificate or the stapled | that are already embedded in the server certificate or the stapled | |||
OCSP response (see Section 7.1). If the constructed | OCSP response (see Section 7.1). If the constructed TransItemList | |||
"TransItemList" is not empty, then the TLS server MUST include the | is not empty, then the TLS server MUST include the | |||
"transparency_info" extension with the "extension_data" set to | transparency_info extension with the extension_data set to this | |||
this "TransItemList". If the list is empty then the server SHOULD | TransItemList. If the list is empty, then the server SHOULD omit | |||
omit the "extension_data" element, but MAY send it with an empty | the extension_data element but MAY send it with an empty array. | |||
array. | ||||
TLS servers MUST only include this extension in the following | TLS servers MUST only include this extension in the following | |||
messages: | messages: | |||
* the ServerHello message (for TLS 1.2 or earlier). | * the ServerHello message (for TLS 1.2 or earlier) | |||
* the Certificate or CertificateRequest message (for TLS 1.3). | * the Certificate or CertificateRequest message (for TLS 1.3) | |||
TLS servers MUST NOT process or include this extension when a TLS | TLS servers MUST NOT process or include this extension when a TLS | |||
session is resumed, since session resumption uses the original | session is resumed, since session resumption uses the original | |||
session information. | session information. | |||
7. Certification Authorities | 7. Certification Authorities | |||
7.1. Transparency Information X.509v3 Extension | 7.1. Transparency Information X.509v3 Extension | |||
The Transparency Information X.509v3 extension, which has OID | The Transparency Information X.509v3 extension, which has OID | |||
1.3.101.75 and SHOULD be non-critical, contains one or more | 1.3.101.75 and SHOULD be noncritical, contains one or more TransItem | |||
"TransItem" structures in a "TransItemList". This extension MAY be | structures in a TransItemList. This extension MAY be included in | |||
included in OCSP responses (see Section 7.1.1) and certificates (see | OCSP responses (see Section 7.1.1) and certificates (see | |||
Section 7.1.2). Since RFC5280 requires the "extnValue" field (an | Section 7.1.2). Since [RFC5280] requires the extnValue field (an | |||
OCTET STRING) of each X.509v3 extension to include the DER encoding | OCTET STRING) of each X.509v3 extension to include the DER encoding | |||
of an ASN.1 value, a "TransItemList" MUST NOT be included directly. | of an ASN.1 value, a TransItemList MUST NOT be included directly. | |||
Instead, it MUST be wrapped inside an additional OCTET STRING, which | Instead, it MUST be wrapped inside an additional OCTET STRING, which | |||
is then put into the "extnValue" field: | is then put into the extnValue field: | |||
TransparencyInformationSyntax ::= OCTET STRING | TransparencyInformationSyntax ::= OCTET STRING | |||
"TransparencyInformationSyntax" contains a "TransItemList". | TransparencyInformationSyntax contains a TransItemList. | |||
7.1.1. OCSP Response Extension | 7.1.1. OCSP Response Extension | |||
A certification authority MAY include a Transparency Information | A certification authority MAY include a Transparency Information | |||
X.509v3 extension in the "singleExtensions" of a "SingleResponse" in | X.509v3 extension in the singleExtensions of a SingleResponse in an | |||
an OCSP response. All included SCTs and inclusion proofs MUST be for | OCSP response. All included SCTs and inclusion proofs MUST be for | |||
the certificate identified by the "certID" of that "SingleResponse", | the certificate identified by the certID of that SingleResponse or | |||
or for a precertificate that corresponds to that certificate. | for a precertificate that corresponds to that certificate. | |||
7.1.2. Certificate Extension | 7.1.2. Certificate Extension | |||
A certification authority MAY include a Transparency Information | A certification authority MAY include a Transparency Information | |||
X.509v3 extension in a certificate. All included SCTs and inclusion | X.509v3 extension in a certificate. All included SCTs and inclusion | |||
proofs MUST be for a precertificate that corresponds to this | proofs MUST be for a precertificate that corresponds to this | |||
certificate. | certificate. | |||
7.2. TLS Feature X.509v3 Extension | 7.2. TLS Feature X.509v3 Extension | |||
A certification authority SHOULD NOT issue any certificate that | A certification authority SHOULD NOT issue any certificate that | |||
identifies the "transparency_info" TLS extension in a TLS feature | identifies the transparency_info TLS extension in a TLS feature | |||
extension [RFC7633], because TLS servers are not required to support | extension [RFC7633], because TLS servers are not required to support | |||
the "transparency_info" TLS extension in order to participate in CT | the transparency_info TLS extension in order to participate in CT | |||
(see Section 6). | (see Section 6). | |||
8. Clients | 8. Clients | |||
There are various different functions clients of logs might perform. | There are various different functions clients of logs might perform. | |||
We describe here some typical clients and how they should function. | We describe here some typical clients and how they should function. | |||
Any inconsistency may be used as evidence that a log has not behaved | Any inconsistency may be used as evidence that a log has not behaved | |||
correctly, and the signatures on the data structures prevent the log | correctly, and the signatures on the data structures prevent the log | |||
from denying that misbehavior. | from denying that misbehavior. | |||
All clients need various parameters in order to communicate with logs | All clients need various parameters in order to communicate with logs | |||
and verify their responses. These parameters are described in | and verify their responses. These parameters are described in | |||
Section 4.1, but note that this document does not describe how the | Section 4.1, but note that this document does not describe how the | |||
parameters are obtained, which is implementation-dependent (see, for | parameters are obtained, which is implementation dependent (for | |||
example, [Chromium.Policy]). | example, see [Chromium.Policy]). | |||
8.1. TLS Client | 8.1. TLS Client | |||
8.1.1. Receiving SCTs and inclusion proofs | 8.1.1. Receiving SCTs and Inclusion Proofs | |||
TLS clients receive SCTs and inclusion proofs alongside or in | TLS clients receive SCTs and inclusion proofs alongside or in | |||
certificates. CT-using TLS clients MUST implement all of the three | certificates. CT-using TLS clients MUST implement all of the three | |||
mechanisms by which TLS servers may present SCTs (see Section 6). | mechanisms by which TLS servers may present SCTs (see Section 6). | |||
TLS clients that support the "transparency_info" TLS extension (see | TLS clients that support the transparency_info TLS extension (see | |||
Section 6.5) SHOULD include it in ClientHello messages, with empty | Section 6.5) SHOULD include it in ClientHello messages, with empty | |||
"extension_data". If a TLS server includes the "transparency_info" | extension_data. If a TLS server includes the transparency_info TLS | |||
TLS extension when resuming a TLS session, the TLS client MUST abort | extension when resuming a TLS session, the TLS client MUST abort the | |||
the handshake. | handshake. | |||
8.1.2. Reconstructing the TBSCertificate | 8.1.2. Reconstructing the TBSCertificate | |||
Validation of an SCT for a certificate (where the "type" of the | Validation of an SCT for a certificate (where the type of the | |||
"TransItem" is "x509_sct_v2") uses the unmodified TBSCertificate | TransItem is x509_sct_v2) uses the unmodified TBSCertificate | |||
component of the certificate. | component of the certificate. | |||
Before an SCT for a precertificate (where the "type" of the | Before an SCT for a precertificate (where the type of the TransItem | |||
"TransItem" is "precert_sct_v2") can be validated, the TBSCertificate | is precert_sct_v2) can be validated, the TBSCertificate component of | |||
component of the precertificate needs to be reconstructed from the | the precertificate needs to be reconstructed from the TBSCertificate | |||
TBSCertificate component of the certificate as follows: | component of the certificate as follows: | |||
* Remove the Transparency Information extension (see Section 7.1). | * Remove the Transparency Information extension (see Section 7.1). | |||
* Remove embedded v1 SCTs, identified by OID 1.3.6.1.4.1.11129.2.4.2 | * Remove embedded v1 SCTs, identified by OID 1.3.6.1.4.1.11129.2.4.2 | |||
(see section 3.3 of [RFC6962]). This allows embedded v1 and v2 | (see Section 3.3 of [RFC6962]). This allows embedded v1 and v2 | |||
SCTs to co-exist in a certificate (see Appendix A). | SCTs to co-exist in a certificate (see Appendix A). | |||
8.1.3. Validating SCTs | 8.1.3. Validating SCTs | |||
In order to make use of a received SCT, the TLS client MUST first | In order to make use of a received SCT, the TLS client MUST first | |||
validate it as follows: | validate it as follows: | |||
* Compute the signature input by constructing a "TransItem" of type | * Compute the signature input by constructing a TransItem of type | |||
"x509_entry_v2" or "precert_entry_v2", depending on the SCT's | x509_entry_v2 or precert_entry_v2, depending on the SCT's | |||
"TransItem" type. The "TimestampedCertificateEntryDataV2" | TransItem type. The TimestampedCertificateEntryDataV2 structure | |||
structure is constructed in the following manner: | is constructed in the following manner: | |||
- "timestamp" is copied from the SCT. | - timestamp is copied from the SCT. | |||
- "tbs_certificate" is the reconstructed TBSCertificate portion | - tbs_certificate is the reconstructed TBSCertificate portion of | |||
of the server certificate, as described in Section 8.1.2. | the server certificate, as described in Section 8.1.2. | |||
- "issuer_key_hash" is computed as described in Section 4.7. | - issuer_key_hash is computed as described in Section 4.7. | |||
- "sct_extensions" is copied from the SCT. | - sct_extensions is copied from the SCT. | |||
* Verify the SCT's "signature" against the computed signature input | * Verify the SCT's signature against the computed signature input | |||
using the public key of the corresponding log, which is identified | using the public key of the corresponding log, which is identified | |||
by the "log_id". The required signature algorithm is one of the | by the log_id. The required signature algorithm is one of the | |||
log's parameters. | log's parameters. | |||
If the TLS client does not have the corresponding log's parameters, | If the TLS client does not have the corresponding log's parameters, | |||
it cannot attempt to validate the SCT. When evaluating compliance | it cannot attempt to validate the SCT. When evaluating compliance | |||
(see Section 8.1.6), the TLS client will consider only those SCTs | (see Section 8.1.6), the TLS client will consider only those SCTs | |||
that it was able to validate. | that it was able to validate. | |||
Note that SCT validation is not a substitute for the normal | Note that SCT validation is not a substitute for the normal | |||
validation of the server certificate and its chain. | validation of the server certificate and its chain. | |||
8.1.4. Fetching inclusion proofs | 8.1.4. Fetching Inclusion Proofs | |||
When a TLS client has validated a received SCT but does not yet | When a TLS client has validated a received SCT but does not yet | |||
possess a corresponding inclusion proof, the TLS client MAY request | possess a corresponding inclusion proof, the TLS client MAY request | |||
the inclusion proof directly from a log using "get-proof-by-hash" | the inclusion proof directly from a log using get-proof-by-hash | |||
(Section 5.4) or "get-all-by-hash" (Section 5.5). | (Section 5.4) or get-all-by-hash (Section 5.5). | |||
Note that fetching inclusion proofs directly from a log will disclose | Note that fetching inclusion proofs directly from a log will disclose | |||
to the log which TLS server the client has been communicating with. | to the log which TLS server the client has been communicating with. | |||
This may be regarded as a significant privacy concern, and so it is | This may be regarded as a significant privacy concern, and so it is | |||
preferable for the TLS server to send the inclusion proofs (see | preferable for the TLS server to send the inclusion proofs (see | |||
Section 6.4). | Section 6.4). | |||
8.1.5. Validating inclusion proofs | 8.1.5. Validating Inclusion Proofs | |||
When a TLS client has received, or fetched, an inclusion proof (and | When a TLS client has received, or fetched, an inclusion proof (and | |||
an STH), it SHOULD proceed to verifying the inclusion proof to the | an STH), it SHOULD proceed to verify the inclusion proof to the | |||
provided STH. The TLS client SHOULD also verify consistency between | provided STH. The TLS client SHOULD also verify consistency between | |||
the provided STH and an STH it knows about. | the provided STH and an STH it knows about. | |||
If the TLS client holds an STH that predates the SCT, it MAY, in the | If the TLS client holds an STH that predates the SCT, it MAY, in the | |||
process of auditing, request a new STH from the log (Section 5.2), | process of auditing, request a new STH from the log (Section 5.2) and | |||
then verify it by requesting a consistency proof (Section 5.3). Note | then verify it by requesting a consistency proof (Section 5.3). Note | |||
that if the TLS client uses "get-all-by-hash", then it will already | that if the TLS client uses get-all-by-hash, then it will already | |||
have the new STH. | have the new STH. | |||
8.1.6. Evaluating compliance | 8.1.6. Evaluating Compliance | |||
It is up to a client's local policy to specify the quantity and form | It is up to a client's local policy to specify the quantity and form | |||
of evidence (SCTs, inclusion proofs or a combination) needed to | of evidence (SCTs, inclusion proofs, or a combination) needed to | |||
achieve compliance and how to handle non-compliance. | achieve compliance and how to handle noncompliance. | |||
A TLS client can only evaluate compliance if it has given the TLS | 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 | server the opportunity to send SCTs and inclusion proofs by any of | |||
the three mechanisms that are mandatory to implement for CT-using TLS | the three mechanisms that are mandatory to implement for CT-using TLS | |||
clients (see Section 8.1.1). Therefore, a TLS client MUST NOT | clients (see Section 8.1.1). Therefore, a TLS client MUST NOT | |||
evaluate compliance if it did not include both the | evaluate compliance if it did not include both the transparency_info | |||
"transparency_info" and "status_request" TLS extensions in the | and status_request TLS extensions in the ClientHello. | |||
ClientHello. | ||||
8.2. Monitor | 8.2. Monitor | |||
Monitors watch logs to check that they behave correctly, for | Monitors watch logs to check for correct behavior, for certificates | |||
certificates of interest, or both. For example, a monitor may be | of interest, or for both. For example, a monitor may be configured | |||
configured to report on all certificates that apply to a specific | to report on all certificates that apply to a specific domain name | |||
domain name when fetching new entries for consistency validation. | when fetching new entries for consistency validation. | |||
A monitor MUST at least inspect every new entry in every log it | A monitor MUST at least inspect every new entry in every log it | |||
watches, and it MAY also choose to keep copies of entire logs. | watches, and it MAY also choose to keep copies of entire logs. | |||
To inspect all of the existing entries, the monitor SHOULD follow | To inspect all of the existing entries, the monitor SHOULD follow | |||
these steps once for each log: | these steps once for each log: | |||
1. Fetch the current STH (Section 5.2). | 1. Fetch the current STH (Section 5.2). | |||
2. Verify the STH signature. | 2. Verify the STH signature. | |||
skipping to change at page 44, line 49 ¶ | skipping to change at line 2033 ¶ | |||
4. If applicable, check each entry to see if it's a certificate of | 4. If applicable, check each entry to see if it's a certificate of | |||
interest. | interest. | |||
5. Confirm that the tree made from the fetched entries produces the | 5. Confirm that the tree made from the fetched entries produces the | |||
same hash as that in the STH. | same hash as that in the STH. | |||
To inspect new entries, the monitor SHOULD follow these steps | To inspect new entries, the monitor SHOULD follow these steps | |||
repeatedly for each log: | repeatedly for each log: | |||
1. Fetch the current STH (Section 5.2). Repeat until the STH | 1. Fetch the current STH (Section 5.2). Repeat until the STH | |||
changes. This document does not specify the polling frequency, | changes. To allow for experimentation, this document does not | |||
to allow for experimentation. | specify the polling frequency. | |||
2. Verify the STH signature. | 2. Verify the STH signature. | |||
3. Fetch all the new entries in the tree corresponding to the STH | 3. Fetch all the new entries in the tree corresponding to the STH | |||
(Section 5.6). If they remain unavailable for an extended | (Section 5.6). If they remain unavailable for an extended | |||
period, then this should be viewed as misbehavior on the part of | period, then this should be viewed as misbehavior on the part of | |||
the log. | the log. | |||
4. If applicable, check each entry to see if it's a certificate of | 4. If applicable, check each entry to see if it's a certificate of | |||
interest. | interest. | |||
5. Either: | 5. Either: | |||
1. Verify that the updated list of all entries generates a tree | a. Verify that the updated list of all entries generates a tree | |||
with the same hash as the new STH. | with the same hash as the new STH. | |||
Or, if it is not keeping all log entries: | Or, if it is not keeping all log entries: | |||
1. Fetch a consistency proof for the new STH with the previous | a. Fetch a consistency proof for the new STH with the previous | |||
STH (Section 5.3). | STH (Section 5.3). | |||
2. Verify the consistency proof. | b. Verify the consistency proof. | |||
3. Verify that the new entries generate the corresponding | c. Verify that the new entries generate the corresponding | |||
elements in the consistency proof. | elements in the consistency proof. | |||
6. Repeat from step 1. | 6. Repeat from Step 1. | |||
8.3. Auditing | 8.3. Auditing | |||
Auditing ensures that the current published state of a log is | Auditing ensures that the current published state of a log is | |||
reachable from previously published states that are known to be good, | reachable 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 | and that the promises made by the log, in the form of SCTs, have been | |||
kept. Audits are performed by monitors or TLS clients. | kept. Audits are performed by monitors or TLS clients. | |||
In particular, there are four log behavior properties that should be | In particular, there are four properties of log behavior that should | |||
checked: | be checked: | |||
* The Maximum Merge Delay (MMD). | * the Maximum Merge Delay (MMD) | |||
* The STH Frequency Count. | * the STH Frequency Count | |||
* The append-only property. | * the append-only property | |||
* The consistency of the log view presented to all query sources. | * the consistency of the log view presented to all query sources | |||
A benign, conformant log publishes a series of STHs over time, each | A benign, conformant log publishes a series of STHs over time, each | |||
derived from the previous STH and the submitted entries incorporated | derived from the previous STH and the submitted entries incorporated | |||
into the log since publication of the previous STH. This can be | into the log since publication of the previous STH. This can be | |||
proven through auditing of STHs. SCTs returned to TLS clients can be | proven through auditing of STHs. SCTs returned to TLS clients can be | |||
audited by verifying against the accompanying certificate, and using | audited by verifying against the accompanying certificate and using | |||
Merkle Inclusion Proofs, against the log's Merkle tree. | Merkle inclusion proofs against the log's Merkle Tree. | |||
The action taken by the auditor if an audit fails is not specified, | The action taken by the auditor, if an audit fails, is not specified, | |||
but note that in general if audit fails, the auditor is in possession | but note that in general, if an audit fails, the auditor is in | |||
of signed proof of the log's misbehavior. | possession of signed proof of the log's misbehavior. | |||
A monitor (Section 8.2) can audit by verifying the consistency of | A monitor (Section 8.2) can audit by verifying the consistency of | |||
STHs it receives, ensure that each entry can be fetched and that the | STHs it receives, ensuring that each entry can be fetched and that | |||
STH is indeed the result of making a tree from all fetched entries. | the STH is indeed the result of making a tree from all fetched | |||
entries. | ||||
A TLS client (Section 8.1) can audit by verifying an SCT against any | A TLS client (Section 8.1) can audit by verifying an SCT against any | |||
STH dated after the SCT timestamp + the Maximum Merge Delay by | STH dated after the SCT timestamp + the Maximum Merge Delay by | |||
requesting a Merkle inclusion proof (Section 5.4). It can also | requesting a Merkle inclusion proof (Section 5.4). It can also | |||
verify that the SCT corresponds to the server certificate it arrived | verify that the SCT corresponds to the server certificate it arrived | |||
with (i.e., the log entry is that certificate, or is a precertificate | with (i.e., the log entry is that certificate or is a precertificate | |||
corresponding to that certificate). | corresponding to that certificate). | |||
Checking of the consistency of the log view presented to all entities | Checking of the consistency of the log view presented to all entities | |||
is more difficult to perform because it requires a way to share log | is more difficult to perform because it requires a way to share log | |||
responses among a set of CT-using entities, and is discussed in | responses among a set of CT-using entities and is discussed in | |||
Section 11.3. | Section 11.3. | |||
9. Algorithm Agility | 9. Algorithm Agility | |||
It is not possible for a log to change any of its algorithms part way | It is not possible for a log to change either of its algorithms part | |||
through its lifetime: | way through its lifetime: | |||
Signature algorithm: SCT signatures must remain valid so signature | Signature algorithm: SCT signatures must remain valid so signature | |||
algorithms can only be added, not removed. | algorithms can only be added, not removed. | |||
Hash algorithm: A log would have to support the old and new hash | Hash algorithm: A log would have to support the old and new hash | |||
algorithms to allow backwards-compatibility with clients that are | algorithms to allow backwards compatibility with clients that are | |||
not aware of a hash algorithm change. | not aware of a hash algorithm change. | |||
Allowing multiple signature or hash algorithms for a log would | Allowing multiple signature or hash algorithms for a log would | |||
require that all data structures support it and would significantly | require that all data structures support it and would significantly | |||
complicate client implementation, which is why it is not supported by | complicate client implementation, which is why it is not supported by | |||
this document. | this document. | |||
If it should become necessary to deprecate an algorithm used by a | If it should become necessary to deprecate an algorithm used by a | |||
live log, then the log MUST be frozen as specified in Section 4.13 | live log, then the log MUST be frozen, as specified in Section 4.13, | |||
and a new log SHOULD be started. Certificates in the frozen log that | and a new log SHOULD be started. Certificates in the frozen log that | |||
have not yet expired and require new SCTs SHOULD be submitted to the | have not yet expired and require new SCTs SHOULD be submitted to the | |||
new log and the SCTs from that log used instead. | new log and the SCTs from that log used instead. | |||
10. IANA Considerations | 10. IANA Considerations | |||
The assignment policy criteria mentioned in this section refer to the | The assignment policy criteria mentioned in this section refer to the | |||
policies outlined in [RFC8126]. | policies outlined in [RFC8126]. | |||
10.1. Additions to existing registries | 10.1. Additions to Existing Registries | |||
This sub-section defines additions to existing registries. | This subsection defines additions to existing registries. | |||
10.1.1. New Entry to the TLS ExtensionType Registry | 10.1.1. New Entry to the TLS ExtensionType Registry | |||
IANA is asked to add the following entry to the "TLS ExtensionType | IANA has added the following entry to the "TLS ExtensionType Values" | |||
Values" registry defined in [RFC8446], with an assigned Value: | registry defined in [RFC8446], with an assigned Value: | |||
+=======+===================+============+=============+===========+ | +=====+===================+===+===========+=============+===========+ | |||
| Value | Extension Name | TLS 1.3 | Recommended | Reference | | |Value| Extension Name |TLS| DTLS-Only | Recommended | Reference | | |||
+=======+===================+============+=============+===========+ | | | |1.3| | | | | |||
| TBD | transparency_info | CH, CR, CT | Y | RFCXXXX | | +=====+===================+===+===========+=============+===========+ | |||
+-------+-------------------+------------+-------------+-----------+ | |52 | transparency_info |CH,| N | Y | RFC 9162 | | |||
| | |CR,| | | | | ||||
| | |CT | | | | | ||||
+-----+-------------------+---+-----------+-------------+-----------+ | ||||
Table 7 | Table 7 | |||
10.1.2. URN Sub-namespace for TRANS (urn:ietf:params:trans) | 10.1.2. URN Sub-namespace for TRANS (urn:ietf:params:trans) | |||
IANA is requested to add a new entry in the "IETF URN Sub-namespace | IANA has added a new entry in the "IETF URN Sub-namespace for | |||
for Registered Protocol Parameter Identifiers" registry, following | Registered Protocol Parameter Identifiers" registry, following the | |||
the template in [RFC3553]: | template in [RFC3553]: | |||
Registry name: trans | Registry name: trans | |||
Specification: RFC 9162 | ||||
Repository: <https://www.iana.org/assignments/trans> | ||||
Index value: No transformation needed. | ||||
Specification: RFCXXXX | 10.2. New CT-Related Registries | |||
Repository: https://www.iana.org/assignments/trans | IANA has added a new protocol registry, "Public Notary Transparency", | |||
to the list that appears at <https://www.iana.org/assignments/> | ||||
Index value: No transformation needed. | The rest of this section defines the subregistries that have been | |||
created within the new "Public Notary Transparency" registry. | ||||
10.2. New CT-Related registries | 10.2.1. Hash Algorithms | |||
IANA is requested to add a new protocol registry, "Public Notary | IANA has established a registry of hash algorithm values, named "Hash | |||
Transparency", to the list that appears at https://www.iana.org/ | Algorithms", with the following registration procedures: | |||
assignments/ | ||||
The rest of this section defines sub-registries to be created within | ||||
the new Public Notary Transparency registry. | ||||
10.2.1. Hash Algorithms | +===========+=========================+ | |||
| Range | Registration Procedures | | ||||
+===========+=========================+ | ||||
| 0x00-0xDF | Specification Required | | ||||
+-----------+-------------------------+ | ||||
| 0xE0-0xEF | Experimental Use | | ||||
+-----------+-------------------------+ | ||||
| 0xF0-0xFF | Private Use | | ||||
+-----------+-------------------------+ | ||||
IANA is asked to establish a registry of hash algorithm values, named | Table 8 | |||
"Hash Algorithms", that initially consists of: | ||||
+========+============+========================+===================+ | The "Hash Algorithms" registry initially consists of: | |||
| Value | Hash | OID | Reference / | | ||||
| | Algorithm | | Assignment Policy | | ||||
+========+============+========================+===================+ | ||||
| 0x00 | SHA-256 | 2.16.840.1.101.3.4.2.1 | [RFC6234] | | ||||
+--------+------------+------------------------+-------------------+ | ||||
| 0x01 - | Unassigned | | Specification | | ||||
| 0xDF | | | Required | | ||||
+--------+------------+------------------------+-------------------+ | ||||
| 0xE0 - | Reserved | | Experimental Use | | ||||
| 0xEF | | | | | ||||
+--------+------------+------------------------+-------------------+ | ||||
| 0xF0 - | Reserved | | Private Use | | ||||
| 0xFF | | | | | ||||
+--------+------------+------------------------+-------------------+ | ||||
Table 8 | +========+==================+========================+===========+ | |||
| Value | Hash Algorithm | OID | Reference | | ||||
+========+==================+========================+===========+ | ||||
| 0x00 | SHA-256 | 2.16.840.1.101.3.4.2.1 | [RFC6234] | | ||||
+--------+------------------+------------------------+-----------+ | ||||
| 0x01 - | Unassigned | | RFC 9162 | | ||||
| 0xDF | | | | | ||||
+--------+------------------+------------------------+-----------+ | ||||
| 0xE0 - | Reserved for | | RFC 9162 | | ||||
| 0xEF | Experimental Use | | | | ||||
+--------+------------------+------------------------+-----------+ | ||||
| 0xF0 - | Reserved for | | RFC 9162 | | ||||
| 0xFF | Private Use | | | | ||||
+--------+------------------+------------------------+-----------+ | ||||
The Designated Expert(s) should ensure that the proposed algorithm | Table 9 | |||
The designated expert(s) should ensure that the proposed algorithm | ||||
has a public specification and is suitable for use as a cryptographic | has a public specification and is suitable for use as a cryptographic | |||
hash algorithm with no known preimage or collision attacks. These | hash algorithm with no known preimage or collision attacks. These | |||
attacks can damage the integrity of the log. | attacks can damage the integrity of the log. | |||
10.2.2. Signature Algorithms | 10.2.2. Signature Algorithms | |||
IANA is asked to establish a registry of signature algorithm values, | IANA has established a registry of signature algorithm values, named | |||
named "Signature Algorithms". | "Signature Algorithms". | |||
The following notes should be added: | The following notes have been added to the registry: | |||
* This is a subset of the TLS SignatureScheme Registry, limited to | | *Note:* | |||
those algorithms that are appropriate for CT. A major advantage | | This is a subset of the "TLS SignatureScheme" registry, limited | |||
of this is leveraging the expertise of the TLS working group and | | to those algorithms that are appropriate for CT. A major | |||
its Designated Expert(s). | | advantage of this is leveraging the expertise of the TLS | |||
| Working Group and its designated expert(s). | ||||
* The value "0x0403" appears twice. While this may be confusing, it | | *Note:* | |||
is okay because the verification process is the same for both | | The value 0x0403 appears twice. While this may be confusing, | |||
algorithms, and the choice of which to use when generating a | | it is okay because the verification process is the same for | |||
signature is purely internal to the log server. | | both algorithms, and the choice of which to use when generating | |||
| a signature is purely internal to the log server. | ||||
The registry should initially consist of: | The "Signature Algorithms" registry has the following registration | |||
procedures: | ||||
+================================+==================+===============+ | +===============+=========================+ | |||
| SignatureScheme Value | Signature | Reference / | | | Range | Registration Procedures | | |||
| | Algorithm | Assignment | | +===============+=========================+ | |||
| | | Policy | | | 0x0000-0x0807 | Specification Required | | |||
+================================+==================+===============+ | +---------------+-------------------------+ | |||
| 0x0000 - 0x0402 | Unassigned | Specification | | | 0x0808-0xFDFF | Expert Review | | |||
| | | Required | | +---------------+-------------------------+ | |||
+--------------------------------+------------------+---------------+ | | 0xFE00-0xFEFF | Experimental Use | | |||
| ecdsa_secp256r1_sha256(0x0403) | ECDSA (NIST | [FIPS186-4] | | +---------------+-------------------------+ | |||
| | P-256) with | | | | 0xFF00-0xFFFF | Private Use | | |||
| | SHA-256 | | | +---------------+-------------------------+ | |||
+--------------------------------+------------------+---------------+ | ||||
| ecdsa_secp256r1_sha256(0x0403) | Deterministic | [RFC6979] | | ||||
| | ECDSA (NIST | | | ||||
| | P-256) with | | | ||||
| | HMAC-SHA256 | | | ||||
+--------------------------------+------------------+---------------+ | ||||
| 0x0404 - 0x0806 | Unassigned | Specification | | ||||
| | | Required | | ||||
+--------------------------------+------------------+---------------+ | ||||
| ed25519(0x0807) | Ed25519 | [RFC8032] | | ||||
| | (PureEdDSA | | | ||||
| | with the | | | ||||
| | edwards25519 | | | ||||
| | curve) | | | ||||
+--------------------------------+------------------+---------------+ | ||||
| 0x0808 - 0xFDFF | Unassigned | Expert Review | | ||||
+--------------------------------+------------------+---------------+ | ||||
| 0xFE00 - 0xFEFF | Reserved | Experimental | | ||||
| | | Use | | ||||
+--------------------------------+------------------+---------------+ | ||||
| 0xFF00 - 0xFFFF | Reserved | Private Use | | ||||
+--------------------------------+------------------+---------------+ | ||||
Table 9 | Table 10 | |||
The Designated Expert(s) should ensure that the proposed algorithm | The "Signature Algorithms" registry initially consists of: | |||
has a public specification, has a value assigned to it in the TLS | ||||
SignatureScheme Registry (that IANA was asked to establish in | +========================+===========================+=============+ | |||
[RFC8446]), and is suitable for use as a cryptographic signature | | SignatureScheme Value | Signature Algorithm | Reference | | |||
algorithm. | +========================+===========================+=============+ | |||
| 0x0000 - 0x0402 | Unassigned | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| ecdsa_secp256r1_sha256 | ECDSA (NIST P-256) with | [FIPS186-4] | | ||||
| (0x0403) | SHA-256 | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| ecdsa_secp256r1_sha256 | Deterministic ECDSA (NIST | [RFC6979] | | ||||
| (0x0403) | P-256) with HMAC-SHA256 | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| 0x0404 - 0x0806 | Unassigned | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| ed25519 (0x0807) | Ed25519 (PureEdDSA with | [RFC8032] | | ||||
| | the edwards25519 curve) | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| 0x0808 - 0xFDFF | Unassigned | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| 0xFE00 - 0xFEFF | Reserved for Experimental | RFC 9162 | | ||||
| | Use | | | ||||
+------------------------+---------------------------+-------------+ | ||||
| 0xFF00 - 0xFFFF | Reserved for Private Use | RFC 9162 | | ||||
+------------------------+---------------------------+-------------+ | ||||
Table 11 | ||||
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 [RFC8446]), and | ||||
is suitable for use as a cryptographic signature algorithm. | ||||
10.2.3. VersionedTransTypes | 10.2.3. VersionedTransTypes | |||
IANA is asked to establish a registry of "VersionedTransType" values, | IANA has established a registry of VersionedTransType values, named | |||
named "VersionedTransTypes". | "VersionedTransTypes". | |||
The following note should be added: | The following note has been added: | |||
* The range 0x0000..0x00FF is reserved so that v1 SCTs are | | *Note:* | |||
distinguishable from v2 SCTs and other "TransItem" structures. | | The range 0x0000..0x00FF is reserved so that v1 SCTs are | |||
| distinguishable from v2 SCTs and other TransItem structures. | ||||
The registry should initially consist of: | The registration procedures for the "VersionedTransTypes" registry | |||
are the following: | ||||
+==========+======================+===============================+ | +===============+=========================+ | |||
| Value | Type and Version | Reference / Assignment Policy | | | Range | Registration Procedures | | |||
+==========+======================+===============================+ | +===============+=========================+ | |||
| 0x0000 - | Reserved | [RFC6962] | | | 0x0100-0xDFFF | Specification Required | | |||
| 0x00FF | | | | +---------------+-------------------------+ | |||
+----------+----------------------+-------------------------------+ | | 0xE000-0xEFFF | Experimental Use | | |||
| 0x0100 | x509_entry_v2 | RFCXXXX | | +---------------+-------------------------+ | |||
+----------+----------------------+-------------------------------+ | | 0xF000-0xFFFF | Private Use | | |||
| 0x0101 | precert_entry_v2 | RFCXXXX | | +---------------+-------------------------+ | |||
+----------+----------------------+-------------------------------+ | ||||
| 0x0102 | x509_sct_v2 | RFCXXXX | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0x0103 | precert_sct_v2 | RFCXXXX | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0x0104 | signed_tree_head_v2 | RFCXXXX | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0x0105 | consistency_proof_v2 | RFCXXXX | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0x0106 | inclusion_proof_v2 | RFCXXXX | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0x0107 - | Unassigned | Specification Required | | ||||
| 0xDFFF | | | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0xE000 - | Reserved | Experimental Use | | ||||
| 0xEFFF | | | | ||||
+----------+----------------------+-------------------------------+ | ||||
| 0xF000 - | Reserved | Private Use | | ||||
| 0xFFFF | | | | ||||
+----------+----------------------+-------------------------------+ | ||||
Table 10 | Table 12 | |||
The Designated Expert(s) should review the public specification to | The "VersionedTransTypes" registry initially consists of: | |||
+=================+===============================+===========+ | ||||
| Value | Type and Version | Reference | | ||||
+=================+===============================+===========+ | ||||
| 0x0000 - 0x00FF | Reserved | [RFC6962] | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0100 | x509_entry_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0101 | precert_entry_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0102 | x509_sct_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0103 | precert_sct_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0104 | signed_tree_head_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0105 | consistency_proof_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0106 | inclusion_proof_v2 | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0x0107 - 0xDFFF | Unassigned | | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0xE000 - 0xEFFF | Reserved for Experimental Use | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
| 0xF000 - 0xFFFF | Reserved for Private Use | RFC 9162 | | ||||
+-----------------+-------------------------------+-----------+ | ||||
Table 13 | ||||
The designated expert(s) should review the public specification to | ||||
ensure that it is detailed enough to ensure implementation | ensure that it is detailed enough to ensure implementation | |||
interoperability. | interoperability. | |||
10.2.4. Log Artifact Extension Registry | 10.2.4. Log Artifact Extensions | |||
IANA is asked to establish a registry of "ExtensionType" values, | IANA has established a registry of ExtensionType values, named "Log | |||
named "Log Artifact Extensions", that initially consists of: | Artifact Extensions". | |||
+===============+============+=====+===============================+ | The registration procedures for the "Log Artifact Extensions" | |||
| ExtensionType | Status | Use | Reference / Assignment Policy | | registry are the following: | |||
+===============+============+=====+===============================+ | ||||
| 0x0000 - | Unassigned | n/a | Specification Required | | ||||
| 0xDFFF | | | | | ||||
+---------------+------------+-----+-------------------------------+ | ||||
| 0xE000 - | Reserved | n/a | Experimental Use | | ||||
| 0xEFFF | | | | | ||||
+---------------+------------+-----+-------------------------------+ | ||||
| 0xF000 - | Reserved | n/a | Private Use | | ||||
| 0xFFFF | | | | | ||||
+---------------+------------+-----+-------------------------------+ | ||||
Table 11 | +===============+=========================+ | |||
| Range | Registration Procedures | | ||||
+===============+=========================+ | ||||
| 0x0000-0xDFFF | Specification Required | | ||||
+---------------+-------------------------+ | ||||
| 0xE000-0xEFFF | Experimental Use | | ||||
+---------------+-------------------------+ | ||||
| 0xF000-0xFFFF | Private Use | | ||||
+---------------+-------------------------+ | ||||
Table 14 | ||||
The "Log Artifact Extensions" registry initially consists of: | ||||
+=================+===============================+=====+===========+ | ||||
| ExtensionType | Status | Use | Reference | | ||||
+=================+===============================+=====+===========+ | ||||
| 0x0000 - 0xDFFF | Unassigned | n/a | | | ||||
+-----------------+-------------------------------+-----+-----------+ | ||||
| 0xE000 - 0xEFFF | Reserved for | n/a | RFC 9162 | | ||||
| | Experimental Use | | | | ||||
+-----------------+-------------------------------+-----+-----------+ | ||||
| 0xF000 - 0xFFFF | Reserved for | n/a | RFC 9162 | | ||||
| | Private Use | | | | ||||
+-----------------+-------------------------------+-----+-----------+ | ||||
Table 15 | ||||
The "Use" column should contain one or both of the following values: | The "Use" column should contain one or both of the following values: | |||
* "SCT", for extensions specified for use in Signed Certificate | * "SCT", for extensions specified for use in Signed Certificate | |||
Timestamps. | Timestamps. | |||
* "STH", for extensions specified for use in Signed Tree Heads. | * "STH", for extensions specified for use in Signed Tree Heads. | |||
The Designated Expert(s) should review the public specification to | The designated expert(s) should review the public specification to | |||
ensure that it is detailed enough to ensure implementation | ensure that it is detailed enough to ensure implementation | |||
interoperability. They should also verify that the extension is | interoperability. They should also verify that the extension is | |||
appropriate to the contexts in which it is specified to be used (SCT, | appropriate to the contexts in which it is specified to be used (SCT, | |||
STH, or both). | STH, or both). | |||
10.2.5. Log IDs Registry | 10.2.5. Log IDs | |||
IANA is asked to establish a registry of Log IDs, named "Log IDs", | IANA has established a registry of Log IDs, named "Log IDs". | |||
that initially consists of: | ||||
+================+==============+==============+===================+ | The registry's registration procedure is First Come First Served. | |||
| Log ID | Log Base URL | Log Operator | Reference / | | ||||
| | | | Assignment Policy | | ||||
+================+==============+==============+===================+ | ||||
| 1.3.101.8192 - | Unassigned | Unassigned | First Come First | | ||||
| 1.3.101.16383 | | | Served | | ||||
+----------------+--------------+--------------+-------------------+ | ||||
| 1.3.101.80.0 - | Unassigned | Unassigned | First Come First | | ||||
| 1.3.101.80.* | | | Served | | ||||
+----------------+--------------+--------------+-------------------+ | ||||
Table 12 | The "Log IDs" registry initially consists of: | |||
All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have been | +================+==============+==============+===========+ | |||
set aside for Log IDs. This is a limited resource of 8,192 OIDs, | | Log ID | Log Base URL | Log Operator | Reference | | |||
each of which has an encoded length of 4 octets. | +================+==============+==============+===========+ | |||
| 1.3.101.8192 - | Unassigned | Unassigned | | | ||||
| 1.3.101.16383 | | | | | ||||
+----------------+--------------+--------------+-----------+ | ||||
| 1.3.101.80.0 - | Unassigned | Unassigned | | | ||||
| 1.3.101.80.* | | | | | ||||
+----------------+--------------+--------------+-----------+ | ||||
The 1.3.101.80 arc has also been set aside for Log IDs. This is an | Table 16 | |||
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 4 octets. | The following notes have been added to the registry: | |||
| *Note:* | ||||
| All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have | ||||
| been set aside for Log IDs. This is a limited resource of | ||||
| 8,192 OIDs, each of which has an encoded length of 4 octets. | ||||
| *Note:* | ||||
| The 1.3.101.80 arc has also been set aside for Log IDs. 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 4 | ||||
| octets. | ||||
Each application for the allocation of a Log ID MUST be accompanied | Each application for the allocation of a Log ID MUST be accompanied | |||
by: | by: | |||
* the Log's Base URL (see Section 4.1). | * the Log's Base URL (see Section 4.1) and | |||
* the Log Operator's contact details. | * the Log Operator's contact details. | |||
IANA is asked to reject any request to update a Log ID or Log Base | IANA is asked to reject any request to update a Log ID or Log Base | |||
URL in this registry, because these fields are immutable (see | URL in this registry because these fields are immutable (see | |||
Section 4.1). | Section 4.1). | |||
IANA is asked to accept requests from log operators to update their | IANA is asked to accept requests from log operators to update their | |||
contact details in this registry. | contact details in this registry. | |||
Since log operators can choose to not use this registry (see | Since log operators can choose to not use this registry (see | |||
Section 4.4), it is not expected to be a global directory of all | Section 4.4), it is not expected to be a global directory of all | |||
logs. | logs. | |||
10.2.6. Error Types Registry | 10.2.6. Error Types | |||
IANA is requested to create a new registry for errors, the "Error | IANA has created a new registry for errors, the "Error Types" | |||
Types" registry. | registry. | |||
Requirements for this registry are Specification Required. | The registration procedure for this registry is Specification | |||
Required. | ||||
This registry should have the following three fields: | This registry has the following three fields: | |||
+============+========+===========+ | +============+========+===========+ | |||
| Field Name | Type | Reference | | | Field Name | Type | Reference | | |||
+============+========+===========+ | +============+========+===========+ | |||
| identifier | string | RFCXXXX | | | Identifier | string | RFC 9162 | | |||
+------------+--------+-----------+ | +------------+--------+-----------+ | |||
| meaning | string | RFCXXXX | | | Meaning | string | RFC 9162 | | |||
+------------+--------+-----------+ | +------------+--------+-----------+ | |||
| reference | string | RFCXXXX | | | Reference | string | RFC 9162 | | |||
+------------+--------+-----------+ | +------------+--------+-----------+ | |||
Table 13 | Table 17 | |||
The initial values are as follows, taken from the text above: | The initial values of the "Error Types" registry, which are taken | |||
from the text in Section 5, are as follows: | ||||
+===================+===============================+===========+ | +===================+===================================+===========+ | |||
| Identifier | Meaning | Reference | | | Identifier | Meaning | Reference | | |||
+===================+===============================+===========+ | +===================+===================================+===========+ | |||
| malformed | The request could not be | RFCXXXX | | | malformed | The request could not be | RFC 9162 | | |||
| | parsed. | | | | | parsed. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| badSubmission | "submission" is neither a | RFCXXXX | | | badSubmission | submission is neither a | RFC 9162 | | |||
| | valid certificate nor a valid | | | | | valid certificate nor a | | | |||
| | precertificate | | | | | valid precertificate. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| badType | "type" is neither 1 nor 2 | RFCXXXX | | | badType | type is neither 1 nor 2. | RFC 9162 | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| badChain | The first element of "chain" | RFCXXXX | | | badChain | The first element of chain | RFC 9162 | | |||
| | is not the certifier of the | | | | | is not the certifier of the | | | |||
| | "submission", or the second | | | | | submission, or the second | | | |||
| | element does not certify the | | | | | element does not certify the | | | |||
| | first, etc. | | | | | first, etc. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| badCertificate | One or more certificates in | RFCXXXX | | | badCertificate | One or more certificates in | RFC 9162 | | |||
| | the "chain" are not valid | | | | | chain are not valid (e.g., | | | |||
| | (e.g., not properly encoded) | | | | | not properly encoded). | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| unknownAnchor | The last element of "chain" | RFCXXXX | | | unknownAnchor | The last element of chain | RFC 9162 | | |||
| | (or, if "chain" is an empty | | | | | (or, if chain is an empty | | | |||
| | array, the "submission") both | | | | | array, the submission) is | | | |||
| | is not, and is not certified | | | | | not, nor is it certified by, | | | |||
| | by, an accepted trust anchor | | | | | an accepted trust anchor. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| shutdown | The log is no longer | RFCXXXX | | | shutdown | The log is no longer | RFC 9162 | | |||
| | accepting submissions | | | | | accepting submissions. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| firstUnknown | "first" is before the latest | RFCXXXX | | | firstUnknown | first is before the latest | RFC 9162 | | |||
| | known STH but is not from an | | | | | known STH but is not from an | | | |||
| | existing STH. | | | | | existing STH. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| secondUnknown | "second" is before the latest | RFCXXXX | | | secondUnknown | second is before the latest | RFC 9162 | | |||
| | known STH but is not from an | | | | | known STH but is not from an | | | |||
| | existing STH. | | | | | existing STH. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| secondBeforeFirst | "second" is smaller than | RFCXXXX | | | secondBeforeFirst | second is smaller than | RFC 9162 | | |||
| | "first". | | | | | first. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| hashUnknown | "hash" is not the hash of a | RFCXXXX | | | hashUnknown | hash is not the hash of a | RFC 9162 | | |||
| | known leaf (may be caused by | | | | | known leaf (may be caused by | | | |||
| | skew or by a known | | | | | skew or by a known | | | |||
| | certificate not yet merged). | | | | | certificate not yet merged). | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| treeSizeUnknown | "hash" is before the latest | RFCXXXX | | | treeSizeUnknown | hash is before the latest | RFC 9162 | | |||
| | known STH but is not from an | | | | | known STH but is not from an | | | |||
| | existing STH. | | | | | existing STH. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| startUnknown | "start" is greater than the | RFCXXXX | | | startUnknown | start is greater than the | RFC 9162 | | |||
| | number of entries in the | | | | | number of entries in the | | | |||
| | Merkle tree. | | | | | Merkle Tree. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
| endBeforeStart | "start" cannot be greater | RFCXXXX | | | endBeforeStart | start cannot be greater than | RFC 9162 | | |||
| | than "end". | | | | | end. | | | |||
+-------------------+-------------------------------+-----------+ | +-------------------+-----------------------------------+-----------+ | |||
Table 14 | Table 18 | |||
10.3. OID Assignment | 10.3. OID Assignment | |||
IANA is asked to assign one object identifier from the "SMI Security | IANA has assigned an object identifier from the "SMI Security for | |||
for PKIX Module Identifier" registry to identify the ASN.1 module in | PKIX Module Identifier" registry to identify the ASN.1 module in | |||
Appendix B of this document with an assigned Decimal value. | Appendix B of this document. | |||
+=========+=========================+============+ | +=========+=========================+============+ | |||
| Decimal | Description | References | | | Decimal | Description | References | | |||
+=========+=========================+============+ | +=========+=========================+============+ | |||
| TBD | id-mod-public-notary-v2 | RFCXXXX | | | 102 | id-mod-public-notary-v2 | RFC 9162 | | |||
+---------+-------------------------+------------+ | +---------+-------------------------+------------+ | |||
Table 15 | Table 19 | |||
11. Security Considerations | 11. Security Considerations | |||
With CAs, logs, and servers performing the actions described here, | With CAs, logs, and servers performing the actions described here, | |||
TLS clients can use logs and signed timestamps to reduce the | TLS clients can use logs and signed timestamps to reduce the | |||
likelihood that they will accept misissued certificates. If a server | likelihood that they will accept misissued certificates. If a server | |||
presents a valid signed timestamp for a certificate, then the client | presents a valid signed timestamp for a certificate, then the client | |||
knows that a log has committed to publishing the certificate. From | knows that a log has committed to publishing the certificate. From | |||
this, the client knows that monitors acting for the subject of the | this, the client knows that monitors acting for the subject of the | |||
certificate have had some time to notice the misissuance and take | certificate have had some time to notice the misissuance and take | |||
some action, such as asking a CA to revoke a misissued certificate. | some action, such as asking a CA to revoke a misissued certificate. | |||
A signed timestamp does not guarantee this though, since appropriate | A signed timestamp does not guarantee this, though, since appropriate | |||
monitors might not have checked the logs or the CA might have refused | monitors might not have checked the logs or the CA might have refused | |||
to revoke the certificate. | to revoke the certificate. | |||
In addition, if TLS clients will not accept unlogged certificates, | In addition, if TLS clients will not accept unlogged certificates, | |||
then site owners will have a greater incentive to submit certificates | then site owners will have a greater incentive to submit certificates | |||
to logs, possibly with the assistance of their CA, increasing the | to logs, possibly with the assistance of their CA, increasing the | |||
overall transparency of the system. | overall transparency of the system. | |||
11.1. Misissued Certificates | 11.1. Misissued Certificates | |||
skipping to change at page 55, line 24 ¶ | skipping to change at line 2584 ¶ | |||
is twice the MMD. | is twice the MMD. | |||
11.2. Detection of Misissue | 11.2. Detection of Misissue | |||
The logs do not themselves detect misissued certificates; they rely | The logs do not themselves detect misissued certificates; they rely | |||
instead on interested parties, such as domain owners, to monitor them | instead on interested parties, such as domain owners, to monitor them | |||
and take corrective action when a misissue is detected. | and take corrective action when a misissue is detected. | |||
11.3. Misbehaving Logs | 11.3. Misbehaving Logs | |||
A log can misbehave in several ways. Examples include: failing to | A log can misbehave in several ways. Examples include the following: | |||
incorporate a certificate with an SCT in the Merkle Tree within the | failing to incorporate a certificate with an SCT in the Merkle Tree | |||
MMD; presenting different, conflicting views of the Merkle Tree at | within the MMD; presenting different, conflicting views of the Merkle | |||
different times and/or to different parties; issuing STHs too | Tree at different times and/or to different parties; issuing STHs too | |||
frequently; mutating the signature of a logged certificate; and | frequently; mutating the signature of a logged certificate; and | |||
failing to present a chain containing the certifier of a logged | failing to present a chain containing the certifier of a logged | |||
certificate. | certificate. | |||
Violation of the MMD contract is detected by log clients requesting a | Violation of the MMD contract is detected by log clients requesting a | |||
Merkle inclusion proof (Section 5.4) for each observed SCT. These | Merkle inclusion proof (Section 5.4) for each observed SCT. These | |||
checks can be asynchronous and need only be done once per | checks can be asynchronous and need only be done once per | |||
certificate. However, note that there may be privacy concerns (see | certificate. However, note that there may be privacy concerns (see | |||
Section 8.1.4). | Section 8.1.4). | |||
Violation of the append-only property or the STH issuance rate limit | Violation of the append-only property or the STH issuance rate limit | |||
can be detected by multiple clients comparing their instances of the | can be detected by multiple clients comparing their instances of the | |||
STHs. This technique, known as "gossip," is an active area of | STHs. This technique, known as "gossip", is an active area of | |||
research and not defined here. Proof of misbehavior in such cases | research and not defined here. Proof of misbehavior in such cases | |||
would be: a series of STHs that were issued too closely together, | would be either a series of STHs that were issued too closely | |||
proving violation of the STH issuance rate limit; or an STH with a | together, proving violation of the STH issuance rate limit, or an STH | |||
root hash that does not match the one calculated from a copy of the | with a root hash that does not match the one calculated from a copy | |||
log, proving violation of the append-only property. | of the log, proving violation of the append-only property. | |||
Clients that report back SCTs can be tracked or traced if a log | 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 | produces multiple STHs or SCTs with the same timestamp and data but | |||
different signatures. Logs SHOULD mitigate this risk by either: | different signatures. Logs SHOULD mitigate this risk by either: | |||
* Using deterministic signature schemes, or | * using deterministic signature schemes or | |||
* Producing no more than one SCT for each distinct submission and no | ||||
* producing no more than one SCT for each distinct submission and no | ||||
more than one STH for each distinct tree_size. Each of these SCTs | more than one STH for each distinct tree_size. Each of these SCTs | |||
and STHs can be stored by the log and served to other clients that | and STHs can be stored by the log and served to other clients that | |||
submit the same certificate or request the same STH. | submit the same certificate or request the same STH. | |||
11.4. Multiple SCTs | 11.4. Multiple SCTs | |||
By requiring TLS servers to offer multiple SCTs, each from a | By requiring TLS servers to offer multiple SCTs, each from a | |||
different log, TLS clients reduce the effectiveness of an attack | different log, TLS clients reduce the effectiveness of an attack | |||
where a CA and a log collude (see Section 6.2). | where a CA and a log collude (see Section 6.2). | |||
11.5. Leakage of DNS Information | 11.5. Leakage of DNS Information | |||
Malicious monitors can use logs to learn about the existence of | Malicious monitors can use logs to learn about the existence of | |||
domain names that might not otherwise be easy to discover. Some | domain names that might not otherwise be easy to discover. Some | |||
subdomain labels may reveal information about the service and | subdomain labels may reveal information about the service and | |||
software for which the subdomain is used, which in turn might | software for which the subdomain is used, which in turn might | |||
facilitate targeted attacks. | facilitate targeted attacks. | |||
12. Acknowledgements | 12. References | |||
The authors would like to thank Erwann Abelea, Robin Alden, Andrew | ||||
Ayer, Richard 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. | ||||
A big thank you to Symantec for kindly donating the OIDs from the | ||||
1.3.101 arc that are used in this document. | ||||
13. References | ||||
13.1. Normative References | 12.1. Normative References | |||
[FIPS186-4] | [FIPS186-4] | |||
NIST, "FIPS PUB 186-4", 1 July 2013, | National Institute of Standards and Technology, "Digital | |||
Signature Standard (DSS)", FIPS PUB 186-4, July 2013, | ||||
<http://nvlpubs.nist.gov/nistpubs/FIPS/ | <http://nvlpubs.nist.gov/nistpubs/FIPS/ | |||
NIST.FIPS.186-4.pdf>. | NIST.FIPS.186-4.pdf>. | |||
[HTML401] Raggett, D., Le Hors, A., and I. Jacobs, "HTML 4.01 | [HTML401] Raggett, D., Le Hors, A., and I. Jacobs, "HTML 4.01 | |||
Specification", World Wide Web Consortium Recommendation | Specification", W3C Recommendation SPSD-html401-20180327, | |||
REC-html401-19991224, 24 December 1999, | March 2018, | |||
<http://www.w3.org/TR/1999/REC-html401-19991224>. | <https://www.w3.org/TR/2018/SPSD-html401-20180327>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, "An | [RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, "An | |||
IETF URN Sub-namespace for Registered Protocol | IETF URN Sub-namespace for Registered Protocol | |||
Parameters", BCP 73, RFC 3553, DOI 10.17487/RFC3553, June | Parameters", BCP 73, RFC 3553, DOI 10.17487/RFC3553, June | |||
2003, <https://www.rfc-editor.org/info/rfc3553>. | 2003, <https://www.rfc-editor.org/info/rfc3553>. | |||
skipping to change at page 59, line 5 ¶ | skipping to change at line 2738 ¶ | |||
[RFC8391] Huelsing, A., Butin, D., Gazdag, S., Rijneveld, J., and A. | [RFC8391] Huelsing, A., Butin, D., Gazdag, S., Rijneveld, J., and A. | |||
Mohaisen, "XMSS: eXtended Merkle Signature Scheme", | Mohaisen, "XMSS: eXtended Merkle Signature Scheme", | |||
RFC 8391, DOI 10.17487/RFC8391, May 2018, | RFC 8391, DOI 10.17487/RFC8391, May 2018, | |||
<https://www.rfc-editor.org/info/rfc8391>. | <https://www.rfc-editor.org/info/rfc8391>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[UNIXTIME] IEEE, "The Open Group Base Specifications Issue 7 IEEE Std | [UNIXTIME] IEEE, "The Open Group Base Specifications Issue 7", | |||
1003.1-2008, 2016 Edition", n.d., | Section 4.16 Seconds Since the Epoch, IEEE | |||
<http://pubs.opengroup.org/ | Std 1003.1-2008, 2016, <http://pubs.opengroup.org/ | |||
onlinepubs/9699919799.2016edition/basedefs/ | onlinepubs/9699919799.2016edition/basedefs/ | |||
V1_chap04.html#tag_04_16>. | V1_chap04.html#tag_04_16>. | |||
[X690] ITU-T, "Information technology - ASN.1 encoding Rules: | [X690] ITU-T, "Information technology - ASN.1 encoding rules: | |||
Specification of Basic Encoding Rules (BER), Canonical | Specification of Basic Encoding Rules (BER), Canonical | |||
Encoding Rules (CER) and Distinguished Encoding Rules | Encoding Rules (CER) and Distinguished Encoding Rules | |||
(DER)", ISO/IEC 8825-1:2002, November 2015. | (DER)", ITU-T Recommendation X.690, ISO/IEC 8825-1, | |||
February 2021. | ||||
13.2. Informative References | 12.2. Informative References | |||
[CABBR] CA/Browser Forum, "Baseline Requirements for the Issuance | [CABBR] CA/Browser Forum, "Baseline Requirements for the Issuance | |||
and Management of Publicly-Trusted Certificates", 2020, | and Management of Publicly-Trusted Certificates", | |||
<https://cabforum.org/wp-content/uploads/CA-Browser-Forum- | Version 1.7.3, October 2020, <https://cabforum.org/wp- | |||
BR-1.7.3.pdf>. | content/uploads/CA-Browser-Forum-BR-1.7.3.pdf>. | |||
[Chromium.Log.Policy] | [Chromium.Log.Policy] | |||
The Chromium Projects, "Chromium Certificate Transparency | The Chromium Projects, "Chromium Certificate Transparency | |||
Log Policy", 2014, <http://www.chromium.org/Home/chromium- | Log Policy", | |||
security/certificate-transparency/log-policy>. | <https://googlechrome.github.io/CertificateTransparency/ | |||
log_policy.html>. | ||||
[Chromium.Policy] | [Chromium.Policy] | |||
The Chromium Projects, "Chromium Certificate | The Chromium Projects, "Chromium Certificate Transparency | |||
Transparency", 2014, <http://www.chromium.org/Home/ | Policy", | |||
chromium-security/certificate-transparency>. | <https://googlechrome.github.io/CertificateTransparency/ | |||
ct_policy.html>. | ||||
[CrosbyWallach] | [CrosbyWallach] | |||
Crosby, S. and D. Wallach, "Efficient Data Structures for | Crosby, S. and D. Wallach, "Efficient Data Structures for | |||
Tamper-Evident Logging", Proceedings of the 18th USENIX | Tamper-Evident Logging", Proceedings of the 18th USENIX | |||
Security Symposium, Montreal, August 2009, | Security Symposium, Montreal, August 2009, | |||
<http://static.usenix.org/event/sec09/tech/full_papers/ | <http://static.usenix.org/event/sec09/tech/full_papers/ | |||
crosby.pdf>. | crosby.pdf>. | |||
[JSON.Metadata] | [JSON.Metadata] | |||
The Chromium Projects, "Chromium Log Metadata JSON | The Chromium Projects, "Chromium Log Metadata JSON | |||
Schema", 2014, <https://www.gstatic.com/ct/log_list/ | Schema", <https://www.gstatic.com/ct/log_list/ | |||
log_list_schema.json>. | log_list_schema.json>. | |||
[RFC5912] Hoffman, P. and J. Schaad, "New ASN.1 Modules for the | ||||
Public Key Infrastructure Using X.509 (PKIX)", RFC 5912, | ||||
DOI 10.17487/RFC5912, June 2010, | ||||
<https://www.rfc-editor.org/info/rfc5912>. | ||||
[RFC6268] Schaad, J. and S. Turner, "Additional New ASN.1 Modules | ||||
for the Cryptographic Message Syntax (CMS) and the Public | ||||
Key Infrastructure Using X.509 (PKIX)", RFC 6268, | ||||
DOI 10.17487/RFC6268, July 2011, | ||||
<https://www.rfc-editor.org/info/rfc6268>. | ||||
[RFC6962] Laurie, B., Langley, A., and E. Kasper, "Certificate | [RFC6962] Laurie, B., Langley, A., and E. Kasper, "Certificate | |||
Transparency", RFC 6962, DOI 10.17487/RFC6962, June 2013, | Transparency", RFC 6962, DOI 10.17487/RFC6962, June 2013, | |||
<https://www.rfc-editor.org/info/rfc6962>. | <https://www.rfc-editor.org/info/rfc6962>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
<https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8820] Nottingham, M., "URI Design and Ownership", BCP 190, | [RFC8820] Nottingham, M., "URI Design and Ownership", BCP 190, | |||
RFC 8820, DOI 10.17487/RFC8820, June 2020, | RFC 8820, DOI 10.17487/RFC8820, June 2020, | |||
<https://www.rfc-editor.org/info/rfc8820>. | <https://www.rfc-editor.org/info/rfc8820>. | |||
Appendix A. Supporting v1 and v2 simultaneously (Informative) | [X.680] ITU-T, "Information technology - Abstract Syntax Notation | |||
One (ASN.1): Specification of basic notation", ITU-T | ||||
Recommendation X.680, February 2021. | ||||
Appendix A. Supporting v1 and v2 Simultaneously (Informative) | ||||
Certificate Transparency logs have to be either v1 (conforming to | Certificate Transparency logs have to be either v1 (conforming to | |||
[RFC6962]) or v2 (conforming to this document), as the data | [RFC6962]) or v2 (conforming to this document), as the data | |||
structures are incompatible and so a v2 log could not issue a valid | structures are incompatible, and so a v2 log could not issue a valid | |||
v1 SCT. | v1 SCT. | |||
CT clients, however, can support v1 and v2 SCTs, for the same | CT clients, however, can support v1 and v2 SCTs for the same | |||
certificate, simultaneously, as v1 SCTs are delivered in different | certificate simultaneously, as v1 SCTs are delivered in different | |||
TLS, X.509 and OCSP extensions than v2 SCTs. | TLS, X.509, and OCSP extensions than v2 SCTs. | |||
v1 and v2 SCTs for X.509 certificates can be validated independently. | v1 and v2 SCTs for X.509 certificates can be validated independently. | |||
For precertificates, v2 SCTs should be embedded in the TBSCertificate | For precertificates, v2 SCTs should be embedded in the TBSCertificate | |||
before submission of the TBSCertificate (inside a v1 precertificate, | before submission of the TBSCertificate (inside a v1 precertificate, | |||
as described in Section 3.1. of [RFC6962]) to a v1 log so that TLS | as described in Section 3.1 of [RFC6962]) to a v1 log so that TLS | |||
clients conforming to [RFC6962] but not this document are oblivious | clients conforming to [RFC6962] but not this document are oblivious | |||
to the embedded v2 SCTs. An issuer can follow these steps to produce | to the embedded v2 SCTs. An issuer can follow these steps to produce | |||
an X.509 certificate with embedded v1 and v2 SCTs: | an X.509 certificate with embedded v1 and v2 SCTs: | |||
* Create a CMS precertificate as described in Section 3.2 and submit | * Create a CMS precertificate, as described in Section 3.2, and | |||
it to v2 logs. | submit it to v2 logs. | |||
* Embed the obtained v2 SCTs in the TBSCertificate, as described in | * Embed the obtained v2 SCTs in the TBSCertificate, as described in | |||
Section 7.1.2. | Section 7.1.2. | |||
* Use that TBSCertificate to create a v1 precertificate, as | * Use that TBSCertificate to create a v1 precertificate, as | |||
described in Section 3.1. of [RFC6962] and submit it to v1 logs. | described in Section 3.1 of [RFC6962], and submit it to v1 logs. | |||
* Embed the v1 SCTs in the TBSCertificate, as described in | * Embed the v1 SCTs in the TBSCertificate, as described in | |||
Section 3.3 of [RFC6962]. | Section 3.3 of [RFC6962]. | |||
* Sign that TBSCertificate (which now contains v1 and v2 SCTs) to | * Sign that TBSCertificate (which now contains v1 and v2 SCTs) to | |||
issue the final X.509 certificate. | issue the final X.509 certificate. | |||
Appendix B. An ASN.1 Module (Informative) | Appendix B. An ASN.1 Module (Informative) | |||
The following ASN.1 module may be useful to implementors. | The following ASN.1 [X.680] module may be useful to implementors. | |||
This module references [RFC5912] and [RFC6268]. | ||||
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 | |||
FROM PKIX-CommonTypes-2009 -- RFC 5912 | FROM PKIX-CommonTypes-2009 -- RFC 5912 | |||
{ iso(1) identified-organization(3) dod(6) internet(1) | { iso(1) identified-organization(3) dod(6) internet(1) | |||
security(5) mechanisms(5) pkix(7) id-mod(0) | security(5) mechanisms(5) pkix(7) id-mod(0) | |||
id-mod-pkixCommon-02(57) } | id-mod-pkixCommon-02(57) } | |||
CONTENT-TYPE | CONTENT-TYPE | |||
skipping to change at page 62, line 28 ¶ | skipping to change at line 2926 ¶ | |||
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 | |||
Acknowledgements | ||||
The authors would like to thank Erwann Abelea, Robin Alden, Andrew | ||||
Ayer, Richard 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, Emilia | ||||
Kasper, Stephen Kent, Adam Langley, 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. | ||||
A big thank you to Symantec for kindly donating the OIDs from the | ||||
1.3.101 arc that are used in this document. | ||||
Authors' Addresses | Authors' Addresses | |||
Ben Laurie | Ben Laurie | |||
Google UK Ltd. | Google UK Ltd. | |||
Email: benl@google.com | Email: benl@google.com | |||
Adam Langley | ||||
Google Inc. | ||||
Email: agl@google.com | ||||
Emilia Kasper | ||||
Google Switzerland GmbH | ||||
Email: ekasper@google.com | ||||
Eran Messeri | Eran Messeri | |||
Google UK Ltd. | Google UK Ltd. | |||
Email: eranm@google.com | Email: eranm@google.com | |||
Rob Stradling | Rob Stradling | |||
Sectigo Ltd. | Sectigo Ltd. | |||
Email: rob@sectigo.com | Email: rob@sectigo.com | |||
End of changes. 409 change blocks. | ||||
1062 lines changed or deleted | 1132 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/ |