Add Cipher concept

This commit is contained in:
Sebastian Messmer 2015-04-24 21:30:54 +02:00
parent 5adcf4aca1
commit 008c6f7ab7
4 changed files with 40 additions and 3 deletions

View File

@ -9,6 +9,7 @@
#include "messmer/cpp-utils/macros.h"
#include <memory>
#include <boost/optional.hpp>
#include "ciphers/Cipher.h"
namespace blockstore {
namespace encrypted {
@ -19,6 +20,7 @@ template<class Cipher> class EncryptedBlockStore;
template<class Cipher>
class EncryptedBlock: public Block {
public:
BOOST_CONCEPT_ASSERT((CipherConcept<Cipher>));
static std::unique_ptr<EncryptedBlock> TryCreateNew(BlockStore *baseBlockStore, const Key &key, Data data, const typename Cipher::EncryptionKey &encKey);
static std::unique_ptr<EncryptedBlock> TryDecrypt(std::unique_ptr<Block> baseBlock, const typename Cipher::EncryptionKey &key);

View File

@ -6,6 +6,7 @@
#include "../../../utils/Data.h"
#include <cryptopp/cryptopp/aes.h>
#include <boost/optional.hpp>
#include "Cipher.h"
namespace blockstore {
namespace encrypted {
@ -13,11 +14,11 @@ namespace encrypted {
//TODO Add contract/interface for ciphers
class AES256_CFB {
public:
BOOST_CONCEPT_ASSERT((CipherConcept<AES256_CFB>));
using EncryptionKey = FixedSizeData<32>;
static_assert(32 == CryptoPP::AES::MAX_KEYLENGTH, "If AES offered larger keys, we should offer a variant with it");
AES256_CFB(const EncryptionKey &key);
static constexpr unsigned int ciphertextSize(unsigned int plaintextBlockSize) {
return plaintextBlockSize + IV_SIZE;
}

View File

@ -0,0 +1,32 @@
#pragma once
#ifndef MESSMER_BLOCKSTORE_IMPLEMENTATIONS_ENCRYPTED_CIPHERS_CIPHER_H_
#define MESSMER_BLOCKSTORE_IMPLEMENTATIONS_ENCRYPTED_CIPHERS_CIPHER_H_
#include <boost/concept_check.hpp>
#include <cstdint>
namespace blockstore {
namespace encrypted {
template<class X>
struct CipherConcept {
public:
BOOST_CONCEPT_USAGE(CipherConcept) {
same_type(UINT32_C(0), X::ciphertextSize(UINT32_C(5)));
same_type(UINT32_C(0), X::plaintextSize(UINT32_C(5)));
typename X::EncryptionKey key = X::EncryptionKey::CreateRandom();
same_type(Data(0), X::encrypt((byte*)nullptr, UINT32_C(0), key));
same_type(boost::optional<Data>(Data(0)), X::decrypt((byte*)nullptr, UINT32_C(0), key));
}
private:
// Type deduction will fail unless the arguments have the same type.
template <typename T> void same_type(T const&, T const&);
};
}
}
#endif

View File

@ -1,5 +1,6 @@
#include <google/gtest/gtest.h>
#include "../../../implementations/encrypted/ciphers/AES256_CFB.h"
#include "../../../implementations/encrypted/ciphers/Cipher.h"
#include "../../testutils/DataBlockFixture.h"
#include "../../../utils/Data.h"
@ -10,6 +11,7 @@ using blockstore::Data;
template<class Cipher>
class CipherTest: public ::testing::Test {
public:
BOOST_CONCEPT_ASSERT((CipherConcept<Cipher>));
typename Cipher::EncryptionKey encKey = createRandomKey();
static typename Cipher::EncryptionKey createRandomKey(int seed = 0) {
@ -82,7 +84,7 @@ TYPED_TEST_P(CipherTest, Size_1048576) {
EXPECT_EQ(1048576, TypeParam::plaintextSize(TypeParam::ciphertextSize(1048576)));
}
constexpr std::initializer_list<unsigned int> SIZES = {0, 1, 100, 1024, 5000, 1048576, 52428800};
constexpr std::initializer_list<unsigned int> SIZES = {0, 1, 100, 1024, 5000, 1048576, 20971520};
TYPED_TEST_P(CipherTest, EncryptThenDecrypt_Zeroes) {
for (auto size: SIZES) {