Botan::TLS::Client / Botan::TLS::Server 类实现 TLS 协议操作。具体来说,他们为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由你来实现。
在典型的实现中,在建立连接后,您会调用client.send(buf, len) 并带有一些您想要发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的 tls_emit_data 回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将侦听套接字并读取此 TLS 记录。然后您将其传递给server.received_data(buf, len)。服务器在内部从 TLS 记录中提取实际数据,并通过 tls_record_received 回调将其提供给您。
更多详情请见Botan API documentation。
关于您的问题:
我不确定您指的是代码的哪一部分。我可以在 Botan tls 模块中找到 PK_Encryptor_EME 的唯一用法是客户端密钥交换期间的 here。密钥交换不涉及使用用于传输数据的分组密码进行加密。发生这种情况,例如here。
tls_emit_data 将在客户端/服务器构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。
示例实现
Botan 包含一个基本 TLS 客户端/服务器的示例实现:tls_server、tls_client。
这可以通过Botan命令行界面进行测试:
$ mkdir certdir
$ botan keygen > ca_key.pem
$ botan gen_self_signed --ca ca_key.pem my_root_authority > certdir/ca_cert.pem
$ botan keygen > server_key.pem
$ botan gen_pkcs10 server_key.pem localhost > server_csr.pem
$ botan sign_cert certdir/ca_cert.pem ca_key.pem server_csr.pem > server_cert.pem
# botan tls_server server_cert.pem server_key.pem
$ botan tls_client localhost --trusted-cas=certdir
Certificate validation status: Verified
Handshake complete, TLS v1.2 using CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256
Session ID ...
示例代码中的一些兴趣点:
-
Botan::TLS::Client 被创建 here,Botan::TLS::Server 被创建 here。
-
Botan::TLS::Policy 可用于限制,例如可以使用哪些 TLS 版本和密码模式:Link
- 客户端从标准输入here获取数据。它在内部构造 TLS 记录并将它们传递给
tls_emit_data 回调,定义 here 用于将 TLS 记录写入套接字。
- 从套接字读取 TLS 记录并传递给服务器 here。
- 服务器内部从 TLS 记录中提取数据并将其传递给
tls_record_receivedhere。