| // Copyright 2026 The BoringSSL Authors | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| use bssl_x509::keys::PrivateKeyAlgorithm; | |
| use futures::future::try_join; | |
| use super::*; | |
| use crate::{ | |
| credentials::{ | |
| PskHash, | |
| TlsCredential, // | |
| }, | |
| tests::{ | |
| create_mock_pipe, // | |
| }, | |
| }; | |
| #[test] | |
| fn parse_none() { | |
| let certs = Certificate::parse_all_from_pem(b"", None).unwrap(); | |
| assert!(certs.is_empty()); | |
| } | |
| #[test] | |
| fn parse_one() { | |
| const PEM: &'_ [u8] = b" | |
| Hello world! | |
| -----BEGIN CERTIFICATE----- | |
| SGVsbG8gV29ybGQh | |
| -----END CERTIFICATE----- | |
| "; | |
| let certs = Certificate::parse_all_from_pem(PEM, None).unwrap(); | |
| assert_eq!(certs.len(), 1); | |
| assert_eq!(certs[0].as_der_bytes(), b"Hello World!"); | |
| } | |
| #[test] | |
| fn parse_all_pems() { | |
| const PEM: &'_ [u8] = b" | |
| Hello world! | |
| -----BEGIN CERTIFICATE----- | |
| SGVsbG8gV29ybGQh | |
| -----END CERTIFICATE----- | |
| BoringSSL is ... | |
| -----BEGIN CERTIFICATE----- | |
| QXdlc29tZSBCb3JpbmdTU0wh | |
| -----END CERTIFICATE----- | |
| Trailing bits ... | |
| "; | |
| let certs = Certificate::parse_all_from_pem(PEM, None).unwrap(); | |
| assert_eq!(certs.len(), 2); | |
| assert_eq!(certs[0].as_der_bytes(), b"Hello World!"); | |
| assert_eq!(certs[1].as_der_bytes(), b"Awesome BoringSSL!"); | |
| } | |
| #[test] | |
| fn parse_all_pems_fail() { | |
| const PEM: &'_ [u8] = b" | |
| Hello world! | |
| -----BEGIN CERTIFICATE----- | |
| SGVsbG8gV29ybGQh | |
| -----END CERTIFICATE----- | |
| BoringSSL is ... | |
| -----BEGIN CERTIFICATE----- | |
| QXdlc29tZSBCb3JpbmdTU0wh | |
| -----END CERTIFICATE----- | |
| But something badddd... | |
| -----BEGIN CERTIFICATE----- | |
| "; | |
| let _ = Certificate::parse_all_from_pem(PEM, None).unwrap_err(); | |
| } | |
| #[test] | |
| fn parse_private_key() { | |
| const PEM: &'_ [u8] = b"-----BEGIN ENCRYPTED PRIVATE KEY----- | |
| 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 | |
| -----END ENCRYPTED PRIVATE KEY----- | |
| "; | |
| let priv_key = PrivateKey::from_pem(PEM, || b"Hello BoringSSL!").unwrap(); | |
| assert!(matches!( | |
| priv_key.algorithm(), | |
| Some(PrivateKeyAlgorithm::Rsa) | |
| )); | |
| } | |
| #[test] | |
| fn psk_tls13_handshake() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { | |
| let key = b"test-key-test-key-test-key-test-key"; | |
| let identity = b"test-identity"; | |
| let context = b"test-context"; | |
| let cred = TlsCredential::new_pre_shared_key(key, identity, PskHash::Sha256, context)?; | |
| let mut server_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| server_ctx.with_credential(cred.clone())?; | |
| let mut client_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| client_ctx.with_credential(cred)?; | |
| let server_ctx = server_ctx.build(); | |
| let client_ctx = client_ctx.build(); | |
| let (client_socket, server_socket, mut executor) = create_mock_pipe(); | |
| let mut client_conn = client_ctx.new_client_connection(None)?.build(); | |
| let mut server_conn = server_ctx.new_server_connection(None)?.build(); | |
| client_conn.set_io(client_socket)?; | |
| server_conn.set_io(server_socket)?; | |
| let test_future = async { | |
| let client_handshake = async { | |
| let mut in_handshake = client_conn.in_handshake().unwrap(); | |
| in_handshake.async_handshake().await?; | |
| Ok::<(), crate::errors::Error>(()) | |
| }; | |
| let server_handshake = async { | |
| let mut in_handshake = server_conn.in_handshake().unwrap(); | |
| in_handshake.async_handshake().await?; | |
| Ok::<(), crate::errors::Error>(()) | |
| }; | |
| try_join(client_handshake, server_handshake).await?; | |
| Ok::<(), crate::errors::Error>(()) | |
| }; | |
| executor.run(test_future)?; | |
| Ok(()) | |
| } | |
| #[cfg(all(unix, feature = "std"))] | |
| #[test] | |
| fn psk_tls13_handshake_sync() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { | |
| use crate::credentials::{PskHash, TlsCredential}; | |
| use crate::io::sync_io::{NoAsync, StdIoWithReactor}; | |
| use std::io::pipe; | |
| let (server_rx, client_tx) = pipe().unwrap(); | |
| let (client_rx, server_tx) = pipe().unwrap(); | |
| let client_reader = StdIoWithReactor::new(client_rx, NoAsync); | |
| let client_writer = StdIoWithReactor::new(client_tx, NoAsync); | |
| let server_reader = StdIoWithReactor::new(server_rx, NoAsync); | |
| let server_writer = StdIoWithReactor::new(server_tx, NoAsync); | |
| let key = b"test-key-test-key-test-key-test-key"; | |
| let identity = b"test-identity"; | |
| let context = b"test-context"; | |
| let cred = TlsCredential::new_pre_shared_key(key, identity, PskHash::Sha256, context)?; | |
| let mut server_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| server_ctx.with_credential(cred.clone())?; | |
| let server_ctx = server_ctx.build(); | |
| let mut client_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| client_ctx.with_credential(cred)?; | |
| let client_ctx = client_ctx.build(); | |
| let mut client_conn = client_ctx.new_client_connection(None)?.build(); | |
| let mut server_conn = server_ctx.new_server_connection(None)?.build(); | |
| client_conn.set_split_io(client_reader, client_writer)?; | |
| server_conn.set_split_io(server_reader, server_writer)?; | |
| let server_thread = std::thread::spawn(move || { | |
| let mut in_handshake = server_conn.in_handshake().unwrap(); | |
| in_handshake.do_handshake().unwrap(); | |
| server_conn | |
| }); | |
| let mut in_handshake = client_conn.in_handshake().unwrap(); | |
| in_handshake.do_handshake().unwrap(); | |
| let _server_conn = server_thread.join().unwrap(); | |
| Ok(()) | |
| } | |
| unsafe extern "C" fn accept_any_verify( | |
| _ssl: *mut bssl_sys::SSL, | |
| _out_alert: *mut u8, | |
| ) -> bssl_sys::ssl_verify_result_t { | |
| bssl_sys::ssl_verify_result_t_ssl_verify_ok | |
| } | |
| #[test] | |
| fn rpk_tls13_handshake() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { | |
| use crate::credentials::{ | |
| CertificateType, CertificateVerificationMode, RawPublicKeyMode, TlsCredentialBuilder, | |
| }; | |
| use crate::tests::create_mock_pipe; | |
| use bssl_x509::keys::PrivateKey; | |
| const PEM: &'_ [u8] = b"-----BEGIN ENCRYPTED PRIVATE KEY----- | |
| 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 | |
| -----END ENCRYPTED PRIVATE KEY----- | |
| "; | |
| let priv_key = PrivateKey::from_pem(PEM, || b"Hello BoringSSL!").unwrap(); | |
| let cred = TlsCredentialBuilder::<RawPublicKeyMode>::new_raw_public_key(priv_key) | |
| .build() | |
| .unwrap(); | |
| let mut server_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| server_ctx.with_credential(cred.clone())?; | |
| let server_ctx = server_ctx.build(); | |
| let mut client_ctx = crate::context::TlsContextBuilder::new_tls(); | |
| client_ctx.with_accepted_peer_cert_types(&[CertificateType::Rpk])?; | |
| let client_ctx = client_ctx.build(); | |
| let mut client_conn_builder = client_ctx.new_client_connection(None)?; | |
| client_conn_builder.with_certificate_verification_mode(CertificateVerificationMode::None); | |
| let mut client_conn = client_conn_builder.build(); | |
| unsafe { | |
| // Safety: | |
| // - `client_conn.ptr()` is a valid `SSL` handle. | |
| // - `accept_any_verify` is a valid callback. | |
| bssl_sys::SSL_set_custom_verify( | |
| client_conn.ptr(), | |
| bssl_sys::SSL_VERIFY_PEER as _, | |
| Some(accept_any_verify), | |
| ); | |
| } | |
| let mut server_conn = server_ctx.new_server_connection(None)?.build(); | |
| let (sock_client, sock_server, mut executor) = create_mock_pipe(); | |
| client_conn.set_io(sock_client)?; | |
| server_conn.set_io(sock_server)?; | |
| executor.run(try_join( | |
| Pin::new(&mut client_conn).async_write(b"hello"), | |
| Pin::new(&mut server_conn).async_write(b"world"), | |
| ))?; | |
| assert_eq!( | |
| client_conn.get_peer_certificate_type(), | |
| Some(CertificateType::Rpk) | |
| ); | |
| Ok(()) | |
| } |