#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; }