# embedded-mbedtls
An [Mbed TLS](https://www.trustedfirmware.org/projects/mbed-tls/) Rust wrapper
for constrained embedded devices.
Currently, this project is developed with `no_std` CoAPs and LwM2M devices in mind, though usage
is not limited to these use cases. Targeting CoAPs and LwM2M, it uses a static Mbed TLS configuration:
- DTLS support
- (D)TLS 1.2
- Client-only
- `TLS_PSK_WITH_AES_128_CCM_8` cipher suite support
- CTR_DRBG pseudo-random number generator support
In the future, a dynamic configuration using Rust features might be implemented, but there is
currently no roadmap to do so.
### Platform abstraction
- Networking with [`embedded_nal`](https://docs.rs/embedded-nal/latest/embedded_nal/)
- Timing with [`embedded_timers`](https://docs.rs/embedded-timers/latest/embedded_timers/)
- Random Number Generation with [`rand_core`](https://docs.rs/rand_core/latest/rand_core/)
## Usage Example
In addition to the following example code, also have a look at the example directory in the
git repository. Due to the strong focus on `no_std` environments, the repository contains
working examples for `no_std` hardware.
```rust
use embedded_mbedtls::ssl::{SslConnection, SslContext, Preset};
use nb::block;
// Assuming the variables in use contain a valid hardware abstraction and the server address
// Create the hardware context
let mut ctx = SslContext::new_udp_client_side(net_stack, clock, rng, server_addr);
// Create and configure the connection instance
let mut connection = SslConnection::new_dtls_client(&mut ctx, Preset::Default).unwrap();
connection
.configure_psk(&[1, 2, 3, 4], "embedded-mbedtls".as_bytes())
.unwrap();
// Set up connection
block!(connection.handshake()).unwrap();
// Send data
block!(connection.write("Hello, embedded-mbedtls".as_bytes())).unwrap();
// Receive data
let mut buf = [0u8; 1024];
let len = block!(connection.read(&mut buf)).unwrap();
// Close connection
block!(connection.close_notify()).unwrap();
```
## Features
- `alloc`: enables use of heap allocated contexts, see the explanation in
[`SslConnection`](ssl::SslConnection)
## License
Open Logistics License\
Version 1.3, January 2023
See the LICENSE file in the top-level directory.
## Contact
Fraunhofer IML Embedded Rust Group - <embedded-rust@iml.fraunhofer.de>