/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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)); }
/// <summary> /// Удаление подписи, добавленной в конец исходного файла /// </summary> /// <param name="file">Файл с подписями</param> /// <returns>0 или код ошибки</returns> public static int Unsign(string file) { return(Wbotho.DelSign(file, -1)); }
/// <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))); }