do sunpkcs11 поддерживает атрибут CK_sensitive для производного ключа с использованием ECDH

Я пытаюсь создать общий секрет через ECDH, используя SUNpkcs11 с определенными атрибутами:

CKA_TOKEN= false
CKA_SENSITIVE=true
CKA_EXTRACTABLE=true"
CKA_ENCRYPT=true"

В то время как для моего базового ключа CKA_DERIVE, SENSITIVE и т. Д. Установлено значение true, но при этом возникает ошибка с несогласованным шаблоном:

Performing ECDH key agreement
java.security.ProviderException: Could not derive key
    at sun.security.pkcs11.P11ECDHKeyAgreement.engineGenerateSecret(P11ECDHKeyAgreement.java:144)
    at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:586)

Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_ATTRIBUTE_SENSITIVE
    at sun.security.pkcs11.wrapper.PKCS11.C_GetAttributeValue(Native Method)
    at sun.security.pkcs11.P11ECDHKeyAgreement.engineGenerateSecret(P11ECDHKeyAgreement.java:139)

В то время как ключи ECC предварительно генерируются с помощью HSM.


person Zach    schedule 02.08.2018    source источник


Ответы (1)


Класс SunPKCS11 P11ECDHKeyAgreement всегда хочет вернуть байты производного общего секрета как результат метода generateSecret (). Для этого производный секрет должен быть помечен как нечувствительный и извлекаемый, иначе HSM откажется раскрыть необработанные байты. Это то, что означает сообщение об ошибке CKR_ATTRIBUTE_SENSITIVE - Java попыталась получить доступ к необработанным байтам производного ключа, но он помечен как конфиденциальный.

Класс Java KeyAgreement поддерживает версия generateSecret (), которая вернет Key объект, но вы должны передать строку алгоритма "TlsPremasterSecret" (все остальное будет отклонено классом P11ECDHKeyAgreement). Это, как правило, не позволяет использовать ключ, поскольку он будет отклонен из-за неправильного алгоритма, когда вы попытаетесь его использовать. (Не говоря уже о том, что этот ключ является необработанным общим секретом, который действительно должен быть передан через KDF / хэш перед использованием в качестве криптографического ключа).

Так что на самом деле ваш единственный вариант - пометить производные ключи как нечувствительные и извлекаемые, добавив в файл конфигурации PKCS # 11 строки, подобные приведенным ниже:

attributes(generate,CKO_SECRET_KEY,CKK_GENERIC_SECRET) = {
  CKA_SENSITIVE = false
  CKA_EXTRACTABLE = true
}
person Neil Madden    schedule 16.04.2019