资讯详情

PKCS#11标准解读-对象 加密机 HSM 安当加密

PKCS#11是一种非常常见的密码设备接口。在实际应用中,国密密码设备应用接口规范GMT0018具有相同的功能,在技术体系结构中处于类似的位置。

在密码产品的开发中,根据PKCS#11或者GMT0018接口规范提供相应的接口包装,底层密码设备可以更换,无需更改或轻微更改。

PKCS#11标准内容较多,v2-20版有400页,对应,PKCS#11的标准解释将根据概念和常用接口、角色、对话、对象和机制进行,最后介绍应用程序的调用过程,连接每个概念和接口。

这是第三篇,介绍Cryptoki对象及其属性。

Cryptoki一系列的对象可以识别。一个对象包含一个属性集,每个属性都有一个给定的值。

下图展示Cryptoki对象层次结构和一些支持属性。

Cryptoki提供一系列的对象管理函数。一些密钥操作接口函数也会创建Key对象保存结果。

一个对象总是包含所有必要的属性。令牌可以保存多个相同的对象。

创建、修改和复制对象的所有函数都使用模板作为参数之一,模板指定了特定的属性值。

根据加密机制,还可以在创建对象时添加额外的属性值。

当对象类所需的属性没有默认值时,必须在创建时通过函数或模板指定。

在创建对象时,以下情况会导致创建失败:

1)提供的模板给出无效的属性指定值。

2)指定有效属性的非法值。

3)赋值一个只读的属性。

4)模板中指定的属性和值不足以创建对象。

5)模板中指定的属性值存在冲突。虽然独立性符合接口规范,但不符合特定令牌的要求。

6)重复为特定属性指定相同的值。

对象创建后,可以通过C_SetAttributeValue修改属性值。

需要注意的是,一些接口规范表示为可修改属性,对于特定的属性token可能不支持修改。

可以通过C_CopyObject复制对象时,也可以通过应用程序提供的模板修改对象副本的属性。

除了Cryptoki指定的可修改属性,CKA_TOKEN、CKA_PRIVATE、CKA_MODIFIABLE复制过程中也可以修改。

需要注意的是,特定的令牌可能不支持某些属性的修改。

CKA_CLASS

CK_OBJECT_CLASS

Objectclass(type)

CKA_CLASS创建对象时必须指定。

CKO_HW_FEATURE代表设备的功能。它们提供了一种容易扩展的方法来引入新的价值特征Cryptoki接口中。

除非在CKA_CLASS属性中指定CKO_HW_FEATURE这个值,否则在使用C_FindObjectInit和C_FindObjects硬件功能对象在查找对象时不会返回。

CKA_HW_FEATURE_TYPE

CK_HW_FEATURE

Hardware feature(type)

CKA_HW_FEATURE_TYPE在创建对象时需要指定。

属性CKA_HW_FEATURE_TYPE值为CKH_CLOCK代表时钟对象。时钟对象代表设备上的实时时钟。

代表和 CK_TOKEN_INFO 结构中的 utcTime 具有相同字段的时钟源。时钟对象具有以下属性:

CKA_VALUE

CK_CHAR[16]

长度为 16 字符串表示当前时间,

格式为:YYYYMMDDhhmmssxx

(最后 2 保留0字符)。

如果设备允许,可以通过C_SetAttributeValue设备可能需要设置该属性SO用户修改时间。

属性CKA_HW_FEATURE_TYPE值为CKH_MONOTONIC_COUNTER代表单调计数器对象。

单调计数器对象表示设备上存在的硬件计数器。该计数器保证每次读取其值时增加,但不一定增加1。

应用程序可以用它来生成序列号,以确保令牌的唯一性。

单调计数器对象属性:

CKA_RESET_ON_INIT

CK_BBOOL

使用C_InitializeToken初始化时,计数器将复位到一个先前的返回值。

CKA_HAS_RESET

CK_BBOOL

在某些点,计数器的值已经及时复位至少一次。

CKA_VALUE

Byte Array

以大字节序返回单调计数器的当前版本。

注意单调计数器的这些属性只读,客户端无法设置。

属性CKA_HW_FEATURE_TYPE值为CKH_USER_INTERFACE代表用户接口对象。

用户接口对象代表设备的交互能力。

 CKA_PIXEL_X 

 CK_ULONG 

 屏幕分辨率-X轴

 CKA_PIXEL_Y 

 CK_ULONG 

 屏幕分辨率-Y轴

 CKA_RESOLUTION 

 CK_ULONG 

 DPI,每英寸像素值

 CKA_CHAR_ROWS 

 CK_ULONG 

 面向字符的显示,字符行数

 CKA_CHAR_COLUMNS 

 CK_ULONG 

 面向字符的现实,字符列数

 CKA_COLOR 

 CK_BBOOL 

 彩色支持

 CKA_BITS_PER_PIXEL 

 CK_ULONG 

 色位或每像素灰度信息

 CKA_CHAR_SETS 

 RFC 2279 string

 字符集

 CKA_ENCODING_METHODS 

 RFC 2279 string 

 编码方式

 CKA_MIME_TYPES 

 RFC 2279 string 

 MIME类型

存储对象并非一个具体的对象类,不需要CKO定义。它是一种具有以下对象类的公共属性的对象类。

 

 

 

 CKA_TOKEN 

 CK_BBOOL 

默认CK_FALSE,

会话对象为CK_FALSE 

令牌对象为CK_TRUE 

 CKA_PRIVATE 

 CK_BBOOL 

Private对象为CK_TRUE  

Public对象为CK_FALSE

默认值由令牌定义,可能取决于其他属性值。 

 CKA_MODIFIABLE 

 CK_BBOOL 

 默认为CK_TRUE

 CKA_LABEL 

 RFC2279 string

 对象描述,默认为空。

CKA_CLASS属性为CKO_DATA。数据对象用来保存应用程序定义的信息。

Cryptoki仅提供此对象的访问,对于内容没有任何特殊的定义。

     

 CKA_APPLICATION 

RFC2279 string 

 管理该对象的应用程序的说明。默认为空。

 CKA_OBJECT_ID 

Byte Array 

 DER编码的对象标识符,默认为空。

 CKA_VALUE 

Byte Array 

 对象值

CKA_CLASS属性为CKO_CERTIFICATE。证书对象持有公钥或者属性证书。Cryptoki仅提供证书的访问,不附加任何特殊的意义。

 

 

 

 CKA_CERTIFICATE_TYPE

 CK_CERTIFICATE_TYPE 

证书类型(对象创建时指定)

 CKA_TRUSTED

 CK_BBOOL 

证书对于所建立的应用是否可信

(只能由SO设置为CK_TRUE)

 CKA_CERTIFICATE_CATEGORY 

 CK_ULONG 

证书的分类:

0=未指定(默认值)

1=令牌用户,

2=机构,

3=其他实体

 CKA_CHECK_VALUE 

 Byte array

 校验和

 CKA_START_DATE 

 CK_DATE 

 起始日期

 CKA_END_DATE 

 CK_DATE 

 终止日期

证书类型为CKC_X_509,用于保存X.509公钥证书。除了通用的证书对象属性,还有如下属性:

 

 

 

 CKA_SUBJECT

  Byte array

 DER编码的证书主题名称,必须在对象创建时指定

 CKA_ID 

 Byte array

 公私钥对的标识符,默认为空。必须在对象创建时指定。

CKA_URL为空时,这个值必须为非空。

 CKA_ISSUER 

 Byte array

 DER编码的证书发行机构名,默认为空。    

 CKA_SERIAL_NUMBER 

 Byte array

 DER编码的证书序列号,默认为空。

 CKA_VALUE

  Byte array

 证书的BER编码,必须在对象创建时指定。

 CKA_URL

 RFC2279 string 

 非空时,给出完整的可获取证书的URL。

CKA_VALUE为空时,此值必须非空。

 CKA_HASH_OF_SUBJECT_PUBLIC_KEY

 Byte array

 主题公钥的SHA-1哈希,默认为空。

CKA_URL为空,只能为空。

 CKA_HASH_OF_ISSUER_PUBLIC_KEY

Byte array 

 发行机构公钥的SHA-1哈希,默认为空。

CKA_URL为空,只能为空。

 CKA_JAVA_MIDP_SECURITY_DOMAIN 

 CK_ULONG 

 Java MIDP安全域:

0=未指定(默认值),

1=制造商,

2=操作员,

3=第三方

在对象创建之后,只有CKA_ID,CKA_ISSUER,CKA_SERIAL_NUMBER属性可以修改。

CKA_ID用于区分同一主体持有的多个公私钥对,不管是否存储在相同的令牌上。

密钥是通过主体名称和标识符来区分的,所以不同主体的密钥可能有相同的CKA_ID值。

证书类型为CKC_WTLS,保存WTLS公钥证书。

     

 CKA_SUBJECT

 Byte array

证书主体的WTLS编码,必须在对象创建时指定。

CKA_VALUE为空时,此值只能为空。

 CKA_ISSUER 

 Byte array

 WTLS编码的证书发行机构名,默认为空。  

 CKA_VALUE

 Byte array

 WTLS的证书编码,必须在对象创建时指定。

CKA_URL为空时,必须非空。

 CKA_URL

 RFC2279 string 

 非空时,给出完整的可获取证书的URL。

CKA_VALUE为空时,此值必须非空。

 CKA_HASH_OF_SUBJECT_PUBLIC_KEY

 Byte array

 主题公钥的SHA-1哈希,默认为空。

CKA_URL为空,只能为空。

 CKA_HASH_OF_ISSUER_PUBLIC_KEY

Byte array 

 发行机构公钥的SHA-1哈希,默认为空。

CKA_URL为空,只能为空。

在对象创建之后,只有CKA_ISSUER属性可以修改。

2)X.509属性证书对象

证书类型为CKC_X_509_ATTR_CERT,保存X.509属性证书。

 

 

 

 CKA_OWNER

 Byte array

 属性证书主体字段的DER编码,必须在对象创建时指定。

与CKC_X_509证书中的CKA_SUBJECT属性不同,因为ASN.1语法和编码是不同的。

 CKA_AC_ISSUER

 Byte array

 属性证书机构字段的DER编码。

 CKA_SERIAL_NUMBER 

 Byte array

 证书序列号的DER编码,默认为空。

 CKA_ATTR_TYPES 

 Byte array

 对应证书中属性类型的对象标识符值序列的BER编码。默认为空。

应用程序无需获取和解析证书就可以查找特定的属性证书。

 CKA_VALUE

 Byte array

 证书的BER编码,必须在对象创建时指定。

在对象创建之后,只有 CKA_AC_ISSUER, CKA_SERIAL_NUMBER ,CKA_ATTR_TYPES属性可以修改。

不存在基础的密钥对象,而是根据密钥类型来区分定义了 CKO_PUBLIC_KEY, CKO_PRIVATE_KEY 和CKO_SECRET_KEY三种密钥对象。

密钥对象存储加密或认证密钥,可以是公钥、私钥、加密密钥。

以下是一些公共的密钥对象属性。

 

 

 

 CKA_KEY_TYPE

 CK_KEY_TYPE 

 KEY类型。

C_CreateObject创建对象时指定。

 CKA_ID

  Byte array

 密钥ID,默认为空。

对象创建后可以通过属性设置接口函数或者在拷贝对象过程中修改。

有的令牌可能不支持拷贝中修改。

公私钥对的ID应该相同。如果有对应证书,证书中的ID也要相同。

对于加密密钥,该属性的含义取决于应用。

 CKA_START_DATE

 CK_DATE 

 开始日期,默认为空。

对象创建后可以通过属性设置接口函数或者在拷贝对象过程中修改。

有的令牌可能不支持拷贝中修改。

 CKA_END_DATE

 CK_DATE 

 结束日期,默认为空。

对象创建后可以通过属性设置接口函数或者在拷贝对象过程中修改。

有的令牌可能不支持拷贝中修改。

 CKA_DERIVE

 CK_BBOOL 

 如果支持KEY派生则为CK_TRUE

对象创建后可以通过属性设置接口函数或者在拷贝对象过程中修改。

有的令牌可能不支持拷贝中修改。

 CKA_LOCAL

 CK_BBOOL 

 仅当密钥

•通过C_GenerateKey或C_GenerateKeyPair调用本地生成(即在令牌上生成)

•使用C_CopyObject接口创建一个CKA_LOCAL属性为CK_TRUE的密钥的副本时。

值为CK_TRUE.

用C_CreateObject、C_GenerateKey、C_GenerateKeyPair创建对象时不能指定。

C_UnwrapKey拆包时也不能指定。

 CKA_KEY_GEN_MECHANISM

 CK_MECHANISM_TYPE 

 生成密钥的机制标识。

用C_CreateObject、C_GenerateKey、C_GenerateKeyPair创建对象时不能指定。

C_UnwrapKey拆包时也不能指定。

仅当CKA_LOCAL为CK_TRUE时是合法值,

否则该属性值为CK_UNAVAILABLE_INFORMATION

 CKA_ALLOWED_MECHANISMS 

 CK_MECHANISM_TYPE_PTR类型的指针,

指向一个CK_MECHANISM_TYPE 类型的数组

 当前KEY能使用的一个机制列表。

列表中的机制数量是属性中的ulValueLen成员除以CK_MECHANISM_TYPE结构的大小。

对象类型为CKO_PUBLIC_KEY。除密钥对象的公共属性外,还有如下这些属性:

 

 

 

 CKA_SUBJECT

  Byte array

 密钥主体名称的DER编码。默认为空。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_ENCRYPT

 CK_BBOOL 

 如果密钥支持加密,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

 CKA_VERIFY

 CK_BBOOL 

 如果密钥支持验证,则为CK_TRUE,其中签名是数据的附录。

默认值由令牌定义,也许取决于其他属性值。

 CKA_VERIFY_RECOVER

 CK_BBOOL 

 如果密钥支持从签名恢复数据的验证,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

 CKA_WRAP

 CK_BBOOL 

 如果密钥支持打包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

 CKA_TRUSTED

 CK_BBOOL 

 对于创建密钥的应用来说,密钥是可信的。

打包密钥的CKA_WRAP_WITH_TRUSTED设置为CK_TRUE时,可用来打包密钥。

仅可以被SO用户设置为CK_TRUE。

 CKA_WRAP_TEMPLATE 

 CK_ATTRIBUTE_PTR 

 用来打包密钥。

与使用此打包密钥打包的任何密钥匹配的属性模板。

不匹配的密钥不能打包。

列表中的属性数量是属性中的ulValueLen成员除以CK_ATTRIBUTE的大小。

对象类型为CKO_PRIVATE_KEY,用来存储私钥对象。

 

 

 

 CKA_SUBJECT

 Byte array

 证书主体名称的DER编码。默认为空。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_SENSITIVE

 CK_BBOOL

 如果密钥是敏感的,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

一旦设置为CK_TRUE,属性变为只读,不能再修改。

 CKA_DECRYPT

 CK_BBOOL

 如果密钥支持解密,则为CK_TRUE

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_SIGN

 CK_BBOOL

 如果密钥支持签名,则为CK_TRUE,签名是数据附录。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_SIGN_RECOVER

 CK_BBOOL

 密钥支持签名且签名能够从数据中恢复,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_UNWRAP

 CK_BBOOL

 如果密钥支持拆包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_EXTRACTABLE

 CK_BBOOL

 如果密钥可提取和打包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

一旦设置为CK_FALSE,属性变为只读,不能再修改。

 CKA_ALWAYS_SENSITIVE

 CK_BBOOL

如果密钥始终将CKA_SENSITIVE属性设置为CK_TRUE时,该属性为CK_TRUE。

用C_CreateObject、C_GenerateKey、C_GenerateKeyPair创建对象时不能指定。

C_UnwrapKey拆包时也不能指定。

 CKA_NEVER_EXTRACTABLE

 CK_BBOOL

 当密钥始终未将CKA_EXTRACTABLE属性设置为CK_TRUE,则为CK_TRUE。 

 CKA_WRAP_WITH_TRUSTED

 CK_BBOOL

 如果密钥仅能被一个属性CKA_TRUSTED设置为CK_TRUE的打包密钥打包,则为CK_TRUE。

 CKA_UNWRAP_TEMPLATE 

 CK_ATTRIBUTE_PTR 

 用来解包密钥。

属性模板应用到任何使用此密钥解包的密钥上。

任何用户提供的模板都将在此模板之后应用,就像对象已经创建一样。

列表中的属性数量是属性中的ulValueLen成员除以CK_ATTRIBUTE的大小。

 CKA_ALWAYS_AUTHENTICATE

 CK_BBOOL

 默认为CK_FALSE。如果设置为TRUE,用户每次使用密钥必须提供PIN。

出于交互性的考虑,主体名和密钥ID应该与对应的证书和公钥中相同。

当CKA_SENSITIVE设置为CK_TRUE,或者CKA_EXTRACTABLE属性设置为CK_FALSE,私钥特定属性的明文不应该出现在令牌之外。

对象类型为CKO_SECRET_KEY,用来存储秘密密钥。

 

 

 

 CKA_SENSITIVE

 CK_BBOOL

 如果密钥是敏感的,则为CK_TRUE。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

一旦设置为CK_TRUE,属性变为只读,不能再修改。

 CKA_ENCRYPT8

 CK_BBOOL 

 如果密钥支持加密则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_DECRYPT8

 CK_BBOOL 

 如果密钥支持解密,则为CK_TRUE

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_SIGN8

 CK_BBOOL 

 如果密钥支持签名,则为CK_TRUE,签名是数据附录。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_VERIFY8

 CK_BBOOL 

 如果密钥支持验证,则为CK_TRUE,其中签名是数据的附录。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_WRAP8

 CK_BBOOL 

 如果密钥支持打包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

 CKA_UNWRAP8

 CK_BBOOL 

 如果密钥支持拆包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

 CKA_EXTRACTABLE8,12 

 CK_BBOOL 

  如果密钥可提取和打包,则为CK_TRUE。

默认值由令牌定义,也许取决于其他属性值。

对象创建后可以通过属性设置接口修改。

也可以在拷贝对象过程中修改,取决于具体的令牌。

一旦设置为CK_FALSE,属性变为只读,不能再修改。

 CKA_ALWAYS_SENSITIVE2,4,6 

 CK_BBOOL 

 如果密钥始终将CKA_SENSITIVE属性设置为CK_TRUE时,该属性为CK_TRUE。

用C_CreateObject、C_GenerateKey、C_GenerateKeyPair创建对象时不能指定。

C_UnwrapKey拆包时也不能指定。

 CKA_NEVER_EXTRACTABLE2,4,6

 CK_BBOOL 

 当密钥始终未将CKA_EXTRACTABLE属性设置为CK_TRUE,则为CK_TRUE。 

用C_CreateObject、C_GenerateKey、C_GenerateKeyPair创建对象时不能指定。

C_UnwrapKey拆包时也不能指定。

 CKA_CHECK_VALUE 

 Byte array

 密钥校验和

 CKA_WRAP_WITH_TRUSTED11 

 CK_BBOOL 

 如果密钥仅能被一个属性CKA_TRUSTED设置为CK_TRUE的打包密钥打包,则为CK_TRUE。

默认为CK_FALSE。

一旦设置为CK_TRUE,则不能再修改。

 CKA_TRUSTED10 

 CK_BBOOL 

 打包KEY可用于打包CKA_WRAP_WITH_TRUSTED 属性设置为CK_TRUE。

仅能被SO用户设置为CK_TRUE。

 CKA_WRAP_TEMPLATE 

 CK_ATTRIBUTE_PTR 

 用来打包密钥。

与使用此打包密钥打包的任何密钥匹配的属性模板。

不匹配的密钥不能打包。

列表中的属性数量是属性中的ulValueLen成员除以CK_ATTRIBUTE的大小。

 CKA_UNWRAP_TEMPLATE 

 CK_ATTRIBUTE_PTR 

 用来解包密钥。

属性模板应用到任何使用此密钥解包的密钥上。

任何用户提供的模板都将在此模板之后应用,就像对象已经创建一样。

列表中的属性数量是属性中的ulValueLen成员除以CK_ATTRIBUTE的大小。

当CKA_SENSITIVE设置为CK_TRUE,或者CKA_EXTRACTABLE属性设置为CK_FALSE,私钥特定属性的明文不应该出现在令牌之外。

要调用的对称密钥对象的密钥检查值(KCV)属性CKA_CHECK_VALUE,类型为字节数组,长度为3字节,操作类似于指纹,或密钥的校验和。

它们针对共享同一密钥的其他系统的对称密钥进行交叉检查,并作为手动操作后的有效性检查密钥输入或从备份还原。

对象类型CKO_DOMAIN_PARAMETERS,用来存储公共域参数对象。

此对象类是为了支持存储某些特定算法的扩展参数。DSA和DH都在密钥对生成步骤中使用域参数。

要使用域参数对象,必须将属性提取到模板中,然后将它们(仍在模板中)提供给相应的密钥对生成函数。

 

 

 

 CKA_KEY_TYPE

 CK_KEY_TYPE

 需要使用域参数来生成密钥的密钥类型。

必须在创建对象时指定。

 CKA_LOCAL2,4

 CK_BBOOL

 CK_TRUE仅当域参数

•本地(即在令牌上)用C_GenerateKey生成。

•使用C_CopyObject调用创建

一个CKA_LOCAL属性为CK_TRUE域参数对象的副本。

使用C_CreateObject、C_GenerateKey或者C_GenerateKeyPair创建时不能指定值。

对象类型为CKO_MECHANISM,提供设备支持的机制信息。

使用C_FindObjectsInit和C_FindObjects搜索对象时,除非模板中的CKA_CLASS属性具有CKO_MECHANISM值,机制对象不会返回。

 

 

 

 CKA_MECHANISM_TYPE

 CK_MECHANISM_TYPE 机制对象类型

未完待续......

 

标签: hsm数显温度变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台