1 import Base 2 import mylsm-lsm-store@0.3.2.0/src/hub_sha/sha256.bend as ProvenSha 3 import bend-codec-lib@0.2.0.0/utf8.bend as Utf8Lib 4 import bend-codec-lib@0.2.0.0/bytes.bend as ByteLib 5 6 # SHA-256 hex of UTF-8 text. ProvenSha/Utf8 cores are trusted upstream 7 # (FIPS 180-4 machine-checked; closed roundtrips proved); this module owns 8 # only the byte-list plumbing between them, covered by the differential 9 # check vs Python hashlib at the 55/56/64-byte padding boundaries. 10 # Unwraps the byte box into the word list the hash core consumes. 11 def bytes_data(byte_box: ByteLib.Bytes) -> List<&2, U32>: 12 match byte_box: 13 case ByteLib.Bytes{raw_data}: 14 raw_data 15 16 # Hashes valid encodings; unencodable input yields a fixed sentinel string. 17 def digest_from_encode_result(encode_result: Result<&2, &2, Utf8Lib.Utf8.Error, ByteLib.Bytes>) -> String: 18 match encode_result: 19 case Fail{encode_error}: 20 "INVALID_UTF8_INPUT" 21 case Done{byte_box}: 22 ProvenSha.hex(ProvenSha.sha256(bytes_data(byte_box))) 23 24 # "INVALID_UTF8_INPUT" on unencodable text; never fails on valid input. 25 def compute_sha256_hex(input_text: String) -> String: 26 digest_from_encode_result(Utf8Lib.Utf8.encode(input_text))