From 17488fdee0f2c296dd9b3c8116336f459c56f8da Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Tue, 5 May 2026 00:01:00 +0200 Subject: [PATCH] fix: run stdin --- src/ssl/run_stdin.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/ssl/run_stdin.c b/src/ssl/run_stdin.c index d2ba904..08703f2 100644 --- a/src/ssl/run_stdin.c +++ b/src/ssl/run_stdin.c @@ -1,15 +1,70 @@ +#include +#include #include #include +#include #include "compiler.h" #include "ft_ssl.h" #include "ft_ssl_flags.h" #include "internal/ssl/ssl.h" +/* Forward declarations */ +static int run_stdin_p(const struct ssl_config *config); +static ssize_t read_and_hash(const struct ssl_config *config, union digest_ctx + *ctx, char *label, size_t cap); +/* ------------------- */ + int run_stdin(const struct ssl_config *config) { + if (HAS_FLAG(config->flags, FLAG_P) && !HAS_FLAG(config->flags, FLAG_Q)) + return run_stdin_p(config); return digest_stream(config, STDIN_FILENO, "stdin", 0, HAS_FLAG(config->flags, FLAG_P)); } + +static ssize_t +read_and_hash(const struct ssl_config *config, union digest_ctx *ctx, + char *label, size_t cap) +{ + uint8_t buf[READ_BUFSIZE]; + size_t len; + ssize_t n; + size_t take; + + config->algo->init(ctx); + len = 0; + while (0 < (n = read(STDIN_FILENO, buf, READ_BUFSIZE))) + { + config->algo->update(ctx, buf, (size_t)n); + take = (size_t)n < cap - len ? (size_t)n : cap - len; + memcpy(label + len, buf, take); + len += take; + } + return (n < 0 ? -1 : (ssize_t)len); +} + +static int +run_stdin_p(const struct ssl_config *config) +{ + union digest_ctx ctx; + uint8_t digest[MAX_DIGEST_SIZE]; + char label[4097]; + char hex[MAX_DIGEST_SIZE * 2 + 1]; + ssize_t len; + size_t i; + + len = read_and_hash(config, &ctx, label, sizeof(label) - 1); + if (len < 0) + return CLI_ERROR; + if (len && '\n' == label[len - 1]) + --len; + label[len] = '\0'; + config->algo->final(&ctx, digest); + for (i = 0; i < config->algo->digest_size; i++) + snprintf(hex + i * 2, 3, "%02x", (unsigned int)digest[i]); + printf("(\"%s\")= %s\n", label, hex); + return CLI_SUCCESS; +}