1
0

noise.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. use std::net::SocketAddr;
  2. use super::{AddrMaybeCached, SocketOpts, TcpTransport, Transport};
  3. use crate::config::{NoiseConfig, TransportConfig};
  4. use anyhow::{anyhow, Context, Result};
  5. use async_trait::async_trait;
  6. use snowstorm::{Builder, NoiseParams, NoiseStream};
  7. use tokio::net::{TcpListener, TcpStream, ToSocketAddrs};
  8. pub struct NoiseTransport {
  9. tcp: TcpTransport,
  10. config: NoiseConfig,
  11. params: NoiseParams,
  12. local_private_key: Vec<u8>,
  13. remote_public_key: Option<Vec<u8>>,
  14. }
  15. impl std::fmt::Debug for NoiseTransport {
  16. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
  17. write!(f, "{:?}", self.config)
  18. }
  19. }
  20. impl NoiseTransport {
  21. fn builder(&self) -> Builder {
  22. let builder = Builder::new(self.params.clone()).local_private_key(&self.local_private_key);
  23. match &self.remote_public_key {
  24. Some(x) => builder.remote_public_key(x),
  25. None => builder,
  26. }
  27. }
  28. }
  29. #[async_trait]
  30. impl Transport for NoiseTransport {
  31. type Acceptor = TcpListener;
  32. type RawStream = TcpStream;
  33. type Stream = snowstorm::stream::NoiseStream<TcpStream>;
  34. fn new(config: &TransportConfig) -> Result<Self> {
  35. let tcp = TcpTransport::new(config)?;
  36. let config = match &config.noise {
  37. Some(v) => v.clone(),
  38. None => return Err(anyhow!("Missing noise config")),
  39. };
  40. let builder = Builder::new(config.pattern.parse()?);
  41. let remote_public_key = match &config.remote_public_key {
  42. Some(x) => {
  43. Some(base64::decode(x).with_context(|| "Failed to decode remote_public_key")?)
  44. }
  45. None => None,
  46. };
  47. let local_private_key = match &config.local_private_key {
  48. Some(x) => base64::decode(x.as_bytes())
  49. .with_context(|| "Failed to decode local_private_key")?,
  50. None => builder.generate_keypair()?.private,
  51. };
  52. let params: NoiseParams = config.pattern.parse()?;
  53. Ok(NoiseTransport {
  54. tcp,
  55. config,
  56. params,
  57. local_private_key,
  58. remote_public_key,
  59. })
  60. }
  61. fn hint(conn: &Self::Stream, opt: SocketOpts) {
  62. opt.apply(conn.get_inner());
  63. }
  64. async fn bind<T: ToSocketAddrs + Send + Sync>(&self, addr: T) -> Result<Self::Acceptor> {
  65. Ok(TcpListener::bind(addr).await?)
  66. }
  67. async fn accept(&self, a: &Self::Acceptor) -> Result<(Self::RawStream, SocketAddr)> {
  68. self.tcp
  69. .accept(a)
  70. .await
  71. .with_context(|| "Failed to accept TCP connection")
  72. }
  73. async fn handshake(&self, conn: Self::RawStream) -> Result<Self::Stream> {
  74. let conn = NoiseStream::handshake(conn, self.builder().build_responder()?)
  75. .await
  76. .with_context(|| "Failed to do noise handshake")?;
  77. Ok(conn)
  78. }
  79. async fn connect(&self, addr: &AddrMaybeCached) -> Result<Self::Stream> {
  80. let conn = self
  81. .tcp
  82. .connect(addr)
  83. .await
  84. .with_context(|| "Failed to connect TCP socket")?;
  85. let conn = NoiseStream::handshake(conn, self.builder().build_initiator()?)
  86. .await
  87. .with_context(|| "Failed to do noise handshake")?;
  88. return Ok(conn);
  89. }
  90. }