From d8c6515cf3d36084e6718b17e391b4471bf27e07 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Sun, 16 Jul 2023 19:24:18 -0600 Subject: [PATCH] ssh-encoding: `bytes` feature (#138) Adds (optional) support for decoding/encoding `bytes::Bytes` as `byte[n]`. --- Cargo.lock | 7 +++++++ ssh-encoding/Cargo.toml | 2 ++ ssh-encoding/src/decode.rs | 19 +++++++++++++++++++ ssh-encoding/src/encode.rs | 14 ++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ebdbcdf..7993891 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,12 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cbc" version = "0.1.2" @@ -765,6 +771,7 @@ name = "ssh-encoding" version = "0.2.0-pre.0" dependencies = [ "base64ct", + "bytes", "hex-literal", "pem-rfc7468", "sha2", diff --git a/ssh-encoding/Cargo.toml b/ssh-encoding/Cargo.toml index 55ec52d..ae1d499 100644 --- a/ssh-encoding/Cargo.toml +++ b/ssh-encoding/Cargo.toml @@ -16,6 +16,7 @@ rust-version = "1.60" [dependencies] base64 = { package = "base64ct", version = "1.4", optional = true } +bytes = { version = "1", optional = true, default-features = false } pem = { package = "pem-rfc7468", version = "0.7", optional = true } sha2 = { version = "0.10", optional = true, default-features = false } @@ -26,6 +27,7 @@ hex-literal = "0.4.1" alloc = ["base64?/alloc", "pem?/alloc"] std = ["alloc", "base64?/std", "pem?/std", "sha2?/std"] +bytes = ["alloc", "dep:bytes"] pem = ["base64", "dep:pem"] [package.metadata.docs.rs] diff --git a/ssh-encoding/src/decode.rs b/ssh-encoding/src/decode.rs index 1d1a051..b293fae 100644 --- a/ssh-encoding/src/decode.rs +++ b/ssh-encoding/src/decode.rs @@ -8,6 +8,9 @@ use crate::{reader::Reader, Error, Result}; #[cfg(feature = "alloc")] use alloc::{string::String, vec::Vec}; +#[cfg(feature = "bytes")] +use bytes::Bytes; + #[cfg(feature = "pem")] use {crate::PEM_LINE_WIDTH, pem::PemLabel}; @@ -177,3 +180,19 @@ impl Decode for Vec { }) } } + +/// Decodes `Bytes` from `byte[n]` as described in [RFC4251 § 5]: +/// +/// > A byte represents an arbitrary 8-bit value (octet). Fixed length +/// > data is sometimes represented as an array of bytes, written +/// > `byte[n]`, where n is the number of bytes in the array. +/// +/// [RFC4251 § 5]: https://datatracker.ietf.org/doc/html/rfc4251#section-5 +#[cfg(feature = "bytes")] +impl Decode for Bytes { + type Error = Error; + + fn decode(reader: &mut impl Reader) -> Result { + Vec::::decode(reader).map(Into::into) + } +} diff --git a/ssh-encoding/src/encode.rs b/ssh-encoding/src/encode.rs index f451814..d07045c 100644 --- a/ssh-encoding/src/encode.rs +++ b/ssh-encoding/src/encode.rs @@ -9,6 +9,9 @@ use core::str; #[cfg(feature = "alloc")] use alloc::{string::String, vec::Vec}; +#[cfg(feature = "bytes")] +use bytes::Bytes; + #[cfg(feature = "pem")] use { crate::PEM_LINE_WIDTH, @@ -249,3 +252,14 @@ impl Encode for Vec { Ok(()) } } + +#[cfg(feature = "bytes")] +impl Encode for Bytes { + fn encoded_len(&self) -> Result { + self.as_ref().encoded_len() + } + + fn encode(&self, writer: &mut impl Writer) -> Result<(), Error> { + self.as_ref().encode(writer) + } +}