sodium-alloc 0.1.1

Allocator type that allocates memory using Sodium's secure memory utilities
Documentation
# sodium-alloc
[![crates.io](https://img.shields.io/crates/v/sodium-alloc.svg)](https://crates.io/crates/sodium-alloc)
[![docs.rs](https://docs.rs/sodium-alloc/badge.svg)](https://docs.rs/sodium-alloc)

Rust [`Allocator`](https://doc.rust-lang.org/std/alloc/trait.Allocator.html)
type that allocates memory using [Sodium](https://doc.libsodium.org/)'s secure
memory utilities.

**Requires nightly Rust**, as the `Allocator` API is not yet stable.

This library implements `SodiumAllocator`, an `Allocator` which uses the
[`sodium_malloc`](https://doc.libsodium.org/memory_management#guarded-heap-allocations)
and corresponding `sodium_free` functions to manage memory. When managing
sensitive data in memory, there are a number of steps we can take to help harden
our software against revealing these secrets.

Sodium's `sodium_malloc` implementation introduces many of these hardening steps
to the memory management process: Allocated memory is placed at the end of a
page boundary, immediately followed by a guard page (a region of memory which is
marked as inaccessible, any attempt to access it will result in termination of
the program). A canary is placed before the allocated memory, any modifications
to which are detected on free, again resulting in program termination, and a
guard page is placed before this.
[`sodium_mlock`](https://doc.libsodium.org/memory_management#locking-memory) is
used to instruct the operating system not to swap the memory to disk, or to
include it in core dumps.

When memory is freed with `SodiumAllocator`, the `sodium_free` function is
called, which will securely zero the memory before marking it as free. This
means that for types allocated with `SodiumAllocator`, there is no need to
implement `Zeroize` or a similar `Drop` implementation to zero the memory when
no longer in use: It will automatically be zeroed when freed.

This library is not suitable for use as a general-purpose allocator or global
allocator: The overhead of this API is *much* greater than Rust's standard
allocator, and the implementation is more likely to encounter errors. It is
intended for use when allocating sensitive data types only, for example, a key
or password which needs to be stored in memory.

## Security/Vulnerability Disclosures
If you find a vulnerability in sodium-alloc, please immediately contact
`tom25519@pm.me` with details.

My [age](https://github.com/FiloSottile/age) public key (preferred) is:

```text
age1gglesedq4m2z9kc7urjhq3zlpc6qewcwpcna7s0lwh8k2c4e6fxqf3kdvq
```

My PGP public key has fingerprint `0x4712EC7C9F404B14`, and is available from
[keyserver.ubuntu.com](https://keyserver.ubuntu.com),
[pgp.mit.edu](https://pgp.mit.edu/), or
[Github](https://github.com/tom25519.gpg).

## License
Licensed under either of:

 * Apache License, Version 2.0 ([LICENSE-APACHE]LICENSE-APACHE or
   http://www.apache.org/licenses/LICENSE-2.0)
 * MIT license ([LICENSE-MIT]LICENSE-MIT or
   http://opensource.org/licenses/MIT)

at your option.

## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.