aboutsummaryrefslogtreecommitdiffstats
path: root/src/math/numbertheory
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/numbertheory')
-rw-r--r--src/math/numbertheory/curve_gfp.h5
-rw-r--r--src/math/numbertheory/point_gfp.cpp62
-rw-r--r--src/math/numbertheory/point_gfp.h57
3 files changed, 57 insertions, 67 deletions
diff --git a/src/math/numbertheory/curve_gfp.h b/src/math/numbertheory/curve_gfp.h
index 697065dfe..de6bed099 100644
--- a/src/math/numbertheory/curve_gfp.h
+++ b/src/math/numbertheory/curve_gfp.h
@@ -23,6 +23,11 @@ class BOTAN_DLL CurveGFp
public:
/**
+ * Create an uninitialized CurveGFp
+ */
+ CurveGFp() {}
+
+ /**
* Construct the elliptic curve E: y^2 = x^3 + ax + b over GF(p)
* @param p prime number of the field
* @param a first coefficient
diff --git a/src/math/numbertheory/point_gfp.cpp b/src/math/numbertheory/point_gfp.cpp
index 06c42d18c..bed08eb39 100644
--- a/src/math/numbertheory/point_gfp.cpp
+++ b/src/math/numbertheory/point_gfp.cpp
@@ -67,7 +67,7 @@ PointGFp& PointGFp::operator+=(const PointGFp& rhs)
{
if(r.is_zero())
{
- mult2_in_place();
+ mult2();
return *this;
}
@@ -119,7 +119,7 @@ PointGFp& PointGFp::operator*=(const BigInt& scalar)
}
else if(value == 2)
{
- this->mult2_in_place();
+ this->mult2();
if(scalar.is_negative())
this->negate();
}
@@ -135,7 +135,7 @@ PointGFp& PointGFp::operator*=(const BigInt& scalar)
for(int i = scalar.bits() - 1; i >= 0; --i)
{
- H.mult2_in_place();
+ H.mult2();
if(scalar.get_bit(i))
H += P;
}
@@ -164,16 +164,8 @@ PointGFp& PointGFp::operator*=(const BigInt& scalar)
return *this;
}
-PointGFp& PointGFp::negate()
- {
- if(!is_zero())
- coord_y = curve.get_p() - coord_y;
-
- return *this;
- }
-
// *this *= 2
-void PointGFp::mult2_in_place()
+void PointGFp::mult2()
{
if(is_zero())
return;
@@ -196,15 +188,11 @@ void PointGFp::mult2_in_place()
BigInt x = mod_p.reduce(mod_p.square(M) - mod_p.multiply(2, S));
- BigInt y = mod_p.square(y_2);
-
- BigInt z = mod_p.multiply(2, mod_p.reduce(y + y));
-
- BigInt U = mod_p.reduce(z + z);
+ BigInt U = mod_p.multiply(8, mod_p.square(y_2));
- y = mod_p.reduce(mod_p.multiply(M, S - x) - U);
+ BigInt y = mod_p.reduce(mod_p.multiply(M, S - x) - U);
- z = mod_p.multiply(2, mod_p.multiply(coord_y, coord_z));
+ BigInt z = mod_p.multiply(2, mod_p.multiply(coord_y, coord_z));
coord_x = x;
coord_y = y;
@@ -233,12 +221,6 @@ BigInt PointGFp::get_affine_y() const
return mod_p.multiply(coord_y, inverse_mod(z3, curve.get_p()));
}
-// Is this the point at infinity?
-bool PointGFp::is_zero() const
- {
- return(coord_x.is_zero() && coord_z.is_zero());
- }
-
void PointGFp::check_invariants() const
{
/*
@@ -292,36 +274,6 @@ bool PointGFp::operator==(const PointGFp& other) const
get_curve() == other.get_curve());
}
-// arithmetic operators
-PointGFp operator+(const PointGFp& lhs, PointGFp const& rhs)
- {
- PointGFp tmp(lhs);
- return tmp += rhs;
- }
-
-PointGFp operator-(const PointGFp& lhs, PointGFp const& rhs)
- {
- PointGFp tmp(lhs);
- return tmp -= rhs;
- }
-
-PointGFp operator-(const PointGFp& lhs)
- {
- return PointGFp(lhs).negate();
- }
-
-PointGFp operator*(const BigInt& scalar, const PointGFp& point)
- {
- PointGFp result(point);
- return result *= scalar;
- }
-
-PointGFp operator*(const PointGFp& point, const BigInt& scalar)
- {
- PointGFp result(point);
- return result *= scalar;
- }
-
// encoding and decoding
SecureVector<byte> EC2OSP(const PointGFp& point, byte format)
{
diff --git a/src/math/numbertheory/point_gfp.h b/src/math/numbertheory/point_gfp.h
index 0741b5e56..3bb763d44 100644
--- a/src/math/numbertheory/point_gfp.h
+++ b/src/math/numbertheory/point_gfp.h
@@ -41,6 +41,11 @@ class BOTAN_DLL PointGFp
};
/**
+ * Construct an uninitialized PointGFp
+ */
+ PointGFp() {}
+
+ /**
* Construct the point O
* @param curve The base curve
*/
@@ -98,7 +103,12 @@ class BOTAN_DLL PointGFp
* Negate this point
* @return *this
*/
- PointGFp& negate();
+ PointGFp& negate()
+ {
+ if(!is_zero())
+ coord_y = curve.get_p() - coord_y;
+ return *this;
+ }
/**
* Return base curve of this point
@@ -122,25 +132,26 @@ class BOTAN_DLL PointGFp
* get the jacobian projective x coordinate
* @result jacobian projective x coordinate
*/
- const BigInt& get_jac_proj_x() const { return coord_x; }
+ const BigInt& get_x() const { return coord_x; }
/**
* get the jacobian projective y coordinate
* @result jacobian projective y coordinate
*/
- const BigInt& get_jac_proj_y() const { return coord_y; }
+ const BigInt& get_y() const { return coord_y; }
/**
* get the jacobian projective z coordinate
* @result jacobian projective z coordinate
*/
- const BigInt& get_jac_proj_z() const { return coord_z; }
+ const BigInt& get_z() const { return coord_z; }
/**
* Is this the point at infinity?
* @result true, if this point is at infinity, false otherwise.
*/
- bool is_zero() const;
+ bool is_zero() const
+ { return (coord_x.is_zero() && coord_z.is_zero()); }
/**
* Checks whether the point is to be found on the underlying curve.
@@ -162,9 +173,9 @@ class BOTAN_DLL PointGFp
bool operator==(const PointGFp& other) const;
private:
/**
- * Multiply the point by two
+ * Point doubling
*/
- void mult2_in_place();
+ void mult2();
CurveGFp curve;
BigInt coord_x, coord_y, coord_z;
@@ -177,12 +188,34 @@ inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs)
}
// arithmetic operators
-PointGFp BOTAN_DLL operator+(const PointGFp& lhs, const PointGFp& rhs);
-PointGFp BOTAN_DLL operator-(const PointGFp& lhs, const PointGFp& rhs);
-PointGFp BOTAN_DLL operator-(const PointGFp& lhs);
+inline PointGFp operator-(const PointGFp& lhs)
+ {
+ return PointGFp(lhs).negate();
+ }
+
+inline PointGFp operator+(const PointGFp& lhs, const PointGFp& rhs)
+ {
+ PointGFp tmp(lhs);
+ return tmp += rhs;
+ }
-PointGFp BOTAN_DLL operator*(const BigInt& scalar, const PointGFp& point);
-PointGFp BOTAN_DLL operator*(const PointGFp& point, const BigInt& scalar);
+inline PointGFp operator-(const PointGFp& lhs, const PointGFp& rhs)
+ {
+ PointGFp tmp(lhs);
+ return tmp -= rhs;
+ }
+
+inline PointGFp operator*(const BigInt& scalar, const PointGFp& point)
+ {
+ PointGFp result(point);
+ return result *= scalar;
+ }
+
+inline PointGFp operator*(const PointGFp& point, const BigInt& scalar)
+ {
+ PointGFp result(point);
+ return result *= scalar;
+ }
// encoding and decoding
SecureVector<byte> BOTAN_DLL EC2OSP(const PointGFp& point, byte format);