Declaration
template <class Engine> Engine hmac(const char* key, size_t keylen, const char* data, size_t datalen); template <class Engine> Engine hmac(const std::string& key, const std::string& data);
Overview
hmac クラスは,HMAC (Keyed-Hashing for Message Authentication Code) アルゴリズムを用いてダイジェストを計算するためのクラスです.Engine には, MD5 や SHA1 などのハッシュ値を計算するためのクラスを指定します.指定する Engine には以下のメソッドが定義されている必要があります.
class engine { public: const char* code() const; int size() const; };
code() メソッドは計算されたハッシュ値を返します.また,size() メソッドはハッシュ値のデータサイズを返します.Engin に関しては,現在のところ md5 および sha1 を実装しています.
Example
#include <iostream> #include "clx/hmac.h" #include "clx/md5.h" int main(int argc, char* argv[]) { // test_case = 1 char key1[17]; char dat1[9] = "Hi There"; for (size_t i = 0; i < sizeof(key1) - 1; ++i) key1[i] = 0x0b; std::cout << "case 1: " << clx::hmac<clx::md5>(key1, sizeof(key1) - 1, dat1, sizeof(dat1) - 1).to_string() << std::endl; // test_case = 2 char key2[5] = "Jefe"; char dat2[29] = "what do ya want for nothing?"; std::cout << "case 2: " << clx::hmac<clx::md5>(key2, sizeof(key2) - 1, dat2, sizeof(dat2) - 1).to_string() << std::endl; // test_cast = 3 char key3[17]; char dat3[51]; for (size_t i = 0; i < sizeof(key3) - 1; ++i) key3[i] = 0xaa; for (size_t i = 0; i < sizeof(dat3) - 1; ++i) dat3[i] = 0xdd; std::cout << "case 3: " << clx::hmac<clx::md5>(key3, sizeof(key3) - 1, dat3, sizeof(dat3) - 1).to_string() << std::endl; // test_cast = 4 char key4[26]; char dat4[51]; for (size_t i = 0; i < sizeof(key4) - 1; ++i) key4[i] = i + 1; for (size_t i = 0; i < sizeof(dat4) - 1; ++i) dat4[i] = 0xcd; std::cout << "case 4: " << clx::hmac<clx::md5>(key4, sizeof(key4) - 1, dat4, sizeof(dat4) - 1).to_string() << std::endl; // test_cast = 5 char key5[17]; char dat5[21] = "Test With Truncation"; for (size_t i = 0; i < sizeof(key5) - 1; ++i) key5[i] = 0x0c; std::cout << "case 5: " << clx::hmac<clx::md5>(key5, sizeof(key5) - 1, dat5, sizeof(dat5) - 1).to_string() << std::endl; // test_case = 6 char key6[81]; char dat6[55] = "Test Using Larger Than Block-Size Key - Hash Key First"; for (size_t i = 0; i < sizeof(key6) - 1; ++i) key6[i] = 0xaa; std::cout << "case 6: " << clx::hmac<clx::md5>(key6, sizeof(key6) - 1, dat6, sizeof(dat6) - 1).to_string() << std::endl; // test_case = 7 char key7[81]; char dat7[74] = "Test Using Larger Than Block-Size Key " "and Larger Than One Block-Size Data"; for (size_t i = 0; i < sizeof(key7) - 1; ++i) key7[i] = 0xaa; std::cout << "case 7: " << clx::hmac<clx::md5>(key7, sizeof(key7) - 1, dat7, sizeof(dat7) - 1).to_string() << std::endl; return 0; }
Result case 1: 9294727a3638bb1c13f48ef8158bfc9d case 2: 750c783e6ab0b503eaa86e310a5db738 case 3: 56be34521d144c88dbb8c733f0e8b3f6 case 4: 697eaf0aca3a3aea3a75164746ffaa79 case 5: 56461ef2342edc00f9bab995690efd4c case 6: 6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd case 7: 6f630fad67cda0ee1fb1f562db3aa53e
HMAC-SHA1 のサンプルコードについては, example_hmac_sha1.cpp を参照して下さい.