genode/repos/gems/include/cbe/crypto/interface.h
Martin Stein 30b8f4efc8 gems: import Genode-specific code of the CBE
The CBE repository contained a lot of Genode-specific code despite the fact
that the CBE core logic is not bound to Genode in any way. Therefore the
Genode-specific CBE code is moved to the 'gems' repository to form part of
Genode mainline. The remaining CBE code becomes a port in Genode instead of
being invoked as sub-repository.

The commit combines the following work steps:

* add all files removed from CBE repository
* add CBE port files
* make all CBE libs and targets build again
* make all CBE run scripts succeed again
* make all CBE recipes build again
* make CBE autopilot succeed again
* let CBE autopilot use 'libsparcrypto' contrib dir and Genode build dir
  instead of '.ci' dir in CBE contrib dir (remove '.ci' dir from CBE repo)
* let CBE autopilot always check for all ports
* make CBE autopilot directly executable
* fix license headers in all Genode CBE files
* remove unused VFS replay component
* remove unused CBE test
* remove unused external crypto
* remove unused files in run dir
* remove unused external trust anchor
* add cbe_tester test to autopilot list
* get rid of directories 'include/cbe_*' and 'include/utils'

Fixes #3937
2020-11-27 09:19:08 +01:00

120 lines
2.6 KiB
C++

/*
* \brief Integration of the Consistent Block Encrypter (CBE)
* \author Martin Stein
* \author Josef Soentgen
* \date 2020-11-10
*/
/*
* Copyright (C) 2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _INCLUDE__CBE__CRYPTO__INTERFACE_H_
#define _INCLUDE__CBE__CRYPTO__INTERFACE_H_
/* Genode includes */
#include <base/exception.h>
#include <base/stdint.h>
namespace Cbe_crypto {
using uint32_t = Genode::uint32_t;
using uint64_t = Genode::uint64_t;
using size_t = Genode::size_t;
struct Interface;
Interface &get_interface();
enum { BLOCK_SIZE = 4096u };
} /* namespace Cbe_crypto */
struct Cbe_crypto::Interface
{
struct Buffer_too_small : Genode::Exception { };
struct Key_value_size_mismatch : Genode::Exception { };
struct Complete_request
{
bool const valid;
uint64_t const block_number;
};
struct Slots
{
enum { NUM_SLOTS = 2, };
uint32_t _store[NUM_SLOTS] { };
bool store(uint32_t const id)
{
for (uint32_t &slot : _store) {
if (slot == 0) {
slot = id;
return true;
}
}
return false;
}
void remove(uint32_t const id)
{
for (uint32_t &slot : _store) {
if (slot == id) {
slot = 0;
return;
}
}
}
template <typename FN>
void for_each_key(FN const &func)
{
for (uint32_t const slot : _store) {
if (slot != 0) {
func(slot);
}
}
}
};
Slots _slots { };
virtual ~Interface() { }
template <typename FN>
void for_each_key(FN const &func)
{
_slots.for_each_key(func);
}
virtual bool execute() = 0;
virtual bool add_key(uint32_t const id,
char const *value,
size_t value_len) = 0;
virtual bool remove_key(uint32_t const id) = 0;
virtual bool submit_encryption_request(uint64_t const block_number,
uint32_t const key_id,
char const *src,
size_t const src_len) = 0;
virtual Complete_request encryption_request_complete(char *dst, size_t const dst_len) = 0;
virtual bool submit_decryption_request(uint64_t const block_number,
uint32_t const key_id,
char const *src,
size_t const src_len) = 0;
virtual Complete_request decryption_request_complete(char *dst, size_t dst_len) = 0;
};
#endif /* _INCLUDE__CBE__CRYPTO__INTERFACE_H_ */