tls_api_openssl/
lib.rs

1//! [`tls_api`] implementation for [`openssl`].
2
3#![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}