azure-protected-vm-secrets/Linux/OsslAesWrapper.h (49 lines of code) (raw):

#include <openssl/evp.h> #include <memory> #include <cstddef> #include "../AesWrapper.h" //typedef std::basic_string<char, std::char_traits<char>, zallocator<char> > secure_string; //using EVP_CIPHER_CTX_ptr = std::unique_ptr<EVP_CIPHER_CTX, decltype(&::EVP_CIPHER_CTX_free)>; const size_t KEY_SIZE = 32; const size_t BLOCK_SIZE = 16; const size_t NONCE_SIZE = 12; class OsslAesChainingInfo { public: //virtual OsslAesChainingInfo(); virtual ~OsslAesChainingInfo(); virtual void SetNonce(const std::vector<unsigned char> &nonce) noexcept; virtual std::vector<unsigned char> GetNonce() noexcept; virtual void SetInitVector(const std::vector<unsigned char> &initVector) noexcept; virtual std::vector<unsigned char> GetInitVector() noexcept; }; class OsslGcmChainingInfo: public AesChainingInfo { public: OsslGcmChainingInfo(); ~OsslGcmChainingInfo(); void SetNonce(const std::vector<unsigned char> &nonce) noexcept; void SetInitVector(const std::vector<unsigned char> &initVector) noexcept; std::vector<unsigned char> GetNonce() noexcept; std::vector<unsigned char> GetInitVector() noexcept; private: std::vector<unsigned char> nonce; std::vector<unsigned char> initVector; std::vector<unsigned char> authTag; }; // Wrapper class for AES encryption and decryption class OsslGcmWrapper : public AesWrapper { public: OsslGcmWrapper(); ~OsslGcmWrapper(); // Set the key to be used for encryption and decryption // key: The key to be used for encryption and decryption // return: void void SetKey(std::vector<unsigned char> &key); // Initialize the authInfo structure and set the nonce to be used // for encryption and decryption // nonce: The nonce to be used for encryption and decryption // return: void std::unique_ptr<AesChainingInfo> SetChainingInfo(const std::vector<unsigned char> &nonce); // Encrypt the data using the key and chaining mode set // data: The data to be encrypted // return: The encrypted data std::vector<unsigned char> Encrypt(const std::vector<unsigned char> &data, AesChainingInfo *chainingInfo) const; // Decrypt the data using the key and chaining mode set // ciphertext: The data to be decrypted // return: The decrypted data std::vector<unsigned char> Decrypt(const std::vector<unsigned char> &ciphertext, AesChainingInfo *chainingInfo) const; private: EVP_CIPHER_CTX* ctx; std::vector<unsigned char> key; }; class OsslGcmCreator : public AesCreator { public: std::unique_ptr<AesWrapper> CreateAesWrapper() const override { return std::make_unique<OsslGcmWrapper>(); } };