1der.h(3) Library Functions Manual der.h(3)
2
3
4
6 der.h - Отличительные правила кодирования
7
8
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)