/// <summary> /// Obtains information about a particular slot in the system /// </summary> /// <returns>Slot information</returns> public SlotInfo GetSlotInfo() { CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); CKR rv = _p11.C_GetSlotInfo(_slotId, ref slotInfo); if (rv != CKR.CKR_OK) throw new Pkcs11Exception("C_GetSlotInfo", rv); return new SlotInfo(_slotId, slotInfo); }
/// <summary> /// Checks whether slot information matches PKCS#11 URI /// </summary> /// <param name="pkcs11Uri">PKCS#11 URI</param> /// <param name="slotInfo">Slot information</param> /// <param name="slotId">Slot identifier</param> /// <returns>True if slot information matches PKCS#11 URI</returns> public static bool Matches(Pkcs11Uri pkcs11Uri, CK_SLOT_INFO slotInfo, uint? slotId) { if (pkcs11Uri == null) throw new ArgumentNullException("pkcs11Uri"); string manufacturer = ConvertUtils.BytesToUtf8String(slotInfo.ManufacturerId, true); string description = ConvertUtils.BytesToUtf8String(slotInfo.SlotDescription, true); return Pkcs11UriSharedUtils.Matches(pkcs11Uri, manufacturer, description, slotId); }
internal static extern CKR C_GetSlotInfo(uint slotId, ref CK_SLOT_INFO info);
public void _06_GetMatchingSlotList() { if (Platform.UnmanagedLongSize != 4 || Platform.StructPackingSize != 1) Assert.Inconclusive("Test cannot be executed on this platform"); using (Pkcs11 pkcs11 = new Pkcs11(Settings.Pkcs11LibraryPath, Settings.UseOsLocking)) { CKR rv = pkcs11.C_Initialize(Settings.InitArgs41); Assert.IsTrue(rv == CKR.CKR_OK); // Get all slots uint allSlotsCount = 0; rv = pkcs11.C_GetSlotList(true, null, ref allSlotsCount); Assert.IsTrue(rv == CKR.CKR_OK); Assert.IsTrue(allSlotsCount > 0); uint[] allSlots = new uint[allSlotsCount]; rv = pkcs11.C_GetSlotList(true, allSlots, ref allSlotsCount); Assert.IsTrue(rv == CKR.CKR_OK); // Empty URI Pkcs11Uri pkcs11uri = new Pkcs11Uri(@"pkcs11:"); uint[] matchedSlots = null; rv = Pkcs11UriUtils.GetMatchingSlotList(pkcs11uri, pkcs11, true, out matchedSlots); Assert.IsTrue(rv == CKR.CKR_OK); Assert.IsTrue(matchedSlots.Length == allSlots.Length); // Unknown path attribute in URI pkcs11uri = new Pkcs11Uri(@"pkcs11:vendor=foobar"); rv = Pkcs11UriUtils.GetMatchingSlotList(pkcs11uri, pkcs11, true, out matchedSlots); Assert.IsTrue(rv == CKR.CKR_OK); Assert.IsTrue(matchedSlots.Length == 0); // All attributes matching one slot CK_INFO libraryInfo = new CK_INFO(); rv = pkcs11.C_GetInfo(ref libraryInfo); Assert.IsTrue(rv == CKR.CKR_OK); CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); rv = pkcs11.C_GetSlotInfo(allSlots[0], ref slotInfo); Assert.IsTrue(rv == CKR.CKR_OK); CK_TOKEN_INFO tokenInfo = new CK_TOKEN_INFO(); rv = pkcs11.C_GetTokenInfo(allSlots[0], ref tokenInfo); Assert.IsTrue(rv == CKR.CKR_OK); Pkcs11UriBuilder pkcs11UriBuilder = new Pkcs11UriBuilder(); pkcs11UriBuilder.LibraryManufacturer = ConvertUtils.BytesToUtf8String(libraryInfo.ManufacturerId, true); pkcs11UriBuilder.LibraryDescription = ConvertUtils.BytesToUtf8String(libraryInfo.LibraryDescription, true); pkcs11UriBuilder.LibraryVersion = libraryInfo.LibraryVersion.ToString(); pkcs11UriBuilder.SlotManufacturer = ConvertUtils.BytesToUtf8String(slotInfo.ManufacturerId, true); pkcs11UriBuilder.SlotDescription = ConvertUtils.BytesToUtf8String(slotInfo.SlotDescription, true); pkcs11UriBuilder.SlotId = allSlots[0]; pkcs11UriBuilder.Token = ConvertUtils.BytesToUtf8String(tokenInfo.Label, true); pkcs11UriBuilder.Manufacturer = ConvertUtils.BytesToUtf8String(tokenInfo.ManufacturerId, true); pkcs11UriBuilder.Serial = ConvertUtils.BytesToUtf8String(tokenInfo.SerialNumber, true); pkcs11UriBuilder.Model = ConvertUtils.BytesToUtf8String(tokenInfo.Model, true); pkcs11uri = pkcs11UriBuilder.ToPkcs11Uri(); rv = Pkcs11UriUtils.GetMatchingSlotList(pkcs11uri, pkcs11, true, out matchedSlots); Assert.IsTrue(rv == CKR.CKR_OK); Assert.IsTrue(matchedSlots.Length == 1); // One attribute nonmatching pkcs11UriBuilder.Serial = "foobar"; pkcs11uri = pkcs11UriBuilder.ToPkcs11Uri(); rv = Pkcs11UriUtils.GetMatchingSlotList(pkcs11uri, pkcs11, true, out matchedSlots); Assert.IsTrue(rv == CKR.CKR_OK); Assert.IsTrue(matchedSlots.Length == 0); rv = pkcs11.C_Finalize(IntPtr.Zero); Assert.IsTrue(rv == CKR.CKR_OK); } }
public void _03_SlotInfoMatches() { if (Platform.UnmanagedLongSize != 4 || Platform.StructPackingSize != 1) Assert.Inconclusive("Test cannot be executed on this platform"); // Empty URI Pkcs11Uri pkcs11uri = new Pkcs11Uri(@"pkcs11:"); CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("foo"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); uint slotId = 1; Assert.IsTrue(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // Empty attribute pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=;slot-description=bar;slot-id=1"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes(" "); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); slotId = 1; Assert.IsTrue(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // Unknown path attribute in URI pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=foo;slot-description=bar;slot-id=1;foo=bar"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("foo"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); slotId = 1; Assert.IsFalse(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // All attributes matching pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=foo;slot-description=bar;slot-id=1"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("foo"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); slotId = 1; Assert.IsTrue(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // Manufacturer nonmatching pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=foo;slot-description=bar;slot-id=1"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("bar"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); slotId = 1; Assert.IsFalse(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // Description nonmatching pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=foo;slot-description=bar;slot-id=1"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("foo"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("foo"); slotId = 1; Assert.IsFalse(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); // Slot id nonmatching pkcs11uri = new Pkcs11Uri(@"pkcs11:slot-manufacturer=foo;slot-description=bar;slot-id=1"); slotInfo = new CK_SLOT_INFO(); slotInfo.ManufacturerId = ConvertUtils.Utf8StringToBytes("foo"); slotInfo.SlotDescription = ConvertUtils.Utf8StringToBytes("bar"); slotId = 2; Assert.IsFalse(Pkcs11UriUtils.Matches(pkcs11uri, slotInfo, slotId)); }
/// <summary> /// Obtains a list of all slots where token that matches PKCS#11 URI is present /// </summary> /// <param name="pkcs11Uri">PKCS#11 URI</param> /// <param name="pkcs11Library">Low 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> /// <param name="slotList">List of slots matching PKCS#11 URI</param> /// <returns>CKR_OK if successful; any other value otherwise</returns> public static CKR GetMatchingSlotList(Pkcs11Uri pkcs11Uri, Pkcs11Library pkcs11Library, bool tokenPresent, out NativeULong[] slotList) { if (pkcs11Uri == null) { throw new ArgumentNullException("pkcs11Uri"); } if (pkcs11Library == null) { throw new ArgumentNullException("pkcs11Library"); } List <NativeULong> matchingSlots = new List <NativeULong>(); // Get library information CK_INFO libraryInfo = new CK_INFO(); CKR rv = pkcs11Library.C_GetInfo(ref libraryInfo); if (rv != CKR.CKR_OK) { slotList = new NativeULong[0]; return(rv); } // Check whether library matches URI if (!Matches(pkcs11Uri, libraryInfo)) { slotList = new NativeULong[0]; return(CKR.CKR_OK); } // Get number of slots in first call NativeULong slotCount = 0; rv = pkcs11Library.C_GetSlotList(false, null, ref slotCount); if (rv != CKR.CKR_OK) { slotList = new NativeULong[0]; return(rv); } if (slotCount < 1) { slotList = new NativeULong[0]; return(CKR.CKR_OK); } // Allocate array for slot IDs NativeULong[] slots = new NativeULong[slotCount]; // Get slot IDs in second call rv = pkcs11Library.C_GetSlotList(tokenPresent, slots, ref slotCount); if (rv != CKR.CKR_OK) { slotList = new NativeULong[0]; return(rv); } // Shrink array if needed if (slots.Length != ConvertUtils.UInt32ToInt32(slotCount)) { Array.Resize(ref slots, ConvertUtils.UInt32ToInt32(slotCount)); } // Match slots with Pkcs11Uri foreach (NativeULong slot in slots) { CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); rv = pkcs11Library.C_GetSlotInfo(slot, ref slotInfo); if (rv != CKR.CKR_OK) { slotList = new NativeULong[0]; return(rv); } // Check whether slot matches URI if (Matches(pkcs11Uri, slotInfo, slot)) { if ((slotInfo.Flags & CKF.CKF_TOKEN_PRESENT) == CKF.CKF_TOKEN_PRESENT) { CK_TOKEN_INFO tokenInfo = new CK_TOKEN_INFO(); rv = pkcs11Library.C_GetTokenInfo(slot, ref tokenInfo); if (rv != CKR.CKR_OK) { slotList = new NativeULong[0]; return(rv); } // Check whether token matches URI if (Matches(pkcs11Uri, tokenInfo)) { matchingSlots.Add(slot); } } else { if (!tokenPresent && Pkcs11UriSharedUtils.Matches(pkcs11Uri, null, null, null, null)) { matchingSlots.Add(slot); } } } } slotList = matchingSlots.ToArray(); return(CKR.CKR_OK); }
/// <summary> /// Converts low level CK_SLOT_INFO structure to high level SlotInfo class /// </summary> /// <param name="slotId">PKCS#11 handle of slot</param> /// <param name="ck_slot_info">Low level CK_SLOT_INFO structure</param> internal SlotInfo(uint slotId, CK_SLOT_INFO ck_slot_info) { _slotId = slotId; _slotDescription = ConvertUtils.BytesToUtf8String(ck_slot_info.SlotDescription, true); _manufacturerId = ConvertUtils.BytesToUtf8String(ck_slot_info.ManufacturerId, true); _slotFlags = new SlotFlags(ck_slot_info.Flags); _hardwareVersion = ck_slot_info.HardwareVersion.ToString(); _firmwareVersion = ck_slot_info.FirmwareVersion.ToString(); }
/// <summary> /// Obtains a list of all slots where token that matches PKCS#11 URI is present /// </summary> /// <param name="pkcs11Uri">PKCS#11 URI</param> /// <param name="pkcs11">Low 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> /// <param name="slotList">List of slots matching PKCS#11 URI</param> /// <returns>CKR_OK if successful; any other value otherwise</returns> public static CKR GetMatchingSlotList(Pkcs11Uri pkcs11Uri, Pkcs11 pkcs11, bool tokenPresent, out uint[] slotList) { if (pkcs11Uri == null) throw new ArgumentNullException("pkcs11Uri"); if (pkcs11 == null) throw new ArgumentNullException("pkcs11"); List<uint> matchingSlots = new List<uint>(); // Get library information CK_INFO libraryInfo = new CK_INFO(); CKR rv = pkcs11.C_GetInfo(ref libraryInfo); if (rv != CKR.CKR_OK) { slotList = new uint[0]; return rv; } // Check whether library matches URI if (!Matches(pkcs11Uri, libraryInfo)) { slotList = new uint[0]; return CKR.CKR_OK; } // Get number of slots in first call uint slotCount = 0; rv = pkcs11.C_GetSlotList(false, null, ref slotCount); if (rv != CKR.CKR_OK) { slotList = new uint[0]; return rv; } if (slotCount < 1) { slotList = new uint[0]; return CKR.CKR_OK; } // Allocate array for slot IDs uint[] slots = new uint[slotCount]; // Get slot IDs in second call rv = pkcs11.C_GetSlotList(tokenPresent, slots, ref slotCount); if (rv != CKR.CKR_OK) { slotList = new uint[0]; return rv; } // Shrink array if needed if (slots.Length != slotCount) Array.Resize(ref slots, Convert.ToInt32(slotCount)); // Match slots with Pkcs11Uri foreach (uint slot in slots) { CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); rv = pkcs11.C_GetSlotInfo(slot, ref slotInfo); if (rv != CKR.CKR_OK) { slotList = new uint[0]; return rv; } // Check whether slot matches URI if (Matches(pkcs11Uri, slotInfo, slot)) { if ((slotInfo.Flags & CKF.CKF_TOKEN_PRESENT) == CKF.CKF_TOKEN_PRESENT) { CK_TOKEN_INFO tokenInfo = new CK_TOKEN_INFO(); rv = pkcs11.C_GetTokenInfo(slot, ref tokenInfo); if (rv != CKR.CKR_OK) { slotList = new uint[0]; return rv; } // Check whether token matches URI if (Matches(pkcs11Uri, tokenInfo)) matchingSlots.Add(slot); } else { if (!tokenPresent && Pkcs11UriSharedUtils.Matches(pkcs11Uri, null, null, null, null)) matchingSlots.Add(slot); } } } slotList = matchingSlots.ToArray(); return CKR.CKR_OK; }
internal static extern uint C_GetSlotInfo(uint slotId, ref CK_SLOT_INFO info);
public void _02_BasicSlotListAndInfoTest() { if (Platform.UnmanagedLongSize != 4 || Platform.StructPackingSize != 1) Assert.Inconclusive("Test cannot be executed on this platform"); CKR rv = CKR.CKR_OK; using (Pkcs11 pkcs11 = new Pkcs11(Settings.Pkcs11LibraryPath)) { rv = pkcs11.C_Initialize(Settings.InitArgs41); if ((rv != CKR.CKR_OK) && (rv != CKR.CKR_CRYPTOKI_ALREADY_INITIALIZED)) Assert.Fail(rv.ToString()); // Get number of slots in first call uint slotCount = 0; rv = pkcs11.C_GetSlotList(true, null, ref slotCount); if (rv != CKR.CKR_OK) Assert.Fail(rv.ToString()); Assert.IsTrue(slotCount > 0); // Allocate array for slot IDs uint[] slotList = new uint[slotCount]; // Get slot IDs in second call rv = pkcs11.C_GetSlotList(true, slotList, ref slotCount); if (rv != CKR.CKR_OK) Assert.Fail(rv.ToString()); // Analyze first slot CK_SLOT_INFO slotInfo = new CK_SLOT_INFO(); rv = pkcs11.C_GetSlotInfo(slotList[0], ref slotInfo); if (rv != CKR.CKR_OK) Assert.Fail(rv.ToString()); // Do something interesting with slot info Assert.IsFalse(String.IsNullOrEmpty(ConvertUtils.BytesToUtf8String(slotInfo.ManufacturerId))); rv = pkcs11.C_Finalize(IntPtr.Zero); if (rv != CKR.CKR_OK) Assert.Fail(rv.ToString()); } }
/// <summary> /// Obtains information about a particular slot in the system /// </summary> /// <param name="slotId">The ID of the slot</param> /// <param name="info">Structure that receives the slot information</param> /// <returns>CKR_ARGUMENTS_BAD, CKR_CRYPTOKI_NOT_INITIALIZED, CKR_DEVICE_ERROR, CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR, CKR_HOST_MEMORY, CKR_OK, CKR_SLOT_ID_INVALID</returns> public CKR C_GetSlotInfo(uint slotId, ref CK_SLOT_INFO info) { if (this._disposed) throw new ObjectDisposedException(this.GetType().FullName); return _delegates.C_GetSlotInfo(slotId, ref info); }
internal static extern NativeULong C_GetSlotInfo(NativeULong slotId, ref CK_SLOT_INFO info);