[−][src]Module orion::hazardous::aead::xchacha20poly1305
AEAD XChaCha20Poly1305 as specified in the draft RFC.
Parameters:
secret_key
: The secret key.nonce
: The nonce value.ad
: Additional data to authenticate (this is not encrypted and can beNone
).ciphertext_with_tag
: The encrypted data with the corresponding 16 byte Poly1305 tag appended to it.plaintext
: The data to be encrypted.dst_out
: Destination array that will hold theciphertext_with_tag
/plaintext
after encryption/decryption.
ad
: "A typical use for these data is to authenticate version numbers,
timestamps or monotonically increasing counters in order to discard previous
messages and prevent replay attacks." See libsodium docs for more information.
Errors:
An error will be returned if:
- The length of
dst_out
is less thanplaintext
+POLY1305_OUTSIZE
when callingseal()
. - The length of
dst_out
is less thanciphertext_with_tag
-POLY1305_OUTSIZE
when callingopen()
. - The length of the
ciphertext_with_tag
is not at leastPOLY1305_OUTSIZE
. - The received tag does not match the calculated tag when calling
open()
. plaintext.len()
+POLY1305_OUTSIZE
overflows when callingseal()
.- Converting
usize
tou64
would be a lossy conversion.
Panics:
A panic will occur if:
- More than
2^32-1 * 64
bytes of data are processed.
Security:
- It is critical for security that a given nonce is not re-used with a given key. Should this happen, the security of all data that has been encrypted with that given key is compromised.
- Only a nonce for XChaCha20Poly1305 is big enough to be randomly generated
using a CSPRNG.
Nonce::generate()
can be used for this. - To securely generate a strong key, use
SecretKey::generate()
. - The length of the
plaintext
is not hidden, only its contents.
Recommendation:
- It is recommended to use XChaCha20Poly1305 when possible.
Example:
use orion::hazardous::aead; let secret_key = aead::xchacha20poly1305::SecretKey::generate(); let nonce = aead::xchacha20poly1305::Nonce::generate(); let ad = "Additional data".as_bytes(); let message = "Data to protect".as_bytes(); // Length of the above message is 15 and then we accommodate 16 for the Poly1305 // tag. let mut dst_out_ct = [0u8; 15 + 16]; let mut dst_out_pt = [0u8; 15]; // Encrypt and place ciphertext + tag in dst_out_ct aead::xchacha20poly1305::seal(&secret_key, &nonce, message, Some(&ad), &mut dst_out_ct)?; // Verify tag, if correct then decrypt and place message in dst_out_pt aead::xchacha20poly1305::open(&secret_key, &nonce, &dst_out_ct, Some(&ad), &mut dst_out_pt)?; assert_eq!(dst_out_pt.as_ref(), message.as_ref());
Re-exports
pub use crate::hazardous::stream::chacha20::SecretKey; |
pub use crate::hazardous::stream::xchacha20::Nonce; |
Functions
open | AEAD XChaCha20Poly1305 decryption as specified in the draft RFC. |
seal | AEAD XChaCha20Poly1305 encryption as specified in the draft RFC. |