use std::path::Path;
use crate::Result;
use crate::extract::{FiveTuple, FiveTupleKey};
use crate::pcap::PcapFlowSource;
use crate::session::SessionEvent;
use crate::tls::handshake::{TlsHandshake, TlsHandshakeParser};
use crate::tls::session::{TlsMessage, TlsParser};
use crate::tls::types::TlsClientHello;
pub fn client_hellos_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = (FiveTupleKey, Box<TlsClientHello>)>> {
let source = PcapFlowSource::open(path)?;
Ok(source
.sessions(FiveTuple::bidirectional(), TlsParser::default())
.filter_map(|evt| evt.ok())
.filter_map(|evt| match evt {
SessionEvent::Application {
key,
message: TlsMessage::ClientHello(h),
..
} => Some((key, h)),
_ => None,
}))
}
pub fn handshakes_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = (FiveTupleKey, TlsHandshake)>> {
let source = PcapFlowSource::open(path)?;
Ok(source
.sessions(FiveTuple::bidirectional(), TlsHandshakeParser::default())
.filter_map(|evt| evt.ok())
.filter_map(|evt| match evt {
SessionEvent::Application { key, message, .. } => Some((key, message)),
_ => None,
}))
}