libwebsockets
Lightweight C library for HTML5 websockets
lws-jws.h
1 /*
2  * libwebsockets - small server side websockets and web server implementation
3  *
4  * Copyright (C) 2010-2018 Andy Green <andy@warmcat.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation:
9  * version 2.1 of the License.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301 USA
20  *
21  * included from libwebsockets.h
22  */
23 
35 
36 /*
37  * The maps are built to work with both JWS (LJWS_) and JWE (LJWE_), and are
38  * sized to the slightly larger JWE case.
39  */
40 
41 enum enum_jws_sig_elements {
42 
43  /* JWS block namespace */
44  LJWS_JOSE,
45  LJWS_PYLD,
46  LJWS_SIG,
47  LJWS_UHDR,
48 
49  /* JWE block namespace */
50  LJWE_JOSE = 0,
51  LJWE_EKEY,
52  LJWE_IV,
53  LJWE_CTXT,
54  LJWE_ATAG,
55  LJWE_AAD,
56 
57  LWS_JWS_MAX_COMPACT_BLOCKS
58 };
59 
60 struct lws_jws_map {
61  const char *buf[LWS_JWS_MAX_COMPACT_BLOCKS];
62  uint32_t len[LWS_JWS_MAX_COMPACT_BLOCKS];
63 };
64 
65 #define LWS_JWS_MAX_SIGS 3
66 
67 struct lws_jws {
68  struct lws_jwk *jwk; /* the struct lws_jwk containing the signing key */
69  struct lws_context *context; /* the lws context (used to get random) */
70  struct lws_jws_map map, map_b64;
71 };
72 
73 /* jws EC signatures do not have ASN.1 in them, meaning they're incompatible
74  * with generic signatures.
75  */
76 
84 LWS_VISIBLE LWS_EXTERN void
85 lws_jws_init(struct lws_jws *jws, struct lws_jwk *jwk,
86  struct lws_context *context);
87 
97 LWS_VISIBLE LWS_EXTERN void
98 lws_jws_destroy(struct lws_jws *jws);
99 
115 LWS_VISIBLE LWS_EXTERN int
117  struct lws_context *context,
118  char *temp, int *temp_len);
119 
120 LWS_VISIBLE LWS_EXTERN int
121 lws_jws_sig_confirm_compact_b64_map(struct lws_jws_map *map_b64,
122  struct lws_jwk *jwk,
123  struct lws_context *context,
124  char *temp, int *temp_len);
125 
143 LWS_VISIBLE LWS_EXTERN int
144 lws_jws_sig_confirm_compact_b64(const char *in, size_t len,
145  struct lws_jws_map *map,
146  struct lws_jwk *jwk,
147  struct lws_context *context,
148  char *temp, int *temp_len);
149 
167 LWS_VISIBLE LWS_EXTERN int
168 lws_jws_sig_confirm(struct lws_jws_map *map_b64, /* b64-encoded */
169  struct lws_jws_map *map, /* non-b64 */
170  struct lws_jwk *jwk, struct lws_context *context);
171 
191 LWS_VISIBLE LWS_EXTERN int
192 lws_jws_sign_from_b64(struct lws_jose *jose, struct lws_jws *jws, char *b64_sig,
193  size_t sig_len);
194 
212 LWS_VISIBLE LWS_EXTERN int
213 lws_jws_compact_decode(const char *in, int len, struct lws_jws_map *map,
214  struct lws_jws_map *map_b64, char *out, int *out_len);
215 
216 LWS_VISIBLE LWS_EXTERN int
217 lws_jws_compact_encode(struct lws_jws_map *map_b64, /* b64-encoded */
218  const struct lws_jws_map *map, /* non-b64 */
219  char *buf, int *out_len);
220 
221 LWS_VISIBLE LWS_EXTERN int
222 lws_jws_sig_confirm_json(const char *in, size_t len,
223  struct lws_jws *jws, struct lws_jwk *jwk,
224  struct lws_context *context,
225  char *temp, int *temp_len);
226 
235 LWS_VISIBLE LWS_EXTERN int
236 lws_jws_write_flattened_json(struct lws_jws *jws, char *flattened, size_t len);
237 
246 LWS_VISIBLE LWS_EXTERN int
247 lws_jws_write_compact(struct lws_jws *jws, char *compact, size_t len);
248 
249 
250 
251 /*
252  * below apis are not normally needed if dealing with whole JWS... they're
253  * useful for creating from scratch
254  */
255 
256 
277 LWS_VISIBLE LWS_EXTERN int
278 lws_jws_dup_element(struct lws_jws_map *map, int idx,
279  char *temp, int *temp_len, const void *in, size_t in_len,
280  size_t actual_alloc);
281 
302 LWS_VISIBLE LWS_EXTERN int
303 lws_jws_randomize_element(struct lws_context *context,
304  struct lws_jws_map *map,
305  int idx, char *temp, int *temp_len, size_t random_len,
306  size_t actual_alloc);
307 
327 LWS_VISIBLE LWS_EXTERN int
328 lws_jws_alloc_element(struct lws_jws_map *map, int idx, char *temp,
329  int *temp_len, size_t len, size_t actual_alloc);
330 
350 LWS_VISIBLE LWS_EXTERN int
352  char *temp, int *temp_len, const void *in,
353  size_t in_len);
354 
355 
370 LWS_VISIBLE LWS_EXTERN int
371 lws_jws_b64_compact_map(const char *in, int len, struct lws_jws_map *map);
372 
373 
384 LWS_VISIBLE LWS_EXTERN int
385 lws_jws_base64_enc(const char *in, size_t in_len, char *out, size_t out_max);
386 
401 LWS_VISIBLE LWS_EXTERN int
402 lws_jws_encode_section(const char *in, size_t in_len, int first, char **p,
403  char *end);
LWS_VISIBLE LWS_EXTERN int lws_jws_encode_section(const char *in, size_t in_len, int first, char **p, char *end)
LWS_VISIBLE LWS_EXTERN int lws_jws_sign_from_b64(struct lws_jose *jose, struct lws_jws *jws, char *b64_sig, size_t sig_len)
LWS_VISIBLE LWS_EXTERN int lws_jws_randomize_element(struct lws_context *context, struct lws_jws_map *map, int idx, char *temp, int *temp_len, size_t random_len, size_t actual_alloc)
LWS_VISIBLE LWS_EXTERN int lws_jws_sig_confirm_compact_b64(const char *in, size_t len, struct lws_jws_map *map, struct lws_jwk *jwk, struct lws_context *context, char *temp, int *temp_len)
LWS_VISIBLE LWS_EXTERN int lws_jws_write_compact(struct lws_jws *jws, char *compact, size_t len)
LWS_VISIBLE LWS_EXTERN void lws_jws_destroy(struct lws_jws *jws)
LWS_VISIBLE LWS_EXTERN int lws_jws_sig_confirm(struct lws_jws_map *map_b64, struct lws_jws_map *map, struct lws_jwk *jwk, struct lws_context *context)
LWS_VISIBLE LWS_EXTERN int lws_jws_encode_b64_element(struct lws_jws_map *map, int idx, char *temp, int *temp_len, const void *in, size_t in_len)
LWS_VISIBLE LWS_EXTERN int lws_jws_sig_confirm_compact(struct lws_jws_map *map, struct lws_jwk *jwk, struct lws_context *context, char *temp, int *temp_len)
LWS_VISIBLE LWS_EXTERN int lws_jws_alloc_element(struct lws_jws_map *map, int idx, char *temp, int *temp_len, size_t len, size_t actual_alloc)
LWS_VISIBLE LWS_EXTERN int lws_jws_dup_element(struct lws_jws_map *map, int idx, char *temp, int *temp_len, const void *in, size_t in_len, size_t actual_alloc)
LWS_VISIBLE LWS_EXTERN int lws_jws_write_flattened_json(struct lws_jws *jws, char *flattened, size_t len)
LWS_VISIBLE LWS_EXTERN int lws_jws_base64_enc(const char *in, size_t in_len, char *out, size_t out_max)
LWS_VISIBLE LWS_EXTERN int lws_jws_b64_compact_map(const char *in, int len, struct lws_jws_map *map)
LWS_VISIBLE LWS_EXTERN int lws_jws_compact_decode(const char *in, int len, struct lws_jws_map *map, struct lws_jws_map *map_b64, char *out, int *out_len)
LWS_VISIBLE LWS_EXTERN void lws_jws_init(struct lws_jws *jws, struct lws_jwk *jwk, struct lws_context *context)
Definition: lws-jose.h:115
Definition: lws-jwk.h:49
Definition: lws-jws.h:60
Definition: lws-jws.h:67