def cr.cts.enc.go
bend-osdev-crypto@0.1.0.0 · cts.bend:47
import bend-osdev-crypto@0.1.0.0/cts.bend as Cts
import Base
import bend-osdev-bytes@0.1.0.0/bytes.bend as B
import bend-osdev-crypto@0.1.0.0/octets.bend as O
47
48
49def cr.cts.enc.go(~K: Data, ~Blk: Data, ~bsize: Nat, ~enc: K -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ps: List<&2, List<&2, U32>>, +k: K, +v: B.Octets, acc: List<&2, B.Octets>) -> B.Octets:
50 match ps:
51 case Con{p, t}:
52 match t:
53 case Con{q, u}:
54 match u:
55 case Nil{}:
56 +x = cr.cts.b(~K, ~Blk, ~enc, ~blk_of, ~blk_to, k, O.CrOct.xor(B.Octets.of_list(p), v))
57 +last = B.Octets.of_list(q)
58 +d = B.Octets.len(last)
59 +cn = cr.cts.b(~K, ~Blk, ~enc, ~blk_of, ~blk_to, k, O.CrOct.xor(B.Octets.append(last, B.Octets.zeros(Nat.sub(bsize, d))), x))
60 cr.cts.out(Con{B.Octets.take(d, x), Con{cn, acc}})
61 case Con{r, w}:
62 +c = cr.cts.b(~K, ~Blk, ~enc, ~blk_of, ~blk_to, k, O.CrOct.xor(B.Octets.of_list(p), v))
63 cr.cts.enc.go(~K, ~Blk, ~bsize, ~enc, ~blk_of, ~blk_to, Con{q, Con{r, w}}, k, c, Con{c, acc})
64 case Nil{}:
65 cr.cts.out(Con{cr.cts.b(~K, ~Blk, ~enc, ~blk_of, ~blk_to, k, O.CrOct.xor(B.Octets.of_list(p), v)), acc})
66 case Nil{}:
67 cr.cts.out(acc)