open-standards/wai/oer-conformance/settle/sha256.c
Transaction Science afc7ece2e5
Some checks failed
no-vanity-metrics / Scan committed Markdown for vanity metrics (push) Successful in 4s
standards workspaces build + test / eoc-rs (push) Successful in 1m49s
standards workspaces build + test / jouleclaw-rs (push) Successful in 2m0s
standards workspaces build + test / aac-rs (push) Successful in 37s
standards workspaces build + test / jcp-rs (push) Successful in 1m17s
standards workspaces build + test / joule-code-rs (push) Successful in 39s
standards workspaces build + test / arl-rs (push) Successful in 3m28s
standards workspaces build + test / joulecontract-rs (push) Successful in 37s
standards workspaces build + test / proof-rs (push) Successful in 1m14s
standards workspaces build + test / map-rs (push) Successful in 34s
standards workspaces build + test / mesh-rs (push) Successful in 26s
standards workspaces build + test / sandbox-rs (push) Successful in 2m5s
standards workspaces build + test / openpay (push) Successful in 1m45s
standards workspaces build + test / joule-ui-rs (push) Successful in 3m26s
WAI conformance / cargo-class corpora · linux-arm64 (push) Successful in 46s
WAI conformance / cross-arch byte-equality · linux-arm64 (push) Successful in 17s
standards workspaces build + test / smart-byte-rs (push) Successful in 2m32s
standards workspaces build + test / jouledesk-rs (push) Successful in 2m51s
WAI conformance / cargo-class corpora · linux (push) Successful in 56s
WAI conformance / cross-arch byte-equality · linux (push) Successful in 15s
WAI conformance / C2PA manifest emission · signed, read back, validated (push) Successful in 40s
standards workspaces build + test / joulehook-rs (push) Successful in 2m42s
standards workspaces build + test / sense-rs (push) Successful in 2m41s
standards workspaces build + test / macOS energy backend (jcp-energy) (push) Failing after 2m56s
WAI conformance / cargo-class corpora · macos (push) Successful in 57s
WAI conformance / cross-arch byte-equality · macos (push) Successful in 16s
WAI conformance / cargo-class corpora · windows (push) Has been cancelled
WAI conformance / cross-arch byte-equality · windows (push) Has been cancelled
wai: ingest OER/2 receipts — extension, conformance corpus, wai-rs verifier, C kernel in CI
Adds extensions/oer-receipts.md, oer-conformance/ (upstream 9 + C-kernel 1 + 13
hand-declared edge vectors, canonical fixture), crate::oer behind --features oer
with wai_oer_vectors, and CI steps running it on the matrix and rebuilding the C
kernel byte-for-byte. Fixes five reference-verifier defects the edge vectors found.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-27 03:58:55 -04:00

23 lines
2.7 KiB
C

/* SPDX-License-Identifier: Apache-2.0 */
/* SHA-256, FIPS 180-4, compact and portable. */
#include "sha256.h"
#include <string.h>
static const uint32_t K[64] = {
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2};
#define ROR(x,n) (((x)>>(n))|((x)<<(32-(n))))
static void block(sha256_t *c, const uint8_t *p){
uint32_t w[64], a,b,cc,d,e,f,g,h,t1,t2; int i;
for (i=0;i<16;i++) w[i]=(uint32_t)p[4*i]<<24|(uint32_t)p[4*i+1]<<16|(uint32_t)p[4*i+2]<<8|p[4*i+3];
for (i=16;i<64;i++){ uint32_t s0=ROR(w[i-15],7)^ROR(w[i-15],18)^(w[i-15]>>3), s1=ROR(w[i-2],17)^ROR(w[i-2],19)^(w[i-2]>>10); w[i]=w[i-16]+s0+w[i-7]+s1; }
a=c->h[0];b=c->h[1];cc=c->h[2];d=c->h[3];e=c->h[4];f=c->h[5];g=c->h[6];h=c->h[7];
for (i=0;i<64;i++){ t1=h+(ROR(e,6)^ROR(e,11)^ROR(e,25))+((e&f)^(~e&g))+K[i]+w[i]; t2=(ROR(a,2)^ROR(a,13)^ROR(a,22))+((a&b)^(a&cc)^(b&cc)); h=g;g=f;f=e;e=d+t1;d=cc;cc=b;b=a;a=t1+t2; }
c->h[0]+=a;c->h[1]+=b;c->h[2]+=cc;c->h[3]+=d;c->h[4]+=e;c->h[5]+=f;c->h[6]+=g;c->h[7]+=h;
}
void sha256_init(sha256_t *c){ static const uint32_t iv[8]={0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19}; memcpy(c->h,iv,32); c->len=0; c->n=0; }
void sha256_update(sha256_t *c, const void *data, size_t len){ const uint8_t *p=data; c->len+=len; while(len){ size_t k=64-c->n; if(k>len)k=len; memcpy(c->buf+c->n,p,k); c->n+=k; p+=k; len-=k; if(c->n==64){ block(c,c->buf); c->n=0; } } }
void sha256_final(sha256_t *c, uint8_t out[32]){ uint64_t bits=c->len*8; uint8_t pad=0x80; sha256_update(c,&pad,1); uint8_t z=0; while(c->n!=56) sha256_update(c,&z,1); uint8_t L[8]; int i; for(i=0;i<8;i++) L[i]=(uint8_t)(bits>>(56-8*i)); sha256_update(c,L,8); for(i=0;i<8;i++){ out[4*i]=c->h[i]>>24; out[4*i+1]=c->h[i]>>16; out[4*i+2]=c->h[i]>>8; out[4*i+3]=c->h[i]; } }
void sha256(const void *data, size_t len, uint8_t out[32]){ sha256_t c; sha256_init(&c); sha256_update(&c,data,len); sha256_final(&c,out); }
void hex32(const uint8_t in[32], char out[65]){ static const char *hx="0123456789abcdef"; int i; for(i=0;i<32;i++){ out[2*i]=hx[in[i]>>4]; out[2*i+1]=hx[in[i]&15]; } out[64]=0; }