1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/include/crypto/modes/ocb.h
2020-10-05 12:32:51 +02:00

117 lines
4.2 KiB
C

/*
* Copyright (C) 2018 Mathias Tausig
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup sys_crypto
* @{
*
* @file ocb.h
* @brief Offset Codebook (OCB3) AEAD mode as specified in RFC 7253
*
* NOTE: The OCB algorithm is covered by patents in the USA owned by Phillip Rogaway.
* A free licence is granted for any open-source or non-military project.
* Check http://web.cs.ucdavis.edu/~rogaway/ocb/grant.htm for details.
*
* @author Mathias Tausig <mathias@tausig.at>
*/
#ifndef CRYPTO_MODES_OCB_H
#define CRYPTO_MODES_OCB_H
#include "crypto/ciphers.h"
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name OCB error codes
* @{
*/
/**
* Returned if a nonce of bad length (empty or more than 15 bytes) was used
*/
#define OCB_ERR_INVALID_NONCE_LENGTH (-2)
/**
* OCB only works with ciphers with a block size of 128 bit
*/
#define OCB_ERR_INVALID_BLOCK_LENGTH (-3)
/**
* Returned if the amount of input data cannot be handled by this implementation
*/
#define OCB_ERR_INVALID_DATA_LENGTH (-3)
/**
* Returned if a tag of bad length was requested (empty or more than 16 bytes)
*/
#define OCB_ERR_INVALID_TAG_LENGTH (-4)
/**
* Returned if the authentication failed during decryption
*/
#define OCB_ERR_INVALID_TAG (-5)
/** @} */
/**
* @brief Encrypt and authenticate data of arbitrary length in OCB mode.
*
* @param cipher Already initialized cipher struct
* @param auth_data Additional data to authenticate in MAC
* @param auth_data_len Length of additional data
* @param tag_len Length of the appended tag (at least 1, at most 16 bytes)
*
* @param nonce Nonce for the encryption (must be unique)
* @param nonce_len Length of the nonce in bytes (at most 15)
* @param input pointer to input data to encrypt
* @param input_len length of the input data.
* input_len + tag_len must be smaller than INT32_MAX (2^31-1)
* @param output pointer to allocated memory for encrypted data.
* The tag will be appended to the ciphertext.
* It has to be of size data_len + tag_len.
* @return Length of the encrypted data (including the tag) or a (negative) error code
*/
int32_t cipher_encrypt_ocb(const cipher_t *cipher,
const uint8_t *auth_data, size_t auth_data_len,
uint8_t tag_len,
const uint8_t *nonce, size_t nonce_len,
const uint8_t *input, size_t input_len,
uint8_t *output);
/**
* @brief Decrypt and verify the authentication of OCB encrypted data.
*
* @param cipher Already initialized cipher struct
* @param auth_data Additional data to authenticate in MAC
* @param auth_data_len Length of additional data
* @param tag_len Length of the appended tag (at least 1, at most 16 bytes)
*
* @param nonce Nonce for the encryption (must be unique)
* @param nonce_len Length of the nonce in bytes (at most 15)
* @param input pointer to the ciphertext with the tag appended
* @param input_len length of the input data.
* input_len - tag_len must be smaller than INT32_MAX (2^31-1)
* @param output pointer to allocated memory for the plaintext data.
* It has to be of size input_len - tag_len.
* Will contain only zeroes, if the authentication fails.
* @return Length of the plaintext data or a (negative) error code
*/
int32_t cipher_decrypt_ocb(const cipher_t *cipher,
const uint8_t *auth_data, size_t auth_data_len,
uint8_t tag_len,
const uint8_t *nonce, size_t nonce_len,
const uint8_t *input, size_t input_len,
uint8_t *output);
#ifdef __cplusplus
}
#endif
#endif /* CRYPTO_MODES_OCB_H */
/** @} */