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

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

#define dkcd_BLOWFISH_MAX_KEY_SIZE   MAXKEYBYTES
 

キーの最大値

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

参照元 dkcBlowfishInit().

#define DWORD   unsigned long
 

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

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

#define MAXKEYBYTES   56
 

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

#define NPASS   16
 

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

参照元 dkcBlowfishInit().

#define ORDER_DCBA
 

choose a byte order for your hardware

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

#define WORD   unsigned short
 

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


型定義

typedef struct dkc_Blowfish DKC_BLOWFISH
 

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

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE)[256]
 

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

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

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

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

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

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

参照先 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(p);
00323 }


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