メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcMD5.h

MD5 Algorithm [詳細]

#include "md_misc.h"
#include "dkcOSIndependent.h"

dkcMD5.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

構成

struct  dkc_MD5_Adapter

マクロ定義

#define MD5_BIN_BUFFER_SIZE   16
 MD5バイナリのシグネチャ保存に必要な領域
#define MD5_STR_BUFFER_SIZE   33
 MD5文字列のシグネチャ保存に必要な領域

型定義

typedef dkc_MD5_Adapter DKC_MD5_ADAPTER

列挙型

enum  edkcMD5ObjectFlag { edkcMD5_Default = 0, edkcMD5_Aladdin }

関数

DKC_EXTERN DKC_MD5 *WINAPI dkcAllocMD5 ()
DKC_EXTERN void WINAPI dkcMD5Init (DKC_MD5 *)
DKC_INLINE void dkcMD5InitEx (DKC_MD5 *p, uint8 flags)
DKC_EXTERN void WINAPI dkcMD5Load (DKC_MD5 *p, const BYTE *pBuffer, DWORD dwSize)
DKC_EXTERN void WINAPI dkcMD5Final (DKC_MD5 *p)
DKC_EXTERN int WINAPI dkcMD5DigestStr (DKC_MD5 *p, char *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5Digest (DKC_MD5 *p, BYTE *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5FinalDigestStr (DKC_MD5 *p, char *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5FinalDigest (DKC_MD5 *p, BYTE *buff, size_t size)
DKC_EXTERN int WINAPI dkcFreeMD5 (DKC_MD5 **p)
DKC_EXTERN void WINAPI dkcMD5LoadDouble (DKC_MD5 *p, uint8 const *buf, uint32 len, DKC_MD5 *p2, uint8 const *buf2, uint32 len2)
 len != len2 だと落ちます。
DKC_EXTERN DKC_MD5_ADAPTER
*WINAPI 
dkcAllocMD5Adapter (uint32 md5_objflag)
DKC_EXTERN void WINAPI dkcMD5AdapterInit (DKC_MD5_ADAPTER *)
DKC_EXTERN int WINAPI dkcMD5AdapterLoad (DKC_MD5_ADAPTER *p, const BYTE *pBuffer, DWORD dwSize)
DKC_EXTERN void WINAPI dkcMD5AdapterLoadStandard (DKC_MD5_ADAPTER *p, const BYTE *pBuffer, DWORD dwSize)
 dkcSHA1Load() dkcSHA256Load()等と同じ仕様のLoad
DKC_EXTERN void WINAPI dkcMD5AdapterFinal (DKC_MD5_ADAPTER *p)
DKC_EXTERN int WINAPI dkcMD5AdapterDigestStr (DKC_MD5_ADAPTER *p, char *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5AdapterDigest (DKC_MD5_ADAPTER *p, BYTE *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5AdapterFinalDigestStr (DKC_MD5_ADAPTER *p, char *buff, size_t size)
DKC_EXTERN int WINAPI dkcMD5AdapterFinalDigest (DKC_MD5_ADAPTER *p, BYTE *buff, size_t size)
DKC_EXTERN int WINAPI dkcFreeMD5Adapter (DKC_MD5_ADAPTER **p)


説明

MD5 Algorithm

作者:
wrapped by d金魚
覚え書き:
MD5はすでに終わった?アルゴリズムなので、SHA1をご利用ください。 また、2005年度現在で安全性を考慮するならばSHA256以上にすると良いと思われます。

dkcMD5.h で定義されています。


マクロ定義

#define MD5_BIN_BUFFER_SIZE   16
 

MD5バイナリのシグネチャ保存に必要な領域

dkcMD5.h20 行で定義されています。

参照元 dkcMD5AdapterDigest(), dkcMD5Digest(), dkcMD5DigestStr(), と dkcSHO_MD5Init().

#define MD5_STR_BUFFER_SIZE   33
 

MD5文字列のシグネチャ保存に必要な領域

dkcMD5.h22 行で定義されています。

参照元 dkcMD5AdapterDigestStr(), dkcMD5DigestStr(), と dkcSHO_MD5Init().


型定義

typedef struct dkc_MD5_Adapter DKC_MD5_ADAPTER
 


列挙型

enum edkcMD5ObjectFlag
 

列挙型の値:
edkcMD5_Default  デフォルトのMD5オブジェクトが生成される
edkcMD5_Aladdin  md5.cの実装が使われる

dkcMD5.h97 行で定義されています。

00098 {
00102     edkcMD5_Default = 0,
00104     edkcMD5_Aladdin,
00105 };


関数

DKC_EXTERN DKC_MD5* WINAPI dkcAllocMD5  ) 
 

戻り値:
DKC_MD5構造体への確保したメモリ領域
覚え書き:
すでにdkcMD5Init()は呼ばれています。

dkcMD5.c27 行で定義されています。

参照先 dkcAllocate(), dkcMD5Init(), と NULL.

参照元 dkcSHO_MD5Init().

00027                              {
00028     DKC_MD5 *p = dkcAllocate(sizeof(DKC_MD5));
00029     if(NULL==p) return NULL;
00030     dkcMD5Init(p);
00031     return p;
00032 }

DKC_EXTERN DKC_MD5_ADAPTER* WINAPI dkcAllocMD5Adapter uint32  md5_objflag  ) 
 

戻り値:
DKC_MD5_ADAPTER構造体への確保したメモリ領域
覚え書き:
すでにdkcMD5Init()は呼ばれています。

dkcMD5.c379 行で定義されています。

参照先 dkcAllocate(), dkcFree(), dkcMD5AdapterInit(), edkcMD5_Aladdin, edkcMD5_Default, dkc_MD5_Adapter::mObjFlag, dkc_MD5_Adapter::mpObj, と NULL.

00380 {
00381     DKC_MD5_ADAPTER *p = (DKC_MD5_ADAPTER *)dkcAllocate(sizeof(DKC_MD5_ADAPTER));
00382     if(NULL==p){
00383         return NULL;
00384     }
00385     switch(initflag){
00386         case edkcMD5_Default:
00387         case edkcMD5_Aladdin:
00388         default:
00389         p->mpObj = dkcAllocate(sizeof(md5_state_t));
00390     };
00391     if(NULL==p->mpObj)
00392     {
00393         dkcFree(&p);
00394         return NULL;
00395     }
00396     p->mObjFlag = initflag;
00397     dkcMD5AdapterInit(p);
00398     return p;
00399 }

DKC_EXTERN int WINAPI dkcFreeMD5 DKC_MD5 **  p  ) 
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタへのポインタ
戻り値:
上手く開放できたらedk_SUCCEEDED

dkcMD5.c35 行で定義されています。

参照先 dkcFree(), と NULL.

参照元 dkcFreeSHO().

00035                                    {
00036     //DKC_MD5 *p = *pp;
00037     if(NULL==pp || NULL==*pp){
00038         return edk_FAILED;
00039     }
00040     return dkcFree((void **)pp);
00041 }

DKC_EXTERN int WINAPI dkcFreeMD5Adapter DKC_MD5_ADAPTER **  p  ) 
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタへのポインタ
戻り値:
上手く開放できたらedk_SUCCEEDED

dkcMD5.c401 行で定義されています。

参照先 dkcFree(), edkcMD5_Aladdin, edkcMD5_Default, dkc_MD5_Adapter::mObjFlag, dkc_MD5_Adapter::mpObj, と NULL.

00401                                                   {
00402     DKC_MD5_ADAPTER *p = *pp;
00403     if(NULL==pp || NULL==p){
00404         return edk_FAILED;
00405     }
00406     if(!p->mpObj) return edk_FAILED;
00407     switch(p->mObjFlag){
00408         case edkcMD5_Default:
00409         case edkcMD5_Aladdin:
00410         default:
00411         dkcFree(&(p->mpObj));
00412     }
00413     return dkcFree((void **)p);
00414 }

DKC_EXTERN int WINAPI dkcMD5AdapterDigest DKC_MD5_ADAPTER p,
BYTE buff,
size_t  size
 

参照:
dkcMD5DigestStr()

dkcMD5.c467 行で定義されています。

参照先 BYTE, edkcMD5_Aladdin, edkcMD5_Default, MD5_BIN_BUFFER_SIZE, md5_get_digest(), dkc_MD5_Adapter::mObjFlag, と dkc_MD5_Adapter::mpObj.

参照元 dkcMD5AdapterFinalDigest().

00467                                                                          {
00468     //if(size < 16){
00469     if(size < MD5_BIN_BUFFER_SIZE){
00470         return edk_BufferOverFlow;
00471     }
00472     switch(p->mObjFlag){
00473     case edkcMD5_Default:
00474     case edkcMD5_Aladdin:
00475     default:
00476         //第二引数のbuffのキャストがバグかもしれない。
00477         md5_get_digest((md5_state_t *)p->mpObj,(BYTE *)buff);
00478     }
00479     return edk_SUCCEEDED;
00480 }

DKC_EXTERN int WINAPI dkcMD5AdapterDigestStr DKC_MD5_ADAPTER p,
char *  buff,
size_t  size
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
buff[out] 書き込むバッファへのポインタ
size[in] buffのサイズ
戻り値:
成功したらedk_SUCCEEDEDが返る

dkcMD5.c482 行で定義されています。

参照先 edkcMD5_Aladdin, edkcMD5_Default, md5_get_str_digest(), MD5_STR_BUFFER_SIZE, dkc_MD5_Adapter::mObjFlag, と dkc_MD5_Adapter::mpObj.

参照元 dkcMD5AdapterFinalDigestStr().

00482                                                                             {
00483     //if(size < 32 + 1){
00484     if(size < MD5_STR_BUFFER_SIZE){
00485         return edk_BufferOverFlow;
00486     }
00487     switch(p->mObjFlag){
00488     case edkcMD5_Default:
00489     case edkcMD5_Aladdin:
00490     default:
00491         md5_get_str_digest((md5_state_t *)p->mpObj,(char *)buff);
00492     }
00493     return edk_SUCCEEDED;
00494 }

DKC_EXTERN void WINAPI dkcMD5AdapterFinal DKC_MD5_ADAPTER p  ) 
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
覚え書き:
dkcMD5FinalDigest()を使用する事を奨励します。

dkcMD5.c454 行で定義されています。

参照先 edkcMD5_Aladdin, edkcMD5_Default, md5_finalize(), dkc_MD5_Adapter::mFinalized, dkc_MD5_Adapter::mObjFlag, dkc_MD5_Adapter::mpObj, と TRUE.

参照元 dkcMD5AdapterFinalDigest(), と dkcMD5AdapterFinalDigestStr().

00454                                                   {
00455     if(p->mFinalized){
00456         return;
00457     }
00458     switch(p->mObjFlag){
00459     case edkcMD5_Default:
00460     case edkcMD5_Aladdin:
00461     default:
00462         md5_finalize((md5_state_t *)p->mpObj);
00463     }
00464     p->mFinalized = TRUE;
00465 }

DKC_EXTERN int WINAPI dkcMD5AdapterFinalDigest DKC_MD5_ADAPTER p,
BYTE buff,
size_t  size
 

参照:
dkcMD5FinalDigestStr()

dkcMD5.c501 行で定義されています。

参照先 dkcMD5AdapterDigest(), と dkcMD5AdapterFinal().

00501                                                                               {
00502     dkcMD5AdapterFinal(p);
00503     return dkcMD5AdapterDigest(p,buff,size);
00504 
00505 }

DKC_EXTERN int WINAPI dkcMD5AdapterFinalDigestStr DKC_MD5_ADAPTER p,
char *  buff,
size_t  size
 

参照:
引数、戻り値についてはdkcMD5Digest()と同じです。
覚え書き:
dkcMD5Final()とdkcMD5Digest()を使用するより、この関数の使用を奨励します。

dkcMD5.c496 行で定義されています。

参照先 dkcMD5AdapterDigestStr(), と dkcMD5AdapterFinal().

00496                                                                                  {
00497     dkcMD5AdapterFinal(p);
00498     return dkcMD5AdapterDigestStr(p,buff,size);
00499 }

DKC_EXTERN void WINAPI dkcMD5AdapterInit DKC_MD5_ADAPTER  ) 
 

戻り値:
dkcAllocMD5()から取得した領域を初期化する。

dkcMD5.c416 行で定義されています。

参照先 edkcMD5_Aladdin, edkcMD5_Default, FALSE, md5_init(), dkc_MD5_Adapter::mFinalized, dkc_MD5_Adapter::mObjFlag, と dkc_MD5_Adapter::mpObj.

参照元 dkcAllocMD5Adapter().

00416                                                  {
00417     switch(p->mObjFlag){
00418     case edkcMD5_Default:
00419     case edkcMD5_Aladdin:
00420     default:
00421         md5_init((md5_state_t *)p->mpObj);
00422     }
00423     p->mFinalized = FALSE;
00424 }

DKC_EXTERN int WINAPI dkcMD5AdapterLoad DKC_MD5_ADAPTER p,
const BYTE pBuffer,
DWORD  dwSize
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
pBuffer[in] 読み取るバッファへのポインタ
dwSize[in] バッファにアクセスしてOKなサイズ
戻り値:
edk_SUCCEEDEDで成功
覚え書き:
ライブラリの都合により、dkcMD5Load()はINT_MAXより大きいバッファを扱えないため

dkcMD5.c426 行で定義されています。

参照先 dkcMD5AdapterLoadStandard(), edkcMD5_Aladdin, edkcMD5_Default, と dkc_MD5_Adapter::mObjFlag.

00426                                                                                  {
00427     switch(p->mObjFlag){
00428     case edkcMD5_Default:
00429     case edkcMD5_Aladdin:
00430     default:
00431         if(dwSize > INT_MAX){
00432             return edk_FAILED;
00433         }
00434     };
00435 
00436     dkcMD5AdapterLoadStandard(p,pBuffer,dwSize);
00437     return edk_SUCCEEDED;
00438 }

DKC_EXTERN void WINAPI dkcMD5AdapterLoadStandard DKC_MD5_ADAPTER p,
const BYTE pBuffer,
DWORD  dwSize
 

dkcSHA1Load() dkcSHA256Load()等と同じ仕様のLoad

dkcMD5.c440 行で定義されています。

参照先 edkcMD5_Aladdin, edkcMD5_Default, md5_append(), dkc_MD5_Adapter::mFinalized, dkc_MD5_Adapter::mObjFlag, と dkc_MD5_Adapter::mpObj.

参照元 dkcMD5AdapterLoad().

00440                                                                                           {
00441     if(p->mFinalized){
00442         return;
00443     }
00444     switch(p->mObjFlag){
00445     case edkcMD5_Default:
00446     case edkcMD5_Aladdin:
00447     default:
00448         md5_append((md5_state_t *)p->mpObj,pBuffer,(int)dwSize);
00449     };
00450 }

DKC_EXTERN int WINAPI dkcMD5Digest DKC_MD5 p,
BYTE buff,
size_t  size
 

参照:
dkcMD5DigestStr()

dkcMD5.c334 行で定義されています。

参照先 DKC_MD5::abcd, dkc_memcpy(), と MD5_BIN_BUFFER_SIZE.

参照元 dkcMD5DigestStr(), dkcMD5FinalDigest(), と dkcSHO_MD5Init().

00334                                                           {
00335     
00336     if(size < MD5_BIN_BUFFER_SIZE){
00337         return edk_BufferOverFlow;
00338     }
00339     return dkc_memcpy(buff,size,p->abcd,sizeof(p->abcd));
00340 }

DKC_EXTERN int WINAPI dkcMD5DigestStr DKC_MD5 p,
char *  buff,
size_t  size
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
buff[out] 書き込むバッファへのポインタ
size[in] buffのサイズ
戻り値:
成功したらedk_SUCCEEDEDが返る

dkcMD5.c342 行で定義されています。

参照先 dkcMD5Digest(), MD5_BIN_BUFFER_SIZE, MD5_STR_BUFFER_SIZE, と uint8.

参照元 dkcMD5FinalDigestStr(), と dkcSHO_MD5Init().

00342                                                              {
00343     register int i;
00344     uint8 temp[MD5_BIN_BUFFER_SIZE];
00345     if(size < MD5_STR_BUFFER_SIZE){
00346         return edk_BufferOverFlow;
00347     }
00348     i = dkcMD5Digest(p,temp,sizeof(temp));
00349     if(DKUTIL_FAILED(i)){
00350         return i;
00351     }
00352     for (i=0; i<16; i++){
00353         sprintf(buff+i*2,"%02x", temp[i]);
00354     }
00355   buff[32]='\0';
00356     return edk_SUCCEEDED;
00357 }

DKC_EXTERN void WINAPI dkcMD5Final DKC_MD5 p  ) 
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
覚え書き:
dkcMD5FinalDigest()を使用する事を奨励します。

dkcMD5.c323 行で定義されています。

参照先 dkcMD_Final(), edkcMD_Finalized, DKC_MD5::flags, と MD5Transform().

参照元 dkcMD5FinalDigest(), dkcMD5FinalDigestStr(), と dkcSHO_MD5Init().

00323                                    {
00324     //uint8 digest[MD5_BIN_BUFFER_SIZE];
00325     if(p->flags & edkcMD_Finalized){
00326         return;
00327     }
00328     //MD5Final(p);
00329     dkcMD_Final(p,MD5Transform);
00330     //memcpy(p->a8,digest,sizeof(digest));
00331     p->flags |= edkcMD_Finalized;
00332 }

DKC_EXTERN int WINAPI dkcMD5FinalDigest DKC_MD5 p,
BYTE buff,
size_t  size
 

参照:
dkcMD5FinalDigestStr()

dkcMD5.c364 行で定義されています。

参照先 dkcMD5Digest(), と dkcMD5Final().

00364                                                                {
00365     dkcMD5Final(p); 
00366     return dkcMD5Digest(p,buff,size);
00367 
00368 }

DKC_EXTERN int WINAPI dkcMD5FinalDigestStr DKC_MD5 p,
char *  buff,
size_t  size
 

参照:
引数、戻り値についてはdkcMD5Digest()と同じです。
覚え書き:
dkcMD5Final()とdkcMD5Digest()を使用するより、この関数の使用を奨励します。

dkcMD5.c359 行で定義されています。

参照先 dkcMD5DigestStr(), と dkcMD5Final().

00359                                                                   {
00360     dkcMD5Final(p);
00361     return dkcMD5DigestStr(p,buff,size);
00362 }

DKC_EXTERN void WINAPI dkcMD5Init DKC_MD5  ) 
 

戻り値:
dkcAllocMD5()から取得した領域を初期化する。

dkcMD5.c43 行で定義されています。

参照先 DKC_MD5::a8, DKC_MD5::abcd, DKC_MD5::count, edkcMD_Optimize, と DKC_MD5::flags.

参照元 dkcAllocMD5(), dkcMD5InitEx(), と dkcSHO_MD5Init().

00043                                   {
00044     p->count[0] = p->count[1] = 0;
00045     p->abcd[0] = 0x67452301;
00046   p->abcd[1] = 0xefcdab89;
00047   p->abcd[2] = 0x98badcfe;
00048   p->abcd[3] = 0x10325476;
00049     memset(p->a8,0,sizeof(p->a8));
00050     p->flags = edkcMD_Optimize;
00051     //p->mByteOrder = (uint8)dkcGetByteOrder();
00052 }

DKC_INLINE void dkcMD5InitEx DKC_MD5 p,
uint8  flags
 

dkcMD5.h34 行で定義されています。

参照先 dkcMD5Init(), と DKC_MD5::flags.

00035 {
00036     dkcMD5Init(p);
00037     p->flags = flags;
00038 }

DKC_EXTERN void WINAPI dkcMD5Load DKC_MD5 p,
const BYTE pBuffer,
DWORD  dwSize
 

引数:
p[in][out] dkcAllocMD5()で取得したポインタ
pBuffer[in] 読み取るバッファへのポインタ
dwSize[in] バッファにアクセスしてOKなサイズ
戻り値:
edk_SUCCEEDEDで成功
覚え書き:
ライブラリの都合により、dkcMD5Load()はINT_MAXより大きいバッファを扱えないため

dkcMD5.c314 行で定義されています。

参照先 dkcMD_Update(), edkcMD_Finalized, DKC_MD5::flags, と MD5Transform().

参照元 dkcMD5LoadDouble(), と dkcSHO_MD5Init().

00314                                                                    {
00315     if(p->flags & edkcMD_Finalized){
00316         return;
00317     }
00318     dkcMD_Update(p,pBuffer,dwSize,MD5Transform);
00319 }

DKC_EXTERN void WINAPI dkcMD5LoadDouble DKC_MD5 p,
uint8 const *  buf,
uint32  len,
DKC_MD5 p2,
uint8 const *  buf2,
uint32  len2
 

len != len2 だと落ちます。

dkcMD5.c200 行で定義されています。

参照先 DKC_MD5::a8, DKC_MD5::abcd, dkcMD5Load(), dkcMD_ByteReverse(), dkcmFORCE_NOT_ASSERT, dkcmNOT_ASSERT, double_md5_update_begin(), edkcMD_ByteReverse, FALSE, DKC_MD5::flags, md5_mmx_double_update(), uint32, と uint8.

00203 {
00204 #ifdef _MSC_VER
00205   uint32 t = 0;
00206     uint32 t2 =0;
00207     uint8 w,e;
00208     w = double_md5_update_begin(p,buf,len,&t);
00209     e = double_md5_update_begin(p2,buf2,len2,&t2);
00210     dkcmNOT_ASSERT(w != e);
00211     if(FALSE==w){
00212         return;
00213     }
00214 
00215     dkcmFORCE_NOT_ASSERT(len != len2);
00216   dkcmNOT_ASSERT((!t) != (!t2));
00217     if(t && t2){
00218         md5_mmx_double_update(p->abcd,p2->abcd,
00219             (const uint32 *)p->a8,(const uint32 *)p2->a8);
00220 
00221     buf += t;
00222     len -= t;
00223 
00224         buf2 += t2;
00225         len2 -= t2;
00226   }else{
00227         dkcmNOT_ASSERT(t && !t2);
00228     }
00229 
00230     dkcmNOT_ASSERT(len != len2);
00231 
00232   /* Process data in 64-byte chunks */
00233 
00234   while (len >= 64) 
00235   {
00236     memmove(p->a8, buf, 64);
00237         memmove(p2->a8, buf2, 64);
00238 
00239     if ((p->flags) & edkcMD_ByteReverse)
00240         {
00241       dkcMD_ByteReverse(p->a8, 16);
00242         }
00243         if ((p2->flags) & edkcMD_ByteReverse)
00244         {
00245       dkcMD_ByteReverse(p2->a8, 16);
00246         }
00247 
00248     //MD5Transform(p->abcd, (uint32 *) p->a8);
00249         md5_mmx_double_update(p->abcd,p2->abcd,
00250             (uint32 *)p->a8,(uint32 *)p2->a8);
00251     buf += 64;
00252     len -= 64;
00253 
00254         buf2 += 64;
00255     len2 -= 64;
00256   }
00257 
00258   /* Handle any remaining bytes of data. */
00259 
00260   memmove(p->a8, buf, len);
00261     memmove(p2->a8, buf2, len2);
00262 #else
00263     dkcMD5Load(p,buf,len);
00264     dkcMD5Load(p2,buf2,len2);
00265 #endif
00266 }


dkutil_cに対してMon Jan 16 00:42:24 2006に生成されました。  doxygen 1.4.4