- WindowsC/C++加密解密实战
- 朱晨冰 李建英
- 444字
- 2023-08-25 10:35:09
2.2.8 BIO接口
在OpenSSL源代码中,I/O操作主要有网络操作和磁盘操作。为了方便调用者实现其I/O操作,OpenSSL源代码中将所有的与I/O操作有关的函数进行统一封装,即无论是网络还是磁盘操作,其接口是一样的。对于函数调用者来说,以统一的接口函数去实现其真正的I/O操作。
为了达到此目的,OpenSSL采用BIO抽象接口。BIO是在底层覆盖了许多类型I/O接口细节的一种应用接口,如果在程序中使用BIO,就可以和SSL连接、非加密的网络连接以及文件I/O进行透明的连接。BIO接口的定义如下:

其中,BIO_METHOD结构体是各种函数的接口定义。如果是文件操作,此结构体如下:

以上定义了7个文件操作的接口函数的入口。这7个文件操作函数的具体实体与操作系统提供的API有关。BIO_METHOD结构体如果用于网络操作,其结构体如下:

它跟文件类型BIO在实现的动作上基本上是一样的。只不过是前缀名和类型字段的名称不一样。其实在像Linux这样的系统中,Socket类型跟fd类型是一样的,它们是可以通用的,但是,为什么要分开来实现呢?那是因为有些系统(如Windows系统)的Socket跟文件描述符是不一样的,所以,为了平台的兼容性,OpenSSL就将这两类分开来了。