Add MtcLogBuilder to cert_builder [chromium/src : main]

0 views
Skip to first unread message

Matt Mueller (Gerrit)

unread,
Dec 18, 2025, 6:14:19 PM (2 days ago) Dec 18
to Matt Mueller, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
Attention needed from Lily Chen

Matt Mueller added 9 comments

File net/test/cert_builder.h
Line 527, Patchset 1: std::optional<bssl::UniquePtr<CRYPTO_BUFFER>>
Lily Chen . resolved

nit: can you specify in the comment the meaning of nullopt vs a null UniquePtr vs an empty buffer?

Matt Mueller

good point, removed the optional here since uniqueptr already can specify that by returnning nullptr.

Line 493, Patchset 1: std::pair<uint64_t, uint64_t> GetActiveLandmarkRange() {
Lily Chen . resolved

nit: make a type alias for landmark indices? It seems error-prone/confusing to use the same type for indices demarcating a subtree (which also seem to variously use either size_t or uint64_t; can we stick with one or the other?) and landmark numbers/indices.

Matt Mueller

Done

File net/test/cert_builder.cc
Line 1376, Patchset 1: for (const auto& extension_it : extensions_) {
Lily Chen . resolved

nit: can use structured binding
`for (const auto& [extension_name, extension_value] : extensions_)`

Matt Mueller

Done

Line 1557, Patchset 1: size_t split = bit_length(start ^ last) - 1;
Lily Chen . resolved

nit: make these all const

Matt Mueller

Done

Line 1605, Patchset 1: node_cache_[level_index].resize(position_index);
Lily Chen . resolved

nit: maybe add the `value` argument to resize(), just to be more clear/explicit that this is adding default initialized elements of (presumably) std::nullopt?

Matt Mueller

(no longer relevant after updating to use the new boring MerkleTree design)

Line 1610, Patchset 1: std::vector<std::vector<std::optional<bssl::TreeHash>>> node_cache_;
Lily Chen . resolved

I'm not sure how this is going to be used, but would it make sense for this to be a sparse thing like maybe a map(tuple(level_index, position_index), TreeHash)?

Matt Mueller

(no longer relevant after updating to use the new boring MerkleTree design)

Line 1712, Patchset 1:MtcLogBuilder::MtcLogEntry MtcLogBuilder::MtcLogEntry::NullEntry() {
Lily Chen . resolved

optional suggestion: maybe this could return a const reference to a singleton instance, like how GURL::EmptyGURL() works?

Matt Mueller

added as a TODO

Line 1789, Patchset 1: landmarks_.push_back(data_->Size());
Lily Chen . resolved

Should we CHECK that the landmarks' tree sizes never decrease?

Matt Mueller

not sure it's worth CHECKing since the interfaces only allow appending to the tree

Line 1793, Patchset 1:std::vector<bssl::Subtree> MtcLogBuilder::GetLandmarkSubtrees() {
Lily Chen . resolved

Could these just be precomputed (maybe when adding every new landmark) and cached so that we don't have to generate them repeatedly?

Matt Mueller

added that as a TODO

Open in Gerrit

Related details

Attention is currently required from:
  • Lily Chen
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
Gerrit-Change-Number: 7269227
Gerrit-PatchSet: 3
Gerrit-Owner: Matt Mueller <ma...@chromium.org>
Gerrit-CC: Lily Chen <chl...@chromium.org>
Gerrit-Attention: Lily Chen <chl...@chromium.org>
Gerrit-Comment-Date: Thu, 18 Dec 2025 23:14:07 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Lily Chen <chl...@chromium.org>
satisfied_requirement
unsatisfied_requirement
open
diffy

Nick Harper (Gerrit)

unread,
Dec 18, 2025, 7:11:36 PM (2 days ago) Dec 18
to Matt Mueller, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
Attention needed from Lily Chen and Matt Mueller

Nick Harper added 4 comments

File net/test/cert_builder.h
Line 497, Patchset 3 (Latest): std::pair<LandmarkNumber, LandmarkNumber> GetActiveLandmarkRange() {
Nick Harper . unresolved

For whatever reason, the phrase "active landmark" sounds to me like it refers to the stuff that will go in the next landmark to be generated (hence "active"), instead of referring to all of the landmarks that have already been created (and are immutable).

File net/test/cert_builder.cc
Line 1552, Patchset 3 (Latest): if (start == last) {
Nick Harper . unresolved

If [start, end) is a valid subtree, we can also return that as a single subtree rather than 2.

Line 1563, Patchset 3 (Latest): const uint64_t left_split = bit_length(~start & mask);
Nick Harper . unresolved

I don't understand the function of `~start` here. Can you add some comments explaining the bit operations? (Alternatively, can this be rewritten similar to how `split` was written with bit_length(a XOR b), possibly using `mid` in place of `last`?)

Line 1617, Patchset 3 (Latest): // deduplicate this somehow?
Nick Harper . resolved

One way to dedupe the code is to remove it from MTCAnchor (and have MTCAnchor always return the same synthetic cert regardless of subject).

Open in Gerrit

Related details

Attention is currently required from:
  • Lily Chen
  • Matt Mueller
Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
    Gerrit-Change-Number: 7269227
    Gerrit-PatchSet: 3
    Gerrit-Owner: Matt Mueller <ma...@chromium.org>
    Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
    Gerrit-CC: Lily Chen <chl...@chromium.org>
    Gerrit-Attention: Lily Chen <chl...@chromium.org>
    Gerrit-Attention: Matt Mueller <ma...@chromium.org>
    Gerrit-Comment-Date: Fri, 19 Dec 2025 00:11:24 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Lily Chen (Gerrit)

    unread,
    Dec 18, 2025, 7:26:30 PM (2 days ago) Dec 18
    to Matt Mueller, Nick Harper, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
    Attention needed from Matt Mueller

    Lily Chen added 1 comment

    Patchset-level comments
    File-level comment, Patchset 3 (Latest):
    Lily Chen . resolved

    (deferring to Nick for review)

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Matt Mueller
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
    Gerrit-Change-Number: 7269227
    Gerrit-PatchSet: 3
    Gerrit-Owner: Matt Mueller <ma...@chromium.org>
    Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
    Gerrit-CC: Lily Chen <chl...@chromium.org>
    Gerrit-Attention: Matt Mueller <ma...@chromium.org>
    Gerrit-Comment-Date: Fri, 19 Dec 2025 00:26:25 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Matt Mueller (Gerrit)

    unread,
    Dec 18, 2025, 8:11:38 PM (2 days ago) Dec 18
    to Matt Mueller, David Benjamin, Nick Harper, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
    Attention needed from David Benjamin and Nick Harper

    Matt Mueller added 3 comments

    File net/test/cert_builder.h
    Line 497, Patchset 3: std::pair<LandmarkNumber, LandmarkNumber> GetActiveLandmarkRange() {
    Nick Harper . unresolved

    For whatever reason, the phrase "active landmark" sounds to me like it refers to the stuff that will go in the next landmark to be generated (hence "active"), instead of referring to all of the landmarks that have already been created (and are immutable).

    File net/test/cert_builder.cc
    Line 1552, Patchset 3: if (start == last) {
    Nick Harper . unresolved

    If [start, end) is a valid subtree, we can also return that as a single subtree rather than 2.

    Matt Mueller

    hmm, interesting point. Perhaps the draft should be updated? I'm not clear if there is an implicit "only use this algorithm if it isn't already a valid subtree" here: https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-4.5

    It does say the algorithm is for any interval so it seems like it should handle that case in the described algorithm if it's intended.

    @davi...@chromium.org thoughts?

    Line 1563, Patchset 3: const uint64_t left_split = bit_length(~start & mask);
    Nick Harper . resolved

    I don't understand the function of `~start` here. Can you add some comments explaining the bit operations? (Alternatively, can this be rewritten similar to how `split` was written with bit_length(a XOR b), possibly using `mid` in place of `last`?)

    Matt Mueller

    This is based on the sample code from the draft: https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-4.5-5

    I'll add the draft reference in a comment.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • David Benjamin
    • Nick Harper
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
    Gerrit-Change-Number: 7269227
    Gerrit-PatchSet: 4
    Gerrit-Owner: Matt Mueller <ma...@chromium.org>
    Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
    Gerrit-CC: David Benjamin <davi...@chromium.org>
    Gerrit-CC: Lily Chen <chl...@chromium.org>
    Gerrit-Attention: David Benjamin <davi...@chromium.org>
    Gerrit-Attention: Nick Harper <nha...@chromium.org>
    Gerrit-Comment-Date: Fri, 19 Dec 2025 01:11:27 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Nick Harper <nha...@chromium.org>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    David Benjamin (Gerrit)

    unread,
    Dec 18, 2025, 9:00:14 PM (2 days ago) Dec 18
    to Matt Mueller, Chromium LUCI CQ, Nick Harper, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
    Attention needed from Matt Mueller and Nick Harper

    David Benjamin added 1 comment

    File net/test/cert_builder.cc
    Line 1552, Patchset 3: if (start == last) {
    Nick Harper . unresolved

    If [start, end) is a valid subtree, we can also return that as a single subtree rather than 2.

    Matt Mueller

    hmm, interesting point. Perhaps the draft should be updated? I'm not clear if there is an implicit "only use this algorithm if it isn't already a valid subtree" here: https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-4.5

    It does say the algorithm is for any interval so it seems like it should handle that case in the described algorithm if it's intended.

    @davi...@chromium.org thoughts?

    David Benjamin

    (Haven't looked at the rest, just this question.)

    As currently spec'd, the algorithm will actually split valid subtrees into their left and right subtrees. (It's not important for the core certificate verification state whether everyone agrees, but it is important for the negotiation bit because we just specify the subtrees implicitly by landmarks.)

    We could make the `end - start == 1` special case be an `is_subtree(start, end)` instead, and it would have worked just as well. I went with this one just because:

    • This is an easier operation to implement
    • This edge case will approximately never happen in a high-issuance-rate CA, so it doesn't really matter
    • If it does happen, since everyone has to budget for two hashes per landmark anyway, we may as well shave 32 bytes and split them down one later since it doesn't cost anything.
    Open in Gerrit

    Related details

    Attention is currently required from:
    • Matt Mueller
    • Nick Harper
    Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
    Gerrit-Change-Number: 7269227
    Gerrit-PatchSet: 6
    Gerrit-Owner: Matt Mueller <ma...@chromium.org>
    Gerrit-Reviewer: Matt Mueller <ma...@chromium.org>
    Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
    Gerrit-CC: David Benjamin <davi...@chromium.org>
    Gerrit-CC: Lily Chen <chl...@chromium.org>
    Gerrit-Attention: Matt Mueller <ma...@chromium.org>
    Gerrit-Attention: Nick Harper <nha...@chromium.org>
    Gerrit-Comment-Date: Fri, 19 Dec 2025 02:00:08 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Matt Mueller <ma...@chromium.org>
    Comment-In-Reply-To: Nick Harper <nha...@chromium.org>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Nick Harper (Gerrit)

    unread,
    Dec 18, 2025, 9:38:30 PM (2 days ago) Dec 18
    to Matt Mueller, Chromium LUCI CQ, David Benjamin, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
    Attention needed from Matt Mueller

    Nick Harper voted and added 1 comment

    Votes added by Nick Harper

    Code-Review+1

    1 comment

    Patchset-level comments
    File-level comment, Patchset 6 (Latest):
    Nick Harper . resolved

    I didn't realize the things I had questions about were things that came from the draft. LGTM with citations to appropriate sections of the draft added.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Matt Mueller
    Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
      Gerrit-Change-Number: 7269227
      Gerrit-PatchSet: 6
      Gerrit-Owner: Matt Mueller <ma...@chromium.org>
      Gerrit-Reviewer: Matt Mueller <ma...@chromium.org>
      Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
      Gerrit-CC: David Benjamin <davi...@chromium.org>
      Gerrit-CC: Lily Chen <chl...@chromium.org>
      Gerrit-Attention: Matt Mueller <ma...@chromium.org>
      Gerrit-Comment-Date: Fri, 19 Dec 2025 02:38:18 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: Yes
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Matt Mueller (Gerrit)

      unread,
      Dec 19, 2025, 12:08:39 PM (2 days ago) Dec 19
      to Matt Mueller, Nick Harper, Chromium LUCI CQ, David Benjamin, Lily Chen, chromium...@chromium.org, net-r...@chromium.org
      Attention needed from David Benjamin

      Matt Mueller voted and added 2 comments

      Votes added by Matt Mueller

      Commit-Queue+2

      2 comments

      File net/test/cert_builder.h
      Line 497, Patchset 3: std::pair<LandmarkNumber, LandmarkNumber> GetActiveLandmarkRange() {
      Nick Harper . resolved

      For whatever reason, the phrase "active landmark" sounds to me like it refers to the stuff that will go in the next landmark to be generated (hence "active"), instead of referring to all of the landmarks that have already been created (and are immutable).

      Matt Mueller

      `active` is the term used in the draft (https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-6.3.1-7)

      Matt Mueller

      added a bit more comments and links

      File net/test/cert_builder.cc
      Line 1552, Patchset 3: if (start == last) {
      Nick Harper . resolved

      If [start, end) is a valid subtree, we can also return that as a single subtree rather than 2.

      Matt Mueller

      hmm, interesting point. Perhaps the draft should be updated? I'm not clear if there is an implicit "only use this algorithm if it isn't already a valid subtree" here: https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-4.5

      It does say the algorithm is for any interval so it seems like it should handle that case in the described algorithm if it's intended.

      @davi...@chromium.org thoughts?

      David Benjamin

      (Haven't looked at the rest, just this question.)

      As currently spec'd, the algorithm will actually split valid subtrees into their left and right subtrees. (It's not important for the core certificate verification state whether everyone agrees, but it is important for the negotiation bit because we just specify the subtrees implicitly by landmarks.)

      We could make the `end - start == 1` special case be an `is_subtree(start, end)` instead, and it would have worked just as well. I went with this one just because:

      • This is an easier operation to implement
      • This edge case will approximately never happen in a high-issuance-rate CA, so it doesn't really matter
      • If it does happen, since everyone has to budget for two hashes per landmark anyway, we may as well shave 32 bytes and split them down one later since it doesn't cost anything.
      Matt Mueller

      acknowledged, makes sense!

      Open in Gerrit

      Related details

      Attention is currently required from:
      • David Benjamin
      Submit Requirements:
        • requirement satisfiedCode-Coverage
        • requirement satisfiedCode-Owners
        • requirement satisfiedCode-Review
        • requirement satisfiedReview-Enforcement
        Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
        Gerrit-MessageType: comment
        Gerrit-Project: chromium/src
        Gerrit-Branch: main
        Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
        Gerrit-Change-Number: 7269227
        Gerrit-PatchSet: 7
        Gerrit-Owner: Matt Mueller <ma...@chromium.org>
        Gerrit-Reviewer: Matt Mueller <ma...@chromium.org>
        Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
        Gerrit-CC: David Benjamin <davi...@chromium.org>
        Gerrit-CC: Lily Chen <chl...@chromium.org>
        Gerrit-Attention: David Benjamin <davi...@chromium.org>
        Gerrit-Comment-Date: Fri, 19 Dec 2025 17:08:25 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: Yes
        Comment-In-Reply-To: Matt Mueller <ma...@chromium.org>
        Comment-In-Reply-To: David Benjamin <davi...@chromium.org>
        Comment-In-Reply-To: Nick Harper <nha...@chromium.org>
        satisfied_requirement
        open
        diffy

        Chromium LUCI CQ (Gerrit)

        unread,
        Dec 19, 2025, 1:05:34 PM (2 days ago) Dec 19
        to Matt Mueller, Nick Harper, David Benjamin, Lily Chen, chromium...@chromium.org, net-r...@chromium.org

        Chromium LUCI CQ submitted the change with unreviewed changes

        Unreviewed changes

        6 is the latest approved patch-set.
        The change was submitted with unreviewed changes in the following files:

        ```
        The name of the file: net/test/cert_builder.h
        Insertions: 19, Deletions: 1.

        @@ -494,15 +494,31 @@
        bool AdvanceLandmark();

        // Returns the range, inclusive, of active landmark numbers.
        + //
        + // Active landmarks are those that may contain un-expired certificates
        + // (https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-6.3.1-7)
        + //
        + // This implementation doesn't directly care about expiration or validity
        + // periods and leaves those details to the test to control. It does not
        + // currently support advancing the minimum landmark, but that could be added
        + // if a test needs it.
        + //
        + // Landmark numbers can be used to form Trust Anchor IDs
        + // https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-6.3.1-4

        std::pair<LandmarkNumber, LandmarkNumber> GetActiveLandmarkRange() {
             return {0, landmarks_.size() - 1};
        }

        // Returns the currently active landmark subtrees.
        + //
        + // https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#section-6.3.1-7
        std::vector<bssl::Subtree> GetLandmarkSubtrees();

        // Returns the subtrees and subtree hashes for the currently active
        - // landmarks.
        + // landmarks. This information is needed by the client to verify
        + // signatureless certificates.
        + //
        + // https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#trusted-subtrees
        std::vector<bssl::TrustedSubtree> GetLandmarkSubtreeHashes();

        // Add entry to the log and return the index of the entry.
        @@ -523,6 +539,8 @@

        // Returns the DER-encoded certificate for entry `index`, which must be
        // included in the active landmark subtrees. Returns nullopt otherwise.
        + //
        + // https://davidben.github.io/merkle-tree-certs/draft-davidben-tls-merkle-tree-certs.html#name-constructing-signatureless-
        std::optional<std::vector<uint8_t>> CreateSignaturelessCertificate(
        LogIndex index);

        ```

        Change information

        Commit message:
        Add MtcLogBuilder to cert_builder

        Simple testing implementation of a Merkle Tree Certificate log.
        Only supports signatureless certificates currently.
        Bug: 469624806
        Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
        Commit-Queue: Matt Mueller <ma...@chromium.org>
        Reviewed-by: Nick Harper <nha...@chromium.org>
        Cr-Commit-Position: refs/heads/main@{#1561225}
        Files:
        • M net/test/cert_builder.cc
        • M net/test/cert_builder.h
        Change size: L
        Delta: 2 files changed, 551 insertions(+), 32 deletions(-)
        Branch: refs/heads/main
        Submit Requirements:
        • requirement satisfiedCode-Review: +1 by Nick Harper
        Open in Gerrit
        Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
        Gerrit-MessageType: merged
        Gerrit-Project: chromium/src
        Gerrit-Branch: main
        Gerrit-Change-Id: Ia61fd5de01f5125eab97ad4b34c4e6a71766989e
        Gerrit-Change-Number: 7269227
        Gerrit-PatchSet: 8
        Gerrit-Owner: Matt Mueller <ma...@chromium.org>
        Gerrit-Reviewer: Chromium LUCI CQ <chromiu...@luci-project-accounts.iam.gserviceaccount.com>
        Gerrit-Reviewer: Matt Mueller <ma...@chromium.org>
        Gerrit-Reviewer: Nick Harper <nha...@chromium.org>
        open
        diffy
        satisfied_requirement
        Reply all
        Reply to author
        Forward
        0 new messages