Skip to content

Commit 8b3a047

Browse files
committed
feat: verify signatures for both testnet and mainnet
1 parent 802cb7a commit 8b3a047

File tree

5 files changed

+73
-36
lines changed

5 files changed

+73
-36
lines changed

compiled/auction_escrow_validator.plutus

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiled/standing_bid_validator.plutus

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HydraAuctionOnchain/Lib/Cose.hs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
module HydraAuctionOnchain.Lib.Cose
22
( pmkSigStructure
3+
, pverifyCoseSignature
34
) where
45

56
import HydraAuctionOnchain.Lib.Serialization (pserializeAddress)
67
import Plutarch.Api.V2 (PAddress)
8+
import Plutarch.Crypto (pverifyEd25519Signature)
79
import Plutarch.Extra.Maybe (pjust, pnothing)
810
import Plutarch.Monadic qualified as P
911

10-
pmkSigStructure :: Term s (PAddress :--> PByteString :--> PByteString :--> PMaybe PByteString)
12+
pmkSigStructure
13+
:: Term
14+
s
15+
( PBool
16+
:--> PAddress
17+
:--> PByteString
18+
:--> PByteString
19+
:--> PMaybe PByteString
20+
)
1121
pmkSigStructure = phoistAcyclic $
12-
plam $ \addr payload payloadLength -> P.do
13-
pmatch (pserializeAddress # addr) $ \case
22+
plam $ \isMainnet addr payload payloadLength ->
23+
pmatch (pserializeAddress # isMainnet # addr) $ \case
1424
PNothing -> pnothing
1525
PJust addrSerialized -> P.do
1626
addrSerializedFields <- pletFields @["addrCbor", "addrMapEntrySize"] addrSerialized
@@ -24,3 +34,23 @@ pmkSigStructure = phoistAcyclic $
2434
, payloadLength
2535
, payload
2636
]
37+
38+
pverifyCoseSignature
39+
:: Term
40+
s
41+
( PByteString
42+
:--> PByteString
43+
:--> PAddress
44+
:--> PByteString
45+
:--> PByteString
46+
:--> PBool
47+
)
48+
pverifyCoseSignature = phoistAcyclic $
49+
plam $ \signature vk addr payload payloadLength -> P.do
50+
verifyForNetwork <- plet $ plam $ \isMainnet ->
51+
pmatch (pmkSigStructure # isMainnet # addr # payload # payloadLength) $ \case
52+
PNothing -> pcon PFalse
53+
PJust sigStruct ->
54+
pverifyEd25519Signature # vk # sigStruct # signature
55+
(verifyForNetwork # pcon PFalse) -- verify for testnet
56+
#|| (verifyForNetwork # pcon PTrue) -- if verification fails, verify for mainnet

src/HydraAuctionOnchain/Lib/Serialization.hs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ data PSerializedAddress (s :: S)
4040
instance DerivePlutusType PSerializedAddress where
4141
type DPTStrat _ = PlutusTypeData
4242

43-
pserializeAddress :: Term s (PAddress :--> PMaybe PSerializedAddress)
43+
pserializeAddress :: Term s (PBool :--> PAddress :--> PMaybe PSerializedAddress)
4444
pserializeAddress = phoistAcyclic $
45-
plam $ \addr ->
45+
plam $ \isMainnet addr ->
4646
pmatch (pmkAddrConfig # addr) $ \case
4747
PNothing -> pnothing
4848
PJust addrConfig -> P.do
@@ -52,7 +52,7 @@ pserializeAddress = phoistAcyclic $
5252
mconcat
5353
[ phexByteStr "58" -- byte string (one-byte uint8_t for n, and then n bytes follow)
5454
, addrSize
55-
, paddrConfigAddrHeaderForTestnet # addrConfig
55+
, paddrConfigAddrHeaderForTestnet # isMainnet # addrConfig
5656
, paddrConfigAddrBody # addrConfig
5757
]
5858
pjust #$ pcon $
@@ -103,19 +103,22 @@ paddrConfigAddrSize = phoistAcyclic $
103103
-- Get hex-encoded network tag + header type for given address
104104
-- configuration.
105105
-- https://github.com/cardano-foundation/CIPs/blob/d66f7d0a0bcd06c425a6b7a41c6d18c922deff7e/CIP-0019/README.md?plain=1#L70-L93
106-
paddrConfigAddrHeaderForTestnet :: Term s (PAddressConfiguration :--> PByteString)
106+
paddrConfigAddrHeaderForTestnet :: Term s (PBool :--> PAddressConfiguration :--> PByteString)
107107
paddrConfigAddrHeaderForTestnet = phoistAcyclic $
108-
plam $ \addrConfig ->
108+
plam $ \isMainnet addrConfig ->
109109
pmatch addrConfig $ \case
110110
PAddressConfig'PaymentKeyHash'StakeKeyHash _ _ ->
111-
-- 0x00 = 0b0000_0000
112-
phexByteStr "00"
111+
-- 0x01 = 0b0000_0001 for mainnet
112+
-- 0x00 = 0b0000_0000 for testnet
113+
pif isMainnet (phexByteStr "01") $ phexByteStr "00"
113114
PAddressConfig'PaymentKeyHash'ScriptHash _ _ ->
114-
-- 0x20 = 0b0010_0000
115-
phexByteStr "20"
115+
-- 0x21 = 0b0010_0001 for mainnet
116+
-- 0x20 = 0b0010_0000 for testnet
117+
pif isMainnet (phexByteStr "21") $ phexByteStr "20"
116118
PAddressConfig'PaymentKeyHash _ ->
117-
-- 0x60 = 0b0110_0000
118-
phexByteStr "60"
119+
-- 0x61 = 0b0110_0001 for mainnet
120+
-- 0x60 = 0b0110_0000 for testnet
121+
pif isMainnet (phexByteStr "61") $ phexByteStr "60"
119122

120123
paddrConfigAddrBody :: Term s (PAddressConfiguration :--> PByteString)
121124
paddrConfigAddrBody = phoistAcyclic $

src/HydraAuctionOnchain/Types/BidTerms.hs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ module HydraAuctionOnchain.Types.BidTerms
88

99
import HydraAuctionOnchain.Helpers (pserialise)
1010
import HydraAuctionOnchain.Lib.Address (paddrPaymentKeyHashUnsafe)
11-
import HydraAuctionOnchain.Lib.Cose (pmkSigStructure)
11+
import HydraAuctionOnchain.Lib.Cose (pverifyCoseSignature)
1212
import HydraAuctionOnchain.Types.AuctionTerms (PAuctionTerms, ptotalAuctionFees)
1313
import HydraAuctionOnchain.Types.BidderInfo (PBidderInfo)
1414
import Plutarch.Api.V2 (PCurrencySymbol, PPubKeyHash)
15-
import Plutarch.Crypto (pverifyEd25519Signature)
1615
import Plutarch.DataRepr (PDataFields)
17-
import Plutarch.Maybe (pfromJust)
1816
import Plutarch.Monadic qualified as P
1917
import "liqwid-plutarch-extra" Plutarch.Extra.List (preplicate)
2018

@@ -61,41 +59,47 @@ pvalidateBidTerms = phoistAcyclic $
6159

6260
let sellerSignature = bidTermsFields.btSellerSignature
6361
sellerVk <- plet $ pfield @"sellerVk" # auctionTerms
64-
sellerSigMsg <-
62+
sellerSigMessage <-
6563
plet $
6664
sellerSignatureMessage
6765
# auctionCs
6866
# bidderInfo.biBidderVk
6967

70-
sellerSigStruct <-
71-
plet $ pfromJust #$ pmkSigStructure # sellerAddr # sellerSigMsg # sellerSigMsgLengthHex
72-
7368
let
7469
bidderSignature = bidTermsFields.btBidderSignature
7570
bidderVk = bidderInfo.biBidderVk
7671
bidderAddr = bidderInfo.biBidderAddress
77-
bidderSigMsg <-
72+
bidderSigMessage <-
7873
plet $
7974
bidderSignatureMessage
8075
# auctionCs
8176
# bidTermsFields.btPrice
8277
# (paddrPaymentKeyHashUnsafe # bidderAddr)
8378

84-
bidderSigStruct <-
85-
plet $ pfromJust #$ pmkSigStructure # bidderAddr # bidderSigMsg # bidderSigMsgLengthHex
86-
8779
-- The seller authorized the bidder to participate in the auction.
88-
(pverifyEd25519Signature # sellerVk # sellerSigStruct # sellerSignature)
80+
( pverifyCoseSignature
81+
# sellerSignature
82+
# sellerVk
83+
# sellerAddr
84+
# sellerSigMessage
85+
# sellerSigMessageLengthHex
86+
)
8987
-- The bidder authorized the bid to be submitted in the auction.
90-
#&& (pverifyEd25519Signature # bidderVk # bidderSigStruct # bidderSignature)
88+
#&& ( pverifyCoseSignature
89+
# bidderSignature
90+
# bidderVk
91+
# bidderAddr
92+
# bidderSigMessage
93+
# bidderSigMessageLengthHex
94+
)
9195

92-
bidderSigMsgLengthHex :: Term s PByteString
93-
bidderSigMsgLengthHex =
96+
bidderSigMessageLengthHex :: Term s PByteString
97+
bidderSigMessageLengthHex =
9498
-- 69 = 2 (cbor) + 28 (cs) + 2 (cbor) + 28 (pkh) + 9 (lovelace)
9599
phoistAcyclic $ phexByteStr "45"
96100

97-
sellerSigMsgLengthHex :: Term s PByteString
98-
sellerSigMsgLengthHex =
101+
sellerSigMessageLengthHex :: Term s PByteString
102+
sellerSigMessageLengthHex =
99103
-- 64 = 2 (cbor) + 28 (cs) + 2 (cbor) + 32 (vk)
100104
phoistAcyclic $ phexByteStr "40"
101105

0 commit comments

Comments
 (0)