80 if (header_cap < 1U) {
return 0U; }
81 header_output[0] = (uint8_t)0xc0 + (uint8_t)total_len;
86 uint8_t tmp_header[8];
87 memset(tmp_header, 0, 8U);
88 uint32_t hexdigit = 1U;
89 uint32_t tmp = total_len;
90 while ((uint32_t)(tmp / 256U) > 0U)
92 tmp_header[hexdigit] = (uint8_t)(tmp % 256U);
93 tmp = (uint32_t)(tmp / 256U);
96 tmp_header[hexdigit] = (uint8_t)(tmp);
97 tmp_header[0] = (uint8_t)0xf7 + (uint8_t)hexdigit;
101 memset(header, 0, 8U);
102 header[0] = tmp_header[0];
103 for (uint32_t i = 0U; i < hexdigit; i++)
105 header[i + 1U] = tmp_header[hexdigit - i];
107 const size_t need = (size_t)hexdigit + 1U;
108 if (need > header_cap) {
return 0U; }
109 memcpy(header_output, header, need);
110 return hexdigit + 1U;
123uint32_t
RlpEncodeItem(uint8_t* output,
size_t output_cap,
const uint8_t* input, uint32_t input_len)
125 if (input_len == 1U && input[0] == 0x00U)
127 if (output_cap < 1U) {
return 0U; }
128 const uint8_t c[1] = {0x80};
129 memcpy(output, c, 1U);
132 else if (input_len == 1U && input[0] < 128U)
134 if (output_cap < 1U) {
return 0U; }
135 memcpy(output, input, 1U);
138 else if (input_len <= 55U)
140 const size_t need = (size_t)input_len + 1U;
141 if (need > output_cap) {
return 0U; }
142 const uint8_t _ = (uint8_t)0x80 + (uint8_t)input_len;
143 const uint8_t header[] = {_};
144 memcpy(output, header, 1U);
145 memcpy(output + 1U, input, (
size_t)input_len);
146 return input_len + 1U;
150 uint8_t tmp_header[8];
151 memset(tmp_header, 0, 8U);
152 uint32_t hexdigit = 1U;
153 uint32_t tmp = input_len;
154 while ((uint32_t)(tmp / 256U) > 0U)
156 tmp_header[hexdigit] = (uint8_t)(tmp % 256U);
157 tmp = (uint32_t)(tmp / 256U);
160 tmp_header[hexdigit] = (uint8_t)(tmp);
161 tmp_header[0] = (uint8_t)0xb7 + (uint8_t)hexdigit;
165 memset(header, 0, 8U);
166 header[0] = tmp_header[0];
167 for (uint32_t i = 0U; i < hexdigit; i++)
169 header[i + 1U] = tmp_header[hexdigit - i];
171 const size_t need = (size_t)input_len + hexdigit + 1U;
172 if (need > output_cap) {
return 0U; }
173 memcpy(output, header, hexdigit + 1U);
174 memcpy(output + hexdigit + 1U, input, (
size_t)input_len);
175 return input_len + hexdigit + 1U;
size_t trimLeadingZeros(uint8_t *out, size_t out_cap, const uint8_t *in, size_t in_len)
Trims leading zeros from a byte array.
uint32_t RlpEncodeWholeHeader(uint8_t *header_output, size_t header_cap, uint32_t total_len)
Encodes the RLP list header for a sequence of items.
uint32_t RlpEncodeItem(uint8_t *output, size_t output_cap, const uint8_t *input, uint32_t input_len)
Encodes a single RLP item.