43 template <
typename Fn2>
static std::string
hmac( Fn2 digest , std::size_t blocksize ,
const std::string & key ,
44 const std::string & input ) ;
69 template <
typename Fn2>
static std::string
hmac( Fn2 postdigest ,
const std::string & masked_key ,
70 const std::string & input ,
Masked ) ;
75 template <
typename Fn1,
typename Fn2>
static std::string
mask( Fn1 predigest , Fn2 digest ,
76 std::size_t blocksize ,
const std::string & shared_key ) ;
95 static std::string
printable(
const std::string & input ) ;
103 template <
typename Fn2>
static std::string keyx( Fn2 , std::size_t blocksize , std::string k ) ;
104 static std::string xor_(
const std::string & s1 ,
const std::string & s2 ) ;
105 static std::string ipad( std::size_t blocksize ) ;
106 static std::string opad( std::size_t blocksize ) ;
109template <
typename Fn2>
110std::string G::Hash::keyx( Fn2 fn , std::size_t blocksize , std::string k )
112 if( k.length() > blocksize )
113 k = fn( k , std::string() ) ;
114 if( k.length() < blocksize )
115 k.append( blocksize-k.length() ,
'\0' ) ;
119template <
typename Fn2>
120std::string
G::Hash::hmac( Fn2 fn , std::size_t blocksize ,
const std::string & k ,
const std::string & input )
122 const std::string kx = keyx( fn , blocksize , k ) ;
123 return fn( xor_(kx,opad(blocksize)) , fn(xor_(kx,ipad(blocksize)),input) ) ;
126template <
typename Fn,
typename Fn2>
127std::string
G::Hash::mask( Fn predigest_fn , Fn2 digest_fn , std::size_t blocksize ,
const std::string & k )
129 std::string kx = keyx( digest_fn , blocksize , k ) ;
130 std::string ki_state = predigest_fn( xor_(kx,ipad(blocksize)) ) ;
131 std::string ko_state = predigest_fn( xor_(kx,opad(blocksize)) ) ;
132 return ki_state + ko_state ;
135template <
typename Fn2>
136std::string
G::Hash::hmac( Fn2 postdigest_fn ,
const std::string & masked_key ,
const std::string & input ,
Masked )
138 return postdigest_fn( masked_key , input ) ;
A class for creating HMACs using an arbitrary cryptographic hash function as per RFC-2104.
static std::string hmac(Fn2 digest, std::size_t blocksize, const std::string &key, const std::string &input)
Computes a Hashed Message Authentication Code using the given hash function.
static std::string mask(Fn1 predigest, Fn2 digest, std::size_t blocksize, const std::string &shared_key)
Computes a masked key from the given shared key, returning a non-printable string.
static std::string printable(const std::string &input)
Converts a binary string into a printable form, using a lowercase hexadecimal encoding.
An overload discriminator for G::Hash::hmac()