PKCS#11 развернуть закрытый ключ к HSM
Я узнал, что я не могу просто передать закрытый ключ на мой 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 ответ
Я нашел ответ: формат, который должен использоваться в 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);