Add ECDH message crypter class for P2P control channel encryption [chromium/src : main]

0 views
Skip to first unread message

Joe Downing (Gerrit)

unread,
Jan 12, 2026, 7:37:37 PM (8 days ago) Jan 12
to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
Attention needed from Elly FJ and Yuwei Huang

Joe Downing added 1 comment

Patchset-level comments
File-level comment, Patchset 5 (Latest):
Joe Downing . resolved

PTAL!

Open in Gerrit

Related details

Attention is currently required from:
  • Elly FJ
  • Yuwei Huang
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: I091002574f40a782846d102c147a505bdb17bfa7
Gerrit-Change-Number: 7455374
Gerrit-PatchSet: 5
Gerrit-Owner: Joe Downing <joe...@chromium.org>
Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
Gerrit-Attention: Elly FJ <elly...@chromium.org>
Gerrit-Attention: Yuwei Huang <yuw...@chromium.org>
Gerrit-Comment-Date: Tue, 13 Jan 2026 00:37:26 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Yuwei Huang (Gerrit)

unread,
Jan 12, 2026, 8:35:06 PM (8 days ago) Jan 12
to Joe Downing, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
Attention needed from Elly FJ and Joe Downing

Yuwei Huang voted and added 3 comments

Votes added by Yuwei Huang

Code-Review+1

3 comments

Patchset-level comments
Yuwei Huang . resolved

LGTM w/ nits

File remoting/base/ecdh_aes_crypter.cc
Line 55, Patchset 5 (Latest): bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key_pair_.key(), nullptr));
Yuwei Huang . unresolved

`std::unique_ptr`? `bssl::UniquePtr` is just alias of `std::unique_ptr`, and it seems you are only passing the raw pointer around.

```suggestion
std::unique_ptr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key_pair_.key(), nullptr));
```
Line 73, Patchset 5 (Latest): shared_secret.resize(shared_secret_len);
Yuwei Huang . unresolved

Do you need this call, since the constructor already default-inserts `shared_secret` with `shared_secret_len` 0s?

Open in Gerrit

Related details

Attention is currently required from:
  • Elly FJ
  • Joe Downing
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: I091002574f40a782846d102c147a505bdb17bfa7
    Gerrit-Change-Number: 7455374
    Gerrit-PatchSet: 5
    Gerrit-Owner: Joe Downing <joe...@chromium.org>
    Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
    Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
    Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
    Gerrit-Attention: Joe Downing <joe...@chromium.org>
    Gerrit-Attention: Elly FJ <elly...@chromium.org>
    Gerrit-Comment-Date: Tue, 13 Jan 2026 01:34:51 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: Yes
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Joe Downing (Gerrit)

    unread,
    Jan 13, 2026, 10:07:34 AM (7 days ago) Jan 13
    to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
    Attention needed from Elly FJ

    Joe Downing added 3 comments

    Patchset-level comments
    Joe Downing . resolved

    Thanks Yuwei! Elly, please let me know if this looks reasonable when you get a chance.

    File remoting/base/ecdh_aes_crypter.cc
    Line 55, Patchset 5 (Latest): bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key_pair_.key(), nullptr));
    Yuwei Huang . resolved

    `std::unique_ptr`? `bssl::UniquePtr` is just alias of `std::unique_ptr`, and it seems you are only passing the raw pointer around.

    ```suggestion
    std::unique_ptr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key_pair_.key(), nullptr));
    ```
    Joe Downing

    bssl::UniquePtr uses a custom deleter so it is a little different.

    In an earlier iteration I was using unique_ptr with that deleter and then found that bssl::UniquePtr existed which simplifed our code and s commonly used in Chromium when interacting with crypto APIs.

    Line 73, Patchset 5 (Latest): shared_secret.resize(shared_secret_len);
    Yuwei Huang . resolved

    Do you need this call, since the constructor already default-inserts `shared_secret` with `shared_secret_len` 0s?

    Joe Downing

    Yeah you still need to resize. The initial shared secret length represents the largest value that can be generated but the actual value may be smaller so we need to resize to the actual length so we don't include garbage data at the end of the vector.

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Elly FJ
    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: I091002574f40a782846d102c147a505bdb17bfa7
      Gerrit-Change-Number: 7455374
      Gerrit-PatchSet: 5
      Gerrit-Owner: Joe Downing <joe...@chromium.org>
      Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
      Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
      Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
      Gerrit-Attention: Elly FJ <elly...@chromium.org>
      Gerrit-Comment-Date: Tue, 13 Jan 2026 15:07:19 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Yuwei Huang <yuw...@chromium.org>
      satisfied_requirement
      open
      diffy

      Elly FJ (Gerrit)

      unread,
      Jan 13, 2026, 1:22:49 PM (7 days ago) Jan 13
      to Joe Downing, Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
      Attention needed from Joe Downing

      Elly FJ added 8 comments

      Commit Message
      Line 7, Patchset 5 (Latest):Add ECDH message crypter class for P2P control channel encryption
      Elly FJ . unresolved

      is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

      File remoting/base/ecdh_aes_crypter.h
      Line 69, Patchset 5 (Latest): // The AES-GCM encryption/decryption key.
      std::unique_ptr<crypto::Aead> encryption_key_;
      Elly FJ . unresolved

      normally this kind of thing is called a "context"

      Line 50, Patchset 5 (Latest): // A Base64 encoded representation of the public key, useful for logging.
      std::string GetPublicKey() const;
      Elly FJ . unresolved

      usually this would be (eg) PublicKeyAsBase64()

      Line 40, Patchset 5 (Latest): // The IV is prepended to the ciphertext. Returns std::nullopt on failure.
      Elly FJ . unresolved

      is the IV random or fixed? is it generated by this object?

      Line 25, Patchset 5 (Latest):class EcdhAesCrypter {
      Elly FJ . unresolved

      I might split this into two smaller classes like this:

      1. An EcdhExchange class, which handles generating a private/public key pair, and has a DeriveCrypter() method
      2. A nested Crypter class, which provides Encrypt() and Decrypt() methods

      where EcdhExchange::DeriveCrypter() is like:

      ```
      std::optional<Crypter> EcdhExchange::DeriveCrypter(base::span<const uint8_t> peer_public_key);
      ```

      and the constructor for Crypter itself is only accessible to EcdhExchange. That way it's impossible to even _try_ to call Encrypt() / Decrypt() without first successfully deriving shared keys. Does that make sense?

      File remoting/base/ecdh_aes_crypter.cc
      Line 25, Patchset 5 (Latest):constexpr int kAesGcmIvSizeBits = 96;
      constexpr int kAesGcmKeySizeBits = 256;
      Elly FJ . unresolved

      given that these are never used without being divided into bytes first I'd just represent them as byte counts directly

      Line 44, Patchset 5 (Latest):bool EcdhAesCrypter::DeriveEncryptionKey(
      Elly FJ . unresolved

      I think the body of this method should instead be added to crypto/kex - we have crypto::kex::EcdhP256(), we could easily have a crypto::kex::EcdhP384(). The HKDF part can use crypto::kdf::Hkdf() from crypto/kdf as well, which doesn't require you to construct a string view.

      Line 108, Patchset 5 (Latest): base::span<const uint8_t> nonce = ciphertext_iv.first(kAesGcmIvSizeBytes);
      base::span<const uint8_t> ciphertext =
      ciphertext_iv.subspan(kAesGcmIvSizeBytes);
      Elly FJ . unresolved

      you can use base::span::split_at()

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Joe Downing
      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: I091002574f40a782846d102c147a505bdb17bfa7
        Gerrit-Change-Number: 7455374
        Gerrit-PatchSet: 5
        Gerrit-Owner: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
        Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
        Gerrit-Attention: Joe Downing <joe...@chromium.org>
        Gerrit-Comment-Date: Tue, 13 Jan 2026 18:22:35 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Joe Downing (Gerrit)

        unread,
        Jan 13, 2026, 2:31:26 PM (7 days ago) Jan 13
        to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
        Attention needed from Elly FJ

        Joe Downing added 2 comments

        Patchset-level comments
        Joe Downing . resolved

        Thanks for taking a look Elly! I'll look at refactoring the classes and moving code around and send you a follow-up. I'm also happy to chat offline about use case specific info.

        Commit Message
        Line 7, Patchset 5 (Latest):Add ECDH message crypter class for P2P control channel encryption
        Elly FJ . unresolved

        is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

        Joe Downing

        The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

        I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Elly FJ
        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: I091002574f40a782846d102c147a505bdb17bfa7
        Gerrit-Change-Number: 7455374
        Gerrit-PatchSet: 5
        Gerrit-Owner: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
        Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
        Gerrit-Attention: Elly FJ <elly...@chromium.org>
        Gerrit-Comment-Date: Tue, 13 Jan 2026 19:31:11 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: Elly FJ <elly...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Elly FJ (Gerrit)

        unread,
        Jan 13, 2026, 3:14:31 PM (7 days ago) Jan 13
        to Joe Downing, Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
        Attention needed from Joe Downing

        Elly FJ added 1 comment

        Commit Message
        Line 7, Patchset 5 (Latest):Add ECDH message crypter class for P2P control channel encryption
        Elly FJ . unresolved

        is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

        Joe Downing

        The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

        I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

        Elly FJ

        Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Joe Downing
        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: I091002574f40a782846d102c147a505bdb17bfa7
        Gerrit-Change-Number: 7455374
        Gerrit-PatchSet: 5
        Gerrit-Owner: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
        Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
        Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
        Gerrit-Attention: Joe Downing <joe...@chromium.org>
        Gerrit-Comment-Date: Tue, 13 Jan 2026 20:14:16 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: Joe Downing <joe...@chromium.org>
        Comment-In-Reply-To: Elly FJ <elly...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Yuwei Huang (Gerrit)

        unread,
        Jan 13, 2026, 3:42:50 PM (7 days ago) Jan 13
        to Joe Downing, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
        Attention needed from Joe Downing

        Yuwei Huang added 1 comment

        File remoting/base/ecdh_aes_crypter.cc
        Line 73, Patchset 5 (Latest): shared_secret.resize(shared_secret_len);
        Yuwei Huang . resolved

        Do you need this call, since the constructor already default-inserts `shared_secret` with `shared_secret_len` 0s?

        Joe Downing

        Yeah you still need to resize. The initial shared secret length represents the largest value that can be generated but the actual value may be smaller so we need to resize to the actual length so we don't include garbage data at the end of the vector.

        Yuwei Huang

        Ah, I missed that `EVP_PKEY_derive` is writing back to `shared_secret_len`..

        Gerrit-Comment-Date: Tue, 13 Jan 2026 20:42:40 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: Joe Downing <joe...@chromium.org>
        Comment-In-Reply-To: Yuwei Huang <yuw...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Joe Downing (Gerrit)

        unread,
        Jan 14, 2026, 2:08:22 PM (6 days ago) Jan 14
        to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
        Attention needed from Elly FJ and Yuwei Huang

        Joe Downing added 9 comments

        Patchset-level comments
        File-level comment, Patchset 10 (Latest):
        Joe Downing . resolved

        PTAL! Yuwei, can you take another look since your +1 was reset and I've made a fair number of changes?

        Thanks!

        Commit Message
        Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
        Elly FJ . resolved

        is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

        Joe Downing

        The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

        I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

        Elly FJ

        Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

        Joe Downing

        Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

        File remoting/base/ecdh_aes_crypter.h
        Line 69, Patchset 5: // The AES-GCM encryption/decryption key.

        std::unique_ptr<crypto::Aead> encryption_key_;
        Elly FJ . resolved

        normally this kind of thing is called a "context"

        Joe Downing

        Done

        Line 50, Patchset 5: // A Base64 encoded representation of the public key, useful for logging.
        std::string GetPublicKey() const;
        Elly FJ . resolved

        usually this would be (eg) PublicKeyAsBase64()

        Joe Downing

        Done

        Line 40, Patchset 5: // The IV is prepended to the ciphertext. Returns std::nullopt on failure.
        Elly FJ . resolved

        is the IV random or fixed? is it generated by this object?

        Joe Downing

        For messages received by the website peer, the the IV is random and generated via a common crypto base library. This function is currently used for testing and generates a random IV via a chromium base library.

        I can reword the comment to be more clear.

        Line 25, Patchset 5:class EcdhAesCrypter {
        Elly FJ . resolved

        I might split this into two smaller classes like this:

        1. An EcdhExchange class, which handles generating a private/public key pair, and has a DeriveCrypter() method
        2. A nested Crypter class, which provides Encrypt() and Decrypt() methods

        where EcdhExchange::DeriveCrypter() is like:

        ```
        std::optional<Crypter> EcdhExchange::DeriveCrypter(base::span<const uint8_t> peer_public_key);
        ```

        and the constructor for Crypter itself is only accessible to EcdhExchange. That way it's impossible to even _try_ to call Encrypt() / Decrypt() without first successfully deriving shared keys. Does that make sense?

        Joe Downing

        Done

        File remoting/base/ecdh_aes_crypter.cc
        Line 25, Patchset 5:constexpr int kAesGcmIvSizeBits = 96;

        constexpr int kAesGcmKeySizeBits = 256;
        Elly FJ . resolved

        given that these are never used without being divided into bytes first I'd just represent them as byte counts directly

        Joe Downing

        Done

        Line 44, Patchset 5:bool EcdhAesCrypter::DeriveEncryptionKey(
        Elly FJ . resolved

        I think the body of this method should instead be added to crypto/kex - we have crypto::kex::EcdhP256(), we could easily have a crypto::kex::EcdhP384(). The HKDF part can use crypto::kdf::Hkdf() from crypto/kdf as well, which doesn't require you to construct a string view.

        Joe Downing

        Done

        Line 108, Patchset 5: base::span<const uint8_t> nonce = ciphertext_iv.first(kAesGcmIvSizeBytes);

        base::span<const uint8_t> ciphertext =
        ciphertext_iv.subspan(kAesGcmIvSizeBytes);
        Elly FJ . resolved

        you can use base::span::split_at()

        Joe Downing

        Done

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Elly FJ
        • Yuwei Huang
        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: I091002574f40a782846d102c147a505bdb17bfa7
          Gerrit-Change-Number: 7455374
          Gerrit-PatchSet: 10
          Gerrit-Owner: Joe Downing <joe...@chromium.org>
          Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
          Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
          Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
          Gerrit-Attention: Elly FJ <elly...@chromium.org>
          Gerrit-Attention: Yuwei Huang <yuw...@chromium.org>
          Gerrit-Comment-Date: Wed, 14 Jan 2026 19:08:10 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          Comment-In-Reply-To: Joe Downing <joe...@chromium.org>
          Comment-In-Reply-To: Elly FJ <elly...@chromium.org>
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy

          Yuwei Huang (Gerrit)

          unread,
          Jan 14, 2026, 4:13:57 PM (6 days ago) Jan 14
          to Joe Downing, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
          Attention needed from Elly FJ and Joe Downing

          Yuwei Huang voted Code-Review+1

          Code-Review+1
          Open in Gerrit

          Related details

          Attention is currently required from:
          • Elly FJ
          • Joe Downing
          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: I091002574f40a782846d102c147a505bdb17bfa7
            Gerrit-Change-Number: 7455374
            Gerrit-PatchSet: 10
            Gerrit-Owner: Joe Downing <joe...@chromium.org>
            Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
            Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
            Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
            Gerrit-Attention: Joe Downing <joe...@chromium.org>
            Gerrit-Attention: Elly FJ <elly...@chromium.org>
            Gerrit-Comment-Date: Wed, 14 Jan 2026 21:13:45 +0000
            Gerrit-HasComments: No
            Gerrit-Has-Labels: Yes
            satisfied_requirement
            open
            diffy

            Elly FJ (Gerrit)

            unread,
            Jan 14, 2026, 5:30:38 PM (6 days ago) Jan 14
            to Joe Downing, Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
            Attention needed from Joe Downing

            Elly FJ added 3 comments

            Commit Message
            Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
            Elly FJ . resolved

            is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

            Joe Downing

            The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

            I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

            Elly FJ

            Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

            Joe Downing

            Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

            Elly FJ

            Wait, sorry - are you implementing an existing cryptographic protocol such as HPKE, or are you designing your own cryptographic protocol?

            File remoting/base/ecdh_key_exchange.cc
            Line 71, Patchset 10 (Latest): std::vector<uint8_t> nonce_bytes(kAesGcmIvSizeBytes);
            base::RandBytes(nonce_bytes);
            Elly FJ . unresolved
            ```suggestion
            const auto nonce = crypto::RandBytesAsArray<kAesGcmIvSizeBytes>();
            ```
            File remoting/base/ecdh_key_exchange_unittest.cc
            Line 103, Patchset 10 (Latest): EcdhKeyExchange host_key_exchange;
            EcdhKeyExchange client_key_exchange;
            auto host_crypter = host_key_exchange.CreateAesGcmCrypter(
            client_key_exchange.public_key_bytes());
            ASSERT_TRUE(host_crypter);
            auto client_crypter = client_key_exchange.CreateAesGcmCrypter(
            host_key_exchange.public_key_bytes());
            ASSERT_TRUE(client_crypter);
            Elly FJ . unresolved

            it seems like a lot of tests start this way... I wonder about a helper function:

            ```c++
            std::pair<std::unique_ptr<EcdhKeyExchange::AesGcmCrypter>,
            std::unique_ptr<EcdhKeyExchange::AesGcmCrypter>> MakeCrypterPair();
            ```

            and then the test bodies can be like:

            ```c++
            auto [server, client] = MakeCrypterPair();
            // ...
            ```

            because it's safe for the AesGcmCrypters to outlive the EcdhKeyExchanges.

            what do you think?

            Open in Gerrit

            Related details

            Attention is currently required from:
            • Joe Downing
            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: I091002574f40a782846d102c147a505bdb17bfa7
              Gerrit-Change-Number: 7455374
              Gerrit-PatchSet: 10
              Gerrit-Owner: Joe Downing <joe...@chromium.org>
              Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
              Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
              Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
              Gerrit-Attention: Joe Downing <joe...@chromium.org>
              Gerrit-Comment-Date: Wed, 14 Jan 2026 22:30:26 +0000
              satisfied_requirement
              unsatisfied_requirement
              open
              diffy

              Joe Downing (Gerrit)

              unread,
              Jan 14, 2026, 7:19:27 PM (6 days ago) Jan 14
              to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
              Attention needed from Elly FJ

              Joe Downing voted and added 4 comments

              Votes added by Joe Downing

              Commit-Queue+1

              4 comments

              Patchset-level comments
              Joe Downing . resolved

              PTAL!

              Commit Message
              Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
              Elly FJ . resolved

              is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

              Joe Downing

              The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

              I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

              Elly FJ

              Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

              Joe Downing

              Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

              Elly FJ

              Wait, sorry - are you implementing an existing cryptographic protocol such as HPKE, or are you designing your own cryptographic protocol?

              Joe Downing

              I'm not designing my own protocol AFAIK. I'm using standard mechanisms like ECDH in our existing architecture to effectively double-encrypt some protobufs such that a MitM-style of WebRTC service cannot intercept or inject them. The P2P channels are already encrypted between the website client and native host agent built in Chromium. I'd be happy to go into specifics for this scenario offline (i.e. via GVC) and FWIW I am already engaged with several Corp security folks on this but I'm happy to talk with you about it as well since more scrutiny is good when considering security. I would prefer to leave the specifics out of this thread however.

              File remoting/base/ecdh_key_exchange.cc
              Line 71, Patchset 10: std::vector<uint8_t> nonce_bytes(kAesGcmIvSizeBytes);
              base::RandBytes(nonce_bytes);
              Elly FJ . resolved
              ```suggestion
              const auto nonce = crypto::RandBytesAsArray<kAesGcmIvSizeBytes>();
              ```
              Joe Downing

              Done

              File remoting/base/ecdh_key_exchange_unittest.cc
              Line 103, Patchset 10: EcdhKeyExchange host_key_exchange;

              EcdhKeyExchange client_key_exchange;
              auto host_crypter = host_key_exchange.CreateAesGcmCrypter(
              client_key_exchange.public_key_bytes());
              ASSERT_TRUE(host_crypter);
              auto client_crypter = client_key_exchange.CreateAesGcmCrypter(
              host_key_exchange.public_key_bytes());
              ASSERT_TRUE(client_crypter);
              Elly FJ . resolved

              it seems like a lot of tests start this way... I wonder about a helper function:

              ```c++
              std::pair<std::unique_ptr<EcdhKeyExchange::AesGcmCrypter>,
              std::unique_ptr<EcdhKeyExchange::AesGcmCrypter>> MakeCrypterPair();
              ```

              and then the test bodies can be like:

              ```c++
              auto [server, client] = MakeCrypterPair();
              // ...
              ```

              because it's safe for the AesGcmCrypters to outlive the EcdhKeyExchanges.

              what do you think?

              Joe Downing

              Done

              Open in Gerrit

              Related details

              Attention is currently required from:
              • Elly FJ
              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: I091002574f40a782846d102c147a505bdb17bfa7
                Gerrit-Change-Number: 7455374
                Gerrit-PatchSet: 12
                Gerrit-Owner: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
                Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
                Gerrit-Attention: Elly FJ <elly...@chromium.org>
                Gerrit-Comment-Date: Thu, 15 Jan 2026 00:19:15 +0000
                Gerrit-HasComments: Yes
                Gerrit-Has-Labels: Yes
                satisfied_requirement
                open
                diffy

                Joe Downing (Gerrit)

                unread,
                Jan 14, 2026, 9:03:20 PM (6 days ago) Jan 14
                to Yuwei Huang, Elly FJ, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
                Attention needed from Elly FJ

                Joe Downing added 1 comment

                Commit Message
                Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
                Elly FJ . resolved

                is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

                Joe Downing

                The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

                I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

                Elly FJ

                Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

                Joe Downing

                Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

                Elly FJ

                Wait, sorry - are you implementing an existing cryptographic protocol such as HPKE, or are you designing your own cryptographic protocol?

                Joe Downing

                I'm not designing my own protocol AFAIK. I'm using standard mechanisms like ECDH in our existing architecture to effectively double-encrypt some protobufs such that a MitM-style of WebRTC service cannot intercept or inject them. The P2P channels are already encrypted between the website client and native host agent built in Chromium. I'd be happy to go into specifics for this scenario offline (i.e. via GVC) and FWIW I am already engaged with several Corp security folks on this but I'm happy to talk with you about it as well since more scrutiny is good when considering security. I would prefer to leave the specifics out of this thread however.

                Joe Downing

                I realized I didn't address the HPKE question. My <limited> understanding is we don't have an HPKE library in //crypto or //third_party I can use in Chromium. Were you suggesting that I add something like Tink to third_party?

                If so, I would be amenable to that but it's a lot of work and presumably it would be something your team should be the OWNER for long-term.

                Please let me know if this is what you were thinking/suggesting or if I'm off base : )

                Gerrit-Comment-Date: Thu, 15 Jan 2026 02:03:07 +0000
                Gerrit-HasComments: Yes
                Gerrit-Has-Labels: No
                satisfied_requirement
                open
                diffy

                Elly FJ (Gerrit)

                unread,
                Jan 15, 2026, 11:36:26 AM (5 days ago) Jan 15
                to Joe Downing, Elly FJ, Yuwei Huang, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org
                Attention needed from Joe Downing

                Elly FJ voted and added 3 comments

                Votes added by Elly FJ

                Code-Review+1

                3 comments

                Patchset-level comments
                Elly FJ . resolved

                lgtm!

                Commit Message
                Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
                Elly FJ . resolved

                is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

                Joe Downing

                The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

                I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

                Elly FJ

                Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

                Joe Downing

                Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

                Elly FJ

                Wait, sorry - are you implementing an existing cryptographic protocol such as HPKE, or are you designing your own cryptographic protocol?

                Joe Downing

                I'm not designing my own protocol AFAIK. I'm using standard mechanisms like ECDH in our existing architecture to effectively double-encrypt some protobufs such that a MitM-style of WebRTC service cannot intercept or inject them. The P2P channels are already encrypted between the website client and native host agent built in Chromium. I'd be happy to go into specifics for this scenario offline (i.e. via GVC) and FWIW I am already engaged with several Corp security folks on this but I'm happy to talk with you about it as well since more scrutiny is good when considering security. I would prefer to leave the specifics out of this thread however.

                Joe Downing

                I realized I didn't address the HPKE question. My <limited> understanding is we don't have an HPKE library in //crypto or //third_party I can use in Chromium. Were you suggesting that I add something like Tink to third_party?

                If so, I would be amenable to that but it's a lot of work and presumably it would be something your team should be the OWNER for long-term.

                Please let me know if this is what you were thinking/suggesting or if I'm off base : )

                Elly FJ

                BoringSSL already has HPKE support: https://source.chromium.org/chromium/chromium/src/+/main:third_party/boringssl/src/include/openssl/hpke.h - there isn't an existing //crypto wrapper for it, but you could use it directly if you wanted to pending me adding a wrapper.

                The design you have here is essentially HPKE-P256-HKDF-SHA256 in base mode already, so I wonder if you can just use that instead of doing ECDH + AEAD yourself. The reason you may wish to do this is that the HPKE implementation will take care of stuff like choosing nonces for you, and if you ever decide to change algorithms (eg to something post-quantum) you just need to switch which HPKE algorithm you are using.

                However, if you don't want to use the BoringSSL APIs for HPKE, and prefer to do what you're doing here, that is okay with me too.

                +cc davidben@

                File remoting/base/ecdh_key_exchange.h
                Line 54, Patchset 12 (Latest): // Storage for the derived encryption key. Must outlive |context_|.
                DerivedKey derived_key_;
                Elly FJ . resolved

                this will become unnecessary once I land https://chromium-review.googlesource.com/c/chromium/src/+/7477298 :)

                Open in Gerrit

                Related details

                Attention is currently required from:
                • Joe Downing
                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: I091002574f40a782846d102c147a505bdb17bfa7
                Gerrit-Change-Number: 7455374
                Gerrit-PatchSet: 12
                Gerrit-Owner: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
                Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
                Gerrit-Attention: Joe Downing <joe...@chromium.org>
                Gerrit-Comment-Date: Thu, 15 Jan 2026 16:36:12 +0000
                Gerrit-HasComments: Yes
                Gerrit-Has-Labels: Yes
                satisfied_requirement
                open
                diffy

                Joe Downing (Gerrit)

                unread,
                Jan 15, 2026, 4:48:25 PM (5 days ago) Jan 15
                to Elly FJ, Yuwei Huang, Chromium LUCI CQ, chromium...@chromium.org, chromotin...@chromium.org

                Joe Downing voted and added 3 comments

                Votes added by Joe Downing

                Commit-Queue+2

                3 comments

                Patchset-level comments
                File-level comment, Patchset 13 (Latest):
                Joe Downing . resolved

                Thanks!

                Commit Message
                Line 7, Patchset 5:Add ECDH message crypter class for P2P control channel encryption
                Elly FJ . resolved

                is the cryptographic design used here matching some existing spec? if so, can you link to it? if not, and you are designing something new here, we should talk more :)

                Joe Downing

                The TL;DR is that I'm implementing a signaling service for Google Corp CRD connections: go/crd-corp-signaling-design

                I am going to be vague on the specifics here but certain use cases will require that the protobufs sent over the P2P channel are encrypted with a secret unknown to the session authorization service. I'm working on that aspect of the system now and plan to document that approach when I have something viable. I'm happy to have a quick GVC to dive into details if that is useful for context.

                Elly FJ

                Gotcha, okay. If you are doing a fresh design, you should use HPKE (RFC 9180). It's similar to what you are doing here.

                Joe Downing

                Thanks! I am working with a website client and HPKE APIs appear to be missing from the current crypto web API but it looks like there are some interesting WebRTC APIs I can use in a similar fashion so I'll consider this when I begin that part of the implementation.

                Elly FJ

                Wait, sorry - are you implementing an existing cryptographic protocol such as HPKE, or are you designing your own cryptographic protocol?

                Joe Downing

                I'm not designing my own protocol AFAIK. I'm using standard mechanisms like ECDH in our existing architecture to effectively double-encrypt some protobufs such that a MitM-style of WebRTC service cannot intercept or inject them. The P2P channels are already encrypted between the website client and native host agent built in Chromium. I'd be happy to go into specifics for this scenario offline (i.e. via GVC) and FWIW I am already engaged with several Corp security folks on this but I'm happy to talk with you about it as well since more scrutiny is good when considering security. I would prefer to leave the specifics out of this thread however.

                Joe Downing

                I realized I didn't address the HPKE question. My <limited> understanding is we don't have an HPKE library in //crypto or //third_party I can use in Chromium. Were you suggesting that I add something like Tink to third_party?

                If so, I would be amenable to that but it's a lot of work and presumably it would be something your team should be the OWNER for long-term.

                Please let me know if this is what you were thinking/suggesting or if I'm off base : )

                Elly FJ

                BoringSSL already has HPKE support: https://source.chromium.org/chromium/chromium/src/+/main:third_party/boringssl/src/include/openssl/hpke.h - there isn't an existing //crypto wrapper for it, but you could use it directly if you wanted to pending me adding a wrapper.

                The design you have here is essentially HPKE-P256-HKDF-SHA256 in base mode already, so I wonder if you can just use that instead of doing ECDH + AEAD yourself. The reason you may wish to do this is that the HPKE implementation will take care of stuff like choosing nonces for you, and if you ever decide to change algorithms (eg to something post-quantum) you just need to switch which HPKE algorithm you are using.

                However, if you don't want to use the BoringSSL APIs for HPKE, and prefer to do what you're doing here, that is okay with me too.

                +cc davidben@

                Joe Downing

                OK thanks for the extra info. I poked around a bit and see some other folks with Tink integrations (e.g., components/signin/public/base/hybrid_encryption_key.cc) so that looks like the right way to go.

                I'm going to land what I have for now as I need to have the P2P proto encryption working in ~2 weeks for internal dogfooders but can replace the ECDH mechanism with HPKE afterwards.

                File remoting/base/ecdh_key_exchange.h
                Line 54, Patchset 12: // Storage for the derived encryption key. Must outlive |context_|.
                DerivedKey derived_key_;
                Elly FJ . resolved

                this will become unnecessary once I land https://chromium-review.googlesource.com/c/chromium/src/+/7477298 :)

                Joe Downing

                Thanks for the heads-up! I've updated my CL to use the new Aead c'tor.

                Open in Gerrit

                Related details

                Attention set is empty
                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: I091002574f40a782846d102c147a505bdb17bfa7
                Gerrit-Change-Number: 7455374
                Gerrit-PatchSet: 13
                Gerrit-Owner: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
                Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
                Gerrit-Comment-Date: Thu, 15 Jan 2026 21:48:13 +0000
                satisfied_requirement
                open
                diffy

                Chromium LUCI CQ (Gerrit)

                unread,
                Jan 15, 2026, 5:36:15 PM (5 days ago) Jan 15
                to Joe Downing, Elly FJ, Yuwei Huang, chromium...@chromium.org, chromotin...@chromium.org

                Chromium LUCI CQ submitted the change with unreviewed changes

                Unreviewed changes

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

                ```
                The name of the file: remoting/base/ecdh_key_exchange.cc
                Insertions: 2, Deletions: 4.

                The diff is too large to show. Please review the diff.
                ```
                ```
                The name of the file: remoting/base/ecdh_key_exchange.h
                Insertions: 1, Deletions: 4.

                The diff is too large to show. Please review the diff.
                ```

                Change information

                Commit message:
                Add ECDH message crypter class for P2P control channel encryption

                In order to support new features like session recording, which will
                require an intermediate service in the P2P connection, we will need
                to be able to encrypt sensitive content (e.g., input, auth tokens)
                so that information is not available or injectable by the
                intermediate service.

                This CL introduces the class we will use for establishing the
                symmetric keys and decrypting the payloads received from the
                client.
                Bug: 359620500
                Change-Id: I091002574f40a782846d102c147a505bdb17bfa7
                Reviewed-by: Yuwei Huang <yuw...@chromium.org>
                Reviewed-by: Elly FJ <elly...@chromium.org>
                Commit-Queue: Joe Downing <joe...@chromium.org>
                Cr-Commit-Position: refs/heads/main@{#1570026}
                Files:
                • M remoting/base/BUILD.gn
                • M remoting/base/DEPS
                • A remoting/base/ecdh_key_exchange.cc
                • A remoting/base/ecdh_key_exchange.h
                • A remoting/base/ecdh_key_exchange_unittest.cc
                Change size: L
                Delta: 5 files changed, 310 insertions(+), 1 deletion(-)
                Branch: refs/heads/main
                Submit Requirements:
                • requirement satisfiedCode-Review: +1 by Elly FJ, +1 by Yuwei Huang
                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: I091002574f40a782846d102c147a505bdb17bfa7
                Gerrit-Change-Number: 7455374
                Gerrit-PatchSet: 14
                Gerrit-Owner: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Chromium LUCI CQ <chromiu...@luci-project-accounts.iam.gserviceaccount.com>
                Gerrit-Reviewer: Elly FJ <elly...@chromium.org>
                Gerrit-Reviewer: Joe Downing <joe...@chromium.org>
                Gerrit-Reviewer: Yuwei Huang <yuw...@chromium.org>
                open
                diffy
                satisfied_requirement
                Reply all
                Reply to author
                Forward
                0 new messages