1dstu.h(3) Library Functions Manual dstu.h(3)
2
3
4
6 dstu.h - Алгоритмы ДСТУ 4145-2002 (Украина)
7
8
10 #include 'bee2/defs.h'
11
12
13 Классы
14 struct dstu_params
15 Долговременные параметры dstu.
16
17 Функции
18 err_t dstuStdParams (dstu_params *params, const char *name)
19 Загрузка стандартных долговременных параметров
20 err_t dstuValParams (const dstu_params *params)
21 Проверка долговременных параметров
22 err_t dstuGenPoint (octet point[], const dstu_params *params, gen_i
23 rng, void *rng_state)
24 Генерация точки
25 err_t dstuValPoint (const dstu_params *params, const octet point[])
26 Проверка точки
27 err_t dstuCompressPoint (octet xpoint[], const dstu_params *params,
28 const octet point[])
29 Сжатие точки
30 err_t dstuRecoverPoint (octet point[], const dstu_params *params, const
31 octet xpoint[])
32 Восстановление точки
33 err_t dstuGenKeypair (octet privkey[], octet pubkey[], const
34 dstu_params *params, gen_i rng, void *rng_state)
35 Генерация пары ключей
36 err_t dstuSign (octet sig[], const dstu_params *params, size_t ld,
37 const octet hash[], size_t hash_len, const octet privkey[], gen_i
38 rng, void *rng_state)
39 Выработка ЭЦП
40 err_t dstuVerify (const dstu_params *params, size_t ld, const octet
41 hash[], size_t hash_len, const octet sig[], const octet pubkey[])
42 Проверка ЭЦП
43
45 Реализованы алгоритмы украинского стандарта ДСТУ 4145-2002.
46
47 Поля структуры долговременных параметров обозначаются также как в ДСТУ.
48
49 Максимальная размерность DSTU_SIZE соответствуют неприводимому
50 многочлену степени 509, указанному в ДСТУ.
51
52 Базовое поле f = GF(2^m) описывается массивом из 4 размерностей,
53 задающих полиномиальный или нормальный базисы. Первый элемент массива
54 p[0] -- это степень расширения m поля f, элементы массива невозрастают:
55 p[0] >= p[1] >= p[2] >= p[3].
56
57 В полиномиальном базисе поле строится как кольцо вычетов GF(2) /
58 (p(x)), где p(x) –- неприводимый трехчлен или пятичлен степени m.
59 Многочлен p(x) определяется следующим образом: p(x) = x^p[0] + x^p[1] +
60 x^p[2] + x^p[3] + 1. При p[2] == 0 должно выполняться также p[3] == 0 и
61 p(x) -- трехчлен.
62
63 Нормальный базис задается установкой p[0] = m, p[1] = p[2] = p[3] = 0.
64 Операции в нормальном базисе не реализованы.
65
66 Степень m базового поля f определяет используемое число октетов в
67 массиве dstu_params::B: в этом массиве используется O_OF_B(m) октет. В
68 буфере сжатой точки xpoint также используется O_OF_B(m) октет. В
69 массиве dstu_params::P, в буферах открытого ключа pubkey и точки point
70 используется 2 * O_OF_B(m) октетов.
71
72 В структуре dstu_params неиспользуемые октеты могут быть заданы
73 произвольным образом.
74
75 Порядок группы точек dstu_params::n не превосходит (2^m + 1 + 2 * 2^{m
76 / 2}) / c, где кофактор c >= 2. Таким образом, порядок dstu_params::n
77 укладывается в O_OF_B(m) октетов и даже, может быть, в меньшее число
78 октетов.
79
80 Прим.
81 Кофактор c >= 2, поскольку точка (0, \sqrt(dstu_params::B)) лежит
82 на кривой и имеет порядок 2.
83
84 Для стандартных кривых, заданных в приложении Г, кофактор равняется
85 2 при dstu_params::A == 1 или 4 при dstu_params::A == 0.
86
87 В буфере личного ключа privkey используется order_no октетов, где
88 order_no -- число значащих (без завершающих нулевых) октетов буфера
89 [O_OF_B(m)]dstu_params::n, т. е. длина числа dstu_params::n в октетах.
90
91 Ожидается [ERR_BAD_INPUT]
92 Все входные указатели корректны.
93
94 Регулярность
95 todo
96
98 err_t dstuCompressPoint (octet xpoint[], const dstu_params * params, const
99 octet point[])
100 Точка point эллиптической кривой, заданной долговременными параметрами
101 params, сжимается в точку xpoint.
102
103 Ожидается [ERR_BAD_PARAMS]
104 Параметры params корректны.
105
106 Возвращает
107 ERR_OK, если точка сжата, и код ошибки в противном случае.
108
109 Прим.
110 Реализован алгоритм из раздела 6.9 ДСТУ.
111
112 Буферы point и xpoint могут пересекаться.
113
114 Аргументы
115 xpoint сжатая точка
116 params параметры
117 point сжимаемая точка
118
119 err_t dstuGenKeypair (octet privkey[], octet pubkey[], const dstu_params *
120 params, gen_i rng, void * rng_state)
121 Для заданных параметров params генерируются личный и открытый ключи
122 privkey и pubkey ключи. При генерации используется генератор rng и его
123 состояние rng_state.
124
125 Ожидается [ERR_BAD_PARAMS]
126 Параметры params корректны.
127
128 Ожидается [ERR_BAD_RNG]
129 Генератор rng (с состоянием rng_state) корректен.
130
131 Ожидается
132 Используется криптографически стойкий генератор rng.
133
134 Возвращает
135 ERR_OK, если ключи сгенерированы, и код ошибки в противном случае.
136
137 Прим.
138 Реализован алгоритм из раздела 9 ДСТУ.
139
140 Аргументы
141 privkey личный ключ
142 pubkey открытый ключ
143 params долговременные параметры
144 rng генератор случайных чисел
145 rng_state состояние генератора
146
147 err_t dstuGenPoint (octet point[], const dstu_params * params, gen_i rng,
148 void * rng_state)
149 Генерируется точка point эллиптической кривой, заданной долговременными
150 параметрами params. При генерации используется генератор rng и его
151 состояние rng_state. Дополнительно проверяется, что порядок point
152 равняется params->n.
153
154 Ожидается [ERR_BAD_PARAMS]
155 Параметры params (кроме базовой точки P) корректны.
156
157 Возвращает
158 ERR_OK, если точка сгенерирована, и код ошибки в противном случае.
159
160 Прим.
161 Указатели point и params->P могут совпадать.
162
163 Реализован алгоритм из раздела 6.8 ДСТУ.
164
165 Аргументы
166 point точка
167 params долговременные параметры
168 rng генератор случайных чисел
169 rng_state состояние генератора
170
171 err_t dstuRecoverPoint (octet point[], const dstu_params * params, const
172 octet xpoint[])
173 Точка point эллиптической кривой, заданной долговременными параметрами
174 params, восстанавливается из x-координаты (point->x).
175
176 Ожидается [ERR_BAD_PARAMS]
177 Параметры params корректны.
178
179 Возвращает
180 ERR_OK, если точка восстановлена, и код ошибки в противном случае.
181
182 Прим.
183 Реализован алгоритм из раздела 6.10 ДСТУ.
184
185 Буферы point и xpoint могут пересекаться.
186
187 Аргументы
188 point восстановленная точка
189 params параметры
190 xpoint сжатая точка
191
192 err_t dstuSign (octet sig[], const dstu_params * params, size_t ld, const
193 octet hash[], size_t hash_len, const octet privkey[], gen_i rng, void *
194 rng_state)
195 Вырабатывается подпись [ld / 8]sig сообщения с хэш-значением
196 [hash_len]hash. Подпись вырабатывается на личном ключе privkey. При
197 выработке ЭЦП используются долговременные параметры params и генератор
198 rng c состоянием rng_state.
199
200 Ожидается [ERR_BAD_PARAMS]
201 Параметры params корректны.
202
203 Ожидается [ERR_BAD_INPUT]
204 :
205
206 • ld делится на 16;
207
208 • два вычета по модулю params->n укладываются в ld битов.
209
210 Ожидается [ERR_BAD_PRIVKEY]
211 Личный ключ privkey корректен.
212
213 Ожидается [ERR_BAD_RNG]
214 Генератор rng (с состоянием rng_state) корректен.
215
216 Ожидается
217 Используется криптографически стойкий генератор rng.
218
219 Возвращает
220 ERR_OK, если подпись выработана, и код ошибки в противном случае.
221
222 Аргументы
223 sig подпись
224 params долговременные параметры
225 ld длина подписи в битах
226 hash хэш-значение
227 hash_len длина хэш-значения в октетах
228 privkey личный ключ
229 rng генератор случайных чисел
230 rng_state состояние генератора
231
232 err_t dstuStdParams (dstu_params * params, const char * name)
233 В params загружаются стандартные долговременные параметры с именем
234 name. Поддерживаются имена '1.2.804.2.1.1.1.1.3.1.1.1.2.0', ...,
235 '1.2.112.0.2.0.34.101.45.3.2.9'. Это имена стандартных эллиптических
236 кривых, заданных в таблице Г.2. Первым именем названа кривая над
237 GF(2^163), последним -- кривая над GF(2^431).
238
239 Возвращает
240 ERR_OK, если параметры загружены, и код ошибки в противном случае.
241
242 Прим.
243 Имена (идентификаторы) параметров взяты из файла
244 http://www.crypto.org.ua/Media/Default/patches/dstu101e.patch
245 (patch для OpenSSL).
246
247 ДСТУ не определяет стандартные базовые точки. Их надо генерировать
248 дополнительно, например, с помощью функции dstuGenPoint().
249
250 Аргументы
251 params стандартные параметры
252 name имя параметров
253
254 err_t dstuValParams (const dstu_params * params)
255 Проверяется корректность долговременных параметров params.
256
257 Возвращает
258 ERR_OK, если параметры корректны, и код ошибки в противном случае.
259
260 Прим.
261 Проверяется корректность в том числе и базовой точки P.
262
263 Аргументы
264 params параметры
265
266 err_t dstuValPoint (const dstu_params * params, const octet point[])
267 Проверяется, что точка point эллиптической кривой, заданной
268 долговременными параметрами params, удовлетворяет требованиям ДСТУ.
269
270 Ожидается [ERR_BAD_PARAMS]
271 Параметры params корректны.
272
273 Возвращает
274 ERR_OK, если точка корректна, и код ошибки в противном случае.
275
276 Прим.
277 Реализован алгоритм из раздела 10.1 ДСТУ.
278
279 Аргументы
280 params долговременные параметры
281 point проверяемая точка
282
283 err_t dstuVerify (const dstu_params * params, size_t ld, const octet
284 hash[], size_t hash_len, const octet sig[], const octet pubkey[])
285 Проверяется подпись [ld / 8]sig сообщения с хэш-значением
286 [hash_len]hash. При проверке используются долговременные параметры
287 params и открытый ключ pubkey.
288
289 Ожидается [ERR_BAD_PARAMS]
290 Параметры params корректны.
291
292 Ожидается [ERR_BAD_PUBKEY]
293 Открытый ключ pubkey корректен.
294
295 Возвращает
296 ERR_OK, если подпись корректна, и код ошибки в противном случае.
297
298 Аргументы
299 params долговременные параметры
300 ld длина подписи в битах
301 hash хэш-значение
302 hash_len длина хэш-значения в октетах
303 sig подпись
304 pubkey открытый ключ
305
307 Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
308
309
310
311Библиотека Bee2 Пт 23 Июн 2023 dstu.h(3)