using System.Collections.Generic;
using NUnit.Framework;
namespace Net.Pkcs11Interop.Tests.HighLevelAPI
{
[TestFixture()]
public class _18_GenerateKeyAndKeyPairTest
{
[Test()]
public void _01_GenerateKeyTest()
{
using (IPkcs11Library pkcs11Library = Settings.Factories.Pkcs11LibraryFactory.LoadPkcs11Library(Settings.Factories, Settings.Pkcs11LibraryPath, Settings.AppType))
{
ISlot slot = Helpers.GetUsableSlot(pkcs11Library);
using (ISession session = slot.OpenSession(
SessionType.ReadWrite))
{
session.Login(
CKU.CKU_USER, Settings.NormalUserPin);
List<IObjectAttribute> objectAttributes = new List<IObjectAttribute>();
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_CLASS,
CKO.CKO_SECRET_KEY));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_KEY_TYPE,
CKK.CKK_DES3));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_ENCRYPT,
true));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_DECRYPT,
true));
IMechanism mechanism = session.Factories.MechanismFactory.Create(
CKM.CKM_DES3_KEY_GEN);
IObjectHandle objectHandle = session.GenerateKey(mechanism, objectAttributes);
session.DestroyObject(objectHandle);
session.Logout();
}
}
}
[Test()]
public void _02_GenerateKeyPairTest()
{
using (IPkcs11Library pkcs11Library = Settings.Factories.Pkcs11LibraryFactory.LoadPkcs11Library(Settings.Factories, Settings.Pkcs11LibraryPath, Settings.AppType))
{
ISlot slot = Helpers.GetUsableSlot(pkcs11Library);
using (ISession session = slot.OpenSession(
SessionType.ReadWrite))
{
session.Login(
CKU.CKU_USER, Settings.NormalUserPin);
byte[] ckaId = session.GenerateRandom(20);
List<IObjectAttribute> publicKeyAttributes = new List<IObjectAttribute>();
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_TOKEN,
true));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_PRIVATE,
false));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_LABEL, Settings.ApplicationName));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_ID, ckaId));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_ENCRYPT,
true));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_VERIFY,
true));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_VERIFY_RECOVER,
true));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_WRAP,
true));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_MODULUS_BITS, 1024));
publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_PUBLIC_EXPONENT,
new byte[] { 0x01, 0x00, 0x01 }));
List<IObjectAttribute> privateKeyAttributes = new List<IObjectAttribute>();
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_TOKEN,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_PRIVATE,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_LABEL, Settings.ApplicationName));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_ID, ckaId));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_SENSITIVE,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_DECRYPT,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_SIGN,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_SIGN_RECOVER,
true));
privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_UNWRAP,
true));
IMechanism mechanism = session.Factories.MechanismFactory.Create(
CKM.CKM_RSA_PKCS_KEY_PAIR_GEN);
IObjectHandle publicKeyHandle = null;
IObjectHandle privateKeyHandle = null;
session.GenerateKeyPair(mechanism, publicKeyAttributes, privateKeyAttributes, out publicKeyHandle, out privateKeyHandle);
session.DestroyObject(privateKeyHandle);
session.DestroyObject(publicKeyHandle);
session.Logout();
}
}
}
}
}