432f1102b7
Lands the async DCE/RPC TCP client — the transport that bridges the M2
PDU codec to a real socket. Unblocks M3 stream B (mxaccess-nmx, the
NmxClient) and brings F9 (ResolveOxid wrappers) within reach.
New
- transport.rs (~700 LoC, 10 tests including 2 real-socket tokio tests)
— port of src/MxNativeClient/DceRpcTcpClient.cs.
- DceRpcTcpClient::connect/bind/bind_with_managed_ntlm_packet_integrity/
call/call_bound/call_bound_object — async over tokio::net::TcpStream.
- encode_packet_integrity_request: 4-byte 0xBB pad + 8-byte AuthTrailer
+ 16-byte NtlmClientContext::sign signature, frag_length and
auth_length rewritten in the embedded header per cs:201-250.
- encode_request_bytes: PFC_OBJECT_UUID flag (0x80) and inserted
16-byte object UUID slot per cs:269-278.
- TransportError enum unifies io / codec / NTLM / fault / not-connected
surfaces. Mirrors DceRpcFaultException as the typed Fault variant.
- NTLM_AUTH_CONTEXT_ID = 79232 = 0x13580 (cs:90,133) exposed publicly.
Deliberately skipped: BindWithNtlmConnect / BindWithNtlmPacketIntegrity
(SSPI flavours at cs:55-63,108-149) — those wrap .NET's
System.Net.Security.SspiClientContext, which has no portable analogue.
Managed-NTLM path covers what the production Rust client needs.
mxaccess-rpc/Cargo.toml: added tokio (workspace-pinned).
design/followups.md: F9 downgraded P1 → P2 (transport landed; only the
two pure-codec ResolveOxid wrappers remain).
Test count delta: 354 -> 364 (+10).
Open followups touched: F9 partially advanced.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
1.1 KiB
Rust
29 lines
1.1 KiB
Rust
//! `mxaccess-rpc` — DCE/RPC + NTLMv2 + OBJREF + OXID + IRemUnknown::RemQueryInterface.
|
|
//!
|
|
//! - M2 wave 1 (landed): `ntlm`, `pdu`, `objref`.
|
|
//! - M2 wave 2 (landed): `guid` + `error` (shared types — resolves F7+F8),
|
|
//! `orpc` (ORPC framing), `object_exporter` (OXID resolution body codec),
|
|
//! `rem_unknown` (`IRemUnknown::RemQueryInterface` body codec).
|
|
//! - M2 wave 3 (next): callback exporter — see `design/60-roadmap.md` and
|
|
//! `design/dependencies.md`.
|
|
//!
|
|
//! Internal `unsafe` is permitted only for `windows-rs` COM activation paths
|
|
//! (per `design/00-overview.md` principle 3); all such calls must be wrapped
|
|
//! in safe abstractions at the crate boundary. All modules to date are
|
|
//! pure-Rust and contain no `unsafe`.
|
|
|
|
// `mxaccess-rpc` is the only crate where internal unsafe is permitted (for
|
|
// windows-rs COM calls). Public API stays safe.
|
|
|
|
pub mod error;
|
|
pub mod guid;
|
|
pub mod nmx_callback_messages;
|
|
pub mod nmx_metadata;
|
|
pub mod ntlm;
|
|
pub mod object_exporter;
|
|
pub mod objref;
|
|
pub mod orpc;
|
|
pub mod pdu;
|
|
pub mod rem_unknown;
|
|
pub mod transport;
|