Skip to content

Commit acf9bcd

Browse files
authored
Merge pull request #1059 from IntersectMBO/backport/10.19/fix-canonical-cbor-bug
[backport for 10.19] Fix canonical CBOR bug
2 parents b951a63 + bfbbc84 commit acf9bcd

File tree

2 files changed

+21
-6
lines changed
  • cardano-api

2 files changed

+21
-6
lines changed

cardano-api/src/Cardano/Api/Serialise/Cbor/Canonical.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ canonicaliseTerm = \case
6767
(TTagged tag term) ->
6868
TTagged tag $ canonicaliseTerm term
6969
(TListI terms) ->
70-
TList terms
70+
TList $ map canonicaliseTerm terms
71+
(TList terms) ->
72+
TList $ map canonicaliseTerm terms
7173
term -> term
7274

7375
-- | Implements sorting of CBOR terms for canonicalisation. CBOR terms are compared by lexical order of their

cardano-api/test/cardano-api-test/Test/Cardano/Api/CBOR.hs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import Data.ByteString.Short qualified as SBS
2525
import Data.List (sortOn)
2626
import Data.Text (Text)
2727
import Data.Text qualified as T
28+
import GHC.Stack (callStack)
2829
import GHC.Stack qualified as GHC
2930

3031
import Test.Gen.Cardano.Api.Hardcoded
@@ -380,15 +381,27 @@ prop_canonicalise_cbor = property $ do
380381
, (TBytes "bb", TString "h")
381382
, (TBytes "ba", TListI [TString "i", TString "j"])
382383
]
383-
inputMapBs = CBOR.serialize' inputMap
384-
inputMapTerm <- decodeExampleTerm inputMapBs
384+
inputMapInIndefiniteList = TListI [inputMap]
385+
inputMapInDefiniteList = TList [inputMap]
385386

386-
inputMapCanonicalisedBs <- H.leftFail $ canonicaliseCborBs inputMapBs
387+
input <- forAll $ Gen.element [inputMap, inputMapInIndefiniteList, inputMapInDefiniteList]
388+
let inputBs = CBOR.serialize' input
387389

388-
inputMapCanonicalisedTerm@(TMap elemTerms) <- decodeExampleTerm inputMapCanonicalisedBs
390+
inputTerm <- decodeExampleTerm inputBs
391+
392+
inputCanonicalisedBs <- H.leftFail $ canonicaliseCborBs inputBs
393+
394+
decodedTerm <- decodeExampleTerm inputCanonicalisedBs
395+
inputMapCanonicalisedTerm@(TMap elemTerms) <-
396+
case decodedTerm of
397+
TMap elemTerms -> pure $ TMap elemTerms
398+
TList [TMap elemTerms] -> pure $ TMap elemTerms
399+
t ->
400+
H.failMessage callStack $
401+
"Expected canonicalised term to be a map or a list with a single map: " <> show t
389402

390403
H.annotate "sanity check that cbor round trip does not change the order"
391-
inputMap === inputMapTerm
404+
input === inputTerm
392405

393406
H.annotate "Print bytes hex representation of the keys in the map"
394407
H.annotateShow

0 commit comments

Comments
 (0)