essiv.bend
bend-osdev-aead@0.1.0.0 · 83 lines · 15 definitions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import Base
18import bend-osdev-bytes@0.1.0.0/bytes.bend as B
19import bend-osdev-crypto@0.1.0.0/crypto.bend as Cr
20
21
22type AdEssivKey<-KD: Data, -KS: Data> is Data:
23 AdEssivKey{kd: KD, ks: KS}
24
25def ad.es.e(~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_to: Blk -> B.Octets, +ks: KS, x: Maybe<&2, Blk>, +iv: B.Octets) -> B.Octets:
26 match x:
27 case None{}:
28 iv
29 case Some{b}:
30 blk_to(enc(ks, b))
31
32def ad.es.iv(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, k: AdEssivKey<KD, KS>, +iv: B.Octets) -> B.Octets:
33 match k:
34 case AdEssivKey{kd, +ks}:
35 ad.es.e(~KS, ~Blk, ~enc, ~blk_to, ks, blk_of(iv), iv)
36
37
38def AdEssiv.iv(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, k: AdEssivKey<KD, KS>, +iv: B.Octets) -> B.Octets:
39 ad.es.iv(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, k, iv)
40
41def ad.es.kd(~KD: Data, ~KS: Data, k: AdEssivKey<KD, KS>) -> KD:
42 match k:
43 case AdEssivKey{kd, ks}:
44 kd
45
46def ad.es.key(~KD: Data, ~KS: Data, ~dkey: B.Octets -> Result<&2, &2, Cr.CrError, KD>, ~skey: B.Octets -> Result<&2, &2, Cr.CrError, KS>, ~digest: B.Octets -> B.Octets, +o: B.Octets) -> Result<&2, &2, Cr.CrError, AdEssivKey<KD, KS>>:
47 do Result<&2, &2, Cr.CrError, AdEssivKey<KD, KS>>:
48 kd : KD <- dkey(o)
49 ks : KS <- skey(digest(o))
50 return AdEssivKey{kd, ks}
51
52
53
54def AdEssiv.key(~KD: Data, ~KS: Data, ~dkey: B.Octets -> Result<&2, &2, Cr.CrError, KD>, ~skey: B.Octets -> Result<&2, &2, Cr.CrError, KS>, ~digest: B.Octets -> B.Octets, o: B.Octets) -> Result<&2, &2, Cr.CrError, AdEssivKey<KD, KS>>:
55 ad.es.key(~KD, ~KS, ~dkey, ~skey, ~digest, o)
56
57
58
59def ad.es.encrypt(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~cenc: KD -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdEssivKey<KD, KS>, +iv: B.Octets, m: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
60 cenc(ad.es.kd(~KD, ~KS, k), AdEssiv.iv(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, k, iv), m)
61
62def AdEssiv.encrypt(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~cenc: KD -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, k: AdEssivKey<KD, KS>, iv: B.Octets, m: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
63 ad.es.encrypt(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, ~cenc, k, iv, m)
64
65def ad.es.decrypt(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~cdec: KD -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdEssivKey<KD, KS>, +iv: B.Octets, c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
66 cdec(ad.es.kd(~KD, ~KS, k), AdEssiv.iv(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, k, iv), c)
67
68def AdEssiv.decrypt(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~cdec: KD -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, k: AdEssivKey<KD, KS>, iv: B.Octets, c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
69 ad.es.decrypt(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, ~cdec, k, iv, c)
70
71
72
73def ad.es.seal(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~seal: KD -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdEssivKey<KD, KS>, +iv: B.Octets, aad: B.Octets, p: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
74 seal(ad.es.kd(~KD, ~KS, k), AdEssiv.iv(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, k, iv), aad, p)
75
76def AdEssiv.seal(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~seal: KD -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, k: AdEssivKey<KD, KS>, iv: B.Octets, aad: B.Octets, p: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
77 ad.es.seal(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, ~seal, k, iv, aad, p)
78
79def ad.es.open(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~open: KD -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, +k: AdEssivKey<KD, KS>, +iv: B.Octets, aad: B.Octets, c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
80 open(ad.es.kd(~KD, ~KS, k), AdEssiv.iv(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, k, iv), aad, c)
81
82def AdEssiv.open(~KD: Data, ~KS: Data, ~Blk: Data, ~enc: KS -> Blk -> Blk, ~blk_of: B.Octets -> Maybe<&2, Blk>, ~blk_to: Blk -> B.Octets, ~open: KD -> B.Octets -> B.Octets -> B.Octets -> Result<&2, &2, Cr.CrError, B.Octets>, k: AdEssivKey<KD, KS>, iv: B.Octets, aad: B.Octets, c: B.Octets) -> Result<&2, &2, Cr.CrError, B.Octets>:
83 ad.es.open(~KD, ~KS, ~Blk, ~enc, ~blk_of, ~blk_to, ~open, k, iv, aad, c)