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

# dkcHC256.h

HC256 cipher Algorithm [詳細]

`#include "dkcOSIndependent.h"`

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

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

ソースコードを見る。

## 構成
struct | dkc_HC256
## マクロ定義
#define | dkcdHC256_KEY_SIZE 32
#define | dkcdHC256_IV_SIZE 32
#define | dkcHC256DecryptDOE(a, b, c, d, e) dkcHC256EncryptDOE(a,b,c,d,e)
#define | dkcHC256DecryptNoDestDOE(a, b, c) dkcHC256EncryptNoDestDOE(a,b,c)
## 型定義
typedef dkc_HC256 | DKC_HC256
## 関数
DKC_EXTERN DKC_HC256 *WINAPI | dkcAllocHC256 (BYTE *key, size_t size, uint32 *iv, size_t ivsize)
| keyのサイズは32byte ivも32byte
DKC_EXTERN DKC_HC256 * | dkcAllocHC256Const (const BYTE *key, size_t size, const uint32 *iv, size_t ivsize)
DKC_EXTERN int WINAPI | dkcFreeHC256 (DKC_HC256 **)
DKC_EXTERN uint8 WINAPI | dkcHC256_Byte (DKC_HC256 *p)
DKC_EXTERN int WINAPI | dkcHC256EncryptDOE (DKC_HC256 *p, uint8 *dest, size_t dsize, const uint8 *src, size_t ssize)
DKC_EXTERN int WINAPI | dkcHC256EncryptNoDestDOE (DKC_HC256 *p, uint8 *inout, size_t size)
| この処理バイトを分割していく

## 説明

HC256 cipher Algorithm

作者:
  Hongjun Wu in 2003. convert by d金魚

から:
  original 2003 / converted in 2004/12/20

覚え書き:
  参考資料： http://d.hatena.ne.jp/studiokingyo/20041216#p4 http://www.i2r.a-star.edu.sg/icsd/staff/hongjun/hc/

### 略語解説

    DOE : Dependent On Endian / エンディアンに依存する

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

## マクロ定義

#define dkcdHC256_IV_SIZE 32

| dkcHC256.h の 25 行で定義されています。 参照元 dkcAllocHC256(), と dkcAllocHC256NoLimitKeyLength().

#define dkcdHC256_KEY_SIZE 32

| dkcHC256.h の 24 行で定義されています。 参照元 dkcAllocHC256().

#define dkcHC256DecryptDOE | ( | a,
|  | b,
|  | c,
|  | d,
|  | e |  | ) | dkcHC256EncryptDOE(a,b,c,d,e)

| dkcHC256.h の 64 行で定義されています。

#define dkcHC256DecryptNoDestDOE | ( | a,
|  | b,
|  | c |  | ) | dkcHC256EncryptNoDestDOE(a,b,c)

| dkcHC256.h の 67 行で定義されています。

## 型定義

typedef struct dkc_HC256 DKC_HC256

## 関数

DKC_EXTERN DKC_HC256* WINAPI dkcAllocHC256 | ( | BYTE * | key,
|  | size_t | size,
|  | uint32 * | iv,
|  | size_t | ivsize
| ) |

| keyのサイズは32byte ivも32byte 参照: keyやivは内部でいじり倒されるのでそれが嫌な場合はdkcAllocHC256Const()を使ってください。 dkcHC256.c の 309 行で定義されています。 参照先 dkcAllocate(), dkcdHC256_IV_SIZE, dkcdHC256_KEY_SIZE, initialization(), NULL, と store(). 参照元 dkcAllocHC256Const(), と dkcAllocHC256NoLimitKeyLength().
    00309                                                                                           {
    00310     DKC_HC256 *p;
    00311     //uint32 iv[8];
    00312     //size_t limit = sizeof(uint32) * 8;
    00313     //if(size != limit || ivsize != limit){
    00314     if(size != dkcdHC256_KEY_SIZE || ivsize != dkcdHC256_IV_SIZE){
    00315         return NULL;
    00316     }
    00317
    00318     p = dkcAllocate(sizeof(DKC_HC256));
    00319     if(NULL==p){
    00320         return NULL;
    00321     }
    00322     //DKUTIL_MEMZERO(iv,sizeof(iv));
    00323     initialization(p,(uint32 *)key,iv);
    00324     store(p);
    00325     //p->store_size = 64;
    00326     return p;
    00327 }

DKC_EXTERN DKC_HC256* dkcAllocHC256Const | ( | const BYTE * | key,
|  | size_t | size,
|  | const uint32 * | iv,
|  | size_t | ivsize
| ) |

DKC_EXTERN int WINAPI dkcFreeHC256 | ( | DKC_HC256 ** |  | ) |

| dkcHC256.c の 346 行で定義されています。 参照先 dkcFree().
    00346                                                  {
    00347     return dkcFree(p);
    00348 }

DKC_EXTERN uint8 WINAPI dkcHC256_Byte | ( | DKC_HC256 * | p | ) |

| dkcHC256.c の 353 行で定義されています。 参照先 dkcmNOT_ASSERT, get_offset, store(), dkc_HC256::store_size, と dkc_HC256::u_store. 参照元 dkcHC256EncryptNoDestDOE().
    00353                                                    {
    00354     int r = 0;
    00355     size_t offset;
    00356     //DKC_4BYTE_LITTLE_ENDIAN_BASE a;
    00357     if(p->store_size <=0){
    00358         r = store(p);
    00359         dkcmNOT_ASSERT(DKUTIL_FAILED(r));
    00360     }
    00361     offset = get_offset(p);
    00362     p->store_size--;
    00363     return p->u_store.a8[offset];
    00364
    00365 }

DKC_EXTERN int WINAPI dkcHC256EncryptDOE | ( | DKC_HC256 * | p,
|  | uint8 * | dest,
|  | size_t | dsize,
|  | const uint8 * | src,
|  | size_t | ssize
| ) |

| 覚え書き: dkcHC256.c の 367 行で定義されています。 参照先 dkcHC256EncryptNoDestDOE().
    00368 {
    00369     if(ssize > dsize){
    00370         return edk_ArgumentException;
    00371     }
    00372     if(dest != src){
    00373         memcpy(dest,src,ssize);
    00374     }
    00375     return dkcHC256EncryptNoDestDOE(p,dest,ssize);
    00376
    00377 }

DKC_EXTERN int WINAPI dkcHC256EncryptNoDestDOE | ( | DKC_HC256 * | p,
|  | uint8 * | inout,
|  | size_t | size
| ) |

| この処理バイトを分割していく dkcHC256.c の 380 行で定義されています。 参照先 dkcHC256_Byte(), dkcHC256EncryptNoDestDOE(), dkcmNOT_ASSERT, store(), dkc_HC256::store_size, と dkc_HC256::u_store. 参照元 dkcHC256EncryptDOE(), と dkcHC256EncryptNoDestDOE().
    00381 {
    00382
    00383     size_t i;
    00384     int r;
    00385     size_t count,rest;
    00386     uint64 *io64;
    00387
    00388     //残り物処分
    00389     if(size <= 0) return edk_SUCCEEDED;
    00390     for(i=0;;){//for scope
    00391         if((size > 64) && ( p->store_size == 0 || 64==p->store_size)){
    00392             break;
    00393         }
    00394         for(;i<size;i++){
    00395             inout[i] ^= dkcHC256_Byte(p);
    00396             if(p->store_size == 0){
    00397                 break;
    00398             }
    00399         }
    00400         break;
    00401     }
    00402     size-=i;
    00403     inout+=i;
    00404     if(size <= 0) return edk_SUCCEEDED;
    00405
    00406     count = size / 64;
    00407     rest = size % 64;//最適化に任せよう（笑）
    00408     if(64!=p->store_size){
    00409         r = store(p);
    00410         dkcmNOT_ASSERT(DKUTIL_FAILED(r));
    00411     }
    00412     io64 = (uint64 *)inout;
    00413     for(;i<count;i++){
    00414         //64bit単位も良いかも？
    00415         io64[0] ^= p->u_store.a64[0];
    00416         io64[1] ^= p->u_store.a64[1];
    00417         io64[2] ^= p->u_store.a64[2];
    00418         io64[3] ^= p->u_store.a64[3];
    00419         io64[4] ^= p->u_store.a64[4];
    00420         io64[5] ^= p->u_store.a64[5];
    00421         io64[6] ^= p->u_store.a64[6];
    00422         io64[7] ^= p->u_store.a64[7];
    00423
    00424         io64+=8;
    00425         p->store_size = 0;
    00426         store(p);
    00427     }
    00428     inout =(uint8*)io64;
    00429     return dkcHC256EncryptNoDestDOE(p,inout,rest);
    00430
    00431 }