diff options
Diffstat (limited to 'src/libs/3rdparty/botan/src/lib/pubkey/ec_group/point_gfp.h')
-rw-r--r-- | src/libs/3rdparty/botan/src/lib/pubkey/ec_group/point_gfp.h | 444 |
1 files changed, 0 insertions, 444 deletions
diff --git a/src/libs/3rdparty/botan/src/lib/pubkey/ec_group/point_gfp.h b/src/libs/3rdparty/botan/src/lib/pubkey/ec_group/point_gfp.h deleted file mode 100644 index fa447bf87a..0000000000 --- a/src/libs/3rdparty/botan/src/lib/pubkey/ec_group/point_gfp.h +++ /dev/null @@ -1,444 +0,0 @@ -/* -* Point arithmetic on elliptic curves over GF(p) -* -* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke -* 2008-2011,2014,2015 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_POINT_GFP_H_ -#define BOTAN_POINT_GFP_H_ - -#include <botan/curve_gfp.h> -#include <botan/exceptn.h> -#include <vector> - -namespace Botan { - -/** -* Exception thrown if you try to convert a zero point to an affine -* coordinate -*/ -class BOTAN_PUBLIC_API(2,0) Illegal_Transformation final : public Exception - { - public: - explicit Illegal_Transformation(const std::string& err = - "Requested transformation is not possible") : - Exception(err) {} - }; - -/** -* Exception thrown if some form of illegal point is decoded -*/ -class BOTAN_PUBLIC_API(2,0) Illegal_Point final : public Exception - { - public: - explicit 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_PUBLIC_API(2,0) PointGFp final - { - public: - enum Compression_Type { - UNCOMPRESSED = 0, - COMPRESSED = 1, - HYBRID = 2 - }; - - enum { WORKSPACE_SIZE = 8 }; - - /** - * Construct an uninitialized PointGFp - */ - PointGFp() = default; - - /** - * Construct the zero point - * @param curve The base curve - */ - explicit PointGFp(const CurveGFp& curve); - - /** - * Copy constructor - */ - PointGFp(const PointGFp&) = default; - - /** - * Move Constructor - */ - PointGFp(PointGFp&& other) - { - this->swap(other); - } - - /** - * Standard Assignment - */ - PointGFp& operator=(const PointGFp&) = default; - - /** - * Move Assignment - */ - PointGFp& operator=(PointGFp&& other) - { - if(this != &other) - this->swap(other); - return (*this); - } - - /** - * Construct a point from 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); - - /** - * EC2OSP - elliptic curve to octet string primitive - * @param format which format to encode using - */ - std::vector<uint8_t> encode(PointGFp::Compression_Type format) const; - - /** - * += 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 - * @param scalar the PointGFp to multiply with *this - * @result resulting PointGFp - */ - PointGFp& operator*=(const BigInt& scalar); - - /** - * Negate this point - * @return *this - */ - PointGFp& negate() - { - if(!is_zero()) - m_coord_y = m_curve.get_p() - m_coord_y; - return *this; - } - - /** - * 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; - - const BigInt& get_x() const { return m_coord_x; } - const BigInt& get_y() const { return m_coord_y; } - const BigInt& get_z() const { return m_coord_z; } - - void swap_coords(BigInt& new_x, BigInt& new_y, BigInt& new_z) - { - m_coord_x.swap(new_x); - m_coord_y.swap(new_y); - m_coord_z.swap(new_z); - } - - /** - * Force this point to affine coordinates - */ - void force_affine(); - - /** - * Force all points on the list to affine coordinates - */ - static void force_all_affine(std::vector<PointGFp>& points, - secure_vector<word>& ws); - - bool is_affine() const; - - /** - * Is this the point at infinity? - * @result true, if this point is at infinity, false otherwise. - */ - bool is_zero() const - { return (m_coord_x.is_zero() && m_coord_z.is_zero()); } - - /** - * Checks whether the point is to be found on the underlying - * curve; used to prevent fault attacks. - * @return if the point is on the curve - */ - bool on_the_curve() const; - - /** - * swaps the states of *this and other, does not throw! - * @param other the object to swap values with - */ - void swap(PointGFp& other); - - /** - * Randomize the point representation - * The actual value (get_affine_x, get_affine_y) does not change - */ - void randomize_repr(RandomNumberGenerator& rng); - - /** - * Randomize the point representation - * The actual value (get_affine_x, get_affine_y) does not change - */ - void randomize_repr(RandomNumberGenerator& rng, secure_vector<word>& ws); - - /** - * Equality operator - */ - bool operator==(const PointGFp& other) const; - - /** - * Point addition - * @param other the point to add to *this - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void add(const PointGFp& other, std::vector<BigInt>& workspace) - { - BOTAN_ASSERT_NOMSG(m_curve == other.m_curve); - - const size_t p_words = m_curve.get_p_words(); - - add(other.m_coord_x.data(), std::min(p_words, other.m_coord_x.size()), - other.m_coord_y.data(), std::min(p_words, other.m_coord_y.size()), - other.m_coord_z.data(), std::min(p_words, other.m_coord_z.size()), - workspace); - } - - /** - * Point addition. Array version. - * - * @param x_words the words of the x coordinate of the other point - * @param x_size size of x_words - * @param y_words the words of the y coordinate of the other point - * @param y_size size of y_words - * @param z_words the words of the z coordinate of the other point - * @param z_size size of z_words - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void add(const word x_words[], size_t x_size, - const word y_words[], size_t y_size, - const word z_words[], size_t z_size, - std::vector<BigInt>& workspace); - - /** - * Point addition - mixed J+A - * @param other affine point to add - assumed to be affine! - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void add_affine(const PointGFp& other, std::vector<BigInt>& workspace) - { - BOTAN_ASSERT_NOMSG(m_curve == other.m_curve); - BOTAN_DEBUG_ASSERT(other.is_affine()); - - const size_t p_words = m_curve.get_p_words(); - add_affine(other.m_coord_x.data(), std::min(p_words, other.m_coord_x.size()), - other.m_coord_y.data(), std::min(p_words, other.m_coord_y.size()), - workspace); - } - - /** - * Point addition - mixed J+A. Array version. - * - * @param x_words the words of the x coordinate of the other point - * @param x_size size of x_words - * @param y_words the words of the y coordinate of the other point - * @param y_size size of y_words - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void add_affine(const word x_words[], size_t x_size, - const word y_words[], size_t y_size, - std::vector<BigInt>& workspace); - - /** - * Point doubling - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void mult2(std::vector<BigInt>& workspace); - - /** - * Repeated point doubling - * @param i number of doublings to perform - * @param workspace temp space, at least WORKSPACE_SIZE elements - */ - void mult2i(size_t i, std::vector<BigInt>& workspace); - - /** - * Point addition - * @param other the point to add to *this - * @param workspace temp space, at least WORKSPACE_SIZE elements - * @return other plus *this - */ - PointGFp plus(const PointGFp& other, std::vector<BigInt>& workspace) const - { - PointGFp x = (*this); - x.add(other, workspace); - return x; - } - - /** - * Point doubling - * @param workspace temp space, at least WORKSPACE_SIZE elements - * @return *this doubled - */ - PointGFp double_of(std::vector<BigInt>& workspace) const - { - PointGFp x = (*this); - x.mult2(workspace); - return x; - } - - /** - * Return the zero (aka infinite) point associated with this curve - */ - PointGFp zero() const { return PointGFp(m_curve); } - - /** - * Return base curve of this point - * @result the curve over GF(p) of this point - * - * You should not need to use this - */ - const CurveGFp& get_curve() const { return m_curve; } - - private: - CurveGFp m_curve; - BigInt m_coord_x, m_coord_y, m_coord_z; - }; - -/** -* Point multiplication operator -* @param scalar the scalar value -* @param point the point value -* @return scalar*point on the curve -*/ -BOTAN_PUBLIC_API(2,0) PointGFp operator*(const BigInt& scalar, const PointGFp& point); - -/** -* ECC point multiexponentiation - not constant time! -* @param p1 a point -* @param z1 a scalar -* @param p2 a point -* @param z2 a scalar -* @result (p1 * z1 + p2 * z2) -*/ -BOTAN_PUBLIC_API(2,0) PointGFp multi_exponentiate( - const PointGFp& p1, const BigInt& z1, - const PointGFp& p2, const BigInt& z2); - -// relational operators -inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs) - { - return !(rhs == lhs); - } - -// arithmetic operators -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; - } - -inline PointGFp operator-(const PointGFp& lhs, const PointGFp& rhs) - { - PointGFp tmp(lhs); - return tmp -= rhs; - } - -inline PointGFp operator*(const PointGFp& point, const BigInt& scalar) - { - return scalar * point; - } - -// encoding and decoding -inline secure_vector<uint8_t> BOTAN_DEPRECATED("Use PointGFp::encode") - EC2OSP(const PointGFp& point, uint8_t format) - { - std::vector<uint8_t> enc = point.encode(static_cast<PointGFp::Compression_Type>(format)); - return secure_vector<uint8_t>(enc.begin(), enc.end()); - } - -/** -* Perform point decoding -* Use EC_Group::OS2ECP instead -*/ -PointGFp BOTAN_PUBLIC_API(2,0) OS2ECP(const uint8_t data[], size_t data_len, - const CurveGFp& curve); - -/** -* Perform point decoding -* Use EC_Group::OS2ECP instead -* -* @param data the encoded point -* @param data_len length of data in bytes -* @param curve_p the curve equation prime -* @param curve_a the curve equation a parameter -* @param curve_b the curve equation b parameter -*/ -std::pair<BigInt, BigInt> BOTAN_UNSTABLE_API OS2ECP(const uint8_t data[], size_t data_len, - const BigInt& curve_p, - const BigInt& curve_a, - const BigInt& curve_b); - -template<typename Alloc> -PointGFp OS2ECP(const std::vector<uint8_t, Alloc>& data, const CurveGFp& curve) - { return OS2ECP(data.data(), data.size(), curve); } - -class PointGFp_Var_Point_Precompute; - -/** -* Deprecated API for point multiplication -* Use EC_Group::blinded_base_point_multiply or EC_Group::blinded_var_point_multiply -*/ -class BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("See comments") Blinded_Point_Multiply final - { - public: - Blinded_Point_Multiply(const PointGFp& base, const BigInt& order, size_t h = 0); - - ~Blinded_Point_Multiply(); - - PointGFp blinded_multiply(const BigInt& scalar, RandomNumberGenerator& rng); - private: - std::vector<BigInt> m_ws; - const BigInt& m_order; - std::unique_ptr<PointGFp_Var_Point_Precompute> m_point_mul; - }; - -} - -namespace std { - -template<> -inline void swap<Botan::PointGFp>(Botan::PointGFp& x, Botan::PointGFp& y) - { x.swap(y); } - -} - -#endif |