1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#pragma once
#include <cryptopp/aes.h>
#include <cryptopp/cmac.h>
#include <cryptopp/modes.h>
#include <stddef.h>
#include <stdint.h>
namespace securefs
{
// Implementation of AES-SIV according to https://tools.ietf.org/html/rfc5297
class AES_SIV
{
private:
CryptoPP::CMAC<CryptoPP::AES> m_cmac;
CryptoPP::CTR_Mode<CryptoPP::AES>::Encryption m_ctr;
public:
static constexpr size_t IV_SIZE = 16;
public:
explicit AES_SIV(const void* key, size_t size);
~AES_SIV();
void s2v(const void* plaintext,
size_t text_len,
const void* additional_data,
size_t additional_len,
void* iv);
void encrypt_and_authenticate(const void* plaintext,
size_t text_len,
const void* additional_data,
size_t additional_len,
void* ciphertext,
void* siv);
bool decrypt_and_verify(const void* ciphertext,
size_t text_len,
const void* additional_data,
size_t additional_len,
void* plaintext,
const void* siv);
};
void hmac_sha256_calculate(const void* message,
size_t msg_len,
const void* key,
size_t key_len,
void* mac,
size_t mac_len);
bool hmac_sha256_verify(const void* message,
size_t msg_len,
const void* key,
size_t key_len,
const void* mac,
size_t mac_len);
// HMAC based key derivation function (https://tools.ietf.org/html/rfc5869)
// This one is not implemented by Crypto++, so we implement it ourselves
void hkdf(const void* key,
size_t key_len,
const void* salt,
size_t salt_len,
const void* info,
size_t info_len,
void* output,
size_t out_len);
unsigned int pbkdf_hmac_sha256(const void* password,
size_t pass_len,
const void* salt,
size_t salt_len,
unsigned int min_iterations,
double min_seconds,
void* derived,
size_t derive_len);
void generate_random(void* buffer, size_t size);
void libscrypt_scrypt(const uint8_t* passwd,
size_t passwdlen,
const uint8_t* salt,
size_t saltlen,
uint64_t N,
uint32_t r,
uint32_t p,
uint8_t* buf,
size_t buflen);
} // namespace securefs
|