Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1275549
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-14 10:12:13


加密框架概述
第8 章• Solaris 加密框架介绍179
加密框架的组件
加密框架的组件如下所述:
 libpkcs11.so -该框架通过RSASecurity Inc. 的PKCS#11 加密令牌接口(Cryptographic
Token Interface, Cryptoki) 提供访问权限。需要将应用程序链接到libpkcs11.so 库,该库
实现RSAPKCS#11 v2.11 标准。
 可插接式接口-可插接式接口是PKCS #11 加密服务的服务提供者接口(service provider
interface, SPI),这些服务由Sun Microsystems, Inc. 和第三方开发者提供。提供者是用户级
库,可以通过能够从硬件或软件使用的加密服务实现。
 pkcs11_softtoken.so -一个专用共享对象,其中包含由Sun Microsystems, Inc. 提供的用
户级加密机制。pkcs11_softtoken(5) 库可用来实现RSAPKCS#11 v2.11 标准。
 pkcs11_kernel.so -用来访问内核级加密机制的专用共享对象。pkcs11_kernel(5) 可用
来实现RSAPKCS#11 v2.11 规范。pkcs11_kernel.so 为插入到内核的服务提供者接口中的
加密服务提供一个PKCS#11 用户接口。
 /dev/crypto 伪设备驱动程序-要使用内核级加密机制的专用伪设备驱动程序。提供此
信息的目的在于避免意外删除伪设备驱动程序。
 调度程序/负载平衡器-一种内核软件,负责协调对加密服务请求的使用并对这些请求
进行负载平衡和分发。
 内核编程接口-用于加密服务的内核级消费方的接口。IPSec(Internet 协议安全)协议
和Kerberos GSS 机制是典型的加密消费方。
注– 只有与Sun Microsystems, Inc. 签订了特殊的合同才能使用此接口。有关更多信息,请
发电子邮件至。
 服务提供者接口-内核级加密服务的提供者使用的SPI。这些服务可以在硬件或软件上
实现。要使用SPI,提供者必须从Solaris 内核导入特殊的例程。这些例程允许模块和设
备驱动程序注册和删除服务,还将状态更改通知给框架。该框架还要求提供者导出某些
例程。所导出的例程允许加密框架的消费方和其他组件向提供者发送请求。
 SunHW和SW加密提供者-由Sun Microsystems, Inc. 提供的内核级加密服务。HW是指
硬件加密服务(如加速器板),SW 是指提供加密服务的内核模块(如对于加密算法的
实现)。
 内核加密框架守护进程-一种专用守护进程,负责管理用于加密操作的系统资源,还负
责验证加密提供者。
 模块验证库-一种专用库,用于验证Solaris 加密框架所导入的所有库的完整性和真实
性。
 elfsign -提供给加密服务的第三方提供者的实用程序。elfsign 用于从Sun 请求证书,
还允许提供者对插入到Solaris 加密框架中的二进制文件(即elf 对象)进行实际签名。
 /dev/cryptoadm 伪设备驱动程序-一种专用的伪设备驱动程序,由cryptoadm(1M) 用来
管理内核级加密机制。提供此信息的目的在于避免意外删除伪设备驱动程序。
 cryptoadm -可供管理员管理加密服务的用户级命令。使用cryptoadm 执行的典型任务就
是列出加密提供者及其功能,使用该命令还可以根据安全策略禁用和启用加密机制。
加密框架的组件
180 Solaris 开发者安全性指南• 2006 年11 月
加密开发者需要了解的内容
本节介绍可插入到Solaris 加密框架中的四种应用程序的开发要求。
用户级消费方的开发要求
要开发用户级消费方,开发者需要牢记以下几点:
 包括
 所有的调用都只通过PKCS #11 接口执行。
 链接到libpkcs11.so。
 库不应当调用C_Finalize() 函数。
有关更多信息,请参见第9 章。
用户级提供者的开发要求
要开发用户级提供者,开发者需要牢记以下几点:
 设计要独立使用的提供者。尽管由提供者共享的对象不必是应用程序所链接到的具有完
整功能的库,但是提供者中必须存在所有必需的符号。假设提供者将要在
RTLD_GROUP 和RTLD_NOW 模式下由dlopen(3C) 打开。
 在共享对象中创建PKCS #11 Cryptoki 实现。此共享对象中应当包括必需的符号,而不要
依赖于消费方应用程序。
 强烈建议(但并非必需)为数据清除提供_fini() 例程。如果应用程序或共享库同时装
入libpkcs11 和其他提供者库,则需要使用此方法来避免在C_Finalize() 调用之间产生
冲突。请参见第182 页中的“避免在用户级提供者中出现数据清除冲突”。
 应用Sun Microsystems, Inc. 提供的证书。请参见第383 页中的“申请提供者签署证书
”。
 使用证书和elfsign 对二进制文件进行签名。请参见第385 页中的“签署提供者”。
 按照Sun 约定对共享对象进行打包。请参见附录F。
内核级消费方的开发要求
要开发内核级消费方,开发者需要牢记以下几点:
 包括
 所有的调用都通过内核编程接口执行。
加密开发者需要了解的内容
第8 章• Solaris 加密框架介绍181
内核级提供者的开发要求
要开发内核级提供者,开发者需要牢记以下几点:
 包括
 导入注册、注销和提供状态所必需的例程。
 导出必需的例程,以便为内核加密框架提供入口点。
 导出具有受支持算法说明的数据结构。
 创建可装入的内核模块。
 应用Sun Microsystems, Inc. 提供的证书。请参见第383 页中的“申请提供者签署证书
”。
 使用证书和elfsign 对二进制文件进行签名。请参见第385 页中的“签署提供者”。
 按照Sun 约定对内核模块进行打包。请参见附录F。
避免在用户级提供者中出现数据清除冲突
插入到加密框架中的用户级库应当提供_fini() 函数。卸载用户级库时,装入器会调用
_fini() 函数。_fini() 函数是确保所有的清除操作都在恰当的时间正确完成所必需的。系
统不假设那些使用libpkcs11 的库调用C_Finalize(),因为libpkcs11 是共享库,有可能正
由应用程序使用。
要提供_fini() 函数,需要在可重定位对象的程序数据部分中创建一个.fini 部分。.fini
部分提供运行时终止代码块。请参见《Linker and Libraries Guide》。以下代码样例演示了如
何设计.fini 部分。
示例8–1 向PKCS #11 库提供_fini()
#pragma fini(pkcs11_fini)
static void pkcs11_fini();
/* [... (other library code omitted)] */
static void
pkcs11_fini()
{
(void) pthread_mutex_lock(&pkcs11mutex);
避免在用户级提供者中出现数据清除冲突
182 Solaris 开发者安全性指南• 2006 年11 月
示例8–1 向PKCS #11 库提供_fini() (续)
/* If CRYPTOKI is not initialized, do not clean up */
if (!initialized) {
(void) pthread_mutex_unlock(&pkcs11mutex);
return;
}
(void) finalize_routine(NULL_PTR);
(void) pthread_mutex_unlock(&pkcs11mutex);
}
避免在用户级提供者中出现数据清除冲突
第8 章• Solaris 加密框架介绍183
184
编写用户级加密应用程序和提供者
本章介绍如何开发使用PKCS #11 函数进行加密的用户级应用程序和提供者。其中包含以下
主题:
 第186 页中的“PKCS #11 函数列表”
 第186 页中的“使用PKCS #11 的函数”
 第192 页中的“消息摘要示例”
 第197 页中的“对称加密示例”
 第206 页中的“签名和检验示例”
 第221 页中的“随机字节生成示例”
 第227 页中的“用户级提供者示例”
有关加密框架的更多信息,请参阅第8 章。
Cryptoki 库概述
Solaris 加密框架中的用户级应用程序通过libpkcs11.so 模块中所提供的cryptoki 库来访问
PKCS #11 函数。pkcs11_softtoken.so 模块是由Sun Microsystems, Inc. 提供的PKCS #11 软令
牌实现,用于提供加密机制。软令牌插件是缺省的机制源。加密机制还可以通过第三方插
件提供。
本节列出了软令牌所支持的PKCS #11 函数和返回值,返回代码根据插入到框架中的提供者
而异。本节还介绍了一些常见的函数。有关cryptoki 库中所有元素的完整说明,请参阅相
应的手册页或http://www.rsasecurity.com/rsalabs/pkcs/pkcs-11
9第9 章
185
PKCS #11 函数列表
下面列出了Solaris 加密框架中的pkcs11_softtoken.so 所支持的PKCS #11 函数类别以及相
关函数:
 通用-C_Initialize()、C_Finalize()、C_GetInfo() 和C_GetFunctionList()
 会话管理-C_OpenSession()、C_CloseSession()、C_GetSessionInfo()、
C_CloseAllSessions()、C_Login() 和C_Logout()
 插槽和令牌管理-C_GetSlotList()、C_GetSlotInfo()、C_GetMechanismList()、
C_GetMechanismInfo() 和C_SetPIN()
 加密和解密-C_EncryptInit()、C_Encrypt()、C_EncryptUpdate()、
C_EncryptFinal()、C_DecryptInit()、C_Decrypt()、C_DecryptUpdate() 和
C_DecryptFinal()
 消息摘要-C_DigestInit()、C_Digest()、C_DigestKey()、C_DigestUpdate() 和
C_DigestFinal()
 MAC的签名和应用-C_Sign()、C_SignInit()、C_SignUpdate()、C_SignFinal()、
C_SignRecoverInit() 和C_SignRecover()
 签名检验-C_Verify()、C_VerifyInit()、C_VerifyUpdate()、C_VerifyFinal()、
C_VerifyRecoverInit() 和C_VerifyRecover()
 双重用途加密函数-C_DigestEncryptUpdate()、C_DecryptDigestUpdate()、
C_SignEncryptUpdate() 和C_DecryptVerifyUpdate()
 随机数生成-C_SeedRandom() 和C_GenerateRandom()
 对象管理-C_CreateObject()、C_DestroyObject()、C_CopyObject()、
C_FindObjects()、C_FindObjectsInit()、C_FindObjectsFinal()、
C_GetAttributeValue() 和C_SetAttributeValue()
 密钥管理-C_GenerateKey()、C_GenerateKeyPair() 和C_DeriveKey()
使用PKCS #11 的函数
本节提供了以下使用PKCS #11 的函数的说明:
 第187 页中的“PKCS #11 函数: C_Initialize()”
 第187 页中的“PKCS #11 函数: C_GetInfo()”
 第187 页中的“PKCS #11 函数: C_GetSlotList()”
 第188 页中的“PKCS #11 函数: C_GetTokenInfo()”
 第189 页中的“PKCS #11 函数: C_OpenSession()”
 第189 页中的“PKCS #11 函数: C_GetMechanismList()”
注– 所有的PKCS #11 函数都可以从libpkcs11.so 库中获取,不必使用C_GetFunctionList()
函数来获取可用函数的列表。
Cryptoki 库概述
186 Solaris 开发者安全性指南• 2006 年11 月
PKCS #11 函数: C_Initialize()
C_Initialize() 可用于初始化PKCS #11 库。C_Initialize() 使用以下语法:
C_Initialize(CK_VOID_PTR pInitArgs);
pInitArgs 是空值NULL_PTR 或是指向CK_C_INITIALIZE_ARGS 结构的指针。通过NULL_PTR,该
库可以将Solaris 互斥锁用作锁定原语,在多个线程之间仲裁对内部共享结构的访问。请注
意,Solaris 加密框架不接受互斥锁。由于cryptoki 库的此实现可以安全高效地处理多线
程,因此建议使用NULL_PTR。应用程序还可以使用pInitArgs 来设置诸如
CKF_LIBRARY_CANT_CREATE_OS_THREADS 之类的标志。C_Finalize() 表示应用程序使
用PKCS #11 库结束会话。
注– C_Finalize() 绝不应当通过库进行调用。按照惯例,应用程序负责调用C_Finalize() 来
关闭会话。
除了CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY 和
CKR_OK 以外,C_Initialize() 还会使用以下返回值:
 CKR_ARGUMENTS_BAD
 CKR_CANT_LOCK
 CKR_CRYPTOKI_ALREADY_INITIALIZED-此错误不是致命的。
PKCS #11 函数: C_GetInfo()
C_GetInfo() 使用的是有关cryptoki 库的制造商和版本信息。C_GetInfo() 使用以下语法:
C_GetInfo(CK_INFO_PTR pInfo);
C_GetInfo() 会返回以下值:
 cryptokiVersion = 2, 11
 manufacturerID = Sun Microsystems, Inc.
除了CKR_FUNCTION_FAILED、CKR_GENERAL_ERROR、CKR_HOST_MEMORY 和
CKR_OK 以外,C_GetInfo() 还可以获取以下返回值:
 CKR_ARGUMENTS_BAD
 CKR_CRYPTOKI_NOT_INITIALIZED
PKCS #11 函数: C_GetSlotList()
C_GetSlotList() 使用的是可用插槽的列表。如果除了pkcs11_softtoken.so 以外尚未安装
任何其他加密提供者,则C_GetSlotList() 仅返回缺省插槽。C_GetSlotList() 使用以下语
法:
C_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList,
CK_ULONG_PTR pulCount);
Cryptoki 库概述
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~