1#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
27
28pub mod certificate;
29mod upgrade;
30mod verifier;
31
32use std::sync::Arc;
33
34use certificate::AlwaysResolvesCert;
35pub use futures_rustls::TlsStream;
36use libp2p_identity::{Keypair, PeerId};
37pub use upgrade::{Config, UpgradeError};
38
39const P2P_ALPN: [u8; 6] = *b"libp2p";
40
41pub fn make_client_config(
43 keypair: &Keypair,
44 remote_peer_id: Option<PeerId>,
45) -> Result<rustls::ClientConfig, certificate::GenError> {
46 let (certificate, private_key) = certificate::generate(keypair)?;
47
48 let mut provider = rustls::crypto::ring::default_provider();
49 provider.cipher_suites = verifier::CIPHERSUITES.to_vec();
50
51 let cert_resolver = Arc::new(
52 AlwaysResolvesCert::new(certificate, &private_key)
53 .expect("Client cert key DER is valid; qed"),
54 );
55
56 let mut crypto = rustls::ClientConfig::builder_with_provider(provider.into())
57 .with_protocol_versions(verifier::PROTOCOL_VERSIONS)
58 .expect("Cipher suites and kx groups are configured; qed")
59 .dangerous()
60 .with_custom_certificate_verifier(Arc::new(
61 verifier::Libp2pCertificateVerifier::with_remote_peer_id(remote_peer_id),
62 ))
63 .with_client_cert_resolver(cert_resolver);
64 crypto.alpn_protocols = vec![P2P_ALPN.to_vec()];
65
66 Ok(crypto)
67}
68
69pub fn make_server_config(
71 keypair: &Keypair,
72) -> Result<rustls::ServerConfig, certificate::GenError> {
73 let (certificate, private_key) = certificate::generate(keypair)?;
74
75 let mut provider = rustls::crypto::ring::default_provider();
76 provider.cipher_suites = verifier::CIPHERSUITES.to_vec();
77
78 let cert_resolver = Arc::new(
79 AlwaysResolvesCert::new(certificate, &private_key)
80 .expect("Server cert key DER is valid; qed"),
81 );
82
83 let mut crypto = rustls::ServerConfig::builder_with_provider(provider.into())
84 .with_protocol_versions(verifier::PROTOCOL_VERSIONS)
85 .expect("Cipher suites and kx groups are configured; qed")
86 .with_client_cert_verifier(Arc::new(verifier::Libp2pCertificateVerifier::new()))
87 .with_cert_resolver(cert_resolver);
88 crypto.alpn_protocols = vec![P2P_ALPN.to_vec()];
89
90 Ok(crypto)
91}