summaryrefslogtreecommitdiffstats
path: root/chksum.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-08-29 06:58:27 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-08-29 06:58:27 -0700
commitb5c9b7ffd95b2934e503e8524ac0f571ed2b9f91 (patch)
treeebbaaf5b94e21eb7fed1bd07363d264209ad7f9e /chksum.c
parent0689ed6d0d0d74f9ca62057290db3bda8622afba (diff)
downloadtxr-b5c9b7ffd95b2934e503e8524ac0f571ed2b9f91.tar.gz
txr-b5c9b7ffd95b2934e503e8524ac0f571ed2b9f91.tar.bz2
txr-b5c9b7ffd95b2934e503e8524ac0f571ed2b9f91.zip
sha256/md5: allow characters and byte values.
* chksum.c (sha256_utf8_byte_callback, md5_utf8_byte_callback): New static functions. (sha256_hash, md5_hash): Support character and integer objects. * txr.1: Documented.
Diffstat (limited to 'chksum.c')
-rw-r--r--chksum.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/chksum.c b/chksum.c
index 8934583b..4af08d47 100644
--- a/chksum.c
+++ b/chksum.c
@@ -183,6 +183,14 @@ val sha256_begin(void)
return cobj(coerce(mem_t *, ps256), sha256_ctx_s, &sha256_ops);
}
+static int sha256_utf8_byte_callback(int b, mem_t *ctx)
+{
+ SHA256_t *ps256 = coerce(SHA256_t *, ctx);
+ unsigned char uc = b;
+ SHA256_update(ps256, &uc, 1);
+ return 1;
+}
+
val sha256_hash(val ctx, val obj)
{
val self = lit("sha256-hash");
@@ -201,6 +209,19 @@ val sha256_hash(val ctx, val obj)
case BUF:
sha256_szmax_upd(ps256, obj->b.data, c_unum(obj->b.len));
break;
+ case CHR:
+ utf8_encode(c_chr(obj), sha256_utf8_byte_callback, coerce(mem_t *, ps256));
+ break;
+ case NUM:
+ {
+ cnum n = c_num(obj);
+ unsigned char uc = n;
+ if (n < 0 || n > 255)
+ uw_throwf(error_s, lit("~a: byte value ~s out of range"),
+ self, obj, nao);
+ SHA256_update(ps256, &uc, 1);
+ }
+ break;
default:
uw_throwf(error_s, lit("~a: cannot hash ~s, only buffer and strings"),
self, obj, nao);
@@ -424,6 +445,14 @@ val md5_begin(void)
return cobj(coerce(mem_t *, pmd5), md5_ctx_s, &md5_ops);
}
+static int md5_utf8_byte_callback(int b, mem_t *ctx)
+{
+ MD5_t *ps256 = coerce(MD5_t *, ctx);
+ unsigned char uc = b;
+ MD5_update(ps256, &uc, 1);
+ return 1;
+}
+
val md5_hash(val ctx, val obj)
{
val self = lit("md5-hash");
@@ -442,6 +471,19 @@ val md5_hash(val ctx, val obj)
case BUF:
md5_szmax_upd(pmd5, obj->b.data, c_unum(obj->b.len));
break;
+ case CHR:
+ utf8_encode(c_chr(obj), md5_utf8_byte_callback, coerce(mem_t *, pmd5));
+ break;
+ case NUM:
+ {
+ cnum n = c_num(obj);
+ unsigned char uc = n;
+ if (n < 0 || n > 255)
+ uw_throwf(error_s, lit("~a: byte value ~s out of range"),
+ self, obj, nao);
+ MD5_update(pmd5, &uc, 1);
+ }
+ break;
default:
uw_throwf(error_s, lit("~a: cannot hash ~s, only buffer and strings"),
self, obj, nao);