2013-01-04 2 views
3

OpenSSL을 사용하고 있으며 세션에서 HMAC 키와 AES 키를 추출하여 응용 프로그램에서 GPU로 HMAC 및 AES 암호화를 가속화 할 수 있습니다.OpenSSL에서 HMAC 키를 얻는 방법

SSL_accept 이후의 키는 어디에서 얻을 수 있습니까? AES 키가 SSLHandle->enc_write_ctx->cipher_data에 저장되어 있습니까? HMAC 키는 어디에 저장되어 있습니까?

+3

일반적으로 세션 자체에서 데이터를 검색하는 것이 아니라 OpenSSL 용 엔진을 만들어 SSL 가속화를 시도합니다. –

답변

0

ssl이라는 SSL*의 경우 마스터 키는 ssl->session이고 현재 hamc 키는 ssl->s3입니다.

ssl.hstruct 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 개의 키 (각 방향으로 3 개 (클라이언트에서 서버로, 서버에서 클라이언트로))를 사용합니다. 하나의 키는 프라이버시 용이고 두 번째 키는 무결성을 위해 사용되며 세 번째 키는 넌스 또는 iv로 사용됩니다.

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 멤버를 사용하십시오 HMAC 키가 무엇인지 보려면

은 다음과 같은 것을 볼 수 라인 (700)의 주위에 s3_enc.c, 예를 들어, n_ssl3_mac을 좀 봐. 예를 들어, t1_enc.c에서 라인 445 주위 :

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

또한 사용 SSL_SESSION_print으로 SSL* 객체의 데이터에서 좋은 모습을 얻을 수있을 수있는 BIO 또는 SSL_SESSION_print_fp.