// OpenVPN -- An application to securely tunnel IP networks // over a single port, with support for SSL/TLS-based // session authentication and key exchange, // packet encryption, packet authentication, and // packet compression. // // Copyright (C) 2012-2022 OpenVPN Inc. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License Version 3 // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program in the COPYING file. // If not, see . // Crypto digest/HMAC API #ifndef OPENVPN_CRYPTO_DIGESTAPI_H #define OPENVPN_CRYPTO_DIGESTAPI_H #include #include namespace openvpn { // Digest/HMAC abstract base classes and factories class DigestInstance : public RC { public: typedef RCPtr Ptr; virtual void update(const unsigned char *in, const size_t size) = 0; virtual size_t final(unsigned char *out) = 0; virtual size_t size() const = 0; }; class HMACInstance : public RC { public: typedef RCPtr Ptr; virtual void reset() = 0; virtual void update(const unsigned char *in, const size_t size) = 0; virtual size_t final(unsigned char *out) = 0; virtual size_t size() const = 0; }; class DigestFactory : public RC { public: typedef RCPtr Ptr; virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type) = 0; virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size) = 0; }; // Digest implementation using CRYPTO_API template class CryptoDigestInstance : public DigestInstance { public: CryptoDigestInstance(const CryptoAlgs::Type digest, SSLLib::Ctx libctx) : impl(digest, libctx) { } virtual void update(const unsigned char *in, const size_t size) { impl.update(in, size); } virtual size_t final(unsigned char *out) { return impl.final(out); } virtual size_t size() const { return impl.size(); } private: typename CRYPTO_API::DigestContext impl; }; template class CryptoHMACInstance : public HMACInstance { public: CryptoHMACInstance(const CryptoAlgs::Type digest, const unsigned char *key, const size_t key_size) : impl(digest, key, key_size) { } virtual void reset() { impl.reset(); } virtual void update(const unsigned char *in, const size_t size) { impl.update(in, size); } virtual size_t final(unsigned char *out) { return impl.final(out); } size_t size() const { return impl.size(); } private: typename CRYPTO_API::HMACContext impl; }; template class CryptoDigestFactory : public DigestFactory { public: CryptoDigestFactory(SSLLib::Ctx libctx_arg = nullptr) : libctx(libctx_arg) { } virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type) { return new CryptoDigestInstance(digest_type, libctx); } virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size) { return new CryptoHMACInstance(digest_type, key, key_size); } SSLLib::Ctx libctx; }; } // namespace openvpn #endif