All information inserted into such a std::ostream is used to compute a message HMAC from.
All the message digest algorithms defined by the OpenSSL library that can be selected by name may be used in combination with HMacBuf objects.
The following message hmac algorithms are currently supported: mull, md2, md5, sha, sha1, sha224, sha256, sha384, sha512, dss, dss1, ecdsa, mdc2, ripemd160. These very names are the ones to use to select the particular digest algorithm for the class's constructor, below. It is quite possible that future releases of the openssl library will support additional message digest algorithms. The header file openssl/evp.h lists all available hmac algorithms (in that file look for EVP_MD *EVP_: a message digest algorithm immediately follows the 2nd underscore. E.g., const EVP_MD *EVP_md4(void) which refers to the md4 message digest algorithm).
The constructor's first argument defines the key to be used when computing the HMAC message digest.
The bufsize argument specifies the internal buffer used by HMacBuf to store incoming characters temporarily. The provided default argument should be OK in all normal cases.
All members of std::streambuf are available, as FBB::HMacBuf inherits from this class. Some of the std::streambuf's member are overridden or are hidden by HMacBuf. In normal situations these inherited members will not be used by programs using HMacBuf objects.
create a HMacBuf object use it to create a std::ostream object insert information into the ostream object call the HMacBuf object's close() member obtain/process the hash value from the HMacBuf object.
#include <iostream> #include <ostream> #include <cstring> #include <iomanip> #include <bobcat/exception> #include <bobcat/hmacbuf> using namespace std; using namespace FBB; int main(int argc, char **argv) try { if (argc < 3) throw Exception(0) << "Arg1: key, arg2: digest method required"; string key(argv[1]); HMacBuf hmacbuf(key, argv[2]); ostream out(&hmacbuf); string hw("hello world\n"); out << hw; hmacbuf.close(); cout << ">" << hmacbuf << "<" << endl; hmacbuf.open(); out.write(hw.c_str(), hw.length()); hmacbuf.close(); cout << ">" << hmacbuf << "<" << endl; } catch(exception const &err) { cout << err.what() << endl; return errno; }