avr-crypto-lib/pi-cipher/pi16cipher.h

147 lines
3.6 KiB
C

/* pi16cipher.h */
/*
This file is part of the AVR-Crypto-Lib.
Copyright (C) 2015 Daniel Otte (daniel.otte@rub.de)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PI16CIPHER_H_
#define PI16CIPHER_H_
#include <inttypes.h>
#include <stddef.h>
#define PI16_WORD_SIZE 16
#define PI16_N 4
#define PI16_IS_BITS (4 * PI16_N * PI16_WORD_SIZE)
#define PI16_RATE_BITS (PI16_IS_BITS / 2)
#define PI16_CAPACITY_BITS PI16_BITS - PI16_RATE_BITS
#define PI16_RATE_BYTES (PI16_RATE_BITS / 8)
#define PI16_CAPACITY_BYTES (PI16_CAPACITY_BITS / 8)
#define PI16_SMN_LENGTH_BITS PI16_RATE_BITS
#define PI16_SMN_LENGTH_BYTES (PI16_RATE_BITS / 8)
#define PI16_AD_BLOCK_LENGTH_BITS PI16_RATE_BITS
#define PI16_AD_BLOCK_LENGTH_BYTES (PI16_AD_BLOCK_LENGTH_BITS / 8)
#define PI16_PT_BLOCK_LENGTH_BITS PI16_RATE_BITS
#define PI16_PT_BLOCK_LENGTH_BYTES (PI16_PT_BLOCK_LENGTH_BITS / 8)
#define PI16_CT_BLOCK_LENGTH_BITS PI16_RATE_BITS
#define PI16_CT_BLOCK_LENGTH_BYTES (PI16_CT_BLOCK_LENGTH_BITS / 8)
#define PI16_ROUNDS 3
extern const char* pi16_cipher_name;
typedef struct {
uint16_t cis[4][4];
uint16_t tag[8];
uint64_t ctr;
} pi16_ctx_t;
int pi16_init(
pi16_ctx_t *ctx,
const void *key,
size_t key_length_b,
const void *pmn,
size_t pmn_length_b);
void pi16_process_ad_block(
pi16_ctx_t *ctx,
const void *ad,
unsigned long ad_num );
void pi16_process_ad_last_block(
pi16_ctx_t *ctx,
const void *ad,
size_t ad_length_b,
unsigned long ad_num );
void pi16_encrypt_smn(
pi16_ctx_t *ctx,
void *c0,
const void *smn);
void pi16_decrypt_smn(
pi16_ctx_t *ctx,
void *dest,
const void *src,
unsigned long num );
void pi16_encrypt_block(
pi16_ctx_t *ctx,
void *dest,
const void *src,
unsigned long num );
void pi16_encrypt_last_block(
pi16_ctx_t *ctx,
void *dest,
const void *src,
size_t length_b,
unsigned long num );
void pi16_extract_tag(
pi16_ctx_t *ctx,
void *dest );
void pi16_decrypt_block(
pi16_ctx_t *ctx,
void *dest,
const void *src,
unsigned long num );
void pi16_decrypt_last_block(
pi16_ctx_t *ctx,
void *dest,
const void *src,
size_t length_b,
unsigned long num );
void pi16_encrypt_simple(
void *cipher,
size_t *cipher_len_B,
const void *msg,
size_t msg_len_B,
const void *ad,
size_t ad_len_B,
const void *nonce_secret,
const void *nonce_public,
size_t nonce_public_len_B,
const void *key,
size_t key_len_B
);
int pi16_decrypt_simple(
void *msg,
size_t *msg_len_B,
void *nonce_secret,
const void *cipher,
size_t cipher_len_B,
const void *ad,
size_t ad_len_B,
const void *nonce_public,
size_t nonce_public_len_B,
const void *key,
size_t key_len_B
);
#endif /* PI16CIPHER_H_ */