【问题标题】:How to generate key in HSM with IAIK PKCS11 library如何使用 IAIK PKCS11 库在 HSM 中生成密钥
【发布时间】:2021-10-25 22:27:31
【问题描述】:

我正在使用 IAIK 包装器将 pkcs11 请求发送到我的 Bull HSM。我的目标是生成一致的密钥(token = true)。问题是我总是有这个错误代码:

Exception in thread "main" iaik.pkcs.pkcs11.wrapper.PKCS11Exception: CKR_ATTRIBUTE_READ_ONLY

我不明白为什么它是只读的?为了初始化我的会话,我这样做(使用 RW_SESSION 选项):

import iaik.pkcs.pkcs11.Mechanism;
import iaik.pkcs.pkcs11.Module;
import iaik.pkcs.pkcs11.Session;
import iaik.pkcs.pkcs11.Token;
import iaik.pkcs.pkcs11.TokenException;
import iaik.pkcs.pkcs11.objects.AESSecretKey;
import iaik.pkcs.pkcs11.wrapper.PKCS11Constants;

...

static String libP11 = "nethsm.dll";
static String hsmPassword = "123456";
static int hsmSlotId = 1;

private static void initHSM() throws IOException, TokenException{
    Module module = Module.getInstance(libP11);
    module.initialize(null);
    Token token = module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT)[hsmSlotId - 1].getToken();
    session = token.openSession(Token.SessionType.SERIAL_SESSION, Token.SessionReadWriteBehavior.RW_SESSION, null,
                null);

    session.login(Session.UserType.USER, hsmPassword.toCharArray());

}

我生成密钥的功能如下:

private static AESSecretKey generateAESKey(byte[] keyValue, String label, int keyLength, boolean token) throws TokenException {
    Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_AES_KEY_GEN);

    AESSecretKey secretKeyTemplate = new AESSecretKey();
    secretKeyTemplate.getValueLen().setLongValue(new Long(keyLength));
    secretKeyTemplate.getLabel().setCharArrayValue(label.toCharArray());
    secretKeyTemplate.getToken().setBooleanValue(token);
    secretKeyTemplate.getSensitive().setBooleanValue(Boolean.FALSE);
    secretKeyTemplate.getExtractable().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getDerive().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getModifiable().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getEncrypt().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getDecrypt().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getUnwrap().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getWrap().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
    secretKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);

    secretKeyTemplate.getValue().setByteArrayValue(keyValue);

    return (AESSecretKey) session.generateKey(keyGenerationMechanism, secretKeyTemplate);
}

请问有什么解决办法吗?

【问题讨论】:

  • 您不应直接调用 IAIK 代码。整个想法是它是一个位于 Java API 接口后面的 PKCS#11 提供程序。您应该调用 Java API。这样做的另一个好处是您会更容易找到工作示例。
  • 据我所知,sensitiveextractable 可能是您出错的原因。尝试将它们从模板中排除,然后重试。

标签: java pkcs#11 hsm iaik-jce


【解决方案1】:

使用没有意义:

secretKeyTemplate.getValue().setByteArrayValue(keyValue)

生成新密钥的同时设置密钥值(PKCS#11 中的CKA_VALUE) -- HSM 将为您生成密钥值。删除此行。


注意:如果您想创建具有给定值的键,请尝试使用C_CreateObject(IAIK Wrapper 中的Session.createObject)——但并非所有 HSM 都支持这种方式。如果您无法使用此方法创建具有已知值的密钥,则必须使用C_UnwrapKey 导入通常有效的加密密钥值。

祝你的项目好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多