sunpkcs11是否使用ECDH为派生密钥支持CK_sensitive属性

时间:2018-08-02 23:59:05

标签: java pkcs#11 hsm ecdh sunpkcs11

我正在尝试使用具有某些属性的SUNpkcs11通过ECDH生成共享机密:

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预先生成的。

1 个答案:

答案 0 :(得分:0)

SunPKCS11 P11ECDHKeyAgreement类始终希望返回派生共享机密的字节,作为generateSecret()方法的结果。为此,必须将派生的机密标记为不敏感且可提取,否则HSM将拒绝透露原始字节。这就是CKR_ATTRIBUTE_SENSITIVE错误消息的含义-Java试图访问派生密钥的原始字节,但是将其标记为敏感。

Java KeyAgreement类确实支持version of generateSecret() that will return a Key object,但是您必须传递算法字符串"TlsPremasterSecret"(P11ECDHKeyAgreement类将拒绝任何其他内容)。通常,这将使密钥不再有用,因为当您尝试使用它时,由于算法错误而将其拒绝。 (更不用说此密钥是原始共享密钥,在用作加密密钥之前,应将其真正通过KDF /哈希传递)。

因此,实际上,您唯一的选择是通过在PKCS#11配置文件中添加以下内容,将派生键标记为不敏感且可提取:

attributes(generate,CKO_SECRET_KEY,CKK_GENERIC_SECRET) = {
  CKA_SENSITIVE = false
  CKA_EXTRACTABLE = true
}