TLSセットアッププロセスパラダイム

1 、SSL初始化:
 ブール INIT(ストリング certfileに、privFile){ 
    SSL_load_error_strings()。
    INT R = SSL_library_init()。
    もし(式中、R == 0 ){
         戻り 
    } 
    SSL_CTX = SSL_CTX_new(SSLv23_method())。
    もし(SSL_CTX == NULL){ 
        のprintf(" SSL_library_initが\ nを失敗" )。
        返す ; 
    } 
    err_bio = BIO_new_fd(2 、BIO_NOCLOSE)。 
    、R = SSL_CTX_use_certificate_file(SSL_CTX、certFile.c_str()、SSL_FILETYPE_PEM)。
    もし(R <= 0 ){ 
        のprintf(" SSL_CTX_use_certificate_file%sは\ nを失敗" 、certFile.c_str())。
        返す ; 
    } 
    R = SSL_CTX_use_PrivateKey_file(SSL_CTX、privFile.c_str()、SSL_FILETYPE_PEM)。
    もし(R <= 0 ){ 
        のprintf(" SSL_CTX_use_PrivateKey_file%sは\ nを失敗" 、privFile.c_str())。
        返す ; 
    } 
    R = SSL_CTX_check_private_key(SSL_CTX);
     IF(R&LT == 0 ){ 
        のprintf(" SSL_CTX_check_private_keyが\ N-を失敗" );
         戻り falseに
    } 
    のprintf(" SSLが成功の\ N-をinited " );
     戻り trueに; 
} 


2 、ハンドシェイクネゴシエーション:
 INT SSLHandshake ()
{ 
    // SSL接続が確立されていない前に、イベントがファイルディスクリプタを読み書きするために添加されるべき
    IF(!{tcp_connected)
         STRUCT たpollfdのPFD; 
        pfd.fd = FD; 
        pfd.events= POLLOUT | POLLERR;
        INTの R =ポール(&PFD、10 );
        もし(R == 1 && pfd.revents == POLLOUT){ 
            のprintf(" TCP接続FD:%Dを\ n " 、FD)。
            tcp_connected = ;
            // 注册读写事件 
            SetEvent(FD_SEND | FD_RECV | FD_CLOSE | FD_ERROR)。
        } { 
            のprintf(" ポーリングFD:%d個の戻り%Dにrevents%D \ n " 、R、FD、pfd.revents)。
            リターン - 1; 
        } 
    } 

    // SSLがnullの場合、確立されたSSLソケット接続を使用して初期化
    IF(SSL == NULL){ 
        SSL = SSL_new(SSL_CTX);
         IF(SSL == NULL){ 
            のprintf(" SSL_newは、FDを失敗しました:% D \ N- "FD);
             リターン - 1 ; 
        } int型の R&LT = SSL_set_fd(SSL、FD);
         IF(R&LT == 0 ){ 
            printf関数は(" SSL_set_fd FDに失敗しました:%D \ N- " 、FD); 
        } 
        のprintf("

        SSL_set_accept_stateためのFD:%D \ N- " 、FD); 
        SSL_set_accept_state(SSL); 
    } 

    int型の R&LT = SSL_do_handshake(SSL);
     // 戻り値が1である場合、SSLハンドシェイクが完了した
    IF(R&LT == 1 ){ 
        ssl_connected = 真の; 
        のprintf(" :%D \ N- SSL_do_handshake接続された成功FD " ; FD)
         戻り 0 ; 
    } 

    // 処理ハンドシェイクが完了し、対応するイベントが削除されるべきである
    INT ERR = SSL_get_error(SSL、R&LT)、
     IF(ERR = = SSL_ERROR_WANT_WRITE){
         // 読み出しイベントを削除
        SetEvent(FD_SEND | FD_CLOSE | FD_ERROR)。
        printf(" SSL_get_errorリターンがセットイベントを書き込む必要やFD:%dは\ nを" 、FD);
        戻る - 2 
    } そう であれば(ERR == SSL_ERROR_WANT_READ){
         // 移除写事件 
        SetEvent(FD_RECV | FD_CLOSE | FD_ERROR)。
        printf(" SSL_get_errorリターンがセットイベントを読みたい、fdは:%dは\ nを" 、FD);
        戻る - 2 
    } { 
        のprintf("%dのエラーを返すSSL_get_error%Dはerrno%D MSG%のFD:%Dを\ n " 
                、R、ERR、errnoを、はstrerror(errnoに)、FD); 
        リターン - 1 ; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/share-ideas/p/11718904.html