如何在OpenSSL中获取HMAC密钥

如何在OpenSSL中获取HMAC密钥,openssl,aes,sha1,hmac,Openssl,Aes,Sha1,Hmac,我正在使用OpenSSL,我想从会话中提取HMAC密钥和AES密钥,以便在应用程序中使用GPU加速HMAC和AES加密 在SSL\u accept之后,在哪里可以获取密钥? AES密钥是否存储在SSLHandle->enc\u write\u ctx->cipher\u data中? HMAC密钥存储在哪里?如果您有名为SSL的SSL*,请查看主密钥的SSL->session,查看当前hamc密钥的SSL->s3 ssl.h有一个struct ssl\u session st,这就是上面的ssl

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

SSL\u accept
之后,在哪里可以获取密钥? AES密钥是否存储在
SSLHandle->enc\u write\u ctx->cipher\u data
中?
HMAC密钥存储在哪里?

如果您有名为
SSL
SSL*
,请查看主密钥的
SSL->session
,查看当前hamc密钥的
SSL->s3

ssl.h
有一个
struct ssl\u session st
,这就是上面的
ssl->session
。主密钥存储在
struct ssl\u session\u 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\u clnt.c
。SSL2使用两个会话密钥-每个方向一个(客户端到服务器;服务器到客户端)。密钥用于隐私和完整性保护。SSLv3及以上版本使用6个键-每个方向三个(客户端到服务器;服务器到客户端)。一个密钥用于隐私,第二个密钥用于完整性,第三个密钥用作nonce或iv

要查看HMAC键是什么,请查看第700行附近的
s3_enc.c
中的
n_ssl3_mac
。您将看到如下内容:

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);

您还可以使用
BIO
SSL\u SESSION\u print\fp
通过
SSL\u SESSION\u print
SSL\u SESSION\u print\u fp

查看
SSL*
对象中的数据。通常,您会尝试通过为OpenSSL创建一个引擎来加速SSL,而不是从会话本身检索数据。