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

# dkcSafeFileSystem.h

改竄防止機能付き ファイルシステム [詳細]

`#include "dkcCryptograph.h"`
`#include "dkcSHA1.h"`
`#include "dkcSJISFileSystem.h"`
`#include "dkcBuffer.h"`
`#include "dkcStream.h"`

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

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

ソースコードを見る。

## 構成
struct | dkc_FileHeader_FileWithSignature
struct | dkc_FileWithSignature
struct | dkc_Arcfour_File
## 型定義
typedef dkc_FileHeader_FileWithSignature | DKC_FILE_HEADER_FILE_WITH_SIGNATURE
typedef dkc_FileWithSignature | DKC_FILE_WITH_SIGNATURE
typedef dkc_Arcfour_File | DKC_ARCFOUR_FILE
## 関数
DKC_EXTERN DKC_FILE_WITH_SIGNATURE *WINAPI | dkcOpenFileWithSignature (UINT stream_flag, const char *filename, const char *mode, const void *dustbin, size_t dustbin_size, UINT signature)
DKC_EXTERN int WINAPI | dkcFileWithSignatureWrite (DKC_FILE_WITH_SIGNATURE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcFileWithSignatureWrite16 (DKC_FILE_WITH_SIGNATURE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcFileWithSignatureWrite32 (DKC_FILE_WITH_SIGNATURE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcFileWithSignatureWrite64 (DKC_FILE_WITH_SIGNATURE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcFileWithSignatureRead (DKC_FILE_WITH_SIGNATURE *p, void *data, size_t size, size_t *readsize)
DKC_EXTERN int WINAPI | dkcFileWithSignatureCheckCheat (DKC_FILE_WITH_SIGNATURE *p)
DKC_EXTERN int WINAPI | dkcFileWithSignatureCheckCheatFile (const char *filename)
DKC_EXTERN void WINAPI | dkcFileWithSignatureFinal (DKC_FILE_WITH_SIGNATURE *p)
| SHAの最終処理をする
DKC_EXTERN int WINAPI | dkcCloseFileWithSignature (DKC_FILE_WITH_SIGNATURE **)
DKC_EXTERN DKC_ARCFOUR_FILE * | dkcOpenArcfourFile (UINT stream_flag, size_t stream_size, const char *filename, const char *mode, const void *dustbin, size_t dustbin_size, const void *arcfour_key, size_t arcfour_size, UINT signature, BOOL *IsCheated)
DKC_EXTERN int | dkcCloseArcfourFile (DKC_ARCFOUR_FILE **)
DKC_EXTERN int WINAPI | dkcArcfourFileWrite (DKC_ARCFOUR_FILE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcArcfourFileWrite16 (DKC_ARCFOUR_FILE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcArcfourFileWrite32 (DKC_ARCFOUR_FILE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcArcfourFileWrite64 (DKC_ARCFOUR_FILE *p, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcArcfourFileRead (DKC_ARCFOUR_FILE *p, void *data, size_t size)

## 説明

改竄防止機能付き ファイルシステム

作者:
  d金魚

覚え書き:

  #### ウンチク</h4? http://studiokingyo.fc2web.com/dxlib/kowaza/k4.html#k19 セーブ

-ファイルに保存するすべてのデータをハッシュ関数に食わせる。 -ハッシュ値をいただく。 -ファイルに保存するすべてのデータを暗号化する。 -ハッシュ値を保存 -暗号化したデータを保存

#### ロード

-ファイルに保存した暗号化したデータをメモリ上にロード -メモリ上にロードしたデータを複合化する -複合化したデータをハッシュ関数に食わせる -ハッシュ値をいただく。 -ファイルに保存してあるハッシュ値とさっき取得したハッシュ値をくらべる。 （ここでハッシュ値が違う場合は、セーブデータが改竄されていると判断できる。）

#### ファイル構造

- ヘッダ部（場合によっては暗号化されていたりしていなかったり･･･）
  - ユーザー独自のシグネチャ
  - データ部のサイズ
  - ハッシュ値
- データ部（場合によっては暗号化していたりしていなかったり･･･) -データ

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

## 型定義

typedef struct dkc_Arcfour_File DKC_ARCFOUR_FILE

typedef struct dkc_FileHeader_FileWithSignature DKC_FILE_HEADER_FILE_WITH_SIGNATURE

typedef struct dkc_FileWithSignature DKC_FILE_WITH_SIGNATURE

## 関数

DKC_EXTERN int WINAPI dkcArcfourFileRead | ( | DKC_ARCFOUR_FILE * | p,
|  | void * | data,
|  | size_t | size
| ) |

DKC_EXTERN int WINAPI dkcArcfourFileWrite | ( | DKC_ARCFOUR_FILE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

DKC_EXTERN int WINAPI dkcArcfourFileWrite16 | ( | DKC_ARCFOUR_FILE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

DKC_EXTERN int WINAPI dkcArcfourFileWrite32 | ( | DKC_ARCFOUR_FILE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

DKC_EXTERN int WINAPI dkcArcfourFileWrite64 | ( | DKC_ARCFOUR_FILE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

DKC_EXTERN int dkcCloseArcfourFile | ( | DKC_ARCFOUR_FILE ** |  | ) |

DKC_EXTERN int WINAPI dkcCloseFileWithSignature | ( | DKC_FILE_WITH_SIGNATURE ** |  | ) |

| dkcSafeFileSystem.c の 285 行で定義されています。 参照先 dkcFree(), dkcFreeBuffer(), dkcFreeSHA1(), dkcFreeStream(), dkcStreamSeek(), dkcStreamTell(), edkcStreamSeekSet, dkc_FileHeader_FileWithSignature::filesize, FileWithSignatureGetDigest(), HeaderWrite(), dkc_FileWithSignature::mDustbin, dkc_FileWithSignature::mFileHeader, dkc_FileWithSignature::mSHA1, dkc_FileWithSignature::mStream, dkc_FileWithSignature::mWriteMode, NULL, と ULONGLONG.
    00285                                                                  {
    00286     DKC_FILE_WITH_SIGNATURE *ptr;
    00287     //BYTE buff[SHA1_BUFFER_SIZE];
    00288
    00289     //size_t offset = SM_OFFSET(DKC_FILE_HEADER_FILE_WITH_SIGNATURE,hash_value);
    00290
    00291     if(NULL==p){
    00292         return edk_FAILED;
    00293     }
    00294
    00295     ptr = *p;
    00296
    00297     if(ptr->mWriteMode)
    00298     {//書き込みモード時のみ
    00299
    00300         //メッセージダイジェストを取得
    00301         //FileWithSignatureGetDigest(ptr,buff,sizeof(buff));
    00302         FileWithSignatureGetDigest(ptr);
    00303         //ファイルサイズ取得
    00304         ptr->mFileHeader.filesize = (ULONGLONG)dkcStreamTell(ptr->mStream);
    00305         //ptr->mFileHeader.datasize = ptr->mFileHeader.filesize - sizeof(DKC_FILE_HEADER_FILE_WITH_SIGNATURE);
    00306
    00307         //メッセージダイジェスト領域の位置を取得
    00308         dkcStreamSeek(ptr->mStream,0,edkcStreamSeekSet);
    00309         //メッセージダイジェストを書き込む
    00310         //dkcStreamWrite(ptr->mStream,buff,sizeof(buff));
    00311         HeaderWrite(ptr->mStream,&(ptr->mFileHeader));
    00312     }
    00313     dkcFreeBuffer(&(ptr->mDustbin));
    00314
    00315     dkcFreeStream(&(ptr->mStream));
    00316
    00317     dkcFreeSHA1(&(ptr->mSHA1));
    00318
    00319     return dkcFree((void **)p);
    00320 }

DKC_EXTERN int WINAPI dkcFileWithSignatureCheckCheat | ( | DKC_FILE_WITH_SIGNATURE * | p | ) |

| 戻り値: edk_SUCCEEDED以外はチートされている。edk_LogicErrorなら呼び出し時が間違っている。 詳しくはdkcOpenFileWithSignature()にて。 覚え書き: dkcFileWithSignatureRead()でedk_EndProcessが返ってきたらこれを呼び出してチートされているかどうか確かめてください。 dkcSafeFileSystem.c の 510 行で定義されています。 参照先 BYTE, dkc_memcmp(), dkcBufferPointer(), dkcBufferSize(), dkcSHA1FinalDigest(), dkcSHA1Load(), dkcStreamTell(), FALSE, dkc_FileHeader_FileWithSignature::filesize, dkc_FileHeader_FileWithSignature::hash_value, dkc_FileWithSignature::mAllLoad, dkc_FileWithSignature::mDustbin, dkc_FileWithSignature::mFileHeader, dkc_FileWithSignature::mSHA1, dkc_FileWithSignature::mStream, dkc_FileWithSignature::mWriteMode, SHA1_BIN_BUFFER_SIZE, TRUE, と ULONGLONG.
    00510                                                                      {
    00511     ULONGLONG filesize = p->mFileHeader.filesize;
    00512     ULONGLONG stream_size = dkcStreamTell(p->mStream);
    00513     BYTE buff[SHA1_BIN_BUFFER_SIZE];
    00514     int r;
    00515
    00516     if(FALSE==p->mAllLoad){//すべて読み込んでいない。
    00517         return edk_LogicError;
    00518     }
    00519     if(TRUE==p->mWriteMode){//書き込みモード時は使用できない。
    00520         return edk_LogicError;
    00521     }
    00522
    00523     dkcSHA1Load(p->mSHA1,
    00524         dkcBufferPointer(p->mDustbin),
    00525         dkcBufferSize(p->mDustbin)
    00526     );
    00527
    00528     //メッセージダイジェストが欲しい。（二回呼び出されてもOK）
    00529     dkcSHA1FinalDigest(p->mSHA1,buff,sizeof(buff));
    00530
    00531     r = dkc_memcmp(
    00532         buff,sizeof(buff),
    00533         p->mFileHeader.hash_value,sizeof(p->mFileHeader.hash_value));
    00534
    00535     if(DKUTIL_FAILED(r)){//違うみたい〜〜。
    00536         return edk_SignatureException;
    00537     }
    00538
    00539     if(filesize < stream_size){//サイズが違う〜〜。へんなもの引っ付いている〜〜。
    00540         return edk_FileCheated_Addition;
    00541     }
    00542     if(filesize == stream_size){
    00543         return edk_SUCCEEDED;
    00544     }
    00545     //誰だよ、チートしたのは･･･。
    00546     return edk_FAILED;
    00547
    00548 }

DKC_EXTERN int WINAPI dkcFileWithSignatureCheckCheatFile | ( | const char * | filename | ) |

DKC_EXTERN void WINAPI dkcFileWithSignatureFinal | ( | DKC_FILE_WITH_SIGNATURE * | p | ) |

| SHAの最終処理をする 覚え書き: 別にこれを呼び出さなくてもdkcCloseFIleWithSignature()が行ってくれる

DKC_EXTERN int WINAPI dkcFileWithSignatureRead | ( | DKC_FILE_WITH_SIGNATURE * | p,
|  | void * | data,
|  | size_t | size,
|  | size_t * | readsize
| ) |

| 戻り値: すべて読み終わると edk_EndProcessを返します。それ以外は指定した初期化フラグに依存します。 覚え書き: エンディアンの考慮はありません。 dkcSafeFileSystem.c の 417 行で定義されています。 参照先 dkcStreamTell(), dkc_FileHeader_FileWithSignature::filesize, FileWithSignatureReadLogic(), dkc_FileWithSignature::mAllLoad, dkc_FileWithSignature::mFileHeader, dkc_FileWithSignature::mStream, dkc_FileWithSignature::mWriteMode, ReadEOFCheck(), TRUE, と ULONGLONG.
    00418                                                                                                                 {
    00419     size_t tsize;
    00420     ULONGLONG filesize = p->mFileHeader.filesize;
    00421     ULONGLONG stream_size = dkcStreamTell(p->mStream);
    00422     int r = edk_FAILED;
    00423
    00424     if(readsize){
    00425         //とりあえず、明示的にまだ読み込んでいない事を告げる。
    00426         *readsize = 0;
    00427     }
    00428
    00429     if(p->mWriteMode){//書き込みモードじゃねぇかよ。
    00430         return edk_LogicError;
    00431     }
    00432
    00433     if(filesize == stream_size || TRUE==p->mAllLoad)
    00434     {
    00435         p->mAllLoad = TRUE;
    00436         return edk_EndProcess;
    00437     }
    00438     //ファイルに冗長なモノが引っ付いている。
    00439     if(filesize < stream_size){
    00440         p->mAllLoad = TRUE;
    00441         return edk_FileCheated_Addition;
    00442     }
    00443     //読み取りサイズをフィルターする
    00444     if(stream_size + size > filesize){
    00445         tsize = (size_t)(ULONGLONG)(filesize - stream_size);
    00446     }else{
    00447         tsize = size;
    00448     }
    00449
    00450     r = FileWithSignatureReadLogic(
    00451         p,data,tsize,readsize);
    00452
    00453
    00454     if(DKUTIL_FAILED(r)){
    00455         return r;
    00456     }
    00457
    00458     return ReadEOFCheck(p);
    00459     //return dkcStreamRead(p->mStream,data,tsize,readsize);
    00460 }

DKC_EXTERN int WINAPI dkcFileWithSignatureWrite | ( | DKC_FILE_WITH_SIGNATURE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

| dkcSafeFileSystem.c の 463 行で定義されています。 参照先 FileWithSigCallBackSend::callback, dkcStreamProcess(), dkcStreamWrite(), dkc_FileWithSignature::mStream, FileWithSigCallBackSend::psig, FileWithSigCallBackSend::readsize, と WriteCallback().
    00465 {
    00466     FWS_CALLBACK_SEND send;
    00467     send.callback = dkcStreamWrite;
    00468     send.psig = p;
    00469     send.readsize = 0;
    00470     return dkcStreamProcess(p->mStream,(void *)data,size,WriteCallback,&send);
    00471     //return FileWithSignatureWriteLogic(p,data,size,dkcStreamWrite);
    00472
    00473 }

DKC_EXTERN int WINAPI dkcFileWithSignatureWrite16 | ( | DKC_FILE_WITH_SIGNATURE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

| dkcSafeFileSystem.c の 475 行で定義されています。 参照先 FileWithSigCallBackSend::callback, dkcStreamProcess(), dkcStreamWrite16(), dkc_FileWithSignature::mStream, FileWithSigCallBackSend::psig, FileWithSigCallBackSend::readsize, と WriteCallback().
    00477 {
    00478     FWS_CALLBACK_SEND send;
    00479     send.callback = dkcStreamWrite16;
    00480     send.psig = p;
    00481     send.readsize = 0;
    00482     return dkcStreamProcess(p->mStream,(void *)data,size,WriteCallback,&send);
    00483     //return FileWithSignatureWriteLogic(p,data,size,dkcStreamWrite16);
    00484 }

DKC_EXTERN int WINAPI dkcFileWithSignatureWrite32 | ( | DKC_FILE_WITH_SIGNATURE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

| dkcSafeFileSystem.c の 488 行で定義されています。 参照先 FileWithSigCallBackSend::callback, dkcStreamProcess(), dkcStreamWrite32(), dkc_FileWithSignature::mStream, FileWithSigCallBackSend::psig, FileWithSigCallBackSend::readsize, と WriteCallback().
    00490 {
    00491     FWS_CALLBACK_SEND send;
    00492     send.callback = dkcStreamWrite32;
    00493     send.psig = p;
    00494     send.readsize = 0;
    00495     return dkcStreamProcess(p->mStream,(void *)data,size,WriteCallback,&send);
    00496     //return FileWithSignatureWriteLogic(p,data,size,dkcStreamWrite32);
    00497 }

DKC_EXTERN int WINAPI dkcFileWithSignatureWrite64 | ( | DKC_FILE_WITH_SIGNATURE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

| dkcSafeFileSystem.c の 499 行で定義されています。 参照先 FileWithSigCallBackSend::callback, dkcStreamProcess(), dkcStreamWrite64(), dkc_FileWithSignature::mStream, FileWithSigCallBackSend::psig, FileWithSigCallBackSend::readsize, と WriteCallback().
    00501 {
    00502     FWS_CALLBACK_SEND send;
    00503     send.callback = dkcStreamWrite64;
    00504     send.psig = p;
    00505     send.readsize = 0;
    00506     return dkcStreamProcess(p->mStream,(void *)data,size,WriteCallback,&send);
    00507     //return FileWithSignatureWriteLogic(p,data,size,dkcStreamWrite64);
    00508 }

DKC_EXTERN DKC_ARCFOUR_FILE* dkcOpenArcfourFile | ( | UINT | stream_flag,
|  | size_t | stream_size,
|  | const char * | filename,
|  | const char * | mode,
|  | const void * | dustbin,
|  | size_t | dustbin_size,
|  | const void * | arcfour_key,
|  | size_t | arcfour_size,
|  | UINT | signature,
|  | BOOL * | IsCheated
| ) |

  | 参照: 引数のほとんどはdkcOpenFileWithSignature()と同じ。 引数:
  | arcfour_key[in] | arcfourに使うキー
  | arcfour_size[in] | arcfour_keyのサイズ
戻り値: DKC_ARCFOUR_FILE への領域へのポインタ

DKC_EXTERN DKC_FILE_WITH_SIGNATURE* WINAPI dkcOpenFileWithSignature | ( | UINT | stream_flag,
|  | const char * | filename,
|  | const char * | mode,
|  | const void * | dustbin,
|  | size_t | dustbin_size,
|  | UINT | signature
| ) |

  | 引数:
  | stream_flag[in] | dkcAllocStream()に使われるflag edkcStreamInitMemoryは使えません。
  | stream_size[in] | dkcAllocStream()に使われるsize
  | filename[in] | ファイル名
  | mode[in] | ファイルオープンモード (aを指定するとエラーとして処理を返します。rかwを指定してください。）
  | dustbin[in] | ゴミデータ
  | dustbin_size[in] | ゴミデータのサイズ
  | signature[in] | 自分が識別するファイルのシグネチャ。このread open時 最初のシグネチャが違うとエラーとなる。
  | CheckCheat[out] | リード Open時にシグネチャをチェックしない時はNULL、 チェックするときはint型変数へのポインタを入れる。 受け取ったポインタ先がedk_SUCCEEDED 以外だったらチートされていた。 edk_FileSignatureException:ファイルの内容自体を変化させられた。 edk_FileCheated_Addition:ファイルの内容に問題は無いが、冗長なデータが引っ付いている。
戻り値: DKC_FILE_WITH_SIGNATUREへのポインタ dkcSafeFileSystem.c の 113 行で定義されています。 参照先 BYTE, dkcAllocate(), dkcAllocBuffer(), dkcAllocSHA1(), dkcAllocStreamFileType(), dkcFree(), dkcFreeSHA1(), dkcFreeStream(), dkcIsLittleEndian(), dkcSHA1Load(), dkcStreamSeek(), dkcStreamWrite(), edkcStreamBigEndian, edkcStreamInitFile, edkcStreamInitMemory, edkcStreamLittleEndian, edkcStreamProcessAsOrdered, edkcStreamProcessDefault, edkcStreamSeekSet, FALSE, GetHeader(), dkc_FileHeader_FileWithSignature::little_endian, dkc_Stream::mChangeEndian, dkc_FileWithSignature::mDustbin, dkc_FileWithSignature::mFileHeader, dkc_FileWithSignature::mSHA1, dkc_FileWithSignature::mStream, dkc_FileWithSignature::mWriteMode, NULL, dkc_FileHeader_FileWithSignature::sig, と TRUE.
    00124 {
    00125     DKC_STREAM *sp = NULL;
    00126     void *tp = NULL;
    00127     DKC_BUFFER *mbp = NULL;
    00128     DKC_FILE_WITH_SIGNATURE *p = NULL;
    00129
    00130     DKC_FILE_HEADER_FILE_WITH_SIGNATURE header;
    00131
    00132     BOOL isWrite = FALSE;
    00133     BYTE isLE = (BYTE)dkcIsLittleEndian();
    00134
    00135     //UINT stream_flag = edkcStreamInitFile;
    00136
    00137     //フラグの変更
    00138     stream_flag |= edkcStreamInitFile;
    00139
    00140     DKUTIL_FLAG_DOWN(stream_flag,edkcStreamInitMemory);
    00141
    00142     DKUTIL_FLAG_DOWN(stream_flag,edkcStreamProcessDefault);
    00143
    00144     DKUTIL_FLAG_UP(stream_flag,edkcStreamProcessAsOrdered);
    00145
    00146     //size_t stream_size;
    00147
    00148
    00149     //エラーチェック
    00150     if(NULL==dustbin ||  0 == dustbin_size){
    00151         return NULL;
    00152     }
    00153
    00154     if(NULL==mode || NULL==filename){
    00155         return NULL;
    00156     }
    00157     if(NULL != strchr(mode,'a')){//共通モードでは開けない
    00158         return NULL;
    00159     }
    00160     if(NULL != strchr(mode,'t')){//テキストモードでは開けない。
    00161         return NULL;
    00162     }
    00163
    00164
    00165     //領域取得
    00166
    00167     p = (DKC_FILE_WITH_SIGNATURE *)dkcAllocate(sizeof(DKC_FILE_WITH_SIGNATURE));
    00168     if(NULL==p){
    00169         return NULL;
    00170     }
    00171     tp = (DKC_SHA1 *)dkcAllocSHA1();
    00172     if(NULL==tp){
    00173         goto Error;
    00174     }
    00175
    00176     //ライトモードかどうか。
    00177     isWrite = (NULL==strchr(mode,'r'));
    00178
    00179     if(isWrite){
    00180         //書き込みモードの時
    00181         p->mWriteMode = TRUE;
    00182     }else{
    00183         if(DKUTIL_FAILED(GetHeader(&header,filename))){
    00184             goto Error;
    00185         }
    00186
    00187         if(header.little_endian){
    00188             stream_flag |= edkcStreamLittleEndian;
    00189         }else{
    00190             stream_flag |= edkcStreamBigEndian;
    00191         }
    00192
    00193         p->mWriteMode = FALSE;
    00194         //とりあえず、コピーしておかないと支障が出る。
    00195         memcpy(&(p->mFileHeader),&header,sizeof(header));
    00196     }
    00197
    00198
    00199     sp = dkcAllocStreamFileType( stream_flag,filename,mode);
    00200     if(NULL==sp){
    00201         goto Error;
    00202     }
    00203     //update
    00204     p->mStream = sp;
    00205
    00206     if(isWrite){
    00207         //ヘッダ分を書き込んでおく。
    00208         memset(&header,0,sizeof(header));
    00209         dkcStreamWrite(sp,&header,sizeof(header));
    00210
    00211
    00212         //ヘッダの設定
    00213
    00214         //エンディアン設定
    00215         if(isLE){
    00216             if(FALSE==p->mStream->mChangeEndian){
    00217                 p->mFileHeader.little_endian = TRUE;
    00218             }else{
    00219                 p->mFileHeader.little_endian = FALSE;
    00220             }
    00221         }else{
    00222             if(TRUE==p->mStream->mChangeEndian){
    00223                 p->mFileHeader.little_endian = TRUE;
    00224             }else{
    00225                 p->mFileHeader.little_endian = FALSE;
    00226             }
    00227         }
    00228         //シグネチャを設定
    00229         p->mFileHeader.sig = signature;
    00230     }
    00231
    00232     mbp = dkcAllocBuffer(dustbin,dustbin_size);
    00233     if(NULL==mbp){
    00234         goto Error;
    00235     }
    00236
    00237
    00238
    00239     p->mSHA1 = (DKC_SHA1 *)tp;
    00240     p->mDustbin = mbp;
    00241
    00242     //とりあえず、ゴミ値をSHA1にロード
    00243     dkcSHA1Load(p->mSHA1,(const BYTE *)dustbin,dustbin_size);
    00244
    00245     if(isWrite==FALSE){
    00246         //ストリームをデータ部にシーク
    00247         dkcStreamSeek(p->mStream,sizeof(DKC_FILE_HEADER_FILE_WITH_SIGNATURE),edkcStreamSeekSet);
    00248     }
    00249
    00250
    00251     return p;
    00252 Error:
    00253     dkcFreeStream(&sp);
    00254     dkcFreeSHA1((DKC_SHA1 **)&tp);
    00255     dkcFree((void **)&p);
    00256     return NULL;
    00257 }