10 return (tag > 0xFF) ? 2 : 1;
14 if (value_len < 0x80)
return 1;
15 if (value_len <= 0xFF)
return 2;
25 buf[0] =
static_cast<uint8_t
>((tag >> 8) & 0xFF);
26 buf[1] =
static_cast<uint8_t
>(tag & 0xFF);
28 buf[0] =
static_cast<uint8_t
>(tag & 0xFF);
41 buf[0] =
static_cast<uint8_t
>(value_len);
42 }
else if (need == 2) {
44 buf[1] =
static_cast<uint8_t
>(value_len);
47 buf[1] =
static_cast<uint8_t
>((value_len >> 8) & 0xFF);
48 buf[2] =
static_cast<uint8_t
>(value_len & 0xFF);
55 const uint8_t *value,
size_t value_len,
size_t *written) {
62 if (st !=
TLV_OK)
return st;
65 if (st !=
TLV_OK)
return st;
69 memcpy(buf + pos, value, value_len);
81 const uint8_t b0 = buf[*pos];
84 if ((b0 & 0x1F) == 0x1F) {
86 const uint8_t b1 = buf[*pos + 1];
89 *tag_out =
static_cast<uint16_t
>((b0 << 8) | b1);
103 const uint8_t first = buf[*pos];
109 const uint8_t n = first & 0x7F;
114 for (uint8_t i = 0; i < n; ++i) {
115 length = (length << 8) | buf[*pos + 1 + i];
117 *length_out = length;
124 const size_t start = *pos;
128 if (st !=
TLV_OK)
return st;
132 if (st !=
TLV_OK)
return st;
138 out->
value = (length > 0) ? buf + *pos :
nullptr;
Parsed TLV: pointers alias into the caller-supplied buffer.
tlv_status_t tlv_parse(const uint8_t *buf, size_t buf_len, size_t *pos, tlv_t *out)
Parse a single TLV starting at pos. On success pos advances past the entire field and out is filled.
tlv_status_t tlv_write_tag(uint8_t *buf, size_t buf_max, uint16_t tag, size_t *written)
Encode a tag. Writes either one or two bytes depending on the magnitude of tag.
tlv_status_t tlv_build(uint8_t *buf, size_t buf_max, uint16_t tag, const uint8_t *value, size_t value_len, size_t *written)
Build a complete TLV: tag, length, and value (which may be NULL when value_len == 0).
tlv_status_t tlv_write_len(uint8_t *buf, size_t buf_max, size_t value_len, size_t *written)
Encode a BER definite length field.
tlv_status_t tlv_read_tag(const uint8_t *buf, size_t buf_len, size_t *pos, uint16_t *tag_out)
Read a tag from the input buffer at pos.
size_t tlv_len_size(size_t value_len)
Compute the BER definite-length encoded size for a length value.
tlv_status_t tlv_read_len(const uint8_t *buf, size_t buf_len, size_t *pos, size_t *length_out)
Read a BER definite length field starting at pos.
size_t tlv_tag_size(uint16_t tag)
BER-TLV codec implementation (see tlv.h).
tlv_status_t
BER-TLV codec for OpenPGP Data Objects.