libubox
C utility functions for OpenWrt.
test-blob-parse.c File Reference
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <libgen.h>
#include "blob.h"
#include "list.h"
#include "blobmsg_json.h"

Go to the source code of this file.

Data Structures

struct  cert_object
 

Macros

#define CERT_BUF_LEN   4096
 

Enumerations

enum  cert_attr { CERT_ATTR_SIGNATURE , CERT_ATTR_PAYLOAD , CERT_ATTR_MAX }
 
enum  cert_cont_attr { CERT_CT_ATTR_PAYLOAD , CERT_CT_ATTR_MAX }
 
enum  cert_payload_attr {
  CERT_PL_ATTR_CERTTYPE , CERT_PL_ATTR_CERTID , CERT_PL_ATTR_VALIDFROMTIME , CERT_PL_ATTR_EXPIRETIME ,
  CERT_PL_ATTR_PUBKEY , CERT_PL_ATTR_KEY_FINGERPRINT , CERT_PL_ATTR_MAX
}
 
enum  certtype_id { CERTTYPE_UNSPEC , CERTTYPE_AUTH , CERTTYPE_REVOKE }
 

Functions

static int cert_load (const char *certfile, struct list_head *chain)
 
static void cert_dump_blob (struct blob_attr *cert[CERT_ATTR_MAX])
 
static int cert_dump (const char *certfile)
 
int main (int argc, char *argv[])
 

Variables

static const struct blob_attr_info cert_policy [CERT_ATTR_MAX]
 

Macro Definition Documentation

◆ CERT_BUF_LEN

#define CERT_BUF_LEN   4096

Definition at line 18 of file test-blob-parse.c.

Enumeration Type Documentation

◆ cert_attr

enum cert_attr
Enumerator
CERT_ATTR_SIGNATURE 
CERT_ATTR_PAYLOAD 
CERT_ATTR_MAX 

Definition at line 27 of file test-blob-parse.c.

27  {
31 };
@ CERT_ATTR_MAX
@ CERT_ATTR_SIGNATURE
@ CERT_ATTR_PAYLOAD

◆ cert_cont_attr

Enumerator
CERT_CT_ATTR_PAYLOAD 
CERT_CT_ATTR_MAX 

Definition at line 38 of file test-blob-parse.c.

38  {
41 };
@ CERT_CT_ATTR_MAX
@ CERT_CT_ATTR_PAYLOAD

◆ cert_payload_attr

Enumerator
CERT_PL_ATTR_CERTTYPE 
CERT_PL_ATTR_CERTID 
CERT_PL_ATTR_VALIDFROMTIME 
CERT_PL_ATTR_EXPIRETIME 
CERT_PL_ATTR_PUBKEY 
CERT_PL_ATTR_KEY_FINGERPRINT 
CERT_PL_ATTR_MAX 

Definition at line 43 of file test-blob-parse.c.

43  {
51 };
@ CERT_PL_ATTR_PUBKEY
@ CERT_PL_ATTR_MAX
@ CERT_PL_ATTR_CERTTYPE
@ CERT_PL_ATTR_CERTID
@ CERT_PL_ATTR_KEY_FINGERPRINT
@ CERT_PL_ATTR_EXPIRETIME
@ CERT_PL_ATTR_VALIDFROMTIME

◆ certtype_id

Enumerator
CERTTYPE_UNSPEC 
CERTTYPE_AUTH 
CERTTYPE_REVOKE 

Definition at line 53 of file test-blob-parse.c.

53  {
57 };
@ CERTTYPE_REVOKE
@ CERTTYPE_UNSPEC
@ CERTTYPE_AUTH

Function Documentation

◆ cert_dump()

static int cert_dump ( const char *  certfile)
static

Definition at line 155 of file test-blob-parse.c.

156 {
157  struct cert_object *cobj;
158  static LIST_HEAD(certchain);
159  unsigned int count = 0;
160 
161  if (cert_load(certfile, &certchain)) {
162  fprintf(stderr, "cannot parse cert %s\n", basename((char *) certfile));
163  return 1;
164  }
165 
166  list_for_each_entry(cobj, &certchain, list) {
167  fprintf(stdout, "=== CHAIN ELEMENT %02u ===\n", ++count);
168  cert_dump_blob(cobj->cert);
169  }
170 
171  return 0;
172 }
#define LIST_HEAD(name)
Definition: list.h:60
#define list_for_each_entry(p, h, field)
Definition: list.h:132
struct blob_attr * cert[CERT_ATTR_MAX]
struct list_head list
static void cert_dump_blob(struct blob_attr *cert[CERT_ATTR_MAX])
static int cert_load(const char *certfile, struct list_head *chain)
Here is the call graph for this function:

◆ cert_dump_blob()

static void cert_dump_blob ( struct blob_attr cert[CERT_ATTR_MAX])
static

Definition at line 128 of file test-blob-parse.c.

129 {
130  int i;
131  char *json = NULL;
132 
133  for (i = 0; i < CERT_ATTR_MAX; i++) {
134  struct blob_attr *v = cert[i];
135 
136  if (!v)
137  continue;
138 
139  switch(cert_policy[i].type) {
140  case BLOB_ATTR_BINARY:
141  fprintf(stdout, "signature:\n---\n%s---\n", (char *) blob_data(v));
142  break;
143  case BLOB_ATTR_NESTED:
144  json = blobmsg_format_json_indent(blob_data(v), false, 0);
145  if (!json)
146  continue;
147 
148  fprintf(stdout, "payload:\n---\n%s\n---\n", json);
149  free(json);
150  break;
151  }
152  }
153 }
@ BLOB_ATTR_BINARY
Definition: blob.h:36
@ BLOB_ATTR_NESTED
Definition: blob.h:35
static void * blob_data(const struct blob_attr *attr)
Definition: blob.h:75
static char * blobmsg_format_json_indent(struct blob_attr *attr, bool list, int indent)
Definition: blobmsg_json.h:40
Definition: blob.h:52
static const struct blob_attr_info cert_policy[CERT_ATTR_MAX]
uint8_t type
Definition: udebug-proto.h:0
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cert_load()

static int cert_load ( const char *  certfile,
struct list_head chain 
)
static

Definition at line 65 of file test-blob-parse.c.

66 {
67  FILE *f;
68  struct blob_attr *certtb[CERT_ATTR_MAX];
69  struct blob_attr *bufpt;
70  struct cert_object *cobj;
71  char *filebuf = NULL;
72  int ret = 0, pret = 0;
73  size_t len, pos = 0;
74 
75  f = fopen(certfile, "r");
76  if (!f)
77  return 1;
78 
79  filebuf = malloc(CERT_BUF_LEN+1);
80  if (!filebuf)
81  return 1;
82 
83  len = fread(filebuf, 1, CERT_BUF_LEN, f);
84  if (len < 64) {
85  free(filebuf);
86  return 1;
87  }
88 
89  ret = ferror(f) || !feof(f);
90  fclose(f);
91  if (ret) {
92  free(filebuf);
93  return 1;
94  }
95 
96  bufpt = (struct blob_attr *)filebuf;
97  do {
98  pret = blob_parse_untrusted(bufpt, len, certtb, cert_policy, CERT_ATTR_MAX);
99  if (pret <= 0)
100  /* no attributes found */
101  break;
102 
103  if (pos + blob_pad_len(bufpt) > len)
104  /* blob exceeds filebuffer */
105  break;
106  else
107  pos += blob_pad_len(bufpt);
108 
109  if (!certtb[CERT_ATTR_SIGNATURE])
110  /* no signature -> drop */
111  break;
112 
113  cobj = calloc(1, sizeof(*cobj));
115  if (certtb[CERT_ATTR_PAYLOAD])
117 
118  list_add_tail(&cobj->list, chain);
119  ret += pret;
120  /* repeat parsing while there is still enough remaining data in buffer */
121  } while(len > pos + sizeof(struct blob_attr) && (bufpt = blob_next(bufpt)));
122 
123  free(filebuf);
124  return (ret <= 0);
125 }
int blob_parse_untrusted(struct blob_attr *attr, size_t attr_len, struct blob_attr **data, const struct blob_attr_info *info, int max)
Definition: blob.c:272
struct blob_attr * blob_memdup(struct blob_attr *attr)
Definition: blob.c:326
static size_t blob_pad_len(const struct blob_attr *attr)
Definition: blob.h:118
static struct blob_attr * blob_next(const struct blob_attr *attr)
Definition: blob.h:185
static void list_add_tail(struct list_head *_new, struct list_head *head)
Definition: list.h:165
#define CERT_BUF_LEN
FILE(GLOB test_cases "test-*.c") MACRO(ADD_FUZZER_TEST name) ADD_EXECUTABLE($
Definition: CMakeLists.txt:1
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 174 of file test-blob-parse.c.

175 {
176  if (argc != 2) {
177  fprintf(stderr, "Usage: %s <cert.ucert>\n", argv[0]);
178  return 3;
179  }
180 
181  cert_dump(argv[1]);
182 
183  return 0;
184 }
static int cert_dump(const char *certfile)

Variable Documentation

◆ cert_policy

const struct blob_attr_info cert_policy[CERT_ATTR_MAX]
static
Initial value:

Definition at line 1 of file test-blob-parse.c.