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

  • (вы могли бы получить свой ответ быстрее, если бы вы указали источник ваших мыслей)

Удачи!

Другие вопросы по тегам