70 lines
1.7 KiB
C
70 lines
1.7 KiB
C
#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;
|
|
}
|