security: Add support for OpenSSL 1.1.0 API

Change-Id: I8deb4c5c5cbc1755b492ccd12707d83764a91ad7
Refs: #3757
diff --git a/src/security/transform/hmac-filter.cpp b/src/security/transform/hmac-filter.cpp
index 10dc0a7..d45cd85 100644
--- a/src/security/transform/hmac-filter.cpp
+++ b/src/security/transform/hmac-filter.cpp
@@ -29,6 +29,7 @@
 class HmacFilter::Impl
 {
 public:
+#if OPENSSL_VERSION_NUMBER < 0x1010000fL
   Impl()
   {
     HMAC_CTX_init(&m_context);
@@ -39,8 +40,32 @@
     HMAC_CTX_cleanup(&m_context);
   }
 
-public:
+  operator HMAC_CTX*()
+  {
+    return &m_context;
+  }
+
+private:
   HMAC_CTX m_context;
+#else
+  Impl()
+    : m_context(HMAC_CTX_new())
+  {
+  }
+
+  ~Impl()
+  {
+    HMAC_CTX_free(m_context);
+  }
+
+  operator HMAC_CTX*()
+  {
+    return m_context;
+  }
+
+private:
+  HMAC_CTX* m_context;
+#endif // OPENSSL_VERSION_NUMBER < 0x1010000fL
 };
 
 HmacFilter::HmacFilter(DigestAlgorithm algo, const uint8_t* key, size_t keyLen)
@@ -53,14 +78,14 @@
   if (algorithm == nullptr)
     BOOST_THROW_EXCEPTION(Error(getIndex(), "Unsupported digest algorithm"));
 
-  if (HMAC_Init_ex(&m_impl->m_context, key, keyLen, algorithm, nullptr) == 0)
+  if (HMAC_Init_ex(*m_impl, key, keyLen, algorithm, nullptr) == 0)
     BOOST_THROW_EXCEPTION(Error(getIndex(), "Cannot initialize HMAC"));
 }
 
 size_t
 HmacFilter::convert(const uint8_t* buf, size_t size)
 {
-  if (HMAC_Update(&m_impl->m_context, buf, size) == 0)
+  if (HMAC_Update(*m_impl, buf, size) == 0)
     BOOST_THROW_EXCEPTION(Error(getIndex(), "Failed to update HMAC"));
 
   return size;
@@ -72,7 +97,7 @@
   auto buffer = make_unique<OBuffer>(EVP_MAX_MD_SIZE);
   unsigned int mdLen = 0;
 
-  if (HMAC_Final(&m_impl->m_context, &(*buffer)[0], &mdLen) == 0)
+  if (HMAC_Final(*m_impl, &(*buffer)[0], &mdLen) == 0)
     BOOST_THROW_EXCEPTION(Error(getIndex(), "Failed to finalize HMAC"));
 
   buffer->erase(buffer->begin() + mdLen, buffer->end());