BIO接口
在OpenSSL源代码中,I/O操作主要有网络操作、磁盘操作。为了方便调用者实现其I/O操作,OpenSSL源代码中将所有与I/O操作有关的函数进行统一封装,即无论是网络还是磁盘操作,其接口都是一样的。对于函数调用者来说,以统一的接口函数去实现真正的I/O操作。
为了达到此目的,OpenSSL采用BIO抽象接口。BIO是在底层覆盖了许多类型I/O接口细节的一种应用接口,如果在程序中使用BIO,就可以和SSL连接、非加密的网络连接以及文件I/O进行透明的连接。BIO接口的定义如下:
上面定义了7个文件操作的接口函数入口,这7个文件操作函数的具体实现与操作系统提供的API有关。BIO_METHOD结构体用于网络操作时,其结构体如下:
它跟文件类型BIO在实现的动作上基本一样,只是前缀名和类型字段名称不一样。其实在像Linux这样的系统里,Socket类型跟fd类型一样,都是可以通用的。但是,为什么要分开来实现呢?那是因为有些系统(如Windows系统)的Socket跟文件描述符是不一样的,为了平台的兼容性,OpenSSL就将这两类分开了。
EVP接口
EVP系列的函数定义包含在evp.h里面,这是一系列封装了OpenSSL加密库中所有算法的函数。通过这样的统一封装,只需要在初始化参数的时候做很少的改变就可以使用相同的代码、采用不同的加密算法进行数据的加密和解密。
EVP系列函数主要封装了三大类型的算法。如果要全部支持这些算法,可以调用OpenSSL_addall_algorithms函数。
1.公开密钥算法
函数名称:EVPSeal*...*,EVPOpen*...*。
功能描述:该系列函数封装提供了公开密钥算法的加密和解密功能,实现了电子信封的功能。
相关文件:p_seal,p_open.c。
2.数字签名算法
函数名称:EVP_Sign*...*,EVP_Verify*...*。
功能描述:该系列函数封装提供了数字签名算法和功能。相关文件:p_sign.c,p_verify.c。
3.对称加密算法
函数名称:EVP_Encrypt*...*。
功能描述:该系列函数封装提供了对称加密算法的功能。
相关文件:evp_enc.c,p_enc.c,p_dec.c,e_*.c。
4.信息摘要算法
函数名称:EVPDigest*...*。
功能描述:该系列函数封装实现了多种信息摘要算法。
相关文件:digest.c,m_*.c。
5.信息编码算法
函数名称:EVPEncode*...*。
功能描述:该系列函数封装实现了ASCII码与二进制码之间的转换函数和功能。