diff options
author | lloyd <[email protected]> | 2010-02-25 03:27:31 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-02-25 03:27:31 +0000 |
commit | c13f576834a52b03b88366cb243da49fc784b284 (patch) | |
tree | 600b5deb1d8445498c1600be5c30bb2a438958f3 /src | |
parent | d4bae68ed363df12ed15e41ba503813343dc896f (diff) |
Change PointGFp to store BigInts instead of GFpElements
Diffstat (limited to 'src')
-rw-r--r-- | src/math/gfpmath/point_gfp.cpp | 121 | ||||
-rw-r--r-- | src/math/gfpmath/point_gfp.h | 12 |
2 files changed, 68 insertions, 65 deletions
diff --git a/src/math/gfpmath/point_gfp.cpp b/src/math/gfpmath/point_gfp.cpp index 6e0e834b9..f9aaf5c3c 100644 --- a/src/math/gfpmath/point_gfp.cpp +++ b/src/math/gfpmath/point_gfp.cpp @@ -41,9 +41,9 @@ BigInt decompress_point(bool yMod2, // construct the point at infinity or a random point PointGFp::PointGFp(const CurveGFp& curve) : curve(curve), - point_x(curve.get_p(), 0), - point_y(curve.get_p(), 1), - point_z(curve.get_p(), 0) + coord_x(0), + coord_y(1), + coord_z(0) { } @@ -53,9 +53,9 @@ PointGFp::PointGFp(const CurveGFp& curve, const BigInt& y, const BigInt& z) : curve(curve), - point_x(curve.get_p(), x), - point_y(curve.get_p(), y), - point_z(curve.get_p(), z) + coord_x(x), + coord_y(y), + coord_z(z) { } @@ -63,9 +63,9 @@ PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : curve(curve), - point_x(curve.get_p(), x), - point_y(curve.get_p(), y), - point_z(curve.get_p(), 1) + coord_x(x), + coord_y(y), + coord_z(1) { } @@ -81,19 +81,19 @@ PointGFp& PointGFp::operator+=(const PointGFp& rhs) return *this; } - GFpElement U1 = point_x; - GFpElement S1 = point_y; + GFpElement U1 = point_x(); + GFpElement S1 = point_y(); - GFpElement rhs_z2 = rhs.point_z * rhs.point_z; + GFpElement rhs_z2 = rhs.point_z() * rhs.point_z(); U1 *= rhs_z2; - S1 *= rhs_z2 * rhs.point_z; + S1 *= rhs_z2 * rhs.point_z(); - GFpElement U2 = rhs.point_x; - GFpElement S2 = rhs.point_y; + GFpElement U2 = rhs.point_x(); + GFpElement S2 = rhs.point_y(); - GFpElement lhs_z2 = point_z * point_z; + GFpElement lhs_z2 = point_z() * point_z(); U2 *= lhs_z2; - S2 *= lhs_z2 * point_z; + S2 *= lhs_z2 * point_z(); GFpElement H(U2 - U1); GFpElement r(S2 - S1); @@ -122,11 +122,11 @@ PointGFp& PointGFp::operator+=(const PointGFp& rhs) GFpElement y(r * (U2-x) - z); - z = (point_z * rhs.point_z) * H; + z = (point_z() * rhs.point_z()) * H; - point_x = x; - point_y = y; - point_z = z; + coord_x = x.get_value(); + coord_y = y.get_value(); + coord_z = z.get_value(); return *this; } @@ -185,7 +185,7 @@ PointGFp& PointGFp::operator*=(const BigInt& scalar) PointGFp& PointGFp::negate() { if(!is_zero()) - point_y.negate(); + coord_y = curve.get_p() - coord_y; return *this; } @@ -195,15 +195,15 @@ PointGFp& PointGFp::mult2_in_place() { if(is_zero()) return *this; - else if(point_y.is_zero()) + else if(coord_y.is_zero()) { *this = PointGFp(curve); // setting myself to zero return *this; } - GFpElement Y_squared = point_y*point_y; + GFpElement Y_squared = point_y()*point_y(); - GFpElement S = point_x * Y_squared; + GFpElement S = point_x() * Y_squared; GFpElement x = S + S; @@ -211,11 +211,11 @@ PointGFp& PointGFp::mult2_in_place() GFpElement a_z4 = curve.get_a(); - GFpElement z2 = point_z * point_z; + GFpElement z2 = point_z() * point_z(); a_z4 *= z2; a_z4 *= z2; - GFpElement y(point_x * point_x); + GFpElement y(point_x() * point_x()); GFpElement M(y + y + y + a_z4); @@ -231,13 +231,13 @@ PointGFp& PointGFp::mult2_in_place() y = M * (S - x) - U; - z = point_y * point_z; + z = point_y() * point_z(); z = z + z; - point_x = x; - point_y = y; - point_z = z; + coord_x = x.get_value(); + coord_y = y.get_value(); + coord_z = z.get_value(); return *this; } @@ -260,20 +260,21 @@ PointGFp PointGFp::get_z_to_one() */ const PointGFp& PointGFp::set_z_to_one() { - if(point_z.is_zero()) + if(coord_z.is_zero()) throw Illegal_Transformation("cannot convert Z to one"); - if(point_z.get_value() != 1) + if(coord_z != 1) { // Converts to affine coordinates - GFpElement z = inverse(point_z); + GFpElement z = inverse(point_z()); GFpElement z2 = z * z; z *= z2; - GFpElement x = point_x * z2; - GFpElement y = point_y * z; - point_z = GFpElement(curve.get_p(), BigInt(1)); - point_x = x; - point_y = y; + GFpElement x = point_x() * z2; + GFpElement y = point_y() * z; + + coord_x = x.get_value(); + coord_y = y.get_value(); + coord_z = 1; } return *this; @@ -284,9 +285,9 @@ BigInt PointGFp::get_affine_x() const if(is_zero()) throw Illegal_Transformation("cannot convert to affine"); - GFpElement z2 = point_z * point_z; + GFpElement z2 = point_z() * point_z(); z2.inverse_in_place(); - z2 *= point_x; + z2 *= point_x(); return z2.get_value(); } @@ -296,9 +297,9 @@ BigInt PointGFp::get_affine_y() const if(is_zero()) throw Illegal_Transformation("cannot convert to affine"); - GFpElement z3 = point_z * point_z * point_z; + GFpElement z3 = point_z() * point_z() * point_z(); z3.inverse_in_place(); - z3 *= point_y; + z3 *= point_y(); return z3.get_value(); } @@ -306,7 +307,7 @@ BigInt PointGFp::get_affine_y() const // Is this the point at infinity? bool PointGFp::is_zero() const { - return(point_x.is_zero() && point_z.is_zero()); + return(coord_x.is_zero() && coord_z.is_zero()); } void PointGFp::check_invariants() const @@ -321,20 +322,20 @@ void PointGFp::check_invariants() const if(is_zero()) return; - const GFpElement y2 = point_y * point_y; - const GFpElement x3 = point_x * point_x * point_x; + const GFpElement y2 = point_y() * point_y(); + const GFpElement x3 = point_x() * point_x() * point_x(); - if(point_z.get_value() == BigInt(1)) + if(coord_z == BigInt(1)) { - GFpElement ax = curve.get_a() * point_x; + GFpElement ax = curve.get_a() * point_x(); if(y2 != (x3 + ax + curve.get_b())) throw Illegal_Point(); } - GFpElement Zpow2 = point_z * point_z; - GFpElement Zpow3 = Zpow2 * point_z; - GFpElement AZpow4 = Zpow3 * point_z * curve.get_a(); - const GFpElement aXZ4 = AZpow4 * point_x; + GFpElement Zpow2 = point_z() * point_z(); + GFpElement Zpow3 = Zpow2 * point_z(); + GFpElement AZpow4 = Zpow3 * point_z() * curve.get_a(); + const GFpElement aXZ4 = AZpow4 * point_x(); const GFpElement bZ6 = curve.get_b() * Zpow3 * Zpow3; if(y2 != (x3 + aXZ4 + bZ6)) @@ -345,9 +346,9 @@ void PointGFp::check_invariants() const void PointGFp::swap(PointGFp& other) { curve.swap(other.curve); - point_x.swap(other.point_x); - point_y.swap(other.point_y); - point_z.swap(other.point_z); + 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 @@ -355,9 +356,9 @@ bool PointGFp::operator==(const PointGFp& other) const if(get_curve() != other.get_curve()) return false; - return (point_x == other.point_x && - point_y == other.point_y && - point_z == other.point_z); + return (coord_x == other.coord_x && + coord_y == other.coord_y && + coord_z == other.coord_z); } // arithmetic operators @@ -396,9 +397,7 @@ SecureVector<byte> EC2OSP(const PointGFp& point, byte format) if(point.is_zero()) return SecureVector<byte>(1); // single 0 byte - const u32bit p_bits = point.get_curve().get_p().bits(); - - u32bit p_bytes = point.get_curve().get_p().bytes(); + const u32bit p_bytes = point.get_curve().get_p().bytes(); BigInt x = point.get_affine_x(); BigInt y = point.get_affine_y(); diff --git a/src/math/gfpmath/point_gfp.h b/src/math/gfpmath/point_gfp.h index 6c4b012c5..2da4b0506 100644 --- a/src/math/gfpmath/point_gfp.h +++ b/src/math/gfpmath/point_gfp.h @@ -134,19 +134,19 @@ class BOTAN_DLL PointGFp * get the jacobian projective x coordinate * @result jacobian projective x coordinate */ - const BigInt& get_jac_proj_x() const { return point_x.get_value(); } + 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 point_y.get_value(); } + 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 point_z.get_value(); } + const BigInt& get_jac_proj_z() const { return coord_z; } /** * Is this the point at infinity? @@ -173,8 +173,12 @@ class BOTAN_DLL PointGFp */ bool operator==(const PointGFp& other) const; private: + GFpElement point_x() const { return GFpElement(curve.get_p(), coord_x); } + GFpElement point_y() const { return GFpElement(curve.get_p(), coord_y); } + GFpElement point_z() const { return GFpElement(curve.get_p(), coord_z); } + CurveGFp curve; - GFpElement point_x, point_y, point_z; + BigInt coord_x, coord_y, coord_z; }; // relational operators |