豚吐露@wiki

Chiper

最終更新:

ohden

- view
管理者のみ編集可

OpenSSHの暗号化I/F

cipher.cを利用しての暗号化・復号化を理解するためには...
『openssh-5.3p1/packet.c』の『CipherContext receive_context』『CipherContext send_context』を追うと良い感じな気がする。
send_context←暗号化
receive_context←復号化


■include
cipher.h

■cipher.c 関数一覧
u_int cipher_blocksize(const Cipher* c)
u_int cipher_keylen(const Cipher* c)
u_int cipher_get_number(const Cipher* c)
u_int cipher_is_cbc(const Cipher* c)
u_int cipher_mask_ssh1(int client)
Cipher* cipher_by_name(const char* name)
暗号化情報一覧から名前を頼りに暗号化情報を取得する
■引数
const char*	name	(i/ )暗号化情報毎に振られた名称
■戻り値
Cipher*	暗号化情報

Cipher* cipher_by_number(int id)
暗号化情報一覧からnumberを頼りにSSH1の暗号化情報を取得する
※numberはSSH1のみ有効
■引数
int	id	(i/ )暗号化情報毎に割り振られた値
■戻り値
Cipher*	暗号化情報

int ciphers_valid(const char* names)
引数に指定した名前が妥当なものかcheckする
■引数
const char*	names	(i/ )暗号化情報毎に振られた名称
■戻り値
int	0:NG 1:OK

int cipher_number(const char* name)
char* cipher_name(int id)

void cipher_init(CipherContext* cc, Cipher* cipher, const u_char* key, u_int keylen, const u_char* iv, u_int ivlen, int do_encrypt)
CipherContext初期化関数
■引数
CipherContext*	cc			(i/o)暗号化条件
Cipher*		cipher			(i/ )暗号化モードオブジェクトの指定
const u_char*	key			(i/ )鍵
u_int			keylen		(i/ )鍵の長さ
const u_char*	iv			(i/ )IV
u_int			ivlen			(i/ )IVの長さ
int			do_encrypt		(i/ )CIPHER_ENCRYPT(1):暗号化モード, CIPHER_DECRYPT(0):復号化モードのどちらかを指定
■戻り値
無し

void cipher_crypt(CipherContext* cc, u_char* dest, const u_char* src, u_int len)
暗号化/復号化実行関数
CipherContext内に設定された情報に基づいてsrcを暗号化する。暗号化結果はdestへ出力される。
■引数
CipherContext*	cc		(i/ )暗号化条件
u_char*		dest		( /o)暗号化出力
const u_char*	src		(i/ )暗号化source
u_int			len		(i/ )暗号化source長
■戻り値
無し

void cipher_cleanup(CipherContext* cc)
処理終了時にcall。CipherContextを解放する。
■引数
CipherContext*	cc		(i/o)暗号化条件
■戻り値
無し

void cipher_set_key_string(CipherContext* cc, Cipher* cipher, const char* passphrase, int do_encrypt)
int cipher_get_keyiv_len(const CipherContext* cc)
void cipher_get_keyiv(CipherContext* cc, u_char* iv, u_int len)
void cipher_set_keyiv(CipherContext* cc, u_char* iv)
int cipher_get_keycontext(const CipherContext* cc, u_char* dat)
void cipher_set_keycontext(CipherContext* cc, u_char* dat)

■cipher-aes.c 関数一覧
cipher-aes.cは冒頭の『USE_BUILTIN_RIJNDAEL』で制御されている。
簡単に言うと『USE_BUILTIN_RIJNDAEL』が定義されてないと中身は無くなる。
で、『openbsd-compat/openssl-compat.h』には
#if (OPENSSL_VERSION_NUMBER < 0x00907000L) || defined(OPENSSL_LOBOTOMISED_AES)
# define USE_BUILTIN_RIJNDAEL
#endif
なんて定義があるので注意。まぁmakefile次第ってことだ。

static int ssh_rijndael_init(EVP_CIPHER_CTX* ctx, const u_char* key, const u_char* iv, int enc)
static int ssh_rijndael_cbc(EVP_CIPHER_CTX* ctx, u_char* dest, const u_char* src, u_int len)
static int ssh_rijndael_cleanup(EVP_CIPHER_CTX* ctx)
void ssh_rijndael_iv(EVP_CIPHER_CTX* evp, int doset, u_char* iv, u_int len)
const EVP_CIPHER* evp_rijndael(void)




更新日: 2010年03月12日 (金) 10時56分33秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー