OpenSSLの実装の読み方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

OpenSSLの実装の読み方

#1

投稿記事 by shiro4ao » 14年前

TCPをラップしての通信を実装するために参考のためにOpenSSLを見てみました。
とりあえず送受信だけに興味があるので、色々しらべ、SSL_write()関数
が送信しているらしいことはつかみました。
そこで、SSL_write()の実装を見てみたのですが、(下記)

コード:

int SSL_write(SSL *s,const void *buf,int num)
	{
	if (s->handshake_func == 0)
		{
		SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
		return -1;
		}

	if (s->shutdown & SSL_SENT_SHUTDOWN)
		{
		s->rwstate=SSL_NOTHING;
		SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
		return(-1);
		}
	return(s->method->ssl_write(s,buf,num));   //ssl_write()関数が実際の送信を担う…??
	}
SSL_write()はどうやらSSL構造体のmethod構造体の
メンバ関数らしいssl_write()関数のラッパになっていたようです。
さらに、ssl_write()関数の実装を見てみたところ(下記)、ssl_write()関数内部で
SSL_write()関数が呼ばれていました。

コード:

static int ssl_write(BIO *b, const char *out, int outl)
	{
	int ret,r=0;
	int retry_reason=0;
	SSL *ssl;
	BIO_SSL *bs;

	if (out == NULL) return(0);
	bs=(BIO_SSL *)b->ptr;
	ssl=bs->ssl;

	BIO_clear_retry_flags(b);

/*	ret=SSL_do_handshake(ssl);
	if (ret > 0) */
	ret=SSL_write(ssl,out,outl);        //ラッパであるはずのSSL_write()を呼んでいる…??

	switch (SSL_get_error(ssl,ret))    //以下はエラー処理か
		{
	case SSL_ERROR_NONE:
		if (ret <= 0) break;
		if (bs->renegotiate_count > 0)
			{
			bs->byte_count+=ret;
			if (bs->byte_count > bs->renegotiate_count)
				{
				bs->byte_count=0;
				bs->num_renegotiates++;
				SSL_renegotiate(ssl);
				r=1;
				}
			}
		if ((bs->renegotiate_timeout > 0) && (!r))
			{
			unsigned long tm;

			tm=(unsigned long)time(NULL);
			if (tm > bs->last_time+bs->renegotiate_timeout)
				{
				bs->last_time=tm;
				bs->num_renegotiates++;
				SSL_renegotiate(ssl);
				}
			}
		break;
	case SSL_ERROR_WANT_WRITE:
		BIO_set_retry_write(b);
		break;
	case SSL_ERROR_WANT_READ:
		BIO_set_retry_read(b);
		break;
	case SSL_ERROR_WANT_X509_LOOKUP:
		BIO_set_retry_special(b);
		retry_reason=BIO_RR_SSL_X509_LOOKUP;
		break;
	case SSL_ERROR_WANT_CONNECT:
		BIO_set_retry_special(b);
		retry_reason=BIO_RR_CONNECT;
	case SSL_ERROR_SYSCALL:
	case SSL_ERROR_SSL:
	default:
		break;
		}

	b->retry_reason=retry_reason;
	return(ret);
	}

ラッパであるはずのSSL_write()を呼んでいるという状況になり、
送信部分の実装にたどり着けなくなってしまいました。


どのように送信しているのか(及び、受信しているのか)知りたいのですが、
分からなくなってしましました。
正しい解釈を教えていただけたら幸いです。

(!)自分のコードではないので掲載していてまずければ、削除いたします。

Poco
記事: 161
登録日時: 15年前

Re: OpenSSLの実装の読み方

#2

投稿記事 by Poco » 14年前

直接の回答じゃなくてアレですが。
そういった場合は、デバッガにかけてステップ実行することをお勧めします。

アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

Re: OpenSSLの実装の読み方

#3

投稿記事 by shiro4ao » 14年前

>ぽこさん
ご回答ありがとうございます。
デバッガですか
ライブラリの解析にも使えるのですね!
なんとか実際の処理の部分を探してみようと思います。
これにて解決とさせていただきます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る