public void ReadTokens(List <PgpToken> ltTokens) { ITokenInfo TokenInfo; List <ISlot> ltSlots; PgpToken Token; if (isWithOpenSc) { ltTokens.RemoveAll(t => t.isOnSmartCard); ltSlots = _Pkcs11Library.GetSlotList(SlotsType.WithTokenPresent); if (ltSlots != null) { foreach (ISlot Slot in ltSlots) { TokenInfo = Slot.GetTokenInfo(); Token = ltTokens.Find(t => t.sSerialNumber == TokenInfo.SerialNumber); if (Token == null) { Token = new PgpToken(TokenInfo, this); ltTokens.Add(Token); } AddKeysToToken(Slot, Token); } } } }
/// <summary></summary> private void AddKeysToToken(ISlot Slot, PgpToken Token) { byte[] abExponent, abId, abModulus; bool isEncrypt, isVerify; ulong vKeyType; PgpKeyFlags.nFlags eKeyFlags; ISlotInfo SlotInfo; List <IObjectAttribute> ltAttributes, ltSearchTemplate; List <IObjectHandle> ltPublicKeys; if (Slot != null) { SlotInfo = Slot.GetSlotInfo(); using (ISession Session = Slot.OpenSession(SessionType.ReadOnly)) { ltSearchTemplate = new List <IObjectAttribute> { Session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_PUBLIC_KEY) }; ltPublicKeys = Session.FindAllObjects(ltSearchTemplate); foreach (IObjectHandle PublicKey in ltPublicKeys) { ltAttributes = Session.GetAttributeValue(PublicKey, new List <CKA> { CKA.CKA_ENCRYPT, CKA.CKA_ID, CKA.CKA_KEY_TYPE, CKA.CKA_MODULUS, CKA.CKA_PUBLIC_EXPONENT, CKA.CKA_VERIFY }); isEncrypt = ltAttributes[0].GetValueAsBool(); abId = ltAttributes[1].GetValueAsByteArray(); vKeyType = ltAttributes[2].GetValueAsUlong(); abModulus = ltAttributes[3].GetValueAsByteArray(); abExponent = ltAttributes[4].GetValueAsByteArray(); isVerify = ltAttributes[5].GetValueAsBool(); if ((CKK)vKeyType == CKK.CKK_RSA) { if (!isEncrypt && isVerify) { eKeyFlags = PgpKeyFlags.nFlags.Certify | PgpKeyFlags.nFlags.Sign; } else if (isEncrypt && !isVerify) { eKeyFlags = PgpKeyFlags.nFlags.Encrypt; } else if (isEncrypt && isVerify) { eKeyFlags = PgpKeyFlags.nFlags.Authenticate; } else { eKeyFlags = PgpKeyFlags.nFlags.None; } Token.AddPublicKey(SlotInfo, abId, eKeyFlags, abModulus, abExponent); } } } } }