2011-01-04 2 views
0

OpenSSL을 감싸는 비동기 클라이언트 및 서버 응용 프로그램이 있습니다. 일단 생성되면 SSL_set_connect_state()/SSL_set_accept_state()를 각각 호출하여 내부 상태를 초기화합니다. 이 시점까지는 모든 것이 실행되어야합니다. 나는 앞서 언급 한 상태가 설정되면 손 떨림이 시작될 수 있다고 가정합니다. 나는 손동작 (스 니펫)을 초기화하기 위해 다음을 수행한다.비동기 BIO_ctrl_pending()을 사용한 OpenSSL 문제

if (BIO_ctrl_pending(m_pOutBio)) 
{ 
    size_t iNumBytes = BIO_ctrl_pending(m_pOutBio); 
    if (iNumBytes > 0) 
    { 
     CAutoPtr<byte> tTempBuf(new byte[iNumBytes]); 

     // Transfer bytes from the Write BIO into the temporary buffer 
     int iRet = BIO_read(m_pOutBio, tTempBuf, iNumBytes); 
    } 
} 

여기서 흥미로운 부분이있다. BIO_ctrl_pending() 호출이 실패하고 SSL_get_error()를 호출하면 SSL_ERROR_WANT_READ가 반환됩니다. 그런 다음 분명히 내 독서 코드를 실행하지 않습니다. 내가 코드, BIO_ctrl_pending()를 적당량 (210)를 반환하고 내 코드는 다음 BIO에서 읽을 계속 손을 흔들어 시작할 수 있습니다 실행할 때 이제

SSL_peek(m_pSSLCon, NULL, 0); 

: 내 코드 위에 다음 줄을 추가했다.

제 질문은 OpenSSL에서 상태가 올바르게 설정되지 않는 버그입니까? 또는 나는 무엇인가 놓치고있다??

+0

설명하십시오 : m_pOutBio BIO 무엇인가? 이 코드는 어떤 측면 (서버 또는 클라이언트)에서 실행됩니까? –

+0

이것은 클라이언트 측에서 실행됩니다. BIO_ctrl_pending()이 호출되면 서버 측과 클라이언트 측 모두 실패합니다. BIO_read()를 직접 호출하면 위에서 언급 한 SSL 오류가 반환됩니다. m_pOutBio는 다음을 사용하여 인스턴스화됩니다. \t \t m_pOutBio = BIO_new (BIO_s_mem()); – MarkP

+0

SSL 내부에서 SSL_peek() 함수는 s-> handshake_func를 호출합니다. 여기서 s는 내 SSL * 객체입니다. 이것이 BIO 프라이밍과 관련이 있는지 궁금합니다. – MarkP

답변

2

오래된 질문이지만 참조 용 있도록하려면 openssl 물건을 인터넷 검색을 할 때 팝업 계속 :

그냥 슬쩍에 의존하는 대신 핸드 셰이크를 시작/내부적으로 그 일을 읽기 : 를가 악수 ssl_error_want_read 실패합니다 소켓 바이오 아닌 경우 ctrl_pending을 사용하여 읽을 크기를 얻습니다. 이 같은

뭔가 :

ret = SSL_do_handshake(client_side); 
     if (ret < 0) 
     if (SSL_ERROR_WANT_READ != SSL_get_error(client_side,ret)) 
      cout << "ERROR"; 


    ret = BIO_ctrl_pending(network_side);