@@ -58,6 +58,7 @@ import qualified Pact.Core.Gas.Types as P
5858import qualified Pact.Core.Hash as P
5959import qualified Chainweb.Pact5.Transaction as P
6060import qualified Pact.Types.Gas as Pact4
61+ import Chainweb.Version.Guards (PactPPKScheme (.. ), validPPKSchemes )
6162import qualified Pact.Parse as Pact4
6263import Chainweb.Pact5.Types
6364import qualified Chainweb.Pact5.Transaction as Pact5
@@ -79,6 +80,7 @@ assertPreflightMetadata cmd@(P.Command pay sigs hsh) txCtx sigVerify = do
7980 let P. PublicMeta pcid _ gl gp _ _ = P. _pMeta pay
8081 nid = P. _pNetworkId pay
8182 signers = P. _pSigners pay
83+ validSchemes = validPPKSchemes v cid $ ctxCurrentBlockHeight txCtx
8284
8385 let errs = catMaybes
8486 [ eUnless " Chain id mismatch" $ assertChainId cid pcid
@@ -88,17 +90,17 @@ assertPreflightMetadata cmd@(P.Command pay sigs hsh) txCtx sigVerify = do
8890 , eUnless " Gas price decimal precision too high" $ assertGasPrice gp
8991 , eUnless " Network id mismatch" $ assertNetworkId v nid
9092 , eUnless " Signature list size too big" $ assertSigSize sigs
91- , eUnless " Invalid transaction signatures" $ sigValidate signers
93+ , eUnless " Invalid transaction signatures" $ sigValidate validSchemes signers
9294 , eUnless " Tx time outside of valid range" $ assertTxTimeRelativeToParent pct cmd
9395 ]
9496
9597 pure $ case nonEmpty errs of
9698 Nothing -> Right ()
9799 Just vs -> Left vs
98100 where
99- sigValidate signers
101+ sigValidate validSchemes signers
100102 | Just NoVerify <- sigVerify = True
101- | otherwise = isRight $ assertValidateSigs hsh signers sigs
103+ | otherwise = isRight $ assertValidateSigs validSchemes hsh signers sigs
102104
103105 pct = ParentCreationTime
104106 . view blockCreationTime
@@ -153,11 +155,12 @@ assertTxSize initialGas gasLimit = P.GasLimit initialGas < gasLimit
153155-- transaction hash.
154156--
155157assertValidateSigs :: ()
156- => P. Hash
158+ => [PactPPKScheme ]
159+ -> P. Hash
157160 -> [P. Signer ]
158161 -> [P. UserSig ]
159162 -> Either AssertValidateSigsError ()
160- assertValidateSigs hsh signers sigs = do
163+ assertValidateSigs validSchemes hsh signers sigs = do
161164 let signersLength = length signers
162165 let sigsLength = length sigs
163166 ebool_
@@ -168,6 +171,9 @@ assertValidateSigs hsh signers sigs = do
168171 (signersLength == sigsLength)
169172
170173 iforM_ (zip sigs signers) $ \ pos (sig, signer) -> do
174+ ebool_ (InvalidSignerScheme pos)
175+ ((SchemeV5 $ fromMaybe P. ED25519 $ P. _siScheme signer) `elem` validSchemes)
176+
171177 case P. verifyUserSig hsh sig signer of
172178 Left errMsg -> Left (InvalidUserSig pos (Text. pack errMsg))
173179 Right () -> Right ()
@@ -209,10 +215,10 @@ assertTxNotInFuture (ParentCreationTime (BlockCreationTime txValidationTime)) tx
209215
210216-- | Assert that the command hash matches its payload and
211217-- its signatures are valid, without parsing the payload.
212- assertCommand :: Pact5. Transaction -> Either AssertCommandError ()
213- assertCommand cmd = do
218+ assertCommand :: Pact5. Transaction -> [ PactPPKScheme ] -> Either AssertCommandError ()
219+ assertCommand cmd ppkSchemePassList = do
214220 _ <- assertHash & _Left .~ InvalidPayloadHash
215- assertValidateSigs hsh signers (P. _cmdSigs cmd) & _Left %~ AssertValidateSigsError
221+ assertValidateSigs ppkSchemePassList hsh signers (P. _cmdSigs cmd) & _Left %~ AssertValidateSigsError
216222 where
217223 hsh = P. _cmdHash cmd
218224 pwt = P. _cmdPayload cmd
0 commit comments