#include "dkcHMAC.h"
#include "dkcStdio.h"
dkcHMAC.cのインクルード依存関係図

マクロ定義 | |
| #define | dkcdHMAC_IMPL_STRING 0 |
関数 | |
| DKC_HMAC *WINAPI | dkcAllocHMAC (UINT option) |
| option[in] edk_SecureHashを使用 | |
| int WINAPI | dkcFreeHMAC (DKC_HMAC **pp) |
| void WINAPI | dkcHMACInit (DKC_HMAC *p, const BYTE *key, size_t key_length) |
| DKC_HMACを初期化する。別にdkcAllocHMAC()した後 即dkcHMACLoad()を呼んでも問題無い。. | |
| void DKC_INLINE WINAPI | dkcHMACKeyInner (DKC_HMAC *p) |
| ipadをハッシュ関数に通過させる処理 | |
| void WINAPI | dkcHMACLoad (DKC_HMAC *p, const BYTE *pBuffer, DWORD dwSize) |
| int WINAPI | dkcHMACFinal (DKC_HMAC *p) |
| int WINAPI | dkcHMACDigestStr (DKC_HMAC *p, char *buff, size_t size) |
| 文字列のMessage Digestを取得する。 | |
| int WINAPI | dkcHMACDigest (DKC_HMAC *p, BYTE *buff, size_t size) |
| バイナリのMessage Digestを取得する。 | |
dkcHMAC.c で定義されています。
|
|
|
|
|
option[in] edk_SecureHashを使用
参照先 dkc_SecureHashObject::digest_binary_size, DKC_HMAC, dkcAllocate(), dkcAllocSHO(), dkcFreeHMAC(), dkc_HMAC::ipad, dkc_HMAC::ipad_init, NULL, dkc_HMAC::opad, dkc_HMAC::opad_init, dkc_HMAC::pad_size, と dkc_HMAC::sho.
00098 {
00099 DKC_HMAC *p;
00100
00101 size_t padsize ;
00102
00103 //check_init();
00104
00105 p = dkcAllocate(sizeof(DKC_HMAC));
00106 if(NULL==p){
00107 return NULL;
00108 }
00109
00110 p->sho = dkcAllocSHO(option);
00111 if(NULL==p->sho){
00112 goto Error;
00113 }
00114
00115
00116
00117 //初期化した値から必要なパッドを確保
00118 p->pad_size = p->sho->digest_binary_size * 4;
00119
00120 padsize = p->pad_size + 1;// + 1は文字列なので・・・
00121
00122 p->ipad_init = 0x36;
00123 p->opad_init = 0x5c;
00124
00125 p->ipad = malloc( padsize );
00126 if(NULL==p->ipad){
00127 goto Error;
00128 }
00129 p->opad = malloc( padsize );
00130 if(NULL==p->opad){
00131 goto Error;
00132 }
00133
00134
00135 return p;
00136 Error:
00137 dkcFreeHMAC(&p);
00138 return NULL;
00139 }
|
|
|
参照先 DKC_HMAC, dkcFree(), dkcFreeSHO(), dkc_HMAC::ipad, NULL, dkc_HMAC::opad, と dkc_HMAC::sho. 参照元 dkcAllocHMAC().
|
|
||||||||||||||||
|
バイナリのMessage Digestを取得する。
参照先 BYTE, DKC_HMAC, dkcmASSERT, dkcSHODigest(), dkc_HMAC::mInited, と dkc_HMAC::sho.
00310 {
00311 dkcmASSERT(2==p->mInited);
00312 return dkcSHODigest(p->sho,buff,size);
00313 }
|
|
||||||||||||||||
|
文字列のMessage Digestを取得する。
参照先 DKC_HMAC, dkcmASSERT, dkcSHODigestStr(), dkc_HMAC::mInited, と dkc_HMAC::sho.
00303 {
00304 dkcmASSERT(2==p->mInited);
00305 return dkcSHODigestStr(p->sho,buff,size);
00306 }
|
|
|
参照先 BYTE, DKC_HMAC, DKC_SECURE_HASH_OBJECT, dkcHMACKeyInner(), dkcmNOT_ASSERT, dkcSHODigest(), dkcSHODigestStr(), dkcSHOFinal(), dkcSHOInit(), dkcSHOLoad(), FALSE, dkc_HMAC::mInited, dkc_HMAC::mInnerHashKeyed, NULL, dkc_HMAC::opad, dkc_HMAC::pad_size, と dkc_HMAC::sho.
00255 {
00256 //ThrowIfInvalidTruncatedSize(size);
00257
00258 #if dkcdHMAC_IMPL_STRING
00259
00260 size_t tempsize = p->pad_size;
00261 char *temp = malloc(tempsize);
00262
00263 #else
00264 size_t tempsize = p->pad_size / 4;
00265 char *temp = malloc(tempsize);
00266
00267 #endif
00268 DKC_SECURE_HASH_OBJECT *pt = p->sho;
00269 dkcmNOT_ASSERT(FALSE==p->mInited);
00270
00271 if(NULL==temp){
00272 return edk_FAILED;
00273 }
00274 if(FALSE == p->mInnerHashKeyed){
00275 dkcHMACKeyInner(p);
00276 }
00277
00278 //End of inner process
00279 dkcSHOFinal(pt);
00280 #if dkcdHMAC_IMPL_STRING
00281 dkcSHODigestStr(pt,temp,tempsize);
00282 #else
00283 dkcSHODigest(pt,(BYTE *)temp,tempsize);
00284 #endif
00285
00286 //begin outer process
00287 dkcSHOInit(pt);
00288 dkcSHOLoad(pt,p->opad,p->pad_size);
00289 dkcSHOLoad(pt,(const BYTE *)temp,tempsize);
00290
00291 dkcSHOFinal(pt);
00292
00293 //ココバグっているかも?
00294 //p->mInnerHashKeyed = FALSE;
00295 //state を 2にする
00296 p->mInited = 2;
00297
00298 free(temp);
00299 return edk_SUCCEEDED;
00300 }
|
|
||||||||||||||||
|
DKC_HMACを初期化する。別にdkcAllocHMAC()した後 即dkcHMACLoad()を呼んでも問題無い。.
参照先 BYTE, dkc_SecureHashObject::digest_binary_size, dkc_SecureHashObject::digest_string_size, DKC_HMAC, dkcmASSERT, dkcSecureHashCalculateBinaryDigest(), dkcSecureHashCalculateStringDigest(), dkcSHOInit(), FALSE, dkc_HMAC::ipad, dkc_HMAC::ipad_init, dkc_HMAC::mInited, dkc_HMAC::mInnerHashKeyed, dkc_SecureHashObject::mOption, dkc_HMAC::opad, dkc_HMAC::opad_init, dkc_HMAC::pad_size, dkc_HMAC::sho, と TRUE.
00161 {
00162
00163 size_t padsize = p->pad_size;
00164
00165 if (TRUE==p->mInnerHashKeyed)
00166 {
00167 //中身のハッシュ値を初期化
00168 dkcSHOInit(p->sho);
00169 //成功^^ 中身はないよフラグをする。
00170 p->mInnerHashKeyed = FALSE;
00171 }
00172
00173
00174
00175 //パッド作り
00176 if(key_length <= padsize)
00177 {
00178 memcpy(p->ipad,key,key_length);
00179 }
00180 else
00181 {
00182
00183 #if dkcdHMAC_IMPL_STRING //文字列版
00184 dkcSecureHashCalculateStringDigest(
00185 p->sho->mOption,
00186 (char *)p->ipad,p->pad_size,
00187 key,key_length
00188 );
00189 //update key_length
00190 key_length = p->sho->digest_string_size;
00191 dkcmASSERT(key_length <= p->sho->digest_string_size);
00192
00193 #else //binary版
00194 dkcSecureHashCalculateBinaryDigest(
00195 p->sho->mOption,
00196 p->ipad,p->pad_size,
00197 key,key_length
00198 );
00199 //update key_length
00200 key_length = p->sho->digest_binary_size;
00201 dkcmASSERT(key_length <= p->sho->digest_binary_size);
00202 #endif
00203 }
00204
00205
00206 dkcmASSERT(key_length <= padsize);
00207 //バッファの埋め合わせ
00208 memset(p->ipad + key_length, 0, padsize - key_length);
00209
00210 //pad初期化
00211 {
00212 BYTE *ipad,*opad,iv,ov;
00213 size_t i;
00214
00215 ipad = p->ipad;
00216 opad = p->opad;
00217 iv = p->ipad_init;
00218 ov = p->opad_init;
00219
00220 for (i=0; i<padsize; i++)
00221 {
00222
00223 opad[i] = (BYTE)(ipad[i] ^ ov);
00224 ipad[i] ^= iv;
00225 }
00226
00227 }
00228
00229 p->mInited = 1;
00230
00231 }
|
|
|
ipadをハッシュ関数に通過させる処理
参照先 DKC_HMAC, dkcmASSERT, dkcSHOLoad(), dkc_HMAC::ipad, dkc_HMAC::mInnerHashKeyed, dkc_HMAC::pad_size, dkc_HMAC::sho, と TRUE. 参照元 dkcHMACFinal(), と dkcHMACLoad().
00235 {
00236 dkcmASSERT(!p->mInnerHashKeyed);
00237 dkcSHOLoad(p->sho,p->ipad,p->pad_size);
00238
00239 p->mInnerHashKeyed = TRUE;
00240 }
|
|
||||||||||||||||
|
参照先 BYTE, DKC_HMAC, dkcHMACKeyInner(), dkcmASSERT, dkcSHOLoad(), FALSE, dkc_HMAC::mInited, dkc_HMAC::mInnerHashKeyed, と dkc_HMAC::sho.
00244 {
00245 dkcmASSERT(1==p->mInited);
00246
00247 if(FALSE == p->mInnerHashKeyed){
00248 dkcHMACKeyInner(p);
00249 }
00250 dkcSHOLoad(p->sho,pBuffer,dwSize);
00251 }
|
1.3.6