1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 23d4afb5ceSopenharmony_ci */ 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci#define VERBOSE 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_ci#define MAX_BLOBBED_PARAMS 96 /* largest bstr-encoded params */ 28d4afb5ceSopenharmony_ci 29d4afb5ceSopenharmony_cienum { 30d4afb5ceSopenharmony_ci ST_UNKNOWN, 31d4afb5ceSopenharmony_ci 32d4afb5ceSopenharmony_ci ST_OUTER_PROTECTED, 33d4afb5ceSopenharmony_ci ST_OUTER_UNPROTECTED, 34d4afb5ceSopenharmony_ci ST_OUTER_PAYLOAD, 35d4afb5ceSopenharmony_ci ST_OUTER_SIGN1_SIGNATURE, 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_ci ST_OUTER_SIGN_SIGARRAY, 38d4afb5ceSopenharmony_ci 39d4afb5ceSopenharmony_ci ST_OUTER_MACTAG, 40d4afb5ceSopenharmony_ci 41d4afb5ceSopenharmony_ci ST_INNER_PROTECTED, 42d4afb5ceSopenharmony_ci ST_INNER_UNPROTECTED, 43d4afb5ceSopenharmony_ci ST_INNER_SIGNATURE, 44d4afb5ceSopenharmony_ci 45d4afb5ceSopenharmony_ci ST_INNER_EXCESS, 46d4afb5ceSopenharmony_ci}; 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_citypedef struct lws_cose_sig_alg { 49d4afb5ceSopenharmony_ci lws_dll2_t list; 50d4afb5ceSopenharmony_ci uint8_t rhash[512]; 51d4afb5ceSopenharmony_ci const lws_cose_key_t *cose_key; 52d4afb5ceSopenharmony_ci struct lws_genhash_ctx hash_ctx; 53d4afb5ceSopenharmony_ci union { 54d4afb5ceSopenharmony_ci struct lws_genec_ctx ecdsactx; 55d4afb5ceSopenharmony_ci struct lws_genrsa_ctx rsactx; 56d4afb5ceSopenharmony_ci struct lws_genhmac_ctx hmacctx; 57d4afb5ceSopenharmony_ci } u; 58d4afb5ceSopenharmony_ci cose_param_t cose_alg; 59d4afb5ceSopenharmony_ci int keybits; 60d4afb5ceSopenharmony_ci int rhash_len; 61d4afb5ceSopenharmony_ci 62d4afb5ceSopenharmony_ci char failed; 63d4afb5ceSopenharmony_ci char completed; 64d4afb5ceSopenharmony_ci} lws_cose_sig_alg_t; 65d4afb5ceSopenharmony_ci 66d4afb5ceSopenharmony_citypedef struct lws_cose_validate_param_stack { 67d4afb5ceSopenharmony_ci uint8_t ph[4][MAX_BLOBBED_PARAMS]; 68d4afb5ceSopenharmony_ci int ph_pos[4]; 69d4afb5ceSopenharmony_ci struct lws_gencrypto_keyelem kid; 70d4afb5ceSopenharmony_ci cose_param_t alg; 71d4afb5ceSopenharmony_ci} lws_cose_validate_param_stack_t; 72d4afb5ceSopenharmony_ci 73d4afb5ceSopenharmony_cistruct lws_cose_validate_context { 74d4afb5ceSopenharmony_ci lws_cose_validate_create_info_t info; 75d4afb5ceSopenharmony_ci uint8_t mac[LWS_GENHASH_LARGEST]; 76d4afb5ceSopenharmony_ci uint8_t sig_agg[512]; 77d4afb5ceSopenharmony_ci lws_cose_validate_param_stack_t st[3]; 78d4afb5ceSopenharmony_ci lws_dll2_owner_t algs; 79d4afb5ceSopenharmony_ci lws_dll2_owner_t results; 80d4afb5ceSopenharmony_ci uint8_t *payload_stash; 81d4afb5ceSopenharmony_ci struct lwsac *ac; 82d4afb5ceSopenharmony_ci struct lecp_ctx ctx; 83d4afb5ceSopenharmony_ci void *user; 84d4afb5ceSopenharmony_ci 85d4afb5ceSopenharmony_ci size_t payload_pos; 86d4afb5ceSopenharmony_ci size_t payload_stash_size; 87d4afb5ceSopenharmony_ci 88d4afb5ceSopenharmony_ci int seen; 89d4afb5ceSopenharmony_ci int depth; 90d4afb5ceSopenharmony_ci 91d4afb5ceSopenharmony_ci int outer; 92d4afb5ceSopenharmony_ci size_t mac_pos; 93d4afb5ceSopenharmony_ci size_t sig_agg_pos; 94d4afb5ceSopenharmony_ci 95d4afb5ceSopenharmony_ci cose_param_t map_key; /* parsing temp before val */ 96d4afb5ceSopenharmony_ci 97d4afb5ceSopenharmony_ci int tli; /* toplevel item */ 98d4afb5ceSopenharmony_ci int sp; 99d4afb5ceSopenharmony_ci 100d4afb5ceSopenharmony_ci uint8_t sub; 101d4afb5ceSopenharmony_ci}; 102d4afb5ceSopenharmony_ci 103d4afb5ceSopenharmony_cistruct lws_cose_sign_context { 104d4afb5ceSopenharmony_ci lws_cose_sign_create_info_t info; 105d4afb5ceSopenharmony_ci 106d4afb5ceSopenharmony_ci lws_dll2_owner_t algs; 107d4afb5ceSopenharmony_ci lws_cose_sig_alg_t *alg; 108d4afb5ceSopenharmony_ci 109d4afb5ceSopenharmony_ci size_t rem_pay; 110d4afb5ceSopenharmony_ci enum lws_cose_sig_types type; /* computed */ 111d4afb5ceSopenharmony_ci int flags; 112d4afb5ceSopenharmony_ci 113d4afb5ceSopenharmony_ci size_t along; 114d4afb5ceSopenharmony_ci 115d4afb5ceSopenharmony_ci int tli; 116d4afb5ceSopenharmony_ci 117d4afb5ceSopenharmony_ci char subsequent; 118d4afb5ceSopenharmony_ci}; 119d4afb5ceSopenharmony_ci 120d4afb5ceSopenharmony_ciextern const uint8_t *sig_mctx[]; 121d4afb5ceSopenharmony_ciextern uint8_t sig_mctx_len[]; 122d4afb5ceSopenharmony_ciextern const char *cose_sections[]; 123d4afb5ceSopenharmony_ci 124d4afb5ceSopenharmony_cilws_cose_sig_alg_t * 125d4afb5ceSopenharmony_cilws_cose_val_alg_create(struct lws_context *cx, lws_cose_key_t *ck, 126d4afb5ceSopenharmony_ci cose_param_t cose_alg, int op); 127d4afb5ceSopenharmony_ci 128d4afb5ceSopenharmony_ciint 129d4afb5ceSopenharmony_cilws_cose_val_alg_hash(lws_cose_sig_alg_t *alg, const uint8_t *in, size_t in_len); 130d4afb5ceSopenharmony_ci 131d4afb5ceSopenharmony_civoid 132d4afb5ceSopenharmony_cilws_cose_val_alg_destroy(struct lws_cose_validate_context *cps, 133d4afb5ceSopenharmony_ci lws_cose_sig_alg_t **_alg, const uint8_t *against, 134d4afb5ceSopenharmony_ci size_t against_len); 135d4afb5ceSopenharmony_ci 136d4afb5ceSopenharmony_cilws_cose_sig_alg_t * 137d4afb5ceSopenharmony_cilws_cose_sign_alg_create(struct lws_context *cx, const lws_cose_key_t *ck, 138d4afb5ceSopenharmony_ci cose_param_t cose_alg, int op); 139d4afb5ceSopenharmony_ci 140d4afb5ceSopenharmony_ciint 141d4afb5ceSopenharmony_cilws_cose_sign_alg_hash(lws_cose_sig_alg_t *alg, const uint8_t *in, size_t in_len); 142d4afb5ceSopenharmony_ci 143d4afb5ceSopenharmony_civoid 144d4afb5ceSopenharmony_cilws_cose_sign_alg_complete(lws_cose_sig_alg_t *alg); 145d4afb5ceSopenharmony_ci 146d4afb5ceSopenharmony_civoid 147d4afb5ceSopenharmony_cilws_cose_sign_alg_destroy(lws_cose_sig_alg_t **_alg); 148d4afb5ceSopenharmony_ci 149