我正在使用OpenSSL,並且希望從會話中提取我的HMAC密鑰和AES密鑰,以便在應用程序中使用GPU加速HMAC和AES加密。如何獲得OpenSSL中的HMAC密鑰
我在哪裏可以得到鑰匙SSL_accept
? AES密鑰是否存儲在SSLHandle->enc_write_ctx->cipher_data
? HMAC密鑰存儲在哪裏?
我正在使用OpenSSL,並且希望從會話中提取我的HMAC密鑰和AES密鑰,以便在應用程序中使用GPU加速HMAC和AES加密。如何獲得OpenSSL中的HMAC密鑰
我在哪裏可以得到鑰匙SSL_accept
? AES密鑰是否存儲在SSLHandle->enc_write_ctx->cipher_data
? HMAC密鑰存儲在哪裏?
如果你有叫做ssl
的SSL*
,那麼查看主密鑰的ssl->session
和當前hamc密鑰的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使用兩個會話密鑰 - 每個方向一個(客戶端到服務器;服務器到客戶端)。密鑰用於隱私和完整性保護。 SSLv3及以上版本使用6個密鑰 - 每個方向三個(客戶端到服務器;服務器到客戶端)。一個密鑰用於隱私,第二個用於完整性,第三個用作隨機數或iv。
要查看HMAC關鍵是什麼,看一看,例如,在n_ssl3_mac
左右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
。
通常情況下,您會嘗試通過爲OpenSSL創建引擎來加速SSL,而不是通過從會話本身檢索數據。 –