[![crates.io](https://img.shields.io/crates/v/onc-rpc.svg)](https://crates.io/crates/onc-rpc) [![docs.rs](https://docs.rs/onc-rpc/badge.svg)](https://docs.rs/onc-rpc) # ONC RPC This crate implements the `Open Network Computing Remote Procedure Call` system (originally known as the Sun RPC system) as described in [RFC 1831] and [RFC 5531]. * Zero copy deserialisation * Support for serialisation buffer reuse and pooling * Only safe Rust code * No heap allocations * Simple, descriptive, one-to-one types matching the RFCs ## Example ```rust use onc_rpc::{ auth::{AuthFlavor, AuthUnixParams}, CallBody, MessageType, RpcMessage, }; // Add RPC call authentication. let auth_params = AuthUnixParams::new( 42, // Stamp "bananas.local", // Machine name 501, // UID 501, // GID None, // No additional GIDs ); // Build a dummy byte payload. let payload = vec![42, 42, 42, 42]; // Construct the actual RPC message. let msg = RpcMessage::new( 4242, MessageType::Call(CallBody::new( 100000, // Program number 42, // Program version 13, // Procedure number AuthFlavor::AuthUnix(auth_params), // Credentials AuthFlavor::AuthNone(None), // Response verifier &payload, )), ); // Serialise the RPC message, or serialise_into() to reuse buffers. let network_buffer = msg.serialise().expect("serialise message"); // And do something with it! ``` ## Limitations I had no use for the following, however PRs to extend this crate are happily accepted :) * No support for fragmented messages * No support for the [deprecated] and trivially broken Diffie-Hellman authentication flavor * No defined GSS / Kerberos auth flavor types The auth flavors not included in this crate can still be used as the flavor discriminant and associated opaque data is available in the application layer - this crate just lacks pre-defined types to describe them. ## Future development Currently a buffer has to be passed to serialise the complete message into a continuous memory region - it would be nicer to support vectorised I/O to provide zero-copy serialisation too. ## Fuzzing Included in the `fuzz/` directory is a deserialisation fuzzer that attempts to decode arbitrary inputs, and if successful serialises the resulting message and compares the result with the input. Install [`cargo fuzz`] and invoke the fuzzer with `cargo fuzz run parse_serialise -- -jobs=30` for parallelised workers. [deprecated]: https://tools.ietf.org/html/rfc2695#section-2 [RFC 1831]: https://tools.ietf.org/html/rfc1831 [RFC 5531]: https://tools.ietf.org/html/rfc5531 [`fuzz`]: https://github.com/domodwyer/onc-rpc/tree/master/fuzz [`cargo fuzz`]: https://github.com/rust-fuzz/cargo-fuzz