PKCS #11 笔记 - 原理

发布时间:2010-2-11 11:57
分类名称:PKI


PKCS – Public-Key Cryptography Standards(公共密码加密标准)

PKCS文件和信息可在http://www.rsasecurity.com/rsalabs/PKCS得到

 

PKCS#11为一些保存加密信息、执行密码函数的设备确定了一种程序设计接口(API),称作:CryptokiCryptographic token interface.

 

目标

1.       接口
Cryptoki
作为一个  应用程序和可移动加密设备(智能卡,PCMCIA卡等)之间的接口。

2.       资源共享
一个设备应该被多个应用程序同时共享使用。

 

Cryptoki 通用模型

PKCS 11 v2.11 Notes - Dsliu - Dspace

Figure 1, General Cryptoki Model

每个设备对应一个Slot,上层应用无需了解设备的具体细节,只和Cryptoki提供的接口打交道,Cryptoki隐藏了大部分细节。

Token(设备)的逻辑视图(logical view)

PKCS 11 v2.11 Notes - Dsliu - Dspace

Figure 2, Object Hierarchy 

Objects 根据生存期和可见性可分为:

1.       Token Object     在拥有足够权限的情况下,对所有的程序都可见,一直都保存在设备中

2.       Session Object  临时对象,当Session(会话)结束,所有的Session objects将被销毁。并且只对创建此Session Object的应用程序可见,其余应用程序不可见。注意区分名词:一个名词是Session,指的是会话。一个是Session object,主要指临时的。

 

要区分Token 的逻辑视图和真正的实现,因为不是所有的设备都支持这些对象,Cryptoki的功能也就是将设备内部的不同实现映射成统一的逻辑视图,供应用程序使用统一的接口。

 

用户

Cryptoki支持两种用户: 

1.       Security Officer (SO) 用来初始化设备、设置用户PIN、访问公共数据等操作。

2.       Normal User (User)  只有此用户才能访问私有数据,SO不能访问。

 

应用程序

进程中存在很多线程,只要其中某个线程调用C_Initialize函数,此进程就成为“Cryptoki Application”。当应用程序不需要Cryptoki的时候,需要调用C_Finalize函数。

 

n 进程

假设Unix中,P进程调用了C_Initialize函数,然后使用fork() 创建了进程C。由于进程P和进程C拥有不同的进程空间,他们并不是同一个进程,所以如果进程C要使用Token,他就要再次调用C_Initialize函数,而且进程C需要登陆Token,即便进程P已经登录过了. 如果进程C没有调用C_Initialize函数,访问Token将返回CKR_CRYPTOKI_NOT_INITIALIZED。此原理同样适用于其他系统平台(如windows,mac等)。

 

n  线程

当应用程序调用了C_Initialize函数, 它可以明确说明以下4种访问Cryptoki的多线程行为:

1.    应用程序明确指出它不需要多线程访问设备,此时Cryptoki库,并不需要担心线程的安访问问题。

2.    应用程序明确指出它需要多线程访问设备,此时Cryptoki库需要用本地的操作系统提供的同步机制保证线程安全访问。

3.    应用程序明确指出它需要多线程访问设备,此时Cryptoki库需要用一组应用程序提供的同步机制(例如:纤程)保证线程安全访问。

4.    应用程序明确指出它需要多线程访问设备,此时Cryptoki库需要用本地的操作系统或一组应用程序提供的同步机制保证线程安全访问。

Session(会话)

Cryptoki规定应用程序需要打开一个或多个会话来访问Token的对象和功能。一个会话(Session)是一个应用程序和token设备通讯的逻辑连接。一个会话可以是read/write(R/W)会话或read-only(R/O)会话。read/write(R/W)read-only(R/O)只是针对于Token objects的访问权限,不针对于Session Objects。这俩种会话都可以创建,读取,写入和销毁Session Objects(会话对象)。只有read/write session可以创建创建,修改和销毁token objects.

打开一个会话后,应用程序对token的公有对象(public object)具有访问权. 此应用程序的所有线程对此session和此session创建的session objects具有访问权, 用户必须登录token(如验证用户PIN)才能访问到私有数据.

关闭一个session, 在此会话期间创建的所有session objects将被销毁.这些session objects有可能正在被其它session所使用. 也就是说,一个应用程序打开了多个会话, 它使用其中一个创建了一个session object, 则其它session都可以使用该对象.一旦创建session object的这个session被关闭.这个对象就会被销毁.

总结一下会话(Session)和临时对象(Session Object)的关系,Session Object在应用程序中的某个Session中建立,此时此Session对Session Object有拥有权,Session Object可以被应用程序的其他Session使用,当拥有Session Object的Session销毁时(调用C_CloseSession),此Session Object被立即销毁,其它Session则不能继续使用此Session Object。

 

Session states(会话状态)

Session 状态决定了是否有权限对Token Object操作或访问一些功能。

n  Read-only session states 只读状态

只读Session有两种状态:

PKCS 11 v2.11 Notes - Dsliu - Dspace

State

Description

R/O Public Session

The application has opened a read-only session.  The application has read-only access to public token objects and read/write access to public session objects.

R/O User Functions

The normal user has been authenticated to the token. The application has read-only access to all token objects (public or private) and read/write access to all session objects (public or private).

 

n  Read/Write session states

可读可写Session有3中状态:

PKCS 11 v2.11 Notes - Dsliu - Dspace

 

State

Description

R/W Public Session

The application has opened a read/write session. The application has read/write access to all public objects.

R/W SO Functions

The Security Officer has been authenticated to the token. The application has read/write access only to public objects on the token, not to private objects. The SO can set the normal user’s PIN.

R/W User Functions

The normal user has been authenticated to the token. The application has read/write access to all objects.

 

Access to Different Types Objects by Different Types of Sessions

 

Type of session

 

Type of object

R/O Public

R/W Public

R/O User

R/W User

R/W SO

Public session object

R/W

R/W

R/W

R/W

R/W

Private session object

 

 

R/W

R/W

 

Public token object

R/O

R/W

R/O

R/W

R/W

Private token object

 

 

R/O

R/W

 

 

 

Session Event(会话事件)

会话事件将会导致会话状态(session states)的改变。如下表:

Event

Occurs when...

Log In SO

the SO is authenticated to the token.

Log In User

the normal user is authenticated to the token.

Log Out

the application logs out the current user (SO or normal user).

Close Session

the application closes the session or closes all sessions.

Device Removed

the device underlying the token has been removed from its slot.

 当设备移除,应用程序打开的所有Session自动变为log out状态。

Cryptoki中,所有的Session必须拥有相同的Login/Logout 状态. (all sessions are public sessions; all sessions are SO sessions; or all sessions are user sessions)即如果一个session登录到token,其余所有的session匀变为登录到token中的状态.当其中一个登出token,其余所有的session全部转变为登出token的状态.例如,一个程序已经打开了一个R\O user session, 然后打开一个R\W session,这个session就会自动变为login状态.

可以理解为Session有横向和纵向两种状态:


会话表示

一个Session用一个session handle表示(其实就是个整数). 就和文件句柄的功能类似.

一个无效句柄,通常为0.表示为:

#define CK_INVALID_HANDLE        0

 

会话能力

大体分3个方面:

n  管理操作(如登录登出)

n  对象管理(诸如创建,更改和销毁对象)

n  加密操作(诸如消息摘要,签名,加解密等)


Objects(对象)

PKCS 11 v2.11 Notes - Dsliu - Dspace

Figure 5, Object Attribute Hierarchy