如何在OpenSSL中获取HMAC密钥

时间:2013-01-04 02:04:41

标签: openssl aes sha1 hmac

我正在使用OpenSSL,我想从会话中提取我的HMAC密钥和AES密钥,以便我可以在应用程序中使用GPU加速HMAC和AES加密。

SSL_accept之后我在哪里可以获得密钥? AES密钥是否存储在SSLHandle->enc_write_ctx->cipher_data中? HMAC密钥存储在哪里?

1 个答案:

答案 0 :(得分:0)

如果SSL*名为ssl,请查看ssl->session以获取主密钥,ssl->s3查看当前的hamc密钥。

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使用两个会话密钥 - 每个方向一个(客户端到服务器;服务器到客户端)。密钥用于隐私和完整性保护。 SSLv3及更高版本使用6个密钥 - 每个方向三个(客户端到服务器;服务器到客户端)。一个密钥用于隐私,第二个用于完整性,第三个用作nonce或iv。

要查看HMAC密钥的内容,请查看第700行附近的n_ssl3_mac中的s3_enc.c。您会看到以下内容:

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成员。例如,从第445行的t1_enc.c开始:

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

您也可以使用SSL*SSL_SESSION_print BIOSSL_SESSION_print_fp {{1}}对象中的数据。