#include "dkcOSIndependent.h"
dkcBlowfish.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
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) |
dkcBlowfish.h で定義されています。
|
dkcBlowfish.h の 30 行で定義されています。 参照元 bse_basic_logic(). |
|
キーの最大値
dkcBlowfish.h の 21 行で定義されています。 参照元 dkcBlowfishInit(). |
|
|
dkcBlowfish.h の 17 行で定義されています。 |
|
dkcBlowfish.h の 18 行で定義されています。 参照元 dkcBlowfishInit(). |
|
choose a byte order for your hardware
dkcBlowfish.h の 81 行で定義されています。 |
|
dkcBlowfish.h の 27 行で定義されています。 |
|
参照元 Blowfish_decipher(), Blowfish_encipher(), dkcAllocBlowfish(), dkcBlowfishDecrypt(), dkcBlowfishEncrypt(), dkcBlowfishInit(), と dkcFreeBlowfish(). |
|
dkcBlowfish.h の 34 行で定義されています。 参照元 dkcAllocBlowfish(). |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。
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 } |
|
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((void **)p); 00323 } |