メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcSHA512.c

SHA 512 original : General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved. reconstruct : d金魚. [詳細]

#include "dkcSHA512.h"
#include "dkcStdio.h"

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

Include dependency graph

ソースコードを見る。

マクロ定義

#define SHA512_BUFFER_SIZE   (SHA512_BLOCK * 8)
#define cpuid   __asm __emit 0fh __asm __emit 0a2h

関数

DKC_INLINE BOOL CheckMMX (void)
DKC_INLINE DWORD ReverseEndianDWORD (DWORD x)
DKC_INLINE QWORD ReverseEndianQWORD (QWORD x)
DKC_INLINE QWORD Rotate (QWORD x, DWORD n)
DKC_INLINE QWORD Ch (QWORD x, QWORD y, QWORD z)
DKC_INLINE QWORD Maj (QWORD x, QWORD y, QWORD z)
DKC_INLINE QWORD S0 (QWORD x)
DKC_INLINE QWORD S1 (QWORD x)
DKC_INLINE QWORD s0 (QWORD x)
DKC_INLINE QWORD s1 (QWORD x)
DKC_INLINE void Generate (DKC_SHA512 *)
DKC_INLINE void MMX_Generate (DKC_SHA512 *)
DKC_INLINE void Default_Generate (DKC_SHA512 *p)
DKC_SHA512 *WINAPI dkcAllocSHA512 ()
void WINAPI dkcSHA512Init (DKC_SHA512 *p)
 dkcAllocSHA512()から取得した領域を初期化する。

void WINAPI dkcSHA512Load (DKC_SHA512 *p, const BYTE *pBuffer, DWORD dwSize)
void WINAPI dkcSHA512Final (DKC_SHA512 *p)
int WINAPI dkcSHA512DigestStr (DKC_SHA512 *p, char *buff, size_t size)
 文字列のMessage Digestを取得する。

int WINAPI dkcSHA512FinalDigestStr (DKC_SHA512 *p, char *buff, size_t size)
int WINAPI dkcSHA512Digest (DKC_SHA512 *p, BYTE *buff, size_t size)
 バイナリのMessage Digestを取得する。

int WINAPI dkcSHA512FinalDigest (DKC_SHA512 *p, BYTE *buff, size_t size)
int WINAPI dkcFreeSHA512 (DKC_SHA512 **p)

変数

const QWORD c_qwInitH [SHA512_HASH]
const QWORD c_qwK [SHA512_WORK]


説明

SHA 512 original : General Function Library Copyright (C) 2000,2001 SYN All Rights Reserved. reconstruct : d金魚.

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


マクロ定義

#define cpuid   __asm __emit 0fh __asm __emit 0a2h
 

dkcSHA512.c47 行で定義されています。

#define SHA512_BUFFER_SIZE   (SHA512_BLOCK * 8)
 

dkcSHA512.c12 行で定義されています。

参照元 dkcSHA512Final(), と dkcSHA512Load().


関数

DKC_INLINE QWORD Ch QWORD  x,
QWORD  y,
QWORD  z
[static]
 

dkcSHA512.c62 行で定義されています。

参照先 DKC_INLINE, と QWORD.

参照元 Default_Generate(), と Generate().

00062 {return (x & (y ^ z)) ^ z;}

DKC_INLINE BOOL CheckMMX void   )  [static]
 

dkcSHA512.c49 行で定義されています。

参照先 BOOL, DKC_INLINE, と dkcIsMMX().

参照元 dkcAllocSHA512().

00050 {
00051     return dkcIsMMX();
00052 }

DKC_INLINE void Default_Generate DKC_SHA512 p  )  [static]
 

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

参照先 c_qwK, Ch(), DKC_INLINE, DKC_SHA512, dkc_SHA512::m_aBlock, dkc_SHA512::m_qwH, Maj(), QWORD, ReverseEndianQWORD(), S0(), s0(), S1(), s1(), SHA512_BLOCK, SHA512_HASH, と SHA512_WORK.

参照元 Generate(), と MMX_Generate().

00073                                                       {
00074     int i;
00075     QWORD W[SHA512_WORK];
00076     QWORD Hash[SHA512_WORK + SHA512_HASH];
00077     QWORD *pHash = &Hash[SHA512_WORK];
00078     QWORD qwT1, qwT2;
00079     for(i = 0; i < SHA512_HASH; i++) Hash[SHA512_WORK + i] = p->m_qwH[i];
00080     for(i = 0; i < SHA512_BLOCK; i++) W[i] = ReverseEndianQWORD(p->m_aBlock[i]);
00081     for(i = SHA512_BLOCK; i < SHA512_WORK; i++) W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
00082     for(i = 0; i < SHA512_WORK; i++){
00083         pHash--;
00084         qwT1 = pHash[8] + S1(pHash[5]) + Ch(pHash[5], pHash[6], pHash[7]) + c_qwK[i] + W[i];
00085         qwT2 = S0(pHash[1]) + Maj(pHash[1], pHash[2], pHash[3]);
00086         pHash[4] += qwT1;
00087         pHash[0] = qwT1 + qwT2;
00088     }
00089     for(i = 0; i < SHA512_HASH; i++) p->m_qwH[i] += Hash[i];
00090 }

DKC_SHA512* WINAPI dkcAllocSHA512  ) 
 

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

dkcSHA512.c397 行で定義されています。

参照先 CheckMMX(), DKC_SHA512, dkcAllocate(), dkcSHA512Init(), dkc_SHA512::m_bMMX, と NULL.

00397                                    {
00398     DKC_SHA512 *p = dkcAllocate(sizeof(DKC_SHA512));
00399     if(NULL==p){
00400         return NULL;
00401     }
00402     p->m_bMMX = CheckMMX();
00403     dkcSHA512Init(p);
00404     return p;
00405 }

int WINAPI dkcFreeSHA512 DKC_SHA512 **  p  ) 
 

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

dkcSHA512.c532 行で定義されています。

参照先 DKC_SHA512, dkcFree(), edk_FAILED, と NULL.

00532                                         {
00533     if(NULL==p){
00534         return edk_FAILED;
00535     }
00536     return dkcFree(p);
00537 }

int WINAPI dkcSHA512Digest DKC_SHA512 p,
BYTE buff,
size_t  size
 

バイナリのMessage Digestを取得する。

dkcSHA512.c508 行で定義されています。

参照先 BYTE, DKC_SHA512, edk_BufferOverFlow, edk_LogicError, edk_SUCCEEDED, FALSE, dkc_SHA512::m_qwH, dkc_SHA512::mFinalized, と SHA512_BIN_BUFFER_SIZE.

参照元 dkcSHA512FinalDigest().

00508                                                                 {   
00509     //if(sizeof(QWORD) * SHA512_HASH > size){
00510     size_t i;
00511     if(SHA512_BIN_BUFFER_SIZE > size){
00512         return edk_BufferOverFlow;
00513     }
00514     if(FALSE==p->mFinalized){
00515         //まだFinalやってないっつーの
00516         return edk_LogicError;
00517     }
00518     for(i = 0; i < SHA512_BIN_BUFFER_SIZE; ++i){
00519         buff[i] = (BYTE)(p->m_qwH[i >> 3] >> (8 * (~i & 7)));
00520     }
00521     return edk_SUCCEEDED;
00522     //return dkc_memcpy(buff,size,(const void *)p->m_qwH,sizeof(p->m_qwH));
00523 }

int WINAPI dkcSHA512DigestStr DKC_SHA512 p,
char *  buff,
size_t  size
 

文字列のMessage Digestを取得する。

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

dkcSHA512.c476 行で定義されています。

参照先 DKC_SHA512, dkc_strcpy(), DWORD, edk_BufferOverFlow, edk_LogicError, FALSE, dkc_SHA512::m_qwH, dkc_SHA512::mFinalized, SHA512_HASH, と SHA512_STR_BUFFER_SIZE.

参照元 dkcSHA512FinalDigestStr().

00476                                                                    {
00477     //char s[SHA512_HASH * 16 + 1];
00478     char s[ SHA512_STR_BUFFER_SIZE ];
00479     int i;
00480 
00481     s[SHA512_HASH * 16 ] = '\0';
00482     //if(size <= sizeof(s)){
00483     if(SHA512_STR_BUFFER_SIZE > size){
00484         return edk_BufferOverFlow;
00485     }
00486     if(FALSE==p->mFinalized){
00487         //まだFinalやってないっつーの
00488         return edk_LogicError;
00489     }
00490 
00491     for(i = 0; i < SHA512_HASH; i++){
00492         sprintf(s + i * 16,     "%08x", (DWORD)(p->m_qwH[i] >> 32));
00493         sprintf(s + i * 16 + 8, "%08x", (DWORD)(p->m_qwH[i] & 0x00000000ffffffff));
00494     }
00495     //std::string strDigest = s;
00496     //return strDigest;
00497     return dkc_strcpy(buff,size,s,strlen(s));
00498 }

void WINAPI dkcSHA512Final DKC_SHA512 p  ) 
 

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

dkcSHA512.c455 行で定義されています。

参照先 BYTE, DKC_SHA512, dkcSHA512Load(), dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, QWORD, ReverseEndianQWORD(), SHA512_BUFFER_SIZE, と TRUE.

参照元 dkcSHA384Final(), dkcSHA512FinalDigest(), と dkcSHA512FinalDigestStr().

00455                                          {
00456 
00457     BYTE cZero = 0x00;
00458     BYTE cOne  = 0x80;
00459     QWORD qwHNumBits;
00460     QWORD qwLNumBits;
00461     if(p->mFinalized){
00462         return;
00463     }
00464     qwHNumBits = ReverseEndianQWORD(p->m_qwHNumBits);
00465     qwLNumBits = ReverseEndianQWORD(p->m_qwLNumBits);
00466 
00467     dkcSHA512Load(p,&cOne, 1);
00468     while(p->m_nNumChr != SHA512_BUFFER_SIZE - 16) dkcSHA512Load(p,&cZero, 1);
00469 
00470     dkcSHA512Load(p,(BYTE *)&qwHNumBits, 8);
00471     dkcSHA512Load(p,(BYTE *)&qwLNumBits, 8);
00472 
00473     p->mFinalized = TRUE;
00474 }

int WINAPI dkcSHA512FinalDigest DKC_SHA512 p,
BYTE buff,
size_t  size
 

参照:
dkcSHA512Digest() dkcSHA512FinalDigestStr() dkcSHA512FinalDigestStr()の binaryのハッシュ値 版

dkcSHA512.c526 行で定義されています。

参照先 BYTE, DKC_SHA512, dkcSHA512Digest(), と dkcSHA512Final().

00526                                                                      {
00527     dkcSHA512Final(p);
00528     return dkcSHA512Digest(p,buff,size);
00529 }

int WINAPI dkcSHA512FinalDigestStr DKC_SHA512 p,
char *  buff,
size_t  size
 

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

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

参照先 DKC_SHA512, dkcSHA512DigestStr(), と dkcSHA512Final().

00501                                                                         {
00502     dkcSHA512Final(p);
00503     return dkcSHA512DigestStr(p,buff,size);
00504 }

void WINAPI dkcSHA512Init DKC_SHA512 p  ) 
 

dkcAllocSHA512()から取得した領域を初期化する。

dkcSHA512.c407 行で定義されています。

参照先 c_qwInitH, DKC_SHA512, FALSE, dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwH, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, と SHA512_HASH.

参照元 dkcAllocSHA512().

00407                                         {
00408     int i;
00409     for(i = 0; i < SHA512_HASH; i++){
00410         p->m_qwH[i] = c_qwInitH[i];
00411     }
00412     p->m_qwLNumBits = 0;
00413     p->m_qwHNumBits = 0;
00414     p->m_nNumChr = 0;
00415     p->mFinalized = FALSE;
00416 }

void WINAPI dkcSHA512Load DKC_SHA512 p,
const BYTE pBuffer,
DWORD  dwSize
 

引数:
p[in][out] dkcAllocSHA512()で取得したポインタ
pBuffer[in] 読み取るバッファへのポインタ
dwSize[in] バッファにアクセスしてOKなサイズ

dkcSHA512.c418 行で定義されています。

参照先 BYTE, DKC_SHA512, DWORD, Generate(), dkc_SHA512::m_aBlock, dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, QWORD, と SHA512_BUFFER_SIZE.

参照元 dkcSHA384Load(), と dkcSHA512Final().

00418                                                                          {
00419     QWORD qwSize;
00420     QWORD qwLNumBits;
00421     BYTE *pBlock;
00422     DWORD dwReadSize;
00423 
00424     if(dwSize == 0) return;
00425     if(p->mFinalized){
00426         return;
00427     }
00428 
00429     qwSize = dwSize;
00430     qwLNumBits = (p->m_qwLNumBits + (qwSize << 3));
00431     if(qwLNumBits < p->m_qwLNumBits) p->m_qwHNumBits++;
00432 //  p->m_qwHNumBits += qwSize >> 61;
00433     p->m_qwLNumBits = qwLNumBits;
00434 
00435     pBlock = (BYTE *)p->m_aBlock;
00436     while(dwSize){
00437         //dwReadSize = (dwSize < SHA512_BUFFER_SIZE - p->m_nNumChr) ?
00438         dwReadSize = (dwSize < SHA512_BUFFER_SIZE - (DWORD)p->m_nNumChr) ?
00439              dwSize :
00440             (SHA512_BUFFER_SIZE - p->m_nNumChr);
00441         
00442         memcpy(pBlock + p->m_nNumChr, pBuffer, dwReadSize);
00443         
00444         p->m_nNumChr += dwReadSize;
00445         pBuffer += dwReadSize;
00446         dwSize -= dwReadSize;
00447         
00448         if(p->m_nNumChr == SHA512_BUFFER_SIZE){
00449             Generate(p);
00450             p->m_nNumChr = 0;
00451         }
00452     }
00453 }

DKC_INLINE void Generate DKC_SHA512  )  [static]
 

dkcSHA512.c388 行で定義されています。

参照先 Default_Generate(), DKC_INLINE, DKC_SHA512, dkc_SHA512::m_bMMX, と MMX_Generate().

参照元 dkcSHA1Load(), dkcSHA256Load(), と dkcSHA512Load().

00389 {
00390     if(p->m_bMMX){
00391         MMX_Generate(p);
00392         return;
00393     }
00394     Default_Generate(p);
00395 }

DKC_INLINE QWORD Maj QWORD  x,
QWORD  y,
QWORD  z
[static]
 

dkcSHA512.c63 行で定義されています。

参照先 DKC_INLINE, と QWORD.

参照元 Default_Generate(), と Generate().

00063 {return (x & (y | z)) | (y & z);}

DKC_INLINE void MMX_Generate DKC_SHA512  )  [static]
 

dkcSHA512.c382 行で定義されています。

参照先 Default_Generate(), DKC_INLINE, と DKC_SHA512.

参照元 Generate().

00382                                                   {
00383     Default_Generate(p);
00384 }

DKC_INLINE DWORD ReverseEndianDWORD DWORD  x  )  [static]
 

dkcSHA512.c55 行で定義されています。

参照先 DKC_INLINE, dkcReverseEndian32(), と DWORD.

00055                                                     {
00056     return dkcReverseEndian32(x);
00057 }

DKC_INLINE QWORD ReverseEndianQWORD QWORD  x  )  [static]
 

dkcSHA512.c58 行で定義されています。

参照先 DKC_INLINE, dkcReverseEndian64(), と QWORD.

参照元 Default_Generate(), と dkcSHA512Final().

00058                                                     {
00059     return dkcReverseEndian64(x);
00060 }

DKC_INLINE QWORD Rotate QWORD  x,
DWORD  n
[static]
 

dkcSHA512.c61 行で定義されています。

参照先 DKC_INLINE, と QWORD.

参照元 Generate(), s0(), S0(), s1(), と S1().

00061 {return (x >> n) | (x << (64 - n));}

DKC_INLINE QWORD s0 QWORD  x  )  [static]
 

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

参照先 DKC_INLINE, QWORD, と Rotate().

参照元 Default_Generate(), と Generate().

00066 {return Rotate(x,  1) ^ Rotate(x,  8) ^ (x >> 7);}

DKC_INLINE QWORD S0 QWORD  x  )  [static]
 

dkcSHA512.c64 行で定義されています。

参照先 DKC_INLINE, QWORD, と Rotate().

参照元 Default_Generate(), と Generate().

00064 {return Rotate(x, 28) ^ Rotate(x, 34) ^ Rotate(x, 39);}

DKC_INLINE QWORD s1 QWORD  x  )  [static]
 

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

参照先 DKC_INLINE, QWORD, と Rotate().

参照元 Default_Generate(), と Generate().

00067 {return Rotate(x, 19) ^ Rotate(x, 61) ^ (x >> 6);}

DKC_INLINE QWORD S1 QWORD  x  )  [static]
 

dkcSHA512.c65 行で定義されています。

参照先 DKC_INLINE, QWORD, と Rotate().

参照元 Default_Generate(), と Generate().

00065 {return Rotate(x, 14) ^ Rotate(x, 18) ^ Rotate(x, 41);}


変数

const QWORD c_qwInitH[SHA512_HASH] [static]
 

初期値:

 {
    0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
    0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179,
}

dkcSHA512.c17 行で定義されています。

参照元 dkcSHA512Init().

const QWORD c_qwK[SHA512_WORK] [static]
 

初期値:

 {
    0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
    0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
    0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
    0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
    0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
    0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
    0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
    0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
    0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
    0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
    0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
    0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
    0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
    0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
    0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
    0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
    0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
    0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
    0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
    0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817,
}

dkcSHA512.c22 行で定義されています。

参照元 Default_Generate().


dkutil_cに対してSun Jul 18 22:46:12 2004に生成されました。 doxygen 1.3.6