/**
<h1>d金魚アーカイブ形式概要</h1>

@section 仕様

-リトルエンディアン
-ファイル転送を考慮にいれる。（間にCRCとかMD5とかSHAが入っている奴）
-暗号化も出来る。暗号化は512byte単位で行うようにする。
-暗号化は各自に任せる（DLL?）
- SHA512を使う
- 無線通信でぐしゃぐしゃになっても復号化できるような符号もサポート

@section ファイル構造

<ul>
<li>dKingyoArchiveHeader
詳しくは構造体部を参照。
 <ul>
 <li>dKingyoArchiveListInfo
 </ul>
<li>dKingyoArchiveListElementがヘッダで指定された数分（暗号化されている場合あり）
データ部の先頭から何バイト目が自分の欲しいデータかを入れておく。
<li>データ部
データ部
</ul>
@note
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/security/CryptoSpec.html
でも参考にする。

*/

#ifndef DKINGYO_ARCHIVE_HEADER_H
#define DKINGYO_ARCHIVE_HEADER_H

#include <dkutil_c/dkc.h>
///このファイルのシグネチャ値
#define DKINGYO_ARCHIVE_HEADER_DEFAULT_SIGNATURE 'dkac'

///DKINGYO_ARCHIVE_HEADERのバージョン値
#define DKINGYO_ARCHIVE_HEADER_VERSION		0x00010000
///DKINGYO_ARCHIVE_LIST_INFOのバージョン値
#define DKINGYO_ARCHIVE_LIST_INFO_VERSION 0x00010000

//DKINGYO_ARCHIVE_DATA_INFOのバージョン値
//#define DKINGYO_ARCHIVE_DATA_INFO_VERSION 0x00010000




enum edka_HeaderFlag{
	edkaHF_SimpleArchive = 0,
	edkaHF_After

};


struct dKingyoArchiveSHA1PackedHeader{
	uint8 sig[SHA1_BIN_BUFFER_SIZE];
	///max 512 - SHA1_BIN_BUFFER_SIZE - sizeof(uint16)
	uint16 length;
};


/**
@memo
1秒で64KB稼げるとしてSHA512の計算を20秒毎にするとすると1280000byteがよろしいかな？
*/
struct dKingyoArchiveSHA512PackedHeader{
	uint8 sig[SHA1_BIN_BUFFER_SIZE];
	///max 1280000 - SHA512_BIN_BUFFER_SIZE - sizeof(uint32)
	uint32 length;
};

enum edka_ProcessCommonFlag{
	edkaALCF_Plane = 0,
	edkaALCF_LZSS = 1,
	edkaALCF_LZW = 2,
	edkaALCF_ARC4 = 4,
	edkaALCF_RIJNDEAL = 8,
	edkaALCF_BLOCKSORTED_RLE = 16,
	edkaALCF_BLOWFISH = 32,
	edkaALCF_HC256 = 64,
	edkaALCF_SNOW20 = 128,
	
	///SHA1で署名済みのデータで512バイトの列を沢山出力する。
	edkaALCF_SHA1_PACKED512 = 0x10000,
	///SHA512で署名済みのデータを一回出力して
	edkaALCF_SHA512_PACKED = 0x20000,
};

typedef struct dKingyoArchiveListInfo{
	///バージョン
	uint32 a_version;
	///アーカイブファイルリストのをすべて復号した時のSHA512値
	uint8 b_sha512[SHA512_BIN_BUFFER_SIZE];
	///登録されている要素のすべての数
	uint64 c_all_num;
	///リスト部のサイズ（バイト単位）
	uint64 d_size;
	///共通フラグ enum edka_ArchiveListInfoCommonFlagを参照
	uint64 e_common_flags;
	///キーサイズ キーのサイズ
	uint32 f_key_size;
	/*
	///ユーザーデータ 1024byte分
	struct{
		uint8 data[1024];
	}g_user_data;
	*/
}DKINGYO_ARCHIVE_LIST_INFO;

///@warning この構造体をそのまま保存してはいけない
typedef struct dKingyoArchiveListElement{
	///各自が付けるシグネチャ。暗号モード等を入れる。
	uint32 a_sig;
	///キーのサイズ
	uint32 b_keysize;
	///キー
	union{
		uint8 *pkey;
		uint32 ikey;
	}c_key;
	///データ部のサイズ
	uint64 d_size;
	///ファイルの先頭からデータ部までのオフセット（edkcStreamSeekSetでc_offsetを入れる）
	uint64 e_offset;
	///データ部すべてを復号した時のSHA512値
	uint8 f_sha512[SHA512_BIN_BUFFER_SIZE];
}DKINGYO_ARCHIVE_LIST_ELEMENT;

typedef struct dKingyoArchiveDataInfo{
	///各自が付けるシグネチャ。暗号モード等を入れる。
	uint32 a_sig;
	///データ部のサイズ
	uint64 b_size;
	///ファイルの先頭からデータ部までのオフセット
	uint64 c_offset;
	///データ部すべてを復号した時のSHA512値
	uint8 d_sha512[SHA512_BIN_BUFFER_SIZE];
}DKINGYO_ARCHIVE_DATA_INFO;

typedef struct dKingyoArchiveHeader{
	///シグネチャ 'dkac'でdKingyoArchive形式
	uint32 a_sig;
	///バージョン
	uint32 b_version;
	///ファイルサイズ
	uint64 c_filesize;
	///内部のフラグ
	uint64 d_flag;
	///アーカイブリストの情報
	DKINGYO_ARCHIVE_LIST_INFO e_list_info;

	//DKINGYO_ARCHIVE_DATA_INFO *e_pdata_info;
}DKINGYO_ARCHIVE_HEADER;





#endif

