1
1
module Functora.Aes
2
2
( Crypto ,
3
3
encryptHmac ,
4
+ unsafeEncrypt ,
4
5
unHmacDecrypt ,
6
+ unsafeDecrypt ,
5
7
SomeAesKey ,
6
8
drvSomeAesKey ,
7
9
Word128 ,
@@ -39,20 +41,29 @@ encryptHmac ::
39
41
SomeAesKey ->
40
42
a ->
41
43
Crypto
42
- encryptHmac (SomeAesKey cipher hmacer) plain =
44
+ encryptHmac aes @ (SomeAesKey _ hmacer) plain =
43
45
Crypto
44
46
{ cryptoValue = value,
45
47
cryptoValueHmac = sha256Hmac (unOkm hmacer) value
46
48
}
47
49
where
48
- value =
49
- from @ [Word8 ] @ ByteString
50
- . Utils. listToOctets
51
- . Modes. cbc AES. encrypt 0 cipher
52
- . Utils. listFromOctets
53
- . from @ ByteString @ [Word8 ]
54
- . PKCS7. padBytesN bytesPerBlock
55
- $ from @ a @ ByteString plain
50
+ value = unsafeEncrypt @ a aes plain
51
+
52
+ unsafeEncrypt ::
53
+ forall a .
54
+ ( From a ByteString
55
+ ) =>
56
+ SomeAesKey ->
57
+ a ->
58
+ ByteString
59
+ unsafeEncrypt (SomeAesKey cipher _) =
60
+ from @ [Word8 ] @ ByteString
61
+ . Utils. listToOctets
62
+ . Modes. cbc AES. encrypt 0 cipher
63
+ . Utils. listFromOctets
64
+ . from @ ByteString @ [Word8 ]
65
+ . PKCS7. padBytesN bytesPerBlock
66
+ . from @ a @ ByteString
56
67
57
68
unHmacDecrypt ::
58
69
forall a .
@@ -61,17 +72,27 @@ unHmacDecrypt ::
61
72
SomeAesKey ->
62
73
Crypto ->
63
74
Maybe a
64
- unHmacDecrypt (SomeAesKey cipher hmacer) (Crypto value valueHmac) = do
75
+ unHmacDecrypt aes @ (SomeAesKey _ hmacer) (Crypto value valueHmac) = do
65
76
if sha256Hmac (unOkm hmacer) value == valueHmac
66
77
then Just ()
67
78
else Nothing
79
+ unsafeDecrypt aes value
80
+
81
+ unsafeDecrypt ::
82
+ forall a .
83
+ ( From ByteString a
84
+ ) =>
85
+ SomeAesKey ->
86
+ ByteString ->
87
+ Maybe a
88
+ unsafeDecrypt (SomeAesKey cipher _) =
68
89
fmap (from @ ByteString @ a )
69
90
. PKCS7. unpadBytesN bytesPerBlock
70
91
. from @ [Word8 ] @ ByteString
71
92
. Utils. listToOctets
72
93
. Modes. unCbc AES. decrypt 0 cipher
73
94
. Utils. listFromOctets
74
- $ from @ ByteString @ [Word8 ] value
95
+ . from @ ByteString @ [Word8 ]
75
96
76
97
bytesPerBlock :: Int
77
98
bytesPerBlock = 16
0 commit comments