)]}'
{
  "commit": "4820cf11c56af592ea4ed02cbce7c0b1a7656fbe",
  "tree": "c2308a01cbdc3d532436c9339edffa3e5c1b8768",
  "parents": [
    "0590643ffe94b4d8b3d3bf6ab4d7deaa506083f3"
  ],
  "author": {
    "name": "kwasniow",
    "email": "kwasniow@cisco.com",
    "time": "Wed Jun 17 07:19:54 2026"
  },
  "committer": {
    "name": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Tue Jun 23 10:19:02 2026"
  },
  "message": "Sframe encryptor implementation\n\nThis CL introduces the concrete Sframe encryptor that sits between the\npublic key-management API and the media pipeline, implementing the\nsender-side wiring for Sframe end-to-end encryption.\n\n# High-level design\nThe implementation follows a three-layer split that matches the existing\nWebRTC layering and respects the api/ visibility rules: 1. Public API\nlayer (api/sframe/) - A narrow, stable interface that exposes only key\nmanagement to applications: setting an encryption key on the sender\nside.\n\n2. Internal media interface layer (modules/sframe/) - Extends the public\nkey-management interface with the Encrypt and \"max ciphertext size\"\nentry points used by the media pipeline. This is the surface the media\nchannel speaks to; application code never sees it.\n\n3. Concrete impl layer (modules/sframe/) - Implements the media\ninterface on top of the cisco/sframe library.\n\nSplitting key management from frame protection lets the public handle\nexpose only the small surface applications need, while the media\npipeline talks to a richer interface internally.\n\nBug: webrtc:479862368\nChange-Id: Id93dba5874b6f5b1f32723755dd404af202f6ecf\nReviewed-on: https://webrtc-review.googlesource.com/c/src/+/481301\nReviewed-by: Harald Alvestrand \u003chta@webrtc.org\u003e\nReviewed-by: Tomas Gunnarsson \u003ctommi@webrtc.org\u003e\nCommit-Queue: Tomas Gunnarsson \u003ctommi@webrtc.org\u003e\nCr-Commit-Position: refs/heads/main@{#48065}\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f0a150f0c4725b0e1df7ccd14086373d3095bf7d",
      "old_mode": 33188,
      "old_path": "modules/BUILD.gn",
      "new_id": "95e1af60927e9f053352f89c8ae49710d00f685c",
      "new_mode": 33188,
      "new_path": "modules/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "91708f5e7b42b4e42863308b9e818dbf6d813f1e",
      "new_mode": 33188,
      "new_path": "modules/sframe/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "927f4d2b8cd3a3c0ab7b67a6649d6e77e3224456",
      "new_mode": 33188,
      "new_path": "modules/sframe/DEPS"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "495c0fc3faedf737e2dd189ed72d55cf12f3dc08",
      "new_mode": 33188,
      "new_path": "modules/sframe/sframe_encryptor.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8993d80d088bef8175306b10c631a9d698b3be9a",
      "new_mode": 33188,
      "new_path": "modules/sframe/sframe_encryptor.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f0b1d9f5a4d42034ff7044901599ffdb4873bc85",
      "new_mode": 33188,
      "new_path": "modules/sframe/sframe_encryptor_decryptor_unittest.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce0f9d61b62fa94eb758c1f9690c9d62cb8ab040",
      "new_mode": 33188,
      "new_path": "modules/sframe/sframe_media_encryptor_interface.h"
    }
  ]
}
