inst_cm.bend
bend-osdev-crypto@0.1.0.0 · 88 lines · 10 definitions
1
2
3
4
5
6
7
8
9
10
11import Base
12import bend-osdev-bytes@0.1.0.0/bytes.bend as B
13import bend-osdev-word64@0.1.0.0/word64.bend as W
14import bend-osdev-cipher-modes@0.1.0.0/cipher_modes.bend as M
15import bend-osdev-crypto@0.1.0.0/crypto.bend as Cr
16
17
18
19def CrCm.err(e: M.CmError) -> Cr.CrError:
20 match e:
21 case M.CmBadKeyLength{n}:
22 Cr.CrBadKeyLength{n}
23 case M.CmBadIvLength{n}:
24 Cr.CrBadIvLength{n}
25 case M.CmBadTweakLength{n}:
26 Cr.CrBadIvLength{n}
27 case M.CmBadNonceLength{n}:
28 Cr.CrBadNonceLength{n}
29 case M.CmBadTagLength{n}:
30 Cr.CrBadTagLength{n}
31 case M.CmBadBlockSize{n}:
32 Cr.CrBadBlockSize{n}
33 case M.CmNotBlockMultiple{n}:
34 Cr.CrNotBlockMultiple{n}
35 case M.CmTooShort{n}:
36 Cr.CrTooShort{n}
37 case M.CmTooLong{n}:
38 Cr.CrTooLong{n}
39 case M.CmBadPadding{}:
40 Cr.CrBadPadding{}
41 case M.CmTagMismatch{}:
42 Cr.CrTagMismatch{}
43
44
45def CrCm.lift(~A: Data, r: Result<&2, &2, M.CmError, A>) -> Result<&2, &2, Cr.CrError, A>:
46 Cr.CrError.lift(~M.CmError, ~A, ~CrCm.err, r)
47
48
49def CrCm.key(~K: Data, ~key: B.Octets -> Result<&2, &2, M.CmError, K>, o: B.Octets) -> Result<&2, &2, Cr.CrError, K>:
50 CrCm.lift(~K, key(o))
51
52
53
54def cr.f128.bits8(b: U32) -> Word(8n):
55 match b:
56 case U32{w}:
57 W.W64.bits.lo(8n, 24n, w)
58
59
60def cr.f128.word(a: U32, b: U32, c: U32, d: U32) -> U32:
61 U32{W.W64.bits.cat(8n, 24n, cr.f128.bits8(d), W.W64.bits.cat(8n, 16n, cr.f128.bits8(c), W.W64.bits.cat(8n, 8n, cr.f128.bits8(b), cr.f128.bits8(a))))}
62
63
64def cr.f128.bytes(b: M.CmBlock) -> List<&2, U32>:
65 match b:
66 case M.CmBlock{w0, w1, w2, w3}:
67 B.append(B.be32(w0), B.append(B.be32(w1), B.append(B.be32(w2), B.be32(w3))))
68
69
70def cr.f128.block(xs: List<&2, U32>) -> Maybe<&2, M.CmBlock>:
71 match xs:
72 case Con{a0, Con{a1, Con{a2, Con{a3, Con{a4, Con{a5, Con{a6, Con{a7, Con{a8, Con{a9, Con{a10, Con{a11, Con{a12, Con{a13, Con{a14, Con{a15, Nil{}}}}}}}}}}}}}}}}}:
73 Some{M.CmBlock{cr.f128.word(a0, a1, a2, a3), cr.f128.word(a4, a5, a6, a7), cr.f128.word(a8, a9, a10, a11), cr.f128.word(a12, a13, a14, a15)}}
74 case _:
75 None{}
76
77
78def CrBlk128.to_octets(b: M.CmBlock) -> B.Octets:
79 B.Octets.of_list(cr.f128.bytes(b))
80
81
82def CrBlk128.of_octets(o: B.Octets) -> Maybe<&2, M.CmBlock>:
83 cr.f128.block(B.Octets.to_list(o))
84
85def CrBlk128.xor(a: M.CmBlock, b: M.CmBlock) -> M.CmBlock:
86 match a b:
87 case M.CmBlock{a0, a1, a2, a3} M.CmBlock{b0, b1, b2, b3}:
88 M.CmBlock{U32.xor(a0, b0), U32.xor(a1, b1), U32.xor(a2, b2), U32.xor(a3, b3)}