merkle_tree_leaf.cc 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/cert/merkle_tree_leaf.h"
  5. #include "crypto/sha2.h"
  6. #include "net/cert/ct_objects_extractor.h"
  7. #include "net/cert/ct_serialization.h"
  8. #include "net/cert/x509_certificate.h"
  9. namespace net::ct {
  10. MerkleTreeLeaf::MerkleTreeLeaf() = default;
  11. MerkleTreeLeaf::MerkleTreeLeaf(const MerkleTreeLeaf& other) = default;
  12. MerkleTreeLeaf::MerkleTreeLeaf(MerkleTreeLeaf&&) = default;
  13. MerkleTreeLeaf::~MerkleTreeLeaf() = default;
  14. bool HashMerkleTreeLeaf(const MerkleTreeLeaf& tree_leaf, std::string* out) {
  15. // Prepend 0 byte as per RFC 6962, section-2.1
  16. std::string leaf_in_tls_format("\x00", 1);
  17. if (!EncodeTreeLeaf(tree_leaf, &leaf_in_tls_format))
  18. return false;
  19. *out = crypto::SHA256HashString(leaf_in_tls_format);
  20. return true;
  21. }
  22. bool GetMerkleTreeLeaf(const X509Certificate* cert,
  23. const SignedCertificateTimestamp* sct,
  24. MerkleTreeLeaf* merkle_tree_leaf) {
  25. if (sct->origin == SignedCertificateTimestamp::SCT_EMBEDDED) {
  26. if (cert->intermediate_buffers().empty() ||
  27. !GetPrecertSignedEntry(cert->cert_buffer(),
  28. cert->intermediate_buffers().front().get(),
  29. &merkle_tree_leaf->signed_entry)) {
  30. return false;
  31. }
  32. } else {
  33. if (!GetX509SignedEntry(cert->cert_buffer(),
  34. &merkle_tree_leaf->signed_entry)) {
  35. return false;
  36. }
  37. }
  38. merkle_tree_leaf->timestamp = sct->timestamp;
  39. merkle_tree_leaf->extensions = sct->extensions;
  40. return true;
  41. }
  42. } // namespace net::ct