Add tls server example (#77)

* Add tls server example
* CI / license: ignore certs in tls_server-rs/ta/test-ca
* Update overview-of-optee-rust-examples.md
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 2a1e6b6..ccce5cc 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -34,3 +34,4 @@
     - 'KEYS'
     - 'DISCLAIMER-WIP'
     - '.gitmodules'
+    - 'examples/tls_server-rs/ta/test-ca/**'
diff --git a/docs/overview-of-optee-rust-examples.md b/docs/overview-of-optee-rust-examples.md
index 240d6f7..8f2e767 100644
--- a/docs/overview-of-optee-rust-examples.md
+++ b/docs/overview-of-optee-rust-examples.md
@@ -33,3 +33,4 @@
 | udp_socket-rs                | `87c2d78e-eb7b-11eb-8d25-df4d5338f285` | Do UDP socket connection from Trusted Application.           |
 | signature_verification-rs    | `c7e478c2-89b3-46eb-ac19-571e66c3830d` | Sign a message and verify the signature using the third party crate [ring](https://github.com/veracruz-project/ring). |
 | tls_client-rs                | `ec55bfe2-d9c7-11eb-8b0e-f3f8fad927f7` | Do TLS connection from Trusted Application.                  |
+| tls_server-rs                | `69547de6-f47e-11eb-994e-f34e88d5c2b4` | Set up the TLS server in Trusted Application.                |
diff --git a/examples/tls_server-rs/Makefile b/examples/tls_server-rs/Makefile
new file mode 100644
index 0000000..09679cd
--- /dev/null
+++ b/examples/tls_server-rs/Makefile
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+all:
+	@make -s -C host
+	@make -s -C ta
+
+clean:
+	@make -s -C host clean
+	@make -s -C ta clean
diff --git a/examples/tls_server-rs/host/Cargo.lock b/examples/tls_server-rs/host/Cargo.lock
new file mode 100644
index 0000000..5c1101d
--- /dev/null
+++ b/examples/tls_server-rs/host/Cargo.lock
@@ -0,0 +1,104 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "hex"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
+
+[[package]]
+name = "libc"
+version = "0.2.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
+
+[[package]]
+name = "optee-teec"
+version = "0.2.0"
+dependencies = [
+ "hex",
+ "libc",
+ "optee-teec-macros",
+ "optee-teec-sys",
+ "uuid 0.7.4",
+]
+
+[[package]]
+name = "optee-teec-macros"
+version = "0.2.0"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "optee-teec-sys"
+version = "0.2.0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "proto"
+version = "0.2.0"
+dependencies = [
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "tls_server-rs"
+version = "0.2.0"
+dependencies = [
+ "libc",
+ "optee-teec",
+ "proto",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+
+[[package]]
+name = "uuid"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
diff --git a/examples/tls_server-rs/host/Cargo.toml b/examples/tls_server-rs/host/Cargo.toml
new file mode 100644
index 0000000..98af739
--- /dev/null
+++ b/examples/tls_server-rs/host/Cargo.toml
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+[package]
+name = "tls_server-rs"
+version = "0.2.0"
+authors = ["Teaclave Contributors <dev@teaclave.apache.org>"]
+license = "Apache-2.0"
+repository = "https://github.com/apache/incubator-teaclave-trustzone-sdk.git"
+description = "An example of Rust OP-TEE TrustZone SDK."
+edition = "2018"
+
+[dependencies]
+libc = "0.2.48"
+proto = { path = "../proto" }
+optee-teec = { path = "../../../optee-teec" }
+
+[profile.release]
+lto = true
diff --git a/examples/tls_server-rs/host/Makefile b/examples/tls_server-rs/host/Makefile
new file mode 100644
index 0000000..0b741ea
--- /dev/null
+++ b/examples/tls_server-rs/host/Makefile
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+NAME := tls_server-rs
+ARCH ?= aarch64
+
+OPTEE_DIR ?= ../../../optee
+
+ifeq ($(ARCH), arm)
+	OPTEE_BIN := $(OPTEE_DIR)/toolchains/aarch32/bin
+	OBJCOPY := $(OPTEE_BIN)/arm-linux-gnueabihf-objcopy
+	TARGET := arm-unknown-linux-gnueabihf
+else
+	OPTEE_BIN := $(OPTEE_DIR)/toolchains/$(ARCH)/bin
+	OBJCOPY := $(OPTEE_BIN)/aarch64-linux-gnu-objcopy
+	TARGET := aarch64-unknown-linux-gnu
+endif
+
+OUT_DIR := $(CURDIR)/target/$(TARGET)/release
+
+
+all: host strip
+
+host:
+	@cargo build --target $(TARGET) --release
+
+strip:
+	@$(OBJCOPY) --strip-unneeded $(OUT_DIR)/$(NAME) $(OUT_DIR)/$(NAME)
+
+clean:
+	@cargo clean
diff --git a/examples/tls_server-rs/host/src/main.rs b/examples/tls_server-rs/host/src/main.rs
new file mode 100644
index 0000000..f21d50c
--- /dev/null
+++ b/examples/tls_server-rs/host/src/main.rs
@@ -0,0 +1,119 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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 optee_teec::{Context, Operation, Session, Uuid};
+use optee_teec::{ParamNone, ParamTmpRef, ParamType, ParamValue};
+use proto::{Command, UUID};
+use std::io::Read;
+use std::io::Write;
+use std::net::{TcpListener, TcpStream};
+
+const MAX_PAYLOAD: u16 = 16384 + 2048;
+const HEADER_SIZE: u16 = 1 + 2 + 2;
+pub const MAX_WIRE_SIZE: usize = (MAX_PAYLOAD + HEADER_SIZE) as usize;
+
+fn main() -> optee_teec::Result<()> {
+    let mut ctx = Context::new()?;
+    let uuid = Uuid::parse_str(UUID).unwrap();
+    let mut ta_session = ctx.open_session(uuid)?;
+
+    let mut session_id: u32 = 0;
+    println!("listening");
+    let listener = TcpListener::bind("0.0.0.0:4433").unwrap();
+
+    for stream in listener.incoming() {
+        session_id += 1;
+        handle_client(&mut ta_session, session_id, stream.unwrap())?;
+    }
+
+    println!("Success");
+    Ok(())
+}
+
+fn new_tls_session(ta_session: &mut Session, session_id: u32) -> optee_teec::Result<()> {
+    let p0 = ParamValue::new(session_id, 0, ParamType::ValueInput);
+    let mut operation = Operation::new(0, p0, ParamNone, ParamNone, ParamNone);
+    ta_session.invoke_command(Command::NewTlsSession as u32, &mut operation)?;
+    Ok(())
+}
+
+fn close_tls_session(ta_session: &mut Session, session_id: u32) -> optee_teec::Result<()> {
+    let p0 = ParamValue::new(session_id, 0, ParamType::ValueInput);
+    let mut operation = Operation::new(0, p0, ParamNone, ParamNone, ParamNone);
+    ta_session.invoke_command(Command::CloseTlsSession as u32, &mut operation)?;
+    Ok(())
+}
+
+fn do_tls_read(
+    ta_session: &mut Session,
+    session_id: u32,
+    buf: &mut [u8],
+) -> optee_teec::Result<()> {
+    let p0 = ParamValue::new(session_id, 0, ParamType::ValueInput);
+    let p1 = ParamTmpRef::new_input(buf);
+    let mut operation = Operation::new(0, p0, p1, ParamNone, ParamNone);
+    ta_session.invoke_command(Command::DoTlsRead as u32, &mut operation)?;
+    Ok(())
+}
+
+fn do_tls_write(
+    ta_session: &mut Session,
+    session_id: u32,
+    buf: &mut [u8],
+) -> optee_teec::Result<usize> {
+    let p0 = ParamValue::new(session_id, 0, ParamType::ValueInput);
+    let p1 = ParamTmpRef::new_output(buf);
+    let p2 = ParamValue::new(0, 0, ParamType::ValueOutput);
+    let mut operation = Operation::new(0, p0, p1, p2, ParamNone);
+    ta_session.invoke_command(Command::DoTlsWrite as u32, &mut operation)?;
+    Ok(operation.parameters().2.a() as usize)
+}
+
+fn handle_client(
+    ta_session: &mut Session,
+    session_id: u32,
+    mut stream: TcpStream,
+) -> optee_teec::Result<()> {
+    println!("new session");
+    new_tls_session(ta_session, session_id)?;
+    loop {
+        let mut buf = [0u8; MAX_WIRE_SIZE];
+        println!("stream read");
+        match stream.read(&mut buf) {
+            Ok(0) | Err(_) => {
+                println!("close session");
+                close_tls_session(ta_session, session_id)?;
+                break;
+            }
+            Ok(n) => {
+                println!("read bytes: {}", n);
+                do_tls_read(ta_session, session_id, &mut buf[..n])?
+            }
+        }
+
+        let n = do_tls_write(ta_session, session_id, &mut buf)?;
+        println!("stream write n: {}", n);
+        let res = stream.write_all(&buf[..n]);
+        if res.is_err() {
+            println!("close session");
+            close_tls_session(ta_session, session_id)?;
+            break;
+        }
+    }
+
+    Ok(())
+}
diff --git a/examples/tls_server-rs/proto/Cargo.toml b/examples/tls_server-rs/proto/Cargo.toml
new file mode 100644
index 0000000..a12d1c0
--- /dev/null
+++ b/examples/tls_server-rs/proto/Cargo.toml
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+[package]
+name = "proto"
+version = "0.2.0"
+authors = ["Teaclave Contributors <dev@teaclave.apache.org>"]
+license = "Apache-2.0"
+repository = "https://github.com/apache/incubator-teaclave-trustzone-sdk.git"
+description = "Data structures and functions shared by host and TA."
+edition = "2018"
+
+[dependencies]
+
+[build_dependencies]
+uuid = { version = "0.8" }
diff --git a/examples/tls_server-rs/proto/build.rs b/examples/tls_server-rs/proto/build.rs
new file mode 100644
index 0000000..778819a
--- /dev/null
+++ b/examples/tls_server-rs/proto/build.rs
@@ -0,0 +1,34 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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 std::env;
+use std::fs;
+use std::fs::File;
+use std::io::Write;
+use std::path::PathBuf;
+
+fn main() {
+    let uuid = match fs::read_to_string("../uuid.txt") {
+        Ok(u) => u.trim().to_string(),
+        Err(_) => {
+            panic!("Cannot find uuid.txt");
+        }
+    };
+    let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
+    let mut buffer = File::create(out.join("uuid.txt")).unwrap();
+    write!(buffer, "{}", uuid).unwrap();
+}
diff --git a/examples/tls_server-rs/proto/src/lib.rs b/examples/tls_server-rs/proto/src/lib.rs
new file mode 100644
index 0000000..7f71a24
--- /dev/null
+++ b/examples/tls_server-rs/proto/src/lib.rs
@@ -0,0 +1,39 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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.
+
+pub enum Command {
+    NewTlsSession,
+    CloseTlsSession,
+    DoTlsRead,
+    DoTlsWrite,
+    Unknown,
+}
+
+impl From<u32> for Command {
+    #[inline]
+    fn from(value: u32) -> Command {
+        match value {
+            0 => Command::NewTlsSession,
+            1 => Command::CloseTlsSession,
+            2 => Command::DoTlsRead,
+            3 => Command::DoTlsWrite,
+            _ => Command::Unknown,
+        }
+    }
+}
+
+pub const UUID: &str = &include_str!(concat!(env!("OUT_DIR"), "/uuid.txt"));
diff --git a/examples/tls_server-rs/ta/Cargo.lock b/examples/tls_server-rs/ta/Cargo.lock
new file mode 100644
index 0000000..f59ac2d
--- /dev/null
+++ b/examples/tls_server-rs/ta/Cargo.lock
@@ -0,0 +1,367 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "git+https://github.com/veracruz-project/rust-base64.git?branch=veracruz#9c3208ed29f179e395986c26c9290cf5f3dc9531"
+
+[[package]]
+name = "bitflags"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
+
+[[package]]
+name = "bumpalo"
+version = "3.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899"
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "hex"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
+
+[[package]]
+name = "js-sys"
+version = "0.3.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+dependencies = [
+ "spin",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.99"
+
+[[package]]
+name = "libc"
+version = "0.2.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
+
+[[package]]
+name = "log"
+version = "0.4.8"
+source = "git+https://github.com/veracruz-project/log.git?branch=veracruz#64f2e08980af31e25edb5b699f195bb86a8990dd"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "optee-utee"
+version = "0.2.0"
+dependencies = [
+ "bitflags",
+ "hex",
+ "libc 0.2.99",
+ "optee-utee-macros",
+ "optee-utee-sys",
+ "uuid",
+]
+
+[[package]]
+name = "optee-utee-macros"
+version = "0.2.0"
+dependencies = [
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "optee-utee-sys"
+version = "0.2.0"
+dependencies = [
+ "libc 0.2.99",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa"
+dependencies = [
+ "unicode-xid 0.2.3",
+]
+
+[[package]]
+name = "proto"
+version = "0.2.0"
+dependencies = [
+ "uuid",
+]
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+dependencies = [
+ "proc-macro2 0.4.30",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1"
+dependencies = [
+ "proc-macro2 1.0.38",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.11"
+source = "git+https://github.com/veracruz-project/ring.git?branch=veracruz#47996e06f9a2cc392091392f010d62e83e9ed0f4"
+dependencies = [
+ "cc",
+ "lazy_static",
+ "libc 0.2.125",
+ "optee-utee",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustls"
+version = "0.16.0"
+source = "git+https://github.com/DemesneGH/rustls.git?branch=veracruz#dd164b3d5a53f655a8b5cd5ae8eae2b35902f763"
+dependencies = [
+ "base64",
+ "log 0.4.8",
+ "optee-utee",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "sct"
+version = "0.6.0"
+source = "git+https://github.com/veracruz-project/sct.rs.git?branch=veracruz#bb479fe436843337a062610b0a95c86cf1a0d194"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+dependencies = [
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04066589568b72ec65f42d65a1a52436e954b168773148893c020269563decf2"
+dependencies = [
+ "proc-macro2 1.0.38",
+ "quote 1.0.18",
+ "unicode-xid 0.2.3",
+]
+
+[[package]]
+name = "ta"
+version = "0.2.0"
+dependencies = [
+ "lazy_static",
+ "libc 0.2.99",
+ "optee-utee",
+ "optee-utee-sys",
+ "proto",
+ "rustls",
+ "uuid",
+ "webpki",
+ "webpki-roots",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log 0.4.17",
+ "proc-macro2 1.0.38",
+ "quote 1.0.18",
+ "syn 1.0.93",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5"
+dependencies = [
+ "quote 1.0.18",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b"
+dependencies = [
+ "proc-macro2 1.0.38",
+ "quote 1.0.18",
+ "syn 1.0.93",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744"
+
+[[package]]
+name = "web-sys"
+version = "0.3.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.21.2"
+source = "git+https://github.com/veracruz-project/webpki.git?branch=veracruz#0139cf73ee0227de7587608ad043c0f85a4d4776"
+dependencies = [
+ "optee-utee",
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.19.0"
+source = "git+https://github.com/veracruz-project/webpki-roots.git?branch=veracruz#a8023dba729f3b50841fe3d7ba87dd220b795f5e"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/examples/tls_server-rs/ta/Cargo.toml b/examples/tls_server-rs/ta/Cargo.toml
new file mode 100644
index 0000000..bd8503f
--- /dev/null
+++ b/examples/tls_server-rs/ta/Cargo.toml
@@ -0,0 +1,51 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+[package]
+name = "ta"
+version = "0.2.0"
+authors = ["Teaclave Contributors <dev@teaclave.apache.org>"]
+license = "Apache-2.0"
+repository = "https://github.com/apache/incubator-teaclave-trustzone-sdk.git"
+description = "An example of Rust OP-TEE TrustZone SDK."
+edition = "2018"
+
+[dependencies]
+libc = { path = "../../../rust/libc" }
+proto = { path = "../proto" }
+optee-utee-sys = { path = "../../../optee-utee/optee-utee-sys" }
+optee-utee = { path = "../../../optee-utee" }
+
+rustls = { git = "https://github.com/DemesneGH/rustls.git", branch = "veracruz" }
+webpki = { git = "https://github.com/veracruz-project/webpki.git", branch = "veracruz", features = ["default"] }
+webpki-roots = { git = "https://github.com/veracruz-project/webpki-roots.git", branch = "veracruz", features = ["default"] }
+lazy_static = {version = "1.4.0", features=["spin_no_std"] }
+
+[build_dependencies]
+uuid = { version = "0.8" }
+proto = { path = "../proto" }
+
+[profile.release]
+lto = true
+
+# Patch optee-utee for webpki
+[patch."https://github.com/veracruz-project/rust-optee-trustzone-sdk.git"]
+optee-utee = { path = "../../../optee-utee" }
+
+# Patch optee-utee for rustls
+[patch."https://github.com/apache/incubator-teaclave-trustzone-sdk.git"]
+optee-utee = { path = "../../../optee-utee" }
diff --git a/examples/tls_server-rs/ta/Makefile b/examples/tls_server-rs/ta/Makefile
new file mode 100644
index 0000000..ffee4b2
--- /dev/null
+++ b/examples/tls_server-rs/ta/Makefile
@@ -0,0 +1,53 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+OPTEE_DIR ?= ../../../optee
+OPTEE_OS_DIR ?= $(OPTEE_DIR)/optee_os
+UUID ?= $(shell cat "../uuid.txt")
+
+ARCH ?= aarch64
+
+ifeq ($(ARCH), arm)
+	TA_SIGN_KEY ?= $(OPTEE_OS_DIR)/out/arm/export-ta_arm32/keys/default_ta.pem
+	SIGN := $(OPTEE_OS_DIR)/out/arm/export-ta_arm32/scripts/sign_encrypt.py
+	OPTEE_BIN := $(OPTEE_DIR)/toolchains/aarch32/bin
+	OBJCOPY := $(OPTEE_BIN)/arm-linux-gnueabihf-objcopy
+	TARGET := arm-unknown-optee-trustzone
+else
+	TA_SIGN_KEY ?= $(OPTEE_OS_DIR)/out/arm/export-ta_arm64/keys/default_ta.pem
+	SIGN := $(OPTEE_OS_DIR)/out/arm/export-ta_arm64/scripts/sign_encrypt.py
+	OPTEE_BIN := $(OPTEE_DIR)/toolchains/$(ARCH)/bin
+	OBJCOPY := $(OPTEE_BIN)/aarch64-linux-gnu-objcopy
+	TARGET := aarch64-unknown-optee-trustzone
+endif
+
+OUT_DIR := $(CURDIR)/target/$(TARGET)/release
+
+all: ta strip sign
+
+ta:
+	@xargo build --target $(TARGET) --release --verbose
+
+strip:
+	@$(OBJCOPY) --strip-unneeded $(OUT_DIR)/ta $(OUT_DIR)/stripped_ta
+
+sign:
+	@$(SIGN) --uuid $(UUID) --key $(TA_SIGN_KEY) --in $(OUT_DIR)/stripped_ta --out $(OUT_DIR)/$(UUID).ta
+	@echo "SIGN =>  ${UUID}"
+
+clean:
+	@xargo clean
diff --git a/examples/tls_server-rs/ta/Xargo.toml b/examples/tls_server-rs/ta/Xargo.toml
new file mode 100644
index 0000000..c9ed04e
--- /dev/null
+++ b/examples/tls_server-rs/ta/Xargo.toml
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+[dependencies.std]
+path = "../../../rust/rust/library/std"
+
+[patch.crates-io]
+libc =  { path = "../../../rust/libc" }
+compiler_builtins =  { path = "../../../rust/compiler-builtins" }
+rustc-std-workspace-core = { path = "../../../rust/rust/library/rustc-std-workspace-core" }
+rustc-std-workspace-alloc = { path = "../../../rust/rust/library/rustc-std-workspace-alloc" }
diff --git a/examples/tls_server-rs/ta/build.rs b/examples/tls_server-rs/ta/build.rs
new file mode 100644
index 0000000..4b4d42d
--- /dev/null
+++ b/examples/tls_server-rs/ta/build.rs
@@ -0,0 +1,62 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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 proto;
+use std::env;
+use std::fs::File;
+use std::io::Write;
+use std::path::{Path, PathBuf};
+use uuid::Uuid;
+
+fn main() -> std::io::Result<()> {
+    let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
+
+    let mut buffer = File::create(out.join("user_ta_header.rs"))?;
+    buffer.write_all(include_bytes!("ta_static.rs"))?;
+
+    let tee_uuid = Uuid::parse_str(proto::UUID).unwrap();
+    let (time_low, time_mid, time_hi_and_version, clock_seq_and_node) = tee_uuid.as_fields();
+
+    write!(buffer, "\n")?;
+    write!(
+        buffer,
+        "const TA_UUID: optee_utee_sys::TEE_UUID = optee_utee_sys::TEE_UUID {{
+    timeLow: {:#x},
+    timeMid: {:#x},
+    timeHiAndVersion: {:#x},
+    clockSeqAndNode: {:#x?},
+}};",
+        time_low, time_mid, time_hi_and_version, clock_seq_and_node
+    )?;
+    let optee_os_dir = env::var("OPTEE_OS_DIR").unwrap_or("../../../optee/optee_os".to_string());
+    let search_path = match env::var("ARCH") {
+        Ok(ref v) if v == "arm" => {
+            File::create(out.join("ta.lds"))?.write_all(include_bytes!("ta_arm.lds"))?;
+            Path::new(&optee_os_dir).join("out/arm/export-ta_arm32/lib")
+        }
+        _ => {
+            File::create(out.join("ta.lds"))?.write_all(include_bytes!("ta_aarch64.lds"))?;
+            Path::new(&optee_os_dir).join("out/arm/export-ta_arm64/lib")
+        }
+    };
+    println!("cargo:rustc-link-search={}", out.display());
+    println!("cargo:rerun-if-changed=ta.lds");
+
+    println!("cargo:rustc-link-search={}", search_path.display());
+    println!("cargo:rustc-link-lib=static=utee");
+    Ok(())
+}
diff --git a/examples/tls_server-rs/ta/src/main.rs b/examples/tls_server-rs/ta/src/main.rs
new file mode 100644
index 0000000..a3957d9
--- /dev/null
+++ b/examples/tls_server-rs/ta/src/main.rs
@@ -0,0 +1,196 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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.
+
+#![no_main]
+
+use optee_utee::{
+    ta_close_session, ta_create, ta_destroy, ta_invoke_command, ta_open_session, trace_println,
+};
+use optee_utee::{Error, ErrorKind, Parameters, Result};
+use proto::Command;
+
+use lazy_static::lazy_static;
+use rustls;
+use rustls::{NoClientAuth, Session};
+use std::collections::HashMap;
+use std::io::Cursor;
+use std::io::{BufReader, Read, Write};
+use std::sync::Arc;
+use std::sync::Mutex;
+use std::sync::RwLock;
+
+lazy_static! {
+    static ref TLS_SESSIONS: RwLock<HashMap<u32, Mutex<rustls::ServerSession>>> =
+        RwLock::new(HashMap::new());
+}
+
+#[ta_create]
+fn create() -> Result<()> {
+    trace_println!("[+] TA create");
+    Ok(())
+}
+
+#[ta_open_session]
+fn open_session(_params: &mut Parameters) -> Result<()> {
+    trace_println!("[+] TA open session");
+    Ok(())
+}
+
+#[ta_close_session]
+fn close_session() {
+    trace_println!("[+] TA close session");
+}
+
+#[ta_destroy]
+fn destroy() {
+    trace_println!("[+] TA destroy");
+}
+
+#[ta_invoke_command]
+fn invoke_command(cmd_id: u32, params: &mut Parameters) -> Result<()> {
+    trace_println!("[+] TA invoke command");
+    let session_id = unsafe { params.0.as_value().unwrap().a() };
+    trace_println!("[+] session id: {}", session_id);
+    match Command::from(cmd_id) {
+        Command::NewTlsSession => {
+            trace_println!("[+] new_tls_session");
+            new_tls_session(session_id);
+            Ok(())
+        }
+        Command::DoTlsRead => {
+            let mut p1 = unsafe { params.1.as_memref().unwrap() };
+            let buffer = p1.buffer();
+            trace_println!("[+] do_tls_read");
+            do_tls_read(session_id, buffer);
+            Ok(())
+        }
+        Command::DoTlsWrite => {
+            trace_println!("[+] do_tls_write");
+            let mut p1 = unsafe { params.1.as_memref().unwrap() };
+            let mut p2 = unsafe { params.2.as_value().unwrap() };
+            let mut buffer = p1.buffer();
+            let n = do_tls_write(session_id, &mut buffer);
+            p2.set_a(n as u32);
+            Ok(())
+        }
+        Command::CloseTlsSession => {
+            trace_println!("[+] close_tls_session");
+            close_tls_session(session_id);
+            Ok(())
+        }
+        _ => Err(Error::new(ErrorKind::BadParameters)),
+    }
+}
+
+pub fn new_tls_session(session_id: u32) {
+    let tls_config = make_config();
+    let tls_session = rustls::ServerSession::new(&tls_config);
+    TLS_SESSIONS
+        .write()
+        .unwrap()
+        .insert(session_id, Mutex::new(tls_session));
+}
+
+pub fn close_tls_session(session_id: u32) {
+    TLS_SESSIONS.write().unwrap().remove(&session_id);
+}
+
+pub fn do_tls_read(session_id: u32, buf: &[u8]) {
+    let mut rd = Cursor::new(buf);
+    let ts_guard = TLS_SESSIONS.read().unwrap();
+    let mut tls_session = ts_guard.get(&session_id).unwrap().lock().unwrap();
+    let _rc = tls_session.read_tls(&mut rd).unwrap();
+    let _processed = tls_session.process_new_packets().unwrap();
+
+    // Read and process all available plaintext.
+    let mut buf = Vec::new();
+    let _rc = tls_session.read_to_end(&mut buf);
+    if !buf.is_empty() {
+        tls_session.write_all(&buf).unwrap();
+    }
+}
+
+pub fn do_tls_write(session_id: u32, buf: &mut [u8]) -> usize {
+    let ts_guard = TLS_SESSIONS.read().unwrap();
+    let mut tls_session = ts_guard.get(&session_id).unwrap().lock().unwrap();
+    let mut wr = Cursor::new(buf);
+    let mut rc = 0;
+    while tls_session.wants_write() {
+        rc += tls_session.write_tls(&mut wr).unwrap();
+    }
+
+    rc
+}
+
+fn make_config() -> Arc<rustls::ServerConfig> {
+    let client_auth = NoClientAuth::new();
+    let mut tls_config = rustls::ServerConfig::new(client_auth);
+    let certs = load_certs();
+    let privkey = load_private_key();
+    tls_config
+        .set_single_cert(certs, privkey)
+        .expect("bad certificates/private key");
+
+    Arc::new(tls_config)
+}
+
+fn load_certs() -> Vec<rustls::Certificate> {
+    let bytes = include_bytes!("../test-ca/ecdsa/end.fullchain").to_vec();
+    let cursor = std::io::Cursor::new(bytes);
+    let mut reader = BufReader::new(cursor);
+    rustls::internal::pemfile::certs(&mut reader).unwrap()
+}
+
+fn load_private_key() -> rustls::PrivateKey {
+    let bytes = include_bytes!("../test-ca/ecdsa/end.key").to_vec();
+
+    let rsa_keys = {
+        let cursor = std::io::Cursor::new(bytes.clone());
+        let mut reader = BufReader::new(cursor);
+        rustls::internal::pemfile::rsa_private_keys(&mut reader)
+            .expect("file contains invalid rsa private key")
+    };
+
+    let pkcs8_keys = {
+        let cursor = std::io::Cursor::new(bytes);
+        let mut reader = BufReader::new(cursor);
+        rustls::internal::pemfile::pkcs8_private_keys(&mut reader)
+            .expect("file contains invalid pkcs8 private key (encrypted keys not supported)")
+    };
+
+    // prefer to load pkcs8 keys
+    if !pkcs8_keys.is_empty() {
+        pkcs8_keys[0].clone()
+    } else {
+        assert!(!rsa_keys.is_empty());
+        rsa_keys[0].clone()
+    }
+}
+
+// TA configurations
+const TA_FLAGS: u32 = 0;
+const TA_DATA_SIZE: u32 = 18 * 1024 * 1024;
+const TA_STACK_SIZE: u32 = 2 * 1024 * 1024;
+const TA_VERSION: &[u8] = b"0.2\0";
+const TA_DESCRIPTION: &[u8] = b"This is a tls server example.\0";
+const EXT_PROP_VALUE_1: &[u8] = b"TLS Server TA\0";
+const EXT_PROP_VALUE_2: u32 = 0x0010;
+const TRACE_LEVEL: i32 = 4;
+const TRACE_EXT_PREFIX: &[u8] = b"TA\0";
+const TA_FRAMEWORK_STACK_SIZE: u32 = 2048;
+
+include!(concat!(env!("OUT_DIR"), "/user_ta_header.rs"));
diff --git a/examples/tls_server-rs/ta/ta_aarch64.lds b/examples/tls_server-rs/ta/ta_aarch64.lds
new file mode 100644
index 0000000..adb7603
--- /dev/null
+++ b/examples/tls_server-rs/ta/ta_aarch64.lds
@@ -0,0 +1,92 @@
+OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", "elf64-littleaarch64")
+OUTPUT_ARCH(aarch64)
+
+PHDRS {
+	/*
+	 * Exec and rodata headers are hard coded to RX and RO
+	 * respectively. This is needed because the binary is relocatable
+	 * and the linker would automatically make any header writeable
+	 * that need to be updated during relocation.
+	 */
+	exec PT_LOAD FLAGS (5);		/* RX */
+	rodata PT_LOAD FLAGS (4);	/* RO */
+	rwdata PT_LOAD;
+	dyn PT_DYNAMIC;
+}
+
+SECTIONS {
+	.ta_head : {*(.ta_head)} :exec
+	.text : {
+		__text_start = .;
+		*(.text .text.*)
+		*(.stub)
+		*(.glue_7)
+		*(.glue_7t)
+		*(.gnu.linkonce.t.*)
+		/* Workaround for an erratum in ARM's VFP11 coprocessor */
+		*(.vfp11_veneer)
+		PROVIDE(__gnu_mcount_nc = __utee_mcount);
+		__text_end = .;
+	}
+        .plt : { *(.plt) }
+
+	.eh_frame : { *(.eh_frame) } :rodata
+	.rodata : {
+		*(.gnu.linkonce.r.*)
+		*(.rodata .rodata.*)
+	}
+	/* .ARM.exidx is sorted, so has to go in its own output section.  */
+	.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+        .ctors : { *(.ctors) }
+        .dtors : { *(.dtors) }
+	.rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+	.rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+	.rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+	.rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+	.rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+	.rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+	.rel.dyn : { *(.rel.dyn) }
+	.rel.got : { *(.rel.got) }
+	.rela.got : { *(.rela.got) }
+	.rel.ctors : { *(.rel.ctors) }
+	.rela.ctors : { *(.rela.ctors) }
+	.rel.dtors : { *(.rel.dtors) }
+	.rela.dtors : { *(.rela.dtors) }
+	.rel.init : { *(.rel.init) }
+	.rela.init : { *(.rela.init) }
+	.rel.fini : { *(.rel.fini) }
+	.rela.fini : { *(.rela.fini) }
+	.rel.bss : { *(.rel.bss) }
+	.rela.bss : { *(.rela.bss) }
+	.rel.plt : { *(.rel.plt) }
+	.rela.plt : { *(.rela.plt) }
+	.dynamic : { *(.dynamic) } :dyn :rodata
+	.dynsym : { *(.dynsym) } :rodata
+	.dynstr : { *(.dynstr) }
+	.hash : { *(.hash) }
+
+	/* Page align to allow dropping execute bit for RW data */
+	. = ALIGN(4096);
+
+	.data : { *(.data .data.* .gnu.linkonce.d.*) } :rwdata
+	.got : { *(.got.plt) *(.got) }
+	.bss : {
+		*(.bss .bss.* .gnu.linkonce.b.* COMMON)
+
+		/*
+		 * TA profiling with gprof
+		 * Reserve some space for the profiling buffer, only if the
+		 * TA is instrumented (i.e., some files were built with -pg).
+		 * Note that PROVIDE() above defines a symbol only if it is
+		 * referenced in the object files.
+		 * This also provides a way to detect at runtime if the TA is
+		 * instrumented or not.
+		 */
+		. = ALIGN(8);
+		__gprof_buf_start = .;
+		__gprof_buf_end = .;
+	}
+
+	/DISCARD/ : { *(.interp) }
+}
+
diff --git a/examples/tls_server-rs/ta/ta_arm.lds b/examples/tls_server-rs/ta/ta_arm.lds
new file mode 100644
index 0000000..e9601b5
--- /dev/null
+++ b/examples/tls_server-rs/ta/ta_arm.lds
@@ -0,0 +1,91 @@
+OUTPUT_FORMAT("elf32-littlearm")
+OUTPUT_ARCH(arm)
+
+PHDRS {
+	/*
+	 * Exec and rodata headers are hard coded to RX and RO
+	 * respectively. This is needed because the binary is relocatable
+	 * and the linker would automatically make any header writeable
+	 * that need to be updated during relocation.
+	 */
+	exec PT_LOAD FLAGS (5);		/* RX */
+	rodata PT_LOAD FLAGS (4);	/* RO */
+	rwdata PT_LOAD;
+	dyn PT_DYNAMIC;
+}
+
+SECTIONS {
+	.ta_head : {*(.ta_head)} :exec
+	.text : {
+		__text_start = .;
+		*(.text .text.*)
+		*(.stub)
+		*(.glue_7)
+		*(.glue_7t)
+		*(.gnu.linkonce.t.*)
+		/* Workaround for an erratum in ARM's VFP11 coprocessor */
+		*(.vfp11_veneer)
+		PROVIDE(__gnu_mcount_nc = __utee_mcount);
+		__text_end = .;
+	}
+        .plt : { *(.plt) }
+
+	.eh_frame : { *(.eh_frame) } :rodata
+	.rodata : {
+		*(.gnu.linkonce.r.*)
+		*(.rodata .rodata.*)
+	}
+	/* .ARM.exidx is sorted, so has to go in its own output section.  */
+	.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+        .ctors : { *(.ctors) }
+        .dtors : { *(.dtors) }
+	.got : { *(.got.plt) *(.got) }
+	.rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+	.rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+	.rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+	.rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+	.rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+	.rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+	.rel.dyn : { *(.rel.dyn) }
+	.rel.got : { *(.rel.got) }
+	.rela.got : { *(.rela.got) }
+	.rel.ctors : { *(.rel.ctors) }
+	.rela.ctors : { *(.rela.ctors) }
+	.rel.dtors : { *(.rel.dtors) }
+	.rela.dtors : { *(.rela.dtors) }
+	.rel.init : { *(.rel.init) }
+	.rela.init : { *(.rela.init) }
+	.rel.fini : { *(.rel.fini) }
+	.rela.fini : { *(.rela.fini) }
+	.rel.bss : { *(.rel.bss) }
+	.rela.bss : { *(.rela.bss) }
+	.rel.plt : { *(.rel.plt) }
+	.rela.plt : { *(.rela.plt) }
+	.dynamic : { *(.dynamic) } :dyn :rodata
+	.dynsym : { *(.dynsym) } :rodata
+	.dynstr : { *(.dynstr) }
+	.hash : { *(.hash) }
+
+	/* Page align to allow dropping execute bit for RW data */
+	. = ALIGN(4096);
+
+	.data : { *(.data .data.* .gnu.linkonce.d.*) } :rwdata
+	.bss : {
+		*(.bss .bss.* .gnu.linkonce.b.* COMMON)
+
+		/*
+		 * TA profiling with gprof
+		 * Reserve some space for the profiling buffer, only if the
+		 * TA is instrumented (i.e., some files were built with -pg).
+		 * Note that PROVIDE() above defines a symbol only if it is
+		 * referenced in the object files.
+		 * This also provides a way to detect at runtime if the TA is
+		 * instrumented or not.
+		 */
+		. = ALIGN(8);
+		__gprof_buf_start = .;
+		__gprof_buf_end = .;
+	}
+
+	/DISCARD/ : { *(.interp) }
+}
diff --git a/examples/tls_server-rs/ta/ta_static.rs b/examples/tls_server-rs/ta/ta_static.rs
new file mode 100644
index 0000000..b31f8c3
--- /dev/null
+++ b/examples/tls_server-rs/ta/ta_static.rs
@@ -0,0 +1,98 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you 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
+//
+//   http://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.
+
+#[no_mangle]
+pub static mut trace_level: libc::c_int = TRACE_LEVEL;
+
+#[no_mangle]
+pub static trace_ext_prefix: &[u8] = TRACE_EXT_PREFIX;
+
+#[no_mangle]
+#[link_section = ".ta_head"]
+pub static ta_head: optee_utee_sys::ta_head = optee_utee_sys::ta_head {
+    uuid: TA_UUID,
+    stack_size: TA_STACK_SIZE + TA_FRAMEWORK_STACK_SIZE,
+    flags: TA_FLAGS,
+    depr_entry: std::u64::MAX,
+};
+
+#[no_mangle]
+#[link_section = ".bss"]
+pub static ta_heap: [u8; TA_DATA_SIZE as usize] = [0; TA_DATA_SIZE as usize];
+
+#[no_mangle]
+pub static ta_heap_size: libc::size_t = std::mem::size_of::<u8>() * TA_DATA_SIZE as usize;
+static FLAG_BOOL: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_SINGLE_INSTANCE) != 0;
+static FLAG_MULTI: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_MULTI_SESSION) != 0;
+static FLAG_INSTANCE: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_INSTANCE_KEEP_ALIVE) != 0;
+
+#[no_mangle]
+pub static ta_num_props: libc::size_t = 9;
+
+#[no_mangle]
+pub static ta_props: [optee_utee_sys::user_ta_property; 9] = [
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_SINGLE_INSTANCE,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
+        value: &FLAG_BOOL as *const bool as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_MULTI_SESSION,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
+        value: &FLAG_MULTI as *const bool as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_KEEP_ALIVE,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
+        value: &FLAG_INSTANCE as *const bool as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_DATA_SIZE,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
+        value: &TA_DATA_SIZE as *const u32 as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_STACK_SIZE,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
+        value: &TA_STACK_SIZE as *const u32 as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_VERSION,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
+        value: TA_VERSION as *const [u8] as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: optee_utee_sys::TA_PROP_STR_DESCRIPTION,
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
+        value: TA_DESCRIPTION as *const [u8] as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: "gp.ta.description\0".as_ptr(),
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
+        value: EXT_PROP_VALUE_1 as *const [u8] as *mut _,
+    },
+    optee_utee_sys::user_ta_property {
+        name: "gp.ta.version\0".as_ptr(),
+        prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
+        value: &EXT_PROP_VALUE_2 as *const u32 as *mut _,
+    },
+];
+
+#[no_mangle]
+pub unsafe extern "C" fn tahead_get_trace_level() -> libc::c_int {
+    return trace_level;
+}
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/ca.cert b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.cert
new file mode 100644
index 0000000..4b076bd
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.cert
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIByjCCAVCgAwIBAgIUSA11/39PY7uM9Nc2ITnV1eHzaKYwCgYIKoZIzj0EAwIw
+HDEaMBgGA1UEAwwRcG9ueXRvd24gRUNEU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcN
+MjkwNjA2MTcxNTEyWjAcMRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQTB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABLsXWEKs2xXCgW1OcC63pCPjQo0q3VnPc1J24n6m
+Xwxpg398nzR4n3iHcYA0pKgEneBstSOsXOhbNZ09DAvEr3iSc8ByWWntEbWVjY3g
+9Kt6Q6Y1sXGkaUIiP9be5lIQRaNTMFEwHQYDVR0OBBYEFKD72TTU/GXhb3/D1/Z7
+hD/ZG6lKMB8GA1UdIwQYMBaAFKD72TTU/GXhb3/D1/Z7hD/ZG6lKMA8GA1UdEwEB
+/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAL9FtbNV7i9trxukhakfTvbXCHgE
+2pIOT5r/Vc5kSrPU4vJu2MOJz6X/JCX15IbZlQIwJxYfsD8QTQf8J9bP9Pq4SY71
+obja/vQ6UBixlRB5vDSG0UuukL4kzlyUKpHkwUcj
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/ca.der b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.der
new file mode 100644
index 0000000..575c9c0
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.der
Binary files differ
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/ca.key b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.key
new file mode 100644
index 0000000..afeb1af
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/ca.key
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDDl30Srs7laSdaAOzoB
+kCiehcf1HXv7NqGQBECqshrtHxGEX6bAnBB7JgyDs28NvPGhZANiAAS7F1hCrNsV
+woFtTnAut6Qj40KNKt1Zz3NSduJ+pl8MaYN/fJ80eJ94h3GANKSoBJ3gbLUjrFzo
+WzWdPQwLxK94knPAcllp7RG1lY2N4PSrekOmNbFxpGlCIj/W3uZSEEU=
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/client.cert b/examples/tls_server-rs/ta/test-ca/ecdsa/client.cert
new file mode 100644
index 0000000..f40f1c9
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/client.cert
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAZegAwIBAgICAxUwCgYIKoZIzj0EAwIwLjEsMCoGA1UEAwwjcG9ueXRv
+d24gRUNEU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwHhcNMTkwNjA5MTcxNTEyWhcN
+MjQxMTI5MTcxNTEyWjAaMRgwFgYDVQQDDA9wb255dG93biBjbGllbnQwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATx0R97foSC0Ra9a13pJzfI1hh3G6476MIMslLHxg5w
+wCG8k5mMHia2hGOBbdGjoY0C1wJLNrUSov5SfcsYX6/VjHQH/elmb/KOO1AGwPD7
+1yD1+DG/cjK1okLZIVhbSQyjgZswgZgwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMC
+BsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFFBkko+0OE2piFRx
+h9m2UonFYQFEMEQGA1UdIwQ9MDuAFD93gjUQ7CX28Dy5NlFYfYh8XlKSoSCkHjAc
+MRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQYIBezAKBggqhkjOPQQDAgNJADBG
+AiEAvyquOUQlqAWkSlfwH3nYNmmEG9CT/jjzNs1OBr1RD6ACIQDtmqdbttqgqKAZ
+Wi5lCzftwM6Hy5aA0qy1v80H4xBJyw==
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/client.chain b/examples/tls_server-rs/ta/test-ca/ecdsa/client.chain
new file mode 100644
index 0000000..c1fe549
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/client.chain
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAT2gAwIBAgIBezAKBggqhkjOPQQDAjAcMRowGAYDVQQDDBFwb255dG93
+biBFQ0RTQSBDQTAeFw0xOTA2MDkxNzE1MTJaFw0yOTA2MDYxNzE1MTJaMC4xLDAq
+BgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcSsbe8rfmJ7ojfWuHImDGx
+DpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7gxiCr3aNeMFwwHQYDVR0O
+BBYEFD93gjUQ7CX28Dy5NlFYfYh8XlKSMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jAKBggqhkjOPQQD
+AgNpADBmAjEAxdSnB7ryhG+y7tshwxqrFoZEWXpDLQDZGad0+Wf+7hiNoNCDDdIv
+MhYxzCDbTS/lAjEAwjsfrp4gxwoz/6fNfUvHyiA3j9jMd64tapzWy2hoqubKBEum
+EVczk9vVmsiJA5J3
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIByjCCAVCgAwIBAgIUSA11/39PY7uM9Nc2ITnV1eHzaKYwCgYIKoZIzj0EAwIw
+HDEaMBgGA1UEAwwRcG9ueXRvd24gRUNEU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcN
+MjkwNjA2MTcxNTEyWjAcMRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQTB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABLsXWEKs2xXCgW1OcC63pCPjQo0q3VnPc1J24n6m
+Xwxpg398nzR4n3iHcYA0pKgEneBstSOsXOhbNZ09DAvEr3iSc8ByWWntEbWVjY3g
+9Kt6Q6Y1sXGkaUIiP9be5lIQRaNTMFEwHQYDVR0OBBYEFKD72TTU/GXhb3/D1/Z7
+hD/ZG6lKMB8GA1UdIwQYMBaAFKD72TTU/GXhb3/D1/Z7hD/ZG6lKMA8GA1UdEwEB
+/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAL9FtbNV7i9trxukhakfTvbXCHgE
+2pIOT5r/Vc5kSrPU4vJu2MOJz6X/JCX15IbZlQIwJxYfsD8QTQf8J9bP9Pq4SY71
+obja/vQ6UBixlRB5vDSG0UuukL4kzlyUKpHkwUcj
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/client.fullchain b/examples/tls_server-rs/ta/test-ca/ecdsa/client.fullchain
new file mode 100644
index 0000000..8f9c2b4
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/client.fullchain
@@ -0,0 +1,37 @@
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAZegAwIBAgICAxUwCgYIKoZIzj0EAwIwLjEsMCoGA1UEAwwjcG9ueXRv
+d24gRUNEU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwHhcNMTkwNjA5MTcxNTEyWhcN
+MjQxMTI5MTcxNTEyWjAaMRgwFgYDVQQDDA9wb255dG93biBjbGllbnQwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATx0R97foSC0Ra9a13pJzfI1hh3G6476MIMslLHxg5w
+wCG8k5mMHia2hGOBbdGjoY0C1wJLNrUSov5SfcsYX6/VjHQH/elmb/KOO1AGwPD7
+1yD1+DG/cjK1okLZIVhbSQyjgZswgZgwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMC
+BsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFFBkko+0OE2piFRx
+h9m2UonFYQFEMEQGA1UdIwQ9MDuAFD93gjUQ7CX28Dy5NlFYfYh8XlKSoSCkHjAc
+MRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQYIBezAKBggqhkjOPQQDAgNJADBG
+AiEAvyquOUQlqAWkSlfwH3nYNmmEG9CT/jjzNs1OBr1RD6ACIQDtmqdbttqgqKAZ
+Wi5lCzftwM6Hy5aA0qy1v80H4xBJyw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAT2gAwIBAgIBezAKBggqhkjOPQQDAjAcMRowGAYDVQQDDBFwb255dG93
+biBFQ0RTQSBDQTAeFw0xOTA2MDkxNzE1MTJaFw0yOTA2MDYxNzE1MTJaMC4xLDAq
+BgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcSsbe8rfmJ7ojfWuHImDGx
+DpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7gxiCr3aNeMFwwHQYDVR0O
+BBYEFD93gjUQ7CX28Dy5NlFYfYh8XlKSMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jAKBggqhkjOPQQD
+AgNpADBmAjEAxdSnB7ryhG+y7tshwxqrFoZEWXpDLQDZGad0+Wf+7hiNoNCDDdIv
+MhYxzCDbTS/lAjEAwjsfrp4gxwoz/6fNfUvHyiA3j9jMd64tapzWy2hoqubKBEum
+EVczk9vVmsiJA5J3
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIByjCCAVCgAwIBAgIUSA11/39PY7uM9Nc2ITnV1eHzaKYwCgYIKoZIzj0EAwIw
+HDEaMBgGA1UEAwwRcG9ueXRvd24gRUNEU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcN
+MjkwNjA2MTcxNTEyWjAcMRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQTB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABLsXWEKs2xXCgW1OcC63pCPjQo0q3VnPc1J24n6m
+Xwxpg398nzR4n3iHcYA0pKgEneBstSOsXOhbNZ09DAvEr3iSc8ByWWntEbWVjY3g
+9Kt6Q6Y1sXGkaUIiP9be5lIQRaNTMFEwHQYDVR0OBBYEFKD72TTU/GXhb3/D1/Z7
+hD/ZG6lKMB8GA1UdIwQYMBaAFKD72TTU/GXhb3/D1/Z7hD/ZG6lKMA8GA1UdEwEB
+/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAL9FtbNV7i9trxukhakfTvbXCHgE
+2pIOT5r/Vc5kSrPU4vJu2MOJz6X/JCX15IbZlQIwJxYfsD8QTQf8J9bP9Pq4SY71
+obja/vQ6UBixlRB5vDSG0UuukL4kzlyUKpHkwUcj
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/client.key b/examples/tls_server-rs/ta/test-ca/ecdsa/client.key
new file mode 100644
index 0000000..412914c
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/client.key
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDALKtA1q+8ZBeLi2Gsq
+UxFTBxNPPhOuyNRkvwRKis/glf9GgEHgvM0qVaxWnRsdCE6hZANiAATx0R97foSC
+0Ra9a13pJzfI1hh3G6476MIMslLHxg5wwCG8k5mMHia2hGOBbdGjoY0C1wJLNrUS
+ov5SfcsYX6/VjHQH/elmb/KOO1AGwPD71yD1+DG/cjK1okLZIVhbSQw=
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/client.req b/examples/tls_server-rs/ta/test-ca/ecdsa/client.req
new file mode 100644
index 0000000..850b32a
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/client.req
@@ -0,0 +1,8 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIBEzCBmQIBADAaMRgwFgYDVQQDDA9wb255dG93biBjbGllbnQwdjAQBgcqhkjO
+PQIBBgUrgQQAIgNiAATx0R97foSC0Ra9a13pJzfI1hh3G6476MIMslLHxg5wwCG8
+k5mMHia2hGOBbdGjoY0C1wJLNrUSov5SfcsYX6/VjHQH/elmb/KOO1AGwPD71yD1
++DG/cjK1okLZIVhbSQygADAKBggqhkjOPQQDAgNpADBmAjEA8p3W7yFCJ73dOmYQ
+rpMpLkYNcfxxpNfCWgqaPyWu3UeOcHvC7ihklnFTWzpmEO+PAjEA8O5P4mXlYUtl
+Dsw8qOrqWSdQ1IykXhM4NxPOkt0TMQZvvrpSsJU6PhwSbJGjVfBR
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/end.cert b/examples/tls_server-rs/ta/test-ca/ecdsa/end.cert
new file mode 100644
index 0000000..7391b34
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/end.cert
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB9zCCAZ6gAwIBAgICAcgwCgYIKoZIzj0EAwIwLjEsMCoGA1UEAwwjcG9ueXRv
+d24gRUNEU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwHhcNMTkwNjA5MTcxNTEyWhcN
+MjQxMTI5MTcxNTEyWjAZMRcwFQYDVQQDDA50ZXN0c2VydmVyLmNvbTBZMBMGByqG
+SM49AgEGCCqGSM49AwEHA0IABPprdHsWc3TtNne2409qO+fC9OFiiXFevQwJjUUC
+J/X0ihomRsHAnrJvcNyOEWsdu7OwOj4PD9QFMifDEHGYtHOjgcAwgb0wDAYDVR0T
+AQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFOXZcb/0+/Xql1fOb4pVblzV
+vUcZMEQGA1UdIwQ9MDuAFD93gjUQ7CX28Dy5NlFYfYh8XlKSoSCkHjAcMRowGAYD
+VQQDDBFwb255dG93biBFQ0RTQSBDQYIBezA7BgNVHREENDAygg50ZXN0c2VydmVy
+LmNvbYIVc2Vjb25kLnRlc3RzZXJ2ZXIuY29tgglsb2NhbGhvc3QwCgYIKoZIzj0E
+AwIDRwAwRAIgXONA4IOh4PbHTuK6oaHtguOIvmxxXCqp8kwJlI1e+MMCICOSrk1F
+e+VsbKeFQlJ6EM65CLTezDUIZKCmoNWvyTGy
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/end.chain b/examples/tls_server-rs/ta/test-ca/ecdsa/end.chain
new file mode 100644
index 0000000..c1fe549
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/end.chain
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAT2gAwIBAgIBezAKBggqhkjOPQQDAjAcMRowGAYDVQQDDBFwb255dG93
+biBFQ0RTQSBDQTAeFw0xOTA2MDkxNzE1MTJaFw0yOTA2MDYxNzE1MTJaMC4xLDAq
+BgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcSsbe8rfmJ7ojfWuHImDGx
+DpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7gxiCr3aNeMFwwHQYDVR0O
+BBYEFD93gjUQ7CX28Dy5NlFYfYh8XlKSMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jAKBggqhkjOPQQD
+AgNpADBmAjEAxdSnB7ryhG+y7tshwxqrFoZEWXpDLQDZGad0+Wf+7hiNoNCDDdIv
+MhYxzCDbTS/lAjEAwjsfrp4gxwoz/6fNfUvHyiA3j9jMd64tapzWy2hoqubKBEum
+EVczk9vVmsiJA5J3
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIByjCCAVCgAwIBAgIUSA11/39PY7uM9Nc2ITnV1eHzaKYwCgYIKoZIzj0EAwIw
+HDEaMBgGA1UEAwwRcG9ueXRvd24gRUNEU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcN
+MjkwNjA2MTcxNTEyWjAcMRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQTB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABLsXWEKs2xXCgW1OcC63pCPjQo0q3VnPc1J24n6m
+Xwxpg398nzR4n3iHcYA0pKgEneBstSOsXOhbNZ09DAvEr3iSc8ByWWntEbWVjY3g
+9Kt6Q6Y1sXGkaUIiP9be5lIQRaNTMFEwHQYDVR0OBBYEFKD72TTU/GXhb3/D1/Z7
+hD/ZG6lKMB8GA1UdIwQYMBaAFKD72TTU/GXhb3/D1/Z7hD/ZG6lKMA8GA1UdEwEB
+/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAL9FtbNV7i9trxukhakfTvbXCHgE
+2pIOT5r/Vc5kSrPU4vJu2MOJz6X/JCX15IbZlQIwJxYfsD8QTQf8J9bP9Pq4SY71
+obja/vQ6UBixlRB5vDSG0UuukL4kzlyUKpHkwUcj
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/end.fullchain b/examples/tls_server-rs/ta/test-ca/ecdsa/end.fullchain
new file mode 100644
index 0000000..535baef
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/end.fullchain
@@ -0,0 +1,37 @@
+-----BEGIN CERTIFICATE-----
+MIIB9zCCAZ6gAwIBAgICAcgwCgYIKoZIzj0EAwIwLjEsMCoGA1UEAwwjcG9ueXRv
+d24gRUNEU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwHhcNMTkwNjA5MTcxNTEyWhcN
+MjQxMTI5MTcxNTEyWjAZMRcwFQYDVQQDDA50ZXN0c2VydmVyLmNvbTBZMBMGByqG
+SM49AgEGCCqGSM49AwEHA0IABPprdHsWc3TtNne2409qO+fC9OFiiXFevQwJjUUC
+J/X0ihomRsHAnrJvcNyOEWsdu7OwOj4PD9QFMifDEHGYtHOjgcAwgb0wDAYDVR0T
+AQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFOXZcb/0+/Xql1fOb4pVblzV
+vUcZMEQGA1UdIwQ9MDuAFD93gjUQ7CX28Dy5NlFYfYh8XlKSoSCkHjAcMRowGAYD
+VQQDDBFwb255dG93biBFQ0RTQSBDQYIBezA7BgNVHREENDAygg50ZXN0c2VydmVy
+LmNvbYIVc2Vjb25kLnRlc3RzZXJ2ZXIuY29tgglsb2NhbGhvc3QwCgYIKoZIzj0E
+AwIDRwAwRAIgXONA4IOh4PbHTuK6oaHtguOIvmxxXCqp8kwJlI1e+MMCICOSrk1F
+e+VsbKeFQlJ6EM65CLTezDUIZKCmoNWvyTGy
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAT2gAwIBAgIBezAKBggqhkjOPQQDAjAcMRowGAYDVQQDDBFwb255dG93
+biBFQ0RTQSBDQTAeFw0xOTA2MDkxNzE1MTJaFw0yOTA2MDYxNzE1MTJaMC4xLDAq
+BgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcSsbe8rfmJ7ojfWuHImDGx
+DpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7gxiCr3aNeMFwwHQYDVR0O
+BBYEFD93gjUQ7CX28Dy5NlFYfYh8XlKSMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jAKBggqhkjOPQQD
+AgNpADBmAjEAxdSnB7ryhG+y7tshwxqrFoZEWXpDLQDZGad0+Wf+7hiNoNCDDdIv
+MhYxzCDbTS/lAjEAwjsfrp4gxwoz/6fNfUvHyiA3j9jMd64tapzWy2hoqubKBEum
+EVczk9vVmsiJA5J3
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIByjCCAVCgAwIBAgIUSA11/39PY7uM9Nc2ITnV1eHzaKYwCgYIKoZIzj0EAwIw
+HDEaMBgGA1UEAwwRcG9ueXRvd24gRUNEU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcN
+MjkwNjA2MTcxNTEyWjAcMRowGAYDVQQDDBFwb255dG93biBFQ0RTQSBDQTB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABLsXWEKs2xXCgW1OcC63pCPjQo0q3VnPc1J24n6m
+Xwxpg398nzR4n3iHcYA0pKgEneBstSOsXOhbNZ09DAvEr3iSc8ByWWntEbWVjY3g
+9Kt6Q6Y1sXGkaUIiP9be5lIQRaNTMFEwHQYDVR0OBBYEFKD72TTU/GXhb3/D1/Z7
+hD/ZG6lKMB8GA1UdIwQYMBaAFKD72TTU/GXhb3/D1/Z7hD/ZG6lKMA8GA1UdEwEB
+/wQFMAMBAf8wCgYIKoZIzj0EAwIDaAAwZQIxAL9FtbNV7i9trxukhakfTvbXCHgE
+2pIOT5r/Vc5kSrPU4vJu2MOJz6X/JCX15IbZlQIwJxYfsD8QTQf8J9bP9Pq4SY71
+obja/vQ6UBixlRB5vDSG0UuukL4kzlyUKpHkwUcj
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/end.key b/examples/tls_server-rs/ta/test-ca/ecdsa/end.key
new file mode 100644
index 0000000..a88818c
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/end.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdoMBbIGRw+L9but3
+PO4WSJfS8wbvUNrF1VuQjsDVMKmhRANCAAT6a3R7FnN07TZ3tuNPajvnwvThYolx
+Xr0MCY1FAif19IoaJkbBwJ6yb3DcjhFrHbuzsDo+Dw/UBTInwxBxmLRz
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/end.req b/examples/tls_server-rs/ta/test-ca/ecdsa/end.req
new file mode 100644
index 0000000..ee7c2a0
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/end.req
@@ -0,0 +1,7 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIHTMHsCAQAwGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wWTATBgcqhkjOPQIB
+BggqhkjOPQMBBwNCAAT6a3R7FnN07TZ3tuNPajvnwvThYolxXr0MCY1FAif19Ioa
+JkbBwJ6yb3DcjhFrHbuzsDo+Dw/UBTInwxBxmLRzoAAwCgYIKoZIzj0EAwIDSAAw
+RQIgA9G3IaH4syAQYGJ3ESqXQaoKSrZsDMBD0MgG2g2FC78CIQD+RRTETPkFq0as
+cca9W/yqg8QN/ZGzE38iEpohyGda/w==
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/inter.cert b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.cert
new file mode 100644
index 0000000..f3843b4
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.cert
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAT2gAwIBAgIBezAKBggqhkjOPQQDAjAcMRowGAYDVQQDDBFwb255dG93
+biBFQ0RTQSBDQTAeFw0xOTA2MDkxNzE1MTJaFw0yOTA2MDYxNzE1MTJaMC4xLDAq
+BgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcSsbe8rfmJ7ojfWuHImDGx
+DpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7gxiCr3aNeMFwwHQYDVR0O
+BBYEFD93gjUQ7CX28Dy5NlFYfYh8XlKSMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jAKBggqhkjOPQQD
+AgNpADBmAjEAxdSnB7ryhG+y7tshwxqrFoZEWXpDLQDZGad0+Wf+7hiNoNCDDdIv
+MhYxzCDbTS/lAjEAwjsfrp4gxwoz/6fNfUvHyiA3j9jMd64tapzWy2hoqubKBEum
+EVczk9vVmsiJA5J3
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/inter.key b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.key
new file mode 100644
index 0000000..f9f8b12
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdniIWGzkYuZcwh/H
+9hDbaITfndAs+Hin6j+0XjD01MShRANCAARi1GU/KSFPRgueNxKxt7yt+YnuiN9a
+4ciYMbEOkXm8nbn2CI732oURxlOLt029AYFALpuxRZ11OXcFzuDGIKvd
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/inter.req b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.req
new file mode 100644
index 0000000..d7c5ec9
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/inter.req
@@ -0,0 +1,7 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIHoMIGQAgEAMC4xLDAqBgNVBAMMI3Bvbnl0b3duIEVDRFNBIGxldmVsIDIgaW50
+ZXJtZWRpYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYtRlPykhT0YLnjcS
+sbe8rfmJ7ojfWuHImDGxDpF5vJ259giO99qFEcZTi7dNvQGBQC6bsUWddTl3Bc7g
+xiCr3aAAMAoGCCqGSM49BAMCA0cAMEQCIFeMseiKS80m8KmHkl7W8lRXavH5yx/h
+qTFM+f3T4AnZAiBRR8+rFop/TR51gISUfbMj2W3yTAGxOkCdlPgT+Jxqwg==
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/nistp256.pem b/examples/tls_server-rs/ta/test-ca/ecdsa/nistp256.pem
new file mode 100644
index 0000000..a76e47d
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/nistp256.pem
@@ -0,0 +1,3 @@
+-----BEGIN EC PARAMETERS-----
+BggqhkjOPQMBBw==
+-----END EC PARAMETERS-----
diff --git a/examples/tls_server-rs/ta/test-ca/ecdsa/nistp384.pem b/examples/tls_server-rs/ta/test-ca/ecdsa/nistp384.pem
new file mode 100644
index 0000000..ceed209
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/ecdsa/nistp384.pem
@@ -0,0 +1,3 @@
+-----BEGIN EC PARAMETERS-----
+BgUrgQQAIg==
+-----END EC PARAMETERS-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/ca.cert b/examples/tls_server-rs/ta/test-ca/eddsa/ca.cert
new file mode 100644
index 0000000..3194b79
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/ca.cert
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBTDCB/6ADAgECAhRXcvbYynz4+usVvPtJp++sBUih3TAFBgMrZXAwHDEaMBgG
+A1UEAwwRcG9ueXRvd24gRWREU0EgQ0EwHhcNMTkwODE2MTMyODUwWhcNMjkwODEz
+MTMyODUwWjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQTAqMAUGAytlcAMh
+AIE4tLweIfcBGfhPqyXFp5pjVxjaiKk+9fTbRy46jAFKo1MwUTAdBgNVHQ4EFgQU
+z5b9HjkOxffbtCZhWGg+bnxuD6wwHwYDVR0jBBgwFoAUz5b9HjkOxffbtCZhWGg+
+bnxuD6wwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBNlt7z4bZ7KhzecxZEe3i5
+lH9MRqbpP9Rg4HyzAJfTzFGT183HoJiISdPLbxwMn0KaqSGlVe+9GgNKswoaRAwH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/ca.der b/examples/tls_server-rs/ta/test-ca/eddsa/ca.der
new file mode 100644
index 0000000..9bd90e3
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/ca.der
Binary files differ
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/ca.key b/examples/tls_server-rs/ta/test-ca/eddsa/ca.key
new file mode 100644
index 0000000..ca0deb4
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/ca.key
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEIJ+e0HfxvslYFLr6ehAnsW6ZnOSu3Cume9OGJhVVLjnK
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/client.cert b/examples/tls_server-rs/ta/test-ca/eddsa/client.cert
new file mode 100644
index 0000000..b685eb0
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/client.cert
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBlDCCAUagAwIBAgICAxUwBQYDK2VwMC4xLDAqBgNVBAMMI3Bvbnl0b3duIEVk
+RFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDgxNjEzMjg1MVoXDTI1MDIw
+NTEzMjg1MVowGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MCowBQYDK2VwAyEA
+uCBt6D15TvwyMNP5/nRo9v38yGIeSGQCM1tjyzXFGHWjgZswgZgwDAYDVR0TAQH/
+BAIwADALBgNVHQ8EBAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwHQYDVR0O
+BBYEFHdQ+goYXFvGem83oCHVJ87Ak0fyMEQGA1UdIwQ9MDuAFBcSMFONOrRtwrD1
+pB1qn7lE+PGroSCkHjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQYIBezAF
+BgMrZXADQQA4GfyvVIs/xQQTv3igqhzabhraQKEd4z2HHudJgdHHV7M7yfuNqN3x
+NCr3hfDfUQuEOgm02d9Q4TZfik+czUML
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/client.chain b/examples/tls_server-rs/ta/test-ca/eddsa/client.chain
new file mode 100644
index 0000000..8ac8e68
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/client.chain
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIBVzCCAQmgAwIBAgIBezAFBgMrZXAwHDEaMBgGA1UEAwwRcG9ueXRvd24gRWRE
+U0EgQ0EwHhcNMTkwODE2MTMyODUxWhcNMjkwODEzMTMyODUxWjAuMSwwKgYDVQQD
+DCNwb255dG93biBFZERTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAqMAUGAytlcAMh
+AD4h3t0UCoMDGgIq4UW4P5zDngsY4vy1pE3wzLPFI4Vdo14wXDAdBgNVHQ4EFgQU
+FxIwU406tG3CsPWkHWqfuUT48aswIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgH+MAUGAytlcANBAAZFvMek
+Z71I8CXsBmx/0E6Weoaan9mJHgKqgQdK4w4h4dRg6DjNG957IbrLFO3vZduBMnna
+qHP3xTFF+11Eyg8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBTDCB/6ADAgECAhRXcvbYynz4+usVvPtJp++sBUih3TAFBgMrZXAwHDEaMBgG
+A1UEAwwRcG9ueXRvd24gRWREU0EgQ0EwHhcNMTkwODE2MTMyODUwWhcNMjkwODEz
+MTMyODUwWjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQTAqMAUGAytlcAMh
+AIE4tLweIfcBGfhPqyXFp5pjVxjaiKk+9fTbRy46jAFKo1MwUTAdBgNVHQ4EFgQU
+z5b9HjkOxffbtCZhWGg+bnxuD6wwHwYDVR0jBBgwFoAUz5b9HjkOxffbtCZhWGg+
+bnxuD6wwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBNlt7z4bZ7KhzecxZEe3i5
+lH9MRqbpP9Rg4HyzAJfTzFGT183HoJiISdPLbxwMn0KaqSGlVe+9GgNKswoaRAwH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/client.fullchain b/examples/tls_server-rs/ta/test-ca/eddsa/client.fullchain
new file mode 100644
index 0000000..0659d50
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/client.fullchain
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIBlDCCAUagAwIBAgICAxUwBQYDK2VwMC4xLDAqBgNVBAMMI3Bvbnl0b3duIEVk
+RFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDgxNjEzMjg1MVoXDTI1MDIw
+NTEzMjg1MVowGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MCowBQYDK2VwAyEA
+uCBt6D15TvwyMNP5/nRo9v38yGIeSGQCM1tjyzXFGHWjgZswgZgwDAYDVR0TAQH/
+BAIwADALBgNVHQ8EBAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwHQYDVR0O
+BBYEFHdQ+goYXFvGem83oCHVJ87Ak0fyMEQGA1UdIwQ9MDuAFBcSMFONOrRtwrD1
+pB1qn7lE+PGroSCkHjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQYIBezAF
+BgMrZXADQQA4GfyvVIs/xQQTv3igqhzabhraQKEd4z2HHudJgdHHV7M7yfuNqN3x
+NCr3hfDfUQuEOgm02d9Q4TZfik+czUML
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBVzCCAQmgAwIBAgIBezAFBgMrZXAwHDEaMBgGA1UEAwwRcG9ueXRvd24gRWRE
+U0EgQ0EwHhcNMTkwODE2MTMyODUxWhcNMjkwODEzMTMyODUxWjAuMSwwKgYDVQQD
+DCNwb255dG93biBFZERTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAqMAUGAytlcAMh
+AD4h3t0UCoMDGgIq4UW4P5zDngsY4vy1pE3wzLPFI4Vdo14wXDAdBgNVHQ4EFgQU
+FxIwU406tG3CsPWkHWqfuUT48aswIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgH+MAUGAytlcANBAAZFvMek
+Z71I8CXsBmx/0E6Weoaan9mJHgKqgQdK4w4h4dRg6DjNG957IbrLFO3vZduBMnna
+qHP3xTFF+11Eyg8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBTDCB/6ADAgECAhRXcvbYynz4+usVvPtJp++sBUih3TAFBgMrZXAwHDEaMBgG
+A1UEAwwRcG9ueXRvd24gRWREU0EgQ0EwHhcNMTkwODE2MTMyODUwWhcNMjkwODEz
+MTMyODUwWjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQTAqMAUGAytlcAMh
+AIE4tLweIfcBGfhPqyXFp5pjVxjaiKk+9fTbRy46jAFKo1MwUTAdBgNVHQ4EFgQU
+z5b9HjkOxffbtCZhWGg+bnxuD6wwHwYDVR0jBBgwFoAUz5b9HjkOxffbtCZhWGg+
+bnxuD6wwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBNlt7z4bZ7KhzecxZEe3i5
+lH9MRqbpP9Rg4HyzAJfTzFGT183HoJiISdPLbxwMn0KaqSGlVe+9GgNKswoaRAwH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/client.key b/examples/tls_server-rs/ta/test-ca/eddsa/client.key
new file mode 100644
index 0000000..a6f5811
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/client.key
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEILxmhRq5n4/1iik9J5wfqy6VC6pff4Lxu2wWQd2YUWy7
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/client.req b/examples/tls_server-rs/ta/test-ca/eddsa/client.req
new file mode 100644
index 0000000..4a67737
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/client.req
@@ -0,0 +1,6 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIGZME0CAQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MCowBQYDK2VwAyEA
+uCBt6D15TvwyMNP5/nRo9v38yGIeSGQCM1tjyzXFGHWgADAFBgMrZXADQQCEpbl9
+6XUAJzBV0nMKpashbf7JNAyBQYtH5IHI+fE90GEcTuRZgSg9vy6+smL+Exo/9MD9
+toz+25pltMgE2YYE
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/end.cert b/examples/tls_server-rs/ta/test-ca/eddsa/end.cert
new file mode 100644
index 0000000..8c037e5
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/end.cert
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAWqgAwIBAgICAcgwBQYDK2VwMC4xLDAqBgNVBAMMI3Bvbnl0b3duIEVk
+RFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDgxNjEzMjg1MVoXDTI1MDIw
+NTEzMjg1MVowGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wKjAFBgMrZXADIQAQ
+9M4hrE+Ucw4QUmaKOeKfphklBJi1qsqtX4u+knbseqOBwDCBvTAMBgNVHRMBAf8E
+AjAAMAsGA1UdDwQEAwIGwDAdBgNVHQ4EFgQUa/gnV4+a22BUKTouAYX6nfLnPKYw
+RAYDVR0jBD0wO4AUFxIwU406tG3CsPWkHWqfuUT48auhIKQeMBwxGjAYBgNVBAMM
+EXBvbnl0b3duIEVkRFNBIENBggF7MDsGA1UdEQQ0MDKCDnRlc3RzZXJ2ZXIuY29t
+ghVzZWNvbmQudGVzdHNlcnZlci5jb22CCWxvY2FsaG9zdDAFBgMrZXADQQApDiBQ
+ns3fuvsWuFpIS+osj2B/gQ0b6eBAZ1UBxRyDlAo5++JZ0PtaEROyGo2t2gqi2Lyz
+47mLyGCvqgVbC6cH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/end.chain b/examples/tls_server-rs/ta/test-ca/eddsa/end.chain
new file mode 100644
index 0000000..8ac8e68
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/end.chain
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIBVzCCAQmgAwIBAgIBezAFBgMrZXAwHDEaMBgGA1UEAwwRcG9ueXRvd24gRWRE
+U0EgQ0EwHhcNMTkwODE2MTMyODUxWhcNMjkwODEzMTMyODUxWjAuMSwwKgYDVQQD
+DCNwb255dG93biBFZERTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAqMAUGAytlcAMh
+AD4h3t0UCoMDGgIq4UW4P5zDngsY4vy1pE3wzLPFI4Vdo14wXDAdBgNVHQ4EFgQU
+FxIwU406tG3CsPWkHWqfuUT48aswIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgH+MAUGAytlcANBAAZFvMek
+Z71I8CXsBmx/0E6Weoaan9mJHgKqgQdK4w4h4dRg6DjNG957IbrLFO3vZduBMnna
+qHP3xTFF+11Eyg8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBTDCB/6ADAgECAhRXcvbYynz4+usVvPtJp++sBUih3TAFBgMrZXAwHDEaMBgG
+A1UEAwwRcG9ueXRvd24gRWREU0EgQ0EwHhcNMTkwODE2MTMyODUwWhcNMjkwODEz
+MTMyODUwWjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQTAqMAUGAytlcAMh
+AIE4tLweIfcBGfhPqyXFp5pjVxjaiKk+9fTbRy46jAFKo1MwUTAdBgNVHQ4EFgQU
+z5b9HjkOxffbtCZhWGg+bnxuD6wwHwYDVR0jBBgwFoAUz5b9HjkOxffbtCZhWGg+
+bnxuD6wwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBNlt7z4bZ7KhzecxZEe3i5
+lH9MRqbpP9Rg4HyzAJfTzFGT183HoJiISdPLbxwMn0KaqSGlVe+9GgNKswoaRAwH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/end.fullchain b/examples/tls_server-rs/ta/test-ca/eddsa/end.fullchain
new file mode 100644
index 0000000..b7db426
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/end.fullchain
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIBuDCCAWqgAwIBAgICAcgwBQYDK2VwMC4xLDAqBgNVBAMMI3Bvbnl0b3duIEVk
+RFNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDgxNjEzMjg1MVoXDTI1MDIw
+NTEzMjg1MVowGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wKjAFBgMrZXADIQAQ
+9M4hrE+Ucw4QUmaKOeKfphklBJi1qsqtX4u+knbseqOBwDCBvTAMBgNVHRMBAf8E
+AjAAMAsGA1UdDwQEAwIGwDAdBgNVHQ4EFgQUa/gnV4+a22BUKTouAYX6nfLnPKYw
+RAYDVR0jBD0wO4AUFxIwU406tG3CsPWkHWqfuUT48auhIKQeMBwxGjAYBgNVBAMM
+EXBvbnl0b3duIEVkRFNBIENBggF7MDsGA1UdEQQ0MDKCDnRlc3RzZXJ2ZXIuY29t
+ghVzZWNvbmQudGVzdHNlcnZlci5jb22CCWxvY2FsaG9zdDAFBgMrZXADQQApDiBQ
+ns3fuvsWuFpIS+osj2B/gQ0b6eBAZ1UBxRyDlAo5++JZ0PtaEROyGo2t2gqi2Lyz
+47mLyGCvqgVbC6cH
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBVzCCAQmgAwIBAgIBezAFBgMrZXAwHDEaMBgGA1UEAwwRcG9ueXRvd24gRWRE
+U0EgQ0EwHhcNMTkwODE2MTMyODUxWhcNMjkwODEzMTMyODUxWjAuMSwwKgYDVQQD
+DCNwb255dG93biBFZERTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAqMAUGAytlcAMh
+AD4h3t0UCoMDGgIq4UW4P5zDngsY4vy1pE3wzLPFI4Vdo14wXDAdBgNVHQ4EFgQU
+FxIwU406tG3CsPWkHWqfuUT48aswIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgH+MAUGAytlcANBAAZFvMek
+Z71I8CXsBmx/0E6Weoaan9mJHgKqgQdK4w4h4dRg6DjNG957IbrLFO3vZduBMnna
+qHP3xTFF+11Eyg8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBTDCB/6ADAgECAhRXcvbYynz4+usVvPtJp++sBUih3TAFBgMrZXAwHDEaMBgG
+A1UEAwwRcG9ueXRvd24gRWREU0EgQ0EwHhcNMTkwODE2MTMyODUwWhcNMjkwODEz
+MTMyODUwWjAcMRowGAYDVQQDDBFwb255dG93biBFZERTQSBDQTAqMAUGAytlcAMh
+AIE4tLweIfcBGfhPqyXFp5pjVxjaiKk+9fTbRy46jAFKo1MwUTAdBgNVHQ4EFgQU
+z5b9HjkOxffbtCZhWGg+bnxuD6wwHwYDVR0jBBgwFoAUz5b9HjkOxffbtCZhWGg+
+bnxuD6wwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBNlt7z4bZ7KhzecxZEe3i5
+lH9MRqbpP9Rg4HyzAJfTzFGT183HoJiISdPLbxwMn0KaqSGlVe+9GgNKswoaRAwH
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/end.key b/examples/tls_server-rs/ta/test-ca/eddsa/end.key
new file mode 100644
index 0000000..4ccdedd
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/end.key
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEIIiUvLIIxxyQc8neh50+0DVq3qRWWwbEFng5No2RyDxo
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/end.req b/examples/tls_server-rs/ta/test-ca/eddsa/end.req
new file mode 100644
index 0000000..a598cd0
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/end.req
@@ -0,0 +1,6 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIGYMEwCAQAwGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wKjAFBgMrZXADIQAQ
+9M4hrE+Ucw4QUmaKOeKfphklBJi1qsqtX4u+knbseqAAMAUGAytlcANBAOCrflkH
+0YdRdHsTFOc7uE3NaY4JA/7fh3ErAKCUjwokuMLdkqs/SjRNrsARhtqQwRtQnW+K
+5v1MvGGMlMN4YA8=
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/inter.cert b/examples/tls_server-rs/ta/test-ca/eddsa/inter.cert
new file mode 100644
index 0000000..ba5388b
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/inter.cert
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBVzCCAQmgAwIBAgIBezAFBgMrZXAwHDEaMBgGA1UEAwwRcG9ueXRvd24gRWRE
+U0EgQ0EwHhcNMTkwODE2MTMyODUxWhcNMjkwODEzMTMyODUxWjAuMSwwKgYDVQQD
+DCNwb255dG93biBFZERTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAqMAUGAytlcAMh
+AD4h3t0UCoMDGgIq4UW4P5zDngsY4vy1pE3wzLPFI4Vdo14wXDAdBgNVHQ4EFgQU
+FxIwU406tG3CsPWkHWqfuUT48aswIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgH+MAUGAytlcANBAAZFvMek
+Z71I8CXsBmx/0E6Weoaan9mJHgKqgQdK4w4h4dRg6DjNG957IbrLFO3vZduBMnna
+qHP3xTFF+11Eyg8=
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/inter.key b/examples/tls_server-rs/ta/test-ca/eddsa/inter.key
new file mode 100644
index 0000000..cbb4616
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/inter.key
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEILeAlLvsh0uWr/C/Fx39HOJw3o9QZ7ek+ZgrY+mT9L5+
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/eddsa/inter.req b/examples/tls_server-rs/ta/test-ca/eddsa/inter.req
new file mode 100644
index 0000000..c2c1680
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/eddsa/inter.req
@@ -0,0 +1,6 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIGtMGECAQAwLjEsMCoGA1UEAwwjcG9ueXRvd24gRWREU0EgbGV2ZWwgMiBpbnRl
+cm1lZGlhdGUwKjAFBgMrZXADIQA+Id7dFAqDAxoCKuFFuD+cw54LGOL8taRN8Myz
+xSOFXaAAMAUGAytlcANBAFx4jeOhgGOOIFZ+XhQ7ZHTUx+OkG+Tlp9RB3xCUnIf5
+hNf+Rg8wYQaR9cX2NgJGYck7N5aOhgPFBrA2OQmGhQ4=
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/ca.cert b/examples/tls_server-rs/ta/test-ca/rsa/ca.cert
new file mode 100644
index 0000000..3a84cbe
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/ca.cert
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIFFTCCAv2gAwIBAgIUGXgsGl4sGhiPwUPOme5w5jJscVQwDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMB4XDTE5MDYwOTE3MTUxMVoX
+DTI5MDYwNjE3MTUxMVowGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArpW4WHfSmTCMvnDJaCRL5BR2knDc
+C+T4/wv7i//zsBL3q0YVdBpllWCZx8TSfuXT/1o/Zxdt+H1ZjnH8yuwuHOToE3W0
++Y/912hAPiD+d79A+MtqVX1gayjHDy9HybznTN2Onh1ZhWyks0FLL5SB0vVCLwXP
+W7tcyY0w6wn3RTw4nBu7co5a280cHgHv5V3XeNgteQrnkXE9TfuqqUZwVt0v1jr1
+bk1KaDDD+36wfeO70Q6CeLwKPhN0mPDHdj/lecj4efl0l1B0ehHxLkLuztqtkCF6
++yMoBrEyzJjO6TGMSTMsnw4F9bA15jkIIEQs5FhwVHFOTmu5BG+j37umoy27k5As
+5cV0/djr3r8WhBZ6w2+XjvbAdJPgqc+Xobnx1i5GI4noRC4G4Cl0Vx+iRru1/nsE
+xPazz9UVkiUsDlN9n49f1pik9z74Box6CD6IZVb8h4vV7um+0R4/eErVf/Cyf1Xe
+axVaOgA/CD0ucLdSfDz61O/2PG3P7YjWY1R9zr35e8pakgyFPXnWMbsfniuGkM0X
+6lG743Q7yVt38/HuAqi1AGq+r/AKisrezt97UNm0CryuEk02y4SVLbhuG/V6mBCh
+4Va3KD1ZOgfJcTZbuxebIz6W+5jL80hE0YwBBs8vSv8Fo5N7dYNSNvyMxkoPh8Gw
+CAFyqt5zBLGCEvkCAwEAAaNTMFEwHQYDVR0OBBYEFDjj6hEpDZdjAIdvd9Moe3un
+RvJWMB8GA1UdIwQYMBaAFDjj6hEpDZdjAIdvd9Moe3unRvJWMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACu+Ct6J+Dh3EXFOgjW3gN3CaD0UK0kW
+03u7znNAJBAYhi+MXSTPBdrxYGOPkHF1Jl15qb2fc58+0nakf8bvah8kgxi2ujX8
+vrPBjsAv/ixPvUrcol9ZGrseP5DdFS8pw1FoDR/JdgNCdSM4xC3GSk2SLYs+QSJx
+YG3nQLOAZEvnbiZ4zBZ0wVct4w9jrxtqdq2eS8cLoRVx715MzKPBCGEccYu/py5a
+gkyclr16s0mb+wN49of34AQ+xXguHZGNZzCy6PTbx0IC+sRVe82+RZkj21JG+AFM
+9s+vLgRdtWIEZW1AIYbUUbhuvsne+sidZW5XQuFp1V4LlQbO49oEhrPMBn+oHKg5
+MWIe68bjkqDSnDzG+TEBTWiAhyyGyZcebfCs72DGbYrfKt1uTyi+groumPnvQfJB
+y3kqy2pUFeEkNJkx4BfYL+N7I07s9WTy8UMoqn/OLuyqoFaYMd9XMaOOx3xTy8aw
+pUJ69c3VI66W/Ii1ypk2EPUImWpG/n89Y/8Mk1NbesaZLk9feTDfbM4VNPkQU+7T
+3DNQxPSswSh4nXGURwC46SOu2s1lRA98ZXkP5XhUvTuvfg/e4suq26OqjORHQ5zI
+57NP+uHRrfHGlrQ196j1Maw7W7vkocbEv8/06v6s54CG8ezzD2nt1QrLJqSpUqHo
+qolvgn/PK+gg
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/ca.der b/examples/tls_server-rs/ta/test-ca/rsa/ca.der
new file mode 100644
index 0000000..6e8c3de
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/ca.der
Binary files differ
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/ca.key b/examples/tls_server-rs/ta/test-ca/rsa/ca.key
new file mode 100644
index 0000000..6c431bf
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/ca.key
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+ha8oIAIRP0sXpyv122lVW33r601BOJY=
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.cert b/examples/tls_server-rs/ta/test-ca/rsa/client.cert
new file mode 100644
index 0000000..7219aba
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.cert
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID3DCCAkSgAwIBAgICAxUwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u
+eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDYwOTE3MTUxMloX
+DTI0MTEyOTE3MTUxMlowGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+3EWMfp30PLlO+8QOvoQuAs3wa8
+WXIoBH3KncsGS6uyQXPpQRGW9I9tDBi0JGd/l4aLz4TMKtSIqDHEyoyIHaN9zQCd
+8CgthdMN4BZ7PIzq3hTzW6CRC5GL7v16vt5szNov6HH12K1/UtUx1fclcRYKqrz1
+HU98rPfdsbt6AdbWRBBAUjiRwi28swBaU1MR8erXhFhSRxK5v2gSxga9aAfG+KpN
+LAQ6VVyDZhRAvM34NPHG8PQ6wP6kmifsGP90N7XZkx/VB/+cscykQZzq/jUfSEXm
+DnC09vufsmRuz6+4QoZroSl9jyioj1vdPK0QkGh0s35NN/o/ryJbTM6EOwIDAQAB
+o4GZMIGWMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMBYGA1UdJQEB/wQMMAoG
+CCsGAQUFBwMCMB0GA1UdDgQWBBRvtldlhopGZTkUxse9V/4dKKXtzTBCBgNVHSME
+OzA5gBRCj8vIR2VWs6byLMRXBqOGK5BJMKEepBwwGjEYMBYGA1UEAwwPcG9ueXRv
+d24gUlNBIENBggF7MA0GCSqGSIb3DQEBCwUAA4IBgQAKMj/VsEZFTRbjLFxkZOTD
+SYL07z14VCSq/XjmoeadwZoJ1R6Q3HXi1+vaW3LKdldAATnddgSRA0gjM62SU1d/
+TCg53lnylVO7HeJpOAhoXmlv4p9sxuN7Ye0l9rLEYEOmDNBWgT39KGsuJZ9EkrAS
+28Sxx2TSgqELxxz90uF9nMoM0p51pqP9Y65SbVXEDYauNm2DHHbvjeLLTZTSFCkJ
+mWC7t49zaMpcj68jQpV7DNRYqZzB8ceMn8Sr5Kzzy2Oc7qos+7RiYOkkA81z1iGx
+ibYcbsR1Jayb7E95MaNdS9hBNbxMW2CJZDF7fnx6ppJnWzAc4xsm49izfqHj42kJ
+QCb2uq3/AJ/ZlWeYvETjmlDnmwi5Da7q/frgJIWEiecW0MNatCKdoo3Xd4dRztgI
+ITz6ju4+VlRReasd8BsOQyUPMTVRJQHOvHDDjRJFAUAK8XtU1Hocgx20HYixqzyb
+Q6Tj5hchzfjddvsWYp9wlEwfQjDC3TYJxRfHQAiFm4Q=
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.chain b/examples/tls_server-rs/ta/test-ca/rsa/client.chain
new file mode 100644
index 0000000..02b87cf
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.chain
@@ -0,0 +1,57 @@
+-----BEGIN CERTIFICATE-----
+MIIEnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
+dG93biBSU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcNMjkwNjA2MTcxNTEyWjAsMSow
+KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
+CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCj/tOFeSW3WB+TtuLCR1L/84lZytFw
+zbpzOTGB1kPEKNbrMsv3lHXm5bHa8Bl3k113k7Hi7OAt/nkMm05s8LcUoovhaG5C
+G7tjzL+ld1nO74gNS3IQHCzxRdRwIgaDZHyICfBQBfB9/m+9z3yRtOKWJl6i/MT9
+HRN6yADW/8gHFlMzRkCKBjIKXehKsu8cbtB+5MukwtXI4rKf9aYXZQOEUn1kEwQJ
+ZIKBXR0eyloQiZervUE7meRCTBvzXT9VoSEX49/mempp4hnfdHlRNzre4/tphBf1
+fRUdpVXZ3DvmzoHdXRVzxx3X5LvDpf7Eb3ViGkXDFwkSfHEhkRnAl4lIzTH/1F25
+stmT8a0PA/lCNMrzJBzkLcuem1G1uMHoQZo1f3OpslJ8gHbE9ZlIbIKmpmJS9oop
+Vh1BH+aOy5doCrF8uOLTQ3d5CqA/EZMGahDHy7IkeNYmG/RXUKNltv+r95gwuRP+
+9UIJ9FTa4REQbIpGWP5XibI6x4LqLTJj+VsCAwEAAaNeMFwwHQYDVR0OBBYEFEKP
+y8hHZVazpvIsxFcGo4YrkEkwMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
+AgEAMzTRDLBExVFlw98AuX+pM+/R2Gjw5KFHvSYLKLbMRfuuZK1yNYYaYtNrtF+V
+a53OFgaZj56o7tXc2PB8kw4MELD0ViR8Do2bvZieFcEe4DwhdjGCjuLehVLT29qI
+7T3N/JkJ5daemKZcRB6Ne0F4+6QlVVNck28HUKbQThl88RdwLUImmSAfgKSt6uJ5
+wlH7wiYQR2vPXwSuEYzwot+L/91eBwuQr4Lovx9+TCKTbwQOKYjX4KfcOOQ1rx0M
+IMrvwWqnabc6m1F0O6//ibL0kuFkJYEgOH2uJA12FBHO+/q2tcytejkOWKWMJj6Y
+2etwIHcpzXaEP7fZ75cFGqcE3s7XGsweBIPLjMP1bKxEcFKzygURm/auUuXBCFBl
+E16PB6JEAeCKe/8VFeyucvjPuQDWB49aq+r2SbpbI4IeZdz/QgEIOb0MpwStrvhH
+9f/DtGMbjvuAEkRoOorK4m5k4GY3LsWTR2bey27AXk8N7pKarpu2N7ChBPm+EV0Y
+H+tAI/OfdZuNUCES00F5UAFdU8zBUZo19ao2ZqfEADimE7Epk2s0bUe4GSqEXJp6
+68oVSMhZmMf/RCSNlr97f34sNiUA1YJ0JbCRZmw8KWNm9H1PARLbrgeRBZ/k31Li
+WLDr3fiEVk7SGxj3zo94cS6AT55DyXLiSD/bFmL1QXgZweA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFFTCCAv2gAwIBAgIUGXgsGl4sGhiPwUPOme5w5jJscVQwDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMB4XDTE5MDYwOTE3MTUxMVoX
+DTI5MDYwNjE3MTUxMVowGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArpW4WHfSmTCMvnDJaCRL5BR2knDc
+C+T4/wv7i//zsBL3q0YVdBpllWCZx8TSfuXT/1o/Zxdt+H1ZjnH8yuwuHOToE3W0
++Y/912hAPiD+d79A+MtqVX1gayjHDy9HybznTN2Onh1ZhWyks0FLL5SB0vVCLwXP
+W7tcyY0w6wn3RTw4nBu7co5a280cHgHv5V3XeNgteQrnkXE9TfuqqUZwVt0v1jr1
+bk1KaDDD+36wfeO70Q6CeLwKPhN0mPDHdj/lecj4efl0l1B0ehHxLkLuztqtkCF6
++yMoBrEyzJjO6TGMSTMsnw4F9bA15jkIIEQs5FhwVHFOTmu5BG+j37umoy27k5As
+5cV0/djr3r8WhBZ6w2+XjvbAdJPgqc+Xobnx1i5GI4noRC4G4Cl0Vx+iRru1/nsE
+xPazz9UVkiUsDlN9n49f1pik9z74Box6CD6IZVb8h4vV7um+0R4/eErVf/Cyf1Xe
+axVaOgA/CD0ucLdSfDz61O/2PG3P7YjWY1R9zr35e8pakgyFPXnWMbsfniuGkM0X
+6lG743Q7yVt38/HuAqi1AGq+r/AKisrezt97UNm0CryuEk02y4SVLbhuG/V6mBCh
+4Va3KD1ZOgfJcTZbuxebIz6W+5jL80hE0YwBBs8vSv8Fo5N7dYNSNvyMxkoPh8Gw
+CAFyqt5zBLGCEvkCAwEAAaNTMFEwHQYDVR0OBBYEFDjj6hEpDZdjAIdvd9Moe3un
+RvJWMB8GA1UdIwQYMBaAFDjj6hEpDZdjAIdvd9Moe3unRvJWMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACu+Ct6J+Dh3EXFOgjW3gN3CaD0UK0kW
+03u7znNAJBAYhi+MXSTPBdrxYGOPkHF1Jl15qb2fc58+0nakf8bvah8kgxi2ujX8
+vrPBjsAv/ixPvUrcol9ZGrseP5DdFS8pw1FoDR/JdgNCdSM4xC3GSk2SLYs+QSJx
+YG3nQLOAZEvnbiZ4zBZ0wVct4w9jrxtqdq2eS8cLoRVx715MzKPBCGEccYu/py5a
+gkyclr16s0mb+wN49of34AQ+xXguHZGNZzCy6PTbx0IC+sRVe82+RZkj21JG+AFM
+9s+vLgRdtWIEZW1AIYbUUbhuvsne+sidZW5XQuFp1V4LlQbO49oEhrPMBn+oHKg5
+MWIe68bjkqDSnDzG+TEBTWiAhyyGyZcebfCs72DGbYrfKt1uTyi+groumPnvQfJB
+y3kqy2pUFeEkNJkx4BfYL+N7I07s9WTy8UMoqn/OLuyqoFaYMd9XMaOOx3xTy8aw
+pUJ69c3VI66W/Ii1ypk2EPUImWpG/n89Y/8Mk1NbesaZLk9feTDfbM4VNPkQU+7T
+3DNQxPSswSh4nXGURwC46SOu2s1lRA98ZXkP5XhUvTuvfg/e4suq26OqjORHQ5zI
+57NP+uHRrfHGlrQ196j1Maw7W7vkocbEv8/06v6s54CG8ezzD2nt1QrLJqSpUqHo
+qolvgn/PK+gg
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.fullchain b/examples/tls_server-rs/ta/test-ca/rsa/client.fullchain
new file mode 100644
index 0000000..ca91469
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.fullchain
@@ -0,0 +1,80 @@
+-----BEGIN CERTIFICATE-----
+MIID3DCCAkSgAwIBAgICAxUwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u
+eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDYwOTE3MTUxMloX
+DTI0MTEyOTE3MTUxMlowGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+3EWMfp30PLlO+8QOvoQuAs3wa8
+WXIoBH3KncsGS6uyQXPpQRGW9I9tDBi0JGd/l4aLz4TMKtSIqDHEyoyIHaN9zQCd
+8CgthdMN4BZ7PIzq3hTzW6CRC5GL7v16vt5szNov6HH12K1/UtUx1fclcRYKqrz1
+HU98rPfdsbt6AdbWRBBAUjiRwi28swBaU1MR8erXhFhSRxK5v2gSxga9aAfG+KpN
+LAQ6VVyDZhRAvM34NPHG8PQ6wP6kmifsGP90N7XZkx/VB/+cscykQZzq/jUfSEXm
+DnC09vufsmRuz6+4QoZroSl9jyioj1vdPK0QkGh0s35NN/o/ryJbTM6EOwIDAQAB
+o4GZMIGWMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMBYGA1UdJQEB/wQMMAoG
+CCsGAQUFBwMCMB0GA1UdDgQWBBRvtldlhopGZTkUxse9V/4dKKXtzTBCBgNVHSME
+OzA5gBRCj8vIR2VWs6byLMRXBqOGK5BJMKEepBwwGjEYMBYGA1UEAwwPcG9ueXRv
+d24gUlNBIENBggF7MA0GCSqGSIb3DQEBCwUAA4IBgQAKMj/VsEZFTRbjLFxkZOTD
+SYL07z14VCSq/XjmoeadwZoJ1R6Q3HXi1+vaW3LKdldAATnddgSRA0gjM62SU1d/
+TCg53lnylVO7HeJpOAhoXmlv4p9sxuN7Ye0l9rLEYEOmDNBWgT39KGsuJZ9EkrAS
+28Sxx2TSgqELxxz90uF9nMoM0p51pqP9Y65SbVXEDYauNm2DHHbvjeLLTZTSFCkJ
+mWC7t49zaMpcj68jQpV7DNRYqZzB8ceMn8Sr5Kzzy2Oc7qos+7RiYOkkA81z1iGx
+ibYcbsR1Jayb7E95MaNdS9hBNbxMW2CJZDF7fnx6ppJnWzAc4xsm49izfqHj42kJ
+QCb2uq3/AJ/ZlWeYvETjmlDnmwi5Da7q/frgJIWEiecW0MNatCKdoo3Xd4dRztgI
+ITz6ju4+VlRReasd8BsOQyUPMTVRJQHOvHDDjRJFAUAK8XtU1Hocgx20HYixqzyb
+Q6Tj5hchzfjddvsWYp9wlEwfQjDC3TYJxRfHQAiFm4Q=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
+dG93biBSU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcNMjkwNjA2MTcxNTEyWjAsMSow
+KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
+CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCj/tOFeSW3WB+TtuLCR1L/84lZytFw
+zbpzOTGB1kPEKNbrMsv3lHXm5bHa8Bl3k113k7Hi7OAt/nkMm05s8LcUoovhaG5C
+G7tjzL+ld1nO74gNS3IQHCzxRdRwIgaDZHyICfBQBfB9/m+9z3yRtOKWJl6i/MT9
+HRN6yADW/8gHFlMzRkCKBjIKXehKsu8cbtB+5MukwtXI4rKf9aYXZQOEUn1kEwQJ
+ZIKBXR0eyloQiZervUE7meRCTBvzXT9VoSEX49/mempp4hnfdHlRNzre4/tphBf1
+fRUdpVXZ3DvmzoHdXRVzxx3X5LvDpf7Eb3ViGkXDFwkSfHEhkRnAl4lIzTH/1F25
+stmT8a0PA/lCNMrzJBzkLcuem1G1uMHoQZo1f3OpslJ8gHbE9ZlIbIKmpmJS9oop
+Vh1BH+aOy5doCrF8uOLTQ3d5CqA/EZMGahDHy7IkeNYmG/RXUKNltv+r95gwuRP+
+9UIJ9FTa4REQbIpGWP5XibI6x4LqLTJj+VsCAwEAAaNeMFwwHQYDVR0OBBYEFEKP
+y8hHZVazpvIsxFcGo4YrkEkwMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
+AgEAMzTRDLBExVFlw98AuX+pM+/R2Gjw5KFHvSYLKLbMRfuuZK1yNYYaYtNrtF+V
+a53OFgaZj56o7tXc2PB8kw4MELD0ViR8Do2bvZieFcEe4DwhdjGCjuLehVLT29qI
+7T3N/JkJ5daemKZcRB6Ne0F4+6QlVVNck28HUKbQThl88RdwLUImmSAfgKSt6uJ5
+wlH7wiYQR2vPXwSuEYzwot+L/91eBwuQr4Lovx9+TCKTbwQOKYjX4KfcOOQ1rx0M
+IMrvwWqnabc6m1F0O6//ibL0kuFkJYEgOH2uJA12FBHO+/q2tcytejkOWKWMJj6Y
+2etwIHcpzXaEP7fZ75cFGqcE3s7XGsweBIPLjMP1bKxEcFKzygURm/auUuXBCFBl
+E16PB6JEAeCKe/8VFeyucvjPuQDWB49aq+r2SbpbI4IeZdz/QgEIOb0MpwStrvhH
+9f/DtGMbjvuAEkRoOorK4m5k4GY3LsWTR2bey27AXk8N7pKarpu2N7ChBPm+EV0Y
+H+tAI/OfdZuNUCES00F5UAFdU8zBUZo19ao2ZqfEADimE7Epk2s0bUe4GSqEXJp6
+68oVSMhZmMf/RCSNlr97f34sNiUA1YJ0JbCRZmw8KWNm9H1PARLbrgeRBZ/k31Li
+WLDr3fiEVk7SGxj3zo94cS6AT55DyXLiSD/bFmL1QXgZweA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFFTCCAv2gAwIBAgIUGXgsGl4sGhiPwUPOme5w5jJscVQwDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMB4XDTE5MDYwOTE3MTUxMVoX
+DTI5MDYwNjE3MTUxMVowGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArpW4WHfSmTCMvnDJaCRL5BR2knDc
+C+T4/wv7i//zsBL3q0YVdBpllWCZx8TSfuXT/1o/Zxdt+H1ZjnH8yuwuHOToE3W0
++Y/912hAPiD+d79A+MtqVX1gayjHDy9HybznTN2Onh1ZhWyks0FLL5SB0vVCLwXP
+W7tcyY0w6wn3RTw4nBu7co5a280cHgHv5V3XeNgteQrnkXE9TfuqqUZwVt0v1jr1
+bk1KaDDD+36wfeO70Q6CeLwKPhN0mPDHdj/lecj4efl0l1B0ehHxLkLuztqtkCF6
++yMoBrEyzJjO6TGMSTMsnw4F9bA15jkIIEQs5FhwVHFOTmu5BG+j37umoy27k5As
+5cV0/djr3r8WhBZ6w2+XjvbAdJPgqc+Xobnx1i5GI4noRC4G4Cl0Vx+iRru1/nsE
+xPazz9UVkiUsDlN9n49f1pik9z74Box6CD6IZVb8h4vV7um+0R4/eErVf/Cyf1Xe
+axVaOgA/CD0ucLdSfDz61O/2PG3P7YjWY1R9zr35e8pakgyFPXnWMbsfniuGkM0X
+6lG743Q7yVt38/HuAqi1AGq+r/AKisrezt97UNm0CryuEk02y4SVLbhuG/V6mBCh
+4Va3KD1ZOgfJcTZbuxebIz6W+5jL80hE0YwBBs8vSv8Fo5N7dYNSNvyMxkoPh8Gw
+CAFyqt5zBLGCEvkCAwEAAaNTMFEwHQYDVR0OBBYEFDjj6hEpDZdjAIdvd9Moe3un
+RvJWMB8GA1UdIwQYMBaAFDjj6hEpDZdjAIdvd9Moe3unRvJWMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACu+Ct6J+Dh3EXFOgjW3gN3CaD0UK0kW
+03u7znNAJBAYhi+MXSTPBdrxYGOPkHF1Jl15qb2fc58+0nakf8bvah8kgxi2ujX8
+vrPBjsAv/ixPvUrcol9ZGrseP5DdFS8pw1FoDR/JdgNCdSM4xC3GSk2SLYs+QSJx
+YG3nQLOAZEvnbiZ4zBZ0wVct4w9jrxtqdq2eS8cLoRVx715MzKPBCGEccYu/py5a
+gkyclr16s0mb+wN49of34AQ+xXguHZGNZzCy6PTbx0IC+sRVe82+RZkj21JG+AFM
+9s+vLgRdtWIEZW1AIYbUUbhuvsne+sidZW5XQuFp1V4LlQbO49oEhrPMBn+oHKg5
+MWIe68bjkqDSnDzG+TEBTWiAhyyGyZcebfCs72DGbYrfKt1uTyi+groumPnvQfJB
+y3kqy2pUFeEkNJkx4BfYL+N7I07s9WTy8UMoqn/OLuyqoFaYMd9XMaOOx3xTy8aw
+pUJ69c3VI66W/Ii1ypk2EPUImWpG/n89Y/8Mk1NbesaZLk9feTDfbM4VNPkQU+7T
+3DNQxPSswSh4nXGURwC46SOu2s1lRA98ZXkP5XhUvTuvfg/e4suq26OqjORHQ5zI
+57NP+uHRrfHGlrQ196j1Maw7W7vkocbEv8/06v6s54CG8ezzD2nt1QrLJqSpUqHo
+qolvgn/PK+gg
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.key b/examples/tls_server-rs/ta/test-ca/rsa/client.key
new file mode 100644
index 0000000..83fc6af
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDP7cRYx+nfQ8uU
+77xA6+hC4CzfBrxZcigEfcqdywZLq7JBc+lBEZb0j20MGLQkZ3+XhovPhMwq1Iio
+McTKjIgdo33NAJ3wKC2F0w3gFns8jOreFPNboJELkYvu/Xq+3mzM2i/ocfXYrX9S
+1THV9yVxFgqqvPUdT3ys992xu3oB1tZEEEBSOJHCLbyzAFpTUxHx6teEWFJHErm/
+aBLGBr1oB8b4qk0sBDpVXINmFEC8zfg08cbw9DrA/qSaJ+wY/3Q3tdmTH9UH/5yx
+zKRBnOr+NR9IReYOcLT2+5+yZG7Pr7hChmuhKX2PKKiPW908rRCQaHSzfk03+j+v
+IltMzoQ7AgMBAAECggEAEcefFohhszm02tN1IYgKoE1TCO8mg++DBH9NKBkIPMg9
+weMLewjqA5eQF4y1Oreu7WIP6nrMio0J8nfu//LsYLxuMW1wE+0bl2nosdS6TP8v
+xjW8aYVdYcPcV19Nc6zJWOr/Vb0I7LJJROf+DvHHPdhIqTjnLM5zNscrKduCH038
+JD7WVU8fYhYJUrsR33utN/XubKwAx6Kf6wBQg3qCccHluPDPrKXNTEsua8xE7Y0n
+Lm6gM++YEqBmBhCBUwDNQc6KCu/SJSQl5HjTrNdyAxDMUNaQ+rWmrOc2vxhJpFVs
+jJkUwTOg+aw84naTq5P69BUpZAsMpLg6eO5v9O23oQKBgQDsjuMv6D6vQ6FWbdvr
+AYsrD4x6b4u+p99t7y1+npjHMWXptjsXLFnM1w+01fpZNYUd1gWp9wAA3I4FVegn
+uOR5DHbcptas2RzMLWvqVOj05feE+Oi6F5LZXxoM4KIvM0nYcKRs4oxI8IrY+bLM
+Kz2xWxQyOZtCpG95/PgRMBLaVwKBgQDhBIaqQ1qyv1n+ckICTDpwfnS64kF0kyrp
+P906QxDdt0GXVAsMc/7CLsrDpVt4WPWtzfADRxLsf17eMdxkSJ6ITCVpwrjA5g5Y
+/E4U2KSqJf/ekzTji9n1Du6+7woGwSstwHMEq5fOmUMPx+9Rp6b85gVBJFnIQdLN
+rtWlgSf+vQKBgDVDJtwOiq6jp5vyOGX9fvw/D/4xR2GyIph6FeBAjV2sPaoVodBh
+6AY7Fgo9c5TKfCJvoe7W8mU/Q6rn4NGwy6CFse2Ukxlv+Q/v2jB01c7uSIDkGmJs
+FGBlDVSA74N5JNNa6Wqqx7NUla6s6hkWU1mvjCiS1+Z1Z7QrxR75mAUZAoGADz94
+RKdlyQEQfx6M/Izf1OmszVExsE2ctcufGSicRvn5FuEaEpD1rYDwOovFBAW7ODjh
+T8eML7x92D62uZD2NTQ7wMvyKxgr1rnaLK11kxYaHaIKDnVWorWNViDqpASJAYOu
+B539HoHiOnqI7BaZST/pET3+W4SiXU/AqIN1C10CgYB0vT7kbuBCLui50u3+KInl
+BULxPB7FwwbGLwP335fGjpmfN77zlQn+bovHtI7bylC4LkENIBj031vqiGWQNFd6
+B1WMzZgQeJ0CO4Yaek8JaPI727kPgF+VoYs71whWWdH863NHs+ZK+Gt8fPlUAhP8
+BfXkZH0k+K+gSYfZiP1C4A==
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.req b/examples/tls_server-rs/ta/test-ca/rsa/client.req
new file mode 100644
index 0000000..d629678
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.req
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICXzCCAUcCAQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gY2xpZW50MIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+3EWMfp30PLlO+8QOvoQuAs3wa8WXIo
+BH3KncsGS6uyQXPpQRGW9I9tDBi0JGd/l4aLz4TMKtSIqDHEyoyIHaN9zQCd8Cgt
+hdMN4BZ7PIzq3hTzW6CRC5GL7v16vt5szNov6HH12K1/UtUx1fclcRYKqrz1HU98
+rPfdsbt6AdbWRBBAUjiRwi28swBaU1MR8erXhFhSRxK5v2gSxga9aAfG+KpNLAQ6
+VVyDZhRAvM34NPHG8PQ6wP6kmifsGP90N7XZkx/VB/+cscykQZzq/jUfSEXmDnC0
+9vufsmRuz6+4QoZroSl9jyioj1vdPK0QkGh0s35NN/o/ryJbTM6EOwIDAQABoAAw
+DQYJKoZIhvcNAQELBQADggEBAHH7dmSGiTiDmMC+L9YKFDMzenhG7psqbKDrWiqI
+cokp4XhRjqPoUVy8FYDh7iGANz/LNxGR4eZ/ir1BUfI541yWzuKUhoEVwxP6naZE
+EWuRkON0PYKARHHE5MXqQ4CWJolh11v9W7mbh8rF2nSosOpHTuH1I1VNR1uHy6lk
+DjSHFgMyFeqF2uUe1jBHI8Kzt3pqDIkoHtLR96blJvTXICSvMBEZlLJuHwloeew2
+daAuUW17K8WYREPEZy1Xuj1owjfMiBSI0+yjl8oXZ9YgdV+alktwymEKayvS5loJ
+WUwMgyofsXk8M2bHVZ+HDMXaj7EAfAuDm18gCHKtjXZULuk=
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/client.rsa b/examples/tls_server-rs/ta/test-ca/rsa/client.rsa
new file mode 100644
index 0000000..6b7b22a
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/client.rsa
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAz+3EWMfp30PLlO+8QOvoQuAs3wa8WXIoBH3KncsGS6uyQXPp
+QRGW9I9tDBi0JGd/l4aLz4TMKtSIqDHEyoyIHaN9zQCd8CgthdMN4BZ7PIzq3hTz
+W6CRC5GL7v16vt5szNov6HH12K1/UtUx1fclcRYKqrz1HU98rPfdsbt6AdbWRBBA
+UjiRwi28swBaU1MR8erXhFhSRxK5v2gSxga9aAfG+KpNLAQ6VVyDZhRAvM34NPHG
+8PQ6wP6kmifsGP90N7XZkx/VB/+cscykQZzq/jUfSEXmDnC09vufsmRuz6+4QoZr
+oSl9jyioj1vdPK0QkGh0s35NN/o/ryJbTM6EOwIDAQABAoIBABHHnxaIYbM5tNrT
+dSGICqBNUwjvJoPvgwR/TSgZCDzIPcHjC3sI6gOXkBeMtTq3ru1iD+p6zIqNCfJ3
+7v/y7GC8bjFtcBPtG5dp6LHUukz/L8Y1vGmFXWHD3FdfTXOsyVjq/1W9COyySUTn
+/g7xxz3YSKk45yzOczbHKynbgh9N/CQ+1lVPH2IWCVK7Ed97rTf17mysAMein+sA
+UIN6gnHB5bjwz6ylzUxLLmvMRO2NJy5uoDPvmBKgZgYQgVMAzUHOigrv0iUkJeR4
+06zXcgMQzFDWkPq1pqznNr8YSaRVbIyZFMEzoPmsPOJ2k6uT+vQVKWQLDKS4Onju
+b/Ttt6ECgYEA7I7jL+g+r0OhVm3b6wGLKw+Mem+Lvqffbe8tfp6YxzFl6bY7FyxZ
+zNcPtNX6WTWFHdYFqfcAANyOBVXoJ7jkeQx23KbWrNkczC1r6lTo9OX3hPjouheS
+2V8aDOCiLzNJ2HCkbOKMSPCK2PmyzCs9sVsUMjmbQqRvefz4ETAS2lcCgYEA4QSG
+qkNasr9Z/nJCAkw6cH50uuJBdJMq6T/dOkMQ3bdBl1QLDHP+wi7Kw6VbeFj1rc3w
+A0cS7H9e3jHcZEieiEwlacK4wOYOWPxOFNikqiX/3pM044vZ9Q7uvu8KBsErLcBz
+BKuXzplDD8fvUaem/OYFQSRZyEHSza7VpYEn/r0CgYA1QybcDoquo6eb8jhl/X78
+Pw/+MUdhsiKYehXgQI1drD2qFaHQYegGOxYKPXOUynwib6Hu1vJlP0Oq5+DRsMug
+hbHtlJMZb/kP79owdNXO7kiA5BpibBRgZQ1UgO+DeSTTWulqqsezVJWurOoZFlNZ
+r4woktfmdWe0K8Ue+ZgFGQKBgA8/eESnZckBEH8ejPyM39TprM1RMbBNnLXLnxko
+nEb5+RbhGhKQ9a2A8DqLxQQFuzg44U/HjC+8fdg+trmQ9jU0O8DL8isYK9a52iyt
+dZMWGh2iCg51VqK1jVYg6qQEiQGDrged/R6B4jp6iOwWmUk/6RE9/luEol1PwKiD
+dQtdAoGAdL0+5G7gQi7oudLt/iiJ5QVC8TwexcMGxi8D99+Xxo6Znze+85UJ/m6L
+x7SO28pQuC5BDSAY9N9b6ohlkDRXegdVjM2YEHidAjuGGnpPCWjyO9u5D4BflaGL
+O9cIVlnR/OtzR7PmSvhrfHz5VAIT/AX15GR9JPivoEmH2Yj9QuA=
+-----END RSA PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.cert b/examples/tls_server-rs/ta/test-ca/rsa/end.cert
new file mode 100644
index 0000000..cf97eb5
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.cert
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIIEADCCAmigAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u
+eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDYwOTE3MTUxMloX
+DTI0MTEyOTE3MTUxMlowGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdwbEc6ZKih4mQA916JwctBZgnRmzO
+KERrzlHjfzy8ZfsUJLENQBN8s3RVRwPThReHdp8bpiVRrNmMRxyXoa5oqxWDjXOu
+5W4hoISIMbOAq4Kj8G+eS0UKwypKHwJ1aUzEjWQGKxNpIYvcGqwYpN1Yi1+qTgLg
+2qw1ENtBhrWHhmQruGqDtQTQLe2tbcOuGhIL0cyWIRtEWHWL/wb1Akzhm31WQF+m
+URtYvYonA/Ta7ErONXCxsEXndTR4iT/XognnOhTJ+uIinNwn52y9Te7MYix6SDBE
+VeKZx9v3iOYU81zXf+WaxNqZvTfbPjkLsXiymOgVfGQcO4hiQeLoJIHXAgMBAAGj
+gb4wgbswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFEweXJqS
+BzVcf/00QeOC29OwBQszMEIGA1UdIwQ7MDmAFEKPy8hHZVazpvIsxFcGo4YrkEkw
+oR6kHDAaMRgwFgYDVQQDDA9wb255dG93biBSU0EgQ0GCAXswOwYDVR0RBDQwMoIO
+dGVzdHNlcnZlci5jb22CFXNlY29uZC50ZXN0c2VydmVyLmNvbYIJbG9jYWxob3N0
+MA0GCSqGSIb3DQEBCwUAA4IBgQCViHp2pLcIMzl/wN+sULznLYZvrlynU4AHnL8/
+ba6iSAM6EMlrcu11+UBQglHIN2BEn+Jjas+HT1sQOIOixMgjrMBgirLez8n5DN66
+o5aK5bu23GjQvzq5JEh0skQDHtSFX0YRwqXIhi1spGtObsnoupxJNBQbdAcDv50/
+m6/8WXcPbXBnR+wRywFmjb6+OSVNgCRtBFTbR5XRVHMPEwvSk4hVj4jimlnPHZYL
+3VatCPtZr6iaLZl9E64BbS+J4vPQ0Z/2JMUjtXCuj19k8LO2TTTBz54QVoMF5jrZ
+xotneq+wmPH3lmozEOmyj4+4CmoyNz+RDhrlok84x3g4YEKUQyK1V4ROi9DtL1CV
+VoLfHSwS9SiDdD/Qn2n7RICn6DP2lHozICyHX0Op4W+vETHho7Flsw21bMisAGrl
+wwQ7UYU4XfPOC9hQoCvU60uVe7z+uZvlBY8RwmcW4iFIbfCcPT6Hrom5F1X4Z/dm
+zDW8ZhLDsjUY/D4lUeWjbO1RCHI=
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.chain b/examples/tls_server-rs/ta/test-ca/rsa/end.chain
new file mode 100644
index 0000000..02b87cf
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.chain
@@ -0,0 +1,57 @@
+-----BEGIN CERTIFICATE-----
+MIIEnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
+dG93biBSU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcNMjkwNjA2MTcxNTEyWjAsMSow
+KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
+CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCj/tOFeSW3WB+TtuLCR1L/84lZytFw
+zbpzOTGB1kPEKNbrMsv3lHXm5bHa8Bl3k113k7Hi7OAt/nkMm05s8LcUoovhaG5C
+G7tjzL+ld1nO74gNS3IQHCzxRdRwIgaDZHyICfBQBfB9/m+9z3yRtOKWJl6i/MT9
+HRN6yADW/8gHFlMzRkCKBjIKXehKsu8cbtB+5MukwtXI4rKf9aYXZQOEUn1kEwQJ
+ZIKBXR0eyloQiZervUE7meRCTBvzXT9VoSEX49/mempp4hnfdHlRNzre4/tphBf1
+fRUdpVXZ3DvmzoHdXRVzxx3X5LvDpf7Eb3ViGkXDFwkSfHEhkRnAl4lIzTH/1F25
+stmT8a0PA/lCNMrzJBzkLcuem1G1uMHoQZo1f3OpslJ8gHbE9ZlIbIKmpmJS9oop
+Vh1BH+aOy5doCrF8uOLTQ3d5CqA/EZMGahDHy7IkeNYmG/RXUKNltv+r95gwuRP+
+9UIJ9FTa4REQbIpGWP5XibI6x4LqLTJj+VsCAwEAAaNeMFwwHQYDVR0OBBYEFEKP
+y8hHZVazpvIsxFcGo4YrkEkwMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
+AgEAMzTRDLBExVFlw98AuX+pM+/R2Gjw5KFHvSYLKLbMRfuuZK1yNYYaYtNrtF+V
+a53OFgaZj56o7tXc2PB8kw4MELD0ViR8Do2bvZieFcEe4DwhdjGCjuLehVLT29qI
+7T3N/JkJ5daemKZcRB6Ne0F4+6QlVVNck28HUKbQThl88RdwLUImmSAfgKSt6uJ5
+wlH7wiYQR2vPXwSuEYzwot+L/91eBwuQr4Lovx9+TCKTbwQOKYjX4KfcOOQ1rx0M
+IMrvwWqnabc6m1F0O6//ibL0kuFkJYEgOH2uJA12FBHO+/q2tcytejkOWKWMJj6Y
+2etwIHcpzXaEP7fZ75cFGqcE3s7XGsweBIPLjMP1bKxEcFKzygURm/auUuXBCFBl
+E16PB6JEAeCKe/8VFeyucvjPuQDWB49aq+r2SbpbI4IeZdz/QgEIOb0MpwStrvhH
+9f/DtGMbjvuAEkRoOorK4m5k4GY3LsWTR2bey27AXk8N7pKarpu2N7ChBPm+EV0Y
+H+tAI/OfdZuNUCES00F5UAFdU8zBUZo19ao2ZqfEADimE7Epk2s0bUe4GSqEXJp6
+68oVSMhZmMf/RCSNlr97f34sNiUA1YJ0JbCRZmw8KWNm9H1PARLbrgeRBZ/k31Li
+WLDr3fiEVk7SGxj3zo94cS6AT55DyXLiSD/bFmL1QXgZweA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFFTCCAv2gAwIBAgIUGXgsGl4sGhiPwUPOme5w5jJscVQwDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMB4XDTE5MDYwOTE3MTUxMVoX
+DTI5MDYwNjE3MTUxMVowGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArpW4WHfSmTCMvnDJaCRL5BR2knDc
+C+T4/wv7i//zsBL3q0YVdBpllWCZx8TSfuXT/1o/Zxdt+H1ZjnH8yuwuHOToE3W0
++Y/912hAPiD+d79A+MtqVX1gayjHDy9HybznTN2Onh1ZhWyks0FLL5SB0vVCLwXP
+W7tcyY0w6wn3RTw4nBu7co5a280cHgHv5V3XeNgteQrnkXE9TfuqqUZwVt0v1jr1
+bk1KaDDD+36wfeO70Q6CeLwKPhN0mPDHdj/lecj4efl0l1B0ehHxLkLuztqtkCF6
++yMoBrEyzJjO6TGMSTMsnw4F9bA15jkIIEQs5FhwVHFOTmu5BG+j37umoy27k5As
+5cV0/djr3r8WhBZ6w2+XjvbAdJPgqc+Xobnx1i5GI4noRC4G4Cl0Vx+iRru1/nsE
+xPazz9UVkiUsDlN9n49f1pik9z74Box6CD6IZVb8h4vV7um+0R4/eErVf/Cyf1Xe
+axVaOgA/CD0ucLdSfDz61O/2PG3P7YjWY1R9zr35e8pakgyFPXnWMbsfniuGkM0X
+6lG743Q7yVt38/HuAqi1AGq+r/AKisrezt97UNm0CryuEk02y4SVLbhuG/V6mBCh
+4Va3KD1ZOgfJcTZbuxebIz6W+5jL80hE0YwBBs8vSv8Fo5N7dYNSNvyMxkoPh8Gw
+CAFyqt5zBLGCEvkCAwEAAaNTMFEwHQYDVR0OBBYEFDjj6hEpDZdjAIdvd9Moe3un
+RvJWMB8GA1UdIwQYMBaAFDjj6hEpDZdjAIdvd9Moe3unRvJWMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACu+Ct6J+Dh3EXFOgjW3gN3CaD0UK0kW
+03u7znNAJBAYhi+MXSTPBdrxYGOPkHF1Jl15qb2fc58+0nakf8bvah8kgxi2ujX8
+vrPBjsAv/ixPvUrcol9ZGrseP5DdFS8pw1FoDR/JdgNCdSM4xC3GSk2SLYs+QSJx
+YG3nQLOAZEvnbiZ4zBZ0wVct4w9jrxtqdq2eS8cLoRVx715MzKPBCGEccYu/py5a
+gkyclr16s0mb+wN49of34AQ+xXguHZGNZzCy6PTbx0IC+sRVe82+RZkj21JG+AFM
+9s+vLgRdtWIEZW1AIYbUUbhuvsne+sidZW5XQuFp1V4LlQbO49oEhrPMBn+oHKg5
+MWIe68bjkqDSnDzG+TEBTWiAhyyGyZcebfCs72DGbYrfKt1uTyi+groumPnvQfJB
+y3kqy2pUFeEkNJkx4BfYL+N7I07s9WTy8UMoqn/OLuyqoFaYMd9XMaOOx3xTy8aw
+pUJ69c3VI66W/Ii1ypk2EPUImWpG/n89Y/8Mk1NbesaZLk9feTDfbM4VNPkQU+7T
+3DNQxPSswSh4nXGURwC46SOu2s1lRA98ZXkP5XhUvTuvfg/e4suq26OqjORHQ5zI
+57NP+uHRrfHGlrQ196j1Maw7W7vkocbEv8/06v6s54CG8ezzD2nt1QrLJqSpUqHo
+qolvgn/PK+gg
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.fullchain b/examples/tls_server-rs/ta/test-ca/rsa/end.fullchain
new file mode 100644
index 0000000..380ec76
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.fullchain
@@ -0,0 +1,81 @@
+-----BEGIN CERTIFICATE-----
+MIIEADCCAmigAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u
+eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE5MDYwOTE3MTUxMloX
+DTI0MTEyOTE3MTUxMlowGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdwbEc6ZKih4mQA916JwctBZgnRmzO
+KERrzlHjfzy8ZfsUJLENQBN8s3RVRwPThReHdp8bpiVRrNmMRxyXoa5oqxWDjXOu
+5W4hoISIMbOAq4Kj8G+eS0UKwypKHwJ1aUzEjWQGKxNpIYvcGqwYpN1Yi1+qTgLg
+2qw1ENtBhrWHhmQruGqDtQTQLe2tbcOuGhIL0cyWIRtEWHWL/wb1Akzhm31WQF+m
+URtYvYonA/Ta7ErONXCxsEXndTR4iT/XognnOhTJ+uIinNwn52y9Te7MYix6SDBE
+VeKZx9v3iOYU81zXf+WaxNqZvTfbPjkLsXiymOgVfGQcO4hiQeLoJIHXAgMBAAGj
+gb4wgbswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFEweXJqS
+BzVcf/00QeOC29OwBQszMEIGA1UdIwQ7MDmAFEKPy8hHZVazpvIsxFcGo4YrkEkw
+oR6kHDAaMRgwFgYDVQQDDA9wb255dG93biBSU0EgQ0GCAXswOwYDVR0RBDQwMoIO
+dGVzdHNlcnZlci5jb22CFXNlY29uZC50ZXN0c2VydmVyLmNvbYIJbG9jYWxob3N0
+MA0GCSqGSIb3DQEBCwUAA4IBgQCViHp2pLcIMzl/wN+sULznLYZvrlynU4AHnL8/
+ba6iSAM6EMlrcu11+UBQglHIN2BEn+Jjas+HT1sQOIOixMgjrMBgirLez8n5DN66
+o5aK5bu23GjQvzq5JEh0skQDHtSFX0YRwqXIhi1spGtObsnoupxJNBQbdAcDv50/
+m6/8WXcPbXBnR+wRywFmjb6+OSVNgCRtBFTbR5XRVHMPEwvSk4hVj4jimlnPHZYL
+3VatCPtZr6iaLZl9E64BbS+J4vPQ0Z/2JMUjtXCuj19k8LO2TTTBz54QVoMF5jrZ
+xotneq+wmPH3lmozEOmyj4+4CmoyNz+RDhrlok84x3g4YEKUQyK1V4ROi9DtL1CV
+VoLfHSwS9SiDdD/Qn2n7RICn6DP2lHozICyHX0Op4W+vETHho7Flsw21bMisAGrl
+wwQ7UYU4XfPOC9hQoCvU60uVe7z+uZvlBY8RwmcW4iFIbfCcPT6Hrom5F1X4Z/dm
+zDW8ZhLDsjUY/D4lUeWjbO1RCHI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
+dG93biBSU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcNMjkwNjA2MTcxNTEyWjAsMSow
+KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
+CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCj/tOFeSW3WB+TtuLCR1L/84lZytFw
+zbpzOTGB1kPEKNbrMsv3lHXm5bHa8Bl3k113k7Hi7OAt/nkMm05s8LcUoovhaG5C
+G7tjzL+ld1nO74gNS3IQHCzxRdRwIgaDZHyICfBQBfB9/m+9z3yRtOKWJl6i/MT9
+HRN6yADW/8gHFlMzRkCKBjIKXehKsu8cbtB+5MukwtXI4rKf9aYXZQOEUn1kEwQJ
+ZIKBXR0eyloQiZervUE7meRCTBvzXT9VoSEX49/mempp4hnfdHlRNzre4/tphBf1
+fRUdpVXZ3DvmzoHdXRVzxx3X5LvDpf7Eb3ViGkXDFwkSfHEhkRnAl4lIzTH/1F25
+stmT8a0PA/lCNMrzJBzkLcuem1G1uMHoQZo1f3OpslJ8gHbE9ZlIbIKmpmJS9oop
+Vh1BH+aOy5doCrF8uOLTQ3d5CqA/EZMGahDHy7IkeNYmG/RXUKNltv+r95gwuRP+
+9UIJ9FTa4REQbIpGWP5XibI6x4LqLTJj+VsCAwEAAaNeMFwwHQYDVR0OBBYEFEKP
+y8hHZVazpvIsxFcGo4YrkEkwMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
+AgEAMzTRDLBExVFlw98AuX+pM+/R2Gjw5KFHvSYLKLbMRfuuZK1yNYYaYtNrtF+V
+a53OFgaZj56o7tXc2PB8kw4MELD0ViR8Do2bvZieFcEe4DwhdjGCjuLehVLT29qI
+7T3N/JkJ5daemKZcRB6Ne0F4+6QlVVNck28HUKbQThl88RdwLUImmSAfgKSt6uJ5
+wlH7wiYQR2vPXwSuEYzwot+L/91eBwuQr4Lovx9+TCKTbwQOKYjX4KfcOOQ1rx0M
+IMrvwWqnabc6m1F0O6//ibL0kuFkJYEgOH2uJA12FBHO+/q2tcytejkOWKWMJj6Y
+2etwIHcpzXaEP7fZ75cFGqcE3s7XGsweBIPLjMP1bKxEcFKzygURm/auUuXBCFBl
+E16PB6JEAeCKe/8VFeyucvjPuQDWB49aq+r2SbpbI4IeZdz/QgEIOb0MpwStrvhH
+9f/DtGMbjvuAEkRoOorK4m5k4GY3LsWTR2bey27AXk8N7pKarpu2N7ChBPm+EV0Y
+H+tAI/OfdZuNUCES00F5UAFdU8zBUZo19ao2ZqfEADimE7Epk2s0bUe4GSqEXJp6
+68oVSMhZmMf/RCSNlr97f34sNiUA1YJ0JbCRZmw8KWNm9H1PARLbrgeRBZ/k31Li
+WLDr3fiEVk7SGxj3zo94cS6AT55DyXLiSD/bFmL1QXgZweA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFFTCCAv2gAwIBAgIUGXgsGl4sGhiPwUPOme5w5jJscVQwDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMB4XDTE5MDYwOTE3MTUxMVoX
+DTI5MDYwNjE3MTUxMVowGjEYMBYGA1UEAwwPcG9ueXRvd24gUlNBIENBMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArpW4WHfSmTCMvnDJaCRL5BR2knDc
+C+T4/wv7i//zsBL3q0YVdBpllWCZx8TSfuXT/1o/Zxdt+H1ZjnH8yuwuHOToE3W0
++Y/912hAPiD+d79A+MtqVX1gayjHDy9HybznTN2Onh1ZhWyks0FLL5SB0vVCLwXP
+W7tcyY0w6wn3RTw4nBu7co5a280cHgHv5V3XeNgteQrnkXE9TfuqqUZwVt0v1jr1
+bk1KaDDD+36wfeO70Q6CeLwKPhN0mPDHdj/lecj4efl0l1B0ehHxLkLuztqtkCF6
++yMoBrEyzJjO6TGMSTMsnw4F9bA15jkIIEQs5FhwVHFOTmu5BG+j37umoy27k5As
+5cV0/djr3r8WhBZ6w2+XjvbAdJPgqc+Xobnx1i5GI4noRC4G4Cl0Vx+iRru1/nsE
+xPazz9UVkiUsDlN9n49f1pik9z74Box6CD6IZVb8h4vV7um+0R4/eErVf/Cyf1Xe
+axVaOgA/CD0ucLdSfDz61O/2PG3P7YjWY1R9zr35e8pakgyFPXnWMbsfniuGkM0X
+6lG743Q7yVt38/HuAqi1AGq+r/AKisrezt97UNm0CryuEk02y4SVLbhuG/V6mBCh
+4Va3KD1ZOgfJcTZbuxebIz6W+5jL80hE0YwBBs8vSv8Fo5N7dYNSNvyMxkoPh8Gw
+CAFyqt5zBLGCEvkCAwEAAaNTMFEwHQYDVR0OBBYEFDjj6hEpDZdjAIdvd9Moe3un
+RvJWMB8GA1UdIwQYMBaAFDjj6hEpDZdjAIdvd9Moe3unRvJWMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACu+Ct6J+Dh3EXFOgjW3gN3CaD0UK0kW
+03u7znNAJBAYhi+MXSTPBdrxYGOPkHF1Jl15qb2fc58+0nakf8bvah8kgxi2ujX8
+vrPBjsAv/ixPvUrcol9ZGrseP5DdFS8pw1FoDR/JdgNCdSM4xC3GSk2SLYs+QSJx
+YG3nQLOAZEvnbiZ4zBZ0wVct4w9jrxtqdq2eS8cLoRVx715MzKPBCGEccYu/py5a
+gkyclr16s0mb+wN49of34AQ+xXguHZGNZzCy6PTbx0IC+sRVe82+RZkj21JG+AFM
+9s+vLgRdtWIEZW1AIYbUUbhuvsne+sidZW5XQuFp1V4LlQbO49oEhrPMBn+oHKg5
+MWIe68bjkqDSnDzG+TEBTWiAhyyGyZcebfCs72DGbYrfKt1uTyi+groumPnvQfJB
+y3kqy2pUFeEkNJkx4BfYL+N7I07s9WTy8UMoqn/OLuyqoFaYMd9XMaOOx3xTy8aw
+pUJ69c3VI66W/Ii1ypk2EPUImWpG/n89Y/8Mk1NbesaZLk9feTDfbM4VNPkQU+7T
+3DNQxPSswSh4nXGURwC46SOu2s1lRA98ZXkP5XhUvTuvfg/e4suq26OqjORHQ5zI
+57NP+uHRrfHGlrQ196j1Maw7W7vkocbEv8/06v6s54CG8ezzD2nt1QrLJqSpUqHo
+qolvgn/PK+gg
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.key b/examples/tls_server-rs/ta/test-ca/rsa/end.key
new file mode 100644
index 0000000..5963744
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdwbEc6ZKih4mQ
+A916JwctBZgnRmzOKERrzlHjfzy8ZfsUJLENQBN8s3RVRwPThReHdp8bpiVRrNmM
+RxyXoa5oqxWDjXOu5W4hoISIMbOAq4Kj8G+eS0UKwypKHwJ1aUzEjWQGKxNpIYvc
+GqwYpN1Yi1+qTgLg2qw1ENtBhrWHhmQruGqDtQTQLe2tbcOuGhIL0cyWIRtEWHWL
+/wb1Akzhm31WQF+mURtYvYonA/Ta7ErONXCxsEXndTR4iT/XognnOhTJ+uIinNwn
+52y9Te7MYix6SDBEVeKZx9v3iOYU81zXf+WaxNqZvTfbPjkLsXiymOgVfGQcO4hi
+QeLoJIHXAgMBAAECggEATFl3xWCV3+eScUcjZf8x9UpLzJnutDwg8o0inJUeMC9c
+dt77Jni9PN38W7ALnTPhmf45YaeeibRdYnLJYVuFVPwyeAynm7vaYzGE7+9MwixK
+2m7Zv0JjDwWK9eIfUpVinPmhSo5iLHwkTy/PuNxqaSXzVgtt6kTfrZWUJ8ddkL8M
+bMQTvSLByspyZq/9n6Xq4cy1kummrYgluGKrh6+b+3/ff4wTfF9txlecM+te0uoI
+nu5jTRGGSouKKiOWLLkQNPCqrSmy/VfQLkacs3l8Y89Fo4TlBU6MEb02u+fCQ/58
+q1E8Y7J1/Yjv2VTwav9q1EX9/ncA8b2C0K1Ylgh9QQKBgQD2bZwI03z4Zpo1TnxU
+d4r0qWVExY7fP9BfJPEn3KE4zlPXbiiNazMprdFoIUEtKNcl77ZYVcvNLCUDOWzj
+maYtVJm7wuUPcJQU2becuw6N7yZJd9mfXPOiBWmv8Df5AJJymdUcXqMySi9eFr1m
+SwFhrsFRTs8Fo0bGrw8UTMM72QKBgQDmXsHt80+F7YuVUrVMuhTTr/DqwHgqyCQ1
+zQXuOeGDaFPSYzgk6XEPPJU+Kil+bFIY7DaMokVHWvJJ9e9iF8fjflSnp2pp1BWa
+t3D+I3zfX+SCioD8KXcFiMfoH9bqIfBzaQfeMNgqMbR0fpsf/l0n/cwJRQ4KGU7s
+puXqY0aNLwKBgEa2kU3fEj9dgebGDNtYKmGmsk6XujXJ5AtJWIItx327h0eMbsqV
+9mqBXFPbJw7EZ2iVbufORtsrTbutINf24T6kxjCg7oYNshCBoTSyYKzN8VinsaUP
+UUIu93LrJcSoK14DUqn/ZikqLIl9UQAnic/0C7k/OhzOC6M73MHgfS2RAoGBAM0O
+y9DjI4YzTGw+kuMZQDCuC+TqLgzm2lSJix3ip7oww2wipXc11E2bv7z2Crld8jX9
+DRFh4AkEC2eKYusN//+gE/qoKzDId/KgFxQgwqaS1PTeFLJgtnFWr5sPvF3sl/wj
+Ib3F/KSSWe7YQ3zXDlTqtRQLQ9P5cydz6HQaqlJBAoGBAL3xNfmStaUFV4moms64
+fZ755LqQwN5rwjZLxmRTsOgVI/KPEg44xvbcG885eNW+JhYSPUyvkrP6Qb+I8PEN
+qdMPUgTetOrnA4T9yf7+U/xHghDSb3BEQKyGlrbRO2GB/iGa3xHD963WozDzeAfQ
+uxrLrUaQjPsf2AEhrHk8slgM
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.req b/examples/tls_server-rs/ta/test-ca/rsa/end.req
new file mode 100644
index 0000000..2d0e770
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.req
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICXjCCAUYCAQAwGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdwbEc6ZKih4mQA916JwctBZgnRmzOKERr
+zlHjfzy8ZfsUJLENQBN8s3RVRwPThReHdp8bpiVRrNmMRxyXoa5oqxWDjXOu5W4h
+oISIMbOAq4Kj8G+eS0UKwypKHwJ1aUzEjWQGKxNpIYvcGqwYpN1Yi1+qTgLg2qw1
+ENtBhrWHhmQruGqDtQTQLe2tbcOuGhIL0cyWIRtEWHWL/wb1Akzhm31WQF+mURtY
+vYonA/Ta7ErONXCxsEXndTR4iT/XognnOhTJ+uIinNwn52y9Te7MYix6SDBEVeKZ
+x9v3iOYU81zXf+WaxNqZvTfbPjkLsXiymOgVfGQcO4hiQeLoJIHXAgMBAAGgADAN
+BgkqhkiG9w0BAQsFAAOCAQEAHEAC9m+IEG1oOR+kDvEm/voON3DT3+QhNGUjLus8
+sodZVLsORkrpY3ZO3JCx0Cq+NatFWFFq/kTySbh0GBROmB8ckglO/7UtciKjsT1j
+3GtgOcXsB03BScZ/Mxhb6hXKubpprVVcOeSKvGPkQQBCjhwPcwvUm0J5u7heKGRb
+A9ITUmEFEh4dg20dGgCZfT5CXGRytALRV3wdDegw7xhIEn5gpbKWDozZ1z2Td0Sb
+JL/FG1w3apgdzGGey2T6B4PV9EbOk5tkYhDNVpRz5WEOzC723vCiMfJAzm19JbrY
++RNL5QxwRLK3awPrnhVcCQOwpCLAr4C4jJLFZ1C3HELX9Q==
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/end.rsa b/examples/tls_server-rs/ta/test-ca/rsa/end.rsa
new file mode 100644
index 0000000..4ba9c7a
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/end.rsa
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA3cGxHOmSooeJkAPdeicHLQWYJ0ZszihEa85R4388vGX7FCSx
+DUATfLN0VUcD04UXh3afG6YlUazZjEccl6GuaKsVg41zruVuIaCEiDGzgKuCo/Bv
+nktFCsMqSh8CdWlMxI1kBisTaSGL3BqsGKTdWItfqk4C4NqsNRDbQYa1h4ZkK7hq
+g7UE0C3trW3DrhoSC9HMliEbRFh1i/8G9QJM4Zt9VkBfplEbWL2KJwP02uxKzjVw
+sbBF53U0eIk/16IJ5zoUyfriIpzcJ+dsvU3uzGIsekgwRFXimcfb94jmFPNc13/l
+msTamb032z45C7F4spjoFXxkHDuIYkHi6CSB1wIDAQABAoIBAExZd8Vgld/nknFH
+I2X/MfVKS8yZ7rQ8IPKNIpyVHjAvXHbe+yZ4vTzd/FuwC50z4Zn+OWGnnom0XWJy
+yWFbhVT8MngMp5u72mMxhO/vTMIsStpu2b9CYw8FivXiH1KVYpz5oUqOYix8JE8v
+z7jcamkl81YLbepE362VlCfHXZC/DGzEE70iwcrKcmav/Z+l6uHMtZLppq2IJbhi
+q4evm/t/33+ME3xfbcZXnDPrXtLqCJ7uY00RhkqLiiojliy5EDTwqq0psv1X0C5G
+nLN5fGPPRaOE5QVOjBG9NrvnwkP+fKtRPGOydf2I79lU8Gr/atRF/f53APG9gtCt
+WJYIfUECgYEA9m2cCNN8+GaaNU58VHeK9KllRMWO3z/QXyTxJ9yhOM5T124ojWsz
+Ka3RaCFBLSjXJe+2WFXLzSwlAzls45mmLVSZu8LlD3CUFNm3nLsOje8mSXfZn1zz
+ogVpr/A3+QCScpnVHF6jMkovXha9ZksBYa7BUU7PBaNGxq8PFEzDO9kCgYEA5l7B
+7fNPhe2LlVK1TLoU06/w6sB4KsgkNc0F7jnhg2hT0mM4JOlxDzyVPiopfmxSGOw2
+jKJFR1rySfXvYhfH435Up6dqadQVmrdw/iN831/kgoqA/Cl3BYjH6B/W6iHwc2kH
+3jDYKjG0dH6bH/5dJ/3MCUUOChlO7Kbl6mNGjS8CgYBGtpFN3xI/XYHmxgzbWCph
+prJOl7o1yeQLSViCLcd9u4dHjG7KlfZqgVxT2ycOxGdolW7nzkbbK027rSDX9uE+
+pMYwoO6GDbIQgaE0smCszfFYp7GlD1FCLvdy6yXEqCteA1Kp/2YpKiyJfVEAJ4nP
+9Au5PzoczgujO9zB4H0tkQKBgQDNDsvQ4yOGM0xsPpLjGUAwrgvk6i4M5tpUiYsd
+4qe6MMNsIqV3NdRNm7+89gq5XfI1/Q0RYeAJBAtnimLrDf//oBP6qCswyHfyoBcU
+IMKmktT03hSyYLZxVq+bD7xd7Jf8IyG9xfykklnu2EN81w5U6rUUC0PT+XMnc+h0
+GqpSQQKBgQC98TX5krWlBVeJqJrOuH2e+eS6kMDea8I2S8ZkU7DoFSPyjxIOOMb2
+3BvPOXjVviYWEj1Mr5Kz+kG/iPDxDanTD1IE3rTq5wOE/cn+/lP8R4IQ0m9wRECs
+hpa20Tthgf4hmt8Rw/et1qMw83gH0Lsay61GkIz7H9gBIax5PLJYDA==
+-----END RSA PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/inter.cert b/examples/tls_server-rs/ta/test-ca/rsa/inter.cert
new file mode 100644
index 0000000..74d4a01
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/inter.cert
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255
+dG93biBSU0EgQ0EwHhcNMTkwNjA5MTcxNTEyWhcNMjkwNjA2MTcxNTEyWjAsMSow
+KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G
+CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCj/tOFeSW3WB+TtuLCR1L/84lZytFw
+zbpzOTGB1kPEKNbrMsv3lHXm5bHa8Bl3k113k7Hi7OAt/nkMm05s8LcUoovhaG5C
+G7tjzL+ld1nO74gNS3IQHCzxRdRwIgaDZHyICfBQBfB9/m+9z3yRtOKWJl6i/MT9
+HRN6yADW/8gHFlMzRkCKBjIKXehKsu8cbtB+5MukwtXI4rKf9aYXZQOEUn1kEwQJ
+ZIKBXR0eyloQiZervUE7meRCTBvzXT9VoSEX49/mempp4hnfdHlRNzre4/tphBf1
+fRUdpVXZ3DvmzoHdXRVzxx3X5LvDpf7Eb3ViGkXDFwkSfHEhkRnAl4lIzTH/1F25
+stmT8a0PA/lCNMrzJBzkLcuem1G1uMHoQZo1f3OpslJ8gHbE9ZlIbIKmpmJS9oop
+Vh1BH+aOy5doCrF8uOLTQ3d5CqA/EZMGahDHy7IkeNYmG/RXUKNltv+r95gwuRP+
+9UIJ9FTa4REQbIpGWP5XibI6x4LqLTJj+VsCAwEAAaNeMFwwHQYDVR0OBBYEFEKP
+y8hHZVazpvIsxFcGo4YrkEkwMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC
+AgEAMzTRDLBExVFlw98AuX+pM+/R2Gjw5KFHvSYLKLbMRfuuZK1yNYYaYtNrtF+V
+a53OFgaZj56o7tXc2PB8kw4MELD0ViR8Do2bvZieFcEe4DwhdjGCjuLehVLT29qI
+7T3N/JkJ5daemKZcRB6Ne0F4+6QlVVNck28HUKbQThl88RdwLUImmSAfgKSt6uJ5
+wlH7wiYQR2vPXwSuEYzwot+L/91eBwuQr4Lovx9+TCKTbwQOKYjX4KfcOOQ1rx0M
+IMrvwWqnabc6m1F0O6//ibL0kuFkJYEgOH2uJA12FBHO+/q2tcytejkOWKWMJj6Y
+2etwIHcpzXaEP7fZ75cFGqcE3s7XGsweBIPLjMP1bKxEcFKzygURm/auUuXBCFBl
+E16PB6JEAeCKe/8VFeyucvjPuQDWB49aq+r2SbpbI4IeZdz/QgEIOb0MpwStrvhH
+9f/DtGMbjvuAEkRoOorK4m5k4GY3LsWTR2bey27AXk8N7pKarpu2N7ChBPm+EV0Y
+H+tAI/OfdZuNUCES00F5UAFdU8zBUZo19ao2ZqfEADimE7Epk2s0bUe4GSqEXJp6
+68oVSMhZmMf/RCSNlr97f34sNiUA1YJ0JbCRZmw8KWNm9H1PARLbrgeRBZ/k31Li
+WLDr3fiEVk7SGxj3zo94cS6AT55DyXLiSD/bFmL1QXgZweA=
+-----END CERTIFICATE-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/inter.key b/examples/tls_server-rs/ta/test-ca/rsa/inter.key
new file mode 100644
index 0000000..6e8d0b1
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/inter.key
@@ -0,0 +1,40 @@
+-----BEGIN PRIVATE KEY-----
+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
+wbmf/gQDf47Q5OUrJFUFLoA=
+-----END PRIVATE KEY-----
diff --git a/examples/tls_server-rs/ta/test-ca/rsa/inter.req b/examples/tls_server-rs/ta/test-ca/rsa/inter.req
new file mode 100644
index 0000000..d8d2d21
--- /dev/null
+++ b/examples/tls_server-rs/ta/test-ca/rsa/inter.req
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIDcTCCAdkCAQAwLDEqMCgGA1UEAwwhcG9ueXRvd24gUlNBIGxldmVsIDIgaW50
+ZXJtZWRpYXRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAo/7ThXkl
+t1gfk7biwkdS//OJWcrRcM26czkxgdZDxCjW6zLL95R15uWx2vAZd5Ndd5Ox4uzg
+Lf55DJtObPC3FKKL4WhuQhu7Y8y/pXdZzu+IDUtyEBws8UXUcCIGg2R8iAnwUAXw
+ff5vvc98kbTiliZeovzE/R0TesgA1v/IBxZTM0ZAigYyCl3oSrLvHG7QfuTLpMLV
+yOKyn/WmF2UDhFJ9ZBMECWSCgV0dHspaEImXq71BO5nkQkwb810/VaEhF+Pf5npq
+aeIZ33R5UTc63uP7aYQX9X0VHaVV2dw75s6B3V0Vc8cd1+S7w6X+xG91YhpFwxcJ
+EnxxIZEZwJeJSM0x/9RdubLZk/GtDwP5QjTK8yQc5C3LnptRtbjB6EGaNX9zqbJS
+fIB2xPWZSGyCpqZiUvaKKVYdQR/mjsuXaAqxfLji00N3eQqgPxGTBmoQx8uyJHjW
+Jhv0V1CjZbb/q/eYMLkT/vVCCfRU2uEREGyKRlj+V4myOseC6i0yY/lbAgMBAAGg
+ADANBgkqhkiG9w0BAQsFAAOCAYEAnqABrq2Km2GcMieCoWZg4uQmJ/iFKtNopKUH
+BCEoUX8SFkq7nHnufZyZtC9hzpTB/aJ3ycFkA/qKmK2FY8glVnyYi+At2utfiwio
+SaOAcnD5xNY+HN488wYX/WfZvtnPLVUkCGzvUJ1tMHgxUa7U8pQRayDtwpgsKm2s
+R8k5v7U2uxPfYrdwwFaF9ptaSBYUUcT5+I8apxWhEHGT3mW355+59a9Btb/bJbRq
+SuX6Gsq6mYIZxdFpNV7mSxMQAcKudILQU7hqqNPjdfzvI0oQhgC7NXv9jtszbsta
+K3u2KYlVq6C0wbjwpRzubdLHQ7Z21z4E4s0fbWc3jVJc2DTioVk9j9TLjSH3gDS2
+AjqjCowKtHQb5Ty0BNokWb4RNwJ8lHZIib9CGqYhpAx6luKnVi/rnghsIv8RItPG
+ba0eA4FylVYSXNWAgnjZLBcYrQwuNpC0RVoH5vsXZj9ah6c+RUc0PZ/s63B6X1dO
+6dlPwNvasXRLZJvO0vRjNX6F2u7Y
+-----END CERTIFICATE REQUEST-----
diff --git a/examples/tls_server-rs/uuid.txt b/examples/tls_server-rs/uuid.txt
new file mode 100644
index 0000000..d12f3ea
--- /dev/null
+++ b/examples/tls_server-rs/uuid.txt
@@ -0,0 +1 @@
+69547de6-f47e-11eb-994e-f34e88d5c2b4
diff --git a/tests/optee-qemuv8.sh b/tests/optee-qemuv8.sh
index f47a7e3..ff2829b 100755
--- a/tests/optee-qemuv8.sh
+++ b/tests/optee-qemuv8.sh
@@ -31,5 +31,5 @@
     -kernel Image -no-acpi \
     -fsdev local,id=fsdev0,path=$(pwd)/../shared,security_model=none \
     -device virtio-9p-device,fsdev=fsdev0,mount_tag=host \
-    -netdev user,id=vmnic \
+    -netdev user,id=vmnic,hostfwd=:127.0.0.1:54433-:4433 \
     -device virtio-net-device,netdev=vmnic
diff --git a/tests/test_tls_server.sh b/tests/test_tls_server.sh
new file mode 100755
index 0000000..64e4035
--- /dev/null
+++ b/tests/test_tls_server.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+set -xe
+
+rm -rf screenlog.0
+rm -rf openssl.log
+rm -rf optee-qemuv8-3.17.0-ubuntu-20.04
+rm -rf shared
+
+curl https://nightlies.apache.org/teaclave/teaclave-trustzone-sdk/optee-qemuv8-3.17.0-ubuntu-20.04-expand-ta-memory.tar.gz | tar zxv
+mkdir shared
+cp ../examples/tls_server-rs/ta/target/aarch64-unknown-optee-trustzone/release/*.ta shared
+cp ../examples/tls_server-rs/host/target/aarch64-unknown-linux-gnu/release/tls_server-rs shared
+
+screen -L -d -m -S qemu_screen ./optee-qemuv8.sh
+sleep 30
+screen -S qemu_screen -p 0 -X stuff "root\n"
+sleep 5
+screen -S qemu_screen -p 0 -X stuff "mkdir shared && mount -t 9p -o trans=virtio host shared && cd shared\n"
+sleep 5
+screen -S qemu_screen -p 0 -X stuff "cp *.ta /lib/optee_armtz/\n"
+sleep 5
+screen -S qemu_screen -p 0 -X stuff "./tls_server-rs\n"
+sleep 5
+echo "Q" | openssl s_client -connect 127.0.0.1:54433 -debug > openssl.log 2>&1
+sleep 5
+screen -S qemu_screen -p 0 -X stuff "^C"
+
+{
+	grep -q "DONE" openssl.log
+} || {
+	cat -v screenlog.0
+	cat -v /tmp/serial.log
+	cat -v openssl.log
+	false
+}
+
+rm -rf screenlog.0
+rm -rf openssl.log
+rm -rf optee-qemuv8-3.17.0-ubuntu-20.04
+rm -rf shared