@@ -3,6 +3,7 @@ namespace Skrepka
4open System.Text
4open System.Text
5open System.Security.Cryptography
5open System.Security.Cryptography
6+open K4os.Compression.LZ4
7module Crypto =
8module Crypto =
@@ -198,7 +199,8 @@ module Crypto =
198 let key = deriveKey ephPub recipientX25519Pub rawSecret
199 let key = deriveKey ephPub recipientX25519Pub rawSecret
199 let nonce = getRandomBytes 24
200 let nonce = getRandomBytes 24
200 let ptBytes = Encoding.UTF8.GetBytes(plaintext)
201 let ptBytes = Encoding.UTF8.GetBytes(plaintext)
202+ let compressed = LZ4Pickler.Pickle(ptBytes)
201− let ciphertext = aeadEncrypt ptBytes nonce key
203+ let ciphertext = aeadEncrypt compressed nonce key
202 let signature = signDetached ciphertext senderPrivKey
204 let signature = signDetached ciphertext senderPrivKey
@@ -218,7 +220,7 @@ module Crypto =
218 if recipientPrivKey.Length <> 64 || blob.Length < minBlobLen then
220 if recipientPrivKey.Length <> 64 || blob.Length < minBlobLen then
221− let tryDecrypt offset =
223+ let tryDecrypt offset decompress =
222 if blob.Length < minBlobLen + offset then
224 if blob.Length < minBlobLen + offset then
@@ -237,14 +239,18 @@ module Crypto =
237 let recipientEd25519Pub = recipientPrivKey.[32..63]
239 let recipientEd25519Pub = recipientPrivKey.[32..63]
238 let recipientX25519Pub = ed25519PkToCurve25519 recipientEd25519Pub
240 let recipientX25519Pub = ed25519PkToCurve25519 recipientEd25519Pub
239 let key = deriveKey ephPub recipientX25519Pub rawSecret
241 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
241 Some(Encoding.UTF8.GetString(plaintext), toHex senderPub)
244 Some(Encoding.UTF8.GetString(plaintext), toHex senderPub)
242 with ex ->
245 with ex ->
243 log $"decrypt error: {ex.Message}"
246 log $"decrypt error: {ex.Message}"
246− // Try versioned format, fall back to unversioned for backwards compat
249+ let version = blob.[0]
247− if blob.[0] = Constants.blobVersion then
250+
251+ if version = 2uy then
253+ elif version = 1uy then
248− tryDecrypt 1 |> Option.orElseWith (fun () -> tryDecrypt 0)
254+ tryDecrypt 1 false |> Option.orElseWith (fun () -> tryDecrypt 0 false)
250− tryDecrypt 0
256+ tryDecrypt 0 false