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# Encryption over the pieces (at least two; the last 1 to b bytes) from the
48# chaining value v; acc holds the ciphertext so far, last first
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)

Uses (14)

Used by (1)