Lines Matching defs:cps
78 * protected headers: bstr containing a map (captured as CBOR in cps->ph[])
190 apply_external(struct lws_cose_validate_context *cps)
195 alg = lws_container_of(cps->algs.head, lws_cose_sig_alg_t, list);
202 if (cps->info.ext_len) {
207 cps->info.ext_len);
212 ex.cps = cps;
218 n = cps->info.ext_cb(&ex);
236 create_alg(struct lecp_ctx *ctx, struct lws_cose_validate_context *cps)
238 lws_cose_validate_param_stack_t *sl = &cps->st[cps->sp], *sl0 = &cps->st[0];
248 ck = lws_cose_key_from_set(cps->info.keyset, sl->kid.buf, sl->kid.len);
255 // lwsl_notice("%s: cps->alg %d\n", __func__, (int)cps->alg);
257 alg = lws_cose_val_alg_create(cps->info.cx, ck, cps->st[0].alg,
273 lws_dll2_add_tail(&res->list, &cps->results);
279 lws_dll2_add_tail(&alg->list, &cps->algs);
286 if (lws_cose_val_alg_hash(alg, sig_mctx[cps->info.sigtype],
287 sig_mctx_len[cps->info.sigtype]))
325 if (cps->info.sigtype == SIGTYPE_MULTI) {
354 if (!cps->info.ext_len) { /* ie, if no app data */
365 if (cps->info.sigtype == SIGTYPE_SINGLE)
368 if (!cps->payload_stash) {
373 apply_external(cps);
375 if (lws_cose_val_alg_hash(alg, cps->payload_stash, cps->payload_pos))
377 lwsl_notice("a %d\n", (int)cps->sig_agg_pos);
379 lws_cose_val_alg_destroy(cps, &alg, (const uint8_t *)cps->sig_agg,
380 cps->sig_agg_pos);
426 ph_index(struct lws_cose_validate_context *cps)
428 switch (cps->tli) {
446 struct lws_cose_validate_context *cps =
457 reason_names[reason & 0x1f], cose_sections[cps->tli],
458 cps->sub, ctx->pst[ctx->pst_sp].ppos, cps->sp);
467 lwsl_notice("%s: tag sigtype %d\n", __func__, cps->info.sigtype);
469 switch (cps->info.sigtype) {
477 cps->info.sigtype = SIGTYPE_MULTI;
480 cps->info.sigtype = SIGTYPE_SINGLE;
483 // cps->info.sigtype = SIGTYPE_COUNTERSIGNED;
486 cps->info.sigtype = SIGTYPE_MAC0;
489 cps->info.sigtype = SIGTYPE_MAC;
521 cps->depth++;
526 if (cps->sub)
531 switch (cps->tli) {
534 hi = ph_index(cps);
535 sl = &cps->st[cps->sp];
548 switch (cps->tli) {
563 if (cps->info.sigtype != SIGTYPE_SINGLE)
566 if (create_alg(ctx, cps))
572 cps->tli = ST_INNER_PROTECTED;
579 if (cps->sub)
583 sl = &cps->st[cps->sp];
584 switch (cps->tli) {
591 hi = ph_index(cps);
593 if (!sl->ph_pos[hi] || cps->sub)
596 cps->sub = 1;
599 if (lecp_parse_subtree(&cps->ctx,
603 cps->sub = 0;
607 switch (cps->info.sigtype) {
609 cps->tli = ST_OUTER_SIGN_SIGARRAY - 1;
613 cps->tli = ST_OUTER_MACTAG - 1;
624 cps->sp++;
625 cps->tli = ST_INNER_PROTECTED - 1;
637 cps->tli--; /* so no change */
640 if (!cps->sub)
641 cps->tli++;
649 switch (cps->tli) {
653 hi = ph_index(cps);
654 sl = &cps->st[cps->sp];
658 if (!sl->ph_pos[hi] || cps->sub) {
659 if (!cps->sub)
660 cps->tli++;
664 cps->sub = 1;
695 if (lecp_parse_subtree(&cps->ctx, p, s) !=
699 cps->sub = 0;
701 if (!cps->sub)
702 cps->tli++;
706 if (cps->info.sigtype == SIGTYPE_MAC) {
707 // lwsl_err("Y: alg %d\n", (int)cps->alg);
708 if (create_alg(ctx, cps))
711 cps->tli++;
722 switch (cps->tli) {
729 cps->map_key = ctx->item.u.i64;
730 // lwsl_notice("%s: key %d\n", __func__, (int)cps->map_key);
734 // lwsl_notice("%s: key %d val %d\n", __func__, (int)cps->map_key, (int)ctx->item.u.i64);
736 if (cps->map_key == LWSCOSE_WKL_ALG) {
737 sl = &cps->st[cps->sp];
738 cps->map_key = 0;
739 if (cps->tli == ST_INNER_PROTECTED ||
740 cps->tli == ST_INNER_UNPROTECTED ||
741 cps->tli == ST_INNER_SIGNATURE) {
743 if (!cps->st[0].alg)
744 cps->st[0].alg = sl->alg;
754 switch (cps->tli) {
764 if (cps->tli == ST_OUTER_SIGN1_SIGNATURE ||
765 cps->tli == ST_INNER_SIGNATURE) {
766 if (ctx->item.u.u64 > sizeof(cps->sig_agg))
768 cps->sig_agg_pos = 0;
772 if (cps->tli != ST_OUTER_PAYLOAD)
775 if (apply_external(cps)) {
783 if (cps->info.sigtype == SIGTYPE_SINGLE) {
784 alg = lws_container_of(cps->algs.head,
797 cps->payload_stash_size = (size_t)(ctx->item.u.u64 + s);
798 cps->payload_stash = lws_malloc(cps->payload_stash_size,
800 if (!cps->payload_stash) {
805 memcpy(cps->payload_stash, t, s);
806 cps->payload_pos = s;
811 switch (cps->tli) {
814 if (cps->info.pay_cb && ctx->npos)
815 cps->info.pay_cb(cps, cps->info.pay_opaque,
818 if (cps->payload_stash) {
819 if (cps->payload_pos + ctx->npos >
820 cps->payload_stash_size)
822 memcpy(cps->payload_stash + cps->payload_pos,
824 cps->payload_pos += ctx->npos;
827 alg = lws_container_of(cps->algs.head,
843 memcpy(cps->sig_agg + cps->sig_agg_pos, ctx->buf,
845 cps->sig_agg_pos = cps->sig_agg_pos + ctx->npos;
851 switch (cps->tli) {
854 if (cps->info.sigtype == SIGTYPE_MULTI) {
855 memcpy(cps->sig_agg + cps->sig_agg_pos, ctx->buf,
857 cps->sig_agg_pos = cps->sig_agg_pos + ctx->npos;
858 // lwsl_err("Y: alg %d\n", (int)cps->alg);
859 if (create_alg(ctx, cps))
863 if (cps->info.sigtype != SIGTYPE_MAC)
870 if (cps->map_key == LWSCOSE_WKL_KID) {
871 sl = &cps->st[cps->sp];
880 cps->map_key = 0;
885 if (cps->info.pay_cb && ctx->npos)
886 cps->info.pay_cb(cps, cps->info.pay_opaque,
888 if (cps->payload_stash) {
889 if (cps->payload_pos + ctx->npos >
890 cps->payload_stash_size)
892 memcpy(cps->payload_stash + cps->payload_pos,
894 cps->payload_pos += ctx->npos;
897 alg = lws_container_of(cps->algs.head,
910 if (cps->info.sigtype == SIGTYPE_MULTI)
913 memcpy(cps->sig_agg + cps->sig_agg_pos, ctx->buf,
915 cps->sig_agg_pos += ctx->npos;
917 alg = lws_container_of(cps->algs.head,
921 lws_cose_val_alg_destroy(cps, &alg,
922 cps->sig_agg,
923 cps->sig_agg_pos);
927 if (cps->mac_pos + ctx->npos > sizeof(cps->mac))
929 memcpy(cps->mac + cps->mac_pos, ctx->buf, ctx->npos);
930 cps->mac_pos += ctx->npos;
932 if (cps->info.sigtype == SIGTYPE_MAC0) {
933 if (create_alg(ctx, cps))
943 switch (cps->tli) {
948 sl = &cps->st[cps->sp];
949 hi = ph_index(cps);
971 struct lws_cose_validate_context *cps;
978 cps = lws_zalloc(sizeof(*cps), __func__);
979 if (!cps)
982 cps->info = *info;
983 cps->tli = ST_OUTER_PROTECTED;
985 lecp_construct(&cps->ctx, cb_cose_sig, cps, NULL, 0);
987 return cps;
991 lws_cose_validate_chunk(struct lws_cose_validate_context *cps,
996 n = lecp_parse(&cps->ctx, in, in_len);
998 *used_in = cps->ctx.used_in;
1003 lecp_destruct(&cps->ctx);
1009 lws_cose_validate_results(struct lws_cose_validate_context *cps)
1011 return &cps->results;
1017 struct lws_cose_validate_context *cps = *_cps;
1019 if (!cps)
1023 lws_dll2_get_head(&cps->algs)) {
1028 lws_cose_val_alg_destroy(cps, &alg, NULL, 0);
1032 lws_dll2_get_head(&cps->results)) {
1040 lws_free_set_NULL(cps->payload_stash);
1042 lwsac_free(&cps->ac);
1044 while (cps->sp >= 0) {
1045 if (cps->st[cps->sp].kid.buf)
1046 lws_free(cps->st[cps->sp].kid.buf);
1047 cps->sp--;