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
| Kind | record |
|---|---|
| Record key | literal:self |
| Authority | actor.smallbury.social |
| Indexed |
Checks
Valid Lint pass{
"$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
}