/// <summary>
/// Obtains a list of all PKCS#11 URI matching slots
/// </summary>
/// <param name="pkcs11Uri">PKCS#11 URI</param>
/// <param name="pkcs11">High level PKCS#11 wrapper</param>
/// <param name="tokenPresent">Flag indicating whether the list obtained includes only those slots with a token present (true), or all slots (false)</param>
/// <returns>List of slots matching PKCS#11 URI</returns>
public static List <Slot> GetMatchingSlotList(Pkcs11Uri pkcs11Uri, Pkcs11 pkcs11, bool tokenPresent)
{
if (pkcs11Uri == null)
{
throw new ArgumentNullException("pkcs11Uri");
}
if (pkcs11 == null)
{
throw new ArgumentNullException("pkcs11");
}
List <Slot> matchingSlots = new List <Slot>();
LibraryInfo libraryInfo = pkcs11.GetInfo();
if (!Matches(pkcs11Uri, libraryInfo))
{
return(matchingSlots);
}
List <Slot> slots = pkcs11.GetSlotList(false);
if ((slots == null) || (slots.Count == 0))
{
return(slots);
}
foreach (Slot slot in slots)
{
SlotInfo slotInfo = slot.GetSlotInfo();
if (Matches(pkcs11Uri, slotInfo))
{
if (slotInfo.SlotFlags.TokenPresent)
{
TokenInfo tokenInfo = slot.GetTokenInfo();
if (Matches(pkcs11Uri, tokenInfo))
{
matchingSlots.Add(slot);
}
}
else
{
if (!tokenPresent && Pkcs11UriSharedUtils.Matches(pkcs11Uri, null, null, null, null))
{
matchingSlots.Add(slot);
}
}
}
}
return(matchingSlots);
}