diff --git a/cdoc/CDoc2Writer.cpp b/cdoc/CDoc2Writer.cpp index 6c81f69..6694228 100644 --- a/cdoc/CDoc2Writer.cpp +++ b/cdoc/CDoc2Writer.cpp @@ -549,7 +549,7 @@ CDoc2Writer::encrypt(libcdoc::MultiDataSource& src, const std::vectoropen(name, size); result != libcdoc::OK) break; - if (result = tar->writeAll(src); result != libcdoc::OK) + if (result = tar->writeAll(src); result < 0) break; result = src.next(name, size); } diff --git a/cdoc/cdoc-tool.cpp b/cdoc/cdoc-tool.cpp index a3043dd..12adf66 100644 --- a/cdoc/cdoc-tool.cpp +++ b/cdoc/cdoc-tool.cpp @@ -17,6 +17,10 @@ */ #include +#ifndef _WIN32 +#include +#include +#endif #include "CDocCipher.h" #include "ConsoleLogger.h" @@ -449,6 +453,32 @@ parse_key_data(LockData& ldata, const int& arg_idx, int argc, char *argv[]) return 0; } +static std::string +inputSecret(std::string_view text) +{ + cout << text; +#ifdef _WIN32 + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + DWORD mode = 0; + GetConsoleMode(hStdin, &mode); + SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT); +#else + termios o {}; + tcgetattr(STDIN_FILENO, &o); + termios n = o; + n.c_lflag &= ~ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &n); +#endif + string result; + getline(std::cin, result); +#ifdef _WIN32 + SetConsoleMode(hStdin, mode); +#else + tcsetattr(STDIN_FILENO, TCSANOW, &o); + cout << endl; +#endif + return result; +} // // cdoc-tool decrypt ARGUMENTS FILE [OUTPU_DIR] @@ -504,14 +534,8 @@ static int ParseAndDecrypt(int argc, char *argv[]) // Ask secret if not provided if (ldata.secret[0] == '?') { - ldata.secret.clear(); - cout << "Enter secret: "; - int ch = std::getchar(); - while (ch != '\n') { - ldata.secret.push_back((uint8_t) ch); - ch = std::getchar(); - } - cout << std::endl; + std::string secret = inputSecret("Enter password: "); + ldata.secret.assign(secret.cbegin(), secret.cend()); } CDocCipher cipher; diff --git a/test/pipe.h b/test/pipe.h index ed124a7..5f1d4e5 100644 --- a/test/pipe.h +++ b/test/pipe.h @@ -77,7 +77,7 @@ struct PipeCrypto : public libcdoc::CryptoBackend { }; struct PipeWriter { - static constexpr size_t BUFSIZE = 1024 * 1024; + static constexpr size_t BUFSIZE = 1024 * 16; PipeWriter(libcdoc::CDocWriter *writer, const std::vector& files) : _writer(writer), _files(files), current(-1), cpos(0) {}