#rpc #sun #xdr #protocols #remote-procedure #deserialize #onc

onc-rpc

开放网络计算/Sun RPC类型和快速序列化

8个版本

0.3.0 2024年5月13日
0.2.5 2024年5月10日
0.2.3 2021年6月22日
0.2.2 2021年1月1日
0.1.0 2020年6月9日

#152编码

Download history 12002/week @ 2024-05-03 11830/week @ 2024-05-10 20327/week @ 2024-05-17 16094/week @ 2024-05-24 13089/week @ 2024-05-31 12519/week @ 2024-06-07 13273/week @ 2024-06-14 16368/week @ 2024-06-21 11800/week @ 2024-06-28 13121/week @ 2024-07-05 13835/week @ 2024-07-12 13243/week @ 2024-07-19 13447/week @ 2024-07-26 16191/week @ 2024-08-02 13784/week @ 2024-08-09 15119/week @ 2024-08-16

60,889 每月下载量

BSD-3-Clause

105KB
2K SLoC

crates.io docs.rs

ONC RPC

该crate实现了由RFC 1831RFC 5531描述的Open Network Computing远程过程调用系统(最初被称为Sun RPC系统)。

  • 零拷贝反序列化
  • 支持序列化缓冲区重用和池化
  • 仅安全Rust代码
  • 无堆分配
  • 简单、描述性、一对一的类型匹配RFC

示例

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!

限制

我没有用到以下内容,但是欢迎PR扩展这个crate :)

  • 不支持分段消息
  • 不支持已被弃用且明显损坏的Diffie-Hellman身份验证类型
  • 未定义GSS / Kerberos身份验证类型

此crate中未包含的身份验证类型仍可用作类型区分符,并在应用层提供相关不可见数据 - 只不过此crate缺乏描述它们的预定义类型。

未来开发

目前必须传递一个缓冲区以将整个消息序列化为连续内存区域,更好的做法是支持矢量化I/O以提供零拷贝序列化。

模糊测试

fuzz/目录中包含一个反序列化模糊测试工具,它尝试解码任意输入,并在成功后序列化生成的消息并与输入进行比较。

安装cargo fuzz并使用cargo fuzz run parse_serialise -- -jobs=30并行化工作。

依赖关系

~0.5–1MB
~22K SLoC