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

# dkcSHA512.c

SHA 512 [詳細]

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

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

ソースコードを見る。

## マクロ定義
#define | DKUTIL_C_SHA512_C
#define | SHA512_BUFFER_SIZE (SHA512_BLOCK * 8)
#define | cpuid __asm __emit 0fh __asm __emit 0a2h
## 関数
static DKC_INLINE BOOL | CheckMMX (void)
static DKC_INLINE DWORD | ReverseEndianDWORD (DWORD x)
static DKC_INLINE QWORD | ReverseEndianQWORD (QWORD x)
static DKC_INLINE QWORD | Rotate (QWORD x, DWORD n)
static DKC_INLINE QWORD | Ch (QWORD x, QWORD y, QWORD z)
static DKC_INLINE QWORD | Maj (QWORD x, QWORD y, QWORD z)
static DKC_INLINE QWORD | S0 (QWORD x)
static DKC_INLINE QWORD | S1 (QWORD x)
static DKC_INLINE QWORD | s0 (QWORD x)
static DKC_INLINE QWORD | s1 (QWORD x)
static DKC_INLINE void | Generate (DKC_SHA512 *)
static DKC_INLINE void | MMX_Generate (DKC_SHA512 *)
static DKC_INLINE void | Default_Generate (DKC_SHA512 *p)
DKC_SHA512 *WINAPI | dkcAllocSHA512 ()
void WINAPI | dkcSHA512Init (DKC_SHA512 *p)
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)
## 変数
static const QWORD | c_qwInitH [SHA512_HASH]
static 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.c の 48 行で定義されています。

#define DKUTIL_C_SHA512_C

| dkcSHA512.c の 8 行で定義されています。

#define SHA512_BUFFER_SIZE (SHA512_BLOCK * 8)

| dkcSHA512.c の 13 行で定義されています。 参照元 dkcSHA512Final(), と dkcSHA512Load().

## 関数

static DKC_INLINE QWORD Ch | ( | QWORD | x,
|  | QWORD | y,
|  | QWORD | z
| ) | `[static]`

| dkcSHA512.c の 63 行で定義されています。
    00063 {return (x & (y ^ z)) ^ z;}

static DKC_INLINE BOOL CheckMMX | ( | void |  | ) | `[static]`

| dkcSHA512.c の 50 行で定義されています。 参照先 dkcIsMMX(). 参照元 dkcAllocSHA512().
    00051 {
    00052     return dkcIsMMX();
    00053 }

static DKC_INLINE void Default_Generate | ( | DKC_SHA512 * | p | ) | `[static]`

| dkcSHA512.c の 74 行で定義されています。 参照先 c_qwK, Ch(), dkc_SHA512::m_aBlock, dkc_SHA512::m_qwH, Maj(), ReverseEndianQWORD(), S0(), s0(), S1(), s1(), SHA512_BLOCK, SHA512_HASH, と SHA512_WORK. 参照元 Generate(), と MMX_Generate().
    00074                                                       {
    00075     int i;
    00076     QWORD W[SHA512_WORK];
    00077     QWORD Hash[SHA512_WORK + SHA512_HASH];
    00078     QWORD *pHash = &Hash[SHA512_WORK];
    00079     QWORD qwT1, qwT2;
    00080     for(i = 0; i < SHA512_HASH; i++) Hash[SHA512_WORK + i] = p->m_qwH[i];
    00081     for(i = 0; i < SHA512_BLOCK; i++) W[i] = ReverseEndianQWORD(p->m_aBlock[i]);
    00082     for(i = SHA512_BLOCK; i < SHA512_WORK; i++) W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
    00083     for(i = 0; i < SHA512_WORK; i++){
    00084         pHash--;
    00085         qwT1 = pHash[8] + S1(pHash[5]) + Ch(pHash[5], pHash[6], pHash[7]) + c_qwK[i] + W[i];
    00086         qwT2 = S0(pHash[1]) + Maj(pHash[1], pHash[2], pHash[3]);
    00087         pHash[4] += qwT1;
    00088         pHash[0] = qwT1 + qwT2;
    00089     }
    00090     for(i = 0; i < SHA512_HASH; i++) p->m_qwH[i] += Hash[i];
    00091 }

DKC_SHA512* WINAPI dkcAllocSHA512 | ( |  | ) |

| 戻り値: DKC_SHA512構造体への確保したメモリ領域 覚え書き: すでにdkcSHA512Init()は呼ばれています。 dkcSHA512.c の 398 行で定義されています。 参照先 CheckMMX(), dkcAllocate(), dkcSHA512Init(), dkc_SHA512::m_bMMX, と NULL. 参照元 dkcAllocDCF_Version01_SNOW2(), dkcCalculateInitializeVector(), と dkcSHO_SHA512Init().
    00398                                    {
    00399     DKC_SHA512 *p = dkcAllocate(sizeof(DKC_SHA512));
    00400     if(NULL==p){
    00401         return NULL;
    00402     }
    00403     p->m_bMMX = CheckMMX();
    00404     dkcSHA512Init(p);
    00405     return p;
    00406 }

int WINAPI dkcFreeSHA512 | ( | DKC_SHA512 ** | p | ) |

  | 引数:
  | p[in][out] | dkcAllocSHA512()で取得したポインタへのポインタ
戻り値: 上手く開放できたらedk_SUCCEEDED dkcSHA512.c の 533 行で定義されています。 参照先 dkcFree(), と NULL. 参照元 dkcAllocDCF_Version01_SNOW2(), dkcCalculateInitializeVector(), dkcFreeDCF01(), と dkcFreeSHO().
    00533                                         {
    00534     if(NULL==p){
    00535         return edk_FAILED;
    00536     }
    00537     return dkcFree((void **)p);
    00538 }

int WINAPI dkcSHA512Digest | ( | DKC_SHA512 * | p,
|  | BYTE * | buff,
|  | size_t | size
| ) |

| バイナリのMessage Digestを取得する。 dkcSHA512.c の 509 行で定義されています。 参照先 BYTE, FALSE, dkc_SHA512::m_qwH, dkc_SHA512::mFinalized, と SHA512_BIN_BUFFER_SIZE. 参照元 dkcSHA512FinalDigest(), と dkcSHO_SHA512Init().
    00509                                                                 {
    00510     //if(sizeof(QWORD) * SHA512_HASH > size){
    00511     size_t i;
    00512     if(SHA512_BIN_BUFFER_SIZE > size){
    00513         return edk_BufferOverFlow;
    00514     }
    00515     if(FALSE==p->mFinalized){
    00516         //まだFinalやってないっつーの
    00517         return edk_LogicError;
    00518     }
    00519     for(i = 0; i < SHA512_BIN_BUFFER_SIZE; ++i){
    00520         buff[i] = (BYTE)(p->m_qwH[i >> 3] >> (8 * (~i & 7)));
    00521     }
    00522     return edk_SUCCEEDED;
    00523     //return dkc_memcpy(buff,size,(const void *)p->m_qwH,sizeof(p->m_qwH));
    00524 }

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.c の 477 行で定義されています。 参照先 dkc_strcpy(), DWORD, FALSE, dkc_SHA512::m_qwH, dkc_SHA512::mFinalized, SHA512_HASH, と SHA512_STR_BUFFER_SIZE. 参照元 dkcSHA512FinalDigestStr(), と dkcSHO_SHA512Init().
    00477                                                                    {
    00478     //char s[SHA512_HASH * 16 + 1];
    00479     char s[ SHA512_STR_BUFFER_SIZE ];
    00480     int i;
    00481
    00482     s[SHA512_HASH * 16 ] = '\0';
    00483     //if(size <= sizeof(s)){
    00484     if(SHA512_STR_BUFFER_SIZE > size){
    00485         return edk_BufferOverFlow;
    00486     }
    00487     if(FALSE==p->mFinalized){
    00488         //まだFinalやってないっつーの
    00489         return edk_LogicError;
    00490     }
    00491
    00492     for(i = 0; i < SHA512_HASH; i++){
    00493         sprintf(s + i * 16,     "%08x", (DWORD)(p->m_qwH[i] >> 32));
    00494         sprintf(s + i * 16 + 8, "%08x", (DWORD)(p->m_qwH[i] & 0x00000000ffffffff));
    00495     }
    00496     //std::string strDigest = s;
    00497     //return strDigest;
    00498     return dkc_strcpy(buff,size,s,strlen(s));
    00499 }

void WINAPI dkcSHA512Final | ( | DKC_SHA512 * | p | ) |

  | 引数:
  | p[in][out] | dkcAllocSHA512()で取得したポインタ
覚え書き: dkcSHA512FinalDigest()を使用する事を奨励します。 dkcSHA512.c の 456 行で定義されています。 参照先 BYTE, dkcSHA512Load(), dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, ReverseEndianQWORD(), SHA512_BUFFER_SIZE, と TRUE. 参照元 dkcSHA384Final(), dkcSHA512FinalDigest(), dkcSHA512FinalDigestStr(), と dkcSHO_SHA512Init().
    00456                                          {
    00457
    00458     BYTE cZero = 0x00;
    00459     BYTE cOne  = 0x80;
    00460     QWORD qwHNumBits;
    00461     QWORD qwLNumBits;
    00462     if(p->mFinalized){
    00463         return;
    00464     }
    00465     qwHNumBits = ReverseEndianQWORD(p->m_qwHNumBits);
    00466     qwLNumBits = ReverseEndianQWORD(p->m_qwLNumBits);
    00467
    00468     dkcSHA512Load(p,&cOne, 1);
    00469     while(p->m_nNumChr != SHA512_BUFFER_SIZE - 16) dkcSHA512Load(p,&cZero, 1);
    00470
    00471     dkcSHA512Load(p,(BYTE *)&qwHNumBits, 8);
    00472     dkcSHA512Load(p,(BYTE *)&qwLNumBits, 8);
    00473
    00474     p->mFinalized = TRUE;
    00475 }

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

| 参照: dkcSHA512Digest() dkcSHA512FinalDigestStr() dkcSHA512FinalDigestStr()の binaryのハッシュ値 版 dkcSHA512.c の 527 行で定義されています。 参照先 dkcSHA512Digest(), と dkcSHA512Final(). 参照元 dkcCalculateInitializeVector(), dkcDCF01ReadFinal(), と dkcDCF01WriteFinal().
    00527                                                                      {
    00528     dkcSHA512Final(p);
    00529     return dkcSHA512Digest(p,buff,size);
    00530 }

int WINAPI dkcSHA512FinalDigestStr | ( | DKC_SHA512 * | p,
|  | char * | buff,
|  | size_t | size
| ) |

| 参照: 引数、戻り値についてはdkcSHA512DigestStr()と同じです。 覚え書き: dkcSHA512Final()とdkcSHA512DigestStr()を使用するより、この関数の使用を奨励します。 dkcSHA512.c の 502 行で定義されています。 参照先 dkcSHA512DigestStr(), と dkcSHA512Final().
    00502                                                                         {
    00503     dkcSHA512Final(p);
    00504     return dkcSHA512DigestStr(p,buff,size);
    00505 }

void WINAPI dkcSHA512Init | ( | DKC_SHA512 * |  | ) |

| 戻り値: dkcAllocSHA512()から取得した領域を初期化する。 dkcSHA512.c の 408 行で定義されています。 参照先 c_qwInitH, FALSE, dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwH, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, と SHA512_HASH. 参照元 dkcAllocSHA512(), dkcCalculateInitializeVector(), dkcDCF01Init(), と dkcSHO_SHA512Init().
    00408                                         {
    00409     int i;
    00410     for(i = 0; i < SHA512_HASH; i++){
    00411         p->m_qwH[i] = c_qwInitH[i];
    00412     }
    00413     p->m_qwLNumBits = 0;
    00414     p->m_qwHNumBits = 0;
    00415     p->m_nNumChr = 0;
    00416     p->mFinalized = FALSE;
    00417 }

void WINAPI dkcSHA512Load | ( | DKC_SHA512 * | p,
|  | const BYTE * | pBuffer,
|  | DWORD | dwSize
| ) |

  | 引数:
  | p[in][out] | dkcAllocSHA512()で取得したポインタ
  | pBuffer[in] | 読み取るバッファへのポインタ
  | dwSize[in] | バッファにアクセスしてOKなサイズ
dkcSHA512.c の 419 行で定義されています。 参照先 BYTE, DWORD, Generate(), dkc_SHA512::m_aBlock, dkc_SHA512::m_nNumChr, dkc_SHA512::m_qwHNumBits, dkc_SHA512::m_qwLNumBits, dkc_SHA512::mFinalized, と SHA512_BUFFER_SIZE. 参照元 dkcCalculateInitializeVector(), dkcDCF01Read(), dkcDCF01Write(), dkcSHA384Load(), dkcSHA512Final(), と dkcSHO_SHA512Init().
    00419                                                                          {
    00420     QWORD qwSize;
    00421     QWORD qwLNumBits;
    00422     BYTE *pBlock;
    00423     DWORD dwReadSize;
    00424
    00425     if(dwSize == 0) return;
    00426     if(p->mFinalized){
    00427         return;
    00428     }
    00429
    00430     qwSize = dwSize;
    00431     qwLNumBits = (p->m_qwLNumBits + (qwSize << 3));
    00432     if(qwLNumBits < p->m_qwLNumBits) p->m_qwHNumBits++;
    00433 //  p->m_qwHNumBits += qwSize >> 61;
    00434     p->m_qwLNumBits = qwLNumBits;
    00435
    00436     pBlock = (BYTE *)p->m_aBlock;
    00437     while(dwSize){
    00438         //dwReadSize = (dwSize < SHA512_BUFFER_SIZE - p->m_nNumChr) ?
    00439         dwReadSize = (dwSize < SHA512_BUFFER_SIZE - (DWORD)p->m_nNumChr) ?
    00440              dwSize :
    00441             (SHA512_BUFFER_SIZE - p->m_nNumChr);
    00442
    00443         memcpy(pBlock + p->m_nNumChr, pBuffer, dwReadSize);
    00444
    00445         p->m_nNumChr += dwReadSize;
    00446         pBuffer += dwReadSize;
    00447         dwSize -= dwReadSize;
    00448
    00449         if(p->m_nNumChr == SHA512_BUFFER_SIZE){
    00450             Generate(p);
    00451             p->m_nNumChr = 0;
    00452         }
    00453     }
    00454 }

static DKC_INLINE void Generate | ( | DKC_SHA512 * |  | ) | `[static]`

| dkcSHA512.c の 389 行で定義されています。 参照先 Default_Generate(), dkc_SHA512::m_bMMX, と MMX_Generate().
    00390 {
    00391     if(p->m_bMMX){
    00392         MMX_Generate(p);
    00393         return;
    00394     }
    00395     Default_Generate(p);
    00396 }

static DKC_INLINE QWORD Maj | ( | QWORD | x,
|  | QWORD | y,
|  | QWORD | z
| ) | `[static]`

| dkcSHA512.c の 64 行で定義されています。
    00064 {return (x & (y | z)) | (y & z);}

static DKC_INLINE void MMX_Generate | ( | DKC_SHA512 * |  | ) | `[static]`

| dkcSHA512.c の 383 行で定義されています。 参照先 Default_Generate(). 参照元 Generate().
    00383                                                   {
    00384     Default_Generate(p);
    00385 }

static DKC_INLINE DWORD ReverseEndianDWORD | ( | DWORD | x | ) | `[static]`

| dkcSHA512.c の 56 行で定義されています。 参照先 dkcReverseEndian32().
    00056                                                     {
    00057     return dkcReverseEndian32(x);
    00058 }

static DKC_INLINE QWORD ReverseEndianQWORD | ( | QWORD | x | ) | `[static]`

| dkcSHA512.c の 59 行で定義されています。 参照先 dkcReverseEndian64(). 参照元 Default_Generate(), と dkcSHA512Final().
    00059                                                     {
    00060     return dkcReverseEndian64(x);
    00061 }

static DKC_INLINE QWORD Rotate | ( | QWORD | x,
|  | DWORD | n
| ) | `[static]`

| dkcSHA512.c の 62 行で定義されています。
    00062 {return (x >> n) | (x << (64 - n));}

static DKC_INLINE QWORD s0 | ( | QWORD | x | ) | `[static]`

| dkcSHA512.c の 67 行で定義されています。 参照先 Rotate().
    00067 {return Rotate(x,  1) ^ Rotate(x,  8) ^ (x >> 7);}

static DKC_INLINE QWORD S0 | ( | QWORD | x | ) | `[static]`

| dkcSHA512.c の 65 行で定義されています。 参照先 Rotate().
    00065 {return Rotate(x, 28) ^ Rotate(x, 34) ^ Rotate(x, 39);}

static DKC_INLINE QWORD s1 | ( | QWORD | x | ) | `[static]`

| dkcSHA512.c の 68 行で定義されています。 参照先 Rotate().
    00068 {return Rotate(x, 19) ^ Rotate(x, 61) ^ (x >> 6);}

static DKC_INLINE QWORD S1 | ( | QWORD | x | ) | `[static]`

| dkcSHA512.c の 66 行で定義されています。 参照先 Rotate().
    00066 {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.c の 18 行で定義されています。 参照元 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.c の 23 行で定義されています。 参照元 Default_Generate().