Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        /// <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);
                        }
                    }
                }
            }
        }