social.smallbury.actor.trust

Contacts this actor trusts, content-key epochs for E2EE, and optional in-flight pairwise-secret delivery during trust establishment. Trusted DIDs are cleartext for AppView indexing. Mutual trust is derived: A trusts B and B trusts A (each side's trusted array). Feed visibility requires mutual trust on both records. Per-epoch content keys use opaque slots (see #contentKeyWrap).

Repository @lexicon.pds.smallbury.social did:plc:wnagcp6h73nxmvmwid2xxukx not from the namespace authority
Details · record, key literal:self
Kindrecord
Record keyliteral:self
Authorityactor.smallbury.social
Indexed
cid bafyreiawqhom36swihdvoyluhngbufdrxznidyhozcbmciqkjuvamjd3hy

Checks

Valid Lint pass
JSONDownload
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "contentKeyWrap": {
      "properties": {
        "slot": {
          "description": "Opaque lookup key. Recipients compute slot = Base64URL(HMAC-SHA256(pairwiseTrustSecret, keyEpochId)). pairwiseTrustSecret is agreed at trust establishment and stored only on the two clients—not published on the PDS.",
          "maxLength": 128,
          "minLength": 1,
          "type": "string"
        },
        "wrappedKey": {
          "description": "This epoch's symmetric content encryption key, encrypted to the recipient's encryptionPublicKey from social.smallbury.actor.profile.",
          "maxLength": 512,
          "type": "bytes"
        }
      },
      "required": [
        "slot",
        "wrappedKey"
      ],
      "type": "object"
    },
    "keyEpoch": {
      "properties": {
        "contentKeyWraps": {
          "description": "One wrapped copy of this epoch's symmetric content key per intended recipient. Opaque slots so wraps are not labeled with recipient DIDs. May include dummy wraps.",
          "items": {
            "ref": "#contentKeyWrap",
            "type": "ref"
          },
          "type": "array"
        },
        "endedAt": {
          "description": "Set when a newer epoch is created. Omitted on the current epoch.",
          "format": "datetime",
          "type": "string"
        },
        "keyEpochId": {
          "description": "Stable identifier for this epoch (e.g. sequential \"0\", \"1\", …). Referenced by encrypted posts and comments.",
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "startedAt": {
          "format": "datetime",
          "type": "string"
        }
      },
      "required": [
        "keyEpochId",
        "startedAt",
        "contentKeyWraps"
      ],
      "type": "object"
    },
    "main": {
      "description": "Contacts this actor trusts, content-key epochs for E2EE, and optional in-flight pairwise-secret delivery during trust establishment. Trusted DIDs are cleartext for AppView indexing. Mutual trust is derived: A trusts B and B trusts A (each side's trusted array). Feed visibility requires mutual trust on both records. Per-epoch content keys use opaque slots (see #contentKeyWrap).",
      "key": "literal:self",
      "record": {
        "properties": {
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "keyEpochs": {
            "description": "Ordered content-key epochs. Only the latest epoch (no endedAt) is used for new posts and comments. Earlier epochs remain for decrypting historical content.",
            "items": {
              "ref": "#keyEpoch",
              "type": "ref"
            },
            "type": "array"
          },
          "pendingPairwiseSecrets": {
            "description": "Temporary delivery of a pairwise trust secret to a peer during establishment (encrypted to the peer's profile encryptionPublicKey). Removed after the peer has retrieved and acknowledged. Used when the acceptor generates the secret (new-user path) or when the initiator pre-delivers it (existing-user path).",
            "items": {
              "ref": "#pendingPairwiseSecret",
              "type": "ref"
            },
            "type": "array"
          },
          "trusted": {
            "description": "DIDs this actor trusts. Cleartext for AppView; does not by itself reveal per-post subset audiences. Listing a DID here may occur before they reciprocate (pre-emptive trust).",
            "items": {
              "ref": "#trustedEntry",
              "type": "ref"
            },
            "type": "array"
          },
          "updatedAt": {
            "format": "datetime",
            "type": "string"
          }
        },
        "required": [
          "trusted",
          "keyEpochs"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "pendingPairwiseSecret": {
      "properties": {
        "inviteId": {
          "description": "Optional link to social.smallbury.graph.invite on the initiator's repo.",
          "maxLength": 128,
          "minLength": 1,
          "type": "string"
        },
        "peerDid": {
          "description": "The contact who should decrypt wrappedSecret.",
          "format": "did",
          "type": "string"
        },
        "wrappedSecret": {
          "description": "32-byte pairwiseTrustSecret for this pair, encrypted to peerDid's encryptionPublicKey from social.smallbury.actor.profile.",
          "maxLength": 512,
          "type": "bytes"
        }
      },
      "required": [
        "peerDid",
        "wrappedSecret"
      ],
      "type": "object"
    },
    "trustedEntry": {
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        },
        "since": {
          "description": "When this actor added the contact to trusted.",
          "format": "datetime",
          "type": "string"
        }
      },
      "required": [
        "did",
        "since"
      ],
      "type": "object"
    }
  },
  "id": "social.smallbury.actor.trust",
  "lexicon": 1
}