3

私は OpenSSL を使用しており、アプリケーションで GPU を使用して HMAC および AES 暗号化を高速化できるように、セッションから HMAC キーと AES キーを抽出したいと考えています。

後、鍵はどこで入手できますSSL_acceptか? AES キーは に保存されていSSLHandle->enc_write_ctx->cipher_dataますか? HMAC キーはどこに保存されますか?

4

1 に答える 1

0

SSL*と呼ばれるがある場合は、 でマスター キーと現在の hamc キーを探しますsslssl->sessionssl->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_macHMAC キーが何であるかを確認するには、たとえばs3_enc.c700 行目あたりを見てください。次のような内容が表示されます。

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.c445行目あたりから:

mac_secret= &(s->s3->write_mac_secret[0]);
mac_secret_size = &(s->s3->write_mac_secret_size);

またはを使用して、SSL*オブジェクト内のデータをよく見ることもできます。SSL_SESSION_printBIOSSL_SESSION_print_fp

于 2013-11-28T09:05:34.693 に答える