Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
d76c830
фича: проработали функции LPS
ShowhyT Apr 16, 2026
6dac51c
фича: проработали алгоритм и наадо оптимизацией
ShowhyT May 8, 2026
b95f746
Change branch from 'module' to 'main' for push events
ShowhyT May 8, 2026
31ff0a8
фикс: пофиксили работу на windows/linux
ShowhyT May 8, 2026
a2f12f2
оптимизация: оптимизировали работу алгоритма
ShowhyT May 9, 2026
43131c7
фича: добавили поддержку локализации для тестов и бенчмарка
ShowhyT May 9, 2026
7950c2a
фикс: переписал реализацию тестовых векторов по структуре проекта
ShowhyT May 10, 2026
c2fc76c
фича: добавил вывод всех тестов в output CI/CD и переименовал констан…
ShowhyT May 11, 2026
e976fbe
фикс: починили сборку на windows
May 11, 2026
685a6b4
фикс: исправил опечатку в README.md
ShowhyT May 15, 2026
2fbbdf3
фича: улучшил вывод cli-утилиты. Удалил лишние функции
ShowhyT May 15, 2026
8a510ab
Merge branch 'main' of github.com:ShowhyT/projectwork
ShowhyT May 15, 2026
7149ebd
фикс: добавил проверки, которые закрывают уязвимости
ShowhyT May 16, 2026
002ce56
Update streebog_transform.c
Jabatrue May 17, 2026
d887969
Update streebog_tables.c
Jabatrue May 17, 2026
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
26 changes: 14 additions & 12 deletions .clang-tidy
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
---
Checks: 'readability-identifier-naming'
CheckOptions:
# Классы и структуры: PascalCase
# Классы и структуры
- key: readability-identifier-naming.ClassCase
value: PascalCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: PascalCase
value: CamelCase

# Публичные поля (в структурах): snake_case
# Публичные поля
- key: readability-identifier-naming.PublicMemberCase
value: snake_case
# Приватные поля (в классах): snake_case_ с подчеркиванием в конце
value: lower_case

# Приватные поля
- key: readability-identifier-naming.PrivateMemberCase
value: snake_case
value: lower_case
- key: readability-identifier-naming.PrivateMemberSuffix
value: '_'

# Локальные переменные: snake_case
# Локальные переменные
- key: readability-identifier-naming.VariableCase
value: snake_case
value: lower_case

# Функции и методы: PascalCase
# Функции и методы
- key: readability-identifier-naming.FunctionCase
value: PascalCase
value: CamelCase

# Константы (k + PascalCase)
- key: readability-identifier-naming.GlobalConstantCase
Expand All @@ -32,3 +32,5 @@ CheckOptions:
value: 'k'

HeaderFilterRegex: '^(src/|include/|tools/)'
# Чтобы не ругался на саму библиотеку Unity в папке tests/
ExcludeHeaderFilterRegex: '.*unity/.*'
54 changes: 27 additions & 27 deletions .github/workflows/cmake-multi-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ name: CMake on multiple platforms
on:
push:
#branches: [ "master", "module" ]
branches: [ "module" ]
branches: ["main"]
pull_request:
branches: [ "master" ]
branches: ["master"]

jobs:
build:
Expand Down Expand Up @@ -36,32 +36,32 @@ jobs:
cpp_compiler: g++

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4

- name: Set reusable strings
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
id: strings
shell: bash
run: |
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
- name: Set reusable strings
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
id: strings
shell: bash
run: |
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"

- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -G "Ninja"
-B ${{ steps.strings.outputs.build-output-dir }}
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-S ${{ github.workspace }}
- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -G "Ninja"
-B ${{ steps.strings.outputs.build-output-dir }}
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-S ${{ github.workspace }}

- name: Build
# Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
run: cmake --build ${{ steps.strings.outputs.build-output-dir }}
- name: Build
# Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
run: cmake --build ${{ steps.strings.outputs.build-output-dir }}

- name: Test
working-directory: ${{ steps.strings.outputs.build-output-dir }}
# Execute tests defined by the CMake configuration. Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
run: ctest --build-config ${{ matrix.build_type }}
- name: Test
working-directory: ${{ steps.strings.outputs.build-output-dir }}
# Execute tests defined by the CMake configuration. Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
run: ctest -V --build-config ${{ matrix.build_type }}
48 changes: 26 additions & 22 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.10)
cmake_minimum_required(VERSION 3.14)

project(Streebog LANGUAGES C)

Expand All @@ -8,49 +8,53 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_C_COMPILER gcc)

enable_testing()

# --- Инструменты качества кода ---
# --- Настройки компиляции ---
add_compile_options(-Wall -Wextra -Wpedantic -O3 -march=native)

# Clang-Tidy
find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
if(CLANG_TIDY_EXE)
set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_EXE})
set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_EXE})
endif()

# Clang-Format
find_program(CLANG_FORMAT_EXE NAMES "clang-format")
if(CLANG_FORMAT_EXE)
file(GLOB_RECURSE ALL_SOURCE_FILES src/*.c src/*.h tests/*.c tests/*.h)
add_custom_target(format
file(GLOB_RECURSE ALL_SOURCE_FILES src/*.c src/*.h tests/tests.c)
add_custom_target(format
COMMAND ${CLANG_FORMAT_EXE} -i ${ALL_SOURCE_FILES}
COMMENT "Formatting code with clang-format..."
)
endif()

add_compile_options(-Wall -Wextra -Wpedantic)

# Библиотека самого алгоритма
add_library(streebog_lib
src/streebog.c
add_library(streebog_lib
src/streebog.c
src/streebog_tables.c
src/streebog_compress.c
src/streebog_utils.c
src/streebog_transform.c
)
# Библиотека тестов
add_library(unity tests/unity/unity.c)

set_target_properties(unity PROPERTIES C_CLANG_TIDY "")
target_include_directories(streebog_lib PUBLIC src)

# Библиотека Unity (фреймворк для тестов)
add_library(unity_lib
tests/unity/unity.c
)
target_include_directories(unity_lib PUBLIC tests/unity)

set(TEST_TARGETS test_streebog)

foreach(target ${TEST_TARGETS})
add_executable(${target} tests/tests.c)
target_link_libraries(${target} PRIVATE streebog_lib unity_lib)
endforeach()
add_executable(${TEST_TARGETS} tests/test_main.c tests/test_vectors_256.c tests/test_vectors_512.c)
target_link_libraries(${TEST_TARGETS} PRIVATE streebog_lib unity)

# CLI-утилита
add_executable(streebog_cli tools/main.c)
target_link_libraries(streebog_cli PRIVATE streebog_lib)

# Бенчмарк
add_executable(benchmark tools/bench.c)
target_link_libraries(benchmark PRIVATE streebog_lib)

add_test(NAME StreebogInit COMMAND test_streebog)
add_test(NAME StreebogTests COMMAND test_streebog)
add_test(NAME StreebogBenchmark COMMAND benchmark)
22 changes: 19 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
# projectwork
Работаем по проекту ГОСТ-34-11.2012
Работаем по проекту ГОСТ P 34-11.2012

# Роли в проекте:
- **skellekroon-svg** - математик-программист, обеспечивает и проверяет корректность программирования математических объектов
- **Jaba** - программист арифметики в конечных полях.
- **ShowhyT** - программист всего алгоритма, включая процедуры ввода-вывода
- **Armigodf** - программист оболочки под DOS и Windows, сборщик программных модулей
- **Pomidor/ShowhyT** - тестировщик корректности работы программы и её оптимальности.

---
# Строение проекта:
```
projectwork/
├── Makefile # Сборка
├── CMakeLists.txt # Сборка
├── README.md # Описание проекта
├── include/
Expand Down Expand Up @@ -41,3 +41,19 @@ projectwork/
├── GOST_R_3411-2012.pdf # Текст стандарта
└── gost-r-34.pdf # Текст стандарта
```
---
# Распределение модулей выполняемой программы для ролей

**Математик** — `streebog_tables.c/h`, `streebog_transform.c`, проверяет корректность всех констант и преобразований S, P, L, X, E.

**Программист арифметики GF** — `streebog_transform.c` (реализация), `streebog_utils.c`, `streebog_internal.h`. Пишет само умножение в поле Галуа для функции L.

**Программист алгоритма** — `streebog.h`, `streebog.c`, `streebog_compress.c`, `tools/main.c`. Init/Update/Final, функция сжатия g_N, CLI-утилита.

**Сборщик** — `CMakeLists.txt`, `.clang-format`, `.clang-tidy`, `.gitignore`, `README.md`. Настраивает сборку под Windows/DOS, следит чтобы всё компилировалось.

**Тестировщик** — `tests/`, `tools/bench.c`. Пишет тест-векторы из Приложения А стандарта, проверяет корректность и производительность.

`streebog_transform.c` Делают математик и программист GF вместе

`streebog_compress.c` — Программист алгоритма и математик согласовывают интерфейс `g_N`.
58 changes: 52 additions & 6 deletions include/streebog.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,63 @@
#define STREEBOG_512_DIGEST_SIZE 64 /* байт */
#define STREEBOG_BLOCK_SIZE 64 /* размер блока (байт — 512 бит) */

/**
* @brief Состояние 512-битного блока (позволяет доступ как к байтам, так и к 64-битным словам).
*/
typedef union {
uint8_t b[64];
uint64_t q[8];
} streebog_state_t;

/**
* @brief Контекст хэш-функции Стрибог (ГОСТ Р 34.11-2012).
*
* Хранит внутреннее состояние между вызовами функций обновления.
* Размер составляет порядка 200 байт.
*/
typedef struct {
uint8_t h[64]; /*Текущее значение хэша для 512 бит */
uint8_t N[64]; /* Счётчик отработки битов */
uint8_t sigma[64]; /* контрольная сумма всех блоков */
uint8_t buffer[64]; /*хранилище для неполных блоков */
size_t len_buffer;
int t_size; /*256 или 512 в init */
streebog_state_t h; /**< Текущее промежуточное значение хэша (512 бит) */
streebog_state_t N; /**< Счётчик длины обработанного сообщения в битах (512 бит) */
streebog_state_t sigma; /**< Контрольная сумма всех обработанных блоков (512 бит) */
streebog_state_t buffer; /**< Внутренний буфер для накопления неполных блоков (до 64 байт) */
size_t len_buffer; /**< Текущее количество байт в буфере [0..63] */
int t_size; /**< Размер итогового хэша в битах: 256 или 512 */
} streebog_ctx_t;

/**
* @brief Инициализация контекста Стрибога.
*
* Подготавливает структуру состояния к началу хэширования, устанавливая
* начальные векторы (IV) в зависимости от запрашиваемой длины хэша.
*
* @param[out] ctx Указатель на инициализируемый контекст. Обязан быть валидным (не NULL).
* @param[in] bits Размер выходного хэша в битах. Допустимые значения: 256 или 512.
*/
void StreebogInit(streebog_ctx_t* ctx, int bits);

/**
* @brief Накопление данных и хэширование полных блоков.
*
* Может вызываться многократно для хэширования данных по частям.
*
* @param[in,out] ctx Указатель на инициализированный контекст.
* @param[in] data Указатель на входной буфер данных.
* @param[in] len Длина входного буфера в байтах (может быть любой).
*/
void StreebogUpdate(streebog_ctx_t* ctx, const uint8_t* data, size_t len);

/**
* @brief Завершение хэширования и получение итогового значения (Digest).
*
* Выполняет паддинг последнего блока по стандарту ГОСТ Р 34.11-2012,
* обрабатывает счётчик длины и контрольную сумму, формируя финальный хэш.
*
* @param[in,out] ctx Указатель на контекст. После вызова функции контекст считается завершенным.
* @param[out] digest Указатель на буфер, куда будет записан хэш.
* Размер буфера должен быть не менее 64 байт (даже для 256-бит,
* так как пишутся младшие или старшие 32 байта в зависимости от реализации,
* однако безопаснее предоставлять 64 байта).
*/
void StreebogFinal(streebog_ctx_t* ctx, uint8_t* digest);

#endif
Loading
Loading