Пример #1
0
        static void Main(string[] args)
        {
            try
            {
                // Инициализировать библиотеку
                Console.WriteLine("Library initialization");
                using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
                {
                    // Получить доступный слот
                    Console.WriteLine("Checking tokens available");
                    Slot slot = Helpers.GetUsableSlot(pkcs11);

                    // Получить расширенную информацию о подключенном токене
                    Console.WriteLine("Checking token type");
                    TokenInfoExtended tokenInfo = slot.GetTokenInfoExtended();
                    // Проверить наличие PINPad в нулевом слоте
                    Errors.Check("Device in slot 0 is not Rutoken PINPad", tokenInfo.TokenType == RutokenType.PINPAD_FAMILY);

                    // Определение поддерживаемых токеном механизмов
                    Console.WriteLine("Checking mechanisms available");
                    List <CKM> mechanisms = slot.GetMechanismList();
                    Errors.Check(" No mechanisms available", mechanisms.Count > 0);
                    bool isGostR3410Supported = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3410_KEY_PAIR_GEN);
                    Errors.Check(" CKM_GOSTR3410_KEY_PAIR_GEN isn`t supported!", isGostR3410Supported);

                    // Открыть RW сессию в первом доступном слоте
                    Console.WriteLine("Opening RW session");
                    using (Session session = slot.OpenSession(false))
                    {
                        // Выполнить аутентификацию Пользователя
                        Console.WriteLine("User authentication");
                        session.Login(CKU.CKU_USER, SampleConstants.NormalUserPin);

                        try
                        {
                            // Определить механизм генерации ключа
                            Console.WriteLine("Generating GOST R 34.10-2001 key pair...");
                            var mechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3410_KEY_PAIR_GEN);

                            // Сгенерировать первую ключевую пару ГОСТ Р 34.10-2001
                            ObjectHandle publicKeyHandle;
                            ObjectHandle privateKeyHandle;
                            session.GenerateKeyPair(mechanism, PublicKeyAttributes, PrivateKeyAttributes, out publicKeyHandle, out privateKeyHandle);
                            Errors.Check("Invalid public key handle", publicKeyHandle.ObjectId != CK.CK_INVALID_HANDLE);
                            Errors.Check("Invalid private key handle", privateKeyHandle.ObjectId != CK.CK_INVALID_HANDLE);

                            Console.WriteLine("Generating has been completed successfully");
                        }
                        finally
                        {
                            // Сбросить права доступа как в случае исключения,
                            // так и в случае успеха.
                            // Сессия закрывается автоматически.
                            session.Logout();
                        }
                    }
                }
            }
            catch (Pkcs11Exception ex)
            {
                Console.WriteLine($"Operation failed [Method: {ex.Method}, RV: {ex.RV}]");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Operation failed [Message: {ex.Message}]");
            }
        }
        static void Main(string[] args)
        {
            try
            {
                // Инициализировать библиотеку
                Console.WriteLine("Library initialization");
                using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
                {
                    // Получить доступный слот
                    Console.WriteLine("Checking tokens available");
                    Slot slot = Helpers.GetUsableSlot(pkcs11);

                    // Получить расширенную информацию о подключенном токене
                    Console.WriteLine("Checking token type");
                    TokenInfoExtended tokenInfo = slot.GetTokenInfoExtended();
                    // Проверить наличие PINPad в нулевом слоте
                    Errors.Check("Device in slot 0 is not Rutoken PINPad", tokenInfo.TokenType == RutokenType.PINPAD_FAMILY);

                    // Определение поддерживаемых токеном механизмов
                    Console.WriteLine("Checking mechanisms available");
                    List <CKM> mechanisms = slot.GetMechanismList();
                    Errors.Check(" No mechanisms available", mechanisms.Count > 0);
                    bool isGostR3410GenSupported = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3410_KEY_PAIR_GEN);
                    bool isGostR3410Supported    = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3410);
                    bool isGostR3411Supported    = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3411);
                    Errors.Check(" CKM_GOSTR3410_KEY_PAIR_GEN isn`t supported!", isGostR3410GenSupported);
                    Errors.Check(" CKM_GOSTR3410 isn`t supported!", isGostR3410Supported);
                    Errors.Check(" CKM_GOSTR3411 isn`t supported!", isGostR3411Supported);

                    // Открыть RW сессию в первом доступном слоте
                    Console.WriteLine("Opening RW session");
                    using (Session session = slot.OpenSession(false))
                    {
                        // Выполнить аутентификацию Пользователя
                        Console.WriteLine("User authentication");
                        session.Login(CKU.CKU_USER, SampleConstants.NormalUserPin);

                        try
                        {
                            // Получить журнал
                            Console.WriteLine("Acquiring journal...");
                            byte[] journal = slot.GetJournal();
                            Errors.Check("Journal is empty!", journal != null);
                            Errors.Check("Journal is empty!", journal.Length > 0);

                            // Распечатать журнал
                            Console.WriteLine(" Journal buffer is:");
                            Helpers.PrintByteArray(journal);
                            Console.WriteLine("Journal has been acquired successfully");

                            // Получить хэндл закрытого ключа журнальной пары
                            Console.WriteLine("Getting journal private key...");
                            List <ObjectHandle> privateKeys = session.FindAllObjects(PrivateKeyFindAttributes);

                            ObjectHandle journalPublicKeyHandle;
                            ObjectHandle journalPrivateKeyHandle;
                            if (privateKeys.Count <= 0)
                            {
                                Console.WriteLine(
                                    "No journal private keys found! Journal key pair will be generated");

                                // Генерировать журнальную ключевую пару
                                var keyGenMechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3410_KEY_PAIR_GEN);

                                session.GenerateKeyPair(keyGenMechanism, PublicKeyGenerationAttributes, PrivateKeyGenerationAttributes,
                                                        out journalPublicKeyHandle, out journalPrivateKeyHandle);
                                Errors.Check("Invalid public key handle", journalPublicKeyHandle.ObjectId != CK.CK_INVALID_HANDLE);
                                Errors.Check("Invalid private key handle", journalPrivateKeyHandle.ObjectId != CK.CK_INVALID_HANDLE);
                            }
                            else
                            {
                                journalPrivateKeyHandle = privateKeys[0];
                            }

                            // Сформировать хэш-код журнала для цифровой подписи
                            Console.WriteLine("Hashing journal...");
                            var    digestMechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3411);
                            byte[] journalHash     = session.Digest(digestMechanism, journal);

                            // Распечатать буфер, содержащий хэш-код
                            Console.WriteLine(" Hashed buffer is:");
                            Helpers.PrintByteArray(journalHash);
                            Console.WriteLine("Hashing has been completed successfully");

                            // Сформировать цифровую подпись журнала по алгоритму ГОСТ Р 34.10 - 2001
                            Console.WriteLine("Signing journal...");
                            var    journalSignMechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3410);
                            byte[] journalSignature     = session.SignInvisible(journalSignMechanism, journalPrivateKeyHandle, journalHash);

                            // Распечатать буфер, содержащий цифровую подпись журнала
                            Console.WriteLine(" Sign buffer is:");
                            Helpers.PrintByteArray(journalSignature);
                            Console.WriteLine("Signing has been completed");

                            // Получать хэндл открытого ключа журнальной пары
                            Console.WriteLine("Getting journal public key...");
                            List <ObjectHandle> publicKeys = session.FindAllObjects(PublicKeyFindAttributes);
                            Errors.Check("No public keys found", publicKeys.Count > 0);
                            journalPublicKeyHandle = publicKeys[0];

                            // Выполнить проверку цифровой подписи по алгоритму ГОСТ Р 34.10-2001
                            Console.WriteLine("Verifying signature...");
                            bool isSignatureValid = false;
                            session.Verify(journalSignMechanism, journalPublicKeyHandle, journalHash, journalSignature, out isSignatureValid);

                            if (isSignatureValid)
                            {
                                Console.WriteLine("Verifying has been completed successfully");
                            }
                            else
                            {
                                throw new InvalidOperationException("Invalid signature");
                            }
                        }
                        finally
                        {
                            // Сбросить права доступа как в случае исключения,
                            // так и в случае успеха.
                            // Сессия закрывается автоматически.
                            session.Logout();
                        }
                    }
                }
            }
            catch (Pkcs11Exception ex)
            {
                Console.WriteLine($"Operation failed [Method: {ex.Method}, RV: {ex.RV}]");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Operation failed [Message: {ex.Message}]");
            }
        }
Пример #3
0
        static void Main(string[] args)
        {
            try
            {
                // Инициализировать библиотеку
                Console.WriteLine("Library initialization");
                using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
                {
                    // Получить доступный слот
                    Console.WriteLine("Checking tokens available");
                    Slot slot = Helpers.GetUsableSlot(pkcs11);

                    // Получить расширенную информацию о подключенном токене
                    Console.WriteLine("Checking token type");
                    TokenInfoExtended tokenInfo = slot.GetTokenInfoExtended();
                    // Проверить наличие PINPad в нулевом слоте
                    Errors.Check("Device in slot 0 is not Rutoken PINPad", tokenInfo.TokenType == RutokenType.PINPAD_FAMILY);

                    // Определение поддерживаемых токеном механизмов
                    Console.WriteLine("Checking mechanisms available");
                    List <CKM> mechanisms = slot.GetMechanismList();
                    Errors.Check(" No mechanisms available", mechanisms.Count > 0);
                    bool isGostR3410Supported = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3410);
                    bool isGostR3411Supported = mechanisms.Contains((CKM)Extended_CKM.CKM_GOSTR3411);
                    Errors.Check(" CKM_GOSTR3410 isn`t supported!", isGostR3410Supported);
                    Errors.Check(" CKM_GOSTR3411 isn`t supported!", isGostR3411Supported);

                    // Открыть RW сессию в первом доступном слоте
                    Console.WriteLine("Opening RW session");
                    using (Session session = slot.OpenSession(false))
                    {
                        // Выполнить аутентификацию Пользователя
                        Console.WriteLine("User authentication");
                        session.Login(CKU.CKU_USER, SampleConstants.NormalUserPin);

                        try
                        {
                            // Получить данные для вычисления подписи
                            string sourceData = SampleData.PINPad_Sign_SourceData;

                            // Получить приватный ключ для генерации подписи
                            Console.WriteLine("Getting private key...");
                            List <ObjectHandle> privateKeys = session.FindAllObjects(PrivateKeyAttributes);
                            Errors.Check("No private keys found", privateKeys.Count > 0);

                            // Инициализировать операцию хэширования
                            var mechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3411);

                            // Вычислить хэш-код данных
                            Console.WriteLine("Hashing data without attributes...");
                            byte[] hash = session.Digest(mechanism, ConvertUtils.Utf8StringToBytes(sourceData));

                            // Распечатать буфер, содержащий хэш-код
                            Console.WriteLine(" Hashed buffer is:");
                            Helpers.PrintByteArray(hash);
                            Console.WriteLine("Hashing has been completed successfully");

                            // Вычислить хэш-код данных
                            Console.WriteLine("Hashing data with attributes...");
                            byte[] attrData   = SampleData.PINPad_AttrData1;
                            var    hashOffset = 75;
                            Buffer.BlockCopy(hash, 0, attrData, hashOffset, hash.Length);
                            byte[] attrHash = session.Digest(mechanism, attrData);

                            // Распечатать буфер, содержащий хэш-код
                            Console.WriteLine(" Hashed buffer is:");
                            Helpers.PrintByteArray(attrHash);
                            Console.WriteLine("Hashing has been completed successfully");

                            // Получить значение флага подтверждения операции подписи
                            Console.WriteLine("Checking whether signature confirmation is required...");
                            var attributes = new List <CKA>
                            {
                                (CKA)Extended_CKA.CKA_VENDOR_KEY_CONFIRM_OP
                            };
                            List <ObjectAttribute> confirm = session.GetAttributeValue(privateKeys[0], attributes);

                            /*************************************************************************
                            * Инициализировать операцию подписи данных                               *
                            *************************************************************************/
                            /*************************************************************************
                            * При подписи сообщения с заголовком <!PINPADFILE INVISIBLE RU> или      *
                            * <!PINPADFILE INVISIBLE UTF8> на ключе, имеющем атрибут                 *
                            * CKA_VENDOR_KEY_CONFIRM_OP равным CK_TRUE, а так же для подписи на      *
                            * ключе, имеющем атрибут CKA_VENDOR_KEY_CONFIRM_OP равным CK_FALSE, для  *
                            * инициализации подписи должна использоваться функция                    *
                            * C_EX_SignInvisibleInit, для подписи - C_EX_SignInvisible.              *
                            *                                                                        *
                            * При подписи сообщения с заголовком <!PINPADFILE RU> или                *
                            * <!PINPADFILE UTF8> на ключе, имеющем атрибут CKA_VENDOR_KEY_CONFIRM_OP *
                            * равным CK_TRUE, для инициализации подписи должна использоваться        *
                            * функция C_SignInit, для подписи - C_Sign.                              *
                            *************************************************************************/
                            bool isOperationInvisible = (sourceData.StartsWith("<!PINPADFILE INVISIBLE RU>") ||
                                                         sourceData.StartsWith("<!PINPADFILE INVISIBLE UTF8>") &&
                                                         confirm[0].GetValueAsBool()) ||
                                                        confirm[0].GetValueAsBool() == false;

                            // Инициализация операции подписи данных по алгоритму ГОСТ Р 34.10-2001
                            var signMechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3410);

                            // Подписать данные
                            byte[] signature;
                            if (isOperationInvisible)
                            {
                                Console.WriteLine("Signing data invisible...");
                                signature = session.SignInvisible(signMechanism, privateKeys[0], attrHash);
                            }
                            else
                            {
                                Console.WriteLine("Signing data...");
                                signature = session.Sign(signMechanism, privateKeys[0], attrHash);
                            }

                            // Распечатать буфер, содержащий подпись
                            Console.WriteLine(" Signature buffer is:");
                            Helpers.PrintByteArray(signature);
                            Console.WriteLine("Data has been signed successfully");

                            // Получить публичный ключ для проверки подписи
                            Console.WriteLine("Getting public key...");
                            List <ObjectHandle> publicKeys = session.FindAllObjects(PublicKeyAttributes);
                            Errors.Check("No public keys found", publicKeys.Count > 0);

                            // Проверка подписи для данных
                            Console.WriteLine("Verifying signature...");
                            bool isSignatureValid = false;
                            session.Verify(signMechanism, publicKeys[0], attrHash, signature, out isSignatureValid);

                            if (isSignatureValid)
                            {
                                Console.WriteLine("Verifying has been completed successfully");
                            }
                            else
                            {
                                throw new InvalidOperationException("Invalid signature");
                            }
                        }
                        finally
                        {
                            // Сбросить права доступа как в случае исключения,
                            // так и в случае успеха.
                            // Сессия закрывается автоматически.
                            session.Logout();
                        }
                    }
                }
            }
            catch (Pkcs11Exception ex)
            {
                Console.WriteLine($"Operation failed [Method: {ex.Method}, RV: {ex.RV}]");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Operation failed [Message: {ex.Message}]");
            }
        }
        static void Main(string[] args)
        {
            try
            {
                // Инициализировать библиотеку
                Console.WriteLine("Library initialization");
                using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
                {
                    // Получить доступный слот
                    Console.WriteLine("Checking tokens available");
                    Slot slot = Helpers.GetUsableSlot(pkcs11);

                    // Получить расширенную информацию о подключенном токене
                    Console.WriteLine("Getting extended token information...");
                    TokenInfoExtended tokenInfo = slot.GetTokenInfoExtended();

                    // Определить класс токена
                    var isRutokenS = (tokenInfo.TokenClass == RutokenClass.S);

                    Console.WriteLine("Extended token information has been got successfully");

                    Console.WriteLine("Extended initializing token...");
                    var rutokenInitParam = new RutokenInitParam(SampleConstants.SecurityOfficerPin, SampleConstants.NewUserPin,
                                                                SampleConstants.TokenStdLabel,
                                                                new List <RutokenFlag> {
                        RutokenFlag.AdminChangeUserPin, RutokenFlag.UserChangeUserPin
                    }, isRutokenS ? (uint)1 : 6, isRutokenS ? (uint)1 : 6,
                                                                SampleConstants.MaxAdminRetryCount, SampleConstants.MaxUserRetryCount, smMode: 0);
                    slot.InitTokenExtended(SampleConstants.SecurityOfficerPin, rutokenInitParam);
                    Console.WriteLine("Token has been initialized successfully");

                    // Открыть RW сессию в первом доступном слоте
                    Console.WriteLine("Opening RW session");
                    using (Session session = slot.OpenSession(false))
                    {
                        Console.WriteLine("Extended PIN function test...");
                        // Пробуем заблокировать PIN-код Пользователя
                        Console.WriteLine(" Locking user PIN...");
                        // Ввод неправильного PIN-кода Пользователя до блокировки PIN-кода
                        for (var i = 0; i < (SampleConstants.MaxUserRetryCount + 1); i++)
                        {
                            try
                            {
                                Console.WriteLine($"Login with wrong user PIN: {i}");
                                session.Login(CKU.CKU_USER, SampleConstants.WrongUserPin);
                            }
                            catch (Pkcs11Exception ex)
                            {
                                if (ex.RV != CKR.CKR_PIN_INCORRECT && ex.RV != CKR.CKR_PIN_LOCKED)
                                {
                                    throw;
                                }

                                switch (ex.RV)
                                {
                                case CKR.CKR_PIN_INCORRECT:
                                    Console.WriteLine(" -> Wrong PIN");
                                    break;

                                case CKR.CKR_PIN_LOCKED:
                                    Console.WriteLine(" -> PIN Locked");
                                    break;
                                }
                            }
                        }
                        // Пробуем разблокировать PIN-код Пользователя
                        Console.WriteLine(" Unlocking user PIN...");

                        // Выполнить аутентификацию администратора
                        session.Login(CKU.CKU_SO, SampleConstants.SecurityOfficerPin);

                        try
                        {
                            // Разблокировать PIN-код Пользователя
                            session.UnblockUserPIN();
                        }
                        finally
                        {
                            // Завершение сессии администратора
                            session.Logout();
                        }

                        Console.WriteLine("Extended PIN function test has been completed successfully");

                        Console.WriteLine("Work with token name...");

                        // Аутентификация пользователя
                        session.Login(CKU.CKU_USER, SampleConstants.NewUserPin);

                        try
                        {
                            //Изменить метку токена на "длинную"
                            Console.WriteLine($" Set long token name: {SampleConstants.TokenLongLabel}");
                            session.SetTokenName(SampleConstants.TokenLongLabel);

                            // Получение метки токена
                            string tokenLabel = session.GetTokenLabel();
                            Console.WriteLine(" Reading token name...");
                            Console.WriteLine($" Token name: {tokenLabel}");

                            Console.WriteLine("Work with token name has been completed successfully");

                            // Вывести расширенную информацию о токене
                            Console.WriteLine("Extended information:");
                            Console.Write(" Token type: ");
                            switch (tokenInfo.TokenType)
                            {
                            case RutokenType.ECP:
                                Console.WriteLine("(Rutoken ECP)");
                                break;

                            case RutokenType.LITE:
                                Console.WriteLine("(Rutoken Lite)");
                                break;

                            case RutokenType.RUTOKEN:
                                Console.WriteLine("(Rutoken S)");
                                break;

                            case RutokenType.PINPAD_FAMILY:
                                Console.WriteLine("(Rutoken PINPad)");
                                break;

                            default:
                                throw new ArgumentOutOfRangeException();
                            }
                            Console.WriteLine(" Protocol number: 0x{0:X}", tokenInfo.ProtocolNumber);
                            Console.WriteLine(" Microcode number: 0x{0:X}", tokenInfo.MicrocodeNumber);
                            Console.WriteLine(" Order number: 0x{0:X}", tokenInfo.OrderNumber);
                            Console.WriteLine(" Flags: 0x{0:X}", tokenInfo.Flags);
                            Console.WriteLine(" Max admin PIN length: 0x{0:X}", tokenInfo.MaxAdminPinLen);
                            Console.WriteLine(" Min admin PIN length: 0x{0:X}", tokenInfo.MinAdminPinLen);
                            Console.WriteLine(" Max user PIN length: 0x{0:X}", tokenInfo.MaxUserPinLen);
                            Console.WriteLine(" Min user PIN length: 0x{0:X}", tokenInfo.MinUserPinLen);
                            Console.WriteLine(" Max admin retry counter: 0x{0:X}", tokenInfo.MaxAdminRetryCount);
                            Console.WriteLine(" Admin retry counter: 0x{0:X}", tokenInfo.AdminRetryCountLeft);
                            Console.WriteLine(" Max user retry counter: 0x{0:X}", tokenInfo.MaxUserRetryCount);
                            Console.WriteLine(" User retry counter: 0x{0:X}", tokenInfo.UserRetryCountLeft);
                            Console.WriteLine(" Serial number: {0}", tokenInfo.SerialNumber);
                            Console.WriteLine(" Total memory: 0x{0:X}", tokenInfo.TotalMemory);
                            Console.WriteLine(" Free memory: 0x{0:X}", tokenInfo.FreeMemory);
                            Console.WriteLine(" ATR: {0}", tokenInfo.ATR);
                            Console.WriteLine(" Token class: {0}", tokenInfo.TokenClass);
                            Console.WriteLine(" Battery voltage (Bluetooth): 0x{0:X}", tokenInfo.BatteryVoltage);
                            Console.WriteLine(" BodyColor (Bluetooth): {0}", tokenInfo.BodyColor);
                            Console.WriteLine(" Firmware checksum:  0x{0:X}", tokenInfo.FirmwareChecksum);

                            Console.WriteLine("Extended info test has been completed successfully");

                            // Установить PIN-код Пользователя по умолчанию
                            Console.WriteLine("Changing user PIN to default...");
                            session.SetPin(SampleConstants.NewUserPin, SampleConstants.NormalUserPin);
                            Console.WriteLine("User PIN has been changed to default successfully");
                        }
                        finally
                        {
                            // Завершение сессии пользователя
                            session.Logout();
                        }
                    }
                }
            }
            catch (Pkcs11Exception ex)
            {
                Console.WriteLine($"Operation failed [Method: {ex.Method}, RV: {ex.RV}]");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Operation failed [Message: {ex.Message}]");
            }
        }