-
Notifications
You must be signed in to change notification settings - Fork 332
Expand file tree
/
Copy pathRatchetTree.hs
More file actions
78 lines (65 loc) 路 2.44 KB
/
Copy pathRatchetTree.hs
File metadata and controls
78 lines (65 loc) 路 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.
module Wire.API.MLS.RatchetTree where
import Data.Functor
import Imports
import Wire.API.MLS.Extension
import Wire.API.MLS.HPKEPublicKey
import Wire.API.MLS.LeafNode
import Wire.API.MLS.Serialisation
data RatchetTree = RatchetTree {nodes :: [Maybe RatchetTreeNode]}
deriving (Eq, Show)
instance IsExtension RatchetTree where
extensionType = 2
instance ParseMLS RatchetTree where
parseMLS = RatchetTree <$> parseMLSVector @VarInt (parseMLSOptional parseMLS)
data RatchetTreeNodeTag = RatchetTreeLeafNodeTag | RatchetTreeParentNodeTag
deriving (Eq, Ord, Show, Enum, Bounded)
instance ParseMLS RatchetTreeNodeTag where
parseMLS = parseMLSEnum @Word8 "NodeType"
data RatchetTreeNode
= RatchetTreeParentNode RatchetTreeParent
| RatchetTreeLeafNode LeafNode
deriving (Eq, Show)
instance ParseMLS RatchetTreeNode where
parseMLS =
parseMLS >>= \case
RatchetTreeParentNodeTag -> RatchetTreeParentNode <$> parseMLS
RatchetTreeLeafNodeTag -> RatchetTreeLeafNode <$> parseMLS
data RatchetTreeParent = RatchetTreeParent
{ encryptionKey :: HPKEPublicKey,
parentHash :: ByteString,
unmergedLeaves :: [Word32]
}
deriving (Eq, Show)
instance ParseMLS RatchetTreeParent where
parseMLS =
RatchetTreeParent
<$> parseMLS
<*> parseMLSBytes @VarInt
<*> parseMLSVector @VarInt parseMLS
ratchetTreeLeaves :: RatchetTree -> [(LeafIndex, LeafNode)]
ratchetTreeLeaves =
foldMap (traverse toNode) . zip [0 ..] . evens . (.nodes)
where
evens :: [a] -> [a]
evens [] = []
evens [x] = [x]
evens (x : _ : xs) = (x : evens xs)
toNode :: Maybe RatchetTreeNode -> [LeafNode]
toNode (Just (RatchetTreeLeafNode n)) = [n]
toNode _ = []