Skip to content

Commit

Permalink
Verify multi signature on last AckSn
Browse files Browse the repository at this point in the history
We only check the overall multi-signature as this will be the signature
we rely on when we close / fanout a Head.
  • Loading branch information
ch1bo committed Feb 24, 2023
1 parent 5b0f70a commit c7b9bd0
Showing 1 changed file with 30 additions and 19 deletions.
49 changes: 30 additions & 19 deletions hydra-node/src/Hydra/HeadLogic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,14 @@ import Hydra.Chain (
PostTxError,
)
import Hydra.ContestationPeriod
import Hydra.Crypto (HydraKey, Signature, SigningKey, aggregateInOrder, sign, verify)
import Hydra.Crypto (
HydraKey,
Signature,
SigningKey,
aggregateInOrder,
sign,
verifyMultiSignature,
)
import Hydra.Ledger (
IsTx,
Ledger (..),
Expand Down Expand Up @@ -789,32 +796,31 @@ onOpenNetworkAckSn ::
SnapshotNumber ->
Outcome tx
onOpenNetworkAckSn env openState otherParty snapshotSignature sn =
-- TODO: verify authenticity of message and whether otherParty is part of the head
-- Spec: require s ∈ {ŝ, ŝ + 1}
requireValidAckSn $ do
-- Spec: wait ŝ = s
waitOnSeenSnapshot $ \snapshot sigs -> do
-- Spec: (j,.) ∉ ̂Σ
requireNotSignedYet sigs $ do
let sigs'
-- TODO: Must check whether we know the 'otherParty' signing the snapshot
| verify (vkey otherParty) snapshotSignature snapshot = Map.insert otherParty snapshotSignature sigs
| otherwise = sigs
let sigs' = Map.insert otherParty snapshotSignature sigs
ifAllMembersHaveSigned snapshot sigs' $ do
-- TODO: verify the aggregated multisig, only the individuals, or both?
-- Spec: σ̃ ← MS-ASig(k_H, ̂Σ̂)
let multisig = aggregateInOrder sigs' parties
NewState
( onlyUpdateCoordinatedHeadState $
coordinatedHeadState
{ confirmedSnapshot =
ConfirmedSnapshot
{ snapshot
, signatures = multisig
}
, seenSnapshot = LastSeenSnapshot (number snapshot)
}
)
[ClientEffect $ SnapshotConfirmed headId snapshot multisig]
& emitSnapshot env
requireVerifiedMultisignature multisig snapshot $ do
NewState
( onlyUpdateCoordinatedHeadState $
coordinatedHeadState
{ confirmedSnapshot =
ConfirmedSnapshot
{ snapshot
, signatures = multisig
}
, seenSnapshot = LastSeenSnapshot (number snapshot)
}
)
[ClientEffect $ SnapshotConfirmed headId snapshot multisig]
& emitSnapshot env
where
seenSn = seenSnapshotNumber seenSnapshot

Expand Down Expand Up @@ -846,6 +852,11 @@ onOpenNetworkAckSn env openState otherParty snapshotSignature sn =
)
[]

requireVerifiedMultisignature multisig msg cont =
if verifyMultiSignature (vkey <$> parties) multisig msg
then cont
else Error $ RequireFailed "requireVerifiedMultisignature"

-- XXX: Data structures become unwieldy -> helper functions or lenses
onlyUpdateCoordinatedHeadState chs' =
Open openState{coordinatedHeadState = chs'}
Expand Down

0 comments on commit c7b9bd0

Please sign in to comment.