diff --git a/NBitcoin.Tests/MiniscriptTests.cs b/NBitcoin.Tests/MiniscriptTests.cs index d760f1739..d44881443 100644 --- a/NBitcoin.Tests/MiniscriptTests.cs +++ b/NBitcoin.Tests/MiniscriptTests.cs @@ -71,6 +71,21 @@ public void CanRoundtripMiniscript(string miniscript) Assert.Equal(miniscript, actual); } + [Theory] + // https://github.com/MetacoSA/NBitcoin/issues/1283 + [InlineData("older(000000002088829000)", false)] + [InlineData("older(01)", false)] + [InlineData("after(01)", false)] + [InlineData("multi(01,A,B)", false)] + [InlineData("older(0)", true)] + [InlineData("older(1000)", true)] + [InlineData("after(1000)", true)] + public void RejectsNonCanonicalNumbers(string miniscript, bool expected) + { + var settings = new MiniscriptParsingSettings(Network.RegTest, KeyType.Classic) { AllowedParameters = ParameterTypeFlags.All }; + Assert.Equal(expected, Miniscript.TryParse(miniscript, settings, out _)); + } + [Theory] [InlineData(ParameterTypeFlags.All, "pkh(A)", true)] [InlineData(ParameterTypeFlags.All, "pkh(@0/**)", true)] diff --git a/NBitcoin/WalletPolicies/Miniscript.cs b/NBitcoin/WalletPolicies/Miniscript.cs index 358534495..25462a4e1 100644 --- a/NBitcoin/WalletPolicies/Miniscript.cs +++ b/NBitcoin/WalletPolicies/Miniscript.cs @@ -222,6 +222,11 @@ private static bool TryParseParameterCount(ParsingContext ctx, [MaybeNullWhen(tr error = null; node = null; var match = Regex.Match(ctx.Remaining, @"^[0-9]+"); + if (match.Value.Length > 1 && match.Value[0] == '0') + { + error = new MiniscriptError.CountExpected(ctx.Offset); + return false; + } if (uint.TryParse(match.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var v) && v < Int32.MaxValue) { ctx.Advance(match.Length); @@ -257,6 +262,11 @@ private static bool TryParseLocktime(ParsingContext ctx, [MaybeNullWhen(true)] o node = null; error = null; var match = Regex.Match(ctx.Remaining, @"^[0-9]+"); + if (match.Value.Length > 1 && match.Value[0] == '0') + { + error = new MiniscriptError.LocktimeExpected(ctx.Offset); + return false; + } if (uint.TryParse(match.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var v)) { ctx.Advance(match.Length);