seqiv.bend
bend-osdev-aead@0.1.0.0 · 79 lines · 10 definitions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import Base
26import bend-osdev-bytes@0.1.0.0/bytes.bend as B
27import bend-osdev-crypto@0.1.0.0/crypto.bend as Cr
28import bend-osdev-crypto@0.1.0.0/octets.bend as O
29
30
31type AdSeqivKey<-KA: Data> is Data:
32 AdSeqivKey{ka: KA, salt: B.Octets}
33
34def ad.sq.ka(~KA: Data, k: AdSeqivKey<KA>) -> KA:
35 match k:
36 case AdSeqivKey{ka, salt}:
37 ka
38
39
40
41def AdSeqiv.iv(~KA: Data, k: AdSeqivKey<KA>, +seq: B.Octets) -> B.Octets:
42 match k:
43 case AdSeqivKey{ka, +salt}:
44 O.CrOct.xor(salt, B.Octets.append(B.Octets.zeros(Nat.sub(B.Octets.len(salt), B.Octets.len(seq))), seq))
45
46def ad.sq.key(~KA: Data, ~akey: B.Octets -> Result<&2, &2, Cr.CrError, KA>, +ivlen: Nat, +o: B.Octets) -> Result<&2, &2, Cr.CrError, AdSeqivKey<KA>>:
47 +n = B.Octets.len(o)
48 +m = Nat.sub(n, ivlen)
49 do Result<&2, &2, Cr.CrError, AdSeqivKey<KA>>:
50 Cr.CrError.check(Nat.is_le(ivlen, n), Cr.CrBadKeyLength{n})
51 ka : KA <- akey(B.Octets.take(m, o))
52 return AdSeqivKey{ka, B.Octets.drop(m, o)}
53
54
55def AdSeqiv.key(~KA: Data, ~akey: B.Octets -> Result<&2, &2, Cr.CrError, KA>, ~ivlen: Nat, o: B.Octets) -> Result<&2, &2, Cr.CrError, AdSeqivKey<KA>>:
56 ad.sq.key(~KA, ~akey, ivlen, o)
57
58def ad.sq.seal(~KA: Data, ~seal: KA -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdSeqivKey<KA>, +seq: B.Octets, aad: B.Octets, p: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
59 +iv = AdSeqiv.iv(~KA, k, seq)
60 Result.map(&2, &2, Cr.CrError, B.Octets, B.Octets, c => B.Octets.append(iv, c), seal(ad.sq.ka(~KA, k), iv, B.Octets.append(aad, iv), p))
61
62
63def AdSeqiv.seal(~KA: Data, ~seal: KA -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, k: AdSeqivKey<KA>, seq: B.Octets, aad: B.Octets, p: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
64 ad.sq.seal(~KA, ~seal, k, seq, aad, p)
65
66def ad.sq.open.go(~KA: Data, ~open: KA -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdSeqivKey<KA>, aad: B.Octets, +n: Nat, s: Maybe<&2, B.OctetsSplit>) -> Result<&2, &2, Cr.CrError, B.Octets>:
67 match s:
68 case None{}:
69 Fail{Cr.CrTooShort{n}}
70 case Some{B.OctetsSplit{+iv, c}}:
71 open(ad.sq.ka(~KA, k), iv, B.Octets.append(aad, iv), c)
72
73
74
75def ad.sq.open(~KA: Data, ~open: KA -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, ~ivlen: Nat, +k: AdSeqivKey<KA>, seq: B.Octets, aad: B.Octets, +c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
76 ad.sq.open.go(~KA, ~open, k, aad, B.Octets.len(c), B.Octets.split_at(ivlen, c))
77
78def AdSeqiv.open(~KA: Data, ~open: KA -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, ~ivlen: Nat, k: AdSeqivKey<KA>, seq: B.Octets, aad: B.Octets, c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
79 ad.sq.open(~KA, ~open, ~ivlen, k, seq, aad, c)