Skip to main content

XChaCha20Poly1305

Struct XChaCha20Poly1305 

Source
pub struct XChaCha20Poly1305 { /* private fields */ }
Expand description

XChaCha20-Poly1305: ChaCha20-Poly1305 with a 192-bit nonce (draft-irtf-cfrg-xchacha-03).

The first 16 bytes of the nonce and the key give a subkey through HChaCha20; the last 8, after four zero bytes, are the nonce ChaCha20-Poly1305 runs with under that subkey.

The point is the nonce’s length. A 96-bit nonce drawn at random collides often enough that a long-lived key cannot use one; a 192-bit one does not, so seal_with_random_nonce draws each nonce and needs no counter kept anywhere. That is what to use. Passing a nonce by hand through Aead is for a protocol that dictates one, and carries the same rule as every AEAD: never twice under one key.

The specification is an Internet-Draft that expired in 2020 without becoming an RFC. The construction is what libsodium, Go and Tink implement, and it is checked here against the draft’s vectors and Project Wycheproof’s.

Implementations§

Source§

impl XChaCha20Poly1305

Source

pub fn seal_with_random_nonce<R: RandomSource + ?Sized>( &self, rng: &mut R, aad: &[u8], in_out: &mut [u8], tag: &mut [u8], ) -> Result<[u8; 24]>

Seal under a nonce drawn from rng, and return the nonce.

The nonce is not secret; send it with the ciphertext. Pass ic_drbg::Rng, not raw OS bytes.

Trait Implementations§

Source§

impl Aead for XChaCha20Poly1305

Source§

const KEY_LEN: usize = 32

Key length in bytes.
Source§

const NONCE_LEN: usize = 24

Nonce length in bytes.
Source§

const TAG_LEN: usize = 16

Authentication tag length in bytes.
Source§

fn new(key: &[u8]) -> Result<Self>

Bind a key to a cipher instance.
Source§

fn seal_detached( &self, nonce: &[u8], aad: &[u8], in_out: &mut [u8], tag: &mut [u8], ) -> Result<()>

Encrypt in_out in place and write the tag to tag.
Source§

fn open_detached( &self, nonce: &[u8], aad: &[u8], in_out: &mut [u8], tag: &[u8], ) -> Result<()>

Verify tag and decrypt in_out in place. Read more
Source§

impl Algorithm for XChaCha20Poly1305

Source§

const ID: &'static str = "xchacha20-poly1305"

Stable ontology identifier for this algorithm.
Source§

const NAME: &'static str = "XChaCha20-Poly1305"

Human-facing display name (for example "SHA-256").
Source§

impl Drop for XChaCha20Poly1305

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl SelfTest for XChaCha20Poly1305

Source§

fn self_test() -> Result<()>

The AEAD vector of draft-irtf-cfrg-xchacha-03 appendix A.3.1, sealed and opened.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.