| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/cert/merkle_tree_leaf.h" |
| |
| #include "crypto/sha2.h" |
| #include "net/cert/ct_objects_extractor.h" |
| #include "net/cert/ct_serialization.h" |
| #include "net/cert/x509_certificate.h" |
| |
| namespace net { |
| |
| namespace ct { |
| |
| MerkleTreeLeaf::MerkleTreeLeaf() = default; |
| |
| MerkleTreeLeaf::MerkleTreeLeaf(const MerkleTreeLeaf& other) = default; |
| |
| MerkleTreeLeaf::MerkleTreeLeaf(MerkleTreeLeaf&&) = default; |
| |
| MerkleTreeLeaf::~MerkleTreeLeaf() = default; |
| |
| bool HashMerkleTreeLeaf(const MerkleTreeLeaf& tree_leaf, std::string* out) { |
| // Prepend 0 byte as per RFC 6962, section-2.1 |
| std::string leaf_in_tls_format("\x00", 1); |
| if (!EncodeTreeLeaf(tree_leaf, &leaf_in_tls_format)) |
| return false; |
| |
| *out = crypto::SHA256HashString(leaf_in_tls_format); |
| return true; |
| } |
| |
| bool GetMerkleTreeLeaf(const X509Certificate* cert, |
| const SignedCertificateTimestamp* sct, |
| MerkleTreeLeaf* merkle_tree_leaf) { |
| if (sct->origin == SignedCertificateTimestamp::SCT_EMBEDDED) { |
| if (cert->intermediate_buffers().empty() || |
| !GetPrecertSignedEntry(cert->cert_buffer(), |
| cert->intermediate_buffers().front().get(), |
| &merkle_tree_leaf->signed_entry)) { |
| return false; |
| } |
| } else { |
| if (!GetX509SignedEntry(cert->cert_buffer(), |
| &merkle_tree_leaf->signed_entry)) { |
| return false; |
| } |
| } |
| |
| merkle_tree_leaf->timestamp = sct->timestamp; |
| merkle_tree_leaf->extensions = sct->extensions; |
| return true; |
| } |
| |
| } // namespace ct |
| |
| } // namespace net |