# Forward Example 1: Two mediators as two routing keys #### Sender 1. Alice encrypts a message to Bob, so we have `encrypted_payload_bob`. 2. Alice resolves Bob's DID DOC and gets the following DIDDocServiceEndpoint: ``` { "id": "did:example:bob#didcomm-1", "type": "DIDCommMessaging", "serviceEndpoint": "http://example.com/path", "accept": [ "didcomm/v2", "didcomm/aip2;env=rfc587" ], "routingKeys": ["did:example:somemediator1#somekey", "did:example:somemediator2#somekey"] } ``` 3. Alice wraps `encrypted_payload_bob` into a Forward message for Mediator 2: - Build `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:somemediator2#somekey` . Result - `encrypted_forward_mediator2`. 4. Alice wraps `encrypted_forward_mediator2` into a Forward message for Mediator 1: - Build `Forward(next="did:example:somemediator2", attachments.body.json=encrypted_forward_mediator2` - Anoncrypt the Forward message to `did:example:somemediator1#somekey`. Result - `encrypted_forward_mediator1`. 5. Alice sends `encrypted_forward_mediator1` to `http://example.com/path`. #### Mediator 1 1. Mediator1 calls `unpack` to `encrypted_forward_mediator1` and gets `Forward(next="did:example:somemediator2", attachments.body.json=encrypted_forward_mediator2` as a plaintext message. 2. Mediator1 sends `encrypted_forward_mediator2` to Mediator2 via some pre-configured endpoint (out of scope for DID Comm library). #### Mediator 2 1. Mediator2 calls `unpack` to `encrypted_forward_mediator2` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` as a plaintext message. 2. Mediator2 sends `encrypted_payload_bob` to Bob via some pre-configured endpoint (out of scope for DID Comm library). #### Bob 1. Bob calls `unpack` on `encrypted_payload_bob` # Forward Example 2: Two mediators with alternative endpoints #### Sender 1. Alice encrypts a message to Bob, so we have `encrypted_payload_bob`. 2. Alice resolves Bob's DID DOC and gets the following DIDDocServiceEndpoint: ``` { "id": "did:example:bob#didcomm-1", "type": "DIDCommMessaging", "serviceEndpoint": "did:example:somemediator1", "routingKeys": ["did:example:somemediator2#somekey"] } ``` 3. Alice wraps `encrypted_payload_bob` into a Forward message for Mediator 2: - Build `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:somemediator2#somekey`. Result - `encrypted_forward_mediator2`. 4. Alice wraps `encrypted_forward_mediator2` into a Forward message for Mediator 1: - Build `Forward(next="did:example:somemediator2", attachments.body.json=encrypted_forward_mediator2` - Resolve `did:example:somemediator1` DID DOC and finds `keyAgreement` keys. - Anoncrypt the Forward message for every found `keyAgreement` (multiplex encryption). Result - `encrypted_forward_mediator1`. 5. Alice resolves `did:example:somemediator1` DID DOC and finds the following DIDDocServiceEndpoint: ``` { "id": "did:example:somemediator1#didcomm-1", "type": "DIDCommMessaging", "serviceEndpoint": "http://example-mediator1.com/path", } ``` 6. Alice sends `encrypted_forward_mediator1` to `http://example-mediator1.com/path`. #### Mediator 1 1. Mediator1 calls `unpack` to `encrypted_forward_mediator1` and gets `Forward(next="did:example:somemediator2", attachments.body.json=encrypted_forward_mediator2` as a plaintext message. 2. Mediator1 sends `encrypted_forward_mediator2` to Mediator2 via some pre-configured endpoint (out of scope for DID Comm library). #### Mediator 2 1. Mediator2 calls `unpack` to `encrypted_forward_mediator2` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` as a plaintext message. 2. Mediator2 sends `encrypted_payload_bob` to Bob via some pre-configured endpoint (out of scope for DID Comm library). #### Bob 1. Bob calls `unpack` on `encrypted_payload_bob` # Forward Example 3: Re-wrapping for a final recipient #### Sender 1. Alice encrypts a message to Bob, so we have `encrypted_payload_bob`. 2. Alice resolves Bob's DID DOC and gets the following DIDDocServiceEndpoint: ``` { "id": "did:example:bob#didcomm-1", "type": "DIDCommMessaging", "serviceEndpoint": "http://example.com/path", "routingKeys": ["did:example:somemediator#somekey"] } ``` 3. Alice wraps `encrypted_payload_bob` into a Forward message for Mediator: - Build `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:somemediator#somekey`. Result - `encrypted_forward_mediator`. 4. Alice sends `encrypted_forward_mediator` to `http://example.com/path`. #### Mediator 1. Mediator calls `unpack` to `encrypted_forward_mediator` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` as a plaintext message. 2. Mediator re-wraps `encrypted_payload_bob` into a new Forward message for Bob: - Build `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:bob`. Result - `encrypted_forward_bob`. 3. Mediator sends `encrypted_forward_bob` to Bob via some pre-configured endpoint (out of scope for DID Comm library). #### Bob 1. Bob calls `unpack` on `encrypted_forward_bob`. Unpack does the following: - unpacks `encrypted_forward_bob` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - unpacks `encrypted_payload_bob` # Forward Example 4: Mediator unknown by the sender #### Sender 1. Alice encrypts a message to Bob, so we have `encrypted_payload_bob`. 2. Alice resolves Bob's DID DOC and gets the following DIDDocServiceEndpoint: ``` { "id": "did:example:bob#didcomm-1", "type": "DIDCommMessaging", "serviceEndpoint": "http://example.com/path", "routingKeys": ["did:example:somemediator1#somekey"] } ``` 3. Alice wraps `encrypted_payload_bob` into a Forward message for Mediator: - Build `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:somemediator1#somekey`. Result - `encrypted_forward_mediator1`. 4. Alice sends `encrypted_forward_mediator1` to `http://example.com/path`. #### Mediator 1 1. Mediator1 calls `unpack` to `encrypted_forward_mediator1` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` as a plaintext message. 2. Mediator1 knows (out-of-scope) that the following should be used to transfer the message to Bob: - `"serviceEndpoint": "http://example-mediator2.com/path"` - ``"routingKeys": ["did:example:somemediator2#somekey"]`` 3. Mediator1 wraps `encrypted_payload_bob` into a Forward message for Mediator2: - Build `Forward(next="did:example:somemediator2", attachments.body.json=encrypted_payload_bob)` - Anoncrypt the Forward message to `did:example:somemediator2#somekey`. Result - `encrypted_forward_mediator2`. 4. Mediator1 sends `encrypted_forward_mediator2` to `http://example-mediator2.com/path`. #### Mediator 2 1. Mediator2 calls `unpack` to `encrypted_forward_mediator2` and gets `Forward(next="did:example:bob", attachments.body.json=encrypted_payload_bob)` as a plaintext message. 2. Mediator2 sends `encrypted_payload_bob` to Bob via some pre-configured endpoint (out of scope for DID Comm library). #### Bob 1. Bob calls `unpack` on `encrypted_payload_bob`