OpenVPN 3 Core Library
Loading...
Searching...
No Matches
crypto_chm.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// OpenVPN CBC/HMAC data channel
13
14#ifndef OPENVPN_CRYPTO_CRYPTO_CHM_H
15#define OPENVPN_CRYPTO_CRYPTO_CHM_H
16
22
23namespace openvpn {
24
25template <typename CRYPTO_API>
27{
28 public:
30
32 SSLLib::Ctx libctx_arg,
33 CryptoDCSettingsData dc_settings_data,
34 const Frame::Ptr &frame_arg,
35 const SessionStats::Ptr &stats_arg,
36 const StrongRandomAPI::Ptr &rng_arg)
37 : dc_settings(dc_settings_data),
38 frame(frame_arg),
39 stats(stats_arg),
40 rng(rng_arg),
41 libctx(libctx_arg)
42 {
43 encrypt_.frame = frame;
44 decrypt_.frame = frame;
45 decrypt_.stats = stats_arg;
46 encrypt_.set_rng(rng);
47 }
48
49 // Encrypt/Decrypt
50
51 /* returns true if packet ID is close to wrapping */
52 bool encrypt(BufferAllocated &buf, const unsigned char *op32) override
53 {
54 encrypt_.encrypt(buf);
55 return encrypt_.pid_send.wrap_warning();
56 }
57
58 Error::Type decrypt(BufferAllocated &buf, const std::time_t now, const unsigned char *op32) override
59 {
60 return decrypt_.decrypt(buf, now);
61 }
62
63 // Initialization
64
65 void init_cipher(StaticKey &&encrypt_key,
66 StaticKey &&decrypt_key) override
67 {
68 encrypt_.cipher.init(libctx, dc_settings.cipher(), encrypt_key, CRYPTO_API::CipherContext::ENCRYPT);
69 decrypt_.cipher.init(libctx, dc_settings.cipher(), decrypt_key, CRYPTO_API::CipherContext::DECRYPT);
70 }
71
72 void init_hmac(StaticKey &&encrypt_key,
73 StaticKey &&decrypt_key) override
74 {
75 encrypt_.hmac.init(dc_settings.digest(), encrypt_key);
76 decrypt_.hmac.init(dc_settings.digest(), decrypt_key);
77 }
78
79 void init_pid(const char *recv_name,
80 const int recv_unit,
81 const SessionStats::Ptr &recv_stats_arg) override
82 {
83 /* CBC encryption always uses short packet ID */
84 constexpr bool wide = false;
85
86 encrypt_.pid_send = PacketIDDataSend{};
87 decrypt_.pid_recv.init(recv_name, recv_unit, wide);
88 stats = recv_stats_arg;
89 }
90
91 bool consider_compression(const CompressContext &comp_ctx) override
92 {
93 return true;
94 }
95
96 // Indicate whether or not cipher/digest is defined
97
98 unsigned int defined() const override
99 {
100 unsigned int ret = CRYPTO_DEFINED;
104 ret |= HMAC_DEFINED;
105 return ret;
106 }
107
108 // Rekeying
109
110 void rekey(const typename Base::RekeyType type) override
111 {
112 }
113
114 private:
120
123};
124
125template <typename CRYPTO_API>
127{
128 public:
130
132 SSLLib::Ctx libctx_arg,
133 CryptoDCSettingsData dc_settings_arg,
134 const Frame::Ptr &frame_arg,
135 const SessionStats::Ptr &stats_arg,
136 const StrongRandomAPI::Ptr &rng_arg)
137 : CryptoDCContext(dc_settings_arg.key_derivation()),
138 dc_settings(std::move(dc_settings_arg)),
139 frame(frame_arg),
140 stats(stats_arg),
141 rng(rng_arg),
142 libctx(libctx_arg)
143 {
144 }
145
146 CryptoDCInstance::Ptr new_obj(const unsigned int key_id) override
147 {
148 /* The check if the data channel cipher is valid is moved here, so encap_overhead
149 * can be called and calculated for the OCC strings even if we do not allow the cipher
150 * to be actually used */
151 return new CryptoCHM<CRYPTO_API>(libctx,
153 frame,
154 stats,
155 rng);
156 }
157
158 // cipher/HMAC/key info
160 {
161 return dc_settings;
162 }
163
164 // Info for ProtoContext::link_mtu_adjust
165
166 size_t encap_overhead() const override
167 {
168 return CryptoAlgs::size(dc_settings.digest()) + // HMAC
170 CryptoAlgs::block_size(dc_settings.cipher()); // worst-case PKCS#7 padding expansion
171 }
172
173 private:
179};
180} // namespace openvpn
181
182#endif
unsigned int defined() const override
void init_cipher(StaticKey &&encrypt_key, StaticKey &&decrypt_key) override
CryptoDCSettingsData dc_settings
bool encrypt(BufferAllocated &buf, const unsigned char *op32) override
CryptoCHM(SSLLib::Ctx libctx_arg, CryptoDCSettingsData dc_settings_data, const Frame::Ptr &frame_arg, const SessionStats::Ptr &stats_arg, const StrongRandomAPI::Ptr &rng_arg)
void rekey(const typename Base::RekeyType type) override
void init_pid(const char *recv_name, const int recv_unit, const SessionStats::Ptr &recv_stats_arg) override
SessionStats::Ptr stats
DecryptCHM< CRYPTO_API > decrypt_
StrongRandomAPI::Ptr rng
CryptoDCInstance Base
void init_hmac(StaticKey &&encrypt_key, StaticKey &&decrypt_key) override
bool consider_compression(const CompressContext &comp_ctx) override
EncryptCHM< CRYPTO_API > encrypt_
Error::Type decrypt(BufferAllocated &buf, const std::time_t now, const unsigned char *op32) override
StrongRandomAPI::Ptr rng
CryptoDCSettingsData crypto_info() override
CryptoDCSettingsData dc_settings
CryptoContextCHM(SSLLib::Ctx libctx_arg, CryptoDCSettingsData dc_settings_arg, const Frame::Ptr &frame_arg, const SessionStats::Ptr &stats_arg, const StrongRandomAPI::Ptr &rng_arg)
size_t encap_overhead() const override
CryptoDCInstance::Ptr new_obj(const unsigned int key_id) override
RCPtr< CryptoContextCHM > Ptr
SessionStats::Ptr stats
CryptoAlgs::KeyDerivation key_derivation
Definition cryptodc.hpp:179
CryptoAlgs::Type cipher() const
Definition cryptodc.hpp:120
CryptoAlgs::Type digest() const
Definition cryptodc.hpp:132
size_t block_size(const Type type)
bool defined(const Type type)
size_t iv_length(const Type type)
size_t size(const Type type)
Implementation of the base classes for random number generators.
std::string ret