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

dkcBlowfish.h

Blowfish encryptio algorithm converted C by d金魚
から:
2004/07/07.
[詳細]

#include "dkcOSIndependent.h"

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

Include dependency graph

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

Included by dependency graph

ソースコードを見る。

構成

struct  dkc_Blowfish
union  aword

マクロ定義

#define MAXKEYBYTES   56
#define NPASS   16
#define dkcd_BLOWFISH_MAX_KEY_SIZE   MAXKEYBYTES
 キーの最大値

#define DWORD   unsigned long
#define WORD   unsigned short
#define BYTE   unsigned char
#define ORDER_DCBA
 choose a byte order for your hardware


型定義

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE )[256]
typedef dkc_Blowfish DKC_BLOWFISH

関数

DKC_EXTERN DKC_BLOWFISH *WINAPI dkcAllocBlowfish (BYTE *key, int keysize)
DKC_EXTERN int WINAPI dkcFreeBlowfish (DKC_BLOWFISH **)
 dkcAllocBlowfish()で確保したメモリ領域を開放

DKC_EXTERN int WINAPI dkcBlowfishInit (DKC_BLOWFISH *p, BYTE *key, int keybytes)
 dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。

DWORD WINAPI dkcBlowfishGetOutputLength (DWORD lInputLong)
DKC_EXTERN DWORD WINAPI dkcBlowfishEncrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize)
DKC_EXTERN void WINAPI dkcBlowfishDecrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize)


説明

Blowfish encryptio algorithm converted C by d金魚
から:
2004/07/07.

覚え書き:
Bruce Schneier氏、Jim Conger氏に感謝します。

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


マクロ定義

#define BYTE   unsigned char
 

dkcBlowfish.h30 行で定義されています。

参照元 bse_basic_logic(), と ProcessCall().

#define dkcd_BLOWFISH_MAX_KEY_SIZE   MAXKEYBYTES
 

キーの最大値

dkcBlowfish.h21 行で定義されています。

参照元 dkcBlowfishInit().

#define DWORD   unsigned long
 

dkcBlowfish.h24 行で定義されています。

参照元 Ch(), dkcAllocBlowfish(), dkcAllocThreadLock(), dkcBlowfishDecrypt(), dkcBlowfishEncrypt(), dkcBlowfishGetOutputLength(), dkcBlowfishInit(), dkcReverseEndian32(), dkcReverseEndian64(), dkcSHA1Final(), dkcSHA1Load(), dkcSHA256Final(), dkcSHA256Load(), dkcSHA512DigestStr(), dkcSHA512Load(), dkcThreadLock_Unlock(), dkcThreadLockIsLockedByThisThread(), dkcULONGLONGToTwoDWORD(), Generate(), Maj(), ReverseEndian(), ReverseEndianDWORD(), Rotate(), s0(), S0(), s1(), と S1().

#define MAXKEYBYTES   56
 

dkcBlowfish.h17 行で定義されています。

#define NPASS   16
 

dkcBlowfish.h18 行で定義されています。

参照元 dkcBlowfishInit().

#define ORDER_DCBA
 

choose a byte order for your hardware

dkcBlowfish.h81 行で定義されています。

#define WORD   unsigned short
 

dkcBlowfish.h27 行で定義されています。


型定義

typedef struct dkc_Blowfish DKC_BLOWFISH
 

参照元 Blowfish_decipher(), Blowfish_encipher(), dkcAllocBlowfish(), dkcBlowfishDecrypt(), dkcBlowfishEncrypt(), dkcBlowfishInit(), と dkcFreeBlowfish().

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE)[256]
 

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

参照元 dkcAllocBlowfish().


関数

DKC_EXTERN DKC_BLOWFISH* WINAPI dkcAllocBlowfish BYTE key,
int  keysize
 

引数:
key[in] キーへのポインタ
keysize[in] keyのサイズ
覚え書き:
dkcd_BLOWFISH_MAX_KEY_SIZEよりキーが大きい場合は失敗します。 内部でdkcBlowfishInit()を呼び出しています。

dkcBlowfish.c289 行で定義されています。

参照先 BYTE, DKC_BLOWFISH, DKC_BLOWFISH_SBOX_TYPE, dkcAllocate(), dkcBlowfishInit(), dkcFreeBlowfish(), DKUTIL_FAILED, DWORD, NULL, dkc_Blowfish::PArray, と dkc_Blowfish::SBoxes.

00289                                                             {
00290     DKC_BLOWFISH *p = (DKC_BLOWFISH *)dkcAllocate(sizeof(DKC_BLOWFISH));
00291     if(NULL==p){
00292         return NULL;
00293     }
00294     p->PArray = (DWORD *)malloc( sizeof(DWORD) * 18) ;
00295     if(NULL==p->PArray){
00296         goto Error;
00297     }
00298     p->SBoxes = (DKC_BLOWFISH_SBOX_TYPE)malloc( sizeof(DWORD) * 4 * 256) ;
00299     if(NULL==p->SBoxes){
00300         goto Error;
00301     }
00302     if(DKUTIL_FAILED(dkcBlowfishInit(p,key,keysize))){
00303         goto Error;
00304     }
00305     return p;
00306 Error:
00307     dkcFreeBlowfish(&p);
00308     return NULL;
00309 }

DKC_EXTERN void WINAPI dkcBlowfishDecrypt DKC_BLOWFISH p,
BYTE pInput,
BYTE pOutput,
DWORD  lSize
 

Decode pIntput into pOutput. Input length in lSize. Inputbuffer and output buffer can be the same, but be sure buffer length is even MOD8.

dkcBlowfish.c504 行で定義されています。

参照先 Blowfish_decipher(), BYTE, DKC_BLOWFISH, と DWORD.

00505 {
00506     DWORD   lCount ;
00507     BYTE    *pi, *po ;
00508     int     i ;
00509     int     SameDest = (pInput == pOutput ? 1 : 0) ;
00510 
00511     for (lCount = 0 ; lCount < lSize ; lCount += 8)
00512     {
00513         if (SameDest)   // if encoded data is being written into inputbuffer
00514         {
00515             Blowfish_decipher (p,(DWORD *) pInput,
00516                 (DWORD *) (pInput + 4)) ;
00517             pInput += 8 ;
00518         }
00519         else            // output buffer not equal to inputbuffer
00520         {               // so copy input to output before decoding
00521             pi = pInput ;
00522             po = pOutput ;
00523             for (i = 0 ; i < 8 ; i++)
00524                 *po++ = *pi++ ;
00525             Blowfish_decipher (p,(DWORD *) pOutput,
00526                 (DWORD *) (pOutput + 4)) ;
00527             pInput += 8 ;
00528             pOutput += 8 ;
00529         }
00530     }
00531 }

DKC_EXTERN DWORD WINAPI dkcBlowfishEncrypt DKC_BLOWFISH p,
BYTE pInput,
BYTE pOutput,
DWORD  lSize
 

Encode pIntput into pOutput. Input length in lSize. Returned value is length of output which will be even MOD 8 bytes. Inputbuffer and output buffer can be the same, but be sure buffer length is even MOD8.

dkcBlowfish.c445 行で定義されています。

参照先 Blowfish_encipher(), BYTE, DKC_BLOWFISH, dkcBlowfishGetOutputLength(), と DWORD.

00446 {
00447     DWORD   lCount, lOutSize, lGoodBytes ;
00448     BYTE    *pi, *po ;
00449     int     i, j ;
00450     int     SameDest = (pInput == pOutput ? 1 : 0) ;
00451 
00452     lOutSize = dkcBlowfishGetOutputLength (lSize) ;
00453     for (lCount = 0 ; lCount < lOutSize ; lCount += 8)
00454     {
00455         if (SameDest)   // if encoded data is being written into inputbuffer
00456         {
00457             if (lCount < lSize - 7) // if not dealing with unevenbytes at end
00458             {
00459                 Blowfish_encipher (p,(DWORD *) pInput,
00460                     (DWORD *) (pInput + 4)) ;
00461             }
00462             else        // pad end of data with null bytes tocomplete encryption
00463             {
00464                 po = pInput + lSize ;   // point at bytepast theend of actual data
00465                 j = (int) (lOutSize - lSize) ;  // number ofbytes to set to null
00466                 for (i = 0 ; i < j ; i++)
00467                     *po++ = 0 ;
00468                 Blowfish_encipher (p,(DWORD *) pInput,
00469                     (DWORD *) (pInput + 4)) ;
00470             }
00471             pInput += 8 ;
00472         }
00473         else            // output buffer not equal to inputbuffer, so must copy
00474         {               // input to output buffer prior to encrypting
00475             if (lCount < lSize - 7) // if not dealing with unevenbytes at end
00476             {
00477                 pi = pInput ;
00478                 po = pOutput ;
00479                 for (i = 0 ; i < 8 ; i++)
00480 // copy bytes to output
00481                     *po++ = *pi++ ;
00482                 Blowfish_encipher (p,(DWORD *) pOutput, // nowencrypt them
00483                     (DWORD *) (pOutput + 4)) ;
00484             }
00485             else        // pad end of data with null bytes tocomplete encryption
00486             {
00487                 lGoodBytes = lSize - lCount ;   // number ofremaining data bytes
00488                 po = pOutput ;
00489                 for (i = 0 ; i < (int) lGoodBytes ; i++)
00490                     *po++ = *pInput++ ;
00491                 for (j = i ; j < 8 ; j++)
00492                     *po++ = 0 ;
00493                 Blowfish_encipher (p,(DWORD *) pOutput,
00494                     (DWORD *) (pOutput + 4)) ;
00495             }
00496             pInput += 8 ;
00497             pOutput += 8 ;
00498         }
00499     }
00500     return lOutSize ;
00501  }

DWORD WINAPI dkcBlowfishGetOutputLength DWORD  lInputLong  ) 
 

dkcBlowfish.c432 行で定義されています。

参照先 DWORD.

参照元 dkcBlowfishEncrypt().

00433 {
00434     DWORD   lVal ;
00435 
00436     lVal = lInputLong % 8 ; // find out if uneven number of bytes at
00437 //the end
00438     if (lVal != 0)
00439         return lInputLong + 8 - lVal ;
00440     else
00441         return lInputLong ;
00442 }

DKC_EXTERN int WINAPI dkcBlowfishInit DKC_BLOWFISH p,
BYTE key,
int  keybytes
 

dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。

覚え書き:
  • dkcd_BLOWFISH_MAX_KEY_SIZEよりキーが大きい場合は失敗します。
  • この関数の使用は奨励されていません。
  • この関数の名前は変更する場合があります。
戻り値:
edk_SUCCEEDEDなら成功

dkcBlowfish.c374 行で定義されています。

参照先 bf_P, bf_S, Blowfish_encipher(), BYTE, DKC_BLOWFISH, dkcd_BLOWFISH_MAX_KEY_SIZE, aword::dword, DWORD, edk_FAILED, edk_SUCCEEDED, NPASS, dkc_Blowfish::PArray, dkc_Blowfish::SBoxes, と aword::w.

参照元 dkcAllocBlowfish().

00375 {
00376     
00377     int         i, j ;
00378     DWORD       data, datal, datar ;
00379     union aword temp ;
00380 
00381     if(dkcd_BLOWFISH_MAX_KEY_SIZE < keybytes){
00382         return edk_FAILED;
00383     }
00384 
00385     // first fill arrays from data tables
00386     for (i = 0 ; i < 18 ; i++)
00387         p->PArray[i] = bf_P [i] ;
00388 
00389     for (i = 0 ; i < 4 ; i++)
00390     {
00391         for (j = 0 ; j < 256 ; j++)
00392             p->SBoxes [i][j] = bf_S [i][j] ;
00393     }
00394 
00395 
00396     j = 0 ;
00397     for (i = 0 ; i < NPASS + 2 ; ++i)
00398     {
00399         temp.dword = 0 ;
00400         temp.w.byte0 = key[j];
00401         temp.w.byte1 = key[(j+1) % keybytes] ;
00402         temp.w.byte2 = key[(j+2) % keybytes] ;
00403         temp.w.byte3 = key[(j+3) % keybytes] ;
00404         data = temp.dword ;
00405         p->PArray[i] ^= data ;
00406         j = (j + 4) % keybytes ;
00407     }
00408 
00409     datal = 0 ;
00410     datar = 0 ;
00411 
00412     for (i = 0 ; i < NPASS + 2 ; i += 2)
00413     {
00414         Blowfish_encipher (p,&datal, &datar) ;
00415         p->PArray[i] = datal ;
00416         p->PArray[i + 1] = datar ;
00417     }
00418 
00419     for (i = 0 ; i < 4 ; ++i)
00420     {
00421         for (j = 0 ; j < 256 ; j += 2)
00422         {
00423           Blowfish_encipher (p,&datal, &datar) ;
00424           p->SBoxes [i][j] = datal ;
00425           p->SBoxes [i][j + 1] = datar ;
00426         }
00427     }
00428 
00429     return edk_SUCCEEDED;
00430 }

DKC_EXTERN int WINAPI dkcFreeBlowfish DKC_BLOWFISH **   ) 
 

dkcAllocBlowfish()で確保したメモリ領域を開放

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

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

参照元 dkcAllocBlowfish().

00312                                             {
00313     if(NULL==p){
00314         return edk_FAILED;
00315     }
00316     if((*p)->SBoxes){
00317         free((*p)->SBoxes);
00318     }
00319     if((*p)->PArray){
00320         free((*p)->PArray);
00321     }
00322     return dkcFree((void **)p);
00323 }


dkutil_cに対してTue Dec 7 01:10:03 2004に生成されました。 doxygen 1.3.6