私は OpenSSL を使用しており、アプリケーションで GPU を使用して HMAC および AES 暗号化を高速化できるように、セッションから HMAC キーと AES キーを抽出したいと考えています。
後、鍵はどこで入手できますSSL_accept
か? AES キーは に保存されていSSLHandle->enc_write_ctx->cipher_data
ますか? HMAC キーはどこに保存されますか?
SSL*
と呼ばれるがある場合は、 でマスター キーと現在の hamc キーを探しますssl
。ssl->session
ssl->s3
ssl.h
がありstruct ssl_session_st
、それがssl->session
上記です。マスター キーは に格納されstruct ssl_session_st
ます。
struct ssl_session_st
{
int ssl_version; /* what ssl version session info is
* being kept in here? */
/* only really used in SSLv2 */
unsigned int key_arg_length;
unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH];
int master_key_length;
unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
...
}
いくつかの派生が続いており、たとえばs3_clnt.c
. SSL2 は 2 つのセッション キーを使用します。各方向 (クライアントからサーバー、およびサーバーからクライアント) に 1 つずつです。キーは、プライバシーと完全性保護の両方に使用されます。SSLv3 以降では、各方向 (クライアントからサーバー、およびサーバーからクライアント) に 3 つずつ、計 6 つのキーを使用します。1 つのキーはプライバシーに使用され、2 つ目は完全性に使用され、3 つ目は nonce または iv として使用されます。
n_ssl3_mac
HMAC キーが何であるかを確認するには、たとえばs3_enc.c
700 行目あたりを見てください。次のような内容が表示されます。
int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
{
SSL3_RECORD *rec;
unsigned char *mac_sec,*seq;
EVP_MD_CTX md_ctx;
...
if (send)
{
rec= &(ssl->s3->wrec);
mac_sec= &(ssl->s3->write_mac_secret[0]);
seq= &(ssl->s3->write_sequence[0]);
hash=ssl->write_hash;
}
else
{
rec= &(ssl->s3->rrec);
mac_sec= &(ssl->s3->read_mac_secret[0]);
seq= &(ssl->s3->read_sequence[0]);
hash=ssl->read_hash;
}
...
TLS もssl->s3
メンバーを使用します。たとえば、t1_enc.c
445行目あたりから:
mac_secret= &(s->s3->write_mac_secret[0]);
mac_secret_size = &(s->s3->write_mac_secret_size);
またはを使用して、SSL*
オブジェクト内のデータをよく見ることもできます。SSL_SESSION_print
BIO
SSL_SESSION_print_fp