aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/math/gfpmath/point_gfp.cpp28
-rw-r--r--src/math/gfpmath/point_gfp.h4
-rw-r--r--src/pubkey/ecdsa/ecdsa_op.cpp6
-rw-r--r--src/pubkey/eckaeg/eckaeg_op.cpp14
-rw-r--r--src/pubkey/gost_3410/gost_3410.cpp10
5 files changed, 35 insertions, 27 deletions
diff --git a/src/math/gfpmath/point_gfp.cpp b/src/math/gfpmath/point_gfp.cpp
index e32cd14d8..f76853085 100644
--- a/src/math/gfpmath/point_gfp.cpp
+++ b/src/math/gfpmath/point_gfp.cpp
@@ -278,22 +278,28 @@ const PointGFp& PointGFp::set_z_to_one()
return *this;
}
-GFpElement PointGFp::get_affine_x() const
+BigInt PointGFp::get_affine_x() const
{
if(is_zero())
throw Illegal_Transformation("cannot convert to affine");
GFpElement z2 = mZ * mZ;
- return mX * z2.inverse_in_place();
+ z2.inverse_in_place();
+ z2 *= mX;
+
+ return z2.get_value();
}
-GFpElement PointGFp::get_affine_y() const
+BigInt PointGFp::get_affine_y() const
{
if(is_zero())
throw Illegal_Transformation("cannot convert to affine");
GFpElement z3 = mZ * mZ * mZ;
- return mY * z3.inverse_in_place();
+ z3.inverse_in_place();
+ z3 *= mY;
+
+ return z3.get_value();
}
// Is this the point at infinity?
@@ -385,7 +391,7 @@ PointGFp operator*(const PointGFp& point, const BigInt& scalar)
SecureVector<byte> EC2OSP(const PointGFp& point, byte format)
{
if(format == PointGFp::UNCOMPRESSED)
- return result = encode_uncompressed(point);
+ return encode_uncompressed(point);
else if(format == PointGFp::COMPRESSED)
return encode_compressed(point);
else if(format == PointGFp::HYBRID)
@@ -412,10 +418,10 @@ SecureVector<byte> encode_compressed(const PointGFp& point)
l /= 8;
SecureVector<byte> result (l+1);
result[0] = 2;
- BigInt x = point.get_affine_x().get_value();
+ BigInt x = point.get_affine_x();
SecureVector<byte> bX = BigInt::encode_1363(x, l);
result.copy(1, bX.begin(), bX.size());
- BigInt y = point.get_affine_y().get_value();
+ BigInt y = point.get_affine_y();
if(y.get_bit(0))
{
result[0] |= 1;
@@ -440,8 +446,8 @@ SecureVector<byte> encode_uncompressed(const PointGFp& point)
l /= 8;
SecureVector<byte> result (2*l+1);
result[0] = 4;
- BigInt x = point.get_affine_x().get_value();
- BigInt y = point.get_affine_y().get_value();
+ BigInt x = point.get_affine_x();
+ BigInt y = point.get_affine_y();
SecureVector<byte> bX = BigInt::encode_1363(x, l);
SecureVector<byte> bY = BigInt::encode_1363(y, l);
result.copy(1, bX.begin(), l);
@@ -467,8 +473,8 @@ SecureVector<byte> encode_hybrid(const PointGFp& point)
l /= 8;
SecureVector<byte> result (2*l+1);
result[0] = 6;
- BigInt x = point.get_affine_x().get_value();
- BigInt y = point.get_affine_y().get_value();
+ BigInt x = point.get_affine_x();
+ BigInt y = point.get_affine_y();
SecureVector<byte> bX = BigInt::encode_1363(x, l);
SecureVector<byte> bY = BigInt::encode_1363(y, l);
result.copy(1, bX.begin(), bX.size());
diff --git a/src/math/gfpmath/point_gfp.h b/src/math/gfpmath/point_gfp.h
index 9c67ae53c..9f29896cb 100644
--- a/src/math/gfpmath/point_gfp.h
+++ b/src/math/gfpmath/point_gfp.h
@@ -121,13 +121,13 @@ class BOTAN_DLL PointGFp
* get affine x coordinate
* @result affine x coordinate
*/
- GFpElement get_affine_x() const;
+ BigInt get_affine_x() const;
/**
* get affine y coordinate
* @result affine y coordinate
*/
- GFpElement get_affine_y() const;
+ BigInt get_affine_y() const;
/**
* get the jacobian projective x coordinate
diff --git a/src/pubkey/ecdsa/ecdsa_op.cpp b/src/pubkey/ecdsa/ecdsa_op.cpp
index d37809962..0fb9fc564 100644
--- a/src/pubkey/ecdsa/ecdsa_op.cpp
+++ b/src/pubkey/ecdsa/ecdsa_op.cpp
@@ -1,7 +1,7 @@
/*
* ECDSA Operation
* (C) 2007 FlexSecure GmbH
-* 2008-2009 Jack Lloyd
+* 2008-2010 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
@@ -44,7 +44,7 @@ bool Default_ECDSA_Op::verify(const byte msg[], u32bit msg_len,
if(R.is_zero())
return false;
- BigInt x = R.get_affine_x().get_value();
+ BigInt x = R.get_affine_x();
return (x % n == r);
}
@@ -64,7 +64,7 @@ SecureVector<byte> Default_ECDSA_Op::sign(const byte msg[], u32bit msg_len,
PointGFp k_times_P = dom_pars.get_base_point() * k;
k_times_P.check_invariants();
- BigInt r = k_times_P.get_affine_x().get_value() % n;
+ BigInt r = k_times_P.get_affine_x() % n;
if(r == 0)
throw Internal_Error("Default_ECDSA_Op::sign: r was zero");
diff --git a/src/pubkey/eckaeg/eckaeg_op.cpp b/src/pubkey/eckaeg/eckaeg_op.cpp
index 1af5cb165..4fb0a23eb 100644
--- a/src/pubkey/eckaeg/eckaeg_op.cpp
+++ b/src/pubkey/eckaeg/eckaeg_op.cpp
@@ -1,7 +1,7 @@
/*
* ECKAEG Operation
* (C) 2007 FlexSecure GmbH
-* 2008 Jack Lloyd
+* 2008-2010 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
@@ -22,16 +22,18 @@ Default_ECKAEG_Op::Default_ECKAEG_Op(const EC_Domain_Params& dom_pars,
SecureVector<byte> Default_ECKAEG_Op::agree(const PointGFp& i) const
{
- BigInt cofactor(m_dom_pars.get_cofactor());
+ BigInt cofactor = m_dom_pars.get_cofactor();
BigInt n = m_dom_pars.get_order();
- BigInt l(inverse_mod(cofactor,n)); // l=h^-1 mod n
- PointGFp Q(cofactor*i); // q = h*Pb
- PointGFp S(Q);
+ BigInt l = inverse_mod(cofactor, n);
+
+ PointGFp S = cofactor * i;
S *= (m_priv_key * l) % n;
S.check_invariants();
- return FE2OSP(S.get_affine_x()); // fe2os(xs)
+
+ return BigInt::encode_1363(S.get_affine_x(),
+ S.get_curve().get_p().bytes());
}
}
diff --git a/src/pubkey/gost_3410/gost_3410.cpp b/src/pubkey/gost_3410/gost_3410.cpp
index bb68e2b8d..24e078dca 100644
--- a/src/pubkey/gost_3410/gost_3410.cpp
+++ b/src/pubkey/gost_3410/gost_3410.cpp
@@ -2,7 +2,7 @@
* GOST 34.10-2001 implemenation
* (C) 2007 Falko Strenzke, FlexSecure GmbH
* Manuel Hartl, FlexSecure GmbH
-* (C) 2008-2009 Jack Lloyd
+* (C) 2008-2010 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
@@ -72,8 +72,8 @@ X509_Encoder* GOST_3410_PublicKey::x509_encoder() const
key->affirm_init();
// Trust CryptoPro to come up with something obnoxious
- const BigInt x = key->mp_public_point->get_affine_x().get_value();
- const BigInt y = key->mp_public_point->get_affine_y().get_value();
+ const BigInt x = key->mp_public_point->get_affine_x();
+ const BigInt y = key->mp_public_point->get_affine_y();
SecureVector<byte> bits(2*std::max(x.bytes(), y.bytes()));
@@ -234,7 +234,7 @@ bool GOST_3410_PublicKey::verify(const byte msg[], u32bit msg_len,
PointGFp R = (z1 * mp_dom_pars->get_base_point() + z2 * *mp_public_point);
- return (R.get_affine_x().get_value() == r);
+ return (R.get_affine_x() == r);
}
GOST_3410_PublicKey::GOST_3410_PublicKey(const EC_Domain_Params& dom_par,
@@ -333,7 +333,7 @@ GOST_3410_PrivateKey::sign(const byte msg[],
PointGFp k_times_P = mp_dom_pars->get_base_point() * k;
k_times_P.check_invariants();
- BigInt r = k_times_P.get_affine_x().get_value() % n;
+ BigInt r = k_times_P.get_affine_x() % n;
if(r == 0)
throw Internal_Error("GOST_3410::sign: r was zero");