2013-01-04 58 views
3

我正在使用OpenSSL,並且希望從會話中提取我的HMAC密鑰和AES密鑰,以便在應用程序中使用GPU加速HMAC和AES加密。如何獲得OpenSSL中的HMAC密鑰

我在哪裏可以得到鑰匙SSL_accept? AES密鑰是否存儲在SSLHandle->enc_write_ctx->cipher_data? HMAC密鑰存儲在哪裏?

+3

通常情況下,您會嘗試通過爲OpenSSL創建引擎來加速SSL,而不是通過從會話本身檢索數據。 –

回答

0

如果你有叫做sslSSL*,那麼查看主密鑰的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一個BIOSSL_SESSION_print_fp