util: add hexdump function
This commit is contained in:
parent
f3667cfe05
commit
f0b5d01017
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -110,4 +111,5 @@ const struct lc_aead_impl *lc_aead_impl_chacha20_poly1305(void);
|
|||||||
* Utilities.
|
* Utilities.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
int lc_hexdump_fp(FILE *, const void *, size_t);
|
||||||
void lc_scrub(void *, size_t);
|
void lc_scrub(void *, size_t);
|
||||||
|
96
util.c
96
util.c
@ -14,11 +14,107 @@
|
|||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "lilcrypto.h"
|
#include "lilcrypto.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define HEXDUMP_BUFSZ 128
|
||||||
|
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
hexdump_line(char *buf, const uint8_t *blob, size_t len, size_t off, int pad)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Format is
|
||||||
|
* - 16-char hex offset (at most)
|
||||||
|
* - 2 spaces
|
||||||
|
* - 2-char hex byte and a space (16 times)
|
||||||
|
* - 2 spaces
|
||||||
|
* - 2 pipe chars + 16 renders of the blobs
|
||||||
|
*
|
||||||
|
* That accounts for, at most, 16 + 2 + 16 * 3 + 2 + 18. Adding an
|
||||||
|
* extra byte for the NUL ending byte, that amounts for 87.
|
||||||
|
*
|
||||||
|
* Callers MUST provide a buffer at least HEXDUMP_BUFSZ long in buf0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char *bufp;
|
||||||
|
size_t i, buflen;
|
||||||
|
int w;
|
||||||
|
|
||||||
|
bufp = buf;
|
||||||
|
buflen = HEXDUMP_BUFSZ;
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
(void)snprintf(bufp, buflen, "%0*zx\n", pad, off);
|
||||||
|
else {
|
||||||
|
w = snprintf(bufp, buflen, "%0*zx ", pad, off);
|
||||||
|
bufp += w;
|
||||||
|
buflen -= w;
|
||||||
|
for (i = 0; i < len && i < 8; i++) {
|
||||||
|
w = snprintf(bufp, buflen, "%02x ", blob[i]);
|
||||||
|
bufp += w;
|
||||||
|
buflen -= w;
|
||||||
|
}
|
||||||
|
if (i < 8) {
|
||||||
|
memset(bufp, ' ', 3 * (16 - i));
|
||||||
|
bufp += 3 * (16 - i);
|
||||||
|
buflen -= 3 * (16 - i);
|
||||||
|
}
|
||||||
|
for (; i < len && i < 16; i++) {
|
||||||
|
w = snprintf(bufp, buflen, " %02x", blob[i]);
|
||||||
|
bufp += w;
|
||||||
|
buflen -= w;
|
||||||
|
}
|
||||||
|
if (i < 16) {
|
||||||
|
memset(bufp, ' ', 3 * (16 - i));
|
||||||
|
bufp += 3 * (16 - i);
|
||||||
|
buflen -= 3 * (16 - i);
|
||||||
|
}
|
||||||
|
w = snprintf(bufp, buflen, " |");
|
||||||
|
bufp += w;
|
||||||
|
buflen -= w;
|
||||||
|
for (i = 0; i < len && i < 16; i++) {
|
||||||
|
w = snprintf(bufp, buflen, "%c",
|
||||||
|
isprint(blob[i]) ? blob[i] : '.');
|
||||||
|
bufp += w;
|
||||||
|
buflen -= w;
|
||||||
|
}
|
||||||
|
(void)snprintf(bufp, buflen, "|\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return len < 16 ? len : 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
lc_hexdump_fp(FILE *fp, const void *blob, size_t len)
|
||||||
|
{
|
||||||
|
const uint8_t *p = blob;
|
||||||
|
char buf[HEXDUMP_BUFSZ];
|
||||||
|
size_t l, off;
|
||||||
|
int pad;
|
||||||
|
|
||||||
|
for (pad = 1; len > (1 << (8 * pad)); pad++)
|
||||||
|
continue;
|
||||||
|
pad *= 2;
|
||||||
|
|
||||||
|
off = 0;
|
||||||
|
while (len > 0) {
|
||||||
|
l = hexdump_line(buf, p, len, off, pad);
|
||||||
|
if (fputs(buf, fp) == EOF)
|
||||||
|
return 0;
|
||||||
|
off += l;
|
||||||
|
len -= l;
|
||||||
|
}
|
||||||
|
(void)hexdump_line(buf, p, len, off, pad);
|
||||||
|
if (fputs(buf, fp) == EOF)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lc_scrub(void *b, size_t len)
|
lc_scrub(void *b, size_t len)
|
||||||
{
|
{
|
||||||
|
@ -60,58 +60,6 @@ hexparse(const char *s, uint8_t *out, size_t *outlen)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
hexdump(FILE *fp, const uint8_t *blob, size_t len)
|
|
||||||
{
|
|
||||||
size_t i, off;
|
|
||||||
int pad;
|
|
||||||
|
|
||||||
for (i = 0; len > (1 << (8 * i)); i++)
|
|
||||||
;
|
|
||||||
pad = (i + 1) * 2;
|
|
||||||
|
|
||||||
off = 0;
|
|
||||||
while (len >= 16) {
|
|
||||||
fprintf(fp, "%0*zx\t", pad, off);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
fprintf(fp, "%02x ", blob[i]);
|
|
||||||
for (; i < 16; i++)
|
|
||||||
fprintf(fp, " %02x", blob[i]);
|
|
||||||
|
|
||||||
fprintf(fp, "\t|");
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
fprintf(fp, "%c", isprint(blob[i]) ? blob[i] : '.');
|
|
||||||
fprintf(fp, "|\n");
|
|
||||||
|
|
||||||
blob += 16;
|
|
||||||
off += 16;
|
|
||||||
len -= 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
fprintf(fp, "%0*zx\t", pad, off);
|
|
||||||
for (i = 0; i < len && i < 8; i++)
|
|
||||||
fprintf(fp, "%02x ", blob[i]);
|
|
||||||
for (; i < 8; i++)
|
|
||||||
fprintf(fp, " ");
|
|
||||||
for (; i < len && i < 16; i++)
|
|
||||||
fprintf(fp, " %02x", blob[i]);
|
|
||||||
for (; i < 16; i++)
|
|
||||||
fprintf(fp, " ");
|
|
||||||
|
|
||||||
fprintf(fp, "\t|");
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
fprintf(fp, "%c", isprint(blob[i]) ? blob[i] : '.');
|
|
||||||
fprintf(fp, "|\n");
|
|
||||||
|
|
||||||
out:
|
|
||||||
fprintf(fp, "%0*zx\n", pad, off + len);
|
|
||||||
fflush(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct kwimpl {
|
struct kwimpl {
|
||||||
const char *kw;
|
const char *kw;
|
||||||
const struct lc_aead_impl *(*impl)(void);
|
const struct lc_aead_impl *(*impl)(void);
|
||||||
@ -305,11 +253,11 @@ main(int argc, char *argv[])
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
fprintf(stderr, "ct (%zu, %zu)\n", ctlen,
|
fprintf(stderr, "ct (%zu, %zu)\n", ctlen,
|
||||||
encoutlen - LC_POLY1305_TAGLEN);
|
encoutlen - LC_POLY1305_TAGLEN);
|
||||||
hexdump(stderr, msg, msglen);
|
lc_hexdump_fp(stderr, msg, msglen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
hexdump(stderr, ct, ctlen);
|
lc_hexdump_fp(stderr, ct, ctlen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
hexdump(stderr, encout,
|
lc_hexdump_fp(stderr, encout,
|
||||||
encoutlen - LC_POLY1305_TAGLEN);
|
encoutlen - LC_POLY1305_TAGLEN);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
@ -321,9 +269,9 @@ main(int argc, char *argv[])
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
fprintf(stderr, "tag (%zu, %zu)\n", taglenarg,
|
fprintf(stderr, "tag (%zu, %zu)\n", taglenarg,
|
||||||
(size_t)LC_POLY1305_TAGLEN);
|
(size_t)LC_POLY1305_TAGLEN);
|
||||||
hexdump(stderr, tag, taglen);
|
lc_hexdump_fp(stderr, tag, taglen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
hexdump(stderr, encout + ctlen, LC_POLY1305_TAGLEN);
|
lc_hexdump_fp(stderr, encout + ctlen, LC_POLY1305_TAGLEN);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
puts("invalid");
|
puts("invalid");
|
||||||
@ -355,11 +303,11 @@ main(int argc, char *argv[])
|
|||||||
if (msglen != decoutlen || lc_ct_cmp(decout, msg, msglen) != 0) {
|
if (msglen != decoutlen || lc_ct_cmp(decout, msg, msglen) != 0) {
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
fprintf(stderr, "ct (%zu, %zu)\n", msglen, decoutlen);
|
fprintf(stderr, "ct (%zu, %zu)\n", msglen, decoutlen);
|
||||||
hexdump(stderr, msg, msglen);
|
lc_hexdump_fp(stderr, msg, msglen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
hexdump(stderr, ct, ctlen);
|
lc_hexdump_fp(stderr, ct, ctlen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
hexdump(stderr, decout, decoutlen);
|
lc_hexdump_fp(stderr, decout, decoutlen);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
puts("invalid");
|
puts("invalid");
|
||||||
|
Loading…
Reference in New Issue
Block a user