All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
qos_core - 0.7.0 - 2026-04-16
-
[breaking] Removed
Arc<RwLock<>>wrapping fromProtocolProcessor— the processor is nowCloneand passed by value, eliminating a read-lock acquisition on every incoming request (#660) -
[breaking] Removed
SharedProcessor<P>type alias;SocketServer::listen_allandlisten_tonow takeP: RequestProcessor + Cloneinstead of&SharedProcessor<P>(#660) -
Added blanket
RequestProcessorimpl for anyT: Deref<Target = U>whereU: RequestProcessor(#660) -
EphemeralKeyHandleis now generic overP: AsRef<Path>and derivesCopy(#660) -
Adhere closer to clippy::pedantic
qos_p256 - 0.7.0 - 2026-04-16
- Added
#[must_use]toP256Pair::encryption_key()(#658) - Adhere closer to clippy::pedantic
/enclave-infoendpoint now returns the ephemeral public key extracted from the live attestation document (#659)
qos_client - 0.7.0 - 2026-04-16
- Adhere closer to clippy::pedantic
qos_net - 0.7.0 - 2026-04-16
- Adhere closer to clippy::pedantic
qos_nsm - 0.7.0 - 2026-04-16
- Adhere closer to clippy::pedantic
qos_hex - 0.7.0 - 2026-04-16
- Adhere closer to clippy::pedantic
qos_test_primitives - 0.7.0 - 2026-04-16
- Adhere closer to clippy::pedantic
qos_client - 0.6.1 - 2026-04-09
- publish qos_test_primitives
qos_core - 0.6.1 - 2026-04-09
- workaround kernel bug by writing < 32KiB chunks to vsock
qos_p256 - 0.6.1 - 2026-04-09
- Expose
encryption_secretaccessor onP256Pair(#662)
qos_net - 0.6.0 - 2026-04-02
ProxyMsg::ProxyErrorresponses now properly propagated instead of being silently dropped asInvalidMsg(#655)
- Removed unused error variants
DuplicateConnectionId,ConnectionOverridden,ConnectionIdNotFound(#655)
qos_core - 0.5.0 - 2026-02-28
- Async runtime with
tokioandtokio-vsock— migrated the server, reaper, and I/O subsystem from synchronous to fully asynchronous (#524, #583) - Dynamic resizing
StreamPoolwith per-connection task spawning and configurablemax_connectionsvia semaphore (#524, #596) HostBridgefor transparent VSOCK-to-TCP bridging, letting pivot applications use standard TCP without VSOCK awareness (#596)BridgeConfiginPivotConfig— configures bridge routing (server/client variants) as flat JSON (#596, #631)pool_sizeandclient_timeoutfields in Manifest, replacing pivot-args-based configuration (#584)debug_modeflag inPivotConfigto control output piping for pivot processes (#596)StreamModefor backward-compatible stream handling with legacy applications (#524)PoolGuardwithMutexonSocketClient::callfor safe concurrent stream access (#524)MAX_PAYLOAD_SIZE(128 MiB) enforcement with gradual buffer allocation to prevent OOM (#527, #582)
- Manifest, ManifestEnvelope, GenesisOutput, and QuorumKey serialization changed from Borsh to JSON (
*V0types retained for backward compat) (#594, #616) PivotConfigrestructured —host_configreplaced withbridge_config: Vec<BridgeConfig>, oldPivotHostConfigconsolidated (#596, #631)- Ephemeral keys rotated post-boot and retained for app proofs, improving forward secrecy (#523, #571)
- Quorum key written last during provisioning to prevent partially-provisioned state on interruption (#523)
- Removed
asyncfeature flags — async runtime unified into main code path (#524) - Upgraded borsh from v0.1 to v1.0 (#449, #458, #459)
- MSRV raised to Rust 1.88 (#524, #576)
- Client reconnects no longer logged as errors (#590)
tcp_to_vsockbridge listen loop could exit prematurely (#596)HostBridgenow properly handles multiple connections on the same port (#596)- Stream state cleanup in all error paths (#524, #528, #583)
ProtocolErrorvariants now include expected/actual values for debuggability (#605)
qos_client - 0.5.0 - 2026-02-28
json-to-borshCLI command for converting JSON-format Manifests back to Borsh (#616)get-ephemeral-key-hexCLI command to extract ephemeral public key from attestation documents (#571)- Command list shown as default output when run with no arguments (#591)
- CLI arguments for
--pool-sizeand--client-timeout(#584) - Human approval check when setting socket pool size during manifest generation (#589)
generate_file_keyandadvanced_provision_yubikeyexported as public functions at crate root (#581)- Bridge configuration CLI parsing (
--bridge-config,--app-host-port) (#596)
- Backward-compatible Manifest reading — auto-detects Borsh (
*V0) vs JSON format (#591, #596) - Removed
x509crate dependency; simplified certificate name generation for Yubikey provisioning (#564) - Updated
p256crate to newer version (#564) - Upgraded borsh from v0.1 to v1.0 (#449)
- Yubikey serial generation logic bug (#564)
- Deserialization errors now include detail context (#620)
- Filesystem write errors template the underlying OS error (#593)
- macOS dot-underscore (
._*) files now ignored during directory traversal (#628)
qos_net - 0.5.0 - 2026-02-28
- Fully async
Proxyimplementation using tokio — each connection spawned as a separate task (#524) max_connectionsenforcement per proxy listener (#524)- Maximum timeout (10s) bounding entire proxy request lifecycle (#625)
Dropimplementation onProxyStreamto properly close connections and prevent resource leaks (#528)- Connection pool limit with
CloseRequest/CloseResponseprotocol (#449)
- DNS resolver switched to
hickory-resolverwith full DNSSEC validation enabled (#554) - Removed
async_proxyfeature flag — async proxy is now the only implementation (#524) - Removed
connection_idfrom allProxystructs and messages (#524) - Removed unused
ProxyMsgvariants (ConnectionClosed,EmptyRead) (#449, #582) - Upgraded borsh from v0.1 to v1.0 (#449)
- Proxy error handling loop return bug (#524)
MAX_PAYLOAD_SIZEenforcement on receive to prevent memory exhaustion (#527, #582)- Connection ID collisions (switched to
u128random IDs) (#536) - CLI builds correctly without default features (#504)
- Full DNSSEC validation on all DNS lookups, preventing DNS spoofing (#554)
- Bumped
tracing-subscriberto fix CVE-2025-58160 (#587)
qos_p256 - 0.5.0 - 2026-02-28
- Formal cryptographic specification (
SPEC.md) for QOS Key Set covering P256 Signing, P256 HPKE, and AES-GCM-256 (#598) - Cargo-fuzz test harnesses for coverage-guided testing (#439)
P256SignPublic::from_bytesandP256EncryptPublic::from_bytesnow reject compressed SEC1 points (uncompressed 65-byte format only) (#499)- File I/O errors now include the file path in error messages (#593)
- Upgraded borsh from v0.1 to v1.0 (#449)
qos_nsm - 0.5.0 - 2026-02-28
- Cargo-fuzz test harnesses for attestation document parsing and verification (#514)
- PCR0 mismatch logging with expected/actual values (#524)
AttestErrorvariants (DifferentUserData,DifferentPcr0/1/2/3) now includeexpectedandactualhex fields (#605)InvalidPivotHasherror displays both expected and actual hash values (#605)- Updated to
aws-nitro-enclaves-nsm-api0.4 (#505) - Upgraded borsh from v0.1 to v1.0 (#449)
qos_hex - 0.5.0 - 2026-02-28
- Corrected hex encoding/decoding logic (#576)
qos_crypto - 0.5.0 - 2026-02-28
- Cargo-fuzz test harnesses for Shamir secret sharing functionality (#441)