PKCS # 11 развернуть закрытый ключ к HSM - PullRequest
0 голосов
/ 12 декабря 2018

Я узнал, что я не могу просто передать закрытый ключ на мой HSM через PKCS # 11, мне нужно сначала обернуть его, а затем развернуть на HSM.Поэтому я временно создаю ключ DES3 на нашем HSM, затем я хочу обернуть (зашифровать) свой закрытый ключ RSA, затем хочу развернуть его на HSM.

Мой код выглядит следующим образом:

    // Create temporary DES3 key for wrapping/unwrapping
    var tempKeyAttributes = new List<ObjectAttribute>();
    tempKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
    tempKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3));
    tempKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true));
    tempKeyAttributes.Add(new ObjectAttribute(CKA.CKA_UNWRAP, true));
    var tempKey = session.GenerateKey(new Mechanism(CKM.CKM_DES3_KEY_GEN), tempKeyAttributes);

    // Encrypt (wrap) the RSA private key
    var encryptedPrivateKeyParamsD = session.Encrypt(new Mechanism(CKM.CKM_DES3_ECB), tempKey, privateKeyParams.D);

    // Define how the new RSA private key should look like on the HSM
    var privateKeyAttributes = new List<ObjectAttribute>();
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
    privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
    [...]

    // Unwrap the private key onto the HSM
    var privateKeyHandle = session.UnwrapKey(new Mechanism(CKM.CKM_DES3_ECB), tempKey, encryptedPrivateKeyParamsD, privateKeyAttributes);

Это не работает, оно не работает с CKR_INVALID_MECHANISM.

Я почти уверен, что проблема в encryptedPrivateKeyParamsD, вместо этого я должен каким-то образом зашифровать весь ключ.Но как?Какой правильный формат?Я не могу найти в документации ничего по этому поводу: - (

Есть идеи, как это исправить? Я просто хочу программно поместить существующий закрытый ключ RSA в наш HSM, используя PKCS # 11.

1 Ответ

0 голосов
/ 13 декабря 2018

Я нашел ответ: формат, который должен использоваться в SafeNet Luna HSM, - это PKCS # 8 в двоичном кодировании DER.Я использовал BouncyCastle, чтобы привести мои входные данные в правильный формат:

var unencryptedPrivateKey = PrivateKeyInfoFactory.CreatePrivateKeyInfo(
        new RsaPrivateCrtKeyParameters(
            new BigInteger(1, privateKeyParams.Modulus),
            new BigInteger(1, privateKeyParams.Exponent),
            new BigInteger(1, privateKeyParams.D),
            new BigInteger(1, privateKeyParams.P),
            new BigInteger(1, privateKeyParams.Q),
            new BigInteger(1, privateKeyParams.DP),
            new BigInteger(1, privateKeyParams.DQ),
            new BigInteger(1, privateKeyParams.InverseQ))).GetEncoded();

var result = new MemoryStream();
session.Encrypt(new Mechanism(CKM.CKM_DES3_CBC_PAD, iv), tempKey, new MemoryStream(unencryptedPrivateKey), result);
var encryptedPrivateKey = result.ToArray();

[...]

var privateKeyHandle = session.UnwrapKey(new Mechanism(CKM.CKM_DES3_CBC_PAD, iv), tempKey, encryptedPrivateKey, privateKeyAttributes);
...