/*
 * 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 NORX_H
#define NORX_H

#include <stdint.h>
#include <stddef.h>

/**
 * The NORX AEAD cipher
 * ====================
 * This is an implementation of NORX32-4-1 with a one-shot
 * interface.  NORX is a CAESAR candidate with a core similar
 * to ChaCha20 and a sponge structure like Keccak.
 *
 * This is NORX v2.0.  It is not compatible with earlier
 * versions.
 *
 * NORX32 uses a 128-bit key.  Each encryption requires a
 * 64-bit nonce.  An encryption processes one sequence of
 * additional data ('header'), followed by encryption of
 * the plaintext, followed by processing a second sequence
 * of additional data ('trailer').  It outputs a 128-bit
 * tag.
 */

/* .. c:function:: $DECL
 * NORX32-4-1 one-shot encryption interface.
 *
 * :param key: key material.
 * :param nonce: per-message nonce.
 * :param header: header buffer.
 * :param nheader: number of header bytes.
 * :param plaintext: plaintext bytes to be encrypted.
 * :param nbytes: number of plaintext/ciphertext bytes.
 * :param trailer: trailer buffer.
 * :param ntrailer: number of trailer bytes.
 * :param ciphertext: ciphertext output buffer, nbytes in length.
 * :param tag: authentication tag output buffer.
 */
void cf_norx32_encrypt(const uint8_t key[static 16],
                       const uint8_t nonce[static 8],
                       const uint8_t *header, size_t nheader,
                       const uint8_t *plaintext, size_t nbytes,
                       const uint8_t *trailer, size_t ntrailer,
                       uint8_t *ciphertext,
                       uint8_t tag[static 16]);

/* .. c:function:: $DECL
 * NORX32-4-1 one-shot decryption interface.
 *
 * :return: 0 on success, non-zero on error.  Plaintext is zeroed on error.
 *
 * :param key: key material.
 * :param nonce: per-message nonce.
 * :param header: header buffer.
 * :param nheader: number of header bytes.
 * :param ciphertext: ciphertext bytes to be decrypted.
 * :param nbytes: number of plaintext/ciphertext bytes.
 * :param trailer: trailer buffer.
 * :param ntrailer: number of trailer bytes.
 * :param plaintext: plaintext output buffer, nbytes in length.
 * :param tag: authentication tag output buffer.
 */
int cf_norx32_decrypt(const uint8_t key[static 16],
                      const uint8_t nonce[static 8],
                      const uint8_t *header, size_t nheader,
                      const uint8_t *ciphertext, size_t nbytes,
                      const uint8_t *trailer, size_t ntrailer,
                      const uint8_t tag[static 16],
                      uint8_t *plaintext);

#endif
