Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cmd; add pass/env schema #56

Merged
merged 3 commits into from
Jun 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions cmd/bsum/bsum.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Hash files using belt-hash / bash-hash
\project bee2/cmd
\created 2014.10.28
\version 2024.01.22
\version 2024.06.14
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -182,7 +182,14 @@ static int bsumHash(octet hash[], size_t hid, const char* filename)
printf("%s: FAILED [read]\n", filename);
return -1;
}
fclose(fp);
// закрыть файл
if (fclose(fp) != 0)
{
memWipe(buf, sizeof(buf));
memWipe(state, sizeof(state));
printf("%s: FAILED [close]\n", filename);
return -1;
}
// возвратить хэш-значение
if (hid == 0)
beltHashStepG(hash, state);
Expand Down Expand Up @@ -228,7 +235,7 @@ static int bsumCheck(size_t hid, const char* filename)
size_t bad_hashes = 0;
// длина хэш-значения в байтах
hash_len = bsumHidHashLen(hid);
// открыть checksum_file
// открыть файл контрольных сумм
fp = fopen(filename, "rb");
if (!fp)
{
Expand Down Expand Up @@ -266,7 +273,13 @@ static int bsumCheck(size_t hid, const char* filename)
}
printf("%s: OK\n", str + 2 * hash_len + 2);
}
fclose(fp);
// закрыть файл контрольных сумм
if (fclose(fp) != 0)
{
printf("%s: FAILED [close]\n", filename);
return -1;
}
// печать предупреждений
if (bad_lines)
fprintf(stderr, bad_lines == 1 ?
"WARNING: %lu input line (out of %lu) is improperly formatted\n" :
Expand Down
27 changes: 14 additions & 13 deletions cmd/cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Command-line interface to Bee2
\project bee2/cmd
\created 2022.06.09
\version 2023.12.17
\version 2024.06.14
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -338,13 +338,15 @@ cmdPwdRead(). Схема возврата [pwd_len?]pwd не используе
Пароль задается в командной строке в стиле OpenSSL:
- обычно после аргумента "-pass" / "-passin" / "-passout" / ...;
- имеется несколько схем задания пароля;
- схема pass предлназначена для задания пароля прямо в командной строке:
- схема pass предназначена для задания пароля прямо в командной строке:
"-pass pass:password";
- схема share предлназначена для задания пароля с помощью методов
- схема env предназначена для задания пароля через переменную окружения:
"-pass env:ENV_VAR";
- схема share предназначена для задания пароля с помощью методов
разделения секрета в соответствии с правилами СТБ 34.101.78:
"-pass share:\"share_descr\"";
"-pass share:\"share_descr\"".

В последнем случае параметры share_args, которые описывают настройку разделения
В схеме share параметры share_args, которые описывают настройку разделения
секрета, имеют следующий синтаксис:
\code
[-t<nn>] [-l<mmm>] -pass <schema> <share1> <share2> ....
Expand All @@ -356,8 +358,8 @@ cmdPwdRead(). Схема возврата [pwd_len?]pwd не используе
- <share1>, <share2>,... -- файлы с частичными секретами (их число должно быть
не меньше порога и не больше 16).

\todo Поддержать опции "env:var", "file:pathname", "fd:number" и "stdin",
реализованные в OpenSSL
\todo Поддержать опции "file:pathname", "fd:number" и "stdin", реализованные
в OpenSSL
(https://www.openssl.org/docs/manmaster/man1/openssl-passphrase-options.html).

\todo Поддержать правила кодирования паролей, реализованные в OpenSSL
Expand Down Expand Up @@ -401,13 +403,12 @@ void cmdPwdClose(
/*! \brief Длина пароля */
#define cmdPwdLen strLen

/*! \brief Построение пароля
/*! \brief Генерация пароля

По инструкциям во фрагменте cmdline командной строки строится пароль pwd.
\pre При использовании некоторых опций, в частности "share", должен быть
проинициализирован штатный ГСЧ: rngIsValid() == TRUE.
\return ERR_OK, если пароль успешно построен, и код ошибки
в противном случае.
По инструкциям во фрагменте cmdline командной строки генерируется пароль pwd.
\expect{ERR_NOT_IMPLEMENTED} Используется парольная схема share.
\return ERR_OK, если пароль успешно сгенерирован, и код ошибки в противном
случае.
\remark За закрытие пароля отвечает вызывающая программа.
*/
err_t cmdPwdGen(
Expand Down
86 changes: 51 additions & 35 deletions cmd/core/cmd_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Command-line interface to Bee2: file management
\project bee2/cmd
\created 2022.06.08
\version 2023.06.23
\version 2024.06.14
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -38,8 +38,9 @@ size_t cmdFileSize(const char* file)
return SIZE_MAX;
}
size = ftell(fp);
fclose(fp);
return (size == -1L) ? SIZE_MAX : (size_t)size;
if (fclose(fp) != 0)
size = -1;
return (size < 0) ? SIZE_MAX : (size_t)size;
}

/*
Expand All @@ -50,39 +51,44 @@ size_t cmdFileSize(const char* file)

err_t cmdFileWrite(const char* file, const void* buf, size_t count)
{
err_t code;
FILE* fp;
// pre
ASSERT(strIsValid(file));
ASSERT(memIsValid(buf, count));
// записать
code = (fp = fopen(file, "wb")) ? ERR_OK : ERR_FILE_CREATE;
ERR_CALL_CHECK(code);
code = count == fwrite(buf, 1, count, fp) ? ERR_OK : ERR_FILE_WRITE;
fclose(fp);
// завершить
return code;
if (!(fp = fopen(file, "wb")))
return ERR_FILE_CREATE;
if (count != fwrite(buf, 1, count, fp))
{
fclose(fp);
return ERR_FILE_WRITE;
}
if (fclose(fp) != 0)
return ERR_BAD_FILE;
return ERR_OK;
}

err_t cmdFileAppend(const char* file, const void* buf, size_t count)
{
err_t code;
FILE* fp;
// pre
ASSERT(strIsValid(file));
ASSERT(memIsValid(buf, count));
// записать
code = (fp = fopen(file, "ab")) ? ERR_OK : ERR_FILE_OPEN;
ERR_CALL_CHECK(code);
code = count == fwrite(buf, 1, count, fp) ? ERR_OK : ERR_FILE_WRITE;
fclose(fp);
// завершить
return code;
// дописать
if (!(fp = fopen(file, "ab")))
return ERR_FILE_OPEN;
if (count != fwrite(buf, 1, count, fp))
{
fclose(fp);
return ERR_FILE_WRITE;
}
if (fclose(fp) != 0)
return ERR_BAD_FILE;
return ERR_OK;
}

err_t cmdFileReadAll(void* buf, size_t* count, const char* file)
{
err_t code;
// pre
ASSERT(memIsValid(count, O_PER_S));
ASSERT(strIsValid(file));
Expand All @@ -91,21 +97,25 @@ err_t cmdFileReadAll(void* buf, size_t* count, const char* file)
{
FILE* fp;
ASSERT(memIsValid(buf, *count));
code = (fp = fopen(file, "rb")) ? ERR_OK : ERR_FILE_OPEN;
ERR_CALL_CHECK(code);
if (!(fp = fopen(file, "rb")))
return ERR_FILE_OPEN;
if (fread(buf, 1, *count, fp) != *count || getc(fp) != EOF)
code = ERR_FILE_READ;
fclose(fp);
{
fclose(fp);
return ERR_FILE_READ;
}
if (fclose(fp) != 0)
return ERR_BAD_FILE;
}
// определить длину файла
else
{
size_t size = cmdFileSize(file);
code = size != SIZE_MAX ? ERR_OK : ERR_FILE_READ;
ERR_CALL_CHECK(code);
size_t size;
if ((size = cmdFileSize(file)) == SIZE_MAX)
return ERR_FILE_READ;
*count = size;
}
return code;
return ERR_OK;
}

/*
Expand Down Expand Up @@ -160,17 +170,20 @@ err_t cmdFileDup(const char* ofile, const char* ifile, size_t skip,
}
// дублировать все
else
while (code == ERR_OK)
while (count && code == ERR_OK)
{
size_t c = fread(buf, 1, buf_size, ifp);
if (c != buf_size && !feof(ifp))
count = fread(buf, 1, buf_size, ifp);
if (count != buf_size && !feof(ifp))
code = ERR_FILE_READ;
else if (fwrite(buf, 1, c, ofp) != c)
else if (fwrite(buf, 1, count, ofp) != count)
code = ERR_FILE_WRITE;
}
// завершить
cmdBlobClose(buf);
fclose(ofp), fclose(ifp);
if (fclose(ofp) != 0)
code = (code != ERR_OK) ? code : ERR_BAD_FILE;
if (fclose(ifp) != 0)
code = (code != ERR_OK) ? code : ERR_BAD_FILE;
return code;
}

Expand All @@ -189,8 +202,10 @@ err_t cmdFileValNotExist(int count, char* files[])
ASSERT(strIsValid(*files));
if (fp = fopen(*files, "rb"))
{
fclose(fp);
printf("Some files already exist. Overwrite [y/n]?");
if (fclose(fp) != 0)
return ERR_BAD_FILE;
if (printf("Some files already exist. Overwrite [y/n]?") < 0)
return ERR_FILE_EXISTS;
do
ch = cmdTermGetch();
while (ch != 'Y' && ch != 'y' && ch != 'N' && ch != 'n' && ch != '\n');
Expand All @@ -211,7 +226,8 @@ err_t cmdFileValExist(int count, char* files[])
ASSERT(strIsValid(*files));
if (!(fp = fopen(*files, "rb")))
return ERR_FILE_NOT_FOUND;
fclose(fp);
if (fclose(fp) != 0)
return ERR_BAD_FILE;
}
return ERR_OK;
}
Expand Down
29 changes: 12 additions & 17 deletions cmd/core/cmd_privkey.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Command-line interface to Bee2: managing private keys
\project bee2/cmd
\created 2022.06.20
\version 2023.06.18
\version 2024.06.14
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -38,16 +38,12 @@ err_t cmdPrivkeyWrite(const octet privkey[], size_t privkey_len,
octet* salt;
octet* epki;
size_t epki_len;
FILE* fp;
// pre
ASSERT(privkey_len == 24 || privkey_len == 32 || privkey_len == 48 ||
privkey_len == 64);
ASSERT(memIsValid(privkey, privkey_len));
ASSERT(strIsValid(file));
ASSERT(cmdPwdIsValid(pwd));
// входной контроль
if (!rngIsValid())
return ERR_BAD_RNG;
// определить длину контейнера
code = bpkiPrivkeyWrap(0, &epki_len, 0, privkey_len, 0, 0, 0, iter);
ERR_CALL_CHECK(code);
Expand All @@ -56,18 +52,16 @@ err_t cmdPrivkeyWrite(const octet privkey[], size_t privkey_len,
ERR_CALL_CHECK(code);
salt = (octet*)stack;
epki = salt + 8;
// запустить ГСЧ
code = cmdRngStart(TRUE);
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
// установить защиту
rngStepR(salt, 8, 0);
code = bpkiPrivkeyWrap(epki, 0, privkey, privkey_len, (const octet*)pwd,
cmdPwdLen(pwd), salt, iter);
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
// открыть файл для записи
fp = fopen(file, "wb");
code = fp ? ERR_OK : ERR_FILE_CREATE;
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
// записать
code = fwrite(epki, 1, epki_len, fp) == epki_len ? ERR_OK : ERR_FILE_WRITE;
fclose(fp);
// записать в файл
code = cmdFileWrite(file, epki, epki_len);
// завершить
cmdBlobClose(stack);
return code;
Expand All @@ -89,7 +83,6 @@ err_t cmdPrivkeyRead(octet privkey[], size_t* privkey_len, const char* file,
size_t epki_len_max;
void* stack;
octet* epki;
FILE* fp;
// pre
ASSERT(memIsNullOrValid(privkey_len, sizeof(size_t)));
ASSERT(!privkey_len || *privkey_len == 0 || *privkey_len == 24 ||
Expand Down Expand Up @@ -135,14 +128,16 @@ err_t cmdPrivkeyRead(octet privkey[], size_t* privkey_len, const char* file,
code = cmdBlobCreate(stack, epki_len_max + 1);
ERR_CALL_CHECK(code);
epki = (octet*)stack;
// прочитать контейнер
code = (fp = fopen(file, "rb")) ? ERR_OK : ERR_FILE_OPEN;
// определить длину контейнера
code = cmdFileReadAll(0, &epki_len, file);
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
epki_len = fread(epki, 1, epki_len_max + 1, fp);
fclose(fp);
// проверить длину
code = (epki_len_min <= epki_len && epki_len <= epki_len_max) ?
ERR_OK : ERR_BAD_FORMAT;
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
// читать
code = cmdFileReadAll(epki, &epki_len, file);
ERR_CALL_HANDLE(code, cmdBlobClose(stack));
// снять защиту
code = bpkiPrivkeyUnwrap(privkey, &epki_len_min, epki, epki_len,
(const octet*)pwd, cmdPwdLen(pwd));
Expand Down
Loading
Loading