aboutsummaryrefslogtreecommitdiffstats
path: root/src/math/gfpmath
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-02-25 21:15:29 +0000
committerlloyd <[email protected]>2010-02-25 21:15:29 +0000
commit2208225cb9f448023b30ff42d4bda7cc4d5808f5 (patch)
tree2d085591f221d5208c4e7ed0643d22d940bcfa91 /src/math/gfpmath
parent387dddde76c76d6d35a1758b175bda8cb554d08f (diff)
Move contents of gfpmath to numbertheory. Adjust dependencies.
Diffstat (limited to 'src/math/gfpmath')
-rw-r--r--src/math/gfpmath/curve_gfp.h96
-rw-r--r--src/math/gfpmath/info.txt15
-rw-r--r--src/math/gfpmath/point_gfp.cpp423
-rw-r--r--src/math/gfpmath/point_gfp.h201
4 files changed, 0 insertions, 735 deletions
diff --git a/src/math/gfpmath/curve_gfp.h b/src/math/gfpmath/curve_gfp.h
deleted file mode 100644
index 697065dfe..000000000
--- a/src/math/gfpmath/curve_gfp.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Elliptic curves over GF(p)
-*
-* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke
-* 2010 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#ifndef BOTAN_GFP_CURVE_H__
-#define BOTAN_GFP_CURVE_H__
-
-#include <botan/numthry.h>
-#include <botan/reducer.h>
-
-namespace Botan {
-
-/**
-* This class represents an elliptic curve over GF(p)
-*/
-class BOTAN_DLL CurveGFp
- {
- public:
-
- /**
- * 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
- * @param b second coefficient
- */
- CurveGFp(const BigInt& p, const BigInt& a, const BigInt& b) :
- p(p), a(a), b(b), reducer_p(p) {}
-
- // CurveGFp(const CurveGFp& other) = default;
- // CurveGFp& operator=(const CurveGFp& other) = default;
-
- /**
- * Get coefficient a
- * @result coefficient a
- */
- const BigInt& get_a() const { return a; }
-
- /**
- * Get coefficient b
- * @result coefficient b
- */
- const BigInt& get_b() const { return b; }
-
- /**
- * Get prime modulus of the field of the curve
- * @result prime modulus of the field of the curve
- */
- const BigInt& get_p() const { return p; }
-
- const Modular_Reducer& mod_p() const { return reducer_p; }
-
- /**
- * swaps the states of *this and other, does not throw
- * @param other The curve to swap values with
- */
- void swap(CurveGFp& other)
- {
- std::swap(a, other.a);
- std::swap(b, other.b);
- std::swap(p, other.p);
- }
-
- bool operator==(const CurveGFp& other) const
- {
- return (p == other.p && a == other.a && b == other.b);
- }
-
- private:
- BigInt p, a, b;
- Modular_Reducer reducer_p;
- };
-
-inline bool operator!=(const CurveGFp& lhs, const CurveGFp& rhs)
- {
- return !(lhs == rhs);
- }
-
-}
-
-namespace std {
-
-template<> inline
-void swap<Botan::CurveGFp>(Botan::CurveGFp& curve1,
- Botan::CurveGFp& curve2)
- {
- curve1.swap(curve2);
- }
-
-} // namespace std
-
-#endif
diff --git a/src/math/gfpmath/info.txt b/src/math/gfpmath/info.txt
deleted file mode 100644
index 482773cda..000000000
--- a/src/math/gfpmath/info.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-define BIGINT_GFP
-
-<header:public>
-curve_gfp.h
-point_gfp.h
-</header:public>
-
-<source>
-point_gfp.cpp
-</source>
-
-<requires>
-bigint
-numbertheory
-</requires>
diff --git a/src/math/gfpmath/point_gfp.cpp b/src/math/gfpmath/point_gfp.cpp
deleted file mode 100644
index 06c42d18c..000000000
--- a/src/math/gfpmath/point_gfp.cpp
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
-* Arithmetic for point groups of elliptic curves over GF(p)
-*
-* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke
-* 2008-2010 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#include <botan/point_gfp.h>
-#include <botan/numthry.h>
-
-namespace Botan {
-
-namespace {
-
-BigInt decompress_point(bool yMod2,
- const BigInt& x,
- const CurveGFp& curve)
- {
- BigInt xpow3 = x * x * x;
-
- BigInt g = curve.get_a() * x;
- g += xpow3;
- g += curve.get_b();
- g = g % curve.get_p();
-
- BigInt z = ressol(g, curve.get_p());
-
- if(z < 0)
- throw Illegal_Point("error during decompression");
-
- if(z.get_bit(0) != yMod2)
- z = curve.get_p() - z;
-
- return z;
- }
-
-}
-
-// arithmetic operators
-PointGFp& PointGFp::operator+=(const PointGFp& rhs)
- {
- if(rhs.is_zero())
- return *this;
-
- if(is_zero())
- {
- *this = rhs;
- return *this;
- }
-
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt rhs_z2 = mod_p.square(rhs.coord_z);
- BigInt U1 = mod_p.multiply(coord_x, rhs_z2);
- BigInt S1 = mod_p.multiply(coord_y, mod_p.multiply(rhs.coord_z, rhs_z2));
-
- BigInt lhs_z2 = mod_p.square(coord_z);
- BigInt U2 = mod_p.multiply(rhs.coord_x, lhs_z2);
- BigInt S2 = mod_p.multiply(rhs.coord_y, mod_p.multiply(coord_z, lhs_z2));
-
- BigInt H = mod_p.reduce(U2 - U1);
- BigInt r = mod_p.reduce(S2 - S1);
-
- if(H.is_zero())
- {
- if(r.is_zero())
- {
- mult2_in_place();
- return *this;
- }
-
- *this = PointGFp(curve); // setting myself to zero
- return *this;
- }
-
- U2 = mod_p.square(H);
-
- S2 = mod_p.multiply(U2, H);
-
- U2 = mod_p.multiply(U1, U2);
-
- BigInt x = mod_p.reduce(mod_p.square(r) - S2 - mod_p.multiply(2, U2));
- BigInt y = mod_p.reduce(mod_p.multiply(r, (U2-x)) - mod_p.multiply(S1, S2));
- BigInt z = mod_p.multiply(mod_p.multiply(coord_z, rhs.coord_z), H);
-
- coord_x = x;
- coord_y = y;
- coord_z = z;
-
- return *this;
- }
-
-PointGFp& PointGFp::operator-=(const PointGFp& rhs)
- {
- PointGFp minus_rhs = PointGFp(rhs).negate();
-
- if(is_zero())
- *this = minus_rhs;
- else
- *this += minus_rhs;
-
- return *this;
- }
-
-PointGFp& PointGFp::operator*=(const BigInt& scalar)
- {
- if(scalar.abs() <= 2) // special cases for small values
- {
- u32bit value = scalar.abs().to_u32bit();
-
- if(value == 0)
- *this = PointGFp(curve); // set to zero point
- else if(value == 1)
- {
- if(scalar.is_negative())
- this->negate();
- }
- else if(value == 2)
- {
- this->mult2_in_place();
- if(scalar.is_negative())
- this->negate();
- }
-
- return *this;
- }
-
- PointGFp H(this->curve); // create as zero
- PointGFp P(*this);
-
- if(scalar.is_negative())
- P.negate();
-
- for(int i = scalar.bits() - 1; i >= 0; --i)
- {
- H.mult2_in_place();
- if(scalar.get_bit(i))
- H += P;
- }
-
- if(!H.is_zero()) // cannot convert if H == O
- {
- /**
- * Convert H to an equivalent point with z == 1, thus x and y
- * correspond to their affine coordinates
- */
- if(H.coord_z != 1)
- {
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt z_inv = inverse_mod(H.coord_z, curve.get_p());
-
- BigInt z_inv_2 = mod_p.square(z_inv);
-
- H.coord_x = mod_p.multiply(H.coord_x, z_inv_2);
- H.coord_y = mod_p.multiply(H.coord_y, mod_p.multiply(z_inv, z_inv_2));
- H.coord_z = 1;
- }
- }
-
- *this = H;
- return *this;
- }
-
-PointGFp& PointGFp::negate()
- {
- if(!is_zero())
- coord_y = curve.get_p() - coord_y;
-
- return *this;
- }
-
-// *this *= 2
-void PointGFp::mult2_in_place()
- {
- if(is_zero())
- return;
- else if(coord_y.is_zero())
- {
- *this = PointGFp(curve); // setting myself to zero
- return;
- }
-
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt y_2 = mod_p.square(coord_y);
-
- BigInt S = mod_p.multiply(4, mod_p.multiply(coord_x, y_2));
-
- BigInt a_z4 = mod_p.multiply(curve.get_a(),
- mod_p.square(mod_p.square(coord_z)));
-
- BigInt M = mod_p.reduce(a_z4 + 3 * mod_p.square(coord_x));
-
- 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);
-
- y = mod_p.reduce(mod_p.multiply(M, S - x) - U);
-
- z = mod_p.multiply(2, mod_p.multiply(coord_y, coord_z));
-
- coord_x = x;
- coord_y = y;
- coord_z = z;
- }
-
-BigInt PointGFp::get_affine_x() const
- {
- if(is_zero())
- throw Illegal_Transformation("cannot convert to affine");
-
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt z2 = mod_p.square(coord_z);
- return mod_p.multiply(coord_x, inverse_mod(z2, curve.get_p()));
- }
-
-BigInt PointGFp::get_affine_y() const
- {
- if(is_zero())
- throw Illegal_Transformation("cannot convert to affine");
-
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt z3 = mod_p.cube(coord_z);
- 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
- {
- /*
- Is the point still on the curve?? (If everything is correct, the
- point is always on its curve; then the function will return
- silently. If Oskar managed to corrupt this object's state, then it
- will throw an exception.)
- */
-
- if(is_zero())
- return;
-
- const Modular_Reducer& mod_p = curve.mod_p();
-
- BigInt y2 = mod_p.square(coord_y);
- BigInt x3 = mod_p.cube(coord_x);
-
- BigInt ax = mod_p.multiply(coord_x, curve.get_a());
-
- if(coord_z == 1)
- {
- if(mod_p.reduce(x3 + ax + curve.get_b()) != y2)
- throw Illegal_Point("Invalid ECP point: y^2 != x^3 + a*x + b");
- }
-
- BigInt z2 = mod_p.square(coord_z);
- BigInt z3 = mod_p.multiply(coord_z, z2);
-
- BigInt ax_z4 = mod_p.multiply(mod_p.multiply(z3, coord_z), ax);
-
- BigInt b_z6 = mod_p.multiply(curve.get_b(), mod_p.square(z3));
-
- if(y2 != mod_p.reduce(x3 + ax_z4 + b_z6))
- throw Illegal_Point("Invalid ECP point: y^2 != x^3 + a*x*z^4 + b*z^6");
- }
-
-// swaps the states of *this and other, does not throw!
-void PointGFp::swap(PointGFp& other)
- {
- curve.swap(other.curve);
- coord_x.swap(other.coord_x);
- coord_y.swap(other.coord_y);
- coord_z.swap(other.coord_z);
- }
-
-bool PointGFp::operator==(const PointGFp& other) const
- {
- return (coord_x == other.coord_x &&
- coord_y == other.coord_y &&
- coord_z == other.coord_z &&
- 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)
- {
- if(point.is_zero())
- return SecureVector<byte>(1); // single 0 byte
-
- const u32bit p_bytes = point.get_curve().get_p().bytes();
-
- BigInt x = point.get_affine_x();
- BigInt y = point.get_affine_y();
-
- SecureVector<byte> bX = BigInt::encode_1363(x, p_bytes);
- SecureVector<byte> bY = BigInt::encode_1363(y, p_bytes);
-
- if(format == PointGFp::UNCOMPRESSED)
- {
- SecureVector<byte> result(2*p_bytes+1);
- result[0] = 4;
-
- result.copy(1, bX.begin(), p_bytes);
- result.copy(p_bytes+1, bY.begin(), p_bytes);
- return result;
- }
- else if(format == PointGFp::COMPRESSED)
- {
- SecureVector<byte> result(p_bytes+1);
- result[0] = 2;
-
- result.copy(1, bX.begin(), bX.size());
-
- if(y.get_bit(0))
- result[0] |= 1;
-
- return result;
- }
- else if(format == PointGFp::HYBRID)
- {
- SecureVector<byte> result(2*p_bytes+1);
- result[0] = 6;
-
- result.copy(1, bX.begin(), bX.size());
- result.copy(p_bytes+1, bY.begin(), bY.size());
-
- if(y.get_bit(0))
- result[0] |= 1;
-
- return result;
- }
- else
- throw Invalid_Argument("illegal point encoding format specification");
- }
-
-PointGFp OS2ECP(const MemoryRegion<byte>& os, const CurveGFp& curve)
- {
- if(os.size() == 1 && os[0] == 0)
- return PointGFp(curve); // return zero
-
- const byte pc = os[0];
-
- BigInt x, y;
-
- if(pc == 2 || pc == 3)
- {
- //compressed form
- x = BigInt::decode(&os[1], os.size() - 1);
-
- bool yMod2 = ((pc & 0x01) == 1);
- y = decompress_point(yMod2, x, curve);
- }
- else if(pc == 4)
- {
- // uncompressed form
- u32bit l = (os.size() - 1) / 2;
-
- x = BigInt::decode(&os[1], l);
- y = BigInt::decode(&os[l+1], l);
- }
- else if(pc == 6 || pc == 7)
- {
- // hybrid form
- u32bit l = (os.size() - 1) / 2;
-
- x = BigInt::decode(&os[1], l);
- y = BigInt::decode(&os[l+1], l);
-
- bool yMod2 = ((pc & 0x01) == 1);
-
- if(decompress_point(yMod2, x, curve) != y)
- throw Illegal_Point("OS2ECP: Decoding error in hybrid format");
- }
- else
- throw Invalid_Argument("OS2ECP: Unknown format type");
-
- PointGFp result(curve, x, y);
- result.check_invariants();
- return result;
- }
-
-}
diff --git a/src/math/gfpmath/point_gfp.h b/src/math/gfpmath/point_gfp.h
deleted file mode 100644
index 0741b5e56..000000000
--- a/src/math/gfpmath/point_gfp.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
-* Arithmetic for point groups of elliptic curves over GF(p)
-*
-* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke
-* 2008-2010 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#ifndef BOTAN_POINT_GFP_H__
-#define BOTAN_POINT_GFP_H__
-
-#include <botan/curve_gfp.h>
-#include <vector>
-
-namespace Botan {
-
-struct BOTAN_DLL Illegal_Transformation : public Exception
- {
- Illegal_Transformation(const std::string& err =
- "Requested transformation is not possible") :
- Exception(err) {}
- };
-
-struct BOTAN_DLL Illegal_Point : public Exception
- {
- Illegal_Point(const std::string& err = "Malformed ECP point detected") :
- Exception(err) {}
- };
-
-/**
-* This class represents one point on a curve of GF(p)
-*/
-class BOTAN_DLL PointGFp
- {
- public:
- enum Compression_Type {
- UNCOMPRESSED = 0,
- COMPRESSED = 1,
- HYBRID = 2
- };
-
- /**
- * Construct the point O
- * @param curve The base curve
- */
- PointGFp(const CurveGFp& curve) :
- curve(curve), coord_x(0), coord_y(1), coord_z(0) {}
-
- /**
- * Construct a point given its affine coordinates
- * @param curve the base curve
- * @param x affine x coordinate
- * @param y affine y coordinate
- */
- PointGFp(const CurveGFp& curve,
- const BigInt& x, const BigInt& y) :
- curve(curve), coord_x(x), coord_y(y), coord_z(1) {}
-
- /**
- * Construct a point given its jacobian projective coordinates
- * @param curve the base curve
- * @param x jacobian projective x coordinate
- * @param y jacobian projective y coordinate
- * @param z jacobian projective z coordinate
- */
- PointGFp(const CurveGFp& curve,
- const BigInt& x, const BigInt& y, const BigInt& z) :
- curve(curve), coord_x(x), coord_y(y), coord_z(z) {}
-
- //PointGFp(const PointGFp& other) = default;
- //PointGFp& operator=(const PointGFp& other) = default;
-
- /**
- * += Operator
- * @param rhs the PointGFp to add to the local value
- * @result resulting PointGFp
- */
- PointGFp& operator+=(const PointGFp& rhs);
-
- /**
- * -= Operator
- * @param rhs the PointGFp to subtract from the local value
- * @result resulting PointGFp
- */
- PointGFp& operator-=(const PointGFp& rhs);
-
- /**
- * *= Operator
- * This function turns on the the special reduction multiplication
- * itself for fast computation, turns it off again when finished.
- * @param scalar the PointGFp to multiply with *this
- * @result resulting PointGFp
- */
- PointGFp& operator*=(const BigInt& scalar);
-
- /**
- * Negate this point
- * @return *this
- */
- PointGFp& negate();
-
- /**
- * Return base curve of this point
- * @result the curve over GF(p) of this point
- */
- const CurveGFp& get_curve() const { return curve; }
-
- /**
- * get affine x coordinate
- * @result affine x coordinate
- */
- BigInt get_affine_x() const;
-
- /**
- * get affine y coordinate
- * @result affine y coordinate
- */
- BigInt get_affine_y() const;
-
- /**
- * get the jacobian projective x coordinate
- * @result jacobian projective x coordinate
- */
- const BigInt& get_jac_proj_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; }
-
- /**
- * get the jacobian projective z coordinate
- * @result jacobian projective z coordinate
- */
- const BigInt& get_jac_proj_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;
-
- /**
- * Checks whether the point is to be found on the underlying curve.
- * Throws an Invalid_Point exception in case of detecting that the point
- * does not satisfy the curve equation.
- * To be used to ensure against fault attacks.
- */
- void check_invariants() const;
-
- /**
- * swaps the states of *this and other, does not throw!
- * @param other the object to swap values with
- */
- void swap(PointGFp& other);
-
- /**
- * Equality operator
- */
- bool operator==(const PointGFp& other) const;
- private:
- /**
- * Multiply the point by two
- */
- void mult2_in_place();
-
- CurveGFp curve;
- BigInt coord_x, coord_y, coord_z;
- };
-
-// relational operators
-inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs)
- {
- return !(rhs == lhs);
- }
-
-// 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);
-
-PointGFp BOTAN_DLL operator*(const BigInt& scalar, const PointGFp& point);
-PointGFp BOTAN_DLL operator*(const PointGFp& point, const BigInt& scalar);
-
-// encoding and decoding
-SecureVector<byte> BOTAN_DLL EC2OSP(const PointGFp& point, byte format);
-PointGFp BOTAN_DLL OS2ECP(const MemoryRegion<byte>& os, const CurveGFp& curve);
-
-}
-
-namespace std {
-
-template<>
-inline void swap<Botan::PointGFp>(Botan::PointGFp& x, Botan::PointGFp& y)
- { x.swap(y); }
-
-}
-
-#endif