MCPcopy Create free account
hub / github.com/CE-Programming/CEmu / cert_field_get

Function cert_field_get

core/cert.c:4–72  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2#include <stdio.h>
3
4int cert_field_get(const uint8_t *data, uint32_t length, uint16_t *field_type, const uint8_t **contents, uint32_t *field_size) {
5 uint16_t field_id;
6 uint32_t field_len;
7 uint32_t additional_len;
8
9 /* sanity checks. */
10 if (data == NULL) {
11 return 1;
12 }
13 if (field_type == NULL && contents == NULL && field_size == NULL) {
14 return 1;
15 }
16 if (length < 2) {
17 return 1;
18 }
19
20 /* retrieve field id and number of additional bytes we need to read for the field's size */
21 field_id = (((uint16_t)data[0]) << 8) | data[1];
22 if (field_id == 0xFFFF) {
23 return 1;
24 }
25
26 switch (field_id & 0xF) {
27 case 0xD: additional_len = 1; break;
28 case 0xE: additional_len = 2; break;
29 case 0xF: additional_len = 4; break;
30 default: additional_len = 0; break;
31 }
32
33 if (length < 2 + additional_len) {
34 return 1;
35 }
36
37 /* retrieve data size of field. */
38 switch (field_id & 0xF) {
39 case 0xD:
40 field_len = (uint32_t)data[2];
41 break;
42
43 case 0xE:
44 field_len = (((uint32_t)data[2]) << 8) | data[3];
45 break;
46
47 case 0xF:
48 field_len = (((uint32_t)data[2]) << 24) | (((uint32_t)data[3]) << 16) | (((uint32_t)data[4]) << 8) | data[5];
49 break;
50
51 default:
52 field_len = field_id & 0xF;
53 break;
54 }
55
56 if (length < 2 + additional_len + field_len) {
57 return 1;
58 }
59
60 if (field_type != NULL) {
61 /* don't mask out the size indication, it may be useful to the user. */

Callers 3

emu_loadFunction · 0.85
cert_field_nextFunction · 0.85
cert_field_findFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected