#![allow(dead_code, unused_variables)] use self::ext::{decl_extension_group, ExtGroup, ExtList};
use super::msg::{self, Body};
use caret::caret_int;
use tor_bytes::{EncodeError, EncodeResult, Error as BytesError, Result};
use tor_bytes::{Readable, Reader, Writeable, Writer};
use tor_hscrypto::RendCookie;
use tor_llcrypto::pk::rsa::RsaIdentity;
pub mod est_intro;
mod ext;
pub mod intro_payload;
pub use ext::UnrecognizedExt;
caret_int! {
pub struct AuthKeyType(u8) {
ED25519_SHA3_256 = 2,
}
}
#[derive(Debug, Clone)]
pub struct EstablishRendezvous {
cookie: [u8; EstablishRendezvous::COOKIE_LEN], }
impl EstablishRendezvous {
pub const COOKIE_LEN: usize = 20;
pub fn new(cookie: [u8; Self::COOKIE_LEN]) -> Self {
Self { cookie }
}
}
impl msg::Body for EstablishRendezvous {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let cookie = r.extract()?;
r.take_rest();
Ok(Self { cookie })
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write(&self.cookie)
}
}
#[derive(Debug, Clone)]
pub struct Introduce1(Introduce);
impl msg::Body for Introduce1 {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
Ok(Self(Introduce::decode_from_reader(r)?))
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
self.0.encode_onto(w)
}
}
impl Introduce1 {
pub fn new(auth_key_type: AuthKeyType, auth_key: Vec<u8>, encrypted: Vec<u8>) -> Self {
Self(Introduce::new(auth_key_type, auth_key, encrypted))
}
}
#[derive(Debug, Clone)]
pub struct Introduce2(Introduce);
impl msg::Body for Introduce2 {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
Ok(Self(Introduce::decode_from_reader(r)?))
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
self.0.encode_onto(w)
}
}
impl Introduce2 {
pub fn new(auth_key_type: AuthKeyType, auth_key: Vec<u8>, encrypted: Vec<u8>) -> Self {
Self(Introduce::new(auth_key_type, auth_key, encrypted))
}
}
caret_int! {
#[derive(Ord,PartialOrd)]
pub struct IntroduceExtType(u8) {
}
}
decl_extension_group! {
#[derive(Debug,Clone)]
enum IntroduceExt [ IntroduceExtType ] {
}
}
#[derive(Debug, Clone)]
struct Introduce {
auth_key_type: AuthKeyType,
auth_key: Vec<u8>,
extensions: ExtList<IntroduceExt>,
encrypted: Vec<u8>,
}
impl Introduce {
fn new(auth_key_type: AuthKeyType, auth_key: Vec<u8>, encrypted: Vec<u8>) -> Self {
Self {
auth_key_type,
auth_key,
extensions: Default::default(),
encrypted,
}
}
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let legacy_key_id: RsaIdentity = r.extract()?;
if !legacy_key_id.is_zero() {
return Err(BytesError::InvalidMessage(
"legacy key id in Introduce1.".into(),
));
}
let auth_key_type = r.take_u8()?.into();
let auth_key_len = r.take_u16()?;
let auth_key = r.take(auth_key_len as usize)?.into();
let extensions = r.extract()?;
let encrypted = r.take_rest().into();
Ok(Self {
auth_key_type,
auth_key,
extensions,
encrypted,
})
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write_all(&[0_u8; 20]);
w.write_u8(self.auth_key_type.get());
w.write_u16(u16::try_from(self.auth_key.len()).map_err(|_| EncodeError::BadLengthValue)?);
w.write_all(&self.auth_key[..]);
w.write(&self.extensions)?;
w.write_all(&self.encrypted[..]);
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct Rendezvous1 {
cookie: RendCookie,
handshake_info: Vec<u8>,
}
impl Body for Rendezvous1 {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let cookie = r.extract()?;
let handshake_info = r.take_rest().into();
Ok(Self {
cookie,
handshake_info,
})
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write(&self.cookie)?;
w.write_all(&self.handshake_info[..]);
Ok(())
}
}
impl Rendezvous1 {
pub fn new(cookie: RendCookie, handshake_info: impl Into<Vec<u8>>) -> Self {
Self {
cookie,
handshake_info: handshake_info.into(),
}
}
}
#[derive(Debug, Clone)]
pub struct Rendezvous2 {
handshake_info: Vec<u8>,
}
impl Rendezvous2 {
pub fn new(handshake_info: impl Into<Vec<u8>>) -> Self {
Self {
handshake_info: handshake_info.into(),
}
}
}
impl From<Rendezvous1> for Rendezvous2 {
fn from(value: Rendezvous1) -> Self {
Self {
handshake_info: value.handshake_info,
}
}
}
impl Body for Rendezvous2 {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let handshake_info = r.take_rest().into();
Ok(Self { handshake_info })
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write_all(&self.handshake_info[..]);
Ok(())
}
}
caret_int! {
#[derive(Ord, PartialOrd)]
pub struct IntroEstablishedExtType(u8) {
}
}
decl_extension_group! {
#[derive(Debug,Clone)]
enum IntroEstablishedExt [ IntroEstablishedExtType ] {
}
}
#[derive(Debug, Clone, Default)]
pub struct IntroEstablished {
extensions: ExtList<IntroEstablishedExt>,
}
impl IntroEstablished {
pub fn new() -> Self {
Self::default()
}
}
impl Body for IntroEstablished {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let extensions = r.extract()?;
Ok(Self { extensions })
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write(&self.extensions)?;
Ok(())
}
}
caret_int! {
pub struct IntroduceAckStatus(u16) {
SUCCESS = 0x0000,
NOT_RECOGNIZED = 0x0001,
BAD_MESSAGE_FORMAT = 0x0002,
CANT_RELAY = 0x0003,
}
}
caret_int! {
#[derive(Ord, PartialOrd)]
pub struct IntroduceAckExtType(u8) {
}
}
decl_extension_group! {
#[derive(Debug,Clone)]
enum IntroduceAckExt [ IntroduceAckExtType ] {
}
}
#[derive(Clone, Debug)]
pub struct IntroduceAck {
status_code: IntroduceAckStatus,
extensions: ExtList<IntroduceAckExt>,
}
impl IntroduceAck {
pub fn new(status_code: IntroduceAckStatus) -> Self {
Self {
status_code,
extensions: Default::default(),
}
}
pub fn status(&self) -> IntroduceAckStatus {
self.status_code
}
}
impl Body for IntroduceAck {
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
let status_code = r.take_u16()?.into();
let extensions = r.extract()?;
Ok(IntroduceAck {
status_code,
extensions,
})
}
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
w.write_u16(self.status_code.into());
w.write(&self.extensions)?;
Ok(())
}
}
super::msg::empty_body! {
pub struct RendezvousEstablished {}
}