1*35c0a8c4SKyle Evans /*-
2*35c0a8c4SKyle Evans * Copyright (c) 2024 Kyle Evans <kevans@FreeBSD.org>
3*35c0a8c4SKyle Evans *
4*35c0a8c4SKyle Evans * SPDX-License-Identifier: BSD-2-Clause
5*35c0a8c4SKyle Evans */
6*35c0a8c4SKyle Evans
7*35c0a8c4SKyle Evans #include <stdio.h>
8*35c0a8c4SKyle Evans
9*35c0a8c4SKyle Evans #include "libder_private.h"
10*35c0a8c4SKyle Evans
11*35c0a8c4SKyle Evans #undef libder_set_error
12*35c0a8c4SKyle Evans
13*35c0a8c4SKyle Evans static const char libder_error_nodesc[] = "[Description not available]";
14*35c0a8c4SKyle Evans
15*35c0a8c4SKyle Evans #define DESCRIBE(err, msg) { LDE_ ## err, msg }
16*35c0a8c4SKyle Evans static const struct libder_error_desc {
17*35c0a8c4SKyle Evans enum libder_error desc_error;
18*35c0a8c4SKyle Evans const char *desc_str;
19*35c0a8c4SKyle Evans } libder_error_descr[] = {
20*35c0a8c4SKyle Evans DESCRIBE(NONE, "No error"),
21*35c0a8c4SKyle Evans DESCRIBE(NOMEM, "Out of memory"),
22*35c0a8c4SKyle Evans DESCRIBE(INVAL, "Invalid parameter"),
23*35c0a8c4SKyle Evans DESCRIBE(SHORTHDR, "Header too short"),
24*35c0a8c4SKyle Evans DESCRIBE(BADVARLEN, "Bad variable length encoding"),
25*35c0a8c4SKyle Evans DESCRIBE(LONGLEN, "Encoded length too large (8 byte max)"),
26*35c0a8c4SKyle Evans DESCRIBE(SHORTDATA, "Payload not available (too short)"),
27*35c0a8c4SKyle Evans DESCRIBE(GARBAGE, "Garbage after encoded data"),
28*35c0a8c4SKyle Evans DESCRIBE(STREAMERR, "Stream error"),
29*35c0a8c4SKyle Evans DESCRIBE(TRUNCVARLEN, "Variable length object truncated"),
30*35c0a8c4SKyle Evans DESCRIBE(COALESCE_BADCHILD, "Bad child encountered when coalescing"),
31*35c0a8c4SKyle Evans DESCRIBE(BADOBJECT, "Payload not valid for object type"),
32*35c0a8c4SKyle Evans DESCRIBE(STRICT_EOC, "Strict: end-of-content violation"),
33*35c0a8c4SKyle Evans DESCRIBE(STRICT_TAG, "Strict: tag violation"),
34*35c0a8c4SKyle Evans DESCRIBE(STRICT_PVARLEN, "Strict: primitive using indefinite length"),
35*35c0a8c4SKyle Evans DESCRIBE(STRICT_BOOLEAN, "Strict: boolean encoded incorrectly"),
36*35c0a8c4SKyle Evans DESCRIBE(STRICT_NULL, "Strict: null encoded incorrectly"),
37*35c0a8c4SKyle Evans DESCRIBE(STRICT_PRIMITIVE, "Strict: type must be primitive"),
38*35c0a8c4SKyle Evans DESCRIBE(STRICT_CONSTRUCTED, "Strict: type must be constructed"),
39*35c0a8c4SKyle Evans DESCRIBE(STRICT_BITSTRING, "Strict: malformed constructed bitstring"),
40*35c0a8c4SKyle Evans };
41*35c0a8c4SKyle Evans
42*35c0a8c4SKyle Evans const char *
libder_get_error(struct libder_ctx * ctx)43*35c0a8c4SKyle Evans libder_get_error(struct libder_ctx *ctx)
44*35c0a8c4SKyle Evans {
45*35c0a8c4SKyle Evans const struct libder_error_desc *desc;
46*35c0a8c4SKyle Evans
47*35c0a8c4SKyle Evans for (size_t i = 0; i < nitems(libder_error_descr); i++) {
48*35c0a8c4SKyle Evans desc = &libder_error_descr[i];
49*35c0a8c4SKyle Evans
50*35c0a8c4SKyle Evans if (desc->desc_error == ctx->error)
51*35c0a8c4SKyle Evans return (desc->desc_str);
52*35c0a8c4SKyle Evans }
53*35c0a8c4SKyle Evans
54*35c0a8c4SKyle Evans return (libder_error_nodesc);
55*35c0a8c4SKyle Evans }
56*35c0a8c4SKyle Evans
57*35c0a8c4SKyle Evans bool
libder_has_error(struct libder_ctx * ctx)58*35c0a8c4SKyle Evans libder_has_error(struct libder_ctx *ctx)
59*35c0a8c4SKyle Evans {
60*35c0a8c4SKyle Evans
61*35c0a8c4SKyle Evans return (ctx->error != 0);
62*35c0a8c4SKyle Evans }
63*35c0a8c4SKyle Evans
64*35c0a8c4SKyle Evans LIBDER_PRIVATE void
libder_set_error(struct libder_ctx * ctx,int error,const char * file,int line)65*35c0a8c4SKyle Evans libder_set_error(struct libder_ctx *ctx, int error, const char *file, int line)
66*35c0a8c4SKyle Evans {
67*35c0a8c4SKyle Evans ctx->error = error;
68*35c0a8c4SKyle Evans
69*35c0a8c4SKyle Evans if (ctx->verbose >= 2) {
70*35c0a8c4SKyle Evans fprintf(stderr, "%s: [%s:%d]: %s (error %d)\n",
71*35c0a8c4SKyle Evans __func__, file, line, libder_get_error(ctx), error);
72*35c0a8c4SKyle Evans } else if (ctx->verbose >= 1) {
73*35c0a8c4SKyle Evans fprintf(stderr, "%s: %s (error %d)\n", __func__,
74*35c0a8c4SKyle Evans libder_get_error(ctx), error);
75*35c0a8c4SKyle Evans }
76*35c0a8c4SKyle Evans }
77