fix: run stdin
This commit is contained in:
parent
4d4fa262b8
commit
17488fdee0
1 changed files with 55 additions and 0 deletions
|
|
@ -1,15 +1,70 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <cli.h>
|
||||
#include <libft_ssl.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue