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}]"); } }
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}]"); } }