@@ -3,6 +3,7 @@ namespace Skrepka
33open System
44open System.Text
55open System.Security.Cryptography
6+open K4os.Compression.LZ4
67
78module Crypto =
89
@@ -198,7 +199,8 @@ module Crypto =
198199 let key = deriveKey ephPub recipientX25519Pub rawSecret
199200 let nonce = getRandomBytes 24
200201 let ptBytes = Encoding.UTF8.GetBytes(plaintext)
201− let ciphertext = aeadEncrypt ptBytes nonce key
202+ let compressed = LZ4Pickler.Pickle(ptBytes)
203+ let ciphertext = aeadEncrypt compressed nonce key
202204 let signature = signDetached ciphertext senderPrivKey
203205
204206 Some(
@@ -218,7 +220,7 @@ module Crypto =
218220 if recipientPrivKey.Length <> 64 || blob.Length < minBlobLen then
219221 None
220222 else
221− let tryDecrypt offset =
223+ let tryDecrypt offset decompress =
222224 if blob.Length < minBlobLen + offset then
223225 None
224226 else
@@ -237,14 +239,18 @@ module Crypto =
237239 let recipientEd25519Pub = recipientPrivKey.[32..63]
238240 let recipientX25519Pub = ed25519PkToCurve25519 recipientEd25519Pub
239241 let key = deriveKey ephPub recipientX25519Pub rawSecret
240− let plaintext = aeadDecrypt ciphertext nonce key
242+ let decrypted = aeadDecrypt ciphertext nonce key
243+ let plaintext = if decompress then LZ4Pickler.Unpickle(decrypted) else decrypted
241244 Some(Encoding.UTF8.GetString(plaintext), toHex senderPub)
242245 with ex ->
243246 log $"decrypt error: {ex.Message}"
244247 None
245248
246− // Try versioned format, fall back to unversioned for backwards compat
247− if blob.[0] = Constants.blobVersion then
248− tryDecrypt 1 |> Option.orElseWith (fun () -> tryDecrypt 0)
249+ let version = blob.[0]
250+
251+ if version = 2uy then
252+ tryDecrypt 1 true
253+ elif version = 1uy then
254+ tryDecrypt 1 false |> Option.orElseWith (fun () -> tryDecrypt 0 false)
249255 else
250− tryDecrypt 0
256+ tryDecrypt 0 false