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

Tests keep running into hypothesis falsifying examples #307

Closed
bnavigator opened this issue Oct 24, 2022 · 1 comment · Fixed by #308
Closed

Tests keep running into hypothesis falsifying examples #307

bnavigator opened this issue Oct 24, 2022 · 1 comment · Fixed by #308
Labels
bug unintended behaviour in ecdsa code

Comments

@bnavigator
Copy link

python-excdsa 0.18.0
hypothesis 6.56.2

[   35s] _____________________________ test_p192_mult_tests _____________________________
[   35s] 
[   35s]     @settings(**HYP_SLOW_SETTINGS)
[   35s] >   @given(st.integers(min_value=1, max_value=r + 1))
[   35s] 
[   35s] src/ecdsa/test_ellipticcurve.py:47: 
[   35s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   35s] src/ecdsa/test_ellipticcurve.py:49: in test_p192_mult_tests
[   35s]     inv_m = inverse_mod(multiple, r)
[   35s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   35s] 
[   35s] a = 627710173538668076...7194773182842284081
[   35s] m = 627710173538668076...7194773182842284081
[   35s] 
[   35s]     def inverse_mod(a, m):
[   35s]         """Inverse of a mod m."""
[   35s]         if a == 0:  # pragma: no branch
[   35s]             return 0
[   35s] >       return pow(a, -1, m)
[   35s] E       ValueError: base is not invertible for the given modulus
[   35s] E       Falsifying example: test_p192_mult_tests(
[   35s] E           multiple=6277101735386680763835789423176059013767194773182842284081,
[   35s] E       )
[   35s] 
[   35s] src/ecdsa/numbertheory.py:266: ValueError
[   29s] __________________ TestJacobi.test_add_different_scale_points __________________
[   29s] 
[   29s] self = <ecdsa.test_jacobi.TestJacobi testMethod=test_add_different_scale_points>
[   29s] 
[   29s]     @settings(max_examples=14)
[   29s] >   @given(
[   29s]         st.integers(
[   29s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   29s]         ),
[   29s]         st.integers(
[   29s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   29s]         ),
[   29s]         st.lists(
[   29s]             st.integers(
[   29s]                 min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)
[   29s]             ),
[   29s]             min_size=2,
[   29s]             max_size=2,
[   29s]             unique=True,
[   29s]         ),
[   29s]     )
[   29s] 
[   29s] src/ecdsa/test_jacobi.py:352: 
[   29s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   29s] 
[   29s] self = <ecdsa.test_jacobi.TestJacobi testMethod=test_add_different_scale_points>
[   29s] a_mul = 1, b_mul = 133229759844004487...0181364212942568457, new_z = [2, 1]
[   29s] 
[   29s]     @settings(max_examples=14)
[   29s]     @given(
[   29s]         st.integers(
[   29s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   29s]         ),
[   29s]         st.integers(
[   29s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   29s]         ),
[   29s]         st.lists(
[   29s]             st.integers(
[   29s]                 min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)
[   29s]             ),
[   29s]             min_size=2,
[   29s]             max_size=2,
[   29s]             unique=True,
[   29s]         ),
[   29s]     )
[   29s]     @example(2, 2, [2, 1])
[   29s]     @example(2, 2, [2, 3])
[   29s]     @example(2, int(generator_brainpoolp160r1.order() - 2), [2, 3])
[   29s]     @example(2, int(generator_brainpoolp160r1.order() - 2), [2, 1])
[   29s]     def test_add_different_scale_points(self, a_mul, b_mul, new_z):
[   29s]         j_g = PointJacobi.from_affine(generator_brainpoolp160r1)
[   29s]         a = PointJacobi.from_affine(j_g * a_mul)
[   29s]         b = PointJacobi.from_affine(j_g * b_mul)
[   29s]     
[   29s]         p = curve_brainpoolp160r1.p()
[   29s]     
[   29s]         assume(inverse_mod(new_z[0], p))
[   29s]         assume(inverse_mod(new_z[1], p))
[   29s]     
[   29s]         new_zz0 = new_z[0] * new_z[0] % p
[   29s]         new_zz1 = new_z[1] * new_z[1] % p
[   29s]     
[   29s]         a = PointJacobi(
[   29s]             curve_brainpoolp160r1,
[   29s]             a.x() * new_zz0 % p,
[   29s]             a.y() * new_zz0 * new_z[0] % p,
[   29s]             new_z[0],
[   29s]         )
[   29s]         b = PointJacobi(
[   29s]             curve_brainpoolp160r1,
[   29s] >           b.x() * new_zz1 % p,
[   29s]             b.y() * new_zz1 * new_z[1] % p,
[   29s]             new_z[1],
[   29s]         )
[   29s] E       TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
[   29s] E       Falsifying example: test_add_different_scale_points(
[   29s] E           new_z=[2, 1],
[   29s] E           b_mul=1332297598440044874827085038830181364212942568457,
[   29s] E           a_mul=1,
[   29s] E           self=<ecdsa.test_jacobi.TestJacobi testMethod=test_add_different_scale_points>,
[   29s] E       )
[   29s] 
[   29s] src/ecdsa/test_jacobi.py:393: TypeError
[   32s] ____________________ TestJacobi.test_add_same_scale_points _____________________
[   32s] 
[   32s] self = <ecdsa.test_jacobi.TestJacobi testMethod=test_add_same_scale_points>
[   32s] 
[   32s]     @settings(max_examples=10)
[   32s] >   @given(
[   32s]         st.integers(
[   32s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   32s]         ),
[   32s]         st.integers(
[   32s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   32s]         ),
[   32s]         st.integers(min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)),
[   32s]     )
[   32s] 
[   32s] src/ecdsa/test_jacobi.py:287: 
[   32s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   32s] 
[   32s] self = <ecdsa.test_jacobi.TestJacobi testMethod=test_add_same_scale_points>
[   32s] a_mul = 133229759844004487...0181364212942568457, b_mul = 1, new_z = 1
[   32s] 
[   32s]     @settings(max_examples=10)
[   32s]     @given(
[   32s]         st.integers(
[   32s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   32s]         ),
[   32s]         st.integers(
[   32s]             min_value=1, max_value=int(generator_brainpoolp160r1.order())
[   32s]         ),
[   32s]         st.integers(min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)),
[   32s]     )
[   32s]     @example(1, 1, 1)
[   32s]     @example(3, 3, 3)
[   32s]     @example(2, int(generator_brainpoolp160r1.order() - 2), 1)
[   32s]     @example(2, int(generator_brainpoolp160r1.order() - 2), 3)
[   32s]     def test_add_same_scale_points(self, a_mul, b_mul, new_z):
[   32s]         j_g = PointJacobi.from_affine(generator_brainpoolp160r1)
[   32s]         a = PointJacobi.from_affine(j_g * a_mul)
[   32s]         b = PointJacobi.from_affine(j_g * b_mul)
[   32s]     
[   32s]         p = curve_brainpoolp160r1.p()
[   32s]     
[   32s]         assume(inverse_mod(new_z, p))
[   32s]     
[   32s]         new_zz = new_z * new_z % p
[   32s]     
[   32s]         a = PointJacobi(
[   32s]             curve_brainpoolp160r1,
[   32s] >           a.x() * new_zz % p,
[   32s]             a.y() * new_zz * new_z % p,
[   32s]             new_z,
[   32s]         )
[   32s] E       TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
[   32s] E       Falsifying example: test_add_same_scale_points(
[   32s] E           new_z=1,
[   32s] E           b_mul=1,
[   32s] E           a_mul=1332297598440044874827085038830181364212942568457,
[   32s] E           self=<ecdsa.test_jacobi.TestJacobi testMethod=test_add_same_scale_points>,
[   32s] E       )
[   32s] 
[   32s] src/ecdsa/test_jacobi.py:313: TypeError
@bnavigator
Copy link
Author

[  146s] _______________________________ test_sig_verify ________________________________
[  146s] 
[  146s]     @settings(**SIG_VER_SETTINGS)
[  146s] >   @example((generator_224, 4, 1, 1))
[  146s] 
[  146s] src/ecdsa/test_ecdsa.py:641: 
[  146s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  146s] src/ecdsa/test_ecdsa.py:650: in test_sig_verify
[  146s]     pubkey = Public_key(generator, generator * sec_mult)
[  146s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  146s] 
[  146s] self = <ecdsa.ecdsa.Public_key object at 0x7fb780c7c280>
[  146s] generator = <ecdsa.ellipticcurve.PointJacobi object at 0x7fb7819f53c0>
[  146s] point = <ecdsa.ellipticcurve.Point object at 0x7fb7819f5690>, verify = True
[  146s] 
[  146s]     def __init__(self, generator, point, verify=True):
[  146s]         """Low level ECDSA public key object.
[  146s]     
[  146s]         :param generator: the Point that generates the group (the base point)
[  146s]         :param point: the Point that defines the public key
[  146s]         :param bool verify: if True check if point is valid point on curve
[  146s]     
[  146s]         :raises InvalidPointError: if the point parameters are invalid or
[  146s]             point does not lay on the curve
[  146s]         """
[  146s]     
[  146s]         self.curve = generator.curve()
[  146s]         self.generator = generator
[  146s]         self.point = point
[  146s]         n = generator.order()
[  146s]         p = self.curve.p()
[  146s] >       if not (0 <= point.x() < p) or not (0 <= point.y() < p):
[  146s] E       TypeError: '<=' not supported between instances of 'int' and 'NoneType'
[  146s] E       Generator used: generator_192
[  146s] E       Falsifying example: test_sig_verify(
[  146s] E           args=(<ecdsa.ellipticcurve.PointJacobi at 0x7fb7819f53c0>,
[  146s] E            6277101735386680763835789423176059013767194773182842284081,
[  146s] E            1,
[  146s] E            1),
[  146s] E       )
[  146s] 
[  146s] src/ecdsa/ecdsa.py:149: TypeError

@tomato42 tomato42 added the bug unintended behaviour in ecdsa code label Feb 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug unintended behaviour in ecdsa code
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants