%PDF- %PDF-
Direktori : /backups/router/usr/local/include/kea/cryptolink/ |
Current File : //backups/router/usr/local/include/kea/cryptolink/cryptolink.h |
// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef ISC_CRYPTO_H #define ISC_CRYPTO_H #include <string> #include <util/buffer.h> #include <exceptions/exceptions.h> #include <boost/noncopyable.hpp> #include <boost/shared_ptr.hpp> #include <memory> namespace isc { namespace cryptolink { /// @brief Hash algorithm identifiers. enum HashAlgorithm { UNKNOWN_HASH = 0, // This value can be used in conversion // functions, to be returned when the // input is unknown (but a value MUST be // returned), for instance when the input // is a Name or a string, and the return // value is a HashAlgorithm. MD5 = 1, // MD5 SHA1 = 2, // SHA-1 SHA256 = 3, // SHA-256 SHA224 = 4, // SHA-224 SHA384 = 5, // SHA-384 SHA512 = 6 // SHA-512 }; /// @brief Forward declaration for createHash(). class Hash; /// @brief Forward declaration for createHMAC(). class HMAC; /// @brief Forward declaration for getRNG(). class RNG; /// @brief Type representing the pointer to the RNG. typedef boost::shared_ptr<RNG> RNGPtr; /// @brief General exception class that is the base for all crypto-related /// exceptions class CryptoLinkError : public Exception { public: CryptoLinkError(const char* file, size_t line, const char* what) : isc::Exception(file, line, what) {} }; /// @brief This exception is thrown if there was a problem initializing the /// crypto library class InitializationError : public CryptoLinkError { public: InitializationError(const char* file, size_t line, const char* what) : CryptoLinkError(file, line, what) {} }; /// @brief This exception is thrown when a cryptographic action is requested /// for an algorithm that is not supported by the underlying library. class UnsupportedAlgorithm : public CryptoLinkError { public: UnsupportedAlgorithm(const char* file, size_t line, const char* what) : CryptoLinkError(file, line, what) {} }; /// @brief This exception is thrown when the underlying library could not /// handle the key data. class BadKey : public CryptoLinkError { public: BadKey(const char* file, size_t line, const char* what) : CryptoLinkError(file, line, what) {} }; /// @brief This exception is raised when a general error that was not /// specifically caught is thrown by the underlying library. It /// is replaced by this one so as not have 'external' exceptions /// bubbling up class LibraryError : public CryptoLinkError { public: LibraryError(const char* file, size_t line, const char* what) : CryptoLinkError(file, line, what) {} }; /// @brief Forward declarations for CryptoLink pimpl. class CryptoLinkImpl; /// @brief Type representing the pointer to the CryptoLinkImpl. typedef boost::shared_ptr<CryptoLinkImpl> CryptoLinkImplPtr; /// @brief Forward declarations for RNG pimpl. class RNGImpl; /// @brief Singleton entry point and factory class /// /// This is a singleton class that serves as the entry point to /// the underlying cryptography library, and as a factory for objects /// within the cryptolink library. /// /// There is only one way to access it, through getCryptoLink(), which /// returns a reference to the initialized library. On the first call, /// it will be initialized automatically. /// /// In order for the CryptoLink library to be sure that the underlying /// library has been initialized, and because we do not want to add /// such a check to every class and function within it, we have made /// the constructors of all classes within cryptolink private. This way /// a caller cannot instantiate an object before the library is /// initialized, but must use CryptoLink's create method (e.g. /// createHMAC()), which enforces (automatic) initialization. /// /// In order for the CryptoLink class to be able to create objects that /// have private constructors, it is declared a friend class of these /// classes. /// /// Since these factory functions return bare pointers, we also provide /// deleter functions for them (e.g. deleteHMAC()), so that a caller /// can use that to make sure it uses the correct delete operator (the /// one defined at compilation time of this library). A way to make /// sure you do not forget this, is to place the result of the create /// functions in a shared_ptr with the corresponding deleter function. /// /// @note All other classes within cryptolink should have private /// constructors as well, and should have a factory function from /// CryptoLink, and a deleter function. /// /// Internal note: we can use this class later to initialize and manage /// dynamic (PKCS#11) libs. class CryptoLink : private boost::noncopyable { public: /// @brief Returns a reference to the singleton instance. /// /// If the library has not been initialized yet, it will be /// initialized with some default values. /// /// Since this class is noncopyable, you must use the return /// value directly, or store it in a reference variable. /// /// @throw InitializationError if initialization fails. /// /// @return Reference to the singleton instance. static CryptoLink& getCryptoLink(); /// @brief Get version string. /// /// @return The version as string. static std::string getVersion(); /// @brief Factory function for Hash objects. /// /// CryptoLink objects cannot be constructed directly. This /// function creates a new Hash object usable for signing or /// verification. /// /// The caller is responsible for deleting the object, and it is /// therefore highly recommended to place the return value of this /// function in a scoped_ptr or shared_ptr. /// /// If you want to safely delete objects created with this method, /// you can use the function deleteHash() as defined in /// crypto_hash.h. /// /// @throw UnsupportedAlgorithmException if the given algorithm /// is unknown or not supported by the underlying library. /// @throw LibraryError if there was any unexpected exception /// in the underlying library. /// /// @param hash_algorithm The hash algorithm. /// /// @return The new hash. Hash* createHash(const HashAlgorithm hash_algorithm); /// @brief Factory function for HMAC objects /// /// CryptoLink objects cannot be constructed directly. This /// function creates a new HMAC object usable for signing or /// verification. /// /// The caller is responsible for deleting the object, and it is /// therefore highly recommended to place the return value of this /// function in a scoped_ptr or shared_ptr. /// /// Notes: if the secret is longer than the block size of its /// algorithm, the constructor will run it through the hash /// algorithm, and use the digest as the secret for this HMAC /// operation. /// /// If you want to safely delete objects created with this method, /// you can use the function deleteHMAC() as defined in /// crypto_hmac.h. /// /// @throw UnsupportedAlgorithmException if the given algorithm /// is unknown or not supported by the underlying library. /// @throw InvalidKeyLength if the given key secret_len is bad. /// @throw LibraryError if there was any unexpected exception /// in the underlying library. /// /// @param secret The secret to sign with /// @param secret_len The length of the secret /// @param hash_algorithm The hash algorithm /// /// @return The new hash. HMAC* createHMAC(const void* secret, size_t secret_len, const HashAlgorithm hash_algorithm); /// @brief Get the global RNG. /// /// @throw NotImplemented if the method was not implemented /// in a derived class. /// @throw LibraryError if there was any unexpected exception /// in the underlying library. /// /// @return The gobal RNG. virtual RNGPtr const& getRNG() const; private: /// @brief Initialize the library. /// /// If the library has already been initialized (either by a call /// to initialize() or automatically in getCryptoLink()), this /// function does nothing. /// /// @note A call to initialize() is not strictly necessary with /// the current implementation. /// /// @throw InitializationError if initialization fails. /// /// @param c the CryptoLink singleton instance which is being initialized. void initialize(CryptoLink& c); /// @note To prevent people constructing their own, we make the constructor /// private too. CryptoLink() { initialize(*this); } ~CryptoLink(); /// @brief Smart pointer holding the implementation. CryptoLinkImplPtr impl_; /// @brief Smart pointer holding the RNG. RNGPtr rng_; }; } // namespace cryptolink } // namespace isc #endif // ISC_CRYPTO_H