xsec/enc/OpenSSL/OpenSSLCryptoHashHMAC.hpp (37 lines of code) (raw):

/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* * XSEC * * OpenSSLCryptoHashHMAC := OpenSSL Implementation of HMAC * * Author(s): Berin Lautenbach * * $Id$ * */ #ifndef OPENSSLCRYPTOHASHHMAC_INCLUDE #define OPENSSLCRYPTOHASHHMAC_INCLUDE #include <xsec/framework/XSECDefs.hpp> #include <xsec/enc/XSECCryptoHash.hpp> #include <xsec/utils/XSECSafeBuffer.hpp> // OpenSSL Includes #if defined (XSEC_HAVE_OPENSSL) #include <openssl/evp.h> #include <openssl/hmac.h> /** * @ingroup opensslcrypto */ /** * \brief Implementation of HMAC Hash functions in OpenSSL * * Uses the OpenSSL EVP_digest functions to implement the various * HMAC hash functions required by the library. * */ class XSEC_EXPORT OpenSSLCryptoHashHMAC : public XSECCryptoHash { public : /** @name Constructors and Destructors */ //@{ /** * \brief Constructor * * Create the object, with the indicated algorithm * (Currently supports MD5 and SHA1) * * @param alg Digest algorithm to use */ OpenSSLCryptoHashHMAC(XSECCryptoHash::HashType alg); /** * \brief Destructor * * Destroy the object. Will ensure any key material is also destroyed */ virtual ~OpenSSLCryptoHashHMAC(); //@} /** @name HMAC Functions */ //@{ /** *\brief Set the HMAC key * * Sets the key - which needs to have a base class of * OpenSSLCryptoKeyHMAC. * * @param key The key the HMAC function should use. */ virtual void setKey(const XSECCryptoKey* key); /** * \brief Return the string identifier for the OpenSSL interface */ virtual const XMLCh* getProviderName() const; //@} /** @name Hash Functions */ //{@ /** * \brief Reset the hash function * * Re-initialises the digest structure. */ virtual void reset(); /** * \brief Hash some data. * * Take length bytes of data from the data buffer and update the hash * that already exists. This function may (and normally will) be called * many times for large blocks of data. * * @param data The buffer containing the data to be hashed. * @param length The number of bytes to be read from data */ virtual void hash(unsigned char* data, unsigned int length); /** * \brief Finish up a Digest operation and read the result. * * This call tells the CryptoHash object that the input is complete and * to finalise the Digest. The output of the digest is read into the * hash buffer (at most maxLength bytes). This is effectively the * signature for the data that has been run through the HMAC function. * * @param hash The buffer the hash should be read into. * @param maxLength The maximum number of bytes to be read into hash * @returns The number of bytes copied into the hash buffer */ virtual unsigned int finish(unsigned char* hash, unsigned int maxLength);// Finish and get hash //@} /** @name Information functions */ //@{ /** *\brief * * Determine the hash type of this object * * @returns The hash type */ virtual HashType getHashType() const; /** * \brief Get OpenSSL Hash Context */ HMAC_CTX* getOpenSSLHMAC_CTX(void) {return mp_hctx;} //@} private: // Not implemented constructors OpenSSLCryptoHashHMAC(); const EVP_MD * mp_md; // Digest instance unsigned char m_mdValue[EVP_MAX_MD_SIZE]; // Final output unsigned int m_mdLen; // Length of digest HashType m_hashType; // What type of hash is this? HMAC_CTX * mp_hctx; // Context for HMAC #if (OPENSSL_VERSION_NUMBER < 0x10100000L) HMAC_CTX m_hctx_store; // Context for HMAC - store #endif safeBuffer m_keyBuf; // The loaded key unsigned int m_keyLen; // The loaded key length bool m_initialised; }; #endif /* XSEC_HAVE_OPENSSL */ #endif /* OPENSSLCRYPTOHASHHMAC_INCLUDE */