blob: 462d01905b016c33e149aa9cebd1fd7695b885de [file] [log] [blame]
/*
* cifra - embedded cryptography library
* Written in 2014 by Joseph Birr-Pixton <jpixton@gmail.com>
*
* To the extent possible under law, the author(s) have dedicated all
* copyright and related and neighboring rights to this software to the
* public domain worldwide. This software is distributed without any
* warranty.
*
* You should have received a copy of the CC0 Public Domain Dedication
* along with this software. If not, see
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#ifndef SALSA20_H
#define SALSA20_H
#include <stdint.h>
#include <stddef.h>
/**
* The Salsa20/Chacha20 stream ciphers
* ===================================
*
* These are similar stream ciphers by djb.
*
* A reduced round variant of Salsa20 (Salsa20/12)
* was selected as a finalist of the eSTREAM stream
* cipher competition. This implementation does
* the full 20 rounds.
*
* ChaCha20 is fundamentally like Salsa20, but
* has a tweaked round function to improve security
* margin without damaging performance.
*/
/* Salsa20 core transform. */
void cf_salsa20_core(const uint8_t key0[16],
const uint8_t key1[16],
const uint8_t nonce[16],
const uint8_t constant[16],
uint8_t out[64]);
/* Chacha20 core transform. */
void cf_chacha20_core(const uint8_t key0[16],
const uint8_t key1[16],
const uint8_t nonce[16],
const uint8_t constant[16],
uint8_t out[64]);
/* .. c:type:: cf_salsa20_ctx
* Incremental interface to Salsa20.
*
* .. c:member:: cf_salsa20_ctx.key0
* Half of key material.
*
* .. c:member:: cf_salsa20_ctx.key1
* Half of key material.
*
* .. c:member:: cf_salsa20_ctx.nonce
* Nonce and counter block.
*
* .. c:member:: cf_salsa20_ctx.constant
* Per-key-length constants.
*
* .. c:member:: cf_salsa20_ctx.block
* Buffer for unused key stream material.
*
* .. c:member:: cf_salsa20_ctx.nblock
* Number of bytes at end of `block` that can be used as key stream.
*
*/
typedef struct
{
uint8_t key0[16], key1[16];
uint8_t nonce[16];
const uint8_t *constant;
uint8_t block[64];
size_t nblock;
size_t ncounter;
} cf_salsa20_ctx, cf_chacha20_ctx;
/* .. c:type:: cf_chacha20_ctx
* Incremental interface to Chacha20. This structure
* is identical to :c:type:`cf_salsa20_ctx`.
*/
/* .. c:function:: $DECL
* Salsa20 initialisation function.
*
* :param ctx: salsa20 context.
* :param key: key material.
* :param nkey: length of key in bytes, either 16 or 32.
* :param nonce: per-message nonce.
*/
void cf_salsa20_init(cf_salsa20_ctx *ctx, const uint8_t *key, size_t nkey, const uint8_t nonce[8]);
/* .. c:function:: $DECL
* Chacha20 initialisation function.
*
* :param ctx: chacha20 context (written).
* :param key: key material.
* :param nkey: length of key in bytes, either 16 or 32.
* :param nonce: per-message nonce.
*/
void cf_chacha20_init(cf_chacha20_ctx *ctx, const uint8_t *key, size_t nkey, const uint8_t nonce[8]);
/* .. c:function:: $DECL
* Chacha20 initialisation function. This version gives full control over the whole
* initial nonce value, and the size of the counter. The counter is always at the front
* of the nonce.
*
* :param ctx: chacha20 context (written).
* :param key: key material.
* :param nkey: length of key in bytes, either 16 or 32.
* :param nonce: per-message nonce. `ncounter` bytes at the start are the block counter.
* :param ncounter: length, in bytes, of the counter portion of the nonce.
*/
void cf_chacha20_init_custom(cf_chacha20_ctx *ctx, const uint8_t *key, size_t nkey,
const uint8_t nonce[16], size_t ncounter);
/* .. c:function:: $DECL
* Salsa20 encryption/decryption function.
*
* :param ctx: salsa20 context.
* :param input: input data buffer (read), `count` bytes long.
* :param output: output data buffer (written), `count` bytes long.
*/
void cf_salsa20_cipher(cf_salsa20_ctx *ctx, const uint8_t *input, uint8_t *output, size_t count);
/* .. c:function:: $DECL
* Chacha20 encryption/decryption function.
*
* :param ctx: chacha20 context.
* :param input: input data buffer (read), `count` bytes long.
* :param output: output data buffer (written), `count` bytes long.
*/
void cf_chacha20_cipher(cf_chacha20_ctx *ctx, const uint8_t *input, uint8_t *output, size_t count);
#endif