1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/*
*******************************************************************************
\file util.h
\brief Utilities
\project bee2 [cryptographic library]
\created 2012.07.16
\version 2025.06.10
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
*/
/*!
*******************************************************************************
\file util.h
\brief Вспомогательные функции и макросы
*******************************************************************************
*/
extern "C" NDEBUG
/*! \brief Предполагается выполнение условия
Для отладочной версии вычислить e и завершить выполнение, если e == 0.
\remark Используется собственная редакция макроса assert(). В стандартной
редакции есть проверка условия. При правильной работе программы условие
никогда не выполняется, и анализаторы покрытия тестами могут показывать
только частичное покрытие.
*/
extern void ;
/*! \brief Проверяется выполнение условия
Вычислить e (всегда) и завершить выполнение, если a == 0 (при отладке).
*/
/*! \brief Ожидается выполнение условия
Ожидать выполнения a, ничего не предпринимая.
\remark Макрос EXPECT указывает на условия, которые ожидаются,
но все таки могут быть нарушены. Примеры условий: простота числа,
неприводимость многочлена, корректность эллиптической кривой.
\remark Ожидаемые условия могут быть труднопроверяемыми. Поэтому
программы не могут полагаться на безусловное выполнение этих условий
и должны устойчиво работать даже при их нарушении. Например,
программа сложения точек эллиптической кривой над простым полем GF(p)
должна завершать сложение даже если p -- составное.
\remark Следует четко разграничивать ASSERT (как правило, самоконтроль
программиста) и EXPECT (как правило, контроль входных данных).
\remark Некоторые ожидаемые условия могут частично проверяться.
Например, EXPECT(p -- нечетное простое) может быть поддержано проверкой
ASSERT(p -- нечетное). Безусловные проверки, поддерживающие ожидаемые
условия, должны по возможности документироваться.
*/
/*! \brief Поменять местами значения переменных a и b
\pre Переменные имеют один тип.
\pre Переменные являются целочисленными, допускающими операцию ^.
\pre Переменные a и b различны.
\remark Если a и b --- это одна и та же переменная, то она будет
обнулена. Безопасный код:
\code
a != b ? SWAP(a, b) : 0;
\endcode
*/
/*! \brief Поменять местами значения указателей a и b
\pre Переменные a и b различны.
*/
/*!
*******************************************************************************
\def CLEAN
\brief Очистить переменную
\def CLEAN2
\brief Очистить две переменные
\def CLEAN3
\brief Очистить три переменные
\pre Целевые переменные допускают присваивание нуля.
\remark Макросы CLEANx предназначены для очистки критических переменных по
завершении функций. После очистки переменная приводится к типу void, что
потенциально подавляет предупреждения статических анализаторов о
неиспользуемых участках кода (см. напр.
https://clang.llvm.org/docs/analyzer/user-docs/FAQ.html#dead-store).
*******************************************************************************
*/
/*
*******************************************************************************
Версия
*******************************************************************************
*/
/*! \brief Версия
Определяется версия библиотеки bee2.
\return Версия в виде строки major.minor.patch.
*/
const char* ;
/*
*******************************************************************************
Деструкторы
*******************************************************************************
*/
/*! \brief Регистрация деструктора
Регистрируется функция fn, которая будет вызвана при завершении работы
программы / выгрузке динамической библиотеки.
\return Признак успеха.
\remark Зарегистрированные функции вызываются в порядке LIFO
(last-in-first-out).
\remark Одна и та же функция может быть зарегистрирована несколько раз.
*/
bool_t ;
/*
*******************************************************************************
Минимум / максимум
*******************************************************************************
*/
/*! \brief Минимум
Определяется минимум из n чисел типа size_t, переданных как дополнительные
параметры.
\pre n > 0.
\return Минимум.
*/
size_t ;
/*! \brief Максимум
Определяется максимум из n чисел типа size_t, переданных как дополнительные
параметры.
\pre n > 0.
\return Максимум.
*/
size_t ;
/*
*******************************************************************************
Контрольные суммы
*******************************************************************************
*/
/*! \brief Контрольная сумма CRC32
Определяется контрольная сумма буфера [count]buf. При расчете контрольной
суммы используется состояние state. Контрольная сумма рассчитывается
по алгоритму CRC32 из стандарта ISO 3309.
\remark Контрольную сумму большого фрагмента данных можно определять
последовательно путем многократных обращений к функции.
При первом обращении состояние state должно быть нулевым.
\return Контрольная сумма.
*/
u32 ;
/*! \brief Контрольная сумма FNV32
Определяется контрольная сумма буфера [count]buf. При расчете контрольной
суммы используется состояние state. Контрольная сумма рассчитывается по
алгоритму FNV-1a с размерностью 32
(http://isthe.com/chongo/tech/comp/fnv/).
\remark Контрольную сумму большого фрагмента данных можно определять
последовательно путем многократных обращений к функции.
При первом обращении state должно равняться 2166136261 = 0x811C9DC5.
\return Контрольная сумма.
*/
u32 ;
/*! \brief 32-разрядный нонс
По уникальным системным данным (дата, время) строится 32-разрядный нонс.
\return Нонс.
\remark Нонс (калька с англ. nonce) --- "слабо" повторяющееся значение,
которое используется в криптографических протоколах. С помощью нонсов можно
инициализовать генераторы псевдослучайных чисел (см. prngCOMBOStart()).
*/
u32 ;
} /* extern "C" */
/* __BEE2_UTIL_H */