From 950c9a7a4b023ec694524f9c44f78e81ede54233 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Niels=20M=C3=B6ller?= Date: Mon, 13 Oct 2025 21:29:37 +0200 Subject: [PATCH] sexp-conv: Delete use of nettle_armor for input. --- ChangeLog | 7 ++++++ tools/input.c | 68 +++++++++++++++++++++++++++------------------------ tools/input.h | 12 +++++++-- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f690932..5e205d86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2025-10-13 Niels Möller + * tools/input.h (struct sexp_input): Replace use of struct + nette_armor, replaced with... + (struct input_coding): New simpler struct. + * tools/input.c (sexp_input_start_base64) + (sexp_input_start_base16): New functions, replacing... + (sexp_input_start_coding, sexp_input_end_coding): Deleted functions. + * tools/output.h (struct sexp_output): Replace use of struct nettle_armor, instead use just a put_char function pointer. * tools/output.c (sexp_put_base16_start, sexp_put_base16_end) diff --git a/tools/input.c b/tools/input.c index 90e41a29..39158328 100644 --- a/tools/input.c +++ b/tools/input.c @@ -72,29 +72,28 @@ sexp_get_char(struct sexp_input *input) if (input->coding) for (;;) { - size_t done; - sexp_get_raw_char(input); if (input->ctype == SEXP_EOF_CHAR) die("Unexpected end of file in coded data.\n"); if (input->c == input->terminator) { + if (!input->coding->final(&input->state)) + die("Invalid coded data.\n"); + input->coding = NULL; input->ctype = SEXP_END_CHAR; return; } - done = 1; - - /* Decodes in place. Should always work, when we decode one - * character at a time. */ - if (!input->coding->decode_update(&input->state, - &done, &input->c, - 1, (const char*) &input->c)) - die("Invalid coded data.\n"); - - if (done) - return; + switch (input->coding->decode (&input->state, &input->c, input->c)) + { + case 0: + break; + case 1: + return; + default: + die("Invalid coded data.\n"); + } } else sexp_get_raw_char(input); @@ -121,26 +120,35 @@ sexp_push_char(struct sexp_input *input, } static void -sexp_input_start_coding(struct sexp_input *input, - const struct nettle_armor *coding, +sexp_input_start_base64(struct sexp_input *input, uint8_t terminator) { + static const struct input_coding base64 = + { + (decode_single_func *) base64_decode_single, + (decode_final_func *) base64_decode_final, + }; assert(!input->coding); - input->coding = coding; - input->coding->decode_init(&input->state); + input->coding = &base64; + base64_decode_init (&input->state.base64); input->terminator = terminator; } static void -sexp_input_end_coding(struct sexp_input *input) +sexp_input_start_base16(struct sexp_input *input, + uint8_t terminator) { - assert(input->coding); - - if (!input->coding->decode_final(&input->state)) - die("Invalid coded data.\n"); + static const struct input_coding base16 = + { + (decode_single_func *) base16_decode_single, + (decode_final_func *) base16_decode_final, + }; + assert(!input->coding); - input->coding = NULL; + input->coding = &base16; + base16_decode_init (&input->state.hex); + input->terminator = terminator; } @@ -223,11 +231,11 @@ sexp_get_string(struct sexp_input *input, break; case '#': - sexp_input_start_coding(input, &nettle_base16, '#'); + sexp_input_start_base16 (input, '#'); goto decode; case '|': - sexp_input_start_coding(input, &nettle_base64, '|'); + sexp_input_start_base64 (input, '|'); decode: for (;;) @@ -241,7 +249,6 @@ sexp_get_string(struct sexp_input *input, case SEXP_EOF_CHAR: die("Unexpected end of file in coded string.\n"); case SEXP_END_CHAR: - sexp_input_end_coding(input); sexp_get_char(input); return; } @@ -313,11 +320,11 @@ sexp_get_string_length(struct sexp_input *input, enum sexp_mode mode, break; case '#': - sexp_input_start_coding(input, &nettle_base16, '#'); + sexp_input_start_base16(input, '#'); goto decode; case '|': - sexp_input_start_coding(input, &nettle_base64, '|'); + sexp_input_start_base64(input, '|'); decode: for (; length; length--) @@ -329,8 +336,6 @@ sexp_get_string_length(struct sexp_input *input, enum sexp_mode mode, if (input->ctype != SEXP_END_CHAR) die("Coded string too long.\n"); - sexp_input_end_coding(input); - break; default: @@ -377,7 +382,6 @@ sexp_get_token(struct sexp_input *input, enum sexp_mode mode, case SEXP_END_CHAR: input->token = SEXP_CODING_END; - sexp_input_end_coding(input); sexp_get_char(input); return; @@ -413,7 +417,7 @@ sexp_get_token(struct sexp_input *input, enum sexp_mode mode, if (mode == SEXP_CANONICAL) die("Unexpected transport data in canonical mode.\n"); - sexp_input_start_coding(input, &nettle_base64, '}'); + sexp_input_start_base64 (input, '}'); sexp_get_char(input); input->token = SEXP_TRANSPORT_START; diff --git a/tools/input.h b/tools/input.h index d6fcdc94..9cad38a6 100644 --- a/tools/input.h +++ b/tools/input.h @@ -37,7 +37,6 @@ #include "base16.h" #include "base64.h" #include "buffer.h" -#include "nettle-meta.h" #include @@ -48,6 +47,15 @@ enum sexp_char_type SEXP_EOF_CHAR, SEXP_END_CHAR, }; +typedef int decode_single_func(void *ctx, uint8_t *dst, char src); +typedef int decode_final_func(void *ctx); + +struct input_coding +{ + decode_single_func *decode; + decode_final_func *final; +}; + struct sexp_input { FILE *f; @@ -57,7 +65,7 @@ struct sexp_input enum sexp_char_type ctype; uint8_t c; - const struct nettle_armor *coding; + const struct input_coding *coding; union { struct base64_decode_ctx base64; -- 2.47.3