diff options
Diffstat (limited to 'src/crypto.h')
-rw-r--r-- | src/crypto.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/crypto.h b/src/crypto.h index fbb77ec..8f94fae 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -24,7 +24,7 @@ */ /** - \file src/crypto.h + \file Cyptographic algorithm API and utilities */ @@ -38,29 +38,41 @@ #include <string.h> +/** Contains information about a cipher algorithm */ struct fastd_cipher_info { - size_t key_length; - size_t iv_length; + size_t key_length; /**< The key length used by the cipher */ + size_t iv_length; /**< The initialization vector length used by the cipher */ }; +/** A stream cipher implementation */ struct fastd_cipher { + /**< Checks if the algorithm is available on the platform used. If NULL, the algorithm is always available. */ bool (*available)(void); + /** Initializes a cipher context with the given key */ fastd_cipher_state_t* (*init)(const uint8_t *key); + /** Encrypts or decrypts data */ bool (*crypt)(const fastd_cipher_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t len, const uint8_t *iv); + /** Frees a cipher context */ void (*free)(fastd_cipher_state_t *state); }; +/** Contains information about a message authentication code algorithm */ struct fastd_mac_info { - size_t key_length; + size_t key_length; /**< The key length used by the MAC */ }; +/** A MAC implementation */ struct fastd_mac { + /**< Checks if the algorithm is available on the platform used. If NULL, the algorithm is always available. */ bool (*available)(void); + /** Initializes a MAC context with the given key */ fastd_mac_state_t* (*init)(const uint8_t *key); + /** Computes the MAC of data blocks */ bool (*hash)(const fastd_mac_state_t *state, fastd_block128_t *out, const fastd_block128_t *in, size_t n_blocks); + /** Frees a MAC context */ void (*free)(fastd_mac_state_t *state); }; @@ -80,16 +92,19 @@ const fastd_mac_info_t* fastd_mac_info_get_by_name(const char *name); const fastd_mac_t* fastd_mac_get(const fastd_mac_info_t *info); +/** Sets a range of memory to zero, ensuring the operation can't be optimized out by the compiler */ static inline void secure_memzero(void *s, size_t n) { memset(s, 0, n); __asm__ volatile("" : : "m"(s)); } +/** XORs two blocks of data */ static inline void xor(fastd_block128_t *x, const fastd_block128_t *a, const fastd_block128_t *b) { x->qw[0] = a->qw[0] ^ b->qw[0]; x->qw[1] = a->qw[1] ^ b->qw[1]; } +/** XORs one block of data into another */ static inline void xor_a(fastd_block128_t *x, const fastd_block128_t *a) { xor(x, x, a); } |