os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 18c117ea695565ebf8b6c49773df1fe1ab13432f
parent 5114c09428a6465eddc33aab98eb142fa544d877
Author: erai <erai@omiltem.net>
Date:   Mon,  3 Jun 2024 00:41:25 -0400

streaming sha256

Diffstat:
Msha256.c | 43+++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+), 0 deletions(-)

diff --git a/sha256.c b/sha256.c @@ -9,6 +9,8 @@ struct sha256_ctx { f: int; g: int; h: int; + len: int; + block: _sha256_block; } struct _sha256_block { @@ -47,6 +49,7 @@ sha256_init(r: *sha256_ctx) { r.f = (0x9b05 << 16) | 0x688c; r.g = (0x1f83 << 16) | 0xd9ab; r.h = (0x5be0 << 16) | 0xcd19; + r.len = 0; } ror32(x: int, n: int): int { @@ -438,3 +441,43 @@ sha256_hmac(mac: *byte, key: *byte, klen: int, data: *byte, dlen: int) { sha256_finish(&ctx, 1, digest, 32); sha256_digest(mac, &ctx); } + +sha256_update(ctx: *sha256_ctx, msg: *byte, len: int) { + var o: int; + var r: int; + + o = ctx.len & 63; + if o != 0 { + r = 64 - o; + if len < r { + memcpy(&(&ctx.block):*byte[o], msg, len); + ctx.len = ctx.len + len; + return; + } else { + memcpy(&(&ctx.block):*byte[o], msg, r); + sha256_rounds(ctx, (&ctx.block):*byte); + ctx.len = ctx.len + r; + len = len - r; + msg = &msg[r]; + } + } + + loop { + if len < 64 { + memcpy((&ctx.block):*byte, msg, len); + ctx.len = ctx.len + len; + return; + } + + sha256_rounds(ctx, msg); + + ctx.len = ctx.len + 64; + len = len - 64; + msg = &msg[64]; + } +} + +sha256_final(digest: *byte, ctx: *sha256_ctx) { + sha256_finish(ctx, ctx.len >> 6, (&ctx.block):*byte, ctx.len & 63); + sha256_digest(digest, ctx); +}