2012-01-27 12 views
5

Tôi đã viết thư viện mạng dựa trên sự kiện trong C và bây giờ tôi muốn thêm hỗ trợ SSL/TLS qua OpenSSL. Thay vì sử dụng SSL_read()SSL_write(), tôi muốn OpenSSL chỉ thực hiện mã hóa/giải mã dữ liệu đi/đến, cho phép tôi tự truyền/nhận dữ liệu.OpenSSL: thực hiện en-/decryption mà không có SSL_read()/SSL_write()

Tôi mới đến SSL/TLS và OpenSSL, vì vậy:

Có cách nào để có OpenSSL chỉ thực hiện mã hóa/giải mã của char mảng?

Thứ gì đó giống như size_t SSL_encrypt(const char *buf_in, size_t size_in, char *buf_out) sẽ tuyệt vời.

Trả lời

9

Chính xác những gì bạn đã yêu cầu là không thể, bởi vì với TLS không có sự tương ứng 1-1 giữa việc gửi một cái gì đó ở lớp ứng dụng và gửi một thứ gì đó trên ổ cắm mạng. Các sự kiện như thương lượng lại có nghĩa là đôi khi SSL cần đọc dữ liệu từ mạng để thực hiện gửi dữ liệu tiến trình và ngược lại.

Tuy nhiên, bạn vẫn có thể sử dụng OpenSSL để thực hiện SSL nhưng tự chăm sóc việc đọc và ghi từ mạng. Bạn làm điều này bằng cách gọi SSL_set_bio() trên con trỏ SSL thay vì SSL_set_fd():

  1. Sử dụng BIO_new_bio_pair() để tạo ra một cặp BIO kết nối. Một BIO sẽ được đọc và viết bởi các thường trình SSL, và BIO kia sẽ được đọc và ghi vào ứng dụng của bạn (cho phép nó truyền dữ liệu đến đầu kia bằng bất kỳ phương thức nào nó mong muốn).

  2. Sử dụng SSL_set_bio() trên đối tượng SSL mới để đặt cả đọc và viết BIO thành một trong các BIO trong cặp được tạo.

  3. Sử dụng BIO_read()BIO_write() trên BIO khác trong cặp để đọc và ghi dữ liệu giao thức SSL.

  4. Sử dụng SSL_accept(), SSL_connect(), SSL_read()SSL_write() như bình thường trên đối tượng SSL.

(Tuy nhiên, bạn không thể thực hiện bất cứ điều gì ngoài việc đọc và viết chính xác những gì OpenSSL chuyển cho bạn, vì vậy bạn cũng có thể để nó đọc và viết quá).

+0

Cảm ơn nhiều quán cà phê, đây là lần đầu tiên tôi nhận được lời giải thích dễ hiểu về cách BIO được cho là được sử dụng! Thêm +1 cho điều này! –