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

dkcBlowfish.h

Blowfish encryptio algorithm. [詳細]

#include "dkcOSIndependent.h"

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

Include dependency graph

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

Included by dependency graph

ソースコードを見る。

構成

struct  dkc_Blowfish

マクロ定義

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


型定義

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()で初期化するけど、明示的に初期化したい場合これを呼び出す。

DKC_EXTERN 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氏に感謝します。

TODO:
インターフェイスの変更の可能性あり。しかし、よほど気が向かない限り行わないだろう。

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


マクロ定義

#define dkcd_BLOWFISH_MAX_KEY_SIZE   MAXKEYBYTES
 

キーの最大値

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

参照元 dkcBlowfishInit().

#define MAXKEYBYTES   56
 

TODO:
このdefineは変える可能性ありdkcd_BLOWFISH_MAX_KEY_SIZEを使用すべし

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

#define NPASS   16
 

TODO:
このdefineは変える可能性あり

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

参照元 dkcBlowfishInit().


型定義

typedef struct dkc_Blowfish DKC_BLOWFISH
 

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

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE)[256]
 

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

参照元 dkcAllocBlowfish().


関数

DKC_EXTERN DKC_BLOWFISH* WINAPI dkcAllocBlowfish (  BYTE *  key,
int  keysize
) 
 

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

dkcBlowfish.c の 289 行で定義されています。

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

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

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.c の 516 行で定義されています。

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

00517 {
00518     DWORD   lCount ;
00519     BYTE    *pi, *po ;
00520     int     i ;
00521     int     SameDest = (pInput == pOutput ? 1 : 0) ;
00522 
00523     for (lCount = 0 ; lCount < lSize ; lCount += 8)
00524     {
00525         if (SameDest)   // if encoded data is being written into inputbuffer
00526         {
00527             Blowfish_decipher (p,(DWORD *) pInput,
00528                 (DWORD *) (pInput + 4)) ;
00529             pInput += 8 ;
00530         }
00531         else            // output buffer not equal to inputbuffer
00532         {               // so copy input to output before decoding
00533             pi = pInput ;
00534             po = pOutput ;
00535             for (i = 0 ; i < 8 ; i++)
00536                 *po++ = *pi++ ;
00537             Blowfish_decipher (p,(DWORD *) pOutput,
00538                 (DWORD *) (pOutput + 4)) ;
00539             pInput += 8 ;
00540             pOutput += 8 ;
00541         }
00542     }
00543 }

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.

戻り値:
0 == ERROR

dkcBlowfish.c の 449 行で定義されています。

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

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

DKC_EXTERN DWORD WINAPI dkcBlowfishGetOutputLength (  DWORD  lInputLong  ) 
 

dkcBlowfish.c の 436 行で定義されています。

参照先 DWORD.

参照元 dkcBlowfishEncrypt().

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

DKC_EXTERN int WINAPI dkcBlowfishInit (  DKC_BLOWFISH *  p,
BYTE *  key,
int  keybytes
) 
 

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

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

dkcBlowfish.c の 378 行で定義されています。

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

参照元 dkcAllocBlowfish().

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

DKC_EXTERN int WINAPI dkcFreeBlowfish (  DKC_BLOWFISH **   ) 
 

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

dkcBlowfish.c の 316 行で定義されています。

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

参照元 dkcAllocBlowfish().

00316                                             {
00317     if(NULL==p || NULL==(*p)){
00318         return edk_FAILED;
00319     }
00320     if((*p)->SBoxes){
00321         free((*p)->SBoxes);
00322     }
00323     if((*p)->PArray){
00324         free((*p)->PArray);
00325     }
00326     return dkcFree((void **)p);
00327 }


dkutil_cに対してTue Feb 22 02:02:01 2005に生成されました。 doxygen 1.3.6