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 在 编码
60,889 每月下载量
105KB
2K SLoC
ONC RPC
该crate实现了由RFC 1831和RFC 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