BIO 메모리 인터페이스를 사용하여 SCTP를 통해 TLS를 구현했습니다.메모리 BIO 인터페이스를 사용하여 SCTP 스트림을 통해 TLS 용 EAGAIN 케이스를 처리하는 방법
그래서 클라이언트 측에서, 애플리케이션 데이터를 전송하는 동안
SSL_write()
API는 데이터를 암호화 및 관련된 기록 BIO 인터페이스에 데이터를 기록한다.- 이어서 BIO 인터페이스로부터 데이터
BIO_read()
호출하고 sctp_sendmsg()
는 API를 사용하여 소켓에 발송을 사용하여 출력 버퍼에 판독된다.BIO_write()
API는 판독 BIO 버퍼에 기록sctp_recvmsg()
API는 소켓으로부터 ecrypted 메시지 청크를 판독 소켓으로부터 데이터를 판독하는 동안, 서버 측에서 마찬가지로
, 및
SSL_read()
api는 BIO에서 읽은 데이터를 해독합니다.
내가 관심이있는 부분은 클라이언트 측에서 1 단계와 2 단계가 완료되고 3 단계에서 소켓에서 EAGAIN을 얻는 것입니다. 따라서 BIO 버퍼에서 읽은 데이터가 무엇이든간에 정리하고 응용 프로그램에 잠시 후 데이터를 다시 보내달라고 요청하십시오.
이제 클라이언트 측에서 1, 2, 3 단계가 진행될 때 서버 측에서 openssl이받은 레코드에 bad_record_mac가 있고 연결이 닫히는 것을 찾습니다.
Google 검색에서 나는 MAC 인코딩이 인코딩 된 이전 패킷에 대한 의존성을 가지고 있기 때문에 TLS 패킷이 순서가 벗어나는 경우가 발생할 수 있다는 것을 알게되었습니다. TLS는 동일한 순서로 전달 된 패킷을 가져야합니다 . 그래서 내가 EAGAIN에 대한 데이터를 정리할 때 나는 SSL 패킷을 버린 다음 순서가 다른 다음 패킷을 보냈습니다 (여기에 선명도가 없습니다)?
소켓이 EAGAIN을 반환 할 때마다 소켓을 쓸 수있을 때까지 무한 대기하도록 코드를 변경 한 다음 모든 것이 잘되고 서버 측에서 bad_record_mac가 표시되지 않습니다.
누군가이 EAGAIN 처리에 관해 나를 도와 줄 수 있습니까? 문제를 해결하기 위해 무한한 시간을 할애 할 수는 없지만 다른 방법이 있습니까?
아주 좋아서, 나는 그가 무슨 말을하고 있었는지 알 수 없었다. – EJP