#include "dkcBlowfish.h"
dkcBlowfish.cのインクルード依存関係図

マクロ定義 | |
| #define | DKUTIL_C_BLOWFISH_C |
| #define | S(SBox_, x, i) (SBox_[i][x.w.byte##i]) |
| #define | bf_F(SBox_, x) (((S(SBox_,x,0) + S(SBox_,x,1)) ^ S(SBox_,x,2)) + S(SBox_,x,3)) |
| #define | ROUND(PArray_, SBox_, a, b, n) (a.dword ^= bf_F(SBox_,b) ^ PArray_[n]) |
関数 | |
| DKC_BLOWFISH *WINAPI | dkcAllocBlowfish (BYTE *key, int keysize) |
| int WINAPI | dkcFreeBlowfish (DKC_BLOWFISH **p) |
| dkcAllocBlowfish()で確保したメモリ領域を開放 | |
| DKC_INLINE void | Blowfish_encipher (DKC_BLOWFISH *p, DWORD *xl, DWORD *xr) |
| DKC_INLINE void | Blowfish_decipher (DKC_BLOWFISH *p, DWORD *xl, DWORD *xr) |
| int WINAPI | dkcBlowfishInit (DKC_BLOWFISH *p, BYTE *key, int keybytes) |
| dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。 | |
| DWORD WINAPI | dkcBlowfishGetOutputLength (DWORD lInputLong) |
| DWORD WINAPI | dkcBlowfishEncrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize) |
| void WINAPI | dkcBlowfishDecrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize) |
変数 | |
| const DWORD | bf_P [NPASS+2] |
| const DWORD | bf_S [4][256] |
dkcBlowfish.c で定義されています。
|
|
dkcBlowfish.c の 18 行で定義されています。 |
|
|
dkcBlowfish.c の 11 行で定義されています。 |
|
|
dkcBlowfish.c の 19 行で定義されています。 |
|
|
dkcBlowfish.c の 17 行で定義されています。 |
|
||||||||||||||||
|
dkcBlowfish.c の 354 行で定義されています。 参照先 DKC_BLOWFISH, dkc_Blowfish::PArray, ROUND, と dkc_Blowfish::SBoxes. 参照元 dkcBlowfishDecrypt().
00355 {
00356 union aword Xl ;
00357 union aword Xr ;
00358
00359 Xl.dword = *xl ;
00360 Xr.dword = *xr ;
00361
00362 Xl.dword ^= p->PArray [17] ;
00363 ROUND (p->PArray,p->SBoxes,Xr, Xl, 16) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 15) ;
00364 ROUND (p->PArray,p->SBoxes,Xr, Xl, 14) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 13) ;
00365 ROUND (p->PArray,p->SBoxes,Xr, Xl, 12) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 11) ;
00366 ROUND (p->PArray,p->SBoxes,Xr, Xl, 10) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 9) ;
00367 ROUND (p->PArray,p->SBoxes,Xr, Xl, 8) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 7) ;
00368 ROUND (p->PArray,p->SBoxes,Xr, Xl, 6) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 5) ;
00369 ROUND (p->PArray,p->SBoxes,Xr, Xl, 4) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 3) ;
00370 ROUND (p->PArray,p->SBoxes,Xr, Xl, 2) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 1) ;
00371 Xr.dword ^= p->PArray[0];
00372
00373 *xl = Xr.dword;
00374 *xr = Xl.dword;
00375 }
|
|
||||||||||||||||
|
dkcBlowfish.c の 331 行で定義されています。 参照先 DKC_BLOWFISH, dkc_Blowfish::PArray, ROUND, と dkc_Blowfish::SBoxes. 参照元 dkcBlowfishEncrypt(), と dkcBlowfishInit().
00332 {
00333 union aword Xl, Xr ;
00334
00335 Xl.dword = *xl ;
00336 Xr.dword = *xr ;
00337
00338 Xl.dword ^= p->PArray [0];
00339 ROUND (p->PArray,p->SBoxes,Xr, Xl, 1) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 2) ;
00340 ROUND (p->PArray,p->SBoxes,Xr, Xl, 3) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 4) ;
00341 ROUND (p->PArray,p->SBoxes,Xr, Xl, 5) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 6) ;
00342 ROUND (p->PArray,p->SBoxes,Xr, Xl, 7) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 8) ;
00343 ROUND (p->PArray,p->SBoxes,Xr, Xl, 9) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 10) ;
00344 ROUND (p->PArray,p->SBoxes,Xr, Xl, 11) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 12) ;
00345 ROUND (p->PArray,p->SBoxes,Xr, Xl, 13) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 14) ;
00346 ROUND (p->PArray,p->SBoxes,Xr, Xl, 15) ; ROUND (p->PArray,p->SBoxes,Xl, Xr, 16) ;
00347 Xr.dword ^= p->PArray [17] ;
00348
00349 *xr = Xl.dword ;
00350 *xl = Xr.dword ;
00351 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
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 の 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 }
|
|
|
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 }
|
|
||||||||||||||||
|
dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。
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 }
|
|
|
dkcAllocBlowfish()で確保したメモリ領域を開放
dkcBlowfish.c の 316 行で定義されています。 参照先 DKC_BLOWFISH, dkcFree(), と NULL. 参照元 dkcAllocBlowfish().
|
|
|
初期値: {
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
0x9216d5d9, 0x8979fb1b,
}
dkcBlowfish.c の 22 行で定義されています。 参照元 dkcBlowfishInit(). |
|
|
dkcBlowfish.c の 29 行で定義されています。 参照元 dkcBlowfishInit(). |
1.3.6