|  | # [RustCrypto]: zeroize | 
|  |  | 
|  | [![Crate][crate-image]][crate-link] | 
|  | [![Docs][docs-image]][docs-link] | 
|  | ![Apache 2.0/MIT Licensed][license-image] | 
|  | ![MSRV][rustc-image] | 
|  | [![Build Status][build-image]][build-link] | 
|  |  | 
|  | Securely zero memory (a.k.a. [zeroize]) while avoiding compiler optimizations. | 
|  |  | 
|  | This crate implements a portable approach to securely zeroing memory using | 
|  | techniques which guarantee they won't be "optimized away" by the compiler. | 
|  |  | 
|  | The [`Zeroize` trait] is the crate's primary API. | 
|  |  | 
|  | [Documentation] | 
|  |  | 
|  | ## About | 
|  |  | 
|  | [Zeroing memory securely is hard] - compilers optimize for performance, and | 
|  | in doing so they love to "optimize away" unnecessary zeroing calls. There are | 
|  | many documented "tricks" to attempt to avoid these optimizations and ensure | 
|  | that a zeroing routine is performed reliably. | 
|  |  | 
|  | This crate isn't about tricks: it uses [core::ptr::write_volatile] | 
|  | and [core::sync::atomic] memory fences to provide easy-to-use, portable | 
|  | zeroing behavior which works on all of Rust's core number types and slices | 
|  | thereof, implemented in pure Rust with no usage of FFI or assembly. | 
|  |  | 
|  | - No insecure fallbacks! | 
|  | - No dependencies! | 
|  | - No FFI or inline assembly! **WASM friendly** (and tested)! | 
|  | - `#![no_std]` i.e. **embedded-friendly**! | 
|  | - No functionality besides securely zeroing memory! | 
|  | - (Optional) Custom derive support for zeroing complex structures | 
|  |  | 
|  | ## Minimum Supported Rust Version | 
|  |  | 
|  | Rust **1.60** or newer. | 
|  |  | 
|  | In the future, we reserve the right to change MSRV (i.e. MSRV is out-of-scope | 
|  | for this crate's SemVer guarantees), however when we do it will be accompanied by | 
|  | a minor version bump. | 
|  |  | 
|  | ## License | 
|  |  | 
|  | Licensed under either of: | 
|  |  | 
|  | * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) | 
|  | * [MIT license](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. | 
|  |  | 
|  | [//]: # (badges) | 
|  |  | 
|  | [crate-image]: https://img.shields.io/crates/v/zeroize.svg | 
|  | [crate-link]: https://crates.io/crates/zeroize | 
|  | [docs-image]: https://docs.rs/zeroize/badge.svg | 
|  | [docs-link]: https://docs.rs/zeroize/ | 
|  | [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg | 
|  | [rustc-image]: https://img.shields.io/badge/rustc-1.60+-blue.svg | 
|  | [build-image]: https://github.com/RustCrypto/utils/actions/workflows/zeroize.yml/badge.svg | 
|  | [build-link]: https://github.com/RustCrypto/utils/actions/workflows/zeroize.yml | 
|  |  | 
|  | [//]: # (general links) | 
|  |  | 
|  | [RustCrypto]: https://github.com/RustCrypto | 
|  | [zeroize]: https://en.wikipedia.org/wiki/Zeroisation | 
|  | [`Zeroize` trait]: https://docs.rs/zeroize/latest/zeroize/trait.Zeroize.html | 
|  | [Documentation]: https://docs.rs/zeroize/ | 
|  | [Zeroing memory securely is hard]: http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html | 
|  | [core::ptr::write_volatile]: https://doc.rust-lang.org/core/ptr/fn.write_volatile.html | 
|  | [core::sync::atomic]: https://doc.rust-lang.org/stable/core/sync/atomic/index.html | 
|  | [good cryptographic hygiene]: https://github.com/veorq/cryptocoding#clean-memory-of-secret-data |