aes_modes.bend
bend-osdev-cipher-modes@0.1.0.0 · 73 lines · 9 definitions
1
2
3
4
5
6
7import Base
8import bend-osdev-bytes@0.1.0.0/bytes.bend as B
9import bend-osdev-cipher-modes@0.1.0.0/cipher_modes.bend as M
10import bend-osdev-cipher-modes@0.1.0.0/aes.bend as X
11import bend-osdev-cipher-modes@0.1.0.0/cbc.bend as C
12import bend-osdev-cipher-modes@0.1.0.0/xts.bend as T
13import bend-osdev-cipher-modes@0.1.0.0/ccm.bend as CC
14import bend-osdev-cipher-modes@0.1.0.0/cmac.bend as CM
15
16def CmAes.cbc_encrypt(key: B.Octets, iv: B.Octets, m: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
17 do Result<&2, &2, M.CmError, B.Octets>:
18 k : X.CmAesKey <- X.CmAes.key(key)
19 C.Cbc.encrypt(~X.CmAesKey, ~X.CmAes.encrypt, k, iv, m)
20
21def CmAes.cbc_decrypt(key: B.Octets, iv: B.Octets, c: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
22 do Result<&2, &2, M.CmError, B.Octets>:
23 k : X.CmAesKey <- X.CmAes.key(key)
24 C.Cbc.decrypt(~X.CmAesKey, ~X.CmAes.decrypt, X.CmAes.prepare(k), iv, c)
25
26def CmAes.cbc_encrypt_padded(key: B.Octets, iv: B.Octets, m: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
27 do Result<&2, &2, M.CmError, B.Octets>:
28 k : X.CmAesKey <- X.CmAes.key(key)
29 C.Cbc.encrypt_padded(~X.CmAesKey, ~X.CmAes.encrypt, k, iv, m)
30
31def CmAes.cbc_decrypt_padded(key: B.Octets, iv: B.Octets, c: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
32 do Result<&2, &2, M.CmError, B.Octets>:
33 k : X.CmAesKey <- X.CmAes.key(key)
34 C.Cbc.decrypt_padded(~X.CmAesKey, ~X.CmAes.decrypt, X.CmAes.prepare(k), iv, c)
35
36
37
38
39
40def CmAes.xts_encrypt(+key: B.Octets, i: B.Octets, p: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
41 +n = B.Octets.len(key)
42 +h = Nat.div(n, 2n)
43 do Result<&2, &2, M.CmError, B.Octets>:
44 M.cm.check(Bool.or(Nat.is_eq(n, 32n), Nat.is_eq(n, 64n)), M.CmBadKeyLength{n})
45 k1 : X.CmAesKey <- X.CmAes.key(B.Octets.take(h, key))
46 k2 : X.CmAesKey <- X.CmAes.key(B.Octets.drop(h, key))
47 T.Xts.encrypt(~X.CmAesKey, ~X.CmAes.encrypt, k1, k2, i, p)
48
49def CmAes.xts_decrypt(+key: B.Octets, i: B.Octets, c: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
50 +n = B.Octets.len(key)
51 +h = Nat.div(n, 2n)
52 do Result<&2, &2, M.CmError, B.Octets>:
53 M.cm.check(Bool.or(Nat.is_eq(n, 32n), Nat.is_eq(n, 64n)), M.CmBadKeyLength{n})
54 k1 : X.CmAesKey <- X.CmAes.key(B.Octets.take(h, key))
55 k2 : X.CmAesKey <- X.CmAes.key(B.Octets.drop(h, key))
56 T.Xts.decrypt(~X.CmAesKey, ~X.CmAes.encrypt, ~X.CmAes.decrypt, X.CmAes.prepare(k1), k2, i, c)
57
58
59def CmAes.ccm_encrypt(key: B.Octets, +m: Nat, nonce: B.Octets, aad: B.Octets, p: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
60 do Result<&2, &2, M.CmError, B.Octets>:
61 k : X.CmAesKey <- X.CmAes.key(key)
62 CC.Ccm.encrypt(~X.CmAesKey, ~X.CmAes.encrypt, k, m, nonce, aad, p)
63
64def CmAes.ccm_decrypt(key: B.Octets, +m: Nat, nonce: B.Octets, aad: B.Octets, c: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
65 do Result<&2, &2, M.CmError, B.Octets>:
66 k : X.CmAesKey <- X.CmAes.key(key)
67 CC.Ccm.decrypt(~X.CmAesKey, ~X.CmAes.encrypt, k, m, nonce, aad, c)
68
69
70def CmAes.cmac(key: B.Octets, m: B.Octets) -> Result<&2, &2, M.CmError, B.Octets>:
71 do Result<&2, &2, M.CmError, B.Octets>:
72 k : X.CmAesKey <- X.CmAes.key(key)
73 return CM.Cmac.mac(~X.CmAesKey, ~X.CmAes.encrypt, k, m)