OpenVPN 3 Core Library
Loading...
Searching...
No Matches
digestapi.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// Crypto digest/HMAC API
13
14#ifndef OPENVPN_CRYPTO_DIGESTAPI_H
15#define OPENVPN_CRYPTO_DIGESTAPI_H
16
17#include <openvpn/common/rc.hpp>
19
20namespace openvpn {
21
22// Digest/HMAC abstract base classes and factories
23
24class DigestInstance : public RC<thread_unsafe_refcount>
25{
26 public:
28
29 virtual void update(const unsigned char *in, const size_t size) = 0;
30 virtual size_t final(unsigned char *out) = 0;
31 virtual size_t size() const = 0;
32};
33
34class HMACInstance : public RC<thread_unsafe_refcount>
35{
36 public:
38
39 virtual void reset() = 0;
40 virtual void update(const unsigned char *in, const size_t size) = 0;
41 virtual size_t final(unsigned char *out) = 0;
42 virtual size_t size() const = 0;
43};
44
45class DigestFactory : public RC<thread_unsafe_refcount>
46{
47 public:
49
50 virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type) = 0;
51
52 virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size) = 0;
53};
54
55// Digest implementation using CRYPTO_API
56
57template <typename CRYPTO_API>
59{
60 public:
62 : impl(digest, libctx)
63 {
64 }
65
66 virtual void update(const unsigned char *in, const size_t size)
67 {
68 impl.update(in, size);
69 }
70
71 virtual size_t final(unsigned char *out)
72 {
73 return impl.final(out);
74 }
75
76 virtual size_t size() const
77 {
78 return impl.size();
79 }
80
81 private:
82 typename CRYPTO_API::DigestContext impl;
83};
84
85template <typename CRYPTO_API>
87{
88 public:
90 const unsigned char *key,
91 const size_t key_size)
92 : impl(digest, key, key_size)
93 {
94 }
95
96 virtual void reset()
97 {
98 impl.reset();
99 }
100
101 virtual void update(const unsigned char *in, const size_t size)
102 {
103 impl.update(in, size);
104 }
105
106 virtual size_t final(unsigned char *out)
107 {
108 return impl.final(out);
109 }
110
111 size_t size() const
112 {
113 return impl.size();
114 }
115
116 private:
117 typename CRYPTO_API::HMACContext impl;
118};
119
120template <typename CRYPTO_API>
122{
123 public:
124 CryptoDigestFactory(SSLLib::Ctx libctx_arg = nullptr)
125 : libctx(libctx_arg)
126 {
127 }
128
130 {
131 return new CryptoDigestInstance<CRYPTO_API>(digest_type, libctx);
132 }
133
134 virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type,
135 const unsigned char *key,
136 const size_t key_size)
137 {
138 return new CryptoHMACInstance<CRYPTO_API>(digest_type,
139 key,
140 key_size);
141 }
142
144};
145
146} // namespace openvpn
147
148#endif
virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size)
virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type)
CryptoDigestFactory(SSLLib::Ctx libctx_arg=nullptr)
virtual void update(const unsigned char *in, const size_t size)
Definition digestapi.hpp:66
CryptoDigestInstance(const CryptoAlgs::Type digest, SSLLib::Ctx libctx)
Definition digestapi.hpp:61
virtual size_t size() const
Definition digestapi.hpp:76
CRYPTO_API::DigestContext impl
Definition digestapi.hpp:82
CRYPTO_API::HMACContext impl
virtual void update(const unsigned char *in, const size_t size)
CryptoHMACInstance(const CryptoAlgs::Type digest, const unsigned char *key, const size_t key_size)
Definition digestapi.hpp:89
RCPtr< DigestFactory > Ptr
Definition digestapi.hpp:48
virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size)=0
virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type)=0
virtual size_t size() const =0
virtual void update(const unsigned char *in, const size_t size)=0
RCPtr< DigestInstance > Ptr
Definition digestapi.hpp:27
virtual size_t size() const =0
RCPtr< HMACInstance > Ptr
Definition digestapi.hpp:37
virtual void update(const unsigned char *in, const size_t size)=0
virtual void reset()=0
The smart pointer class.
Definition rc.hpp:119
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
Definition rc.hpp:912
static std::stringstream out
Definition test_path.cpp:10