Lines Matching +full:byte +full:- +full:len

1 // SPDX-License-Identifier: GPL-2.0-only
14 * asn1_encode_integer() - encode positive integer to ASN.1
16 * @end_data: end of data pointer, points one beyond last usable byte in @data
27 int data_len = end_data - data; in asn1_encode_integer()
34 return ERR_PTR(-EINVAL); in asn1_encode_integer()
41 return ERR_PTR(-EINVAL); in asn1_encode_integer()
44 data_len -= 2; in asn1_encode_integer()
52 for (i = sizeof(integer); i > 0 ; i--) { in asn1_encode_integer()
53 int byte = integer >> (8 * (i - 1)); in asn1_encode_integer() local
55 if (!found && byte == 0) in asn1_encode_integer()
59 * for a positive number the first byte must have bit in asn1_encode_integer()
64 if (!found && (byte & 0x80)) { in asn1_encode_integer()
67 * have len >= 1 in asn1_encode_integer()
70 data_len--; in asn1_encode_integer()
75 return ERR_PTR(-EINVAL); in asn1_encode_integer()
77 *d++ = byte; in asn1_encode_integer()
78 data_len--; in asn1_encode_integer()
82 data[1] = d - data - 2; in asn1_encode_integer()
96 return -EINVAL; in asn1_encode_oid_digit()
101 (*data_len)--; in asn1_encode_oid_digit()
106 start -= 7; in asn1_encode_oid_digit()
109 u8 byte; in asn1_encode_oid_digit() local
111 byte = oid >> start; in asn1_encode_oid_digit()
112 oid = oid - (byte << start); in asn1_encode_oid_digit()
113 start -= 7; in asn1_encode_oid_digit()
114 byte |= 0x80; in asn1_encode_oid_digit()
115 *data++ = byte; in asn1_encode_oid_digit()
116 (*data_len)--; in asn1_encode_oid_digit()
121 (*data_len)--; in asn1_encode_oid_digit()
123 ret = -EINVAL; in asn1_encode_oid_digit()
132 * asn1_encode_oid() - encode an oid to ASN.1
134 * @end_data: end of data pointer, points one beyond last usable byte in @data
144 int data_len = end_data - data; in asn1_encode_oid()
149 return ERR_PTR(-EINVAL); in asn1_encode_oid()
152 return ERR_PTR(-EINVAL); in asn1_encode_oid()
160 return ERR_PTR(-EINVAL); in asn1_encode_oid()
165 data_len -= 3; in asn1_encode_oid()
175 data[1] = d - data - 2; in asn1_encode_oid()
182 * asn1_encode_length() - encode a length to follow an ASN.1 tag
185 * @len: length to encode
191 * sequence will be re-encoded when the length is known.
193 static int asn1_encode_length(unsigned char **data, int *data_len, int len) in asn1_encode_length() argument
196 return -EINVAL; in asn1_encode_length()
198 if (len < 0) { in asn1_encode_length()
200 (*data_len)--; in asn1_encode_length()
204 if (len <= 0x7f) { in asn1_encode_length()
205 *((*data)++) = len; in asn1_encode_length()
206 (*data_len)--; in asn1_encode_length()
211 return -EINVAL; in asn1_encode_length()
213 if (len <= 0xff) { in asn1_encode_length()
215 *((*data)++) = len & 0xff; in asn1_encode_length()
216 *data_len -= 2; in asn1_encode_length()
221 return -EINVAL; in asn1_encode_length()
223 if (len <= 0xffff) { in asn1_encode_length()
225 *((*data)++) = (len >> 8) & 0xff; in asn1_encode_length()
226 *((*data)++) = len & 0xff; in asn1_encode_length()
227 *data_len -= 3; in asn1_encode_length()
231 if (WARN(len > 0xffffff, "ASN.1 length can't be > 0xffffff")) in asn1_encode_length()
232 return -EINVAL; in asn1_encode_length()
235 return -EINVAL; in asn1_encode_length()
237 *((*data)++) = (len >> 16) & 0xff; in asn1_encode_length()
238 *((*data)++) = (len >> 8) & 0xff; in asn1_encode_length()
239 *((*data)++) = len & 0xff; in asn1_encode_length()
240 *data_len -= 4; in asn1_encode_length()
246 * asn1_encode_tag() - add a tag for optional or explicit value
248 * @end_data: end of data pointer, points one beyond last usable byte in @data
251 * @len: the length of the data to be tagged
261 * To encode in place pass a NULL @string and -1 for @len and the
269 * returned it and still NULL for @string but the real length in @len.
273 u32 tag, const unsigned char *string, int len) in asn1_encode_tag() argument
275 int data_len = end_data - data; in asn1_encode_tag()
279 return ERR_PTR(-EINVAL); in asn1_encode_tag()
281 if (!string && WARN(len > 127, in asn1_encode_tag()
283 return ERR_PTR(-EINVAL); in asn1_encode_tag()
288 if (!string && len > 0) { in asn1_encode_tag()
294 data -= 2; in asn1_encode_tag()
299 return ERR_PTR(-EINVAL); in asn1_encode_tag()
302 data_len--; in asn1_encode_tag()
303 ret = asn1_encode_length(&data, &data_len, len); in asn1_encode_tag()
310 if (data_len < len) in asn1_encode_tag()
311 return ERR_PTR(-EINVAL); in asn1_encode_tag()
313 memcpy(data, string, len); in asn1_encode_tag()
314 data += len; in asn1_encode_tag()
321 * asn1_encode_octet_string() - encode an ASN.1 OCTET STRING
323 * @end_data: end of data pointer, points one beyond last usable byte in @data
325 * @len: length of string
332 const unsigned char *string, u32 len) in asn1_encode_octet_string() argument
334 int data_len = end_data - data; in asn1_encode_octet_string()
342 return ERR_PTR(-EINVAL); in asn1_encode_octet_string()
345 data_len--; in asn1_encode_octet_string()
347 ret = asn1_encode_length(&data, &data_len, len); in asn1_encode_octet_string()
351 if (data_len < len) in asn1_encode_octet_string()
352 return ERR_PTR(-EINVAL); in asn1_encode_octet_string()
354 memcpy(data, string, len); in asn1_encode_octet_string()
355 data += len; in asn1_encode_octet_string()
362 * asn1_encode_sequence() - wrap a byte stream in an ASN.1 SEQUENCE
364 * @end_data: end of data pointer, points one beyond last usable byte in @data
366 * @len: length of the data to be encoded as a sequence
368 * Fill in a sequence. To encode in place, pass NULL for @seq and -1
369 * for @len; then call again once the length is known (still with NULL
376 const unsigned char *seq, int len) in asn1_encode_sequence() argument
378 int data_len = end_data - data; in asn1_encode_sequence()
381 if (!seq && WARN(len > 127, in asn1_encode_sequence()
383 return ERR_PTR(-EINVAL); in asn1_encode_sequence()
388 if (!seq && len >= 0) { in asn1_encode_sequence()
394 data -= 2; in asn1_encode_sequence()
399 return ERR_PTR(-EINVAL); in asn1_encode_sequence()
402 data_len--; in asn1_encode_sequence()
404 ret = asn1_encode_length(&data, &data_len, len); in asn1_encode_sequence()
411 if (data_len < len) in asn1_encode_sequence()
412 return ERR_PTR(-EINVAL); in asn1_encode_sequence()
414 memcpy(data, seq, len); in asn1_encode_sequence()
415 data += len; in asn1_encode_sequence()
422 * asn1_encode_boolean() - encode a boolean value to ASN.1
424 * @end_data: end of data pointer, points one beyond last usable byte in @data
431 int data_len = end_data - data; in asn1_encode_boolean()
438 return ERR_PTR(-EINVAL); in asn1_encode_boolean()
441 data_len--; in asn1_encode_boolean()