PyKCS11 unhashable list
Мой скрипт на python предназначен для получения подробной информации о слотах / токенах в конкретной библиотеке.so. Вывод выглядит так:
Library manufacturerID: Safenet, Inc.
Available Slots: 4
Slot no: 0
slotDescription: ProtectServer K5E:00045
manufacturerID: SafeNet Inc.
TokenInfo
label: CKM
manufacturerID: SafeNet Inc.
model: K5E:PL25
Opened session 0x00000002
Found 38 objects: [5021, 5022, 5014, 5016, 4, 5, 6, 7, 8, 9, 16, 18, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 5313, 5314, 4982, 5325, 5326, 5328, 5329, 5331, 5332, 5335, 5018, 4962, 5020, 4963]
Я могу открыть сессию и получить информацию. Где я сталкиваюсь с сомнительными проблемами, это получение атрибутов указанных ключей в библиотеке.
Я создал свой собственный шаблон для желаемых атрибутов, необходимых для моих спецификаций, а именно:
all_attributes = PyKCS11.CKA.keys()
# only use the integer values and not the strings like 'CKM_RSA_PKCS'
all_attributes = [e for e in all_attributes if isinstance(e, int)]
attributes = [
["CKA_ENCRYPT", PyKCS11.CKA_ENCRYPT],
["CKA_CLASS", PyKCS11.CKA_CLASS],
["CKA_DECRYPT", PyKCS11.CKA_DECRYPT],
["CKA_SIGN", PyKCS11.CKA_SIGN],
["CKA_VERIFY", PyKCS11.CKA_VERIFY],
["CKA_ID", PyKCS11.CKA_ID],
["CKA_MODULUS", PyKCS11.CKA_MODULUS],
["CKA_MODULUS", PyKCS11.CKA_MODULUS],
["CKA_MODULUS_BITS", PyKCS11.CKA_MODULUS_BITS],
["CKA_PUBLIC_EXPONENT", PyKCS11.CKA_PUBLIC_EXPONENT],
["CKA_PRIVATE_EXPONENT", PyKCS11.CKA_PRIVATE_EXPONENT],
]
Я получаю непредсказуемый тип: 'list' TypeError при попытке вывести атрибуты на следующий блок:
print "Dumping attributes:"
for q, a in zip(all_attributes, attributes):
if a == None:
# undefined (CKR_ATTRIBUTE_TYPE_INVALID) attribute
continue
if q == PyKCS11.CKA_CLASS:
print format_long % (PyKCS11.CKA[q], PyKCS11.CKO[a], a)
elif q == PyKCS11.CKA_CERTIFICATE_TYPE:
print format_long % (PyKCS11.CKA[q], PyKCS11.CKC[a], a)
elif q == PyKCS11.CKA_KEY_TYPE:
print format_long % (PyKCS11.CKA[q], PyKCS11.CKK[a], a)
elif session.isBin(q):
print format_binary % (PyKCS11.CKA[q], len(a))
if a:
print dump(''.join(map(chr, a)), 16),
elif q == PyKCS11.CKA_SERIAL_NUMBER:
print format_binary % (PyKCS11.CKA[q], len(a))
if a:
print hexdump(a, 16),
else:
print format_normal % (PyKCS11.CKA[q], a)
Эта строка специально генерирует ошибку:
if q == PyKCS11.CKA_CLASS:
print format_long % (PyKCS11.CKA[q], PyKCS11.CKO[a], a)
Я понимаю, что вы не можете использовать список в качестве ключа в dict, так как ключи dict должны быть неизменяемыми. Как бы я использовал кортеж в этой ситуации?
1 ответ
(Этот ответ был составлен в контексте ваших других вопросов)
Чтобы прочитать атрибуты объекта PKCS#11 o
Вы можете использовать следующий код:
# List which attributes you want to read
attributeIds = [
CKA_ENCRYPT,
CKA_CLASS,
CKA_DECRYPT,
CKA_SIGN,
CKA_VERIFY,
CKA_ID,
CKA_MODULUS,
CKA_MODULUS_BITS,
CKA_PUBLIC_EXPONENT,
CKA_PRIVATE_EXPONENT
]
# Read them
attributeValues = session.getAttributeValue(o, attributeIds)
# Print them (variant 1 -- more readable)
for i in range(0,len(attributeIds)):
attributeName = CKA[attributeIds[i]]
print("Attribute %s: %s" % (attributeName, attributeValues[i]))
# Print them (variant 2 -- more consise)
for curAttrId, currAttrVale in zip(attributeIds,attributeValues):
attributeName = CKA[curAttrId]
print("Attribute %s: %s" % (attributeName, currAttrVale))
Некоторые дополнительные (случайные) заметки:
метод метода Session.getAttributeValue() требует список идентификаторов атрибутов. Вы создаете список "списков, содержащих имя атрибута (строку) и идентификатор атрибута (int) " - без преобразования - это не может работать
CKA_PRIVATE_EXPONENT
Атрибут чувствителен для закрытых ключей RSA. Вы, вероятно, не сможете прочитать его, еслиCKA_SENSITIVE
атрибут установлен вFalse
(см., например, здесь)обязательно читайте только допустимые атрибуты для конкретного объекта (в зависимости от типа, механизма, чувствительности...)
фрагмент выше не использует
PyKCS11.
префикс для ссылки на члены объекта PyKCS11, так как предполагается, что они импортированы сfrom PyKCS11 import *
директива (я не достаточно в Python, чтобы сказать вам, какой путь лучше)Атрибут id <-> Отображение имени атрибута основано на том факте, что
PKCS11.CKA
словарь содержит как строковые ключи со значениями int, так и int-ключи со строковыми ключами (вы можете сбросить этот словарь самостоятельно или проверить исходный код)может быть гораздо проще сбросить атрибуты с
print(o)
Я бы порекомендовал прочитать соответствующие части стандарта PKCS#11
(вы могли бы получить свой ответ быстрее, если бы вы указали источник ваших мыслей)
Удачи!