1use asynchronous_codec;
4use futures::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
5use futures::sink::SinkExt;
6use futures::stream::StreamExt;
7use tor_cell::restricted_msg;
8use tor_error::internal;
9
10use crate::channel::codec::{self, ChannelCodec, CodecError};
11use crate::channel::UniqId;
12use crate::memquota::ChannelAccount;
13use crate::util::skew::ClockSkew;
14use crate::{Error, Result};
15use tor_cell::chancell::{msg, ChanCmd, ChanMsg};
16use tor_rtcompat::{CoarseTimeProvider, SleepProvider, StreamOps};
17
18use std::net::SocketAddr;
19use std::sync::Arc;
20use std::time::SystemTime;
21
22use tor_bytes::Reader;
23use tor_linkspec::{ChanTarget, ChannelMethod, OwnedChanTargetBuilder, RelayIds};
24use tor_llcrypto as ll;
25use tor_llcrypto::pk::ed25519::Ed25519Identity;
26use tor_llcrypto::pk::rsa::RsaIdentity;
27
28use digest::Digest;
29
30use super::CellFrame;
31
32use tracing::{debug, trace};
33
34static LINK_PROTOCOLS: &[u16] = &[4, 5];
36
37pub struct OutboundClientHandshake<
39 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
40 S: CoarseTimeProvider + SleepProvider,
41> {
42 sleep_prov: S,
44
45 memquota: ChannelAccount,
47
48 tls: T,
53
54 target_method: Option<ChannelMethod>,
56
57 unique_id: UniqId,
59}
60
61pub struct UnverifiedChannel<
65 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
66 S: CoarseTimeProvider + SleepProvider,
67> {
68 sleep_prov: S,
70 memquota: ChannelAccount,
72 link_protocol: u16,
74 tls: CellFrame<T>,
76 certs_cell: msg::Certs,
78 target_method: Option<ChannelMethod>,
80 #[allow(dead_code)] netinfo_cell: msg::Netinfo,
83 clock_skew: ClockSkew,
88 unique_id: UniqId,
90}
91
92pub struct VerifiedChannel<
100 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
101 S: CoarseTimeProvider + SleepProvider,
102> {
103 sleep_prov: S,
105 memquota: ChannelAccount,
107 link_protocol: u16,
109 tls: CellFrame<T>,
111 target_method: Option<ChannelMethod>,
113 unique_id: UniqId,
115 ed25519_id: Ed25519Identity,
117 rsa_id: RsaIdentity,
119 clock_skew: ClockSkew,
121}
122
123restricted_msg! {
124 #[derive(Clone,Debug)]
134 enum HandshakeMsg : ChanMsg {
135 Padding,
136 Vpadding,
137 AuthChallenge,
138 Certs,
139 Netinfo
140 }
141}
142
143fn codec_err_to_handshake(err: CodecError) -> Error {
146 match err {
147 CodecError::Io(e) => Error::HandshakeIoErr(Arc::new(e)),
148 CodecError::DecCell(e) => {
149 Error::HandshakeProto(format!("Invalid cell on handshake: {}", e))
150 }
151 CodecError::EncCell(e) => Error::from_cell_enc(e, "cell on handshake"),
152 }
153}
154
155impl<
156 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
157 S: CoarseTimeProvider + SleepProvider,
158 > OutboundClientHandshake<T, S>
159{
160 pub(crate) fn new(
162 tls: T,
163 target_method: Option<ChannelMethod>,
164 sleep_prov: S,
165 memquota: ChannelAccount,
166 ) -> Self {
167 Self {
168 tls,
169 target_method,
170 unique_id: UniqId::new(),
171 sleep_prov,
172 memquota,
173 }
174 }
175
176 pub async fn connect<F>(mut self, now_fn: F) -> Result<UnverifiedChannel<T, S>>
182 where
183 F: FnOnce() -> SystemTime,
184 {
185 fn io_err_to_handshake(err: std::io::Error) -> Error {
187 Error::HandshakeIoErr(Arc::new(err))
188 }
189
190 match &self.target_method {
191 Some(method) => debug!(
192 stream_id = %self.unique_id,
193 "starting Tor handshake with {:?}",
194 method
195 ),
196 None => debug!(stream_id = %self.unique_id, "starting Tor handshake"),
197 }
198 trace!(stream_id = %self.unique_id, "sending versions");
199 {
201 let my_versions = msg::Versions::new(LINK_PROTOCOLS)
202 .map_err(|e| Error::from_cell_enc(e, "versions message"))?;
203 self.tls
204 .write_all(
205 &my_versions
206 .encode_for_handshake()
207 .map_err(|e| Error::from_cell_enc(e.into(), "versions message"))?,
208 )
209 .await
210 .map_err(io_err_to_handshake)?;
211 self.tls.flush().await.map_err(io_err_to_handshake)?;
212 }
213 let versions_flushed_at = coarsetime::Instant::now();
214 let versions_flushed_wallclock = now_fn();
215
216 trace!(stream_id = %self.unique_id, "waiting for versions");
218 let their_versions: msg::Versions = {
219 let mut hdr = [0_u8; 5];
221 let not_relay = || {
222 Err(Error::HandshakeProto(
223 "Doesn't seem to be a tor relay".into(),
224 ))
225 };
226 match self.tls.read_exact(&mut hdr).await {
227 Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => return not_relay(),
228 otherwise => otherwise,
229 }
230 .map_err(io_err_to_handshake)?;
231 if hdr[0..3] != [0, 0, ChanCmd::VERSIONS.into()] {
232 return not_relay();
233 }
234 let msglen = u16::from_be_bytes(
235 hdr[3..5]
236 .try_into()
237 .expect("Two-byte field was not two bytes!?"),
238 );
239 let mut msg = vec![0; msglen as usize];
240 self.tls
241 .read_exact(&mut msg)
242 .await
243 .map_err(io_err_to_handshake)?;
244 let mut reader = Reader::from_slice(&msg);
245 reader
246 .extract()
247 .map_err(|e| Error::from_bytes_err(e, "versions cell"))?
248 };
249 trace!(stream_id = %self.unique_id, "received {:?}", their_versions);
250
251 let link_protocol = their_versions
253 .best_shared_link_protocol(LINK_PROTOCOLS)
254 .ok_or_else(|| Error::HandshakeProto("No shared link protocols".into()))?;
255 trace!(stream_id = %self.unique_id, "negotiated version {}", link_protocol);
256
257 let codec = ChannelCodec::<HandshakeMsg, HandshakeMsg>::new(link_protocol);
261 let mut tls = asynchronous_codec::Framed::new(self.tls, codec);
262
263 let mut certs: Option<msg::Certs> = None;
265 let mut netinfo: Option<(msg::Netinfo, coarsetime::Instant)> = None;
266 let mut seen_authchallenge = false;
267
268 trace!(stream_id = %self.unique_id, "waiting for rest of handshake.");
270 while let Some(m) = tls.next().await {
271 use HandshakeMsg::*;
272 let (_, m) = m.map_err(codec_err_to_handshake)?.into_circid_and_msg();
273 trace!(stream_id = %self.unique_id, "received a {} cell.", m.cmd());
274 match m {
275 Padding(_) | Vpadding(_) => (),
277 AuthChallenge(_) => {
279 if seen_authchallenge {
280 return Err(Error::HandshakeProto("Duplicate authchallenge cell".into()));
281 }
282 seen_authchallenge = true;
283 }
284 Certs(c) => {
285 if certs.is_some() {
286 return Err(Error::HandshakeProto("Duplicate certs cell".into()));
287 }
288 certs = Some(c);
289 }
290 Netinfo(n) => {
291 if netinfo.is_some() {
292 return Err(Error::from(internal!(
295 "Somehow tried to record a duplicate NETINFO cell"
296 )));
297 }
298 netinfo = Some((n, coarsetime::Instant::now()));
299 break;
300 }
301 }
302 }
303
304 match (certs, netinfo) {
306 (Some(_), None) => Err(Error::HandshakeProto(
307 "Missing netinfo or closed stream".into(),
308 )),
309 (None, _) => Err(Error::HandshakeProto("Missing certs cell".into())),
310 (Some(certs_cell), Some((netinfo_cell, netinfo_rcvd_at))) => {
311 trace!(stream_id = %self.unique_id, "received handshake, ready to verify.");
312 let clock_skew = if let Some(netinfo_timestamp) = netinfo_cell.timestamp() {
315 let delay = netinfo_rcvd_at - versions_flushed_at;
316 ClockSkew::from_handshake_timestamps(
317 versions_flushed_wallclock,
318 netinfo_timestamp,
319 delay.into(),
320 )
321 } else {
322 ClockSkew::None
323 };
324 Ok(UnverifiedChannel {
325 link_protocol,
326 tls: codec::change_message_types(tls),
327 certs_cell,
328 netinfo_cell,
329 clock_skew,
330 target_method: self.target_method.take(),
331 unique_id: self.unique_id,
332 sleep_prov: self.sleep_prov.clone(),
333 memquota: self.memquota.clone(),
334 })
335 }
336 }
337 }
338}
339
340impl<
341 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
342 S: CoarseTimeProvider + SleepProvider,
343 > UnverifiedChannel<T, S>
344{
345 pub fn clock_skew(&self) -> ClockSkew {
354 self.clock_skew
355 }
356
357 pub fn check<U: ChanTarget + ?Sized>(
371 self,
372 peer: &U,
373 peer_cert: &[u8],
374 now: Option<std::time::SystemTime>,
375 ) -> Result<VerifiedChannel<T, S>> {
376 let peer_cert_sha256 = ll::d::Sha256::digest(peer_cert);
377 self.check_internal(peer, &peer_cert_sha256[..], now)
378 }
379
380 fn check_internal<U: ChanTarget + ?Sized>(
383 self,
384 peer: &U,
385 peer_cert_sha256: &[u8],
386 now: Option<SystemTime>,
387 ) -> Result<VerifiedChannel<T, S>> {
388 use tor_cert::CertType;
389 use tor_checkable::*;
390
391 fn check_timeliness<C, T>(checkable: C, now: SystemTime, skew: ClockSkew) -> (Result<()>, T)
399 where
400 C: Timebound<T, Error = TimeValidityError>,
401 {
402 let status = checkable.is_valid_at(&now).map_err(|e| match (e, skew) {
403 (TimeValidityError::Expired(expired_by), ClockSkew::Fast(skew))
404 if expired_by < skew =>
405 {
406 Error::HandshakeCertsExpired { expired_by }
407 }
408 (_, _) => Error::HandshakeProto("Certificate expired or not yet valid".into()),
412 });
413 let cert = checkable.dangerously_assume_timely();
414 (status, cert)
415 }
416 let now = now.unwrap_or_else(SystemTime::now);
418
419 let c = &self.certs_cell;
433 fn get_cert(
435 certs: &tor_cell::chancell::msg::Certs,
436 tp: CertType,
437 ) -> Result<tor_cert::KeyUnknownCert> {
438 match certs.parse_ed_cert(tp) {
439 Ok(c) => Ok(c),
440 Err(tor_cell::Error::ChanProto(e)) => Err(Error::HandshakeProto(e)),
441 Err(e) => Err(Error::HandshakeProto(e.to_string())),
442 }
443 }
444
445 let id_sk = get_cert(c, CertType::IDENTITY_V_SIGNING)?;
446 let sk_tls = get_cert(c, CertType::SIGNING_V_TLS_CERT)?;
447
448 let mut sigs = Vec::new();
449
450 let (id_sk, id_sk_sig) = id_sk
459 .should_have_signing_key()
460 .map_err(Error::HandshakeCertErr)?
461 .dangerously_split()
462 .map_err(Error::HandshakeCertErr)?;
463 sigs.push(&id_sk_sig);
464 let (id_sk_timeliness, id_sk) = check_timeliness(id_sk, now, self.clock_skew);
465
466 let identity_key = id_sk.signing_key().ok_or_else(|| {
468 Error::HandshakeProto("Missing identity key in identity->signing cert".into())
469 })?;
470
471 let signing_key = id_sk.subject_key().as_ed25519().ok_or_else(|| {
473 Error::HandshakeProto("Bad key type in identity->signing cert".into())
474 })?;
475
476 let (sk_tls, sk_tls_sig) = sk_tls
479 .should_be_signed_with(signing_key)
480 .map_err(Error::HandshakeCertErr)?
481 .dangerously_split()
482 .map_err(Error::HandshakeCertErr)?;
483 sigs.push(&sk_tls_sig);
484 let (sk_tls_timeliness, sk_tls) = check_timeliness(sk_tls, now, self.clock_skew);
485
486 if peer_cert_sha256 != sk_tls.subject_key().as_bytes() {
487 return Err(Error::HandshakeProto(
488 "Peer cert did not authenticate TLS cert".into(),
489 ));
490 }
491
492 if !ll::pk::ed25519::validate_batch(&sigs[..]) {
498 return Err(Error::HandshakeProto(
499 "Invalid ed25519 signature in handshake".into(),
500 ));
501 }
502
503 let pkrsa = c
511 .cert_body(CertType::RSA_ID_X509)
512 .and_then(ll::util::x509_extract_rsa_subject_kludge)
513 .ok_or_else(|| Error::HandshakeProto("Couldn't find RSA identity key".into()))?;
514
515 let rsa_cert = c
521 .cert_body(CertType::RSA_ID_V_IDENTITY)
522 .ok_or_else(|| Error::HandshakeProto("No RSA->Ed crosscert".into()))?;
523 let rsa_cert = tor_cert::rsa::RsaCrosscert::decode(rsa_cert)
524 .map_err(|e| Error::from_bytes_err(e, "RSA identity cross-certificate"))?
525 .check_signature(&pkrsa)
526 .map_err(|_| Error::HandshakeProto("Bad RSA->Ed crosscert signature".into()))?;
527 let (rsa_cert_timeliness, rsa_cert) = check_timeliness(rsa_cert, now, self.clock_skew);
528
529 if !rsa_cert.subject_key_matches(identity_key) {
530 return Err(Error::HandshakeProto(
531 "RSA->Ed crosscert certifies incorrect key".into(),
532 ));
533 }
534
535 let rsa_id = pkrsa.to_rsa_identity();
536
537 trace!(
538 stream_id = %self.unique_id,
539 "Validated identity as {} [{}]",
540 identity_key,
541 rsa_id
542 );
543
544 let actual_identity = RelayIds::builder()
554 .ed_identity(*identity_key)
555 .rsa_identity(rsa_id)
556 .build()
557 .expect("Unable to build RelayIds");
558
559 match super::check_id_match_helper(&actual_identity, peer) {
562 Err(Error::ChanMismatch(msg)) => Err(Error::HandshakeProto(msg)),
563 other => other,
564 }?;
565
566 id_sk_timeliness?;
581 sk_tls_timeliness?;
582 rsa_cert_timeliness?;
583
584 Ok(VerifiedChannel {
585 link_protocol: self.link_protocol,
586 tls: self.tls,
587 unique_id: self.unique_id,
588 target_method: self.target_method,
589 ed25519_id: *identity_key,
590 rsa_id,
591 clock_skew: self.clock_skew,
592 sleep_prov: self.sleep_prov,
593 memquota: self.memquota,
594 })
595 }
596}
597
598impl<
599 T: AsyncRead + AsyncWrite + StreamOps + Send + Unpin + 'static,
600 S: CoarseTimeProvider + SleepProvider,
601 > VerifiedChannel<T, S>
602{
603 pub async fn finish(mut self) -> Result<(Arc<super::Channel>, super::reactor::Reactor<S>)> {
610 crate::note_incoming_traffic();
617 trace!(stream_id = %self.unique_id, "Sending netinfo cell.");
618
619 let peer_ip = self
624 .target_method
625 .as_ref()
626 .and_then(ChannelMethod::socket_addrs)
627 .and_then(|addrs| addrs.first())
628 .map(SocketAddr::ip);
629 let netinfo = msg::Netinfo::from_client(peer_ip);
630 self.tls
631 .send(netinfo.into())
632 .await
633 .map_err(codec_err_to_handshake)?;
634
635 debug!(
636 stream_id = %self.unique_id,
637 "Completed handshake with {} [{}]",
638 self.ed25519_id, self.rsa_id
639 );
640
641 let stream_ops = self.tls.new_handle();
648 let (tls_sink, tls_stream) = self.tls.split();
649
650 let mut peer_builder = OwnedChanTargetBuilder::default();
651 if let Some(target_method) = self.target_method {
652 if let Some(addrs) = target_method.socket_addrs() {
653 peer_builder.addrs(addrs.to_owned());
654 }
655 peer_builder.method(target_method);
656 }
657 let peer_id = peer_builder
658 .ed_identity(self.ed25519_id)
659 .rsa_identity(self.rsa_id)
660 .build()
661 .expect("OwnedChanTarget builder failed");
662
663 super::Channel::new(
664 self.link_protocol,
665 Box::new(tls_sink),
666 Box::new(tls_stream),
667 stream_ops,
668 self.unique_id,
669 peer_id,
670 self.clock_skew,
671 self.sleep_prov,
672 self.memquota,
673 )
674 }
675}
676
677#[cfg(test)]
678pub(super) mod test {
679 #![allow(clippy::unwrap_used)]
680 use hex_literal::hex;
681 use regex::Regex;
682 use std::time::{Duration, SystemTime};
683
684 use super::*;
685 use crate::channel::codec::test::MsgBuf;
686 use crate::util::fake_mq;
687 use crate::Result;
688 use tor_cell::chancell::msg;
689 use tor_linkspec::OwnedChanTarget;
690 use tor_rtcompat::{PreferredRuntime, Runtime};
691
692 const VERSIONS: &[u8] = &hex!("0000 07 0006 0003 0004 0005");
693 const NOCERTS: &[u8] = &hex!("00000000 81 0001 00");
695 const NETINFO_PREFIX: &[u8] = &hex!(
696 "00000000 08 00000000
697 04 04 7f 00 00 02
698 01
699 04 04 7f 00 00 03"
700 );
701 const NETINFO_PREFIX_WITH_TIME: &[u8] = &hex!(
702 "00000000 08 48949290
703 04 04 7f 00 00 02
704 01
705 04 04 7f 00 00 03"
706 );
707 const AUTHCHALLENGE: &[u8] = &hex!(
708 "00000000 82 0026
709 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
710 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
711 0002 0003 00ff"
712 );
713
714 const VPADDING: &[u8] = &hex!("00000000 80 0003 FF FF FF");
715
716 fn add_padded(buf: &mut Vec<u8>, cell: &[u8]) {
717 let len_prev = buf.len();
718 buf.extend_from_slice(cell);
719 buf.resize(len_prev + 514, 0);
720 }
721 fn add_netinfo(buf: &mut Vec<u8>) {
722 add_padded(buf, NETINFO_PREFIX);
723 }
724
725 #[test]
726 fn connect_ok() -> Result<()> {
727 tor_rtcompat::test_with_one_runtime!(|rt| async move {
728 let now = humantime::parse_rfc3339("2008-08-02T17:00:00Z").unwrap();
729 let mut buf = Vec::new();
730 buf.extend_from_slice(VERSIONS);
732 buf.extend_from_slice(NOCERTS);
734 add_padded(&mut buf, NETINFO_PREFIX);
736 let mb = MsgBuf::new(&buf[..]);
737 let handshake = OutboundClientHandshake::new(mb, None, rt.clone(), fake_mq());
738 let unverified = handshake.connect(|| now).await?;
739
740 assert_eq!(unverified.link_protocol, 5);
741 assert_eq!(unverified.clock_skew(), ClockSkew::None);
743
744 let mut buf = Vec::new();
746 buf.extend_from_slice(VERSIONS);
747 buf.extend_from_slice(NOCERTS);
748 buf.extend_from_slice(VPADDING);
749 buf.extend_from_slice(AUTHCHALLENGE);
750 buf.extend_from_slice(VPADDING);
751 add_padded(&mut buf, NETINFO_PREFIX_WITH_TIME);
752 let mb = MsgBuf::new(&buf[..]);
753 let handshake = OutboundClientHandshake::new(mb, None, rt.clone(), fake_mq());
754 let unverified = handshake.connect(|| now).await?;
755 assert_eq!(unverified.clock_skew(), ClockSkew::None);
757
758 let now2 = now + Duration::from_secs(3600);
760 let mb = MsgBuf::new(&buf[..]);
761 let handshake = OutboundClientHandshake::new(mb, None, rt.clone(), fake_mq());
762 let unverified = handshake.connect(|| now2).await?;
763 assert_eq!(
764 unverified.clock_skew(),
765 ClockSkew::Fast(Duration::from_secs(3600))
766 );
767
768 Ok(())
769 })
770 }
771
772 async fn connect_err<T: Into<Vec<u8>>, S>(input: T, sleep_prov: S) -> Error
773 where
774 S: CoarseTimeProvider + SleepProvider,
775 {
776 let mb = MsgBuf::new(input);
777 let handshake = OutboundClientHandshake::new(mb, None, sleep_prov, fake_mq());
778 handshake.connect(SystemTime::now).await.err().unwrap()
779 }
780
781 #[test]
782 fn connect_badver() {
783 tor_rtcompat::test_with_one_runtime!(|rt| async move {
784 let err = connect_err(&b"HTTP://"[..], rt.clone()).await;
785 assert!(matches!(err, Error::HandshakeProto(_)));
786 assert_eq!(
787 format!("{}", err),
788 "Handshake protocol violation: Doesn't seem to be a tor relay"
789 );
790
791 let err = connect_err(&hex!("0000 07 0004 1234 ffff")[..], rt.clone()).await;
792 assert!(matches!(err, Error::HandshakeProto(_)));
793 assert_eq!(
794 format!("{}", err),
795 "Handshake protocol violation: No shared link protocols"
796 );
797 });
798 }
799
800 #[test]
801 fn connect_cellparse() {
802 tor_rtcompat::test_with_one_runtime!(|rt| async move {
803 let mut buf = Vec::new();
804 buf.extend_from_slice(VERSIONS);
805 buf.extend_from_slice(&hex!("00000000 81 0001 01")[..]);
807 let err = connect_err(buf, rt.clone()).await;
808 assert!(matches!(err, Error::HandshakeProto(_)));
809 });
810 }
811
812 #[test]
813 fn connect_duplicates() {
814 tor_rtcompat::test_with_one_runtime!(|rt| async move {
815 let mut buf = Vec::new();
816 buf.extend_from_slice(VERSIONS);
817 buf.extend_from_slice(NOCERTS);
818 buf.extend_from_slice(NOCERTS);
819 add_netinfo(&mut buf);
820 let err = connect_err(buf, rt.clone()).await;
821 assert!(matches!(err, Error::HandshakeProto(_)));
822 assert_eq!(
823 format!("{}", err),
824 "Handshake protocol violation: Duplicate certs cell"
825 );
826
827 let mut buf = Vec::new();
828 buf.extend_from_slice(VERSIONS);
829 buf.extend_from_slice(NOCERTS);
830 buf.extend_from_slice(AUTHCHALLENGE);
831 buf.extend_from_slice(AUTHCHALLENGE);
832 add_netinfo(&mut buf);
833 let err = connect_err(buf, rt.clone()).await;
834 assert!(matches!(err, Error::HandshakeProto(_)));
835 assert_eq!(
836 format!("{}", err),
837 "Handshake protocol violation: Duplicate authchallenge cell"
838 );
839 });
840 }
841
842 #[test]
843 fn connect_missing_certs() {
844 tor_rtcompat::test_with_one_runtime!(|rt| async move {
845 let mut buf = Vec::new();
846 buf.extend_from_slice(VERSIONS);
847 add_netinfo(&mut buf);
848 let err = connect_err(buf, rt.clone()).await;
849 assert!(matches!(err, Error::HandshakeProto(_)));
850 assert_eq!(
851 format!("{}", err),
852 "Handshake protocol violation: Missing certs cell"
853 );
854 });
855 }
856
857 #[test]
858 fn connect_missing_netinfo() {
859 tor_rtcompat::test_with_one_runtime!(|rt| async move {
860 let mut buf = Vec::new();
861 buf.extend_from_slice(VERSIONS);
862 buf.extend_from_slice(NOCERTS);
863 let err = connect_err(buf, rt.clone()).await;
864 assert!(matches!(err, Error::HandshakeProto(_)));
865 assert_eq!(
866 format!("{}", err),
867 "Handshake protocol violation: Missing netinfo or closed stream"
868 );
869 });
870 }
871
872 #[test]
873 fn connect_misplaced_cell() {
874 tor_rtcompat::test_with_one_runtime!(|rt| async move {
875 let mut buf = Vec::new();
876 buf.extend_from_slice(VERSIONS);
877 add_padded(&mut buf, &hex!("00000001 01")[..]);
879 let err = connect_err(buf, rt.clone()).await;
880 assert!(matches!(err, Error::HandshakeProto(_)));
881 assert_eq!(
882 format!("{}", err),
883 "Handshake protocol violation: Invalid cell on handshake: Error while parsing channel cell"
884 );
885 });
886 }
887
888 fn make_unverified<R>(certs: msg::Certs, runtime: R) -> UnverifiedChannel<MsgBuf, R>
889 where
890 R: Runtime,
891 {
892 let localhost = std::net::IpAddr::V4(std::net::Ipv4Addr::LOCALHOST);
893 let netinfo_cell = msg::Netinfo::from_client(Some(localhost));
894 let clock_skew = ClockSkew::None;
895 UnverifiedChannel {
896 link_protocol: 4,
897 tls: asynchronous_codec::Framed::new(MsgBuf::new(&b""[..]), ChannelCodec::new(4)),
898 certs_cell: certs,
899 netinfo_cell,
900 clock_skew,
901 target_method: None,
902 unique_id: UniqId::new(),
903 sleep_prov: runtime,
904 memquota: fake_mq(),
905 }
906 }
907
908 fn cert_timestamp() -> SystemTime {
910 use humantime::parse_rfc3339;
911 parse_rfc3339("2020-09-26T18:01:20Z").unwrap()
912 }
913
914 fn certs_test<R>(
915 certs: msg::Certs,
916 when: Option<SystemTime>,
917 peer_ed: &[u8],
918 peer_rsa: &[u8],
919 peer_cert_sha256: &[u8],
920 runtime: &R,
921 ) -> Result<VerifiedChannel<MsgBuf, R>>
922 where
923 R: Runtime,
924 {
925 let unver = make_unverified(certs, runtime.clone());
926 let ed = Ed25519Identity::from_bytes(peer_ed).unwrap();
927 let rsa = RsaIdentity::from_bytes(peer_rsa).unwrap();
928 let chan = OwnedChanTarget::builder()
929 .ed_identity(ed)
930 .rsa_identity(rsa)
931 .build()
932 .unwrap();
933 unver.check_internal(&chan, peer_cert_sha256, when)
934 }
935
936 #[test]
938 fn certs_none() {
939 let rt = PreferredRuntime::create().unwrap();
940 let err = certs_test(
941 msg::Certs::new_empty(),
942 None,
943 &[0_u8; 32],
944 &[0_u8; 20],
945 &[0_u8; 128],
946 &rt,
947 )
948 .err()
949 .unwrap();
950 assert_eq!(
951 format!("{}", err),
952 "Handshake protocol violation: Missing IDENTITY_V_SIGNING certificate"
953 );
954 }
955
956 #[test]
957 fn certs_good() {
958 let rt = PreferredRuntime::create().unwrap();
959 let mut certs = msg::Certs::new_empty();
960
961 certs.push_cert_body(2.into(), certs::CERT_T2);
962 certs.push_cert_body(5.into(), certs::CERT_T5);
963 certs.push_cert_body(7.into(), certs::CERT_T7);
964 certs.push_cert_body(4.into(), certs::CERT_T4);
965 let res = certs_test(
966 certs,
967 Some(cert_timestamp()),
968 certs::PEER_ED,
969 certs::PEER_RSA,
970 certs::PEER_CERT_DIGEST,
971 &rt,
972 );
973 let _ = res.unwrap();
974 }
975
976 #[test]
977 fn certs_missing() {
978 let rt = PreferredRuntime::create().unwrap();
979 let all_certs = [
980 (2, certs::CERT_T2, "Couldn't find RSA identity key"),
981 (7, certs::CERT_T7, "No RSA->Ed crosscert"),
982 (4, certs::CERT_T4, "Missing IDENTITY_V_SIGNING certificate"),
983 (5, certs::CERT_T5, "Missing SIGNING_V_TLS_CERT certificate"),
984 ];
985
986 for omit_idx in 0..4 {
987 let mut certs = msg::Certs::new_empty();
989 let mut expect_err = None;
990 for (idx, (ctype, cert, err)) in all_certs.iter().enumerate() {
991 if idx == omit_idx {
992 expect_err = Some(err);
993 continue;
994 }
995
996 certs.push_cert_body((*ctype).into(), &cert[..]);
997 }
998 let res = certs_test(
999 certs,
1000 Some(cert_timestamp()),
1001 certs::PEER_ED,
1002 certs::PEER_RSA,
1003 certs::PEER_CERT_DIGEST,
1004 &rt,
1005 )
1006 .err()
1007 .unwrap();
1008
1009 assert_eq!(
1010 format!("{}", res),
1011 format!("Handshake protocol violation: {}", expect_err.unwrap())
1012 );
1013 }
1014 }
1015
1016 #[test]
1017 fn certs_wrongtarget() {
1018 let rt = PreferredRuntime::create().unwrap();
1019 let mut certs = msg::Certs::new_empty();
1020 certs.push_cert_body(2.into(), certs::CERT_T2);
1021 certs.push_cert_body(5.into(), certs::CERT_T5);
1022 certs.push_cert_body(7.into(), certs::CERT_T7);
1023 certs.push_cert_body(4.into(), certs::CERT_T4);
1024 let err = certs_test(
1025 certs.clone(),
1026 Some(cert_timestamp()),
1027 &[0x10; 32],
1028 certs::PEER_RSA,
1029 certs::PEER_CERT_DIGEST,
1030 &rt,
1031 )
1032 .err()
1033 .unwrap();
1034
1035 let re = Regex::new(
1036 r"Identity .* does not match target .*",
1038 )
1039 .unwrap();
1040 assert!(re.is_match(&format!("{}", err)));
1041
1042 let err = certs_test(
1043 certs.clone(),
1044 Some(cert_timestamp()),
1045 certs::PEER_ED,
1046 &[0x99; 20],
1047 certs::PEER_CERT_DIGEST,
1048 &rt,
1049 )
1050 .err()
1051 .unwrap();
1052
1053 let re = Regex::new(
1054 r"Identity .* does not match target .*",
1056 )
1057 .unwrap();
1058 assert!(re.is_match(&format!("{}", err)));
1059
1060 let err = certs_test(
1061 certs,
1062 Some(cert_timestamp()),
1063 certs::PEER_ED,
1064 certs::PEER_RSA,
1065 &[0; 32],
1066 &rt,
1067 )
1068 .err()
1069 .unwrap();
1070
1071 assert_eq!(
1072 format!("{}", err),
1073 "Handshake protocol violation: Peer cert did not authenticate TLS cert"
1074 );
1075 }
1076
1077 #[test]
1078 fn certs_badsig() {
1079 let rt = PreferredRuntime::create().unwrap();
1080 fn munge(inp: &[u8]) -> Vec<u8> {
1081 let mut v: Vec<u8> = inp.into();
1082 v[inp.len() - 1] ^= 0x10;
1083 v
1084 }
1085 let mut certs = msg::Certs::new_empty();
1086 certs.push_cert_body(2.into(), certs::CERT_T2);
1087 certs.push_cert_body(5.into(), munge(certs::CERT_T5)); certs.push_cert_body(7.into(), certs::CERT_T7);
1089 certs.push_cert_body(4.into(), certs::CERT_T4);
1090 let res = certs_test(
1091 certs,
1092 Some(cert_timestamp()),
1093 certs::PEER_ED,
1094 certs::PEER_RSA,
1095 certs::PEER_CERT_DIGEST,
1096 &rt,
1097 )
1098 .err()
1099 .unwrap();
1100
1101 assert_eq!(
1102 format!("{}", res),
1103 "Handshake protocol violation: Invalid ed25519 signature in handshake"
1104 );
1105
1106 let mut certs = msg::Certs::new_empty();
1107 certs.push_cert_body(2.into(), certs::CERT_T2);
1108 certs.push_cert_body(5.into(), certs::CERT_T5);
1109 certs.push_cert_body(7.into(), munge(certs::CERT_T7)); certs.push_cert_body(4.into(), certs::CERT_T4);
1111 let res = certs_test(
1112 certs,
1113 Some(cert_timestamp()),
1114 certs::PEER_ED,
1115 certs::PEER_RSA,
1116 certs::PEER_CERT_DIGEST,
1117 &rt,
1118 )
1119 .err()
1120 .unwrap();
1121
1122 assert_eq!(
1123 format!("{}", res),
1124 "Handshake protocol violation: Bad RSA->Ed crosscert signature"
1125 );
1126 }
1127
1128 mod certs {
1134 use hex_literal::hex;
1135
1136 pub(crate) const CERT_T2: &[u8] = &hex!("308201B930820122A0030201020208607C28BE6C390943300D06092A864886F70D01010B0500301F311D301B06035504030C147777772E74636A76356B766A646472322E636F6D301E170D3230303831303030303030305A170D3231303831303030303030305A301F311D301B06035504030C147777772E74636A76356B766A646472322E636F6D30819F300D06092A864886F70D010101050003818D0030818902818100D38B1E6CEB946E0DB0751F4CBACE3DCB9688B6C25304227B4710C35AFB73627E50500F5913E158B621802612D1C75827003703338375237552EB3CD3C12F6AB3604E60C1A2D26BB1FBAD206FF023969A90909D6A65A5458A5312C26EBD3A3DAD30302D4515CDCD264146AC18E6FC60A04BD3EC327F04294D96BA5AA25B464C3F0203010001300D06092A864886F70D01010B0500038181003BCE561EA7F95CC00B78AAB5D69573FF301C282A751D4A651921D042F1BECDBA24D918A6D8A5E138DC07BBA0B335478AE37ABD2C93A93932442AE9084329E846170FE0FC4A50AAFC804F311CC3CA4F41D845A7BA5901CBBC3E021E9794AAC70CE1F37B0A951592DB1B64F2B4AFB81AE52DBD9B6FEDE96A5FB8125EB6251EE50A");
1137
1138 pub(crate) const CERT_T4: &[u8] = &hex!("01040006CC2A01F82294B866A31F01FC5D0DA8572850A9B929545C3266558D7D2316E3B74172B00100200400DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E9FF1A5203FA27F86EF7528D89A0845D2520166E340754FFEA2AAE0F612B7CE5DA094A0236CDAC45034B0B6842C18E7F6B51B93A3CF7E60663B8AD061C30A62602");
1139 pub(crate) const CERT_T5: &[u8] = &hex!("01050006C98A03B4FD606B64E4CBD466B8D76CB131069BAE6F3AA1878857C9F624E31D77A799B8007173E5F8068431D0D3F5EE16B4C9FFD59DF373E152A87281BAE744AA5FCF72171BF4B27C4E8FC1C6A9FC5CA11058BC49647063D7903CFD9F512F89099B27BC0C");
1140
1141 pub(crate) const CERT_T7: &[u8] = &hex!("DCB604DB2034B00FD16986D4ADB9D16B21CB4E4457A33DEC0F538903683E96E90006DA3A805CF6006F9179066534DE6B45AD47A5C469063EE462762723396DC9F25452A0A52DA3F5087DD239F2A311F6B0D4DFEFF4ABD089DC3D0237A0ABAB19EB2045B91CDCAF04BE0A72D548A27BF2E77BD876ECFE5E1BE622350DA6BF31F6E306ED896488DD5B39409B23FC3EB7B2C9F7328EB18DA36D54D80575899EA6507CCBFCDF1F");
1142
1143 pub(crate) const PEER_CERT_DIGEST: &[u8] =
1144 &hex!("b4fd606b64e4cbd466b8d76cb131069bae6f3aa1878857c9f624e31d77a799b8");
1145
1146 pub(crate) const PEER_ED: &[u8] =
1147 &hex!("dcb604db2034b00fd16986d4adb9d16b21cb4e4457a33dec0f538903683e96e9");
1148 pub(crate) const PEER_RSA: &[u8] = &hex!("2f1fb49bb332a9eec617e41e911c33fb3890aef3");
1149 }
1150
1151 #[test]
1152 fn test_finish() {
1153 tor_rtcompat::test_with_one_runtime!(|rt| async move {
1154 let ed25519_id = [3_u8; 32].into();
1155 let rsa_id = [4_u8; 20].into();
1156 let peer_addr = "127.1.1.2:443".parse().unwrap();
1157 let ver = VerifiedChannel {
1158 link_protocol: 4,
1159 tls: asynchronous_codec::Framed::new(MsgBuf::new(&b""[..]), ChannelCodec::new(4)),
1160 unique_id: UniqId::new(),
1161 target_method: Some(ChannelMethod::Direct(vec![peer_addr])),
1162 ed25519_id,
1163 rsa_id,
1164 clock_skew: ClockSkew::None,
1165 sleep_prov: rt,
1166 memquota: fake_mq(),
1167 };
1168
1169 let (_chan, _reactor) = ver.finish().await.unwrap();
1170
1171 });
1173 }
1174}