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 std::span<const uint8_t> get_iv() const;
27
28 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
55
56 struct GcmCipher
57 {
59 std::vector<uint8_t> cipher;
60
62 GcmCipher(size_t size);
63
64 std::vector<uint8_t> serialise();
65
66 void deserialise(const std::vector<uint8_t>& serial);
67 };
68
70 {
71 public:
72 KeyAesGcm() = default;
73 virtual ~KeyAesGcm() = default;
74
75 // AES-GCM encryption
76 virtual void encrypt(
77 std::span<const uint8_t> iv,
78 std::span<const uint8_t> plain,
79 std::span<const uint8_t> aad,
80 std::vector<uint8_t>& cipher,
81 uint8_t tag[GCM_SIZE_TAG]) const = 0;
82
83 // AES-GCM decryption
84 virtual bool decrypt(
85 std::span<const uint8_t> iv,
86 const uint8_t tag[GCM_SIZE_TAG],
87 std::span<const uint8_t> cipher,
88 std::span<const uint8_t> aad,
89 std::vector<uint8_t>& plain) const = 0;
90
91 // Key size in bits
92 virtual size_t key_size() const = 0;
93 };
94
95 std::unique_ptr<KeyAesGcm> make_key_aes_gcm(std::span<const uint8_t> rawKey);
96
100 inline void check_supported_aes_key_size(size_t num_bits)
101 {
102 if (num_bits != 128 && num_bits != 192 && num_bits != 256)
103 throw std::runtime_error("Unsupported key size");
104 }
105
107 static std::vector<uint8_t> default_iv(12, 0);
108
115 std::vector<uint8_t> aes_gcm_encrypt(
116 std::span<const uint8_t> key,
117 std::span<const uint8_t> plaintext,
118 const std::vector<uint8_t>& iv = default_iv,
119 const std::vector<uint8_t>& aad = {});
120
127 std::vector<uint8_t> aes_gcm_decrypt(
128 std::span<const uint8_t> key,
129 std::span<const uint8_t> ciphertext,
130 const std::vector<uint8_t>& iv = default_iv,
131 const std::vector<uint8_t>& aad = {});
132}
Definition symmetric_key.h:70
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:10
void check_supported_aes_key_size(size_t num_bits)
Definition symmetric_key.h:100
std::unique_ptr< KeyAesGcm > make_key_aes_gcm(std::span< const uint8_t > rawKey)
Free function implementation.
Definition symmetric_key.cpp:102
std::vector< uint8_t > aes_gcm_decrypt(std::span< const uint8_t > key, std::span< const uint8_t > ciphertext, const std::vector< uint8_t > &iv=default_iv, const std::vector< uint8_t > &aad={})
Definition symmetric_key.cpp:123
EntropyPtr get_entropy()
Definition entropy.cpp:10
std::shared_ptr< Entropy > EntropyPtr
Definition entropy.h:33
constexpr size_t GCM_SIZE_TAG
Definition symmetric_key.h:14
std::vector< uint8_t > aes_gcm_encrypt(std::span< const uint8_t > key, std::span< const uint8_t > plaintext, const std::vector< uint8_t > &iv=default_iv, const std::vector< uint8_t > &aad={})
Definition symmetric_key.cpp:107
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:57
void deserialise(const std::vector< uint8_t > &serial)
Definition symmetric_key.cpp:93
GcmCipher()
GcmCipher implementation.
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:78
StandardGcmHeader hdr
Definition symmetric_key.h:58
std::vector< uint8_t > cipher
Definition symmetric_key.h:59
Definition symmetric_key.h:17
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:44
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:23
std::vector< uint8_t > iv
Definition symmetric_key.h:21
size_t serialised_size() const
Definition symmetric_key.cpp:39
void deserialise(const std::vector< uint8_t > &ser)
Definition symmetric_key.cpp:56
std::span< const uint8_t > get_iv() const
Definition symmetric_key.cpp:34