예제 #1
0
        /// <summary>
        /// Пакетное подписывание файлов
        /// </summary>
        /// <param name="pathIn">Папка с исходными файлами</param>
        /// <param name="mask">Маска файлов для обработки (*.*)</param>
        /// <param name="pathOut">Папка для подписанных файлов (s)</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY (\Pub)</param>
        /// <param name="id">Код аутентификации - КА (XXXXSSSSSSYY)</param>
        /// <param name="move">Удалять исходные файлы в случае успеха</param>
        /// <returns>0 или код последней ошибки</returns>
        public static int BulkSign(string pathIn, string mask, string pathOut, string pub, string id, bool move)
        {
            Wbotho.SignInit(pub, pub);
            Wbotho.SignLogIn(pub);

            Directory.CreateDirectory(pathOut);

            int ret = 0;

            foreach (string file in Directory.GetFiles(pathIn, mask))
            {
                string fileOut = Path.Combine(pathOut, Path.GetFileName(file));
                int    r       = Wbotho.SignFile(file, fileOut, id);
                if (r == 0 && move && File.Exists(fileOut))
                {
                    File.Delete(file);
                }
                else
                {
                    ret = r;
                }
            }

            Wbotho.SignLogOut();
            Wbotho.SignDone();
            return(ret);
        }
예제 #2
0
        /// <summary>
        /// Проверка подписи, сохраненной в отдельном файле
        /// </summary>
        /// <param name="file">Подписанный файл</param>
        /// <param name="fileSig">Файл с подписями</param>
        public static int VerifySeparate(string file, string fileSig)
        {
            int       ret;
            byte      count;
            CheckList list;

            if ((ret = Wbotho.CheckFileSeparate(file, out count, out list, fileSig)) > 0)
            {
                return(ret);
            }
            for (int i = 0; i < (int)count; i++)
            {
                switch (list.Signs[i].Status)
                {
                case 0:     //CORRECT
                    break;

                case 1:     //NOT_CORRECT
                    ret = 26;
                    break;

                case 2:     //OKEY_NOT_FOUND
                    ret = 6;
                    break;
                }
            }
            Wbotho.FreeMemory(list);
            return(ret);
        }
예제 #3
0
        /// <summary>
        /// Проверка подписи, добавленной в конец исходного файла (расширенная)
        /// </summary>
        /// <param name="file">Исходный файл с подписями</param>
        /// <param name="keys">Ключи проверки подписей отправителей</param>
        /// <param name="count">Число обнаруженных подписей</param>
        /// <param name="list">Массив результатов проверки каждой подписи</param>
        /// <returns>0 или код ошибки</returns>
        public static int VerifyEx(string file, OpenKey[] keys, out byte count, out CheckList list)
        {
            var allocated = new List <IntPtr>();

            int    ptrSize = Marshal.SizeOf(typeof(IntPtr));
            IntPtr keysPtr = Marshal.AllocHGlobal(ptrSize * keys.Length);

            for (int i = 0; i < keys.Length; i++)
            {
                IntPtr keyPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(OpenKey)));
                allocated.Add(keyPtr);
                Marshal.StructureToPtr(keys[i], keyPtr, false);

                Marshal.WriteIntPtr(keysPtr, i * ptrSize, keyPtr);
            }

            int ret = Wbotho.CheckFileSignEx(file, keysPtr, (uint)keys.Length, out count, out list);

            Marshal.FreeHGlobal(keysPtr);
            foreach (IntPtr ptr in allocated)
            {
                Marshal.FreeHGlobal(ptr);
            }
            return(ret);
        }
예제 #4
0
        /// <summary>
        /// Получить список получателей зашифрованного файла
        /// </summary>
        /// <param name="file">Зашифрованный файл</param>
        /// <remarks>wftesto.exe g file.cry</remarks>
        public static int GetAbonents(string file)
        {
            int ret;

            if ((ret = Wbotho.CryptoInit("", "")) > 0)
            {
                Console.WriteLine("CryptoInit error : {0}", ret);
                return(ret);
            }
            ushort count;

            ushort[] list;
            if ((ret = Wbotho.GetCryptKeysF(file, out count, out list, "")) > 0)
            {
                Console.WriteLine("GetCryptKeysF error : {0}", ret);
                return(ret);
            }
            Wbotho.CryptoDone();
            Console.WriteLine("File {0} is encrypted for these abonents :", file); //новое: исправлено слово
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine("ID{0} - {1}", i + 1, list[i]);
            }
            Wbotho.FreeMemory(list);
            return(ret);
        }
예제 #5
0
        /// <summary>
        /// Выгрузить все ключи из памяти драйвера (новое)
        /// </summary>
        /// <remarks>wftesto.exe r</remarks>
        public static int ResetKeys()
        {
            int        ret;
            SlotsTable table = new SlotsTable();

            table.Slots = new UsrKeysInfo[16];
            uint count;

            if ((ret = Wbotho.GetDrvInfo(ref table, out count)) > 0)
            {
                Console.WriteLine("GetDrvInfo error : {0}", ret);
                return(ret);
            }
            for (int i = 0; i < count; i++)
            {
                if (table.Slots[i].Num[0] != '\0') //crypto
                {
                    ret += ResetKey(table.Slots[i].Num);
                }
                else if (table.Slots[i].Nump[0] != '\0') //sign
                {
                    ret += ResetKey(table.Slots[i].Nump);
                }
            }
            return(ret == 0 ? ret : 1);
        }
예제 #6
0
        /// <summary>
        /// Пакетное расшифрование файлов
        /// </summary>
        /// <param name="pathIn">Папка с исходными файлами</param>
        /// <param name="mask">Маска файлов для обработки (*.*)</param>
        /// <param name="pathOut">Папка для расшифрованных файлов (d)</param>
        /// <param name="ext">Новое расширение для расшифрованных файлов (.*)</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY (\Pub)</param>
        /// <param name="id">Номер отправителя (XXXXSSSSSS)</param>
        /// <param name="to">Номер получателя (XXXXSSSSSS)</param>
        /// <param name="move">Удалять исходные файлы в случае успеха</param>
        /// <returns>0 или код последней ошибки</returns>
        public static int BulkDecrypt(string pathIn, string mask, string pathOut, string ext, string pub, string id, string to, bool move)
        {
            Wbotho.CryptoInit(pub, pub);

            int ret;

            byte[] key = new byte[304];
            if ((ret = Wbotho.ExtractKey(pub, id, key)) > 0)
            {
                return(ret);
            }

            Directory.CreateDirectory(pathOut);
            bool changeExt = !ext.Equals(".*");

            foreach (string file in Directory.GetFiles(pathIn, mask))
            {
                string fileOut = Path.Combine(pathOut, changeExt ?
                                              Path.GetFileNameWithoutExtension(file) + ext :
                                              Path.GetFileName(file));
                int r = Wbotho.DeCryptFileEx(file, fileOut, to, key);
                if (r == 0 && move && File.Exists(fileOut))
                {
                    File.Delete(file);
                }
                else
                {
                    ret = r;
                }
            }

            Wbotho.CryptoDone();
            return(ret);
        }
예제 #7
0
        /// <summary>
        /// Пакетная проверка подписей файлов
        /// </summary>
        /// <param name="pathIn">Папка с исходными файлами</param>
        /// <param name="mask">Маска файлов для обработки (*.*)</param>
        /// <param name="pathOut">Папка для проверенных файлов (v)</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY (\Pub)</param>
        /// <param name="move">Удалять исходные файлы в случае успеха</param>
        /// <returns>0 или код последней ошибки</returns>
        public static int BulkVerify(string pathIn, string mask, string pathOut, string pub, bool move)
        {
            Wbotho.SignInit(pub, pub);
            Wbotho.SignLogIn(pub);

            Directory.CreateDirectory(pathOut);

            int ret = 0;

            foreach (string file in Directory.GetFiles(pathIn, mask))
            {
                string fileOut = Path.Combine(pathOut, Path.GetFileName(file));
                File.Copy(file, fileOut, true);
                int r = Posh.Verify(fileOut); //TODO Wbotho.CheckFileSignEx()
                if (r == 0 && move && File.Exists(fileOut))
                {
                    File.Delete(file);
                }
                else
                {
                    File.Delete(fileOut);
                    ret = r;
                }
            }

            Wbotho.SignLogOut();
            Wbotho.SignDone();
            return(ret);
        }
예제 #8
0
        /// <summary>
        /// Расшифрование файла (расширенное)
        /// </summary>
        /// <param name="fileIn">Исходный зашифрованный файл</param>
        /// <param name="fileOut">Расшифрованный файл</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY</param>
        /// <param name="id">Номер отправителя (XXXXSSSSSS)</param>
        /// <param name="to">Номер получателя (XXXXSSSSSS)</param>
        public static int DecryptEx(string fileIn, string fileOut, string pub, string id, string to)
        {
            int ret;

            byte[] key = new byte[304];
            if ((ret = Wbotho.ExtractKey(pub, id, key)) > 0)
            {
                return(ret);
            }

            return(Wbotho.DeCryptFileEx(fileIn, fileOut, to, key));
        }
예제 #9
0
        /// <summary>
        /// Загрузить в память драйвера ключ с внешнего ключевого устройства
        /// </summary>
        /// <param name="id">Номер ключа шифрования или КА</param>
        /// <param name="dev">Ключевое устройство (A: или другое)</param>
        /// <remarks>wftesto.exe i [000566666601] [ruToken]</remarks>
        public static int InitKey(string id, string dev)
        {
            int ret;

            if ((ret = Wbotho.InitKey(dev, id)) > 0)
            {
                Console.WriteLine("InitKey error : {0}", ret);
                return(ret);
            }
            Console.WriteLine("InitKey done : {0}", ret);
            return(ret);
        }
예제 #10
0
        /// <summary>
        /// Выгрузить ключ из памяти драйвера (новое: слот 0 разрешен также)
        /// </summary>
        /// <param name="id">Номер ключа</param>
        /// <remarks>wftesto.exe r 000566666601</remarks>
        public static int ResetKey(string id)
        {
            int ret;

            if ((ret = Wbotho.ResetKeyEx(id, true)) > 0)
            {
                Console.WriteLine("ResetKey error : {0}", ret);
                return(ret);
            }
            Console.WriteLine("ResetKey done : {0}", ret);
            return(ret);
        }
예제 #11
0
        /// <summary>
        /// Зашифрование файла
        /// </summary>
        /// <param name="fileIn">Исходный файл</param>
        /// <param name="fileOut">Зашифрованный файл</param>
        /// <param name="id">Номер отправителя (серия опционально)</param>
        /// <param name="to">Номера получателей (той же серии) ...</param>
        /// <returns>0 или код ошибки</returns>
        public static int Encrypt(string fileIn, string fileOut, string id, params string[] to)
        {
            string ser = "";

            if (id.Length == 10)
            {
                id  = id.Substring(0, 4);
                ser = id.Substring(4);
            }
            ushort[] nodes = new ushort[to.Length + 1];
            for (int i = 0; i < to.Length; i++)
            {
                nodes[i] = ushort.Parse(to[i]);
            }
            nodes[to.Length] = 0;
            return(Wbotho.EnCryptFile(fileIn, fileOut, ushort.Parse(id), nodes, ser));
        }
예제 #12
0
        /// <summary>
        /// Удалить все подписи в конце файла (новое: без параметра с числом их)
        /// </summary>
        /// <param name="file">Файл с подписями</param>
        /// <remarks>wftesto.exe u file.txt</remarks>
        public static int Unsign(string file)
        {
            int ret;

            if ((ret = Wbotho.SignInit("", "")) > 0)
            {
                Console.WriteLine("SignInit error : {0}", ret);
                return(ret);
            }
            if ((ret = Posh.Unsign(file)) > 0)
            {
                Console.WriteLine("DelSign error : {0}", ret);
                return(ret);
            }
            Wbotho.SignDone();
            Console.WriteLine("Sign deleted in file {0}", file);
            return(ret);
        }
예제 #13
0
        /// <summary>
        /// Подписать файл с подписью в отдельном файле (новое)
        /// </summary>
        /// <param name="file">Исходный файл</param>
        /// <param name="fileSig">Файл с подписями</param>
        /// <param name="sec">Путь к секретному ключу</param>
        /// <param name="id">Код аутентификации (КА)</param>
        /// <remarks>wftesto.exe s2 file.txt file.sig a: 000122222201</remarks>
        public static int SignSeparate(string file, string fileSig, string sec, string id)
        {
            int ret;

            if ((ret = Wbotho.SignInit(sec, "")) > 0)
            {
                Console.WriteLine("SignInit error : {0}", ret);
                return(ret);
            }
            if ((ret = Posh.SignSeparate(file, id, fileSig)) > 0)
            {
                Console.WriteLine("SignFileSeparate error : {0}", ret);
                return(ret);
            }
            Wbotho.SignDone();
            Console.WriteLine("File {0} signed to {1}", file, fileSig);
            return(ret);
        }
예제 #14
0
        /// <summary>
        /// Зашифрование файла (расширенное)
        /// </summary>
        /// <param name="fileIn">Исходный файл</param>
        /// <param name="fileOut">Зашифрованный файл</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY</param>
        /// <param name="id">Номер отправителя (XXXXSSSSSS)</param>
        /// <param name="to">Номер получателя (XXXXSSSSSS)</param>
        /// <returns>0 или код ошибки</returns>
        public static int EncryptEx(string fileIn, string fileOut, string pub, string id, string to)
        {
            int ret;

            byte[] key = new byte[304];
            if ((ret = Wbotho.ExtractKey(pub, to, key)) > 0)
            {
                return(ret);
            }

            IntPtr[] ptr = new IntPtr[] { Marshal.AllocHGlobal(304) };
            Marshal.Copy(key, 0, ptr[0], 304);

            ret = Wbotho.EnCryptFileEx(fileIn, fileOut, id, ptr, 1, 0);

            Marshal.FreeHGlobal(ptr[0]);
            return(ret);
        }
예제 #15
0
        /// <summary>
        /// Подписать файл
        /// </summary>
        /// <param name="fileIn">Исходный файл</param>
        /// <param name="fileOut">Подписанный файл</param>
        /// <param name="sec">Путь к секретному ключу</param>
        /// <param name="id">Код аутентификации (КА)</param>
        /// <remarks>wftesto.exe s file.txt file.sig a: 000122222201</remarks>
        public static int Sign(string fileIn, string fileOut, string sec, string id)
        {
            int ret;

            if ((ret = Wbotho.SignInit(sec, "")) > 0)
            {
                Console.WriteLine("SignInit error : {0}", ret);
                return(ret);
            }
            if ((ret = Posh.Sign(fileIn, fileOut, id)) > 0)
            {
                Console.WriteLine("SignFile error : {0}", ret);
                return(ret);
            }
            Wbotho.SignDone();
            Console.WriteLine("File {0} signed to {1}", fileIn, fileOut);
            return(ret);
        }
예제 #16
0
        /// <summary>
        /// Расшифровать файл
        /// </summary>
        /// <param name="fileIn">Исходный файл</param>
        /// <param name="fileOut">Расшифрованный файл</param>
        /// <param name="sec">Путь к секретному ключу</param>
        /// <param name="pub">Путь к открытым ключам</param>
        /// <param name="id">Номер получателя</param>
        /// <remarks>wftesto.exe d file.cry file.txt c:\key c:\pub 1810</remarks>
        public static int Decrypt(string fileIn, string fileOut, string sec, string pub, string id)
        {
            int ret;

            if ((ret = Wbotho.CryptoInit(sec, pub)) > 0)
            {
                Console.WriteLine("CryptoInit error : {0}", ret);
                return(ret);
            }
            if ((ret = Posh.Decrypt(fileIn, fileOut, id)) > 0)
            {
                Console.WriteLine("DeCryptFile error : {0}", ret);
                return(ret);
            }
            Wbotho.CryptoDone();
            Console.WriteLine("File {0} decrypted to {1}", fileIn, fileOut);
            return(ret);
        }
예제 #17
0
        /// <summary>
        /// Зашифровать файл
        /// </summary>
        /// <param name="fileIn">Исходный файл</param>
        /// <param name="fileOut">Зашифрованный файл</param>
        /// <param name="sec">Путь к секретному ключу</param>
        /// <param name="pub">Путь к открытым ключам</param>
        /// <param name="id">Номер отправителя (серия опционально)</param>
        /// <param name="to">Номера получателей (той же серии) ...</param>
        /// <remarks>
        /// wftesto.exe e file.txt file.cry a:\ c:\pub 0001 0002
        /// wftesto.exe e file.txt file.cry a:\ c:\pub 0001 0003 0004
        /// wftesto.exe e file.txt file.cry c:\key\ c:\pub 0005[999999] 0006 0007
        /// </remarks>
        public static int Encrypt(string fileIn, string fileOut, string sec, string pub, string id, params string[] to)
        {
            int ret;

            if ((ret = Wbotho.CryptoInit(sec, pub)) > 0)
            {
                Console.WriteLine("CryptoInit error : {0}", ret);
                return(ret);
            }
            if ((ret = Posh.Encrypt(fileIn, fileOut, id, to)) > 0)
            {
                Console.WriteLine("EnCryptFile error : {0}", ret);
                return(ret);
            }
            Wbotho.CryptoDone();
            Console.WriteLine("File {0} encrypted to {1}", fileIn, fileOut);
            return(ret);
        }
예제 #18
0
        /// <summary>
        /// Проверить все подписи в конце файла (новое: они реально проверяются)
        /// </summary>
        /// <param name="file">Подписанный файл</param>
        /// <param name="fileSig">Файл с подписями</param>
        /// <param name="pub">Путь к открытым ключам</param>
        /// <remarks>wftesto.exe v2 file.txt file.sig c:\pub</remarks>
        public static int VerifySeparate(string file, string fileSig, string pub)
        {
            int ret;

            if ((ret = Wbotho.SignInit("", pub)) > 0)
            {
                Console.WriteLine("SignInit error : {0}", ret);
                return(ret);
            }
            byte      count;
            CheckList list;

            if ((ret = Wbotho.CheckFileSeparate(file, out count, out list, fileSig)) > 0)
            {
                Console.WriteLine("CheckFileSeparate error : {0}", ret);
                return(ret);
            }
            Wbotho.SignDone();
            for (int i = 0; i < count; i++)
            {
                Console.Write("{0} - ", list.Signs[i].Alias);
                switch (list.Signs[i].Status)
                {
                case 0:     //CORRECT
                    Console.WriteLine("sign is OK");
                    break;

                case 1:     //NOT_CORRECT
                    Console.WriteLine("sign is corrupted");
                    ret = 26;
                    break;

                case 2:     //OKEY_NOT_FOUND
                    Console.WriteLine("key not found");
                    ret = 6;
                    break;
                }
            }
            Wbotho.FreeMemory(list);
            Console.WriteLine("File {0} verified with {1}", file, fileSig);
            return(ret);
        }
예제 #19
0
        /// <summary>
        /// Пакетное зашифрование файлов
        /// </summary>
        /// <param name="pathIn">Папка с исходными файлами</param>
        /// <param name="mask">Маска файлов для обработки (*.*)</param>
        /// <param name="pathOut">Папка для зашифрованных файлов (e)</param>
        /// <param name="ext">Новое расширение для зашифрованных файлов (.*)</param>
        /// <param name="pub">Строка пути к каталогу c OPENKEY (\Pub)</param>
        /// <param name="id">Номер отправителя (XXXXSSSSSS)</param>
        /// <param name="to">Номер получателя (XXXXSSSSSS)</param>
        /// <param name="move">Удалять исходные файлы в случае успеха</param>
        /// <returns>0 или код последней ошибки</returns>
        public static int BulkEncrypt(string pathIn, string mask, string pathOut, string ext, string pub, string id, string to, bool move)
        {
            Wbotho.CryptoInit(pub, pub);

            int ret;

            byte[] key = new byte[304];
            if ((ret = Wbotho.ExtractKey(pub, to, key)) > 0)
            {
                return(ret);
            }

            IntPtr[] ptr = new IntPtr[] { Marshal.AllocHGlobal(304) };
            Marshal.Copy(key, 0, ptr[0], 304);

            Directory.CreateDirectory(pathOut);
            bool changeExt = !ext.Equals(".*");

            foreach (string file in Directory.GetFiles(pathIn, mask))
            {
                string fileOut = Path.Combine(pathOut, changeExt ?
                                              Path.GetFileNameWithoutExtension(file) + ext :
                                              Path.GetFileName(file));
                int r = Wbotho.EnCryptFileEx(file, fileOut, id, ptr, 1, 0);
                if (r == 0 && move && File.Exists(fileOut))
                {
                    File.Delete(file);
                }
                else
                {
                    ret = r;
                }
            }

            Marshal.FreeHGlobal(ptr[0]);

            Wbotho.CryptoDone();
            return(ret);
        }
예제 #20
0
        /// <summary>
        /// Пакетное удаление подписей из файлов
        /// </summary>
        /// <param name="pathIn">Папка с исходными файлами</param>
        /// <param name="mask">Маска файлов для обработки (*.*)</param>
        /// <param name="pathOut">Папка для очищенных файлов (u)</param>
        /// <param name="move">Удалять исходные файлы в случае успеха</param>
        /// <returns>0 или код последней ошибки</returns>
        public static int BulkUnsign(string pathIn, string mask, string pathOut, bool move)
        {
            Directory.CreateDirectory(pathOut);

            int ret = 0;

            foreach (string file in Directory.GetFiles(pathIn, mask))
            {
                string fileOut = Path.Combine(pathOut, Path.GetFileName(file));
                File.Copy(file, fileOut, true);
                int r = Wbotho.DelSign(fileOut, -1);
                if (r == 0 && move && File.Exists(fileOut))
                {
                    File.Delete(file);
                }
                else
                {
                    File.Delete(fileOut);
                    ret = r;
                }
            }
            return(ret);
        }
예제 #21
0
        /// <summary>
        /// Получить перечень загруженных в память драйвера ключей
        /// </summary>
        /// <remarks>wftesto.exe l</remarks>
        public static int ListKeys()
        {
            int        ret;
            SlotsTable table = new SlotsTable();

            table.Slots = new UsrKeysInfo[16];
            uint count;

            if ((ret = Wbotho.GetDrvInfo(ref table, out count)) > 0)
            {
                Console.WriteLine("GetDrvInfo error : {0}", ret);
                return(ret);
            }
            Console.WriteLine();
            Console.Write("DrvInfo:");
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine();
                Console.WriteLine("Slot : {0}", table.Slots[i].KeySlotNumber);
                Console.WriteLine("NUM  : {0}", table.Slots[i].Num);
                Console.WriteLine("NUMP : {0}", table.Slots[i].Nump);
            }
            return(ret);
        }
예제 #22
0
 /// <summary>
 /// Подпись файла с добавлением подписи в конец подписываемого файла
 /// </summary>
 /// <param name="fileIn">Исходный файл</param>
 /// <param name="fileOut">Подписанный файл</param>
 /// <param name="id">Код аутентификации (КА)</param>
 /// <returns>0 или код ошибки</returns>
 public static int Sign(string fileIn, string fileOut, string id)
 {
     return(Wbotho.SignFile(fileIn, fileOut, id));
 }
예제 #23
0
 /// <summary>
 /// Подпись файла с сохранением ЭЦП в отдельном файле
 /// </summary>
 /// <param name="file">Исходный файл</param>
 /// <param name="id">Код аутентификации (КА)</param>
 /// <param name="fileSign">Отдельный файл с подписями</param>
 /// <returns>0 или код ошибки</returns>
 public static int SignSeparate(string file, string id, string fileSign)
 {
     return(Wbotho.SignFileSeparate(file, id, fileSign));
 }
예제 #24
0
 /// <summary>
 /// Удаление подписи, добавленной в конец исходного файла
 /// </summary>
 /// <param name="file">Файл с подписями</param>
 /// <returns>0 или код ошибки</returns>
 public static int Unsign(string file)
 {
     return(Wbotho.DelSign(file, -1));
 }
예제 #25
0
 /// <summary>
 /// Расшифрование файла
 /// </summary>
 /// <param name="fileIn">Исходный зашифрованный файл</param>
 /// <param name="fileOut">Расшифрованный файл</param>
 /// <param name="id">Номер получателя (XXXX)</param>
 /// <returns>0 или код ошибки</returns>
 public static int Decrypt(string fileIn, string fileOut, string id)
 {
     return(Wbotho.DeCryptFile(fileIn, fileOut, ushort.Parse(id)));
 }