1#![deny(rustdoc::broken_intra_doc_links)]
4
5mod acceptor;
6mod connector;
7mod error;
8mod handshake;
9mod stream;
10
11pub use acceptor::TlsAcceptor;
12pub use acceptor::TlsAcceptorBuilder;
13pub use connector::TlsConnector;
14pub use connector::TlsConnectorBuilder;
15
16pub(crate) use error::Error;
17pub(crate) use stream::TlsStream;
18
19use tls_api::ImplInfo;
20
21fn encode_alpn_protos(protos: &[&[u8]]) -> anyhow::Result<Vec<u8>> {
22 let mut r = Vec::new();
23 for proto in protos {
24 if proto.len() > 255 {
25 return Err(crate::Error::AlpnProtocolLen.into());
26 }
27 r.push(proto.len() as u8);
28 r.extend_from_slice(proto);
29 }
30 Ok(r)
31}
32
33#[cfg(test)]
34#[test]
35fn test_encode_alpn_protos() {
36 assert_eq!(
37 &b"\x06spdy/1\x08http/1.1"[..],
38 &encode_alpn_protos(&[b"spdy/1", b"http/1.1"]).unwrap()[..]
39 );
40}
41
42pub(crate) fn into() -> ImplInfo {
43 ImplInfo {
44 name: "openssl",
45 version: openssl::version::version(),
46 }
47}