#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) |
-ファイルに保存した暗号化したデータをメモリ上にロード -メモリ上にロードしたデータを複合化する -複合化したデータをハッシュ関数に食わせる -ハッシュ値をいただく。 -ファイルに保存してあるハッシュ値とさっき取得したハッシュ値をくらべる。 (ここでハッシュ値が違う場合は、セーブデータが改竄されていると判断できる。)
dkcSafeFileSystem.h で定義されています。
|
|
|
参照元 dkcOpenFileWithSignature(), GetHeader(), と HeaderWrite(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dkcSafeFileSystem.c の 285 行で定義されています。 参照先 DKC_FILE_WITH_SIGNATURE, dkcFree(), dkcFreeBuffer(), dkcFreeSHA1(), dkcFreeStream(), dkcStreamSeek(), dkcStreamTell(), edk_FAILED, 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 } |
|
|
|
|
SHAの最終処理をする.
|
|
dkcSafeFileSystem.c の 417 行で定義されています。 参照先 DKC_FILE_WITH_SIGNATURE, dkcStreamTell(), DKUTIL_FAILED, edk_EndProcess, edk_FAILED, edk_FileCheated_Addition, edk_LogicError, 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 } |
|
dkcSafeFileSystem.c の 463 行で定義されています。 参照先 FileWithSigCallBackSend::callback, DKC_FILE_WITH_SIGNATURE, dkcStreamProcess(), dkcStreamWrite(), FWS_CALLBACK_SEND, 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 } |
|
dkcSafeFileSystem.c の 475 行で定義されています。 参照先 FileWithSigCallBackSend::callback, DKC_FILE_WITH_SIGNATURE, dkcStreamProcess(), dkcStreamWrite16(), FWS_CALLBACK_SEND, 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 } |
|
dkcSafeFileSystem.c の 488 行で定義されています。 参照先 FileWithSigCallBackSend::callback, DKC_FILE_WITH_SIGNATURE, dkcStreamProcess(), dkcStreamWrite32(), FWS_CALLBACK_SEND, 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 } |
|
dkcSafeFileSystem.c の 499 行で定義されています。 参照先 FileWithSigCallBackSend::callback, DKC_FILE_WITH_SIGNATURE, dkcStreamProcess(), dkcStreamWrite64(), FWS_CALLBACK_SEND, 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 } |
|
|
|
dkcSafeFileSystem.c の 113 行で定義されています。 参照先 BOOL, BYTE, DKC_BUFFER, DKC_FILE_HEADER_FILE_WITH_SIGNATURE, DKC_FILE_WITH_SIGNATURE, DKC_SHA1, DKC_STREAM, dkcAllocate(), dkcAllocBuffer(), dkcAllocSHA1(), dkcAllocStreamFileType(), dkcFree(), dkcFreeSHA1(), dkcFreeStream(), dkcIsLittleEndian(), dkcSHA1Load(), dkcStreamSeek(), dkcStreamWrite(), DKUTIL_FAILED, DKUTIL_FLAG_DOWN, DKUTIL_FLAG_UP, 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 } |