智能卡PKCS11 AES密钥生成失败

艾伦·CR

我试图在python中使用PKCS11(使用PyKCS11库)在ACOS5-64智能卡和OMNIKEY 3121读卡器上创建AES 256密钥。到目前为止,所有“标准”操作似乎都适用于非对称加密。我已经运行了很多代码示例和pkcs11-tool命令,以初始化令牌,设置/更改PIN,创建RSA密钥对等。因此,驱动程序都具有功能(pcscd,CCID,PKCS11中间件)。

以下代码导致了问题:

from PyKCS11 import *
import getpass
libacospkcs = '/usr/lib/libacospkcs11.so'

def createTokenAES256(lbl):
   pkcs11 = PyKCS11Lib()
   pkcs11.load(libacospkcs)
   theOnlySlot = pkcs11.getSlotList()[0]
   session = pkcs11.openSession(theOnlySlot, CKF_SERIAL_SESSION | CKF_RW_SESSION)
   PIN = getpass.getpass('Enter User PIN to login:')
   session.login(PIN)

   t = pkcs11.getTokenInfo(theOnlySlot)
   print t.label
   print t.model
   print t.serialNumber

   template = (
      (CKA_CLASS, CKO_SECRET_KEY),
      (CKA_KEY_TYPE, CKK_AES),
      (CKA_VALUE_LEN, 32),
      (CKA_LABEL, "A"),
      (CKA_PRIVATE, True),
      (CKA_SENSITIVE, True),
      (CKA_ENCRYPT, True),
      (CKA_DECRYPT, True),
      (CKA_TOKEN, True),
      (CKA_WRAP, True),
      (CKA_UNWRAP, True),
      (CKA_EXTRACTABLE, False))
   ckattr = session._template2ckattrlist(template)
   m = LowLevel.CK_MECHANISM()
   m.mechanism = LowLevel.CKM_AES_KEY_GEN

   key = LowLevel.CK_OBJECT_HANDLE()
   returnValue = pkcs11.lib.C_GenerateKey( session.session, m, ckattr, key)

   if returnValue != CKR_OK:
      raise PyKCS11Error(returnValue)

# Now run the method to create the key
createTokenAES256('TestAESKey')

但是,运行它时出现错误:

~/projects/smartcard $ python testpkcs11again.py 
Enter User PIN to login:
Token #A                        
ACOS5-64        
30A740C8704A
Traceback (most recent call last):
  File "testcreateaes.py", line 43, in <module>
    createTokenAES256('TestAESKey')
  File "testcreateaes.py", line 40, in createTokenAES256
    raise PyKCS11Error(returnValue)
PyKCS11.PyKCS11Error: CKR_ATTRIBUTE_VALUE_INVALID (0x00000013)

关键是,如果我将CKA_TOKEN行切换为False,则它“有效”。当然,通过将其设置为false,它将使密钥成为会话对象,而不是令牌对象(即,我注销后,将擦除密钥)。将pkcs11-tool与--list-objects一起使用时,密钥不存在。我可以使用ACSCMU​​(令牌管理的GUI工具),也可以在“秘钥管理器”中创建AES密钥,并且确实创建了永久密钥。但是我无法看到ACSCMU​​正在做什么以使其持久化(它可能根本没有使用PKCS11)。

如果我不得不猜出问题,那可能与会话有关。如果CKA_TOKEN = True无效,则似乎令牌实际上不在RW模式中(如第9行的CKF_RW_SESSION所建议)。到目前为止,我不确定还可以尝试什么或如何调试它。

艾伦·CR

在大量的示例中,我自己弄清楚了它:如果要创建一个持久性(CKA_TOKEN = True)对象,则CKA_ID是必填属性。不知道我应该怎么知道(从来没有在任何文档中看到过),但是在我添加了它之后,确实可以很好地工作。

如果您正确设置了驱动程序,则此代码应该可以工作:

from PyKCS11 import *
import getpass
libacospkcs = '/usr/lib/libacospkcs11.so'

def createTokenAES256(label):
   pkcs11 = PyKCS11Lib()
   pkcs11.load(libacospkcs)
   theOnlySlot = pkcs11.getSlotList()[0]
   session = pkcs11.openSession(theOnlySlot, CKF_SERIAL_SESSION | CKF_RW_SESSION)
   PIN = getpass.getpass('Enter User PIN to login:')
   session.login(PIN)

   print pkcs11.getTokenInfo(theOnlySlot)

   template = (
      (CKA_CLASS, CKO_SECRET_KEY),
      (CKA_KEY_TYPE, CKK_AES),
      (CKA_VALUE_LEN, 32),
      (CKA_LABEL, label),
      (CKA_ID, "1244"),
      (CKA_PRIVATE, True),
      (CKA_SENSITIVE, True),
      (CKA_ENCRYPT, True),
      (CKA_DECRYPT, True),
      (CKA_TOKEN, True),
      (CKA_WRAP, True),
      (CKA_UNWRAP, True),
      (CKA_EXTRACTABLE, False))
   ckattr = session._template2ckattrlist(template)
   m = LowLevel.CK_MECHANISM()
   m.mechanism = LowLevel.CKM_AES_KEY_GEN

   key = LowLevel.CK_OBJECT_HANDLE()
   returnValue = pkcs11.lib.C_GenerateKey( session.session, m, ckattr, key)

   if returnValue != CKR_OK:
      raise PyKCS11Error(returnValue)

# Now execute the above to create AES256 key
createTokenAES256('TestKey')

之后,我可以注销卡并使用pkcs11-tool看到新对象:

$ pkcs11-tool --module=/usr/lib/libacospkcs11.so --list-objects
Using slot 0 with a present token (0x0)
Secret Key Object; unknown key algorithm 31
  label:      TestKey
  ID:         31323434
  Usage:      encrypt, decrypt, wrap, unwrap, derive

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用智能卡和PKCS#11重用现有私钥以生成数字签名

来自分类Dev

从没有密码/密码的PKCS11智能卡中获取证书

来自分类Dev

如何使用存储在智能卡中的密钥生成CSR

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

PGP密钥:长度,多个身份,智能卡

来自分类Dev

智能卡 Mifare 1k 密钥

来自分类Dev

使用pkcs11模块使用公共密钥加密数据失败

来自分类Dev

PKCS11:导出不敏感的可提取密钥

来自分类Dev

PKCS11:导出不敏感且可提取的密钥

来自分类Dev

使用Java keytool的PKCS11格式密钥

来自分类Dev

使用pkcs#11从智能卡读取文本文件

来自分类Dev

通过IAIK PKCS#11包装器生成AES密钥并显示其值

来自分类Dev

如何在Dart中使用PKCS5填充密钥生成256-AES CBC密钥

来自分类Dev

Java SSL客户端未选择智能卡密钥

来自分类Dev

Java SSL客户端未选择智能卡密钥

来自分类Dev

为什么gpg无法从我的智能卡中提取密钥存根?

来自分类Dev

PKCS11将私有RSA密钥解包到eToken HSM

来自分类Dev

在java.security.KeyStore PKCS11中设置并获取DES密钥

来自分类Dev

智能卡发行

来自分类Dev

Android AES / ECB / PKCS7PADDING生成密钥弹力城堡

来自分类Dev

AES 轮密钥生成

来自分类Dev

智能卡CMS解密

来自分类Dev

智能卡相互认证

来自分类Dev

智能卡访问速度

来自分类Dev

读取智能卡的UID

来自分类Dev

由于生成了RSA密钥对,因此安装Java卡小程序失败

来自分类Dev

使用智能卡时,GnuPG无法找到用于签名的默认密钥,但我只有一个。我究竟做错了什么?

来自分类Dev

PKCS11命令流