mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-05-27 16:24:19 +00:00
integrate double ratchet into agent (#268)
* separate skipped messages from ratchet * return diff for skipped messages instead of the whole state (tests fail) * fix ratchet tests * JSON encoding/decoding for ratchet state * schema for ratchets * split MonadUnliftIO instance for ExceptT to a separate file * update StrEncoding instance for Str * ratchet store methods * updateRatchet store method * move E2E ratchet params to Ratchet module * x3dh key agreement for double ratchet * test/fix x3dh, use x3dh for ratchets initialization * store/get x3dh keys, save ratchet of fixed X448 type * double-ratchet encryption integration (tests fail) * fix double ratchet * fix padding and message length * remove unused code for "activations" * remove comment * add version checks for forward/backward compatibility * split loading ratchet and skipped message keys * remove unused encoding instances for Algorithm types * update ratchet initialization params
This commit is contained in:
committed by
GitHub
parent
4d68042884
commit
2a89394174
@@ -5,10 +5,18 @@ module Simplex.Messaging.Encoding.String
|
||||
( StrEncoding (..),
|
||||
Str (..),
|
||||
strP_,
|
||||
strToJSON,
|
||||
strToJEncoding,
|
||||
strParseJSON,
|
||||
base64urlP,
|
||||
)
|
||||
where
|
||||
|
||||
import Control.Applicative (optional)
|
||||
import Data.Aeson (FromJSON (..), ToJSON (..))
|
||||
import qualified Data.Aeson as J
|
||||
import qualified Data.Aeson.Encoding as JE
|
||||
import qualified Data.Aeson.Types as JT
|
||||
import Data.Attoparsec.ByteString.Char8 (Parser)
|
||||
import qualified Data.Attoparsec.ByteString.Char8 as A
|
||||
import qualified Data.ByteString.Base64.URL as U
|
||||
@@ -16,6 +24,7 @@ import Data.ByteString.Char8 (ByteString)
|
||||
import qualified Data.ByteString.Char8 as B
|
||||
import Data.Char (isAlphaNum)
|
||||
import qualified Data.List.NonEmpty as L
|
||||
import Data.Text.Encoding (decodeLatin1, encodeUtf8)
|
||||
import Data.Word (Word16)
|
||||
import Simplex.Messaging.Parsers (parseAll)
|
||||
import Simplex.Messaging.Util ((<$?>))
|
||||
@@ -34,6 +43,7 @@ class StrEncoding a where
|
||||
-- base64url encoding/decoding of ByteStrings - the parser only allows non-empty strings
|
||||
instance StrEncoding ByteString where
|
||||
strEncode = U.encode
|
||||
strDecode = U.decode
|
||||
strP = base64urlP
|
||||
|
||||
base64urlP :: Parser ByteString
|
||||
@@ -43,11 +53,19 @@ base64urlP = do
|
||||
either fail pure $ U.decode (str <> pad)
|
||||
|
||||
newtype Str = Str {unStr :: ByteString}
|
||||
deriving (Eq, Show)
|
||||
|
||||
instance StrEncoding Str where
|
||||
strEncode = unStr
|
||||
strP = Str <$> A.takeTill (== ' ') <* optional A.space
|
||||
|
||||
instance ToJSON Str where
|
||||
toJSON (Str s) = strToJSON s
|
||||
toEncoding (Str s) = strToJEncoding s
|
||||
|
||||
instance FromJSON Str where
|
||||
parseJSON = fmap Str . strParseJSON "Str"
|
||||
|
||||
instance StrEncoding a => StrEncoding (Maybe a) where
|
||||
strEncode = maybe "" strEncode
|
||||
strP = optional strP
|
||||
@@ -88,3 +106,12 @@ instance (StrEncoding a, StrEncoding b, StrEncoding c, StrEncoding d, StrEncodin
|
||||
|
||||
strP_ :: StrEncoding a => Parser a
|
||||
strP_ = strP <* A.space
|
||||
|
||||
strToJSON :: StrEncoding a => a -> J.Value
|
||||
strToJSON = J.String . decodeLatin1 . strEncode
|
||||
|
||||
strToJEncoding :: StrEncoding a => a -> J.Encoding
|
||||
strToJEncoding = JE.text . decodeLatin1 . strEncode
|
||||
|
||||
strParseJSON :: StrEncoding a => String -> J.Value -> JT.Parser a
|
||||
strParseJSON name = J.withText name $ either fail pure . parseAll strP . encodeUtf8
|
||||
|
||||
Reference in New Issue
Block a user