From ef7cbc09d0af4a454740dac5f3221046ddb95fa2 Mon Sep 17 00:00:00 2001 From: Micah Peltier Date: Mon, 8 Jul 2024 12:50:56 -0600 Subject: [PATCH 1/4] feat: add new routing page Signed-off-by: Micah Peltier --- docs/inbound-mediation.png | Bin 0 -> 46297 bytes docs/routing-old.md | 168 +++++++++++++++++++++++++++++++++ docs/routing.md | 186 +++++++------------------------------ 3 files changed, 201 insertions(+), 153 deletions(-) create mode 100644 docs/inbound-mediation.png create mode 100644 docs/routing-old.md diff --git a/docs/inbound-mediation.png b/docs/inbound-mediation.png new file mode 100644 index 0000000000000000000000000000000000000000..868f26e9374fd56de835cf4d82d339336cd73f53 GIT binary patch literal 46297 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 -### Routing Requirements +Mediators primarily exist to bridge the gap between cloud agents and edge agents. A mediator has a persistent, fixed endpoint that can be accessed by edge agents and cloud agents alike. Edge agents who are granted mediation can report the mediator's information to other agents. These other agents can then send messages to the mediator's fixed endpoint, and the mediator will either pass them along to the mediated client or hold on to them until the client picks them up. -All messaging technologies must address routing in some way. However, DIDComm has unusual requirements: +### Sidebar: Mediator vs. Relay +This concept of mediation has existed for [as long as DIDComm has?]. Historically, agents that relayed messages have been referred to as mediators. However, the term "mediator" implies a level of authority in a given interaction, and these agents have no inherent authority. The term "relay" has relatively recently been proposed as a replacement, more accurately capturing the unopinionated, unauthoritative nature of these agents. +In a future version of the DIDComm standard, "relay" will likely replace "mediator" as the official term. However, "mediator" has been used here to avoid confusion with the current specification. -* Because of security and privacy goals, DIDComm routing must impose careful limits on how and to what degree intermediate nodes are trusted. +## How Does Mediation Work? -* Because DIDComm aims to be transport-independent, its routing model must be carefully decoupled from strong assumptions about networking. In particular, DIDComm routing cannot make broad-brush assumptions that: - * A given route will use only a single transport. - * Transport mechanisms will provide any security benefits. - * The identity and connectivity for every hop in a route will be known by any party at the time a message is sent. - * The route from sender to recipient will be similar in hop identity, hop count, or transport mix to a complementary route from recipient back to sender. - * All the nodes in a route are ever online at the same time. +As we've mentioned mediators typically exist to serve as a stand-in for a missing fixed endpoint for edge agents. Inbound relays can exist as public entities, serving any edge agent who requests mediation, or they can be configured to only relay messages for approved edge agents. -* Because of decentralization and multiple-peer-friendly goals, DIDComm routing cannot orient itself around servers or simple request—response patterns as mandatory components. +### Inbound Mediation Flow -* Because of privacy goals, DIDComm must offer fine distinctions in how repudiation and authentication are handled. +![Inbound mediation flow diagram](inbound-mediation.png) -These requirements are very demanding. They do NOT necessarily make DIDComm hard to implement. They do NOT prevent DIDComm from using common web infrastructure — indeed, DIDComm routes quite simply and elegantly over HTTP. However, they DO force the routing model to be described in a very generic, flexible way, and they DO mean that existing routing solutions are an imperfect fit. DIDComm learns as much as it can, and borrows as much as it can, from clever and battle-tested routing work done in other contexts, but it does have some unique twists. +### The Forward Message +The core of inbound mediation is the `forward` message. Simply put, forward messages are wrappers, addressed and encrypted to mediators, with an additional payload that is encrypted for the ultimate recipient. This allows messages of any type to be passed to and through a mediator, without a strong degree of trust in the mediator. The mediator is incapable of reading the encrypted payload. +Mediators can be configured to rewrap messages. In this case, rather than delivering the original (opaque) payload directly to the recipient, they can wrap the payload in another `forward` message. This preserves the original size of the message received by the mediator, but more importantly, it allows mediators to be chained in arbitrary lengths; as long as all the mediators know to rewrap messages, and which mediator is next in the chain, a message can pass through any number of mediators until it arrives at its final destination. -### Overview +# Advanced Mediator Topics -Let's focus on a simple case where `A` wants to send a message to `B`, and the route involves one intermediate hop at `C`. Suppressing a few details, DIDComm routing works like this: +## Duplicate Mediators +### For Reliability +Mediators are designed to improve the reliability of message delivery, but like all software deployments, there's always risk of downtime. One way to mitigate that risk and to help insure that messages arrive to your agent promptly is to set up multiple mediators. +A mobile agent can configure arbitrarily many mediators to relay messages for it. Invitations can be configured with multiple endpoints, arranged in order of preference, which are then reported to third parties like normal. Connections to your agent should attempt to deliver their messages to the mediator you specify as your primary endpoint. However, if the message is undeliverable, due to downtime in that mediator, they can try again, sending the message to the other mediators, according to the specified preference, until the message is deliverable. -1. `A` prepares a plaintext message of any type, `M[0]`, and encrypts it for the recipient, `B`. This produces `M[1]`. -2. A prepares another plaintext message of type `forward`, and adds `M[1]` to it as an attachment. This new message, `M[2]`, asks `C` to to deliver the attached payload to `B`. `A` encrypts `M[2]` for `C`, producing `M[3]`. -3. `A` hands `M[3]` to `C`. -4. `C` decrypts `M[3]`, producing `M[2]`. Reading the plaintext, `C` sees that it's been asked to deliver the encrypted attachment to `B`. -5. `C` hands the attachment from `M[2]` — which is the encrypted message `M[1]` — to `B`. -6. `B` decrypts `M[1]`, reproducing the plaintext `M[0]`. +### For Message Tracking +It may be desirable to know where messages are coming from, and one way to do that it by setting up multiple mediators. If you have multiple mediators set up, you can keep track of which messages arrive from which mediator. +As an example, you might have one mediator set up for high-priority connections, which you enable live delivery from as often as you are able, and a second mediator for lower priority connections or messages, and you only poll for messages occasionally, at some predetermined interval. + +## Additional Types of Mediators -![diagram of simple routing scenario](../collateral/simple-routing-scenario.png) +### Outbound Mediator +[Don't know much about this, so I'm kinda guessing here lol] +Outbound mediators exist to obscure the sender of a message. A sender can send a message to an outbound mediator, which then actively sends along the message to the intended recipient. The recipient then sees the outbound mediator as the sender of the message, rather than the actual sender. -This is not the simplest possible scenario; DIDComm could be direct from `A` to `C`, which would eliminate steps 2-5. Some DIDComm+HTTP interactions are that simple. And it is not the most complex DIDComm routing scenario, either. Much more elaborate routes could be described by introducing additional hops with additional `forward` messages. However, the above sequence is a good rough model to carry through the discussion that follows. - -### The `forward` message - -The `forward` message created in step 2 in our overview is a DIDComm __application-level protocol__ message. Routing, as described here, is just one of many protocols that can be built atop DIDComm primitives. A and C are "speaking" this protocol when they communicate. The routing protocol can use the same features as any other application-level protocol; this includes [attachments](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0017-attachments/README.md), [message threading](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0008-message-id-and-threading/README.md), [message timing](https://github.com/hyperledger/aries-rfcs/blob/master/features/0032-message-timing/README.md), [message tracing](https://github.com/hyperledger/aries-rfcs/blob/master/features/0034-message-tracing/README.md), [ACKs](https://github.com/hyperledger/aries-rfcs/blob/master/features/0015-acks/README.md), [problem reports](https://github.com/hyperledger/aries-rfcs/blob/master/features/0035-report-problem/README.md), and so forth. However, before we describe the structure and semantics of the `forward` message in detail, it's important to understand some additional routing concepts. - -### Two Dimensions - -Two dimensions of routing are relevant to DIDComm. Sometimes they are confused or conflated: - -* __Network routing__ deals with how packets flow across a digital landscape. This is the "routing" familiar to most technical people, and the one that will inform most assumptions they bring to the routing topic when reading the DIDComm spec for the first time. -* __Cryptographic routing__ concerns itself with how packaging hides or reveals plaintext to participants in a delivery chain. In other words, it's about the routing of secrets rather than the routing of packets. - -The overview immediately above collapsed these two dimensions, assuming that a node relaying data is also a node decrypting. This makes for simple explanations, but it's not always a true or helpful assumption. The correspondence between these two routing dimensions can be non-trivial; a route may have ten network hops but only three cryptographic hops, and a single network hop may decrypt twice as it passes data between distinct software entities. However, simple principles explain the dynamics for each situation. - -### Mediators and Relays - -DIDComm routing uses two important constructs to model all varieties of network and cryptographic routing: _mediators_ and _relays_. - -A __mediator__ is a participant in routing that must be accounted for by the sender's cryptography. In other words, it is visible in the cryptographic routing dimension. It has its own keys and will deliver messages only after decrypting an outer envelope to reveal a `forward` request. It must understand DIDComm routing to do this. Many types of mediators may exist, but two important ones should be widely understood, as they commonly manifest in DID Docs: - -1. A service that receives messages for many agents at a single endpoint to provide herd privacy (sometimes called an "agency") is a _mediator_. -2. A cloud-based agent that forwards messages to mobile devices is a _mediator_. - -In contrast, a __relay__ is an entity that passes along encrypted messages without understanding or decrypting them. It's focused on network routing only. - -Like mediators, relays can be used to change the transport for a message (e.g., accept an HTTP POST, then turn around and emit an email; accept a Bluetooth transmission, then turn around and emit something in a message queue). But unlike mediators, relays can do this without understanding DIDComm. Load balancers and mix networks like TOR are important types of relay. - -Let's define mediators and relays by exploring how they manifest in a series of communication scenarios between Alice and Bob. - -#### Scenario 1: direct - -Alice and Bob are both employees of a large corporation. They work in the same office, but have never met. The office has a rule that all messages between employees must be encrypted. They use paper messages and physical delivery as the transport. Alice writes a note, encrypts it so only Bob can read it, puts it in an envelope addressed to Bob, and drops the envelope on a desk that she has been told belongs to Bob. This desk is in fact Bob's, and he later picks up the message, decrypts it, and reads it. - -![routing scenario 1: direct](../collateral/routing-scenario-1.png) - -In this scenario, there is no mediator, and no relay. - -#### Scenario 2: a gatekeeper - -Imagine that Bob hires an executive assistant, Carl, to filter his mail. Bob won't open any mail unless Carl looks at it and decides that it's worthy of Bob's attention. - -Alice has to change her behavior. She continues to package a message for Bob, but now she must account for Carl as well. She take the envelope for Bob, and places it inside a new envelope addressed to Carl. Inside the outer envelope, and next to the envelope destined for Bob, Alice writes Carl an encrypted note: "This inner envelope is for Bob. Please forward." - -![routing scenario 2: mediator](../collateral/routing-scenario-2.png) - -Here, Carl is acting as a __mediator__. He is mostly just passing messages along. But because he is processing a message himself, and because Carl is interposed between Alice and Bob, he affects the behavior of the sender. He is a known entity in the route. - -You may recognize this as similar to our overview example with A, B, and C. A and B correspond to Alice and Bob; C is Carl, the mediator. - -#### Scenario 3: transparent indirection - -All is the same as the base scenario (Carl has been fired, and is thus out of the picture), except that Bob is working from home when Alice's message lands on his desk. Bob has previously arranged with his friend Darla, who lives near him, to pick up any mail that's on his desk and drop it off at his house at the end of the work day. Darla sees Alice's note and takes it home to Bob. - -![routing scenario 3: relay](../collateral/routing-scenario-3.png) - -In this scenario, Darla is acting as a __relay__. Note that Bob arranges for Darla to do this *without notifying Alice*, and that *Alice does not need to adjust her behavior in any way for the relay to work*. - -#### Scenario 4: more indirection - -Like scenario 3, Darla brings Bob his mail at home. However, Bob isn't at home when his mail arrives. He's had to rush out on an errand, but he's left instructions with his son, Emil, to open any work mail, take a photo of the letter, and text him the photo. Emil intends to do this, but the camera on his phone misfires, so he convinces his sister, Francis, to take the picture on her phone and email it to him. Then he texts the photo to Bob, as arranged. - -![routing scenario 4: many relays](../collateral/routing-scenario-4.png) - -Here, Emil and Francis are also acting as relays. Note that *nobody knows about the full route*. Alice thinks she's delivering directly to Bob. So does Darla. Bob knows about Darla and Emil, but not about Francis. - -Note, too, how the transport is changing from physical mail to email to text. - -To the party immediately upstream (closer to the sender), a relay is indistinguishable from the next party downstream (closer to the recipient). A party anywhere in the chain can insert one or more relays upstream from themselves, as long as those relays are not upstream of another named party (sender or mediator). - -##### More Scenarios - -Mediators and relays can be combined in any order and any amount in variations on our fictional scenario. Bob could employ Carl as a mediator, and Carl could work from home and arrange delivery via George, then have his daughter Hannah run messages back to Bob's desk at work. Carl could hire his own mediator. Darla could arrange for Ivan to substitute for her when she goes on vacation. And so forth. - -### More Traditional Usage - -The scenarios used above are somewhat artificial. Our most familiar routing scenarios involve edge agents running on mobile devices and accessible through bluetooth or push notification, and cloud agents that use electronic protocols as their transport. Let's see how relays and mediators apply there. - -#### Scenario 5: direct - -Alice's cloud wants to talk to Bob's cloud. Bob's cloud is listening at http://bob.com/api. Alice encrypts a message for Bob and posts it to that URL. - -![scenario 5: cloud to cloud](../collateral/routing-scenario-5.png) - -In this scenario, we are using a direct transport with neither a mediator nor a relay. This is how Alice and Bob operate in Scenario 1, and it's also equivalent to our Overview minus steps 2-5. - -When DIDComm involves only two parties, and when HTTP is convenient for both of them, this sort of direct delivery may be used. (Note that if you need n-wise, or if you need a reciprocal return route but Alice's cloud exposes no public API, this delivery scenario can present problems. More on this later.) - -Virtually the same diagram could be used for a Bluetooth or NFC or sneakernet conversation that happens offline: - -![scenario 5b: Bluetooth or offline](../collateral/routing-scenario-5b.png) - - -#### Scenario 6: herd hosting - -Let's tweak Scenario 5 slightly by saying that Bob's agent is one of thousands that are hosted at the same URL. Maybe the URL is now http://agents-r-us.com/inbox. Now if Alice wants to talk to Bob's cloud agent, she has to cope with a mediator. She wraps the encrypted message for Bob's cloud agent inside a `forward` message that's addressed to and encrypted for the agent of agents-r-us that functions as a gatekeeper. - -![scenario 6: herd hosting](../collateral/routing-scenario-6.png) - -This scenario is one that highlights an __external mediator__--so-called because the mediator lives outside the sovereign domain of the final recipient. - -#### Scenario 7: intra-domain dispatch - -Now let's subtract agents-r-us. We're back to Bob's cloud agent listening directly at http://bob.com/agent. However, let's say that Alice has a different goal--now she wants to talk to the edge agent running on Bob's mobile device. This agent doesn't have a permanent IP address, so Bob uses his own cloud agent as a mediator. He tells Alice that his mobile device agent can only be reached via his cloud agent. - -![routing scenario 7: intra-domain dispatch](../collateral/routing-scenario-7.png) - -Once again, this causes Alice to modify her behavior. Again, she wraps her encrypted message. The inner message is enclosed in an outer envelope, and the outer envelope is passed to the mediator. - -This scenario highlights an __internal mediator__. Internal and external mediators introduce similar features and similar constraints; the relevant difference is that internal mediators live within the sovereign domain of the recipient, and may thus be worthy of greater trust. - -#### Scenario 8: double mediation - -Now let's combine. Bob's cloud agent is hosted at agents-r-us, AND Alice wants to reach Bob's mobile: - -![routing scenario 8: double mediation](../collateral/routing-scenario-8.png) - -This is a common pattern with HTTP-based cloud agents plus mobile edge agents, which is the most common deployment pattern we expect for many users of self-sovereign identity. Note that the properties of the agency and the routing agent are not particularly special--they are just an external and an internal mediator, respectively. - -### Remember Routes are One-Way (not Duplex) - -In all of this discussion, note that we are analyzing *only* a flow from Alice to Bob. How Bob gets a message back to Alice is a completely separate question. Just because Carl, Darla, Emil, Francis, and Agents-R-Us may be involved in how messages flow from Alice to Bob, does not mean they are involved in flow the opposite direction. - -Note how this breaks the simple assumptions of pure request-response technologies like HTTP, that assume the channel in (request) is also the channel out (response). [Duplex](https://en.wikipedia.org/wiki/Duplex_%28telecommunications%29) request-response can be modeled with DIDComm, but doing so requires support that may not always be available, plus cooperative behavior governed by the [`~thread`](https://github.com/hyperledger/aries-rfcs/blob/master/features/0008-message-id-and-threading/README.md) decorator. - -### Routing Protocol - -Now that we understand mediators and relays, how and why they might be combined in various ways, and how their presence influences delivery semantics, we can describe the actual application-level routing protocol that any DIDComm sender speaks with a destward mediator. See [Routing Protocol] in the spec. +### Hidden Mediator +A hidden mediator is a mediator that is unknown to the sender [fact check this]. Inbound mediators are known to be mediators, and thus senders will wrap messages in `forward` messages. With a hidden mediator, senders will simply pack messages to the hidden mediator directly, not wrapping their messages as `forward` messages. +This requires a close coupling of mediator-to-agent and a high degree of trust. Typically, a hidden mediator will be deployed [as a part of? with? by the same entity as?] another agent's deployment. This can be useful to bypass issues with exposing endpoints of agents behind firewalls. Hidden mediators can also be instantiated between an inbound mediator and an agent that is incapable of polling for messages from said inbound mediator, allowing such an agent to use an inbound mediator. From ce9bb51009f352ad6751132e0934a5bac165a1b5 Mon Sep 17 00:00:00 2001 From: Micah Peltier Date: Mon, 8 Jul 2024 12:59:39 -0600 Subject: [PATCH 2/4] chore: minor cleanup Signed-off-by: Micah Peltier --- docs/routing.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/routing.md b/docs/routing.md index 23a34d7..be72a96 100644 --- a/docs/routing.md +++ b/docs/routing.md @@ -1,6 +1,5 @@ # Routing -# Introduction Mediation is the process of relaying messages from a sender to a recipient, through one or more intermediate steps. These steps are called mediators. Mediators allow for reliability in message delivery and enhanced privacy for network-challenged agents. Different types of mediators exist, thought the most common is an Inbound Mediator. Other mediator types are discussed in Advanced Topics. @@ -11,7 +10,7 @@ To understand why mediators exist, we must first distinguish between different t Mediators primarily exist to bridge the gap between cloud agents and edge agents. A mediator has a persistent, fixed endpoint that can be accessed by edge agents and cloud agents alike. Edge agents who are granted mediation can report the mediator's information to other agents. These other agents can then send messages to the mediator's fixed endpoint, and the mediator will either pass them along to the mediated client or hold on to them until the client picks them up. ### Sidebar: Mediator vs. Relay -This concept of mediation has existed for [as long as DIDComm has?]. Historically, agents that relayed messages have been referred to as mediators. However, the term "mediator" implies a level of authority in a given interaction, and these agents have no inherent authority. The term "relay" has relatively recently been proposed as a replacement, more accurately capturing the unopinionated, unauthoritative nature of these agents. +This concept of mediation has existed for as long as DIDComm has. Historically, agents that relayed messages have been referred to as mediators. However, the term "mediator" implies a level of authority in a given interaction, and these agents have no inherent authority. The term "relay" has relatively recently been proposed as a replacement, more accurately capturing the unopinionated, unauthoritative nature of these agents. In a future version of the DIDComm standard, "relay" will likely replace "mediator" as the official term. However, "mediator" has been used here to avoid confusion with the current specification. ## How Does Mediation Work? @@ -40,9 +39,8 @@ As an example, you might have one mediator set up for high-priority connections, ## Additional Types of Mediators ### Outbound Mediator -[Don't know much about this, so I'm kinda guessing here lol] Outbound mediators exist to obscure the sender of a message. A sender can send a message to an outbound mediator, which then actively sends along the message to the intended recipient. The recipient then sees the outbound mediator as the sender of the message, rather than the actual sender. ### Hidden Mediator -A hidden mediator is a mediator that is unknown to the sender [fact check this]. Inbound mediators are known to be mediators, and thus senders will wrap messages in `forward` messages. With a hidden mediator, senders will simply pack messages to the hidden mediator directly, not wrapping their messages as `forward` messages. -This requires a close coupling of mediator-to-agent and a high degree of trust. Typically, a hidden mediator will be deployed [as a part of? with? by the same entity as?] another agent's deployment. This can be useful to bypass issues with exposing endpoints of agents behind firewalls. Hidden mediators can also be instantiated between an inbound mediator and an agent that is incapable of polling for messages from said inbound mediator, allowing such an agent to use an inbound mediator. +A hidden mediator is a mediator that is unknown to the sender. Inbound mediators are known to be mediators, and thus senders will wrap messages in `forward` messages. With a hidden mediator, senders will simply pack messages to the hidden mediator directly, not wrapping their messages as `forward` messages. +This requires a close coupling of mediator-to-agent and a high degree of trust. Typically, a hidden mediator will be deployed with another agent's deployment. This can be useful to bypass issues with exposing endpoints of agents behind firewalls. Hidden mediators can also be instantiated between an inbound mediator and an agent that is incapable of polling for messages from said inbound mediator, allowing such an agent to use an inbound mediator. From 8f0cab44dde0daaebb37613ba77c9b85115e6f24 Mon Sep 17 00:00:00 2001 From: Micah Peltier Date: Mon, 8 Jul 2024 14:54:24 -0600 Subject: [PATCH 3/4] chore: remove lingering note to self Signed-off-by: Micah Peltier --- docs/routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/routing.md b/docs/routing.md index be72a96..eb28708 100644 --- a/docs/routing.md +++ b/docs/routing.md @@ -5,7 +5,7 @@ Mediation is the process of relaying messages from a sender to a recipient, thro Different types of mediators exist, thought the most common is an Inbound Mediator. Other mediator types are discussed in Advanced Topics. ## Why Do We Need Mediation? -To understand why mediators exist, we must first distinguish between different types of agents. Two primary kinds of agents exist, cloud agents and edge agents. Cloud agents, as their name implies, exist in the cloud. A primary characteristic of these agents is a fixed endpoint for communication. Edge agents include devices such as smartphones, personal computers, and other mobile devices. Such devices have ephemeral addresses and cannot be reliably communicated with at a specific endpoint. +To understand why mediators exist, we must first distinguish between different types of agents. Two primary kinds of agents exist, cloud agents and edge agents. Cloud agents, as their name implies, exist in the cloud. A primary characteristic of these agents is a fixed endpoint for communication. Edge agents include devices such as smartphones, personal computers, and other mobile devices. Such devices have ephemeral addresses and cannot be reliably communicated with at a specific endpoint. Mediators primarily exist to bridge the gap between cloud agents and edge agents. A mediator has a persistent, fixed endpoint that can be accessed by edge agents and cloud agents alike. Edge agents who are granted mediation can report the mediator's information to other agents. These other agents can then send messages to the mediator's fixed endpoint, and the mediator will either pass them along to the mediated client or hold on to them until the client picks them up. From 23cc20ec1111e4e785c9e79a48a728cc8220a4e3 Mon Sep 17 00:00:00 2001 From: Micah Peltier Date: Mon, 8 Jul 2024 15:25:56 -0600 Subject: [PATCH 4/4] feat: adjust mediation diagram Signed-off-by: Micah Peltier --- docs/inbound-mediation.png | Bin 46297 -> 0 bytes docs/inbound-mediation.svg | 1 + docs/routing.md | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 docs/inbound-mediation.png create mode 100644 docs/inbound-mediation.svg diff --git a/docs/inbound-mediation.png b/docs/inbound-mediation.png deleted file mode 100644 index 868f26e9374fd56de835cf4d82d339336cd73f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46297 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 Parties3rd PartiesRequest mediationGrant mediationInform the Mediator what DID(s) itshould mediate forConfirm mediated DID listAttempt to form a connectionReport the Mediator's informationWrap messages with an internalpayload addressed to the Edge agentAsk for messagesSend along the nested payloadsthat are addressed to the Edge agent \ No newline at end of file diff --git a/docs/routing.md b/docs/routing.md index eb28708..351c76f 100644 --- a/docs/routing.md +++ b/docs/routing.md @@ -19,7 +19,7 @@ As we've mentioned mediators typically exist to serve as a stand-in for a missin ### Inbound Mediation Flow -![Inbound mediation flow diagram](inbound-mediation.png) +![Inbound mediation flow diagram](inbound-mediation.svg) ### The Forward Message The core of inbound mediation is the `forward` message. Simply put, forward messages are wrappers, addressed and encrypted to mediators, with an additional payload that is encrypted for the ultimate recipient. This allows messages of any type to be passed to and through a mediator, without a strong degree of trust in the mediator. The mediator is incapable of reading the encrypted payload.