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

dkcMD4.c

MD4 hash algorithm [詳細]

#include "md_misc.h"
#include "dkcMD4.h"
#include "dkcStdio.h"

dkcMD4.cのインクルード依存関係図

ソースコードを見る。

マクロ定義

#define DKUTIL_C_MD4_C
#define F1(x, y, z)   (z ^ (x & (y ^ z)))
#define F2(x, y, z)   (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
#define F3(x, y, z)   (x ^ y ^ z)
#define ROTATE_LEFT(x, n)   (((x) << (n)) | ((x) >> (32-(n))))
#define MD4STEP(f, a, b, c, d, x, s, data)
 This is the central step in the MD4 algorithm

関数

DKC_MD4 *WINAPI dkcAllocMD4 ()
int WINAPI dkcFreeMD4 (DKC_MD4 **pp)
void WINAPI dkcMD4Init (DKC_MD4 *p)
static DKC_INLINE void MD4Transform (uint32 buf[4], uint32 const in[16])
void WINAPI dkcMD4Load (DKC_MD4 *p, const BYTE *pBuffer, DWORD dwSize)
void WINAPI dkcMD4Final (DKC_MD4 *p)
int WINAPI dkcMD4Digest (DKC_MD4 *p, BYTE *buff, size_t size)
int WINAPI dkcMD4DigestStr (DKC_MD4 *p, char *buff, size_t size)
int WINAPI dkcMD4FinalDigestStr (DKC_MD4 *p, char *buff, size_t size)
int WINAPI dkcMD4FinalDigest (DKC_MD4 *p, BYTE *buff, size_t size)


説明

MD4 hash algorithm

覚え書き:
reconstructed by d金魚
This is the original introductory comment:

md4.cpp - modified by Wei Dai from Andrew M. Kuchling's md4.c The original code and all modifications are in the public domain.

/* md4.c : MD4 hash algorithm.

Part of the Python Cryptography Toolkit, version 1.1

Distribute and use freely; there are no restrictions on further dissemination and usage except those imposed by the laws of your country of residence.

dkcMD4.c で定義されています。


マクロ定義

#define DKUTIL_C_MD4_C
 

dkcMD4.c23 行で定義されています。

#define F1 x,
y,
 )     (z ^ (x & (y ^ z)))
 

dkcMD4.c66 行で定義されています。

参照元 MD4Transform(), と MD5Transform().

#define F2 x,
y,
 )     (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
 

dkcMD4.c67 行で定義されています。

参照元 MD4Transform(), と MD5Transform().

#define F3 x,
y,
 )     (x ^ y ^ z)
 

dkcMD4.c68 行で定義されています。

参照元 MD4Transform(), と MD5Transform().

#define MD4STEP f,
a,
b,
c,
d,
x,
s,
data   ) 
 

値:

(a) += f(b,c,d) + x + data;\
    (a) = ROTATE_LEFT(a,s);
This is the central step in the MD4 algorithm

dkcMD4.c73 行で定義されています。

参照元 MD4Transform().

#define ROTATE_LEFT x,
 )     (((x) << (n)) | ((x) >> (32-(n))))
 

dkcMD4.c70 行で定義されています。


関数

DKC_MD4* WINAPI dkcAllocMD4  ) 
 

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

dkcMD4.c33 行で定義されています。

参照先 DKC_MD4, dkcAllocate(), dkcMD4Init(), と NULL.

参照元 dkcSHO_MD4Init().

00033                              {
00034     DKC_MD4 *p = dkcAllocate(sizeof(DKC_MD4));
00035     if(NULL==p) return NULL;
00036     dkcMD4Init(p);
00037     return p;
00038 }

int WINAPI dkcFreeMD4 DKC_MD4 **  p  ) 
 

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

dkcMD4.c41 行で定義されています。

参照先 dkcFree(), と NULL.

参照元 dkcFreeSHO().

00041                                    {
00042     if(NULL==pp || NULL==*pp){
00043         return edk_FAILED;
00044     }
00045     return dkcFree((void **)pp);
00046 }

int WINAPI dkcMD4Digest DKC_MD4 p,
BYTE buff,
size_t  size
 

参照:
dkcMD4DigestStr()

dkcMD4.c282 行で定義されています。

参照先 dkc_memcpy(), と MD4_BIN_BUFFER_SIZE.

参照元 dkcMD4DigestStr(), dkcMD4FinalDigest(), と dkcSHO_MD4Init().

00282                                                           {
00283     
00284     if(size < MD4_BIN_BUFFER_SIZE){
00285         return edk_BufferOverFlow;
00286     }
00287     return dkc_memcpy(buff,size,p->abcd,sizeof(p->abcd));
00288 }

int WINAPI dkcMD4DigestStr DKC_MD4 p,
char *  buff,
size_t  size
 

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

dkcMD4.c290 行で定義されています。

参照先 dkcMD4Digest(), MD4_BIN_BUFFER_SIZE, MD4_STR_BUFFER_SIZE, と uint8.

参照元 dkcMD4FinalDigestStr(), と dkcSHO_MD4Init().

00290                                                              {
00291     register int i;
00292     uint8 temp[MD4_BIN_BUFFER_SIZE];
00293     if(size < MD4_STR_BUFFER_SIZE){
00294         return edk_BufferOverFlow;
00295     }
00296     i = dkcMD4Digest(p,temp,sizeof(temp));
00297     if(DKUTIL_FAILED(i)){
00298         return i;
00299     }
00300     for (i=0; i<16; i++){
00301         sprintf(buff+i*2,"%02x", temp[i]);
00302     }
00303   buff[32]='\0';
00304     return edk_SUCCEEDED;
00305 }

void WINAPI dkcMD4Final DKC_MD4 p  ) 
 

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

dkcMD4.c271 行で定義されています。

参照先 dkcMD_Final(), edkcMD_Finalized, と MD4Transform().

参照元 dkcMD4FinalDigest(), dkcMD4FinalDigestStr(), と dkcSHO_MD4Init().

00271                                    {
00272     //uint8 digest[MD4_BIN_BUFFER_SIZE];
00273     if(p->flags & edkcMD_Finalized){
00274         return;
00275     }
00276     //MD4Final(p);
00277     dkcMD_Final(p,MD4Transform);
00278     //memcpy(p->a8,digest,sizeof(digest));
00279     p->flags |= edkcMD_Finalized;
00280 }

int WINAPI dkcMD4FinalDigest DKC_MD4 p,
BYTE buff,
size_t  size
 

参照:
dkcMD4FinalDigestStr()

dkcMD4.c312 行で定義されています。

参照先 dkcMD4Digest(), と dkcMD4Final().

00312                                                                {
00313     dkcMD4Final(p);
00314     return dkcMD4Digest(p,buff,size);
00315 
00316 }

int WINAPI dkcMD4FinalDigestStr DKC_MD4 p,
char *  buff,
size_t  size
 

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

dkcMD4.c307 行で定義されています。

参照先 dkcMD4DigestStr(), と dkcMD4Final().

00307                                                                   {
00308     dkcMD4Final(p);
00309     return dkcMD4DigestStr(p,buff,size);
00310 }

void WINAPI dkcMD4Init DKC_MD4  ) 
 

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

dkcMD4.c50 行で定義されています。

参照元 dkcAllocMD4(), dkcMD4InitEx(), と dkcSHO_MD4Init().

00050                                   {
00051     p->count[0] = p->count[1] = 0;
00052 
00053     p->abcd[0] = 0x67452301;
00054   p->abcd[1] = 0xefcdab89;
00055   p->abcd[2] = 0x98badcfe;
00056   p->abcd[3] = 0x10325476;
00057     memset(p->a8,0,sizeof(p->a8));
00058     //p->mByteOrder = (uint8)dkcGetByteOrder();
00059 }

void WINAPI dkcMD4Load DKC_MD4 p,
const BYTE pBuffer,
DWORD  dwSize
 

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

dkcMD4.c261 行で定義されています。

参照先 dkcMD_Update(), edkcMD_Finalized, と MD4Transform().

参照元 dkcSHO_MD4Init().

00261                                                                    {
00262     if(p->flags & edkcMD_Finalized){
00263         return;
00264     }
00265     dkcMD_Update(p,pBuffer,dwSize,MD4Transform);
00266     //MD4Update(p,pBuffer,dwSize);
00267 }

static DKC_INLINE void MD4Transform uint32  buf[4],
uint32 const   in[16]
[static]
 

dkcMD4.c84 行で定義されています。

参照先 F1, F2, F3, MD4STEP, と uint32.

参照元 dkcMD4Final(), と dkcMD4Load().

00085 {
00086   register uint32 a, b, c, d;
00087 
00088   a = buf[0];
00089   b = buf[1];
00090   c = buf[2];
00091   d = buf[3];
00092 
00093     MD4STEP(F1,a,b,c,d, in[0], 3,0);
00094     MD4STEP(F1,d,a,b,c, in[1], 7,0);
00095     MD4STEP(F1,c,d,a,b, in[2],11,0);
00096     MD4STEP(F1,b,c,d,a, in[3],19,0);
00097     MD4STEP(F1,a,b,c,d, in[4], 3,0);
00098     MD4STEP(F1,d,a,b,c, in[5], 7,0);
00099     MD4STEP(F1,c,d,a,b, in[6],11,0);
00100     MD4STEP(F1,b,c,d,a, in[7],19,0);
00101     MD4STEP(F1,a,b,c,d, in[8], 3,0);
00102     MD4STEP(F1,d,a,b,c, in[9], 7,0);
00103     MD4STEP(F1,c,d,a,b,in[10],11,0);
00104     MD4STEP(F1,b,c,d,a,in[11],19,0);
00105     MD4STEP(F1,a,b,c,d,in[12], 3,0);
00106     MD4STEP(F1,d,a,b,c,in[13], 7,0);
00107     MD4STEP(F1,c,d,a,b,in[14],11,0);
00108     MD4STEP(F1,b,c,d,a,in[15],19,0);
00109 
00110     MD4STEP(F2,a,b,c,d, in[0], 3,0x5a827999);
00111     MD4STEP(F2,d,a,b,c, in[4], 5,0x5a827999);
00112     MD4STEP(F2,c,d,a,b, in[8], 9,0x5a827999);
00113     MD4STEP(F2,b,c,d,a,in[12],13,0x5a827999);
00114     MD4STEP(F2,a,b,c,d, in[1], 3,0x5a827999);
00115     MD4STEP(F2,d,a,b,c, in[5], 5,0x5a827999);
00116     MD4STEP(F2,c,d,a,b, in[9], 9,0x5a827999);
00117     MD4STEP(F2,b,c,d,a,in[13],13,0x5a827999);
00118     MD4STEP(F2,a,b,c,d, in[2], 3,0x5a827999);
00119     MD4STEP(F2,d,a,b,c, in[6], 5,0x5a827999);
00120     MD4STEP(F2,c,d,a,b,in[10], 9,0x5a827999);
00121     MD4STEP(F2,b,c,d,a,in[14],13,0x5a827999);
00122     MD4STEP(F2,a,b,c,d, in[3], 3,0x5a827999);
00123     MD4STEP(F2,d,a,b,c, in[7], 5,0x5a827999);
00124     MD4STEP(F2,c,d,a,b,in[11], 9,0x5a827999);
00125     MD4STEP(F2,b,c,d,a,in[15],13,0x5a827999);
00126  
00127     MD4STEP(F3,a,b,c,d, in[0], 3,0x6ed9eba1);
00128     MD4STEP(F3,d,a,b,c, in[8], 9,0x6ed9eba1);
00129     MD4STEP(F3,c,d,a,b, in[4],11,0x6ed9eba1);
00130     MD4STEP(F3,b,c,d,a,in[12],15,0x6ed9eba1);
00131     MD4STEP(F3,a,b,c,d, in[2], 3,0x6ed9eba1);
00132     MD4STEP(F3,d,a,b,c,in[10], 9,0x6ed9eba1);
00133     MD4STEP(F3,c,d,a,b, in[6],11,0x6ed9eba1);
00134     MD4STEP(F3,b,c,d,a,in[14],15,0x6ed9eba1);
00135     MD4STEP(F3,a,b,c,d, in[1], 3,0x6ed9eba1);
00136     MD4STEP(F3,d,a,b,c, in[9], 9,0x6ed9eba1);
00137     MD4STEP(F3,c,d,a,b, in[5],11,0x6ed9eba1);
00138     MD4STEP(F3,b,c,d,a,in[13],15,0x6ed9eba1);
00139     MD4STEP(F3,a,b,c,d, in[3], 3,0x6ed9eba1);
00140     MD4STEP(F3,d,a,b,c,in[11], 9,0x6ed9eba1);
00141     MD4STEP(F3,c,d,a,b, in[7],11,0x6ed9eba1);
00142     MD4STEP(F3,b,c,d,a,in[15],15,0x6ed9eba1);
00143     
00144 
00145   buf[0] += a;
00146   buf[1] += b;
00147   buf[2] += c;
00148   buf[3] += d;
00149 }


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