tor-cell: Implement IntroduceAck and IntroEstablished
These are fairly simple, since the bulk of them is just an extension list with no supported extensions.
This commit is contained in:
parent
c302246e57
commit
7af2efdb82
|
@ -4,10 +4,12 @@
|
||||||
|
|
||||||
// TODO hs: we'll need accessors for the useful fields in all these types.
|
// TODO hs: we'll need accessors for the useful fields in all these types.
|
||||||
|
|
||||||
|
use self::ext::{decl_extension_group, ExtGroup, ExtList};
|
||||||
|
|
||||||
use super::msg::{self, Body};
|
use super::msg::{self, Body};
|
||||||
use caret::caret_int;
|
use caret::caret_int;
|
||||||
use tor_bytes::{EncodeError, EncodeResult, Error as BytesError, Result};
|
use tor_bytes::{EncodeError, EncodeResult, Error as BytesError, Result};
|
||||||
use tor_bytes::{Reader, Writer};
|
use tor_bytes::{Readable, Reader, Writeable, Writer};
|
||||||
use tor_hscrypto::RendCookie;
|
use tor_hscrypto::RendCookie;
|
||||||
use tor_llcrypto::pk::rsa::RsaIdentity;
|
use tor_llcrypto::pk::rsa::RsaIdentity;
|
||||||
|
|
||||||
|
@ -223,52 +225,116 @@ impl Body for Rendezvous2 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
caret_int! {
|
||||||
|
/// The recognized extension types for an `IntroEstablished` message.
|
||||||
|
#[derive(Ord, PartialOrd)]
|
||||||
|
pub struct IntroEstablishedExtType(u8) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
decl_extension_group! {
|
||||||
|
/// An extension to an IntroEstablished message.
|
||||||
|
///
|
||||||
|
/// (Currently, no extensions of this type are recognized)
|
||||||
|
#[derive(Debug,Clone)]
|
||||||
|
enum IntroEstablishedExt [ IntroEstablishedExtType ] {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Reply sent from the introduction point to the onion service, telling it that
|
/// Reply sent from the introduction point to the onion service, telling it that
|
||||||
/// an introduction point is now established.
|
/// an introduction point is now established.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct IntroEstablished {
|
pub struct IntroEstablished {
|
||||||
/// The extensions included in this cell.
|
/// The extensions included in this cell.
|
||||||
//
|
extensions: ExtList<IntroEstablishedExt>,
|
||||||
// TODO hs: we should extract this with any DOS related extensions, depending on what we
|
}
|
||||||
// decide to do with extension in general.
|
|
||||||
extensions: Vec<IntroEstExtension>,
|
impl IntroEstablished {
|
||||||
|
/// Create a new IntroEstablished message.
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Body for IntroEstablished {
|
impl Body for IntroEstablished {
|
||||||
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
|
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
|
||||||
todo!()
|
let extensions = r.extract()?;
|
||||||
|
Ok(Self { extensions })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
|
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
|
||||||
todo!()
|
w.write(&self.extensions)?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An extension included in an [`IntroEstablished`] message.
|
caret_int! {
|
||||||
#[derive(Debug, Clone)]
|
/// A status code returned in response to an INTRODUCE1 message.
|
||||||
#[non_exhaustive]
|
pub struct IntroduceAckStatus(u16) {
|
||||||
pub enum IntroEstExtension {
|
/// The message was relayed successfully.
|
||||||
/// An unrecognized extension.
|
SUCCESS = 0x0000,
|
||||||
Unrecognized(Vec<u8>),
|
/// The introduction point does not have a live circuit from the
|
||||||
|
/// identified service.
|
||||||
|
NOT_RECOGNIZED = 0x0001,
|
||||||
|
/// There was a failure while parsing the INTRODUCE1 message.
|
||||||
|
BAD_MESSAGE_FORMAT = 0x0002,
|
||||||
|
/// The introduction point was unable to deliver the message to the service.
|
||||||
|
CANT_RELAY = 0x0003,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
caret_int! {
|
||||||
|
/// The recognized extension types for an `IntroEstablished` message.
|
||||||
|
#[derive(Ord, PartialOrd)]
|
||||||
|
pub struct IntroduceAckExtType(u8) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
decl_extension_group! {
|
||||||
|
/// An extension to an IntroduceAct message.
|
||||||
|
///
|
||||||
|
/// (Currently, no extensions of this type are recognized.)
|
||||||
|
#[derive(Debug,Clone)]
|
||||||
|
enum IntroduceAckExt [ IntroduceAckExtType ] {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A reply from the introduction point to the client, telling it that its
|
/// A reply from the introduction point to the client, telling it that its
|
||||||
/// introduce1 was received.
|
/// introduce1 was received.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct IntroduceAck {
|
pub struct IntroduceAck {
|
||||||
// TODO hs: use a caret enum for this.
|
|
||||||
/// The status reported for the Introduce1 message.
|
/// The status reported for the Introduce1 message.
|
||||||
status_code: u16,
|
status_code: IntroduceAckStatus,
|
||||||
// TODO hs: add extensions.
|
/// The extensions on this message.
|
||||||
|
extensions: ExtList<IntroduceAckExt>,
|
||||||
|
}
|
||||||
|
impl IntroduceAck {
|
||||||
|
/// Create a new IntroduceAck message with a provided status code.
|
||||||
|
pub fn new(status_code: IntroduceAckStatus) -> Self {
|
||||||
|
Self {
|
||||||
|
status_code,
|
||||||
|
extensions: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the status code from this message.
|
||||||
|
pub fn status(&self) -> IntroduceAckStatus {
|
||||||
|
self.status_code
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Body for IntroduceAck {
|
impl Body for IntroduceAck {
|
||||||
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
|
fn decode_from_reader(r: &mut Reader<'_>) -> Result<Self> {
|
||||||
todo!()
|
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<()> {
|
fn encode_onto<W: Writer + ?Sized>(self, w: &mut W) -> EncodeResult<()> {
|
||||||
todo!()
|
w.write_u16(self.status_code.into());
|
||||||
|
w.write(&self.extensions)?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -793,3 +793,22 @@ fn test_rendezvous() {
|
||||||
let rend2: Rendezvous2 = rend1.into();
|
let rend2: Rendezvous2 = rend1.into();
|
||||||
msg(cmd2, "123456", &rend2.into());
|
msg(cmd2, "123456", &rend2.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_introduce_ack() {
|
||||||
|
use tor_cell::relaycell::hs::{IntroduceAck, IntroduceAckStatus};
|
||||||
|
|
||||||
|
let cmd = RelayCmd::INTRODUCE_ACK;
|
||||||
|
let status = IntroduceAckStatus::SUCCESS;
|
||||||
|
let introduce_ack = IntroduceAck::new(status);
|
||||||
|
msg(cmd, "0000 00", &introduce_ack.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_intro_established() {
|
||||||
|
use tor_cell::relaycell::hs::IntroEstablished;
|
||||||
|
|
||||||
|
let cmd = RelayCmd::INTRO_ESTABLISHED;
|
||||||
|
let intro_est = IntroEstablished::new();
|
||||||
|
msg(cmd, "00", &intro_est.into())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue