1ec.h(3) Library Functions Manual ec.h(3)
2
3
4
6 ec.h - Эллиптические кривые
7
8
10 #include 'bee2/math/qr.h'
11
12
13 Классы
14 struct ec_o
15 Описание эллиптической кривой
16
17 Определения типов
18 typedef bool_t(* ec_froma_i) (word b[], const word a[], const struct
19 ec_o *ec, void *stack)
20 Импорт из аффинной точки
21 typedef bool_t(* ec_toa_i) (word b[], const word a[], const struct ec_o
22 *ec, void *stack)
23 Экспорт в аффинную точку
24 typedef void(* ec_neg_i) (word b[], const word a[], const struct ec_o
25 *ec, void *stack)
26 Обратная точка
27 typedef void(* ec_add_i) (word c[], const word a[], const word b[],
28 const struct ec_o *ec, void *stack)
29 Сложение точек
30 typedef void(* ec_adda_i) (word c[], const word a[], const word b[],
31 const struct ec_o *ec, void *stack)
32 Сложение с аффинной точкой
33 typedef void(* ec_sub_i) (word c[], const word a[], const word b[],
34 const struct ec_o *ec, void *stack)
35 Вычитание точек
36 typedef void(* ec_suba_i) (word c[], const word a[], const word b[],
37 const struct ec_o *ec, void *stack)
38 Вычитание аффинной точки
39 typedef void(* ec_dbl_i) (word b[], const word a[], const struct ec_o
40 *ec, void *stack)
41 Удвоение точки
42 typedef void(* ec_dbla_i) (word b[], const word a[], const struct ec_o
43 *ec, void *stack)
44 Удвоение аффинной точки
45 typedef void(* ec_tpl_i) (word b[], const word a[], const struct ec_o
46 *ec, void *stack)
47 Утроение точки
48 typedef struct ec_o ec_o
49 Описание эллиптической кривой
50
51 Функции
52 bool_t ecIsOperable (const ec_o *ec)
53 Описание эллиптической кривой работоспособно?
54 bool_t ecIsOperable2 (const ec_o *ec)
55 Описание отдельной эллиптической кривой работоспособно?
56 bool_t ecCreateGroup (ec_o *ec, const octet xbase[], const octet
57 ybase[], const octet order[], size_t order_len, u32 cofactor, void
58 *stack)
59 Создание группы точек эллиптической кривой
60 bool_t ecIsOperableGroup (const ec_o *ec)
61 Группа точек эллиптической кривой работоспособна?
62 bool_t ecMulA (word b[], const word a[], const ec_o *ec, const word
63 d[], size_t m, void *stack)
64 Кратная точка
65 bool_t ecHasOrderA (const word a[], const ec_o *ec, const word q[],
66 size_t m, void *stack)
67 Имеет порядок?
68 bool_t ecAddMulA (word b[], const ec_o *ec, void *stack, size_t k,...)
69 Сумма кратных точек
70
72 Определяются вычисления на эллиптических кривых над конечными полями.
73 Поле представляется как кольцо вычетов с помощью структуры типа qr_o
74 (см. заголовочный файл qr.h). Описание кривой соответствует соглашениям
75 ANSI X 9.62 (ECDSA) и последующих стандартов.
76
77 Эллиптическая кривая описывается структурой типа ec_o. Пусть ec --
78 указатель на такую структуру. Тогда ec->f указывает на описание
79 базового поля, ec->A и ec->B --- коэффициенты из базового поля, которые
80 определяют уравнение эллиптической кривой.
81
82 В описание ec->f базового поля включается функции арифметики в этом
83 поле. Описание должно быть настроено вызывающей программой (см.
84 описание qrCreate() в qr.h).
85
86 Используется внутреннее (для ec->f) представление элементов базового
87 поля. Импорт элементов базового поля из строк октетов выполняется с
88 помощью функции ec->f->from(), экспорт -- с помощью функции
89 ec->f->to(). Можно также использовать макросы qrFrom, qrTo (см.
90 заголовочный файл qr.h).
91
92 Точка эллиптической кривой задается ec->d координатами из базового
93 поля. Каждая координата представляется ec->f->n машинными словами.
94 Координаты записываются друг за другом и в целом образуют массив pt из
95 ec->d * ec->f->n машинных слов. Первые три координаты именованные: X,
96 Y, Z. Макросы ecX, ecY, ecZ поддерживают извлечение именованных
97 координат из буфера pt.
98
99 Точки с двумя координатами называются аффинными, а точки pt = (X : Y :
100 Z :...) с тремя и более координатами -- проективными. Бесконечно
101 удаленную точку O нельзя представить аффинной, но можно проективной:
102 точке O соответствует точка pt, у которой Z == 0. Макросы ecSetO, ecIsO
103 выполняют присваивание pt = O и проверку pt == O.
104
105 Для организации вычислений требуется, чтобы среди точек эллиптической
106 кривой имелась бесконечно удаленная. Поэтому должны обязательно
107 использоваться проективные координаты (проективные точки). Размерность
108 ec->d >= 3.
109
110 Проективную точку можно построить по аффинной точке (x, y) с помощью
111 функции интерфейса ec_froma_i. Как правило, построение состоит в
112 присваиваниях
113
114 X <- x, Y <- y, Z <- ec->f->unity,....
115
116
117 Обратно, проективную точку можно преобразовать в аффинную с помощью
118 функции интерфейса ec_toa_i (при преобразовании бесконечно удаленной
119 точки функция возвращает соответствующий признак).
120
121 Описание ec может быть использовано для организации вычислений в
122 аффинных координатах, несмотря на заданные этим описанием проективные.
123
124 Прим.
125 Если используется ec->d == 3, то Z-координата точки pt всегда
126 равняется единице для pt != O и нулю для pt == O, то вычисления на
127 кривой фактически ведутся в аффинных координатах.
128
129 В структуре типа ec_o предусмотрены поля для описания циклической
130 группы точек эллиптической кривой. Эта группа задается образующим
131 ec->base. Образующий представляется аффинной точкой, т.е. задается 2 *
132 ec->f->n машинными словами. Порядок циклической группы ec->order
133 задается 2 * ec->f->n + 1 машинным словом. Кофактор -- отношение числа
134 всех ec->f-рациональных точек к ec->order -- задается одним машинным
135 словом ec->cofactor.
136
137 Если работа с группой точек не предусматривается, то поля base, order и
138 cofactor могут не задаваться.
139
140 По адресу ec->params могут размещаться дополнительные данные, например,
141 определенные кратные базовой точки, с помощью которых можно ускорить
142 криптографические вычисления на эллиптической кривой.
143
144 Описание ec эллиптической кривой включает указатели на функции
145 арифметики в группе точек этой кривой. Функцию интерфейса ec_tpl_i
146 можно не поддерживать. Указатель на неподдерживаемую функцию должен
147 быть нулевым.
148
149 Описание кольца организовано как объект, и можно применять функции,
150 описанные в заголовочном файле obj.h.
151
152 Эллиптическая кривая должна создаваться специальной функцией
153 ecCreate(), которая является аналогом конструктора. В эту функцию
154 должен передаваться указатель ec на структуру типа ec_o. По этому
155 указателю будет размещаться описание (состояние) кривой. По адресу ec
156 может быть зарезервировано больше памяти, чем sizeof(ec_o). Дело в том,
157 что коэффициенты A, B, порядок order, базовая точка base могут
158 размещаться в поле descr открытого размера. Функция ecCreate() должна
159 сопровождаться функцией ecCreate_keep(), которая поддерживает расчет
160 длины состояния (в октетах).
161
162 Функция ecCreate_keep() должна оценивать длину состояния сверху. Оценка
163 может быть неточной. Точная длина состояния фиксируется при
164 непосредственном выполнении ecCreate() и сохраняется в поле keep
165 описания кривой.
166
167 В функцию ecCreate() должен передаваться указатель на память для стека.
168 Функция ecCreate() должна сопровождаться функцией ecCreate_deep(),
169 которая выполняет расчет глубины стека. При расчете глубины следует
170 предполагать, что в ecCreate() явно или неявно вызываются все функции
171 интерфейсов кривой. Получив результат работы ecCreate_deep(), внешние
172 программы могут определить, сколько вспомогательной памяти потребуется
173 при всевозможных способах работы с функциями арифметики на кривой.
174
175 Оценка глубины стека, определяемая функцией ecCreate_deep(), может быть
176 неточной. Точная глубина фиксируется при непосредственном выполнении
177 ecCreate() и сохраняется в поле deep описания кривой.
178
179 В функцию ecCreate() могут не передаваться параметры base, order и
180 cofactor, определяющие строение группы точек, хотя буферы для base и
181 order могут подготавливаться в ecCreate(). Параметры могут
182 устанавливаться позднее с помощью функции ecCreateGroup().
183
184 Предусловие
185 Все указатели действительны.
186
187 Буферы точек кривой не пересекаются с буферами, поддерживающими
188 описание эллиптической кривой.
189
191 typedef void(* ec_add_i) (word c[], const word a[], const word b[], const
192 struct ec_o *ec, void *stack)
193 На эллиптической кривой ec определяется сумма [ec->d * ec->f->n]c точек
194 [ec->d * ec->f->n]a и [ec->d * ec->f->n]b:
195
196 c <- a + b.
197
198
199 Предусловие
200 Описание ec работоспособно.
201
202 Буфер с либо не пересекается с каждым из буферов a и b, либо
203 совпадает с некоторым из них.
204
205 Координаты a и b лежат в базовом поле.
206
207 Ожидается
208 Описание ec корректно.
209
210 Ожидается
211 Точки a и b лежат на кривой.
212
213 Аргументы
214 c сумма
215 a первое слагаемое
216 b второе слагаемое
217 ec описание эллиптической кривой
218 stack вспомогательная память
219
220 typedef void(* ec_adda_i) (word c[], const word a[], const word b[], const
221 struct ec_o *ec, void *stack)
222 На эллиптической кривой ec определяется сумма [ec->d * ec->f->n]c
223 проективной точки [ec->d * ec->f->n]a и аффинной точки [2 * ec->f->n]b:
224
225 c <- a + b.
226
227
228 Предусловие
229 Описание ec работоспособно.
230
231 Буфер с либо не пересекается с каждым из буферов a и b, либо
232 указатель c совпадает с некоторым из указателей a или b.
233
234 Координаты a и b лежат в базовом поле.
235
236 Ожидается
237 Описание ec корректно.
238
239 Ожидается
240 Точки a и b лежат на кривой.
241
242 Аргументы
243 c сумма
244 a первое слагаемое
245 b второе слагаемое
246 ec описание эллиптической кривой
247 stack вспомогательная память
248
249 typedef void(* ec_dbl_i) (word b[], const word a[], const struct ec_o *ec,
250 void *stack)
251 На эллиптической кривой ec определяется точка [ec->d * ec->f->n]b,
252 полученная удвоением точки [ec->d * ec->f->n]a:
253
254 b <- 2 a.
255
256
257 Предусловие
258 Описание ec работоспособно.
259
260 Буфер b либо не пересекается, либо совпадает с буфером a.
261
262 Координаты a лежат в базовом поле.
263
264 Ожидается
265 Описание ec корректно.
266
267 Ожидается
268 Точка a лежит на кривой.
269
270 Аргументы
271 b удвоенная точка
272 a первоначальная точка
273 ec описание эллиптической кривой
274 stack вспомогательная память
275
276 typedef void(* ec_dbla_i) (word b[], const word a[], const struct ec_o *ec,
277 void *stack)
278 На эллиптической кривой ec определяется проективная точка [ec->d *
279 ec->f->n]b, полученная удвоением аффинной точки [2 * ec->f->n]a:
280
281 b <- 2 a.
282
283
284 Предусловие
285 Описание ec работоспособно.
286
287 Буферы a и b либо не пересекаются, либо указатели a и b совпадают.
288
289 Координаты a лежат в базовом поле.
290
291 Ожидается
292 Описание ec корректно.
293
294 Ожидается
295 Точка a лежит на кривой.
296
297 Аргументы
298 b удвоенная точка
299 a первоначальная точка
300 ec описание эллиптической кривой
301 stack вспомогательная память
302
303 typedef bool_t(* ec_froma_i) (word b[], const word a[], const struct ec_o
304 *ec, void *stack)
305 По аффинной точке [2 * ec->f->n]a эллиптической кривой ec строится
306 точка [ec->d * ec->f->n]b.
307
308 Предусловие
309 Описание ec работоспособно.
310
311 Буферы a и b либо не пересекаются, либо указатели a и b совпадают.
312
313 Координаты a лежат в базовом поле.
314
315 Ожидается
316 Описание ec корректно.
317
318 Ожидается
319 Точка a лежит на кривой.
320
321 Возвращает
322 TRUE, если преобразование успешно выполнено, и FALSE в противном
323 случае.
324
325 Аргументы
326 b выходная точка
327 a аффинная точка
328 ec описание эллиптической кривой
329 stack вспомогательная память
330
331 typedef void(* ec_neg_i) (word b[], const word a[], const struct ec_o *ec,
332 void *stack)
333 На эллиптической кривой ec определяется точка [ec->d * ec->f->n]b,
334 обратная к точке [ec->d * ec->f->n]a:
335
336 b <- -a.
337
338
339 Предусловие
340 Описание ec работоспособно.
341
342 Буфер b либо не пересекается, либо совпадает с буфером a.
343
344 Координаты a лежат в базовом поле.
345
346 Ожидается
347 Описание ec корректно.
348
349 Ожидается
350 Точка a лежит на кривой.
351
352 Аргументы
353 b обратная точка
354 a обращаемая точка
355 ec описание эллиптической кривой
356 stack вспомогательная память
357
358 typedef struct ec_o ec_o
359 Описывается эллиптическая кривая, правила представления ее элементов,
360 группа точек и функции, реализующие операции в группе.
361
362 Прим.
363 В таблицу указателей описания кривой как объекта входят поля f, A,
364 B, base, order, params. Поле f является указателем на объект.
365
366 typedef void(* ec_sub_i) (word c[], const word a[], const word b[], const
367 struct ec_o *ec, void *stack)
368 На эллиптической кривой ec определяется разность [ec->d * ec->f->n]c
369 точек [ec->d * ec->f->n]a и [ec->d * ec->f->n]b:
370
371 c <- a - b.
372
373
374 Предусловие
375 Описание ec работоспособно.
376
377 Буфер с либо не пересекается с каждым из буферов a и b, либо
378 совпадает с некоторым из них.
379
380 Координаты a и b лежат в базовом поле.
381
382 Ожидается
383 Описание ec корректно.
384
385 Ожидается
386 Точки a и b лежат на кривой.
387
388 Аргументы
389 c разность
390 a уменьшаемое
391 b вычитаемое
392 ec описание эллиптической кривой
393 stack вспомогательная память
394
395 typedef void(* ec_suba_i) (word c[], const word a[], const word b[], const
396 struct ec_o *ec, void *stack)
397 На эллиптической кривой ec определяется разность [ec->d * ec->f->n]c
398 проективной точки [ec->d * ec->f->n]a и аффинной точки [2 * ec->f->n]b:
399
400 c <- a - b.
401
402
403 Предусловие
404 Описание ec работоспособно.
405
406 Буфер с либо не пересекается с каждым из буферов a и b, либо
407 указатель c совпадает с некоторым из указателей a или b.
408
409 Координаты a и b лежат в базовом поле.
410
411 Ожидается
412 Описание ec корректно.
413
414 Ожидается
415 Точки a и b лежат на кривой.
416
417 Аргументы
418 c разность
419 a уменьшаемое
420 b вычитаемое
421 ec описание эллиптической кривой
422 stack вспомогательная память
423
424 typedef bool_t(* ec_toa_i) (word b[], const word a[], const struct ec_o
425 *ec, void *stack)
426 По точке [ec->d * ec->f->n]a эллиптической кривой ec строится аффинная
427 точка [2 * ec->f->n]b.
428
429 Предусловие
430 Описание ec работоспособно.
431
432 Буферы a и b либо не пересекаются, либо указатели a и b совпадают.
433
434 Координаты a лежат в базовом поле.
435
436 Ожидается
437 Описание ec корректно.
438
439 Ожидается
440 Точка a лежит на кривой.
441
442 Возвращает
443 TRUE, если аффинная точка построена, и FALSE, если точке a
444 соответствует бесконечно удаленная точка.
445
446 Аргументы
447 b аффинная точка
448 a входная точка
449 ec описание эллиптической кривой
450 stack вспомогательная память
451
452 typedef void(* ec_tpl_i) (word b[], const word a[], const struct ec_o *ec,
453 void *stack)
454 На эллиптической кривой ec определяется точка [ec->d * ec->f->n]b,
455 полученная утроением точки [ec->d * ec->f->n]a:
456
457 b <- 3 a.
458
459
460 Предусловие
461 Описание ec работоспособно.
462
463 Буфер b либо не пересекается, либо совпадает с буфером a.
464
465 Координаты a лежат в базовом поле.
466
467 Ожидается
468 Описание ec корректно.
469
470 Ожидается
471 Точка a лежит на кривой.
472
473 Аргументы
474 b утроенная точка
475 a первоначальная точка
476 ec описание эллиптической кривой
477 stack вспомогательная память
478
480 bool_t ecAddMulA (word b[], const ec_o * ec, void * stack, size_t k, ...)
481 Определяется точка [2n]b эллиптической кривой ec, которая является
482 суммой [m[i]]d[i]-кратных точек [2n]a[i], i = 1, 2,.., k:
483
484 b <- d[1] a[1] + d[2] a[2] + ... + d[k] a[k].
485
486
487 Тройки a[i], d[i], m[i] передаются как дополнительные параметры типов
488 const word[], const word[], size_t соответственно.
489
490 Предусловие
491 Описание ec работоспособно.
492
493 k > 0.
494
495 Координаты точек a[1], a[2],..., a[k] лежат в базовом поле.
496
497 Ожидается
498 Описание ec корректно.
499
500 Ожидается
501 Точки a[1], a[2],..., a[k] лежат на ec.
502
503 Возвращает
504 TRUE, если полученная точка является аффинной, и FALSE в противном
505 случае (b == O).
506
507 Схема расчета глубины stack
508 ecAddMulA_deep(ec->f->n, ec->d, ec->deep, m[1], ..., m[k]).
509
510 Аргументы
511 b кратная точка
512 ec описание кривой
513 stack вспомогательная память
514 k число троек (a[i], d[i], m[i])
515 ... тройки (a[i], d[i], m[i])
516
517 bool_t ecCreateGroup (ec_o * ec, const octet xbase[], const octet ybase[],
518 const octet order[], size_t order_len, u32 cofactor, void * stack)
519 В описание ec эллиптической кривой добавляется описание группы,
520 порожденной точкой ([ec->f->no]xbase, [ec->f->no]ybase). Группа имеет
521 порядок [order_len]order и ее кофактор равняется cofactor.
522
523 Предусловие
524 Описание ec работоспособно.
525
526 Буферы [2 * ec->f->n]ec->base, [ec->f->n + 1]ec->order корректны.
527
528 Ожидается [FALSE]
529 Число [octet_len]octet укладывается в ec->f->n + 1 машинных слов.
530
531 Ожидается [FALSE]
532 cofactor != 0 && cofactor укладывается в машинное слово.
533
534 Ожидается
535 Описание ec корректно.
536
537 Возвращает
538 TRUE, если описание группы успешно задано, и FALSE в противном
539 случае.
540
541 Прим.
542 Любой из указателей xbase, ybase может быть нулевым. При нулевом
543 указателе соответствующая координата базовой точки устанавливается
544 равной нулю.
545
546 Схема расчета глубины stack
547 ecCreateGroup_deep(f_deep).
548
549 Аргументы
550 ec описание кривой
551 xbase x-координата базовой точки
552 ybase y-координата базовой точки
553 order порядок группы точек
554 order_len длина order
555 cofactor кофактор группы точек
556 stack вспомогательная память
557
558 bool_t ecHasOrderA (const word a[], const ec_o * ec, const word q[], size_t
559 m, void * stack)
560 Проверяется, что аффинная точка [2 * ec->f->n]a имеет порядок [m]q в
561 группе точек кривой ec.
562
563 Предусловие
564 Описание ec работоспособно.
565
566 Координаты a лежат в базовом поле.
567
568 q > 0.
569
570 Ожидается
571 Описание ec корректно.
572
573 Ожидается
574 Точка a лежит на ec.
575
576 Ожидается
577 Число q -- простое. Если q -- составное, то точка порядка q1 | q
578 может быть ошибочно признана точкой порядка q.
579
580 Возвращает
581 Признак успеха проверки.
582
583 Схема расчета глубины stack
584 ecpHasOrderA_deep(ec->f->n, ec->d, ec->f->deep, m).
585
586 Аргументы
587 a точка
588 ec описание кривой
589 q порядок
590 m длина q в машинных словах
591 stack вспомогательная память
592
593 bool_t ecIsOperable (const ec_o * ec)
594 Проверяется работоспособность описания ec эллиптической кривой.
595 Проверяются следующие условия:
596
597 • объект ec работоспособен;
598
599 • objKeep(ec) >= sizeof(ec_o);
600
601 • objPCount(ec) == 6 && objOCount(ec) == 1;
602
603 • ec->d >= 3;
604
605 • qrIsOperable(ec->f) == TRUE;
606
607 • буферы [ec->n]ec->A, [ec->n]ec->B корректны;
608
609 • указатели ec->froma, r->toa, ..., r->dbla корректны;
610
611 • ec->deep >= ec->f->deep.
612
613 Возвращает
614 Признак корректности.
615
616 Прим.
617 Поля ec->base, ec->order и ec->cofactor, описывающие группу точек,
618 не контролируются.
619
620 Аргументы
621 ec описание кривой
622
623 bool_t ecIsOperable2 (const ec_o * ec)
624 Проверяется работоспособность описания ec эллиптической кривой без
625 учета ссылочного описания базового поля. Проверяются следующие условия:
626
627 • объект ec работоспособен;
628
629 • objKeep(ec) >= sizeof(ec_o);
630
631 • objPCount(ec) == 6 && objOCount(ec) == 1;
632
633 • ec->d >= 3;
634
635 • буферы [ec->n]ec->A, [ec->n]ec->B корректны;
636
637 • указатели ec->froma, r->toa, ..., r->dbla корректны.
638
639 Возвращает
640 Признак корректности.
641
642 Прим.
643 Поля ec->base, ec->order и ec->cofactor, описывающие группу точек,
644 не контролируются.
645
646 Аргументы
647 ec описание кривой
648
649 bool_t ecIsOperableGroup (const ec_o * ec)
650 Проверяется работоспособность описания группы точек эллиптической
651 кривой ec. Проверяются следующие условия:
652
653 • буферы [ec->n + 1]ec->order, [2 * ec->n]ec->base корректны;
654
655 • ec->order != 0;
656
657 • cofactor != 0.
658
659 Предусловие
660 Описание ec работоспособно.
661
662 Возвращает
663 Признак корректности.
664
665 Аргументы
666 ec описание кривой
667
668 bool_t ecMulA (word b[], const word a[], const ec_o * ec, const word d[],
669 size_t m, void * stack)
670 Определяется аффинная точка [2 * ec->f->n]b эллиптической кривой ec,
671 которая является [m]d-кратной аффинной точки [2 * ec->f->n]a:
672
673 b <- d a.
674
675
676 Предусловие
677 Описание ec работоспособно.
678
679 Координаты a лежат в базовом поле.
680
681 Ожидается
682 Описание ec корректно.
683
684 Ожидается
685 Точка a лежит на ec.
686
687 Возвращает
688 TRUE, если кратная точка является аффинной, и FALSE в противном
689 случае (b == O).
690
691 Схема расчета глубины stack
692 ecpMulA_deep(ec->f->n, ec->d, ec->f->deep, m).
693
694 Аргументы
695 b кратная точка
696 a базовая точка
697 ec описание кривой
698 d кратность
699 m длина d в машинных словах
700 stack вспомогательная память
701
703 Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
704
705
706
707Библиотека Bee2 Пт 23 Июн 2023 ec.h(3)