@@ -38,6 +38,12 @@ namespace usbguard
3838#if defined(USBGUARD_USE_LIBSODIUM)
3939 crypto_hash_sha256_init (&_state);
4040#endif
41+ #if defined(USBGUARD_USE_OPENSSL)
42+ if ((_state = EVP_MD_CTX_new ()) == nullptr )
43+ throw std::runtime_error (" Dynamic memory allocation of message digest context failed." );
44+ if (!EVP_DigestInit_ex (_state, EVP_sha256 (), nullptr ))
45+ throw std::runtime_error (" Context initialization of message digest context failed." );
46+ #endif
4147#if defined(USBGUARD_USE_LIBGCRYPT)
4248 gcry_md_open (&_state, GCRY_MD_SHA256 , 0 );
4349#endif
@@ -49,6 +55,9 @@ namespace usbguard
4955#if defined(USBGUARD_USE_LIBSODIUM)
5056 _state = rhs._state ;
5157#endif
58+ #if defined(USBGUARD_USE_OPENSSL)
59+ _state = rhs._state ;
60+ #endif
5261#if defined(USBGUARD_USE_LIBGCRYPT)
5362 gcry_md_copy (&_state, rhs._state );
5463#endif
@@ -61,6 +70,10 @@ namespace usbguard
6170 _state = rhs._state ;
6271 memset (&rhs._state , 0 , sizeof _state);
6372#endif
73+ #if defined(USBGUARD_USE_OPENSSL)
74+ _state = rhs._state ;
75+ memset (&rhs._state , 0 , sizeof _state);
76+ #endif
6477#if defined(USBGUARD_USE_LIBGCRYPT)
6578 _state = rhs._state ;
6679 rhs._state = nullptr ;
@@ -74,6 +87,10 @@ namespace usbguard
7487 _state = rhs._state ;
7588 memset (&rhs._state , 0 , sizeof _state);
7689#endif
90+ #if defined(USBGUARD_USE_OPENSSL)
91+ _state = rhs._state ;
92+ memset (&rhs._state , 0 , sizeof _state);
93+ #endif
7794#if defined(USBGUARD_USE_LIBGCRYPT)
7895 _state = rhs._state ;
7996 rhs._state = nullptr ;
@@ -83,6 +100,9 @@ namespace usbguard
83100
84101 Hash::~Hash ()
85102 {
103+ #if defined(USBGUARD_USE_OPENSSL)
104+ EVP_MD_CTX_free (_state);
105+ #endif
86106 release ();
87107 }
88108
@@ -91,6 +111,9 @@ namespace usbguard
91111#if defined(USBGUARD_USE_LIBSODIUM)
92112 memset (&_state, 0 , sizeof _state);
93113#endif
114+ #if defined(USBGUARD_USE_OPENSSL)
115+ memset (&_state, 0 , sizeof _state);
116+ #endif
94117#if defined(USBGUARD_USE_LIBGCRYPT)
95118
96119 if (_state != nullptr ) {
@@ -110,6 +133,10 @@ namespace usbguard
110133#if defined(USBGUARD_USE_LIBSODIUM)
111134 crypto_hash_sha256_update (&_state, reinterpret_cast <const uint8_t *>(ptr), size);
112135#endif
136+ #if defined(USBGUARD_USE_OPENSSL)
137+ if (!EVP_DigestUpdate (_state, reinterpret_cast <const uint8_t *>(ptr), size))
138+ throw std::runtime_error (" Hashing data into message digest context failed." );
139+ #endif
113140#if defined(USBGUARD_USE_LIBGCRYPT)
114141 gcry_md_write (_state, ptr, size);
115142#endif
@@ -130,6 +157,10 @@ namespace usbguard
130157#if defined(USBGUARD_USE_LIBSODIUM)
131158 crypto_hash_sha256_update (&_state, buffer, buflen);
132159#endif
160+ #if defined(USBGUARD_USE_OPENSSL)
161+ if (!EVP_DigestUpdate (_state, buffer, buflen))
162+ throw std::runtime_error (" Hashing data into message digest context failed." );
163+ #endif
133164#if defined(USBGUARD_USE_LIBGCRYPT)
134165 gcry_md_write (_state, buffer, buflen);
135166#endif
@@ -148,6 +179,14 @@ namespace usbguard
148179 const uint8_t * const hash_buffer = hash_binary;
149180 const size_t hash_buflen = sizeof hash_binary;
150181#endif
182+ #if defined(USBGUARD_USE_OPENSSL)
183+ uint8_t hash_binary[EVP_MAX_MD_SIZE ];
184+ unsigned int hash_len;
185+ if (!EVP_DigestFinal_ex (_state, hash_binary, &hash_len))
186+ throw std::runtime_error (" Digest value retrieval failed." );
187+ const uint8_t * const hash_buffer = hash_binary;
188+ const size_t hash_buflen = hash_len;
189+ #endif
151190#if defined(USBGUARD_USE_LIBGCRYPT)
152191 gcry_md_final (_state);
153192 const size_t hash_buflen = gcry_md_get_algo_dlen (GCRY_MD_SHA256 );
0 commit comments