# OpenMLS Traits
This crate defines a number of crates that have to be implemented in order to use OpenMLS.
The OpenMLS repository provides a default implementation for these traits
- [Rust Crypto](../openmls_rust_crypto/README.md)
**⚠️ These traits are responsible for all cryptographic operations and randomness within OpenMLS. Please ensure you know what you're doing when implementing your own versions.**
## Traits
There are 4 different traits.
### OpenMlsRand
This [trait](./src/random.rs) defines two functions to generate arrays and vectors, and is used by OpenMLS to generate randomness.
### OpenMlsCrypto
This [trait](./src/crypto.rs) defines all cryptographic functions required by OpenMLS, in particular
- HKDF
- Hashing
- AEAD
- Signatures
- HPKE
### StorageProvider
This [trait](./src/storage.rs) defines a CRUD API for a key store that is used to store long-term key material from OpenMLS.
### OpenMlsCryptoProvider
Additionally, there's a wrapper [trait](./src/traits.rs) defined that is expected to be passed into the public OpenMLS API.
## Types
For interoperability this crate also defines a number of [types](./src/types.rs) and algorithm identifiers.