metalssh 0.0.1

Experimental SSH implementation
//! SSH message record types.

pub use kexinit::Kexinit;
pub use newkeys::Newkeys;

use crate::constants::msg;
use crate::types::Result;
use crate::wire::SshDecode;

mod kexinit;
mod newkeys;

pub mod ctx {
    /// Determines how `SSH_MSG_` message numbers are interpreted.
    pub struct Context {
        pub kex_type: KexType,
    }

    /// Determines how `SSH_MSG_KEX_` message numbers are interpreted.
    pub enum KexType {
        Dh,
        Ecdh,
    }
}

/// SSH record types contained in packet payloads.
pub enum Message<'b> {
    Kexinit(Kexinit<'b>),
    Newkeys(Newkeys<'b>),
}

impl<'b> Message<'b> {
    pub fn from_bytes(buffer: &'b [u8], _ctx: &ctx::Context) -> Result<Self> {
        let message_code = buffer.read_byte(&mut 0)?;

        let message = match message_code {
            msg::SSH_MSG_KEXINIT => Self::Kexinit(Kexinit::from_bytes(buffer)?),
            msg::SSH_MSG_NEWKEYS => Self::Newkeys(Newkeys::from_bytes(buffer)?),
            _ => todo!(),
        };

        Ok(message)
    }
}