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.
0 ответов
SunPKCS11 P11ECDHKeyAgreement
Класс всегда хочет вернуть байты производного общего секрета как результат метода generateSecret(). Для этого полученный секрет должен быть помечен как нечувствительный и извлекаемый, иначе HSM откажется раскрывать необработанные байты. Это то, что CKR_ATTRIBUTE_SENSITIVE
сообщение об ошибке означает - Java пыталась получить доступ к необработанным байтам производного ключа, но он помечен как конфиденциальный.
Ява KeyAgreement
класс поддерживает версию generateSecret(), которая будет возвращать Key
объект, но вы должны передать строку алгоритма "TlsPremasterSecret"
(все остальное будет отклонено классом P11ECDHKeyAgreement). Как правило, этот ключ перестает быть полезным, поскольку он будет отклонен из-за неправильного алгоритма при попытке его использования. (Не говоря уже о том, что этот ключ является необработанным общим секретом, который действительно должен быть передан через KDF/ хеш, прежде чем использоваться в качестве криптографического ключа).
Так что на самом деле ваш единственный вариант - пометить производные ключи как нечувствительные и извлекаемые, добавив в файл конфигурации PKCS#11 такие строки:
attributes(generate,CKO_SECRET_KEY,CKK_GENERIC_SECRET) = {
CKA_SENSITIVE = false
CKA_EXTRACTABLE = true
}