Source code for pycoin.ecdsa.Point
[docs]class NoSuchPointError(ValueError):
pass
[docs]class Point(tuple):
"""
A point on an elliptic curve. This is a subclass of tuple (forced to a 2-tuple),
and also includes a reference to the underlying Curve.
This class supports the operators ``+``, ``-`` (unary and binary) and ``*``.
:param x: x coordinate
:param y: y coordinate
:param curve: the :class:`Curve <pycoin.ecdsa.Curve.Curve>` this point must be on
The constructor raises :class:`NoSuchPointError` if the point is invalid.
The point at infinity is ``(x, y) == (None, None)``.
"""
def __new__(self, x, y, curve):
"""
Subclasses of tuple require __new__ to be overridden.
"""
return tuple.__new__(self, (x, y))
def __init__(self, x, y, curve):
self._curve = curve
super(Point, self).__init__()
self.check_on_curve()
[docs] def check_on_curve(self):
"""raise :class:`NoSuchPointError` if the point is not actually on the curve."""
if not self._curve.contains_point(*self):
raise NoSuchPointError('({},{}) is not on the curve {}'.format(self[0], self[1], self._curve))
[docs] def __add__(self, other):
"""Add one point to another point."""
return self._curve.add(self, other)
[docs] def __sub__(self, other):
"""Subtract one point from another point."""
return self._curve.add(self, -other)
[docs] def __mul__(self, e):
"""Multiply a point by an integer."""
return self._curve.multiply(self, e)
def __rmul__(self, other):
"""Multiply a point by an integer."""
return self * other
[docs] def __neg__(self):
"""Unary negation"""
return self.__class__(self[0], self._curve.p()-self[1], self._curve)
[docs] def curve(self):
""":return: the :class:`Curve <pycoin.ecdsa.Curve>` this point is on"""
return self._curve