| < draft-ietf-trans-rfc6962-bis-35.txt | draft-ietf-trans-rfc6962-bis-36.txt > | |||
|---|---|---|---|---|
| TRANS (Public Notary Transparency) B. Laurie | TRANS (Public Notary Transparency) B. Laurie | |||
| Internet-Draft A. Langley | Internet-Draft A. Langley | |||
| Obsoletes: 6962 (if approved) E. Kasper | Obsoletes: 6962 (if approved) E. Kasper | |||
| Intended status: Experimental E. Messeri | Intended status: Experimental E. Messeri | |||
| Expires: 26 September 2021 Google | Expires: 14 November 2021 Google | |||
| R. Stradling | R. Stradling | |||
| Sectigo | Sectigo | |||
| 25 March 2021 | 13 May 2021 | |||
| Certificate Transparency Version 2.0 | Certificate Transparency Version 2.0 | |||
| draft-ietf-trans-rfc6962-bis-35 | draft-ietf-trans-rfc6962-bis-36 | |||
| 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.] | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on 14 November 2021. | ||||
| This Internet-Draft will expire on 26 September 2021. | ||||
| 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 (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 2, line 31 ¶ | skipping to change at page 2, line 32 ¶ | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Data Structures . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Data Structures . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.3. Major Differences from CT 1.0 . . . . . . . . . . . . . . 5 | 1.3. Major Differences from CT 1.0 . . . . . . . . . . . . . . 5 | |||
| 2. Cryptographic Components . . . . . . . . . . . . . . . . . . 7 | 2. Cryptographic Components . . . . . . . . . . . . . . . . . . 7 | |||
| 2.1. Merkle Hash Trees . . . . . . . . . . . . . . . . . . . . 7 | 2.1. Merkle Hash Trees . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.1.1. Definition of the Merkle Tree . . . . . . . . . . . . 7 | 2.1.1. Definition of the Merkle Tree . . . . . . . . . . . . 7 | |||
| 2.1.2. Verifying a Tree Head Given Entries . . . . . . . . . 8 | 2.1.2. Verifying a Tree Head Given Entries . . . . . . . . . 8 | |||
| 2.1.3. Merkle Inclusion Proofs . . . . . . . . . . . . . . . 9 | 2.1.3. Merkle Inclusion Proofs . . . . . . . . . . . . . . . 9 | |||
| 2.1.4. Merkle Consistency Proofs . . . . . . . . . . . . . . 10 | 2.1.4. Merkle Consistency Proofs . . . . . . . . . . . . . . 10 | |||
| 2.1.5. Example . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.1.5. Example . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 2.2. Signatures . . . . . . . . . . . . . . . . . . . . . . . 14 | 2.2. Signatures . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3. Submitters . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 3. Submitters . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.1. Certificates . . . . . . . . . . . . . . . . . . . . . . 15 | 3.1. Certificates . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.2. Precertificates . . . . . . . . . . . . . . . . . . . . . 15 | 3.2. Precertificates . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.2.1. Binding Intent to Issue . . . . . . . . . . . . . . . 17 | 3.2.1. Binding Intent to Issue . . . . . . . . . . . . . . . 17 | |||
| 4. Log Format and Operation . . . . . . . . . . . . . . . . . . 17 | 4. Log Format and Operation . . . . . . . . . . . . . . . . . . 17 | |||
| 4.1. Log Parameters . . . . . . . . . . . . . . . . . . . . . 18 | 4.1. Log Parameters . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.2. Evaluating Submissions . . . . . . . . . . . . . . . . . 19 | 4.2. Evaluating Submissions . . . . . . . . . . . . . . . . . 19 | |||
| 4.2.1. Minimum Acceptance Criteria . . . . . . . . . . . . . 19 | 4.2.1. Minimum Acceptance Criteria . . . . . . . . . . . . . 19 | |||
| 4.2.2. Discretionary Acceptance Criteria . . . . . . . . . . 20 | 4.2.2. Discretionary Acceptance Criteria . . . . . . . . . . 20 | |||
| 4.3. Log Entries . . . . . . . . . . . . . . . . . . . . . . . 21 | 4.3. Log Entries . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.4. Log ID . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 4.4. Log ID . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 4.5. TransItem Structure . . . . . . . . . . . . . . . . . . . 21 | 4.5. TransItem Structure . . . . . . . . . . . . . . . . . . . 21 | |||
| 4.6. Log Artifact Extensions . . . . . . . . . . . . . . . . . 22 | 4.6. Log Artifact Extensions . . . . . . . . . . . . . . . . . 22 | |||
| 4.7. Merkle Tree Leaves . . . . . . . . . . . . . . . . . . . 23 | 4.7. Merkle Tree Leaves . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.8. Signed Certificate Timestamp (SCT) . . . . . . . . . . . 24 | 4.8. Signed Certificate Timestamp (SCT) . . . . . . . . . . . 24 | |||
| 4.9. Merkle Tree Head . . . . . . . . . . . . . . . . . . . . 25 | 4.9. Merkle Tree Head . . . . . . . . . . . . . . . . . . . . 25 | |||
| 4.10. Signed Tree Head (STH) . . . . . . . . . . . . . . . . . 25 | 4.10. Signed Tree Head (STH) . . . . . . . . . . . . . . . . . 26 | |||
| 4.11. Merkle Consistency Proofs . . . . . . . . . . . . . . . . 26 | 4.11. Merkle Consistency Proofs . . . . . . . . . . . . . . . . 26 | |||
| 4.12. Merkle Inclusion Proofs . . . . . . . . . . . . . . . . . 27 | 4.12. Merkle Inclusion Proofs . . . . . . . . . . . . . . . . . 27 | |||
| 4.13. Shutting down a log . . . . . . . . . . . . . . . . . . . 27 | 4.13. Shutting down a log . . . . . . . . . . . . . . . . . . . 28 | |||
| 5. Log Client Messages . . . . . . . . . . . . . . . . . . . . . 28 | 5. Log Client Messages . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.1. Submit Entry to Log . . . . . . . . . . . . . . . . . . . 30 | 5.1. Submit Entry to Log . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.2. Retrieve Latest Signed Tree Head . . . . . . . . . . . . 32 | 5.2. Retrieve Latest Signed Tree Head . . . . . . . . . . . . 32 | |||
| 5.3. Retrieve Merkle Consistency Proof between Two Signed Tree | 5.3. Retrieve Merkle Consistency Proof between Two Signed Tree | |||
| Heads . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | Heads . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash . . 33 | 5.4. Retrieve Merkle Inclusion Proof from Log by Leaf Hash . . 33 | |||
| 5.5. Retrieve Merkle Inclusion Proof, Signed Tree Head and | 5.5. Retrieve Merkle Inclusion Proof, Signed Tree Head and | |||
| Consistency Proof by Leaf Hash . . . . . . . . . . . . . 34 | Consistency Proof by Leaf Hash . . . . . . . . . . . . . 34 | |||
| 5.6. Retrieve Entries and STH from Log . . . . . . . . . . . . 35 | 5.6. Retrieve Entries and STH from Log . . . . . . . . . . . . 35 | |||
| 5.7. Retrieve Accepted Trust Anchors . . . . . . . . . . . . . 37 | 5.7. Retrieve Accepted Trust Anchors . . . . . . . . . . . . . 37 | |||
| 6. TLS Servers . . . . . . . . . . . . . . . . . . . . . . . . . 38 | 6. TLS Servers . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6.1. TLS Client Authentication . . . . . . . . . . . . . . . . 38 | 6.1. TLS Client Authentication . . . . . . . . . . . . . . . . 38 | |||
| 6.2. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . . 39 | 6.2. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 6.3. TransItemList Structure . . . . . . . . . . . . . . . . . 39 | 6.3. TransItemList Structure . . . . . . . . . . . . . . . . . 39 | |||
| 6.4. Presenting SCTs, inclusions proofs and STHs . . . . . . . 40 | 6.4. Presenting SCTs, inclusions proofs and STHs . . . . . . . 40 | |||
| 6.5. transparency_info TLS Extension . . . . . . . . . . . . . 40 | 6.5. transparency_info TLS Extension . . . . . . . . . . . . . 40 | |||
| 7. Certification Authorities . . . . . . . . . . . . . . . . . . 40 | 7. Certification Authorities . . . . . . . . . . . . . . . . . . 41 | |||
| 7.1. Transparency Information X.509v3 Extension . . . . . . . 41 | 7.1. Transparency Information X.509v3 Extension . . . . . . . 41 | |||
| 7.1.1. OCSP Response Extension . . . . . . . . . . . . . . . 41 | 7.1.1. OCSP Response Extension . . . . . . . . . . . . . . . 41 | |||
| 7.1.2. Certificate Extension . . . . . . . . . . . . . . . . 41 | 7.1.2. Certificate Extension . . . . . . . . . . . . . . . . 41 | |||
| 7.2. TLS Feature X.509v3 Extension . . . . . . . . . . . . . . 41 | 7.2. TLS Feature X.509v3 Extension . . . . . . . . . . . . . . 41 | |||
| 8. Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 8. Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 8.1. TLS Client . . . . . . . . . . . . . . . . . . . . . . . 42 | 8.1. TLS Client . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 8.1.1. Receiving SCTs and inclusion proofs . . . . . . . . . 42 | 8.1.1. Receiving SCTs and inclusion proofs . . . . . . . . . 42 | |||
| 8.1.2. Reconstructing the TBSCertificate . . . . . . . . . . 42 | 8.1.2. Reconstructing the TBSCertificate . . . . . . . . . . 42 | |||
| 8.1.3. Validating SCTs . . . . . . . . . . . . . . . . . . . 42 | 8.1.3. Validating SCTs . . . . . . . . . . . . . . . . . . . 42 | |||
| 8.1.4. Fetching inclusion proofs . . . . . . . . . . . . . . 43 | 8.1.4. Fetching inclusion proofs . . . . . . . . . . . . . . 43 | |||
| 8.1.5. Validating inclusion proofs . . . . . . . . . . . . . 43 | 8.1.5. Validating inclusion proofs . . . . . . . . . . . . . 43 | |||
| 8.1.6. Evaluating compliance . . . . . . . . . . . . . . . . 44 | 8.1.6. Evaluating compliance . . . . . . . . . . . . . . . . 44 | |||
| 8.2. Monitor . . . . . . . . . . . . . . . . . . . . . . . . . 44 | 8.2. Monitor . . . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 8.3. Auditing . . . . . . . . . . . . . . . . . . . . . . . . 45 | 8.3. Auditing . . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 9. Algorithm Agility . . . . . . . . . . . . . . . . . . . . . . 46 | 9. Algorithm Agility . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.1. New Entry to the TLS ExtensionType Registry . . . . . . 47 | 10.1. New Entry to the TLS ExtensionType Registry . . . . . . 47 | |||
| 10.2. Hash Algorithms . . . . . . . . . . . . . . . . . . . . 47 | 10.2. Hash Algorithms . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.2.1. Specification Required guidance . . . . . . . . . . 47 | 10.2.1. Specification Required guidance . . . . . . . . . . 47 | |||
| 10.3. Signature Algorithms . . . . . . . . . . . . . . . . . . 48 | 10.3. Signature Algorithms . . . . . . . . . . . . . . . . . . 48 | |||
| 10.3.1. Expert Review guidelines . . . . . . . . . . . . . . 48 | 10.3.1. Expert Review guidelines . . . . . . . . . . . . . . 49 | |||
| 10.4. VersionedTransTypes . . . . . . . . . . . . . . . . . . 49 | 10.4. VersionedTransTypes . . . . . . . . . . . . . . . . . . 49 | |||
| 10.4.1. Specification Required guidance . . . . . . . . . . 49 | ||||
| 10.5. Log Artifact Extension Registry . . . . . . . . . . . . 50 | 10.5. Log Artifact Extension Registry . . . . . . . . . . . . 50 | |||
| 10.5.1. Specification Required guidance . . . . . . . . . . 50 | 10.5.1. Specification Required guidance . . . . . . . . . . 51 | |||
| 10.6. Object Identifiers . . . . . . . . . . . . . . . . . . . 50 | 10.6. Object Identifiers . . . . . . . . . . . . . . . . . . . 51 | |||
| 10.6.1. Log ID Registry . . . . . . . . . . . . . . . . . . 50 | 10.6.1. Log ID Registry . . . . . . . . . . . . . . . . . . 51 | |||
| 10.7. URN Sub-namespace for TRANS errors | 10.7. URN Sub-namespace for TRANS errors | |||
| (urn:ietf:params:trans:error) . . . . . . . . . . . . . 51 | (urn:ietf:params:trans:error) . . . . . . . . . . . . . 52 | |||
| 10.7.1. TRANS Error Types . . . . . . . . . . . . . . . . . 52 | 10.7.1. TRANS Error Types . . . . . . . . . . . . . . . . . 53 | |||
| 11. Security Considerations . . . . . . . . . . . . . . . . . . . 53 | ||||
| 11.1. Misissued Certificates . . . . . . . . . . . . . . . . . 54 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 54 | |||
| 11.2. Detection of Misissue . . . . . . . . . . . . . . . . . 54 | 11.1. Misissued Certificates . . . . . . . . . . . . . . . . . 55 | |||
| 11.3. Misbehaving Logs . . . . . . . . . . . . . . . . . . . . 54 | 11.2. Detection of Misissue . . . . . . . . . . . . . . . . . 55 | |||
| 11.4. Preventing Tracking Clients . . . . . . . . . . . . . . 55 | 11.3. Misbehaving Logs . . . . . . . . . . . . . . . . . . . . 55 | |||
| 11.5. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . 55 | 11.4. Multiple SCTs . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 11.6. Leakage of DNS Information . . . . . . . . . . . . . . . 55 | 11.5. Leakage of DNS Information . . . . . . . . . . . . . . . 56 | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 55 | 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 56 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 56 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 57 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 57 | 13.2. Informative References . . . . . . . . . . . . . . . . . 59 | |||
| Appendix A. Supporting v1 and v2 simultaneously . . . . . . . . 59 | Appendix A. Supporting v1 and v2 simultaneously (Informative) . 60 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 60 | Appendix B. An ASN.1 Module (Informative) . . . . . . . . . . . 61 | |||
| 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 | |||
| only describe its use for public TLS server certificates (i.e., where | only describe its use for public TLS server certificates (i.e., where | |||
| the inclusion criteria is a valid certificate issued by a public | the inclusion criteria is a valid certificate issued by a public | |||
| certification authority (CA)). | certification authority (CA)). A typical definition of "public" can | |||
| be found in [CABBR]. | ||||
| Each log contains certificate chains, which can be submitted by | Each log contains certificate chains, which can be submitted by | |||
| anyone. It is expected that public CAs will contribute all their | anyone. It is expected that public CAs will contribute all their | |||
| newly issued certificates to one or more logs; however certificate | newly issued certificates to one or more logs; however certificate | |||
| holders can also contribute their own certificate chains, as can | holders can also contribute their own certificate chains, as can | |||
| third parties. In order to avoid logs being rendered useless by the | third parties. In order to avoid logs being rendered useless by the | |||
| submission of large numbers of spurious certificates, it is required | submission of large numbers of spurious certificates, it is required | |||
| that each chain ends with a trust anchor that is accepted by the log. | that each chain ends with a trust anchor that is accepted by the log. | |||
| When a chain is accepted by a log, a signed timestamp is returned, | A log may also limit the length of the chain it is willing to accept; | |||
| which can later be used to provide evidence to TLS clients that the | such chains must also end with an acceptable trust anchor. When a | |||
| chain has been submitted. TLS clients can thus require that all | chain is accepted by a log, a signed timestamp is returned, which can | |||
| certificates they accept as valid are accompanied by signed | later be used to provide evidence to TLS clients that the chain has | |||
| timestamps. | been submitted. TLS clients can thus require that all certificates | |||
| 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 | |||
| skipping to change at page 5, line 26 ¶ | skipping to change at page 5, line 29 ¶ | |||
| 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 | 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. Whilst it is anticipated that | views of itself to different clients. While mechanisms are being | |||
| additional mechanisms could be developed to address these | developed to address these shortcomings and thereby avoid the need to | |||
| shortcomings and thereby avoid the need to blindly trust logs, such | blindly trust logs, such mechanisms are outside the scope of this | |||
| 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 BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 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 | |||
| skipping to change at page 7, line 16 ¶ | skipping to change at page 7, line 19 ¶ | |||
| 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. | |||
| * Extensive clarifications and editorial work. | * Extensive clarifications and editorial work. | |||
| 2. Cryptographic Components | 2. Cryptographic Components | |||
| 2.1. Merkle Hash Trees | 2.1. Merkle Hash Trees | |||
| A full description of Merkle Hash Tree is beyond the scope of this | ||||
| 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. | ||||
| Additional information can be found in the Introduction and Reference | ||||
| section 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 Hash Tree for efficient auditing. The | |||
| hash algorithm used is one of the log's parameters (see Section 4.1). | hash 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). Throughout this document, the hash algorithm in | (see Section 10.2). Throughout this document, the hash algorithm in | |||
| use is referred to as HASH and the size of its output in bytes as | use is referred to as HASH and the size of its output in bytes as | |||
| HASH_SIZE. The input to the Merkle Tree Hash is a list of data | HASH_SIZE. The input to the Merkle Tree Hash is a list of data | |||
| entries; these entries will be hashed to form the leaves of the | entries; these entries will be hashed to form the leaves of the | |||
| Merkle Hash Tree. The output is a single HASH_SIZE Merkle Tree Hash. | Merkle Hash Tree. The output is a single HASH_SIZE Merkle Tree Hash. | |||
| skipping to change at page 8, line 17 ¶ | skipping to change at page 8, line 24 ¶ | |||
| 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 | [CrosbyWallach] proposal, 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 n input "entries" from "0" up to | When a client has a complete list of "entries" from "0" up to | |||
| "tree_size - 1" and wishes to verify this list against a tree head | "tree_size - 1" and wishes to verify this list against a tree head | |||
| "root_hash" returned by the log for the same "tree_size", the | "root_hash" returned by the log for the same "tree_size", the | |||
| following algorithm may be used: | following algorithm 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". | 1. Push "HASH(0x00 || entries[i])" to "stack". | |||
| 2. Set "merge_count" to the lowest value ("0" included) such | 2. Set "merge_count" to the lowest value ("0" included) such | |||
| that "LSB(i >> merge_count)" is not set. In other words, set | that "LSB(i >> merge_count)" is not set, where "LSB" means | |||
| "merge_count" to the number of consecutive "1"s found | the least significant bit. In other words, set "merge_count" | |||
| starting at the least significant bit of "i". | to the number of consecutive "1"s found starting at the least | |||
| significant bit of "i". | ||||
| 3. Repeat "merge_count" times: | 3. Repeat "merge_count" times: | |||
| 1. Pop "right" from "stack". | 1. Pop "right" from "stack". | |||
| 2. Pop "left" from "stack". | 2. Pop "left" from "stack". | |||
| 3. Push "HASH(0x01 || left || right)" to "stack". | 3. 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 (Step 2.3 above) until only a single element | merge procedure (the sub-items of Step 2.3 above) until only a | |||
| 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 Hash Tree is the | |||
| shortest list of additional nodes in the Merkle Tree required to | shortest list of additional nodes in the Merkle Tree required to | |||
| compute the Merkle Tree Hash for that tree. Each node in the tree is | compute the Merkle Tree Hash for that tree. Each node in the tree is | |||
| skipping to change at page 9, line 48 ¶ | skipping to change at page 10, line 5 ¶ | |||
| 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" against "tree_size". If "leaf_index" is | 1. Compare "leaf_index" from the "inclusion_proof_v2" structure | |||
| greater than or equal to "tree_size" then fail the proof | against "tree_size". If "leaf_index" is greater than or equal to | |||
| verification. | "tree_size" 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. | If "sn" is 0, stop the iteration and fail the proof verification. | |||
| If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | |||
| skipping to change at page 11, line 4 ¶ | skipping to change at page 11, line 6 ¶ | |||
| same nodes can be used to verify MTH(D[0:m]). We define an algorithm | same nodes can be used to verify MTH(D[0:m]). We define an algorithm | |||
| that outputs the (unique) minimal consistency proof. | that outputs the (unique) minimal consistency proof. | |||
| 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, and, consequently, whether the subtree Merkle Tree Hash | D_n, and, consequently, whether the subtree Merkle Tree Hash | |||
| MTH(D[0:m]) is known. The initial call to SUBPROOF sets this to be | MTH(D[0:m]) is known. The initial call to SUBPROOF sets this to be | |||
| true, and SUBPROOF is then defined as follows: | true, and 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 | |||
| subproof is then defined recursively. | subproof is then defined recursively, using the appropriate step | |||
| 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]. | |||
| skipping to change at page 12, line 5 ¶ | skipping to change at page 12, line 13 ¶ | |||
| 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", a | |||
| tree head "second_hash" for tree size "second" where "0 < first < | tree head "second_hash" for tree size "second" where "0 < first < | |||
| second", and has received a consistency proof between the two (e.g., | second", and has received a consistency proof between the two (e.g., | |||
| in a "TransItem" of type "consistency_proof_v2"), the following | in a "TransItem" of type "consistency_proof_v2"), the following | |||
| algorithm may be used to verify the consistency proof: | algorithm may be used to verify the consistency proof: | |||
| 1. If "first" is an exact power of 2, then prepend "first_hash" to | 1. If "consistency_path" is an empty array, stop and fail the proof | |||
| verification. | ||||
| 2. If "first" is an exact power of 2, then prepend "first_hash" to | ||||
| the "consistency_path" array. | the "consistency_path" array. | |||
| 2. Set "fn" to "first - 1" and "sn" to "second - 1". | 3. Set "fn" to "first - 1" and "sn" to "second - 1". | |||
| 3. 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 "LSB(fn)" is not set. | until "LSB(fn)" is not set. | |||
| 4. 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" array. | "consistency_path" array. | |||
| 5. 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. | If "sn" is 0, stop the iteration and fail the proof verification. | |||
| If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | If "LSB(fn)" is set, or if "fn" is equal to "sn", then: | |||
| 1. Set "fr" to "HASH(0x01 || c || fr)" | 1. Set "fr" to "HASH(0x01 || c || fr)" | |||
| Set "sr" to "HASH(0x01 || c || sr)" | Set "sr" to "HASH(0x01 || c || sr)" | |||
| 2. If "LSB(fn)" is not set, then right-shift both "fn" and "sn" | 2. 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)" | 1. Set "sr" to "HASH(0x01 || sr || c)" | |||
| Finally, right-shift both "fn" and "sn" one time. | Finally, right-shift both "fn" and "sn" one time. | |||
| 6. After completing iterating through the "consistency_path" array | 7. After completing iterating through the "consistency_path" array | |||
| as described above, verify that the "fr" calculated is equal to | as described above, verify that the "fr" calculated is equal to | |||
| the "first_hash" supplied, that the "sr" calculated is equal to | the "first_hash" supplied, that the "sr" calculated is equal to | |||
| the "second_hash" supplied and that "sn" is 0. | the "second_hash" supplied and that "sn" is 0. | |||
| 2.1.5. Example | 2.1.5. Example | |||
| The binary Merkle Tree with 7 leaves: | The binary Merkle Tree with 7 leaves: | |||
| hash | hash | |||
| / \ | / \ | |||
| skipping to change at page 14, line 44 ¶ | skipping to change at page 14, line 44 ¶ | |||
| 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]. k, i are used to verify hash2, and j is additionally used to | |||
| show hash is consistent with hash2. | show hash is consistent with hash2. | |||
| 2.2. Signatures | 2.2. Signatures | |||
| Various data structures Section 1.2 are signed. A log MUST use one | When signing data structures, a log MUST use one of the signature | |||
| of the signature algorithms defined in Section 10.3. | algorithms from the IANA CT Signature Algorithms registry, described | |||
| in Section 10.3. | ||||
| 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 | |||
| skipping to change at page 15, line 44 ¶ | skipping to change at page 15, line 44 ¶ | |||
| 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 to the following profile: | conforms to the following profile: | |||
| * It MUST be DER encoded. | * It MUST be DER encoded as described in [X690]. | |||
| * "SignedData.version" MUST be v3(3). | * "SignedData.version" MUST be v3(3). | |||
| * "SignedData.digestAlgorithms" MUST only include 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. | |||
| skipping to change at page 16, line 23 ¶ | skipping to change at page 16, line 23 ¶ | |||
| * "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 Section 10.2. | in the IANA CT Hash Algorithms Registry, described in | |||
| Section 10.2. | ||||
| - "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". | |||
| 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 | |||
| skipping to change at page 17, line 41 ¶ | skipping to change at page 17, line 41 ¶ | |||
| 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 (to | submission, it SHOULD return the same SCT as it returned before, as | |||
| reduce the ability to track clients as described in Section 11.4). | discussed in Section 11.3. If different SCTs are produced for the | |||
| If different SCTs are produced for the same submission, multiple log | same submission, multiple log entries will have to be created, one | |||
| entries will have to be created, one for each SCT (as the timestamp | for each SCT (as the timestamp is a part of the leaf structure). | |||
| is a part of the leaf structure). Note that if a certificate was | Note that if a certificate was previously logged as a precertificate, | |||
| previously logged as a precertificate, then the precertificate's SCT | then the precertificate's SCT of type "precert_sct_v2" would not be | |||
| of type "precert_sct_v2" would not be appropriate; instead, a fresh | appropriate; instead, a fresh SCT of type "x509_sct_v2" should be | |||
| 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 fulfil | |||
| 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. | |||
| skipping to change at page 18, line 32 ¶ | skipping to change at page 18, line 32 ¶ | |||
| 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 Signed Tree Head (STH), each of | |||
| these parameters MUST be established before the log operator begins | these parameters MUST be established before the log operator begins | |||
| to operate the log. | to operate the log. | |||
| Base URL: The prefix used to construct URLs for client messages (see | Base URL: The prefix used to construct URLs ([RFC3986]) for client | |||
| Section 5). The base URL MUST be an "https" URL, MAY contain a | messages (see Section 5). The base URL MUST be an "https" URL, | |||
| port, MAY contain a path with any number of path segments, but | MAY contain a port, MAY contain a path with any number of path | |||
| MUST NOT contain a query string, fragment, or trailing "/". | segments, but MUST NOT contain a query string, fragment, or | |||
| 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). | Section 10.2). | |||
| 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. | Maximum Merge Delay: The MMD the log has committed to. This | |||
| document deliberately does not specify any limits on the value, to | ||||
| 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 chain submission the log is | Maximum Chain Length: The longest certificate chain submission the | |||
| 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. The final STH should | new entries can be added without detection. This value MUST be | |||
| be provided in the form of a TransItem of type | provided in the form of a TransItem of type "signed_tree_head_v2". | |||
| "signed_tree_head_v2". | If a log is still accepting entries, this value should not be | |||
| provided. | ||||
| [JSON.Metadata] is an example of a metadata format which includes the | [JSON.Metadata] is an example of a metadata format which 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). | |||
| skipping to change at page 21, line 12 ¶ | skipping to change at page 20, line 49 ¶ | |||
| 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 issued, the accepting log MUST | |||
| store the entire chain used for verification. This chain 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 present this chain for auditing upon | submission). The log MUST provide this chain for auditing upon | |||
| request (see Section 5.6). This prevents the CA from avoiding blame | request (see Section 5.6) so that the CA cannot avoid blame by | |||
| 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 may store its entries in any format. If a log does not store | log may store its entries in any format. If a log does not store | |||
| this "TransItem" in full, it must store the "timestamp" and | this "TransItem" in full, it must store the "timestamp" and | |||
| "sct_extensions" of the corresponding | "sct_extensions" of the corresponding | |||
| "TimestampedCertificateEntryDataV2" structure. The "TransItem" can | "TimestampedCertificateEntryDataV2" structure. The "TransItem" can | |||
| be reconstructed from these fields and the entire chain that the log | be reconstructed from these fields and the entire chain 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.6.1). Various data structures include the DER encoding of | Section 10.6.1). The only advantage of the registry is that the DER | |||
| this OID, excluding the ASN.1 tag and length bytes, in an opaque | encoding can be small. (Recall that OID allocations do not require a | |||
| vector: | central registration, although logs will most likely want to make | |||
| themselves known to potential clients through out of band means.) | ||||
| Various data structures include the DER encoding of this 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 DER encoding of the OID can be | in size (1 byte) and value, so the full DER encoding (including the | |||
| reproduced simply by prepending an OBJECT IDENTIFIER tag (0x06) to | tag and length) of the OID can be reproduced simply by prepending an | |||
| the opaque vector length and contents. | OBJECT IDENTIFIER tag (0x06) to the opaque vector length and | |||
| contents. | ||||
| OIDs used to identify logs are limited such that the DER encoding of | The OID used to identify a log is limited such that the DER encoding | |||
| their value is less than or equal to 127 octets. | of its value, excluding the tag and length, MUST be no longer than | |||
| 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 { | |||
| reserved(0), | reserved(0), | |||
| x509_entry_v2(1), precert_entry_v2(2), | x509_entry_v2(1), precert_entry_v2(2), | |||
| skipping to change at page 24, line 19 ¶ | skipping to change at page 24, line 19 ¶ | |||
| 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" matches the SCT extensions of the corresponding SCT. | "sct_extensions" is byte-for-byte identical to the SCT extensions of | |||
| 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" structure: | "SignedCertificateTimestampDataV2" 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<0..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 MUST NOT include more than one extension with the same | vector 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 value of the "extension_type" field, smallest value first. If an | the value of the "extension_type" field, smallest value first. All | |||
| implementation sees an extension that it does not understand, it | SCT extensions are similar to non-critical X.509v3 extensions (i.e., | |||
| SHOULD ignore that extension. Furthermore, an implementation MAY | the "mustUnderstand" field is not set), and a recipient SHOULD ignore | |||
| choose to ignore any extension(s) that it does understand. | any extension it does not understand. Furthermore, an implementation | |||
| MAY 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": | |||
| skipping to change at page 25, line 26 ¶ | skipping to change at page 25, line 26 ¶ | |||
| 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, in the form of a 64-bit | "timestamp" is the current date and time, using the format defined in | |||
| unsigned number of milliseconds elapsed since the Unix Epoch (1 | {tree_leaves}. | |||
| January 1970 00:00:00 UTC - see [UNIXTIME]), ignoring leap seconds, | ||||
| in network byte order. | ||||
| "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 Hash 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 MUST NOT include more than one extension with the same | vector 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 value of the "extension_type" field, smallest value first. If an | the value of the "extension_type" field, smallest value first. If an | |||
| skipping to change at page 26, line 42 ¶ | skipping to change at page 27, line 9 ¶ | |||
| 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", which encapsulates a "ConsistencyProofDataV2" | "consistency_proof_v2", 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<1..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. | consistency of two STHs as described in {consistency}. | |||
| 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 encapsulates an "InclusionProofDataV2" structure: | which 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<1..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 of the chosen certificate or precertificate. | inclusion of the chosen certificate or precertificate as described in | |||
| {merkle_inclusion_proof}. | ||||
| 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. To avoid that, the following | invalidating SCTs from that log. In order to avoid that, the | |||
| actions are suggested: | 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 | ||||
| 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 | |||
| skipping to change at page 28, line 25 ¶ | skipping to change at page 28, line 41 ¶ | |||
| 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 [RFC4648] as specified in | [HTML401]. Binary data is base64 encoded according to section 4 of | |||
| 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 [RFC7320]. However, operational experience with version 1 of this | in [RFC7320]. 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. These extra fields SHOULD be ignored. | specified here, to allow for experimentation. Any fields that are | |||
| not 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 may occur that are caused by skew between the machines. 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). | |||
| skipping to change at page 29, line 51 ¶ | skipping to change at page 30, line 24 ¶ | |||
| | 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 as per | |||
| [RFC7231], in the case of a 503 response the log MAY include a | [RFC7231], in the case of a 503 response the log MAY include a | |||
| "Retry-After:" header in order to request a minimum time for the | "Retry-After:" header in order to request a minimum time for the | |||
| client to wait before retrying the request. | client to wait before retrying the request. In the absence of this | |||
| header, this document does not specify a minimum. | ||||
| Clients SHOULD treat any 4xx error as a problem with the request and | ||||
| not attempt to resubmit without some modification to the request. | ||||
| The full status code MAY provide additional details. | ||||
| This document deliberately does not provide more specific guidance on | ||||
| 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: submission: The base64 encoded certificate or | |||
| precertificate. | precertificate. | |||
| type: The "VersionedTransType" integer value that indicates | type: The "VersionedTransType" integer value that indicates | |||
| the type of the "submission": 1 for "x509_entry_v2", or 2 for | the 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 base64 encoded CA | chain: An array of zero or more JSON strings, each of which | |||
| certificates. The first element is the certifier of the | is a base64 encoded CA certificate. The first element is the | |||
| "submission"; the second certifies the first; etc. The last | certifier of the "submission"; the second certifies the first; | |||
| element of "chain" (or, if "chain" is an empty array, the | etc. The last element of "chain" (or, if "chain" is an empty | |||
| "submission") is certified by an accepted trust anchor. | array, the "submission") is certified by an accepted trust | |||
| anchor. | ||||
| Outputs: sct: A base64 encoded "TransItem" of type "x509_sct_v2" or | Outputs: sct: A base64 encoded "TransItem" of type "x509_sct_v2" or | |||
| "precert_sct_v2", signed by this log, that corresponds to the | "precert_sct_v2", signed by this log, that corresponds to the | |||
| "submission". | "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. | |||
| skipping to change at page 31, line 44 ¶ | skipping to change at page 32, line 14 ¶ | |||
| 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 | "bad certificate" error. If the certificate is logged, an SCT MUST | |||
| be issued. Logging the certificate is useful, because monitors | be 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 an accepted trust anchor nor the first element of "chain", | neither an accepted trust anchor nor the first element of "chain", | |||
| then the log MUST return the "unknown anchor" error. A log cannot | then the log MUST return the "unknown anchor" error. A log is not | |||
| generate an SCT for a submission if it does not have access to the | able to generate an SCT for a submission if it does not have access | |||
| issuer's public key. | to the issuer's 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 (e.g., if "type" was 2 (for "precert_sct_v2") then all three | clients. For example, if "type" was 2 (indicating "precert_sct_v2") | |||
| "TransItem"s could be embedded in the certificate). | then all three "TransItem"s could be embedded in the certificate. | |||
| 5.2. Retrieve Latest Signed Tree Head | 5.2. Retrieve Latest Signed Tree Head | |||
| 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: sth: A base64 encoded "TransItem" of type | |||
| "signed_tree_head_v2", signed by this log, that is no older | "signed_tree_head_v2", signed by this log, that is no older | |||
| than the log's MMD. | than the log's MMD. | |||
| skipping to change at page 33, line 31 ¶ | skipping to change at page 33, line 46 ¶ | |||
| 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, in decimal. | proof, in decimal. | |||
| The "hash" must be calculated as defined in Section 4.7. The | The "hash" must be calculated as defined in Section 4.7. A v2 STH | |||
| "tree_size" must designate an existing v2 STH. Because of skew, | must exist for the "tree_size". Because of skew, the front-end | |||
| the front-end may not know the requested STH. In that case, it | may not know the requested tree head. In that case, it will | |||
| will return the latest STH it knows, along with an inclusion proof | return the latest STH it knows, along with an inclusion proof to | |||
| to that STH. If the front-end knows the requested STH then only | that STH. If the front-end knows the requested tree head then | |||
| "inclusion" is returned. | only "inclusion" is returned. | |||
| Outputs: inclusion: A base64 encoded "TransItem" of type | Outputs: inclusion: A base64 encoded "TransItem" of type | |||
| "inclusion_proof_v2" whose "inclusion_path" array of Merkle | "inclusion_proof_v2" whose "inclusion_path" array of Merkle | |||
| Tree nodes proves the inclusion of the chosen certificate in | Tree nodes proves the inclusion of the certificate (as | |||
| the selected STH. | 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 by this log. | "signed_tree_head_v2", 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 is used to verify inclusion in the selected STH, which is | it is used to verify inclusion in the selected STH, which is | |||
| signed. | signed. | |||
| Error codes: | Error codes: | |||
| skipping to change at page 34, line 32 ¶ | skipping to change at page 34, line 46 ¶ | |||
| 5.5. Retrieve Merkle Inclusion Proof, Signed Tree Head and Consistency | 5.5. Retrieve Merkle Inclusion Proof, Signed Tree Head and Consistency | |||
| Proof by Leaf Hash | Proof by 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, in decimal. | proofs, in decimal. | |||
| The "hash" must be calculated as defined in Section 4.7. The | The "hash" must be calculated as defined in Section 4.7. A v2 STH | |||
| "tree_size" must designate an existing v2 STH. | must exist for the "tree_size". | |||
| Because of skew, the front-end may not know the requested STH or the | Because of skew, the front-end may not know the requested tree head | |||
| 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 STH | | | | requested tree head | | | |||
| +----------------+-------------------------------------+ | +---------------------+-------------------------------------+ | |||
| | latest STH > | Return latest STH and a consistency | | | latest STH > | Return latest STH and a consistency | | |||
| | requested STH | proof between it and the requested | | | requested tree head | proof between it and the requested | | |||
| | | STH (see Section 5.3) | | | | tree head (see Section 5.3) | | |||
| +----------------+-------------------------------------+ | +---------------------+-------------------------------------+ | |||
| | index of | Return "inclusion" | | | index of requested | Return "inclusion" | | |||
| | requested hash | | | | hash < latest STH | | | |||
| | < 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: A base64 encoded "TransItem" of type | |||
| "inclusion_proof_v2" whose "inclusion_path" array of Merkle | "inclusion_proof_v2" whose "inclusion_path" array of Merkle | |||
| Tree nodes proves the inclusion of the chosen certificate in | Tree nodes proves the inclusion of the certificate (as | |||
| the returned STH. | 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 by this log. | "signed_tree_head_v2", 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 STH 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 STHs, which are signed. | |||
| 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. | |||
| skipping to change at page 36, line 13 ¶ | skipping to change at page 36, line 12 ¶ | |||
| Inputs: start: 0-based index of first entry to retrieve, in | Inputs: start: 0-based index of first entry to retrieve, in | |||
| decimal. | 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 representing the 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 it. | include 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 by this log. | "signed_tree_head_v2", signed by this log. | |||
| skipping to change at page 37, line 9 ¶ | skipping to change at page 37, line 5 ¶ | |||
| Log servers MUST honor requests where 0 <= "start" < "tree_size" and | Log servers MUST honor requests where 0 <= "start" < "tree_size" and | |||
| "end" >= "tree_size" by returning a partial response covering only | "end" >= "tree_size" by returning a partial response covering only | |||
| the valid entries in the specified range. "end" >= "tree_size" could | the valid entries in the specified range. "end" >= "tree_size" could | |||
| be caused by skew. Note that the following restriction may also | be caused by 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". | entry specified by "start". Note that limit on the number of entries | |||
| is not immutable and therefore the restriction may be changed or | ||||
| lifted at any time and is not listed with the other Log Parameters in | ||||
| 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 "entries" array. | empty "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". | |||
| skipping to change at page 37, line 41 ¶ | skipping to change at page 37, line 40 ¶ | |||
| +----------------+------------------------------------+ | +----------------+------------------------------------+ | |||
| 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 base64 encoded trust anchors | Outputs: certificates: An array of JSON strings, each of which is a | |||
| that are acceptable to the log. | base64 encoded CA certificate that is acceptable to the log. | |||
| max_chain_length: | ||||
| max_chain_length: If the server has chosen to limit the | If the server has chosen to limit the length of chains it | |||
| length of chains it accepts, this is the maximum number of | accepts, this is the maximum number of certificates in the | |||
| certificates in the chain, in decimal. If there is no limit, | chain, in decimal. If there is no limit, this is omitted. | |||
| this is omitted. | ||||
| This data is not signed and the protocol depends on the security | ||||
| 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, where each SCT | each TLS client during full TLS handshakes, where each SCT | |||
| corresponds to the server certificate. They SHOULD also present | corresponds to the server certificate. (Of course, a server can only | |||
| corresponding inclusion proofs and STHs. | send a TLS extension if the client has specified it first.) Servers | |||
| SHOULD also present corresponding 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, the | extension data; see Section 4.4.2.1 of [RFC8446]. For TLS 1.2 | |||
| information is encoded as an extension in the "CertificateStatus" | ([RFC5246]), the information is encoded as an extension in the | |||
| message; see Section 8 of [RFC6066]. Using stapling also allows SCTs | "CertificateStatus" message; see Section 8 of [RFC6066]. Using | |||
| and inclusion proofs to be updated on the fly. | stapling also allows SCTs 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 non-compliant | |||
| and in need of re-issuance or the use of one of the other two methods | and in need of re-issuance or the use of one of the other two methods | |||
| for delivering CT information. | for delivering CT information. | |||
| skipping to change at page 39, line 10 ¶ | skipping to change at page 39, line 12 ¶ | |||
| 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 | * One or more logs may not have become acceptable to all CT-using | |||
| TLS clients. | TLS clients. Note that client discovery, trust, and distrust of | |||
| logs is expected to be handled out-of-band and is 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 | |||
| skipping to change at page 40, line 7 ¶ | skipping to change at page 40, line 14 ¶ | |||
| Here, "SerializedTransItem" is an opaque byte string that contains | Here, "SerializedTransItem" is an opaque byte string that contains | |||
| the serialized "TransItem" structure. This encoding ensures that TLS | the 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 to a client during a TLS | In each "TransItemList" that is sent during a TLS handshake, the TLS | |||
| handshake, the TLS server MUST include a "TransItem" structure of | server MUST include a "TransItem" structure of type "x509_sct_v2" or | |||
| 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 "TransItem"s 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 | |||
| skipping to change at page 40, line 32 ¶ | skipping to change at page 40, line 39 ¶ | |||
| * 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 | "TransItem"s (see Section 6.4), which SHOULD omit any "TransItem"s | |||
| 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" is not empty, then the TLS server MUST include the | "TransItemList" 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 "TransItemList". | this "TransItemList". If the list is empty then the server SHOULD | |||
| omit the "extension_data" element, but MAY send it with an empty | ||||
| 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 | |||
| skipping to change at page 44, line 49 ¶ | skipping to change at page 44, line 49 ¶ | |||
| 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. | changes. This document does not specify the polling frequency, | |||
| to allow for experimentation. | ||||
| 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. | |||
| skipping to change at page 47, line 48 ¶ | skipping to change at page 47, line 48 ¶ | |||
| | 0xEF | | | | | | 0xEF | | | | | |||
| +--------+------------+------------------------+-------------------+ | +--------+------------+------------------------+-------------------+ | |||
| | 0xF0 - | Reserved | | Private Use | | | 0xF0 - | Reserved | | Private Use | | |||
| | 0xFF | | | | | | 0xFF | | | | | |||
| +--------+------------+------------------------+-------------------+ | +--------+------------+------------------------+-------------------+ | |||
| Table 7 | Table 7 | |||
| 10.2.1. Specification Required guidance | 10.2.1. Specification Required guidance | |||
| The appointed Expert should ensure that the proposed algorithm has a | The appointed Expert(s) should ensure that the proposed algorithm has | |||
| public specification and is suitable for use as a cryptographic hash | a public specification and is suitable for use as a cryptographic | |||
| algorithm with no known preimage or collision attacks. These attacks | hash algorithm with no known preimage or collision attacks. These | |||
| can damage the integrity of the log. | attacks can damage the integrity of the log. | |||
| 10.3. Signature Algorithms | 10.3. Signature Algorithms | |||
| IANA is asked to establish a registry of signature algorithm values, | IANA is asked to establish a registry of signature algorithm values, | |||
| named "CT Signature Algorithms", that initially consists of: | named "CT Signature Algorithms" | |||
| The following notes should be added: | ||||
| * This is a subset of the TLS SignatureScheme Registry, limited to | ||||
| those algorithms that are appropriate for CT. A major advantage | ||||
| of this is leveraging the expertise of the TLS working group and | ||||
| its designated experts. | ||||
| * The value "0x0403" appears twice. While this may be confusing, it | ||||
| is okay because the verification process is the same for 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: | ||||
| +================================+==================+==============+ | +================================+==================+==============+ | |||
| | SignatureScheme Value | Signature | Reference / | | | SignatureScheme Value | Signature | Reference / | | |||
| | | Algorithm | Assignment | | | | Algorithm | Assignment | | |||
| | | | Policy | | | | | Policy | | |||
| +================================+==================+==============+ | +================================+==================+==============+ | |||
| | 0x0000 - 0x0402 | Unassigned | Expert | | | 0x0000 - 0x0402 | Unassigned | Expert | | |||
| | | | Review | | | | | Review | | |||
| +--------------------------------+------------------+--------------+ | +--------------------------------+------------------+--------------+ | |||
| | ecdsa_secp256r1_sha256(0x0403) | ECDSA (NIST | [FIPS186-4] | | | ecdsa_secp256r1_sha256(0x0403) | ECDSA (NIST | [FIPS186-4] | | |||
| skipping to change at page 49, line 42 ¶ | skipping to change at page 50, line 37 ¶ | |||
| | 0xE000 - | Reserved | Experimental Use | | | 0xE000 - | Reserved | Experimental Use | | |||
| | 0xEFFF | | | | | 0xEFFF | | | | |||
| +----------+----------------------+-------------------------------+ | +----------+----------------------+-------------------------------+ | |||
| | 0xF000 - | Reserved | Private Use | | | 0xF000 - | Reserved | Private Use | | |||
| | 0xFFFF | | | | | 0xFFFF | | | | |||
| +----------+----------------------+-------------------------------+ | +----------+----------------------+-------------------------------+ | |||
| Table 9 | Table 9 | |||
| * The 0x0000 value is reserved so that v1 SCTs are distinguishable | * The 0x0000 value is reserved so that v1 SCTs are distinguishable | |||
| from v2 SCTs and other "TransItem" structures. | from v2 SCTs and other "TransItem" structures. ### Specification | |||
| Required guidance | ||||
| [RFC Editor: please update 'RFCXXXX' to refer to this document, once | ||||
| its RFC number is known through the document.] | ||||
| 10.4.1. Specification Required guidance | ||||
| The appointed Expert should review the public specification to ensure | The appointed Expert should review the public specification to ensure | |||
| that it is detailed enough to ensure implementation interoperability. | that it is detailed enough to ensure implementation interoperability. | |||
| 10.5. Log Artifact Extension Registry | 10.5. Log Artifact Extension Registry | |||
| IANA is asked to establish a registry of "ExtensionType" values, | IANA is asked to establish a registry of "ExtensionType" values, | |||
| named "CT Log Artifact Extensions", that initially consists of: | named "CT Log Artifact Extensions", that initially consists of: | |||
| +===============+============+=====+===============================+ | +===============+============+=====+===============================+ | |||
| skipping to change at page 51, line 19 ¶ | skipping to change at page 52, line 19 ¶ | |||
| | 1.3.101.8192 - | Unassigned | Unassigned | First Come First | | | 1.3.101.8192 - | Unassigned | Unassigned | First Come First | | |||
| | 1.3.101.16383 | | | Served | | | 1.3.101.16383 | | | Served | | |||
| +----------------+--------------+--------------+-------------------+ | +----------------+--------------+--------------+-------------------+ | |||
| | 1.3.101.80.0 - | Unassigned | Unassigned | First Come First | | | 1.3.101.80.0 - | Unassigned | Unassigned | First Come First | | |||
| | 1.3.101.80.* | | | Served | | | 1.3.101.80.* | | | Served | | |||
| +----------------+--------------+--------------+-------------------+ | +----------------+--------------+--------------+-------------------+ | |||
| Table 11 | Table 11 | |||
| All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have been | All OIDs in the range from 1.3.101.8192 to 1.3.101.16383 have been | |||
| reserved. This is a limited resource of 8,192 OIDs, each of which | set aside for Log IDs. This is a limited resource of 8,192 OIDs, | |||
| has an encoded length of 4 octets. | each of which has an encoded length of 4 octets. | |||
| The 1.3.101.80 arc has been delegated. This is an unlimited | The 1.3.101.80 arc has also been set assigned for LogIDs. This is an | |||
| resource, but only the 128 OIDs from 1.3.101.80.0 to 1.3.101.80.127 | unlimited resource, but only the 128 OIDs from 1.3.101.80.0 to | |||
| have an encoded length of only 4 octets. | 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). | |||
| * 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 | |||
| skipping to change at page 54, line 14 ¶ | skipping to change at page 55, line 14 ¶ | |||
| 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. | |||
| [I-D.ietf-trans-threat-analysis] provides a more detailed threat | ||||
| analysis of the Certificate Transparency architecture. | ||||
| 11.1. Misissued Certificates | 11.1. Misissued Certificates | |||
| Misissued certificates that have not been publicly logged, and thus | Misissued certificates that have not been publicly logged, and thus | |||
| do not have a valid SCT, are not considered compliant. Misissued | do not have a valid SCT, are not considered compliant. Misissued | |||
| certificates that do have an SCT from a log will appear in that | certificates that do have an SCT from a log will appear in that | |||
| public log within the Maximum Merge Delay, assuming the log is | public log within the Maximum Merge Delay, assuming the log is | |||
| operating correctly. Since a log is allowed to serve an STH of any | operating correctly. Since a log is allowed to serve an STH of any | |||
| age up to the MMD, the maximum period of time during which a | age up to the MMD, the maximum period of time during which a | |||
| misissued certificate can be used without being available for audit | misissued certificate can be used without being available for audit | |||
| is twice the MMD. | is twice the MMD. | |||
| skipping to change at page 54, line 42 ¶ | skipping to change at page 55, line 39 ¶ | |||
| 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: failing to | |||
| incorporate a certificate with an SCT in the Merkle Tree within the | incorporate a certificate with an SCT in the Merkle Tree within the | |||
| MMD; presenting different, conflicting views of the Merkle Tree at | MMD; presenting different, conflicting views of the Merkle Tree at | |||
| different times and/or to different parties; issuing STHs too | 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. Such misbehavior is detectable and | certificate. | |||
| [I-D.ietf-trans-threat-analysis] provides more details on how this | ||||
| can be done. | ||||
| 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 clients comparing their instances of the Signed | can be detected by multiple clients comparing their instances of the | |||
| Tree Heads. There are various ways this could be done, for example | Signed Tree Heads. This technique, known as "gossip," is an active | |||
| via gossip (see [I-D.ietf-trans-gossip]) or peer-to-peer | area of research and not defined here. Proof of misbehavior in such | |||
| communications or by sending STHs to monitors (who could then | cases would be: a series of STHs that were issued too closely | |||
| directly check against their own copy of the relevant log). Proof of | together, proving violation of the STH issuance rate limit; or an STH | |||
| misbehavior in such cases would be: a series of STHs that were issued | with a root hash that does not match the one calculated from a copy | |||
| too closely together, proving violation of the STH issuance rate | of the log, proving violation of the append-only property. | |||
| limit; or an STH with a root hash that does not match the one | ||||
| calculated from a copy of the log, proving violation of the append- | ||||
| only property. | ||||
| 11.4. Preventing Tracking Clients | ||||
| Clients that gossip STHs or report back SCTs can be tracked or traced | Clients that report back SCTs can be tracked or traced if a log | |||
| if a log produces multiple STHs or SCTs with the same timestamp and | produces multiple STHs or SCTs with the same timestamp and data but | |||
| data but different signatures. Logs SHOULD mitigate this risk by | different signatures. Logs SHOULD mitigate this risk by either: | |||
| 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.5. 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.6. 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. Acknowledgements | |||
| The authors would like to thank Erwann Abelea, Robin Alden, Andrew | The authors would like to thank Erwann Abelea, Robin Alden, Andrew | |||
| skipping to change at page 56, line 34 ¶ | skipping to change at page 57, line 29 ¶ | |||
| [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>. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
| <https://www.rfc-editor.org/info/rfc3986>. | ||||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
| <https://www.rfc-editor.org/info/rfc4648>. | <https://www.rfc-editor.org/info/rfc4648>. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | ||||
| (TLS) Protocol Version 1.2", RFC 5246, | ||||
| DOI 10.17487/RFC5246, August 2008, | ||||
| <https://www.rfc-editor.org/info/rfc5246>. | ||||
| [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
| Housley, R., and W. Polk, "Internet X.509 Public Key | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
| Infrastructure Certificate and Certificate Revocation List | Infrastructure Certificate and Certificate Revocation List | |||
| (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | |||
| <https://www.rfc-editor.org/info/rfc5280>. | <https://www.rfc-editor.org/info/rfc5280>. | |||
| [RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, | [RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, | |||
| RFC 5652, DOI 10.17487/RFC5652, September 2009, | RFC 5652, DOI 10.17487/RFC5652, September 2009, | |||
| <https://www.rfc-editor.org/info/rfc5652>. | <https://www.rfc-editor.org/info/rfc5652>. | |||
| [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| DOI 10.17487/RFC6066, January 2011, | DOI 10.17487/RFC6066, January 2011, | |||
| <https://www.rfc-editor.org/info/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
| [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | ||||
| (SHA and SHA-based HMAC and HKDF)", RFC 6234, | ||||
| DOI 10.17487/RFC6234, May 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6234>. | ||||
| [RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., | [RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., | |||
| Galperin, S., and C. Adams, "X.509 Internet Public Key | Galperin, S., and C. Adams, "X.509 Internet Public Key | |||
| Infrastructure Online Certificate Status Protocol - OCSP", | Infrastructure Online Certificate Status Protocol - OCSP", | |||
| RFC 6960, DOI 10.17487/RFC6960, June 2013, | RFC 6960, DOI 10.17487/RFC6960, June 2013, | |||
| <https://www.rfc-editor.org/info/rfc6960>. | <https://www.rfc-editor.org/info/rfc6960>. | |||
| [RFC6979] Pornin, T., "Deterministic Usage of the Digital Signature | ||||
| Algorithm (DSA) and Elliptic Curve Digital Signature | ||||
| Algorithm (ECDSA)", RFC 6979, DOI 10.17487/RFC6979, August | ||||
| 2013, <https://www.rfc-editor.org/info/rfc6979>. | ||||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
| DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7231>. | <https://www.rfc-editor.org/info/rfc7231>. | |||
| [RFC7633] Hallam-Baker, P., "X.509v3 Transport Layer Security (TLS) | [RFC7633] Hallam-Baker, P., "X.509v3 Transport Layer Security (TLS) | |||
| Feature Extension", RFC 7633, DOI 10.17487/RFC7633, | Feature Extension", RFC 7633, DOI 10.17487/RFC7633, | |||
| October 2015, <https://www.rfc-editor.org/info/rfc7633>. | October 2015, <https://www.rfc-editor.org/info/rfc7633>. | |||
| [RFC7807] Nottingham, M. and E. Wilde, "Problem Details for HTTP | [RFC7807] Nottingham, M. and E. Wilde, "Problem Details for HTTP | |||
| skipping to change at page 57, line 38 ¶ | skipping to change at page 59, line 5 ¶ | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
| Interchange Format", STD 90, RFC 8259, | Interchange Format", STD 90, RFC 8259, | |||
| DOI 10.17487/RFC8259, December 2017, | DOI 10.17487/RFC8259, December 2017, | |||
| <https://www.rfc-editor.org/info/rfc8259>. | <https://www.rfc-editor.org/info/rfc8259>. | |||
| [RFC8391] Huelsing, A., Butin, D., Gazdag, S., Rijneveld, J., and A. | ||||
| Mohaisen, "XMSS: eXtended Merkle Signature Scheme", | ||||
| RFC 8391, DOI 10.17487/RFC8391, May 2018, | ||||
| <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 IEEE Std | |||
| 1003.1-2008, 2016 Edition", n.d., | 1003.1-2008, 2016 Edition", n.d., | |||
| <http://pubs.opengroup.org/ | <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: | ||||
| Specification of Basic Encoding Rules (BER), Canonical | ||||
| Encoding Rules (CER) and Distinguished Encoding Rules | ||||
| (DER)", ISO/IEC 8825-1:2002, November 2015. | ||||
| 13.2. Informative References | 13.2. Informative References | |||
| [CABBR] CA/Browser Forum, "Baseline Requirements for the Issuance | ||||
| and Management of Publicly-Trusted Certificates", 2020, | ||||
| <https://cabforum.org/wp-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", 2014, <http://www.chromium.org/Home/chromium- | |||
| security/certificate-transparency/log-policy>. | security/certificate-transparency/log-policy>. | |||
| [Chromium.Policy] | [Chromium.Policy] | |||
| The Chromium Projects, "Chromium Certificate | The Chromium Projects, "Chromium Certificate | |||
| Transparency", 2014, <http://www.chromium.org/Home/ | Transparency", 2014, <http://www.chromium.org/Home/ | |||
| chromium-security/certificate-transparency>. | chromium-security/certificate-transparency>. | |||
| [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>. | |||
| [I-D.ietf-trans-gossip] | ||||
| Nordberg, L., Gillmor, D. K., and T. Ritter, "Gossiping in | ||||
| CT", Work in Progress, Internet-Draft, draft-ietf-trans- | ||||
| gossip-05, 14 January 2018, | ||||
| <https://www.ietf.org/archive/id/draft-ietf-trans-gossip- | ||||
| 05.txt>. | ||||
| [I-D.ietf-trans-threat-analysis] | ||||
| Kent, S., "Attack and Threat Model for Certificate | ||||
| Transparency", Work in Progress, Internet-Draft, draft- | ||||
| ietf-trans-threat-analysis-16, 5 October 2018, | ||||
| <https://www.ietf.org/archive/id/draft-ietf-trans-threat- | ||||
| analysis-16.txt>. | ||||
| [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", 2014, <https://www.gstatic.com/ct/log_list/ | |||
| log_list_schema.json>. | log_list_schema.json>. | |||
| [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | ||||
| (SHA and SHA-based HMAC and HKDF)", RFC 6234, | ||||
| DOI 10.17487/RFC6234, May 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6234>. | ||||
| [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>. | |||
| [RFC6979] Pornin, T., "Deterministic Usage of the Digital Signature | ||||
| Algorithm (DSA) and Elliptic Curve Digital Signature | ||||
| Algorithm (ECDSA)", RFC 6979, DOI 10.17487/RFC6979, August | ||||
| 2013, <https://www.rfc-editor.org/info/rfc6979>. | ||||
| [RFC7320] Nottingham, M., "URI Design and Ownership", RFC 7320, | [RFC7320] Nottingham, M., "URI Design and Ownership", RFC 7320, | |||
| DOI 10.17487/RFC7320, July 2014, | DOI 10.17487/RFC7320, July 2014, | |||
| <https://www.rfc-editor.org/info/rfc7320>. | <https://www.rfc-editor.org/info/rfc7320>. | |||
| [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>. | |||
| Appendix A. Supporting v1 and v2 simultaneously | 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. | |||
| skipping to change at page 60, line 5 ¶ | skipping to change at page 61, line 5 ¶ | |||
| * 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) | ||||
| The following ASN.1 module may be useful to implementors. | ||||
| CertificateTransparencyV2Module-2021 | ||||
| -- { OID Needed, but no point in using a short one } | ||||
| DEFINITIONS IMPLICIT TAGS ::= BEGIN | ||||
| -- EXPORTS ALL -- | ||||
| IMPORTS | ||||
| EXTENSION | ||||
| FROM PKIX-CommonTypes-2009 -- RFC 5912 | ||||
| { iso(1) identified-organization(3) dod(6) internet(1) | ||||
| security(5) mechanisms(5) pkix(7) id-mod(0) | ||||
| id-mod-pkixCommon-02(57) } | ||||
| CONTENT-TYPE | ||||
| FROM CryptographicMessageSyntax-2010 -- RFC 6268 | ||||
| { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) | ||||
| pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) } | ||||
| TBSCertificate | ||||
| FROM PKIX1Explicit-2009 -- RFC 5912 | ||||
| { iso(1) identified-organization(3) dod(6) internet(1) | ||||
| security(5) mechanisms(5) pkix(7) id-mod(0) | ||||
| id-mod-pkix1-explicit-02(51) } | ||||
| ; | ||||
| -- | ||||
| -- Section 3.2. Precertificates | ||||
| -- | ||||
| ct-tbsCertificate CONTENT-TYPE ::= { | ||||
| TYPE TBSCertificate | ||||
| IDENTIFIED BY id-ct-tbsCertificate } | ||||
| id-ct-tbsCertificate OBJECT IDENTIFIER ::= { 1 3 101 78 } | ||||
| -- | ||||
| -- Section 7.1. Transparency Information X.509v3 Extension | ||||
| -- | ||||
| ext-transparencyInfo EXTENSION ::= { | ||||
| SYNTAX TransparencyInformationSyntax | ||||
| IDENTIFIED BY id-ce-transparencyInfo | ||||
| CRITICALITY { FALSE } } | ||||
| id-ce-transparencyInfo OBJECT IDENTIFIER ::= { 1 3 101 75 } | ||||
| TransparencyInformationSyntax ::= OCTET STRING | ||||
| -- | ||||
| -- Section 7.1.1. OCSP Response Extension | ||||
| -- | ||||
| ext-ocsp-transparencyInfo EXTENSION ::= { | ||||
| SYNTAX TransparencyInformationSyntax | ||||
| IDENTIFIED BY id-pkix-ocsp-transparencyInfo | ||||
| CRITICALITY { FALSE } } | ||||
| id-pkix-ocsp-transparencyInfo OBJECT IDENTIFIER ::= | ||||
| id-ce-transparencyInfo | ||||
| -- | ||||
| -- Section 8.1.2. Reconstructing the TBSCertificate | ||||
| -- | ||||
| ext-embeddedSCT-CTv1 EXTENSION ::= { | ||||
| SYNTAX SignedCertificateTimestampList | ||||
| IDENTIFIED BY id-ce-embeddedSCT-CTv1 | ||||
| CRITICALITY { FALSE } } | ||||
| id-ce-embeddedSCT-CTv1 OBJECT IDENTIFIER ::= { | ||||
| 1 3 6 1 4 1 11129 2 4 2 } | ||||
| SignedCertificateTimestampList ::= OCTET STRING | ||||
| END | ||||
| Authors' Addresses | Authors' Addresses | |||
| Ben Laurie | Ben Laurie | |||
| Google UK Ltd. | Google UK Ltd. | |||
| Email: benl@google.com | Email: benl@google.com | |||
| Adam Langley | Adam Langley | |||
| Google Inc. | Google Inc. | |||
| End of changes. 102 change blocks. | ||||
| 239 lines changed or deleted | 379 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/ | ||||