OCF 相关(一)

OpenBSD Cryptographic Framework(OCF)

一.OCF 介绍

当今的计算机系统包括很多的应用,而在点对点通信的应用中,通常会包含很多敏感的信息.那么就需要利用加密机制来保护这些信息,但是加密算法设计的非常复杂和消耗CPU时间.从而导致整个系统性能的降低.

对于上面的缺陷,很多应用为了更好的性能而放弃加密,因为加密算法常常是软件实现的.为了解决这个问题,产商也生产了一些加密硬件,然而当今的操作系统不能有效的通过一个抽象的统一的接口接入加密硬件.这样导致了一个结果,加密硬件通常通过一个库提供会应用,应用需要了解加密硬件的特性细节,这阻止了操作系统很轻松的利这些硬件.

我们提出了OpenBSD Cryptographic Framework(OCF), 在内核提供一个虚拟层,提供统一的接入方法,并屏蔽硬件细节.这样允许我们更加轻松的添加新的硬件,而应用开发不必知晓相关硬件细节.OCF已经在OpenBSD稳定高效运超过三年,它提供了负载均衡,会话迁移和算法链的功能.

加密硬件也有一些缺点,数据copy问题,需要上下切换,如果是小块数据,频繁的上下文切换,不利于提高吞吐率和整个系统性能.所以小块数据用软件处理,大块数据用硬件处理.

二.OCF 框架

  • OCF 需要crypto driver提供三个接口:newsession(), process(), freesession()
  • OCF对用户层提供的三个重要调用:ioctl(CIOCGSESSION), ioctl(CIOCCRYPT), ioctl(CIOCFSESSION).且与(1)一一对应.
  • OCF为了获取特定的加密硬件/软件支持哪些算法.提供了crypto_register(deviceid, alg, max_key_len ); 用于crypto driver告知OCF支持哪些硬件加密算法.

三.注意事项

1. 当父进程open(“/dev/crypto”),执行fork()之后,子进程执行了exec,然而子进程继承了父进程的fd,只要子进程不退止,那么crypto资源则一直不被释放,可能会导致资源耗尽问题(如果是上述情况,需是设置 “close-on-exec”).

2. 子进程如果想要使用/dev/crypto提供的加密功能,最好在使用之前ioctl(CRIOGET)来获取一个新的描述,获取的描述符对当前进程来说是自己拥有的.

3. 直到关于open(“/dev/crypto”)的文件描述被关闭,所有创建的session才能被关闭.(针对子进程fork之后做exec)

四.应用层调用加密流程

open(“/dev/crypto”)

|

ioctl(CIOCGSESSION)

|

ioctl(CIOCCRYPT)

|

.….

|

ioctl(CIOCCRYPT)

|

ioctl(CIOCFSESSION)

|

close(fd)

 

更详细介绍链接:https://www.usenix.org/legacy/event/usenix03/tech/full_papers/keromytis/keromytis_html/main.html