我正在使用 Peter Gutmann 的 cryptlib 来实现 TLS 加密。
cryptPopData
通常,cryptlib 的功能cryptPushData
将处理特定于协议的握手、加密或解密数据,以及读取或写入由 cryptlib 内部管理的网络套接字。这行得通,但现在我需要自己实现 I/O(并且 I/O API 与套接字不兼容)。
需要发生的事情大致是这样的(1):
[I prepare] unencrypted TxData -> [cryptlib] -> encrypted TxData -> [I send]
[I receive] encrypted RxData -> [cryptlib] -> decrypted RxData -> [I process]
根据cryptlib 手册p 中的“管理您自己的网络连接和 I/O”一章。127,这个确切的场景应该是可能的,但我不明白。
如果您想使用系统提供的任何高性能 I/O 功能,也可以使用此工具,例如异步 I/O 或硬件加速 I/O,其中专用子系统管理所有网络传输并发布完成转移完成后通知您的应用程序。这允许您使用自己的连接管理/套接字多路复用/读写代码,而不是使用 cryptlib 提供的工具。
以下讨论涉及网络套接字,因为这是用于网络 I/O 的最常见抽象,但是 cryptlib 可以使用任何可以由整数值或句柄表示的网络 I/O 标识符。如果您的网络抽象需要的不仅仅是一个简单的句柄,您可以将引用或索引传递给您的系统处理网络 I/O 所需的任何数据结构的数组。
解释性文本指出,应用程序可以使用它来实现 I/O 本身,而不是让 cryptlib 执行 I/O,这正是我所需要的。它还提到,即使编程示例涉及套接字,该原理也可以应用于其他类型的 I/O。
但是,提供的所有编程示例都归结为:
/* Wait for data to arrive */
[Some application defined code that reads data from the network and puts it into an application defined buffer]
/* Read data from the session */
cryptPopData( cryptSession, ... );
我不明白应用程序代码接收到的加密 RxData 如何对 cryptlib 可见,以便它可以由 cryptlib 处理(如果适用,还可以解密)。如果没有这一步,cryptPopData
如果我从不告诉它我从远程设备收到了什么,应该如何给我解密数据?
TxData 也是如此——我没有看到任何 cryptlib API 可以为我提供它希望通过网络发送的传出加密(1)数据。
我本来期望两个应用程序提供的 I/O 回调(一个用于读取,一个用于写入),或者一个辅助推送/弹出接口,它将传出的网络数据弹出 cryptlib,并将传入的网络数据推送到 cryptlib。
(1) 我意识到它会更加细微 - 它也可能是初始 TLS 握手的数据 - 在这种情况下,cryptlib 将要求我在没有提供未加密的 TxData 的情况下发送数据,并且它会要求我接收数据没有我真正从中获得解密的 RxData 有效负载。