@@ -17,6 +17,7 @@ import Hedgehog
17
17
import Hedgehog.Gen hiding (discard , maybe , prune )
18
18
import Hedgehog.Range (linear , singleton )
19
19
import Text.Read (readMaybe )
20
+ import System.Random (StdGen , mkStdGen )
20
21
21
22
22
23
prop_secKeyReadInvertsShow :: Property
@@ -261,10 +262,17 @@ prop_schnorrSignaturesProducedAreValid = property $ do
261
262
sk <- forAll secKeyGen
262
263
msg <- forAll $ bytes (singleton 32 )
263
264
let kp = keyPairCreate sk
264
- sig <- liftIO $ schnorrSign kp msg
265
- case sig of
266
- Nothing -> failure
267
- Just s -> assert $ schnorrVerify (fst $ keyPairPubKeyXO kp) msg s
265
+ sig <- maybe failure pure $ schnorrSignDeterministic kp msg
266
+ assert $ schnorrVerify (fst $ keyPairPubKeyXO kp) msg sig
267
+
268
+
269
+ prop_schnorrSignaturesProducedAreValidNonDeterministic :: Property
270
+ prop_schnorrSignaturesProducedAreValidNonDeterministic = property $ do
271
+ sk <- forAll secKeyGen
272
+ msg <- forAll $ bytes (singleton 32 )
273
+ let kp = keyPairCreate sk
274
+ sig <- liftIO $ maybe (error " Failed to sign" ) pure =<< schnorrSignNondeterministic kp msg
275
+ assert $ schnorrVerify (fst $ keyPairPubKeyXO kp) msg sig
268
276
269
277
270
278
prop_pubKeyCombineTweakIdentity :: Property
@@ -299,10 +307,18 @@ prop_schnorrSignaturesUnforgeable = property $ do
299
307
let kp = keyPairCreate sk
300
308
pk <- forAll pubKeyXOGen
301
309
msg <- forAll $ bytes (singleton 32 )
302
- sig <- liftIO $ schnorrSign kp msg
303
- case sig of
304
- Nothing -> failure
305
- Just s -> assert . not $ schnorrVerify pk msg s
310
+ sig <- maybe failure pure $ schnorrSignDeterministic kp msg
311
+ assert . not $ schnorrVerify pk msg sig
312
+
313
+
314
+ prop_schnorrSignaturesUnforgeableNonDeterministic :: Property
315
+ prop_schnorrSignaturesUnforgeableNonDeterministic = property $ do
316
+ sk <- forAll secKeyGen
317
+ let kp = keyPairCreate sk
318
+ pk <- forAll pubKeyXOGen
319
+ msg <- forAll $ bytes (singleton 32 )
320
+ sig <- liftIO $ maybe (error " Failed to sign" ) pure =<< schnorrSignNondeterministic kp msg
321
+ assert . not $ schnorrVerify pk msg sig
306
322
307
323
308
324
newtype Wrapped a = Wrapped { secKey :: a } deriving (Show , Read , Eq )
@@ -349,8 +365,7 @@ prop_derivedCompositeReadShowInvertSchnorrSignature = property $ do
349
365
sk <- forAll secKeyGen
350
366
let kp = keyPairCreate sk
351
367
msg <- forAll $ bytes (singleton 32 )
352
- mSig <- liftIO $ schnorrSign kp msg
353
- sig <- maybe failure pure mSig
368
+ sig <- maybe failure pure $ schnorrSignDeterministic kp msg
354
369
let a = sig
355
370
annotateShow a
356
371
annotateShow (length $ show a)
@@ -380,7 +395,7 @@ prop_schnorrSignatureParseInvertsSerialize = property $ do
380
395
sk <- forAll secKeyGen
381
396
msg <- forAll $ bytes (singleton 32 )
382
397
let kp = keyPairCreate sk
383
- sig <- liftIO $ maybe ( error " schnorrSign failed " ) pure =<< schnorrSign kp msg
398
+ sig <- maybe failure pure $ schnorrSignDeterministic kp msg
384
399
let serialized = exportSchnorrSignature sig
385
400
annotateShow serialized
386
401
annotateShow (BS. length serialized)
@@ -393,22 +408,43 @@ prop_schnorrSignatureValidityPreservedOverSerialization = property $ do
393
408
sk <- forAll secKeyGen
394
409
msg <- forAll $ bytes (singleton 32 )
395
410
let kp = keyPairCreate sk
396
- sig <- liftIO $ maybe ( error " schnorrSign failed " ) pure =<< schnorrSign kp msg
411
+ sig <- maybe failure pure $ schnorrSignDeterministic kp msg
397
412
let serialized = exportSchnorrSignature sig
398
413
let parsed = importSchnorrSignature serialized
399
414
parsed === Just sig
400
415
assert $ schnorrVerify (fst $ keyPairPubKeyXO kp) msg sig
401
416
402
417
418
+ prop_schnorrSignatureDeterministic :: Property
419
+ prop_schnorrSignatureDeterministic = property $ do
420
+ sk <- forAll secKeyGen
421
+ msg <- forAll $ bytes (singleton 32 )
422
+ let kp = keyPairCreate sk
423
+ sig1 <- maybe failure pure $ schnorrSignDeterministic kp msg
424
+ sig2 <- maybe failure pure $ schnorrSignDeterministic kp msg
425
+ sig1 === sig2
426
+
427
+
403
428
prop_schnorrSignatureNonDeterministic :: Property
404
429
prop_schnorrSignatureNonDeterministic = property $ do
405
430
sk <- forAll secKeyGen
406
431
msg <- forAll $ bytes (singleton 32 )
407
432
let kp = keyPairCreate sk
408
- sig1 <- liftIO $ maybe (error " schnorrSign failed " ) pure =<< schnorrSign kp msg
409
- sig2 <- liftIO $ maybe (error " schnorrSign failed " ) pure =<< schnorrSign kp msg
433
+ sig1 <- liftIO $ maybe (error " Failed to sign " ) pure =<< schnorrSignNondeterministic kp msg
434
+ sig2 <- liftIO $ maybe (error " Failed to sign " ) pure =<< schnorrSignNondeterministic kp msg
410
435
sig1 /== sig2
411
436
412
437
438
+ prop_schnorrSignWithStdGen :: Property
439
+ prop_schnorrSignWithStdGen = property $ do
440
+ sk <- forAll secKeyGen
441
+ msg <- forAll $ bytes (singleton 32 )
442
+ let kp = keyPairCreate sk
443
+ stdGen <- forAll $ mkStdGen <$> integral (linear 0 maxBound )
444
+ sig1 <- maybe failure pure $ schnorrSign (Just stdGen) kp msg
445
+ sig2 <- maybe failure pure $ schnorrSign (Just stdGen) kp msg
446
+ sig1 === sig2
447
+
448
+
413
449
tests :: Group
414
450
tests = $$ discover
0 commit comments