CCF
Loading...
Searching...
No Matches
symmetric_key.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
6
7#include <span>
8#include <vector>
9
10namespace ccf::crypto
11{
12 constexpr size_t GCM_DEFAULT_KEY_SIZE = 32;
13
14 constexpr size_t GCM_SIZE_TAG = 16;
15
16 struct GcmHeader
17 {
18 uint8_t tag[GCM_SIZE_TAG] = {};
19
20 // Size does not change after construction
21 std::vector<uint8_t> iv;
22
23 GcmHeader(size_t iv_size);
24
25 void set_iv(const uint8_t* data, size_t size);
26 [[nodiscard]] std::span<const uint8_t> get_iv() const;
27
28 [[nodiscard]] size_t serialised_size() const;
29 std::vector<uint8_t> serialise();
30
31 void deserialise(const std::vector<uint8_t>& ser);
32 void deserialise(const uint8_t*& data, size_t& size);
33 };
34
35 template <size_t IV_BYTES>
37 {
38 static constexpr size_t IV_SIZE = IV_BYTES;
39
41
42 static size_t serialised_size()
43 {
44 return GCM_SIZE_TAG + IV_SIZE;
45 }
46
48 {
49 iv = entropy->random(IV_SIZE);
50 }
51 };
52
53 // GcmHeader with 12-byte (96-bit) IV
54 constexpr size_t iv_size = 12;
56
57 struct GcmCipher
58 {
60 std::vector<uint8_t> cipher;
61
63 GcmCipher(size_t size);
64
65 std::vector<uint8_t> serialise();
66
67 void deserialise(const std::vector<uint8_t>& serial);
68 };
69
71 {
72 public:
73 KeyAesGcm() = default;
74 virtual ~KeyAesGcm() = default;
75
76 // AES-GCM encryption
77 virtual void encrypt(
78 std::span<const uint8_t> iv,
79 std::span<const uint8_t> plain,
80 std::span<const uint8_t> aad,
81 std::vector<uint8_t>& cipher,
82 uint8_t tag[GCM_SIZE_TAG]) const = 0;
83
84 // AES-GCM decryption
85 virtual bool decrypt(
86 std::span<const uint8_t> iv,
87 const uint8_t tag[GCM_SIZE_TAG],
88 std::span<const uint8_t> cipher,
89 std::span<const uint8_t> aad,
90 std::vector<uint8_t>& plain) const = 0;
91
92 // Key size in bits
93 [[nodiscard]] virtual size_t key_size() const = 0;
94 };
95
96 std::unique_ptr<KeyAesGcm> make_key_aes_gcm(std::span<const uint8_t> rawKey);
97
101 inline void check_supported_aes_key_size(size_t num_bits)
102 {
103 // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
104 if (num_bits != 128 && num_bits != 192 && num_bits != 256)
105 {
106 throw std::runtime_error("Unsupported key size");
107 }
108 }
109}
Definition symmetric_key.h:71
virtual bool decrypt(std::span< const uint8_t > iv, const uint8_t tag[GCM_SIZE_TAG], std::span< const uint8_t > cipher, std::span< const uint8_t > aad, std::vector< uint8_t > &plain) const =0
virtual size_t key_size() const =0
virtual ~KeyAesGcm()=default
virtual void encrypt(std::span< const uint8_t > iv, std::span< const uint8_t > plain, std::span< const uint8_t > aad, std::vector< uint8_t > &cipher, uint8_t tag[GCM_SIZE_TAG]) const =0
Definition base64.h:11
void check_supported_aes_key_size(size_t num_bits)
Definition symmetric_key.h:101
std::unique_ptr< KeyAesGcm > make_key_aes_gcm(std::span< const uint8_t > rawKey)
Free function implementation.
Definition symmetric_key.cpp:100
constexpr size_t iv_size
Definition symmetric_key.h:54
EntropyPtr get_entropy()
Definition entropy.cpp:10
std::shared_ptr< Entropy > EntropyPtr
Definition entropy.h:32
constexpr size_t GCM_SIZE_TAG
Definition symmetric_key.h:14
constexpr size_t GCM_DEFAULT_KEY_SIZE
Definition symmetric_key.h:12
Definition symmetric_key.h:37
void set_random_iv(EntropyPtr entropy=ccf::crypto::get_entropy())
Definition symmetric_key.h:47
FixedSizeGcmHeader()
Definition symmetric_key.h:40
static constexpr size_t IV_SIZE
Definition symmetric_key.h:38
static size_t serialised_size()
Definition symmetric_key.h:42
Definition symmetric_key.h:58
void deserialise(const std::vector< uint8_t > &serial)
Definition symmetric_key.cpp:91
GcmCipher()
GcmCipher implementation.
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:76
StandardGcmHeader hdr
Definition symmetric_key.h:59
std::vector< uint8_t > cipher
Definition symmetric_key.h:60
Definition symmetric_key.h:17
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:42
uint8_t tag[GCM_SIZE_TAG]
Definition symmetric_key.h:18
void set_iv(const uint8_t *data, size_t size)
Definition symmetric_key.cpp:21
std::vector< uint8_t > iv
Definition symmetric_key.h:21
size_t serialised_size() const
Definition symmetric_key.cpp:37
void deserialise(const std::vector< uint8_t > &ser)
Definition symmetric_key.cpp:54
std::span< const uint8_t > get_iv() const
Definition symmetric_key.cpp:32