1der.h(3)                   Library Functions Manual                   der.h(3)
2
3
4

NAME

6       der.h - Отличительные правила кодирования
7
8

SYNOPSIS

10       #include 'bee2/defs.h'
11
12
13   Классы
14       struct der_anchor_t
15           Якорь для кодирования контейнеров
16
17   Макросы
18       #define derSIZEEnc(der,  val)   derTSIZEEnc(der, 0x02, val)
19           Кодирование SIZE.
20       #define derSIZEDec(val,  der,  count)   derTSIZEDec(val, der, count,
21           0x02)
22           Кодирование SIZE.
23       #define derSIZEDec2(der,  count,  val)   derTSIZEDec2(der, count, 0x02,
24           val)
25           Проверка кода SIZE.
26       #define derBITEnc(der,  val,  len)   derTBITEnc(der, 0x03, val, len)
27           Кодирование BIT.
28       #define derBITDec(val,  len,  der,  count)   derTBITDec(val, len, der,
29           count, 0x03)
30           Декодирование BIT.
31       #define derBITDec2(val,  der,  count,  len)       derTBITDec2(val, der,
32           count, 0x03, len)
33           Декодирование BIT с проверкой длины
34       #define derTOCTEnc(der,  tag,  val,  len)   derEnc(der, tag, val, len)
35           Кодирование TOCT.
36       #define derOCTEnc(der,  val,  len)   derTOCTEnc(der, 0x04, val, len)
37           Кодирование OCT.
38       #define derOCTDec(val,  len,  der,  count)   derTOCTDec(val, len, der,
39           count, 0x04)
40           Декодирование OCT.
41       #define derOCTDec2(val,  der,  count,  len)       derTOCTDec2(val, der,
42           count, 0x04, len)
43           Декодирование OCT с проверкой длины
44       #define derTOCTDec3   derDec4
45           Проверка кода TOCT.
46       #define derOCTDec3(der,  count,  val,  len)       derTOCTDec3(der,
47           count, 0x04, val, len)
48           Проверка кода OCT.
49       #define derNULLEnc(der)   derEnc(der, 0x05, 0, 0)
50           Кодирование NULL.
51       #define derNULLDec(der,  count)   derDec4(der, count, 0x05, 0, 0)
52           Проверка кода NULL.
53       #define derPSTREnc(der,  val)   derTPSTREnc(der, 0x13, val)
54           Кодирование PSTR.
55       #define derPSTRDec(val,  len,  der,  count)       derTPSTRDec(val, len,
56           der, count, 0x13)
57           Декодирование PSTR.
58       #define derSEQEncStart(anchor,  der,  pos)
59                derTSEQEncStart(anchor, der, pos, 0x30)
60           Начать кодирование SEQ.
61       #define derSEQEncStop   derTSEQEncStop
62           Завершить кодирование SEQ.
63       #define derSEQDecStart(anchor,  der,  count)
64              derTSEQDecStart(anchor, der, count, 0x30)
65           Начать декодирование SEQ.
66       #define derSEQDecStop   derTSEQDecStop
67           Завершить декодирование SEQ.
68
69   Функции
70       size_t derTLEnc (octet der[], u32 tag, size_t len)
71           Кодирование тега и длины
72       size_t derEnc (octet der[], u32 tag, const void *val, size_t len)
73           Кодирование
74       bool_t derIsValid (const octet der[], size_t count)
75           Корректный код?
76       bool_t derIsValid2 (const octet der[], size_t count, u32 tag)
77           Корректный код с ожидаемым тегом?
78       bool_t derStartsWith (const octet der[], size_t count, u32 tag)
79           Начинается с тега?
80       size_t derTLDec (u32 *tag, size_t *len, const octet der[], size_t
81           count)
82           Декодирование тега и длины
83       size_t derDec (u32 *tag, const octet **val, size_t *len, const octet
84           der[], size_t count)
85           Декодирование
86       size_t derDec2 (const octet **val, size_t *len, const octet der[],
87           size_t count, u32 tag)
88           Декодирование с проверкой тега
89       size_t derDec3 (const octet **val, const octet der[], size_t count, u32
90           tag, size_t len)
91           Декодирование с проверкой тега и длины
92       size_t derDec4 (const octet der[], size_t count, u32 tag, const void
93           *val, size_t len)
94           Проверка кода
95       size_t derTSIZEEnc (octet der[], u32 tag, size_t val)
96           Кодирование TSIZE.
97       size_t derTSIZEDec (size_t *val, const octet der[], size_t count, u32
98           tag)
99           Декодирование TSIZE.
100       size_t derTSIZEDec2 (const octet der[], size_t count, u32 tag, size_t
101           val)
102           Проверка кода TSIZE.
103       size_t derTBITEnc (octet der[], u32 tag, const octet *val, size_t len)
104           Кодирование TBIT.
105       size_t derTBITDec (octet *val, size_t *len, const octet der[], size_t
106           count, u32 tag)
107           Декодирование TBIT.
108       size_t derTBITDec2 (octet *val, const octet der[], size_t count, u32
109           tag, size_t len)
110           Декодирование TBIT с проверкой длины
111       size_t derTOCTDec (octet *val, size_t *len, const octet der[], size_t
112           count, u32 tag)
113           Декодирование TOCT.
114       size_t derTOCTDec2 (octet *val, const octet der[], size_t count, u32
115           tag, size_t len)
116           Декодирование TOCT с проверкой длины
117       size_t derOIDEnc (octet der[], const char *oid)
118           Кодирование OID.
119       size_t derOIDDec (char *oid, size_t *len, const octet der[], size_t
120           count)
121           Декодирование OID.
122       size_t derOIDDec2 (const octet der[], size_t count, const char *oid)
123           Проверка кода OID.
124       size_t derTPSTREnc (octet der[], u32 tag, const char *val)
125           Кодирование TPSTR.
126       size_t derTPSTRDec (char *val, size_t *len, const octet der[], size_t
127           count, u32 tag)
128           Декодирование TPSTR.
129       size_t derTSEQEncStart (der_anchor_t *anchor, octet der[], size_t pos,
130           u32 tag)
131           Начать кодирование TSEQ.
132       size_t derTSEQEncStop (octet der[], size_t pos, const der_anchor_t
133           *anchor)
134           Завершить кодирование TSEQ.
135       size_t derTSEQDecStart (der_anchor_t *anchor, const octet der[], size_t
136           count, u32 tag)
137           Начать декодирование TSEQ.
138       size_t derTSEQDecStop (const octet der[], const der_anchor_t *anchor)
139           Завершить декодирование TSEQ.
140

Подробное описание

Правила кодирования

143       Поддержано кодирование по правилам АСН.1. Согласно этим правилам,
144       структуры данных представляются в формате TLV: сначала идут октеты тега
145       (T), затем октеты длины (L), а после этого L октетов значения (V).
146
147       Тег задается, как минимум, одним октетом, в котором младшие 5 битов
148       представляют номер, 6-й бит является признаком примитивности /
149       конструктивности (если бит снят / установлен, то V не содержит /
150       содержит вложенные структуры TLV), а старшие два бита определяют класс
151       тега:
152
153       • 00 => UNIVERSAL;
154
155       • 01 => APPLICATION;
156
157       • 10 => CONTEXT-SPECIFIC;
158
159       • 11 => PRIVATE.
160
161       Если не все 5 младших битов первого октета тега равняются 1, то первый
162       октет является единственным (короткий тег). Короткие теги могут иметь
163       номера от 0 до 30.
164
165       Если все 5 младших битов типа первого октета тега равняются 1 (длинный
166       тег), то номер тега представляется в виде \sum {i = 0}^{r - 1}t_i
167       128^i, 0 <= t_i < 128, t_{r - 1} != 0, и кодируется октетами (t_{r - 1}
168       | 128), ..., (t_1 | 128), t_0, следующими сразу за первым октетом тега.
169
170       Длинные теги должен применяться только для номеров >= 31. В частности,
171       если r == 1, то t_0 >= 31.
172
173       Ограничение реализации: тег задается словом u32, которое является
174       готовым кодом. Кодируются собственно тег-как-число, класс тега и
175       признак примитивности.
176
177       Примеры:
178
179       • tag = 0x30 = 00110000 => class = UNIVERSAL, is_primitive = FALSE,
180         tag_num = 8;
181
182       • tag = 0x7F21 = 01111111 00100001 => class = APPLICATION, is_primitive
183         = FALSE, tag_num = 33;
184
185       • tag = 0x5F29 = 01011111 00101001 => class = APPLICATION, is_primitive
186         = TRUE, tag_num = 41.
187
188       • tag = 0x42 = 01000010 => class = APPLICATION, is_primitive = TRUE,
189         tag_num = 2.
190
191       Прим.
192           Конфигурация (class = UNIVERSAL, is_primitive = TRUE, tag_num = 0),
193           которой соответствует нулевое кодовое слово, разрешена.
194
195   Длина (L)
196       Если L < 128, то длина может кодироваться одним октетом, содержащим L
197       (короткая явная форма). Если L >= 128, то длина представляется в виде L
198       = \sum {i = 0}^{r - 1}l_i 256^i, 0 <= l_i < 256, и кодируется r + 1
199       октетами (r | 128), l_{r - 1},..., l_0 (длинная явная форма). Заранее
200       неизвестная длина кодируется октетом 128 (неявная форма). Значение 255
201       первого октета длины зарезервировано и не должно использоваться.
202
203       При кодировании примитивных типов (см. 6-й бит тега) должна
204       использоваться явная форма длины. Других ограничений в базовых правилах
205       кодирования АСН.1, которые называются BER (Basic Encoding Rules), нет.
206       Например, допускается выбор длинной формы для L < 128, допускается
207       использование в длинной форме нулевых старших октетов (l_{r - 1} может
208       равняться 0).
209
210       Реализованные в настоящем модуле правила DER (Distinguished Encoding
211       Rules) снимают неоднозначности. По правилам DER длина должна
212       кодироваться всегда в явной форме и всегда с помощью минимального числа
213       октетов. Последнее означает, что при L < 128 должна применяться
214       короткая форма, а при L >= 128 -- длинная форма с l_{r - 1} != 0.
215
216       Ограничение реализации: длина укладывается в size_t.
217
218       Декодируемый DER-код записывается в виде [<=count]der. Подразумевается,
219       что код записан в префиксе буфера [count]der. Точная длина DER-кода
220       (сумма длин полей T, L и V, причем длина V указана в L) определяется в
221       процессе декодирования.
222
223       Прим.
224           Допускается передача в функции нулевых входных указателей.
225
226       Предусловие
227           Соответствующий ненулевому указателю буфер корректен.
228
229           Входные буферы не пересекаются, если не оговорено противное.
230
231       DER-кодирование
232

Базовые типы

234       Реализовано кодирование следующих типов АСН.1:
235
236       • INTEGER (0x02, SIZE);
237
238       • BIT STRING (0x03, BIT);
239
240       • OCTET STRING (0x04, OCT);
241
242       • NULL (0x05, NULL);
243
244       • OBJECT IDENTIFIER (0x06, OID);
245
246       • PrintableString (0x13, PSTR);
247
248       • SEQUENCE (0x30, SEQ).
249
250       В скобках указывается стандартный код тега типа и короткое имя.
251       Короткое имя входит в название функций и макросов работы с типом.
252
253       Для некоторых типов реализована поддержка нестандартных тегов. В
254       соответствующих функциях и макросах к короткому имени добавляется
255       префикс T: TSIZE, TBIT и т.д.
256
257       Тип INTEGER описывает целые числа. При кодировании числа поле V имеет
258       вид o1 o2 ... on, где o1 -- старший октет числа, on -- младший.
259       Установка старшего бита в o1 -- признак отрицательного числа. Должно
260       использоваться минимальное число октетов для однозначного представления
261       числа.
262
263       Примеры:
264
265       • der(0) = 02 01 00
266
267       • der(127) = 02 01 7F
268
269       • der(128) = 02 02 00 80
270
271       • der(256) = 02 02 01 00
272
273       • der(-128) = 02 01 80
274
275       • der(-129) = 02 02 FF 7F
276
277       Особенность реализации: тип INTEGER сужается до SIZE -- кодируются
278       только неотрицательные целые, которые укладываются в size_t.
279
280       Строка битов (BIT STRING) представляется в памяти строкой октетов. Биты
281       строки нумеруются от нуля. При этом нулевой бит является старшим битом
282       первого октета представления, седьмой бит -- младшим битом первого
283       октета, восьмой бит --- старшим битом второго октета и так далее. Если
284       длина строки не кратна 8, то она предварительно дополняется нулями. Они
285       будут находиться в младших битах последнего октета представления. Число
286       дописанных нулевых битов (от 0 до 7) фиксируется в дополнительном
287       октете, который предшествует октетам представления.
288
289       Идентификатор объекта (OBJECT IDENTIFIER) задается строкой по правилам
290       модуля oid.h.
291
292       При кодировании контейнера (структуры SEQUENCE) длина вложенных данных
293       становится окончательно известна только в конце кодирования. Для
294       уточнения длины в начале кодирования сохраняется ссылка на
295       закодированный префикс структуры. Эта ссылка называется якорем,
296       описывается типом der_anchor_t и используется при завершении
297       кодирования.
298
299       Якорь используется также при декодировании контейнера: сохраняется в
300       начале, учитывается в конце для проверки кода.
301
302       Прим.
303           Значение, которое определяется при декодировании SIZE, BIT, OCT и
304           OID, возвращается по указанному извне адресу, а не в виде указателя
305           на участок декодируемого кода (ср. с поведением базовых функций
306           derDecXXX()).
307

Функции

309   size_t derDec (u32 * tag, const octet ** val, size_t * len, const octet
310       der[], size_t count)
311       Определяются тег tag и значение [len?]val DER-кода [<=count]der. При
312       этом val указывает на буфер памяти внутри буфера der.
313
314       Возвращает
315           Точная длина DER-кода или SIZE_MAX в случае ошибки формата.
316
317       Прим.
318           Любой из указателей tag, val и len может быть нулевым.
319
320       Аргументы
321           tag тег
322           val указатель на значение
323           len длина значения
324           der DER-код
325           count длина der в октетах
326
327   size_t derDec2 (const octet ** val, size_t * len, const octet der[], size_t
328       count, u32 tag)
329       Проверяется, что тег DER-кода [<=count]der равняется tag и, если это
330       так, определяется закодированное значение [len?]val. При этом val
331       указывает на буфер памяти внутри буфера der.
332
333       Прим.
334           Любой из указателей val, len может быть нулевым, и тогда возврат
335           данных по указателю не производится.
336
337       Предусловие
338           Буферы, на которые ссылаются ненулевые указатели val и len, не
339           пересекаются между собой и с буфером der.
340
341       Возвращает
342           Точная длина DER-кода или SIZE_MAX в случае ошибки.
343
344       Аргументы
345           val значение
346           len длина значения
347           der DER-код
348           count длина der в октетах
349           tag тег
350
351   size_t derDec3 (const octet ** val, const octet der[], size_t count, u32
352       tag, size_t len)
353       Проверяется, что тег и длина значения DER-кода [<=count]der равняются
354       соответственно tag и len и, если это так, определяется закодированное
355       значение [len]val. При этом val указывает на буфер памяти внутри буфера
356       der.
357
358       Прим.
359           Указатель val может быть нулевым, и тогда возврат данных по
360           указателю не производится.
361
362       Предусловие
363           Если val != 0, то соответствующий буфер не пересекается с буфером
364           der.
365
366       Возвращает
367           Точная длина DER-кода или SIZE_MAX в случае ошибки.
368
369       Аргументы
370           val значение
371           der DER-код
372           count длина der в октетах
373           tag тег
374           len длина значения
375
376   size_t derDec4 (const octet der[], size_t count, u32 tag, const void * val,
377       size_t len)
378       Проверяется, что тег и значение DER-кода [<=count]der равняются
379       соответственно tag и [len]val.
380
381       Прим.
382           Величина count является оценкой сверху актуальной длины DER-кода.
383
384       Возвращает
385           Точная длина DER-кода или SIZE_MAX в случае ошибки.
386
387       Аргументы
388           der DER-код
389           count длина der в октетах
390           tag тег
391           val значение
392           len длина значения
393
394   size_t derEnc (octet der[], u32 tag, const void * val, size_t len)
395       Определяется число октетов в DER-коде значения [len]val с тегом tag.
396       Если der != 0, то DER-код размещается по этому адресу.
397
398       Предусловие
399           Если der != 0, то val != 0 и по адресу der зарезервировано
400           derEnc(0, tag, val, len) октетов.
401
402       Возвращает
403           Число октетов в DER-коде или SIZE_MAX в случае ошибки.
404
405       Прим.
406           Буферы der и val могут пересекаться.
407
408           Ошибкой является неверный формат tag.
409
410           Разрешаются вызовы derEnc(0, tag, val, len), derEnc(0, tag, 0,
411           len).
412
413       Аргументы
414           der DER-код
415           tag тег
416           val значение
417           len длина val в октетах
418
419   bool_t derIsValid (const octet der[], size_t count)
420       Проверяется корректность DER-кода [count]der. Проверяются следующие
421       условия:
422
423       • тег T и длина L закодированы по правилам ACH.1;
424
425       • тег укладывается в u32 (ограничение реализации);
426
427       • длина укладывается в size_t (органичение реализации);
428
429       • count действительно является длиной кода.
430
431       Возвращает
432           Признак корректности.
433
434       Прим.
435           Содержимое V не проверяется.
436
437       Аргументы
438           der DER-код
439           count длина der в октетах
440
441   bool_t derIsValid2 (const octet der[], size_t count, u32 tag)
442       Проверяется корректность DER-кода [count]der с ожидаемым тегом tag.
443       Проверяются следующие условия:
444
445       • derIsValid(der, count) == TRUE;
446
447       • der имеет тег tag.
448
449       Ожидается [FALSE]
450           Тег tag корректен.
451
452       Возвращает
453           Признак корректности.
454
455       Прим.
456           Содержимое V не проверяется.
457
458       Аргументы
459           der DER-код
460           count длина der в октетах
461           tag тег
462
463   size_t derOIDDec (char * oid, size_t * len, const octet der[], size_t
464       count)
465       Определяется идентификатор объекта [len? + 1]oid, представленный
466       DER-кодом [<=count]der.
467
468       Возвращает
469           Точная длина DER-кода или SIZE_MAX в случае ошибки.
470
471       Прим.
472           Длина len? не учитывает завершающий нулевой символ.
473
474       Аргументы
475           oid идентификатор
476           len длина идентификатора
477           der DER-код
478           count длина der в октетах
479
480   size_t derOIDDec2 (const octet der[], size_t count, const char * oid)
481       Проверяется, что DER-код [<=count]der построен по идентификатору oid.
482       Идентификатор задается строкой, составленной по правилам модуля oid.h.
483
484       Возвращает
485           Точная длина DER-кода или SIZE_MAX в случае оишбки.
486
487       Аргументы
488           der DER-код
489           count длина der в октетах
490           oid идентификатор
491
492   size_t derOIDEnc (octet der[], const char * oid)
493       Определяется число октетов в DER-коде идентификатора объекта oid. Если
494       der != 0, то DER-код размещается по этому адресу.
495
496       Предусловие
497           Если der != 0, то по адресу der зарезервировано derOIDEnc(0, oid)
498           октетов.
499
500       Возвращает
501           Число октетов в DER-коде или SIZE_MAX в случае ошибки.
502
503       Аргументы
504           der DER-код
505           oid идентификатор объекта
506
507   bool_t derStartsWith (const octet der[], size_t count, u32 tag)
508       Проверяется, что DER-код [count]der начинается с тега tag.
509
510       Ожидается [FALSE]
511           Тег tag корректен.
512
513       Возвращает
514           Признак корректности.
515
516       Аргументы
517           der DER-код
518           count длина der в октетах
519           tag тег
520
521   size_t derTBITDec (octet * val, size_t * len, const octet der[], size_t
522       count, u32 tag)
523       Проверяется, что тег DER-кода [<=count]der равняется tag и, если это
524       так, определяется закодированная строка битов [(len? + 7)/8]val.
525
526       Прим.
527           Любой из указателей val и len может быть нулевым.
528
529       Предусловие
530           Буферы, на которые ссылаются ненулевые указатели val и len, не
531           пересекаются между собой, но могут пересекаться с буфером der.
532
533       Возвращает
534           Точная длина DER-кода или SIZE_MAX в случае ошибки.
535
536       Аргументы
537           val строка битов
538           len длина val в битах
539           der DER-код
540           count длина der в октетах
541           tag тег
542
543   size_t derTBITDec2 (octet * val, const octet der[], size_t count, u32 tag,
544       size_t len)
545       Проверяется, что DER-код [<=count]der имеет тег tag и представляет
546       строку битов длины len и, если это так, определяется закодированное
547       значение [(len? + 7)/8]val.
548
549       Прим.
550           Указатель val может быть нулевым.
551
552       Предусловие
553           Если val != 0, то соответствующий буфер может пересекается с der.
554
555       Возвращает
556           Точная длина DER-кода или SIZE_MAX в случае ошибки.
557
558       Аргументы
559           val строка битов
560           der DER-код
561           count длина der в октетах
562           tag тег
563           len длина val в битах
564
565   size_t derTBITEnc (octet der[], u32 tag, const octet * val, size_t len)
566       Определяется число октетов в DER-коде с тегом tag строки битов [(len +
567       7)/8]val. Если der != 0, то DER-код размещается по этому адресу.
568
569       Предусловие
570           Если der != 0, то по адресу der зарезервировано derTBITEnc(0, tag,
571           val, len) октетов.
572
573       Возвращает
574           Число октетов в DER-коде или SIZE_MAX в случае ошибки.
575
576       Прим.
577           Поддерживается логика derEnc(), в частности, буферы der и val могут
578           пересекаться.
579
580       Аргументы
581           der DER-код
582           tag тег
583           val строка битов
584           len длина val в битах
585
586   size_t derTLDec (u32 * tag, size_t * len, const octet der[], size_t count)
587       Определяются тег tag и длина значения len DER-кода с TL-префиксом
588       [<=count]der.
589
590       Возвращает
591           Точная длина TL-префикса или SIZE_MAX в случае ошибки формата.
592
593       Прим.
594           Любой из указателей tag и len может быть нулевым.
595
596       Аргументы
597           tag тег
598           len длина значения
599           der DER-код
600           count длина der в октетах
601
602   size_t derTLEnc (octet der[], u32 tag, size_t len)
603       Определяется число октетов в TL-префиксе DER-кода с тегом tag и
604       значением длины val. Если der != 0, то префикс размещается по этому
605       адресу.
606
607       Предусловие
608           Если der != 0, то по адресу der зарезервировано derEnc(0, tag, len)
609           октетов.
610
611       Возвращает
612           Число октетов в TL-префиксе или SIZE_MAX в случае ошибки.
613
614       Прим.
615           Ошибкой является неверный формат tag.
616
617       Аргументы
618           der DER-код
619           tag тег
620           len длина значения в октетах
621
622   size_t derTOCTDec (octet * val, size_t * len, const octet der[], size_t
623       count, u32 tag)
624       Проверяется, что тег DER-кода [<=count]der равняется tag и, если это
625       так, определяется закодированная строка октетов [len?]val.
626
627       Прим.
628           Любой из указателей val и len может быть нулевым.
629
630       Предусловие
631           Буферы, на которые ссылаются ненулевые указатели val и len, не
632           пересекаются между собой, но могут пересекаться с буфером der.
633
634       Возвращает
635           Точная длина DER-кода или SIZE_MAX в случае ошибки.
636
637       Аргументы
638           val строка октетов
639           len длина val
640           der DER-код
641           count длина der в октетах
642           tag тег
643
644   size_t derTOCTDec2 (octet * val, const octet der[], size_t count, u32 tag,
645       size_t len)
646       Проверяется, что DER-код [<=count]der имеет тег tag и представляет
647       строку октетов длины len и, если это так, определяется закодированное
648       значение [len]val.
649
650       Прим.
651           Указатель val может быть нулевым.
652
653       Предусловие
654           Если val != 0, то соответствующий буфер может пересекается с der.
655
656       Возвращает
657           Точная длина DER-кода или SIZE_MAX в случае ошибки.
658
659       Аргументы
660           val строка октетов
661           der DER-код
662           count длина der в октетах
663           tag тег
664           len длина val
665
666   size_t derTPSTRDec (char * val, size_t * len, const octet der[], size_t
667       count, u32 tag)
668       Проверяется, что тег DER-кода [<=count]der равняется tag и, если это
669       так, определяется печатаемая строка [len? + 1]val.
670
671       Прим.
672           Любой из указателей val и len может быть нулевым.
673
674       Предусловие
675           Буферы, на которые ссылаются ненулевые указатели val и len, не
676           пересекаются между собой, но могут пересекаться с буфером der.
677
678       Возвращает
679           Точная длина DER-кода или SIZE_MAX в случае ошибки.
680
681       Прим.
682           Длина len? не учитывает завершающий нулевой символ.
683
684       Аргументы
685           val строка
686           len длина val
687           der DER-код
688           count длина der в октетах
689           tag тег
690
691   size_t derTPSTREnc (octet der[], u32 tag, const char * val)
692       Определяется число октетов в DER-коде с тегом tag печатаемой строки
693       str. Если der != 0, то DER-код размещается по этому адресу.
694
695       Предусловие
696           Если der != 0, то по адресу der зарезервировано derTPSTREnc(0, tag,
697           str) октетов.
698
699       Ожидается [SIZE_MAX]
700           strIsPrintable(val).
701
702       Возвращает
703           Число октетов в DER-коде или SIZE_MAX в случае ошибки.
704
705       Прим.
706           Поддерживается логика derEnc(), в частности, буферы der и val могут
707           пересекаться.
708
709       Аргументы
710           der DER-код
711           tag тег
712           val строка
713
714   size_t derTSEQDecStart (der_anchor_t * anchor, const octet der[], size_t
715       count, u32 tag)
716       Определяется число октетов в префиксе DER-кода [<=count]der структуры
717       TSEQ с тегом tag. Одновременно в якоре anchor сохраняются данные,
718       необходимые для проверки префикса при завершении декодирования
719       структуры.
720
721       Ожидается [SIZE_MAX]
722           В tag установлен бит конструктивности.
723
724       Возвращает
725           Число октетов в префиксе DER-коде или SIZE_MAX в случае ошибки.
726
727       Аргументы
728           anchor якорь
729           der DER-код
730           count длина der в октетах
731           tag тег
732
733   size_t derTSEQDecStop (const octet der[], const der_anchor_t * anchor)
734       Завершается декодирования структуры TSEQ: по якорю anchor, сохраненному
735       в начале кодирования, и адресу der, который указывает на окончание
736       DER-кода, проверяется корректность кода.
737
738       Предусловие
739           derTSEQDecStop() < derTSEQDecStart().
740
741       Возвращает
742           0 в случае успешного завершения или SIZE_MAX в случае ошибки.
743
744       Аргументы
745           der DER-код
746           anchor якорь
747
748   size_t derTSEQEncStart (der_anchor_t * anchor, octet der[], size_t pos, u32
749       tag)
750       Определяется число октетов в префиксе DER-кода структуры TSEQ с тегом
751       tag. Если der != 0, то префикс размещается по этому адресу.
752       Одновременно в якоре anchor сохраняются данные, необходимые для
753       уточнения префикса при завершении кодирования структуры. Чтобы
754       корректно уточнить префикс при нулевом der, в функцию передается
755       параметр pos. Это текущая позиция в коде в абстрактной (со свободной
756       точкой отсчета) системе координат.
757
758       Предусловие
759           Если der != 0, то по адресу der зарезервировано
760           derTSEQEncStart(anchor, 0, pos, tag) октетов.
761
762       Ожидается [SIZE_MAX]
763           В tag установлен бит конструктивности.
764
765       Возвращает
766           Число октетов в префиксе DER-коде или SIZE_MAX в случае ошибки.
767
768       Аргументы
769           anchor якорь
770           der DER-код
771           pos позиция
772           tag тег
773
774   size_t derTSEQEncStop (octet der[], size_t pos, const der_anchor_t *
775       anchor)
776       По якорю anchor и текущей позиции pos в коде определяется
777       дополнительное число октетов для завершения кодирования структуры TSEQ.
778       Если der != 0, то кодирование завершается.
779
780       Предусловие
781           Если der != 0, то по адресу der зарезервировано derTSEQEncStop(0,
782           pos, anchor) октетов.
783
784       Ожидается
785           derTSEQEncStop() < derTSEQEncStart().
786
787       Предусловие
788           Если в derTSEQEncStart() передан ненулевой адрес der, то в
789           derTSEQEncStop() также передан ненулевой адрес и разность адресов
790           совпадает с разностью позиций.
791
792       Возвращает
793           Число октетов завершающих кодирование или SIZE_MAX в случае ошибки.
794
795       Аргументы
796           der DER-код
797           pos позиция
798           anchor якорь
799
800   size_t derTSIZEDec (size_t * val, const octet der[], size_t count, u32 tag)
801       Проверяется, что тег DER-кода [<=count]der равняется tag и, если это
802       так, определяется закодированное неотрицательное целое val.
803
804       Возвращает
805           Точная длина DER-кода или SIZE_MAX в случае оишбки.
806
807       Аргументы
808           val значение
809           der DER-код
810           count длина der в октетах
811           tag тег
812
813   size_t derTSIZEDec2 (const octet der[], size_t count, u32 tag, size_t val)
814       Проверяется, что DER-код [<=count]der имеет тег tag и представляет
815       неотрицательное целое val.
816
817       Возвращает
818           Точная длина DER-кода или SIZE_MAX в случае оишбки.
819
820       Аргументы
821           der DER-код
822           count длина der в октетах
823           tag тег
824           val значение
825
826   size_t derTSIZEEnc (octet der[], u32 tag, size_t val)
827       Определяется число октетов в DER-коде с тегом tag неотрицательного
828       целого val. Если der != 0, то DER-код размещается по этому адресу.
829
830       Предусловие
831           Если der != 0, то по адресу der зарезервировано derTSIZEEnc(0, tag,
832           val) октетов.
833
834       Возвращает
835           Число октетов в DER-коде или SIZE_MAX в случае ошибки.
836
837       Аргументы
838           der DER-код
839           tag тег
840           val значение
841

Автор

843       Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
844
845
846
847Библиотека Bee2                 Пт 23 Июн 2023                        der.h(3)
Impressum