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

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

参照元 dkcBlowfishInit().

#define MAXKEYBYTES   56
 

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

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

#define NPASS   16
 

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

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

参照元 dkcBlowfishInit().


型定義

typedef struct dkc_Blowfish DKC_BLOWFISH
 

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

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE)[256]
 

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

参照元 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(), 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.c516 行で定義されています。

参照先 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.c449 行で定義されています。

参照先 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.c436 行で定義されています。

参照先 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.c378 行で定義されています。

参照先 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.c316 行で定義されています。

参照先 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