Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add known-to-fail counterexamples to Bech32 string corruption tests. #328

Merged
merged 3 commits into from
May 28, 2019

Conversation

jonathanknowles
Copy link
Member

@jonathanknowles jonathanknowles commented May 28, 2019

Issue Number

Issue #324

Overview

  • I've added known-to-fail counterexamples to both the Bech32 character insertion and deletion tests. If we encounter these counterexamples, we allow the current test run to pass.
  • I've increased the maximum number of test runs for the Bech32 character insertion, deletion and swap tests, from 100 to 10,000 runs. By increasing the number of runs, we can be more confident that there are no counterexamples to be found, at a small cost in test time (a couple of seconds in total.)
  • I did a one-off test run with 10 million iterations for each of the above tests. No counterexamples were found other than those already identified.

The space of valid Bech32 strings is very large. By increasing the
number of test runs, we can be more confident that there are no
counterexamples to be found, for a very small increase in test time.
…sion test.

In the case where the tail of a valid Bech32 string is composed of one
or more consecutive 'q' characters followed by a single 'p' character,
omitting any or all of the 'q' characters will still result in a valid
Bech32 string.

We amend the character omission test to allow for this case, so that
when it occurs, it won't cause the test to fail.
…rtion test.

In the case where the last character of a valid Bech32 string is the
character 'p', inserting any number of consecutive 'q' characters
immediately before the 'p' will still result in a valid Bech32 string.

We amend the character insertion test to allow for this case, so that
when it occurs, it won't cause the test to fail.
@jonathanknowles jonathanknowles changed the title Jonathanknowles/bech32 known counterexamples Add known-to-fail counterexamples to Bech32 string corruption tests. May 28, 2019
@jonathanknowles jonathanknowles self-assigned this May 28, 2019
(T.length suffix > 0
&& T.last suffix == 'p'
&& char == 'q'
&& T.all (== 'q') (T.dropEnd 1 suffix))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the rationale here 🤔 ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. I'm currently updating the issue with a longer explanation. Will let you know when I've finished writing. :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In our current test case, we assume that deleting a character from a valid Bech32 string will create an invalid Bech32 string.

I think this is a fair assumption, as Bech32 was designed with the specific goal of collision resistance. When entering one Bech32 string, it's supposed to be very hard to collide with another Bech32 string just by making a small typo.

Experimental testing shows that there is at least one known counterexample to this law: when a Bech32 string ends in qp, it's possible to delete a single q character and still produce a valid Bech32 string. This works for any number of q characters.

The fact that it's possible to produce a collision just by deleting a single character comes as a surprise.

The above change adjusts the test case to account for this counterexample.

@KtorZ KtorZ merged commit b06b01b into master May 28, 2019
@KtorZ KtorZ deleted the jonathanknowles/bech32-known-counterexamples branch May 28, 2019 11:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants