/*	
 *	clipdes.h
 *
 *	DES暗号化、復号化
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2007 Naoyuki Sawa
 *
 *	* Sat Feb 17 01:51:50 JST 2007 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sat Feb 17 22:50:41 JST 2007 Naoyuki Sawa
 *	- パディング方法を、NUL padding→PKCS#5 paddingに変更しました。
 *	  この変更により、復号化後の平文に余計なNULパディングが付かず、
 *	  正しく元のサイズに復元されるようになりました。
 *	* Sun Feb 18 12:16:59 JST 2007 Naoyuki Sawa
 *	- これまでのDES(ECB)に加えて、DES(CBC)にも対応しました。
 */
#ifndef __CLIP_DES_H__
#define __CLIP_DES_H__

/****************************************************************************
 *	
 ****************************************************************************/

/* DES(ECB)暗号化を行います。
 * [in]
 *	dst		暗号文。(出力)
 *	dst_cap		dst[]の許容量。
 *	src		平文。(入力)
 *	src_len		src[]のバイト数。
 *	key		64ビット鍵。
 * [out]
 *	戻り値		暗号文の文字数。
 *			平文が8バイトの倍数でない場合は、8バイトの倍数に切り上げたサイズになります。
 *			平文が8バイトの倍数の場合は、8バイト追加したサイズになります。
 *			平文が0バイトの場合も同様に、8バイト追加したサイズになります。
 *			dst[]の許容量が充分でない場合は、アサートします。
 * [note]
 *	* dst[]とsrc[]に、同じバッファを指定することもできます。(エリアスセーフ)
 *	  平文を暗号化して、同じバッファ上に、暗号文で上書きすることができます。
 *	* 64ビット鍵の各バイトの最下位ビットは使われず、実質、56ビット鍵です。
 *	  ASCII文字などを鍵とすると、最下位ビットが使われず、弱い鍵になります。
 *	  必要に応じてdes_64bit_key()を使い、適切な64ビット鍵を生成してください。
 *	  詳しくは、des_64bit_key(),des_set_key()のコメントを参照してください。
 */
int des_ecb_encrypt(
	      void* dst/*[dst_cap]*/, int dst_cap,
	const void* src/*[src_len]*/, int src_len,
	const unsigned char key[/*8*/]);

/* DES(ECB)復号化を行います。
 * [in]
 *	dst		平文。(出力)
 *	dst_cap		dst[]の許容量。
 *	src		暗号文。(入力)
 *	src_len		src[]のバイト数。
 *	key		64ビット鍵。
 * [out]
 *	戻り値		平文の文字数。
 *			(暗号文の文字数-8)〜(暗号文の文字数-1)バイトのサイズになります。
 *			dst[]の許容量が充分でない場合は、アサートします。
 * [note]
 *	* dst[]とsrc[]に、同じバッファを指定することもできます。(エリアスセーフ)
 *	  暗号文を復号化して、同じバッファ上に、平文で上書きすることができます。
 *	* 64ビット鍵の各バイトの最下位ビットは使われず、実質、56ビット鍵です。
 *	  ASCII文字などを鍵とすると、最下位ビットが使われず、弱い鍵になります。
 *	  必要に応じてdes_64bit_key()を使い、適切な64ビット鍵を生成してください。
 *	  詳しくは、des_64bit_key(),des_set_key()のコメントを参照してください。
 */
int des_ecb_decrypt(
	      void* dst/*[dst_cap]*/, int dst_cap,
	const void* src/*[src_len]*/, int src_len,
	const unsigned char key[/*8*/]);

/* DES(CBC)暗号化を行います。
 * [note]
 *	* 関数仕様はdes_ecb_encrypt()と同じです。
 *	  des_ecb_encrypt()のコメントを参照してください。
 */
int des_cbc_encrypt(
	      void* dst/*[dst_cap]*/, int dst_cap,
	const void* src/*[src_len]*/, int src_len,
	const unsigned char key[/*8*/]);

/* DES(CBC)復号化を行います。
 * [note]
 *	* 関数仕様はdes_ecb_decrypt()と同じです。
 *	  des_ecb_decrypt()のコメントを参照してください。
 */
int des_cbc_decrypt(
	      void* dst/*[dst_cap]*/, int dst_cap,
	const void* src/*[src_len]*/, int src_len,
	const unsigned char key[/*8*/]);

/* 56ビット以下の鍵に奇数パリティビットを付加し、DES 64ビット鍵を作成します。
 * [in]
 *	key		7バイト(56ビット)以下の鍵。
 *			7バイト未満の場合、7バイトまでnulを補ったものと見なします。
 *			7バイト超過の場合、7バイト超過分は使いません。
 *	len		keyのバイト数。
 * [out]
 *	戻り値		DES 64ビット鍵。
 *			戻り値は、本関数の内部バッファを指しています。
 *			再度、本関数を呼び出すと、内容は変更されます。
 * [note]
 *	* 本モジュールの関数は、DES 64ビット鍵のパリティビットを検査せず単に無視します。
 *	  従って、正確な奇数パリティでなく不定値のダミービットの付加でも充分なのですが、
 *	  一応、DES 64ビット鍵仕様にそって、正しい奇数パリティを付加することにしました。
 */
const unsigned char* des_64bit_key(const void* key, int len);

#endif /*__CLIP_DES_H__*/
