using System.Collections.Generic;
using NUnit.Framework;
namespace Net.Pkcs11Interop.Tests.HighLevelAPI
{
public static class Helpers
{
public static ISlot GetUsableSlot(IPkcs11Library pkcs11Library)
{
List<ISlot> slots = pkcs11Library.GetSlotList(
SlotsType.WithTokenPresent);
Assert.IsNotNull(slots);
Assert.IsTrue(slots.Count > 0);
ISlot matchingSlot = slots[0];
if (Settings.TokenSerial != null || Settings.TokenLabel != null)
{
matchingSlot = null;
foreach (ISlot slot in slots)
{
ITokenInfo tokenInfo = null;
try
{
tokenInfo = slot.GetTokenInfo();
}
catch (Pkcs11Exception ex)
{
if (ex.RV !=
CKR.CKR_TOKEN_NOT_RECOGNIZED && ex.RV !=
CKR.CKR_TOKEN_NOT_PRESENT)
throw;
}
if (tokenInfo == null)
continue;
if (!string.IsNullOrEmpty(Settings.TokenSerial))
if (0 != string.Compare(Settings.TokenSerial, tokenInfo.SerialNumber, StringComparison.Ordinal))
continue;
if (!string.IsNullOrEmpty(Settings.TokenLabel))
if (0 != string.Compare(Settings.TokenLabel, tokenInfo.Label, StringComparison.Ordinal))
continue;
matchingSlot = slot;
break;
}
}
Assert.IsTrue(matchingSlot != null, "Token matching criteria specified in Settings class is not present");
return matchingSlot;
}
public static IObjectHandle CreateDataObject(ISession session)
{
List<IObjectAttribute> objectAttributes = new List<IObjectAttribute>();
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_CLASS,
CKO.CKO_DATA));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_TOKEN,
true));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_APPLICATION, Settings.ApplicationName));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_LABEL, Settings.ApplicationName));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_VALUE,
"Data object content"));
return session.CreateObject(objectAttributes);
}
public static IObjectHandle GenerateKey(ISession session)
{
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));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_DERIVE,
true));
objectAttributes.Add(session.Factories.ObjectAttributeFactory.Create(
CKA.CKA_EXTRACTABLE,
true));
IMechanism mechanism = session.Factories.MechanismFactory.Create(
CKM.CKM_DES3_KEY_GEN);
return session.GenerateKey(mechanism, objectAttributes);
}
public static void GenerateKeyPair(ISession session, out IObjectHandle publicKeyHandle, out IObjectHandle privateKeyHandle)
{
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);
session.GenerateKeyPair(mechanism, publicKeyAttributes, privateKeyAttributes, out publicKeyHandle, out privateKeyHandle);
}
}
}