---
# System prepended metadata

title: DIDcomm Envelope Structure notes
tags: [aries]

---

---
tags: aries
---

# DIDcomm Envelope Structure notes

## Outer Envelope

```jsonc
{
    "protected": { // Encoded a base64-url string
        "typ": "prs.hyperledger.aries-envelope",
        "cty": "msgpack",
        "alg": "ECDH-ES+XC20PKW",
        "enc": "XC20P"
    },
    "recipients": [
        // CEK encrypted to each recipient
        // Includes ephemeral (anoncrypt) or sender key (authcrypt)
    ],
    "aad": "", // AEAD authenticated data (possibly implicit)
    "ciphertext": "", // Encrypted layer as base64-url string
    "iv": "", // AEAD nonce as base64-url string
    "tag": "" // AEAD tag as base64-url string
}
```


## Encrypted Layer (Inner Envelope)

Encoded in `msgpack`, allowing for binary strings without additional base64-encoding.

JSON could be supported equally well by indicating `json` for the `cty` in public header  and base64-encoding the binary string properties, but at the expense of increasing the message size by a third.

**Repudiable payload:**

```jsonc
{
    "typ": "json | msgpack", // Encoding of the payload
    "payload": "", // Message as a binary string
    "meta": {
        // Transport properties, described below
    }
}
```

**Non-repudiable payload:**

```jsonc
{
    "sig": { // JWS
        "protected": {
            "alg": "EdDSA", // Signing algorithm
            "kid": "", // Sender VK
            "typ": "json | msgpack", // Encoding of the payload
        },
        "payload": "", // Message as a binary string
        "signature": "", // Signature as a binary string
    },
    "meta": {
        // Transport properties - not signed, described below
    }
}
```

Note that in the case of a forwarded message (and possibly other cases), the payload may be another Outer Envelope, either JSON or msgpack encoded as indicated by `typ`. Otherwise the payload must be an Aries agent message with `@type` indicating the protocol, in JSON format.

If support for multiple signatures is desired, the `payload` property could remain at the top level, with `sig` containing a list of JWS blocks sans-`payload` (to avoid repetition of the message body).

The signing key of the signature is not required to match the sender described in the recipients block.


## Transport Properties (`meta`)

This information is assembled after the message payload is produced, as it is being packed into the encrypted envelope.

```jsonc
{
    "info": {
        // Optional block for any open-vocabulary information to be
        // handled at the transport layer, for example the number of
        // queued messages held for the recipient by the sender.
    },
    "pad": "", // Optional random binary message padding
    "return": {
        // Optional instructions for return routing of responses.
        // Replaces the ~transport decorator.
        // Exclusive of `deliver`.
        "scope": "all | thread | none", // as in ~transport decorator
        "route": {
            // optionally define a return route
            // based on `service` block in a DID Doc
            // and similar to the ~service decorator
        }
    },
    "deliver": {
        // Optional instructions for forwarding agents.
        // Describes where to deliver the payload, which must be
        // a message envelope.
        // Exclusive of `return` and `forwarded`.
        // (format not yet specified)
    },
    "forwarded": {
        // Optional block to indicate that this message payload was
        // forwarded, and by whom. Can be used to contextualize any
        // transport instructions provided in the protected payload
        // message (which the forwarding agent can't see).
        // Exclusive of `deliver`.
        // (format not yet specified, could provide a DID, key, endpoint..)
    },
    "timing": {
        // Optional block equivalent to the ~timing decorator
    }
}
```

Other possibilities are a `trace` section equivalent to the `~trace` decorator, and a `payment` section equivalent to the `~payment` decorator.

## References

- [Message timing decorator](https://github.com/hyperledger/aries-rfcs/tree/master/features/0032-message-timing)
- [Message tracing decorator](https://github.com/hyperledger/aries-rfcs/tree/master/features/0034-message-tracing)
- [Service decorator](https://github.com/hyperledger/aries-rfcs/tree/master/features/0056-service-decorator)
- [Payment decorator](https://github.com/hyperledger/aries-rfcs/tree/master/features/0075-payment-decorators)
- [Transport decorator](https://github.com/hyperledger/aries-rfcs/tree/master/features/0092-transport-return-route)
