libsodium_crypto_stream_xsalsa20 (libsodium v3.0.1)

View Source

The XSalsa20 stream cipher: Salsa20 extended with a 192-bit nonce, which is long enough to be chosen at random for every message. It is the cipher behind libsodium_crypto_stream and libsodium_crypto_secretbox.

crypto_stream_xsalsa20/3 returns raw keystream, 'xor'/3 encrypts or decrypts by combining a message with it, and xor_ic/4 starts at a given 64-byte block counter.

This is not authenticated encryption: ciphertexts can be modified without detection, so pair it with a MAC or use libsodium_crypto_secretbox instead. A nonce must never be reused with the same key.

K = libsodium_crypto_stream_xsalsa20:keygen(),
N = libsodium_randombytes:buf(libsodium_crypto_stream_xsalsa20:noncebytes()),
C = libsodium_crypto_stream_xsalsa20:'xor'(<<"message">>, N, K),
<<"message">> = libsodium_crypto_stream_xsalsa20:'xor'(C, N, K).

Summary

Types

k()

A crypto_stream_xsalsa20_KEYBYTES (32-byte) binary.

n()

A crypto_stream_xsalsa20_NONCEBYTES (24-byte) binary.

Functions

Return CLen bytes of keystream for the noncebytes/0 byte nonce N and the keybytes/0 byte key K.

Return crypto_stream_xsalsa20_keybytes(), in bytes.

Generate a random keybytes/0 byte key.

Return crypto_stream_xsalsa20_messagebytes_max(), in bytes.

Return crypto_stream_xsalsa20_noncebytes(), in bytes.

Encrypt or decrypt M by combining it with the keystream for the nonce N and key K, starting at block counter 0.

Like 'xor'/3, but start at the 64-byte block counter IC, so the message is combined with the keystream from byte IC * 64 onwards.

Types

k()

-type k() :: <<_:256>>.

A crypto_stream_xsalsa20_KEYBYTES (32-byte) binary.

n()

-type n() :: <<_:192>>.

A crypto_stream_xsalsa20_NONCEBYTES (24-byte) binary.

Functions

crypto_stream_xsalsa20(CLen, N, K)

-spec crypto_stream_xsalsa20(CLen, N, K) -> Result
                                when CLen :: non_neg_integer(), N :: n(), K :: k(), Result :: binary().

Return CLen bytes of keystream for the noncebytes/0 byte nonce N and the keybytes/0 byte key K.

keybytes()

-spec keybytes() -> Result when Result :: 32.

Return crypto_stream_xsalsa20_keybytes(), in bytes.

keygen()

-spec keygen() -> Result when Result :: k().

Generate a random keybytes/0 byte key.

messagebytes_max()

-spec messagebytes_max() -> Result when Result :: non_neg_integer().

Return crypto_stream_xsalsa20_messagebytes_max(), in bytes.

noncebytes()

-spec noncebytes() -> Result when Result :: 24.

Return crypto_stream_xsalsa20_noncebytes(), in bytes.

'xor'(M, N, K)

-spec 'xor'(M, N, K) -> Result when M :: binary(), N :: n(), K :: k(), Result :: binary().

Encrypt or decrypt M by combining it with the keystream for the nonce N and key K, starting at block counter 0.

xor_ic(M, N, IC, K)

-spec xor_ic(M, N, IC, K) -> Result
                when M :: binary(), N :: n(), IC :: non_neg_integer(), K :: k(), Result :: binary().

Like 'xor'/3, but start at the 64-byte block counter IC, so the message is combined with the keystream from byte IC * 64 onwards.