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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
/*
*******************************************************************************
\file bign.h
\brief STB 34.101.45 (bign): digital signature and key transport algorithms
\project bee2 [cryptographic library]
\created 2012.04.27
\version 2023.09.25
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
*/
/*!
*******************************************************************************
\file bign.h
\brief Алгоритмы СТБ 34.101.45 (bign)
*******************************************************************************
*/
#ifndef __BEE2_BIGN_H
#define __BEE2_BIGN_H
#ifdef __cplusplus
extern "C" {
#endif
#include "bee2/defs.h"
/*!
*******************************************************************************
\file bign.h
\section bign-common СТБ 34.101.45 (bign): Общие положения
Реализованы алгоритмы СТБ 34.101.45 (bign). При ссылках на алгоритмы, таблицы,
другие объекты подразумеваются разделы СТБ 34.101.45-2013, в которых эти
объекты определены.
\expect{ERR_BAD_INPUT} Все входные указатели корректны.
\safe todo
*******************************************************************************
*/
/*
*******************************************************************************
\file bign.h
\section bign-params Управление долговременными параметрами
Структура bign_params описывает долговременные параметры bign. Содержание
полей структуры определено в п. 5.3.
В структуре bign_params уровень стойкости l определяет используемое число
октетов в массивах p, a, b, q, yG. При l == 128 используются первые 32 октета,
при l == 192 -- первые 48. Неиспользуемые октеты должны быть нулевыми.
При l == 256 используются все 64 октета.
Уровень стойкости l фигурирует в описаниях функций и определяет длины ключей,
хэш-значений, подписей.
*******************************************************************************
*/
/*! \brief Долговременные параметры bign */
typedef struct
{
size_t l; /*!< уровень стойкости (128, 192 или 256) */
octet p[64]; /*!< модуль p */
octet a[64]; /*!< коэффициент a */
octet b[64]; /*!< коэффициент b */
octet q[64]; /*!< порядок q */
octet yG[64]; /*!< y-координата точки G */
octet seed[8]; /*!< параметр seed */
} bign_params;
/*! \brief Загрузка стандартных долговременных параметров
В params загружаются стандартные долговременные параметры с именем name.
Поддерживаются следующие имена:
"1.2.112.0.2.0.34.101.45.3.1",
"1.2.112.0.2.0.34.101.45.3.2",
"1.2.112.0.2.0.34.101.45.3.3".
Это имена стандартных параметров, заданных в таблицах Б.1, Б.2, Б.3.
\return ERR_OK, если параметры успешно загружены, и код ошибки в
противном случае.
*/
err_t bignParamsStd(
bign_params* params, /*!< [out] стандартные параметры */
const char* name /*!< [in] имя параметров */
);
/*! \brief Проверка долговременных параметров
Проверяется корректность долговременных параметров params.
\return ERR_OK, если параметры корректны, и код ошибки в противном случае.
\remark Реализован алгоритм 6.1.4.
*/
err_t bignParamsVal(
const bign_params* params /*!< [in] долговременные параметры */
);
/*! \brief Вычисление порядка группы точек эллиптической кривой
Определяется порядок params->q группы точек эллиптической кривой, заданной
параметрами params->p, params->a и params->b. При вычислениях используется
состояние state.
\return ERR_OK, если порядок успешно вычислен, и код ошибки в противном
случае.
\remark Функция может возвращать ERR_NO_RESULT, если порядок окончательно
не вычислен или заведомо не удовлетворяет требованиям СТБ 34.101.45,
например, является составным.
*/
typedef err_t(*bign_pgen_calc_q)(
bign_params* params, /*!< [in, out] долговременные параметры */
void* state /*!< [in, out] состояние */
);
/*! \brief Обработка затравочного значения
Выполняется обработка очередного затравочного значения params->seed
в процессе генерации долговременных параметров. При вычислениях
используется состояние state.
\return ERR_OK, если затравочное значение успешно обработано,
и код ошибки в противном случае.
\remark В момент обработки действительны параметры params->l,
params->p, params->a и params->b. Описываемая этими параметрами
эллиптическая кривая не обязательно является корректной.
*/
typedef err_t(*bign_pgen_on_seed)(
const bign_params* params, /*!< [in] долговременные параметры */
void* state /*!< [in, out] состояние */
);
/*! \brief Генерация долговременных параметров
По параметрам params->l, params->p, params->a и params->seed вычисляются
и сохраняются в params остальные долговременные параметры. Если построенные
params не удовлетворяют требованиям СТБ 34.101.45, то параметр params->seed
(как число little-endian) увеличивается на 1 по модулю 2^64, вычисление
и проверка параметров продолжаются. Параметр params->q вычисляется с
помощью функции calc_q(). Функция on_seed() получает управление всякий раз
перед обработкой очередного seed. Функции calc_q() и on_seed() используют
в своей работе состояние state.
\expect{ERR_BAD_INPUT} calc_q != 0.
\remark Указатель on_seed может быть нулевым, т.е. функция on_seed()
может не использоваться.
\expect Функции calc_q() и on_seed() (при on_seed != 0) корректны.
В частности, функция calc_q() корректно вычисляет порядок группы точек.
\remark Если возвращаемый функциями calc_q() и on_seed() код отличен от
ERR_OK, то вычисления завершаются с возвратом этого кода. Исключение
составляет случай, когда функция calc_q() возвращает код ERR_NO_RESULT.
В этом случае выполняется переход к следующему seed и вычисления
продолжаются.
\remark Через возврат кода ошибки функцией on_seed() можно прерывать
длительные вычисления.
\return ERR_OK, если долговременные параметры успешно сгенерированы,
и код ошибки в противном случае.
\remark Реализован алгоритм 6.1.3.
*/
err_t bignParamsGen(
bign_params* params, /*!< [in, out] долговременные параметры */
bign_pgen_calc_q calc_q, /*!< [in] функция вычисления порядка q */
bign_pgen_on_seed on_seed, /*!< [in] функция обработки нового seed */
void* state /*!< [in, out] состояние функций */
);
/*! \brief Кодирование параметров
Долговременные параметры params представляются DER-кодом [?count]der.
\return ERR_OK в случае успеха и код ошибки в противном случае.
\remark Формат кода определяется типом ECParameters, установленным в Д.11.
*/
err_t bignParamsEnc(
octet der[], /*!< [out] DER-код */
size_t* count, /*!< [in,out] длина der / длина DER-кода */
const bign_params* params /*!< [in] долговременные параметры */
);
/*! \brief Декодирование параметров
По DER-коду [count]der определяются долговременные параметры params.
\return ERR_OK в случае успеха и код ошибки в противном случае.
\remark Формат кода определяется типом ECParameters, установленным в Д.11.
\remark Длина der должна в точности равняться count. Противное считается
ошибкой формата.
*/
err_t bignParamsDec(
bign_params* params, /*!< [out] долговременные параметры */
const octet der[], /*!< [in] DER-код */
size_t count /*!< [in] длина der в октетах */
);
/*!
*******************************************************************************
\file bign.h
\section bign-oid Идентификатор объекта
В функциях ЭЦП используется идентификатор используемого алгоритма хэширования.
Идентификатор представляет собой последовательность неотрицательных целых чисел
{d1 d2 ... dn}. Эта последовательность должна
удовлетворять базовым ограничениям ACH.1 (см. приложение A) и, дополнительно,
числа di не должны превосходить 2^32 - 1 = 4294967295.
Идентификатор задается либо строкой "d1.d2....dn", либо DER-кодом.
Если идентификатор задается строкой, то числа di должны записываться без
лидирующих нулей.
Функция bignOidEncode() выполняет преобразование строкового представления
в DER-код.
Если идентификатор некорректен, то функции, в которых он используется,
возвращают код ERR_BAD_OID.
*******************************************************************************
*/
/*! \brief Кодирование идентификатора объекта
По строковому представлению oid идентификатора объекта строится его
DER-код [?count]der.
\return ERR_OK, если кодирование успешно выполнено или длина DER-кода
успешно рассчитана, и код ошибки в противном случае.
*/
err_t bignOidToDER(
octet der[], /*!< [out] DER-код идентификатора */
size_t* count, /*!< [in,out] длина буфера der / длина DER-кода */
const char* oid /*!< [in] строковое представление идентификатора */
);
/*
*******************************************************************************
Управление ключами
*******************************************************************************
*/
/*! \brief Генерация пары ключей
При долговременных параметрах params генерируются личный [l / 4]privkey
и открытый [l / 2]pubkey ключи. При генерации используется генератор rng
и его состояние rng_state.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_RNG} Генератор rng (с состоянием rng_state) корректен.
\expect Используется криптографически стойкий генератор rng.
\return ERR_OK, если ключи успешно сгенерированы, и код ошибки
в противном случае.
\remark Реализован алгоритм 6.2.2.
*/
err_t bignKeypairGen(
octet privkey[], /*!< [out] личный ключ */
octet pubkey[], /*!< [out] открытый ключ */
const bign_params* params, /*!< [in] долговременные параметры */
gen_i rng, /*!< [in] генератор случайных чисел */
void* rng_state /*!< [in,out] состояние генератора */
);
/*! \brief Проверка пары ключей
При долговременных параметрах params проверяется корректность
личного ключа [l / 8]privkey и соответствие ему открытого ключа
[l / 2]pubkey.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\return ERR_OK, если пара корректна, и код ошибки в противном случае.
*/
err_t bignKeypairVal(
const bign_params* params, /*!< [in] долговременные параметры */
const octet privkey[], /*!< [in] личный ключ */
const octet pubkey[] /*!< [in] открытый ключ */
);
/*! \brief Проверка открытого ключа
При долговременных параметрах params проверяется корректность
открытого ключа [l / 2]pubkey.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\return ERR_OK, если ключ корректен, и код ошибки в противном случае.
\remark Реализован алгоритм 6.2.3.
*/
err_t bignPubkeyVal(
const bign_params* params, /*!< [in] долговременные параметры */
const octet pubkey[] /*!< [in] проверяемый ключ */
);
/*! \brief Построение открытого ключа по личному
При долговременных параметрах params по личному ключу [l / 4]privkey
строится открытый ключ [l / 2]pubkey.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_PRIVKEY} Личный ключ privkey корректен.
\return ERR_OK, если открытый ключ успешно построен, и код ошибки
в противном случае.
*/
err_t bignPubkeyCalc(
octet pubkey[], /*!< [out] открытый ключ */
const bign_params* params, /*!< [in] долговременные параметры */
const octet privkey[] /*!< [in] личный ключ */
);
/*! \brief Построение общего ключа Диффи -- Хеллмана
При долговременных параметрах params по личному ключу [l / 4]privkey
и открытому ключу [l / 2]pubkey противоположной стороны строится
общий ключ [key_len]key. Общий ключ определяется как privkey-кратное
ключа pubkey, что соответствует протоколу Диффи -- Хеллмана.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_PRIVKEY} Личный ключ privkey корректен.
\expect{ERR_BAD_PUBKEY} Открытый ключ pubkey корректен.
\expect{ERR_BAD_SHAREDKEY} key_len <= l / 2.
\return ERR_OK, если общий ключ успешно построен, и код ошибки
в противном случае.
*/
err_t bignDH(
octet key[], /*!< [out] общий ключ */
const bign_params* params, /*!< [in] долговременные параметры */
const octet privkey[], /*!< [in] личный ключ */
const octet pubkey[], /*!< [in] открытый ключ (другой стороны) */
size_t key_len /*!< [in] длина key в октетах */
);
/*
*******************************************************************************
Электронная цифровая подпись (ЭЦП)
*******************************************************************************
*/
/*! \brief Выработка ЭЦП
Вырабатывается подпись [3 * l / 8]sig сообщения с хэш-значением
[l / 4]hash, полученном с помощью алгоритма с идентификатором
[oid_len]oid_der, заданным DER-кодом. Подпись вырабатывается на личном
ключе [l / 4]privkey. При выработке ЭЦП используются долговременные
параметры params и генератор rng с состоянием rng_state.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_INPUT} Буферы sig и hash не пересекаются.
\expect{ERR_BAD_PRIVKEY} Личный ключ privkey корректен.
\expect{ERR_BAD_RNG} Генератор rng (с состоянием rng_state) корректен.
\expect Генератор rng является криптографически стойким.
\return ERR_OK, если подпись выработана, и код ошибки в противном
случае.
\remark Реализован алгоритм 7.1.3.
*/
err_t bignSign(
octet sig[], /*!< [out] подпись */
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet hash[], /*!< [in] хэш-значение */
const octet privkey[], /*!< [in] личный ключ */
gen_i rng, /*!< [in] генератор случайных чисел */
void* rng_state /*!< [in,out] состояние генератора */
);
/*! \brief Детерминированная выработка ЭЦП
Вырабатывается подпись [3 * l / 8]sig сообщения с хэш-значением
[l / 4]hash, полученном с помощью алгоритма с идентификатором
[oid_len]oid_der, заданным DER-кодом. Подпись вырабатывается на личном
ключе [l / 4]privkey. При выработке ЭЦП используются долговременные параметры
params. Одноразовый личный ключ генерируется по алгоритму 6.3.3
с использованием дополнительных данных [t_len]t. Если t == 0, то
дополнительные данные не используются.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_INPUT} Буферы sig и hash не пересекаются.
\expect{ERR_BAD_PRIVKEY} Личный ключ privkey корректен.
\return ERR_OK, если подпись выработана, и код ошибки в противном
случае.
\remark Реализованы алгоритмы 7.1.3 и 6.3.3.
*/
err_t bignSign2(
octet sig[], /*!< [out] подпись */
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet hash[], /*!< [in] хэш-значение */
const octet privkey[], /*!< [in] личный ключ */
const void* t, /*!< [in] дополнительные данные */
size_t t_len /*!< [in] размер дополнительных данных */
);
/*! \brief Проверка ЭЦП
Проверяется ЭЦП [3 * l / 8]sig сообщения с хэш-значением [l / 4]hash. При
проверке используются долговременные параметры params и открытый ключ
[l / 2]pubkey. Считается, что хэш-значение [l / 4]hash получено с помощью
алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_PUBKEY} Открытый ключ pubkey корректен.
\return ERR_OK, если подпись корректна, и код ошибки в противном
случае.
\remark Реализован алгоритм 7.1.4.
\remark При нарушении ограничений на ЭЦП возвращается код ERR_BAD_SIG.
*/
err_t bignVerify(
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet hash[], /*!< [in] хэш-значение */
const octet sig[], /*!< [in] подпись */
const octet pubkey[] /*!< [in] открытый ключ */
);
/*
*******************************************************************************
Транспорт ключа
*******************************************************************************
*/
/*! \brief Создание токена ключа
Создается токен [l / 4 + 16 + len]token ключа [len]key с заголовком
[16]header. При создании токена используются долговременные параметры
params, открытый ключ получателя pubkey и генератор rng с состоянием
rng_state.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_INPUT} len >= 16.
\expect{ERR_BAD_PUBKEY} Открытый ключ pubkey корректен.
\expect{ERR_BAD_RNG} Генератор rng (с состоянием rng_state) корректен.
\expect Используется криптографически стойкий генератор rng.
\return ERR_OK, если токен успешно создан, и код ошибки в противном
случае.
\remark Реализован алгоритм 7.2.3.
\remark Может передаваться нулевой указатель header. В этом случае будет
использоваться заголовок из всех нулей.
*/
err_t bignKeyWrap(
octet token[], /*!< [out] токен ключа */
const bign_params* params, /*!< [in] долговременные параметры */
const octet key[], /*!< [in] транспортируемый ключ */
size_t len, /*!< [in] длина ключа в октетах */
const octet header[16], /*!< [in] заголовок ключа */
const octet pubkey[], /*!< [in] открытый ключ получателя */
gen_i rng, /*!< [in] генератор случайных чисел */
void* rng_state /*!< [in,out] состояние генератора */
);
/*! \brief Разбор токена ключа
Определяется ключ [len - (l / 4 + 16)]key, который имеет заголовок
[16]header и содержится в токене [len]token. При разборе токена
используются долговременные параметры params и личный ключ [l / 2]privkey.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_PRIVKEY} Личный ключ privkey корректен.
\return ERR_OK, если токен успешно разобран, и код ошибки в противном
случае.
\remark Реализован алгоритм 7.2.4.
\remark Может передаваться нулевой указатель header. В этом случае будет
использоваться заголовок из всех нулей.
\remark При нарушении целостности токена возвращается код ERR_BAD_KEYTOKEN.
Этот код будет возвращен, если len < 32 + l / 4.
*/
err_t bignKeyUnwrap(
octet key[], /*!< [out] ключ */
const bign_params* params, /*!< [in] долговременные параметры */
const octet token[], /*!< [in] токен ключа */
size_t len, /*!< [in] длина токена в октетах */
const octet header[16], /*!< [in] заголовок ключа */
const octet privkey[] /*!< [in] личный ключ получателя */
);
/*!
*******************************************************************************
\file bign.h
\section bign-ibs Идентификационная ЭЦП
Идентификационная подпись при передаче и хранении должна объединяться
с открытым ключом (см. Д.3). Объединенная подпись состоит из 7 * l / 8
октетов и включает две части: первая часть -- собственно подпись
(3 * l / 8 октетов), вторая часть -- открытый ключ (l / 2 октетов).
*******************************************************************************
*/
/*! \brief Извлечение пары ключей
Из подписи [3 * l / 8]sig идентификатора с хэш-значением [l / 4]id_hash
извлекаются личный [l / 4]id_privkey и открытый [l / 2]id_pubkey ключи.
Используются долговременные параметры params и открытый ключ [l / 2]pubkey
доверенной стороны. Считается, что хэш-значение id_hash получено с помощью
алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_PUBKEY} Открытый ключ pubkey корректен.
\return ERR_OK, если ключи успешно извлечены, и код ошибки
в противном случае.
\remark Реализован алгоритм B.2.3.
\remark Одновременно с извлечением ключей проверяется подпись sig.
Если подпись некорректна, то будет возвращен код ERR_BAD_SIG.
*/
err_t bignIdExtract(
octet id_privkey[], /*!< [out] личный ключ */
octet id_pubkey[], /*!< [out] открытый ключ */
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet id_hash[], /*!< [in] хэш-значение идентификатора */
const octet sig[], /*!< [in] подпись идентификатора */
octet pubkey[] /*!< [in] открытый ключ доверенной стороны */
);
/*! \brief Выработка идентификационной ЭЦП
Вырабатывается идентификационная подпись [3 * l / 8]id_sig сообщения с
хэш-значением [l / 4]hash. Подпись вырабатывается на личном ключе
[l / 4]id_privkey стороны, которая имеет идентификатор с хэш-значением
[l / 4]id_hash. Считается, что хэш-значения id_hash и hash получены с
помощью алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом.
При выработке ЭЦП используются долговременные параметры params и генератор
rng с состоянием rng_state.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_PRIVKEY} Ключ id_privkey получен с помощью функции
bignIdExtract().
\expect{ERR_BAD_RNG} Генератор rng (с состоянием rng_state) корректен.
\expect Генератор rng является криптографически стойким.
\return ERR_OK, если подпись выработана, и код ошибки в противном
случае.
\remark Реализован алгоритм B.2.4.
*/
err_t bignIdSign(
octet id_sig[], /*!< [out] идентификационная подпись */
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet id_hash[], /*!< [in] хэш-значение идентификатора */
const octet hash[], /*!< [in] хэш-значение сообщения */
const octet id_privkey[], /*!< [in] личный ключ */
gen_i rng, /*!< [in] генератор случайных чисел */
void* rng_state /*!< [in,out] состояние генератора */
);
/*! \brief Детерминированная выработка идентификационной ЭЦП
Вырабатывается идентификационная подпись [3 * l / 8]id_sig сообщения
с хэш-значением [l / 4]hash. Подпись вырабатывается на личном ключе
[l / 4]id_privkey стороны, которая имеет идентификатор с хэш-значением
[l / 4]id_hash. Считается, что хэш-значения id_hash и hash получены с
помощью алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом.
При выработке ЭЦП используются долговременные параметры params.
Одноразовый личный ключ генерируется по алгоритму 6.3.3 с использованием
дополнительных данных [t_len]t. Если t == 0, то дополнительные данные
не используются.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_PRIVKEY} Ключ id_privkey получен с помощью функции
bignIdExtract().
\return ERR_OK, если подпись выработана, и код ошибки в противном
случае.
\remark Реализованы алгоритмы B.2.4 и 6.3.3.
*/
err_t bignIdSign2(
octet id_sig[], /*!< [out] идентификационная подпись */
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet id_hash[], /*!< [in] хэш-значение идентификатора */
const octet hash[], /*!< [in] хэш-значение сообщения */
const octet id_privkey[], /*!< [in] личный ключ */
const void* t, /*!< [in] дополнительные данные */
size_t t_len /*!< [in] длина t в октетах */
);
/*! \brief Проверка идентификационной ЭЦП
Проверяется идентификационная ЭЦП [3 * l / 8]id_sig сообщения
с хэш-значением [l / 4]hash, выработанная стороной, хэш-значение
идентификатора которой есть [l / 4]id_hash. При проверке используются
долговременные параметры params, открытый ключ [l / 2]id_pubkey и открытый
ключ доверенной стороны [l / 4]pubkey. Считается, что хэш-значения
id_hash, hash получены с помощью алгоритма с идентификатором
[oid_len]oid_der, заданным DER-кодом.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_OID} Идентификатор oid_der корректен.
\expect{ERR_BAD_PUBKEY}
- открытый ключ id_pubkey получен с помощью функции bignIdExtract();
- открытый ключ pubkey корректен.
.
\return ERR_OK, если подпись корректна, и код ошибки в противном
случае.
\remark Реализован алгоритм B.2.5.
\remark При нарушении ограничений на ЭЦП возвращается код ERR_BAD_SIG.
*/
err_t bignIdVerify(
const bign_params* params, /*!< [in] долговременные параметры */
const octet oid_der[], /*!< [in] идентификатор хэш-алгоритма */
size_t oid_len, /*!< [in] длина oid_der в октетах */
const octet id_hash[], /*!< [in] хэш-значение идентификатора */
const octet hash[], /*!< [in] хэш-значение сообщения */
const octet id_sig[], /*!< [in] подпись */
const octet id_pubkey[], /*!< [in] открытый ключ */
const octet pubkey[] /*!< [in] открытый ключ доверенной стороны */
);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* __BEE2_BIGN_H */