Feature comparison
Every cell on this page is measured, not quoted from documentation: the matrix comes from the live interop verification runs, in which as2d exchanges real signed, encrypted and compressed traffic with each product running unmodified in its own container. Tested versions are listed; newer releases may differ.
As measured in the live interop rig (both directions, receipt reconciliation) — ✔ works as specified, ◐ works with caveats (see the per-product notes), ✘ not supported by that product.
| Capability | as2d | phase2 (as2-lib) | OpenAS2 4.10 | mendelson CE 1.1b69 | pyas2lib 1.4.4 | Waarp AS2 | Ruby as2 0.12 | node-libas2 0.8.2 |
|---|---|---|---|---|---|---|---|---|
| Signing SHA-2 family | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| RSASSA-PSS signatures | ✔ | ✔ | ✔ | — | ✘ | — | — | — |
| AES-CBC / 3DES encryption | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| AES-GCM (RFC 5084 conformant) | ✔ | ✘ rejects | — | — | — | ✘ rejects | — | — |
| AES-GCM (BC-compatible form) | ✔ receive + per-partner send | ✔ | — | ✔ (its native form) | — | ✘ rejects | — | — |
| ZLIB compression (RFC 5402) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
| Sync signed MDN generation | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ◐ broken upstream (sends unsigned) |
| Async MDN delivery | ✔ | ✔ | ✔ | — | — | — | ✘ | ✘ |
| Honors requested receipt digest | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ always SHA-256 | ✘ uses signature digest |
| Binary (raw) S/MIME bodies | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ base64 required |
| Enforces inbound security floor | ✔ (insufficient-message-security) | — | — | ✔ | — | — | ✔ (requires signed+encrypted, always) | — |
✘ is only used where the limitation was directly measured or is the product’s own documented constraint; — means the capability was not exercised against that product in the rig and is left unclaimed rather than assumed either way.
A note on fairness. These are open-source products exercised under their own default configurations in containers; each of them may be tunable beyond what defaults deliver, and all of them interoperate correctly with as2d in the profiles above — that is the point of the interop rig. A gap in this matrix is a statement about defaults and about what we exercised, not a verdict on the product.