/usr/include/botan-1.10/botan/curve_gfp.h is in libbotan1.10-dev 1.10.12-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | /*
* Elliptic curves over GF(p)
*
* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke
* 2010-2011 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
#ifndef BOTAN_GFP_CURVE_H__
#define BOTAN_GFP_CURVE_H__
#include <botan/numthry.h>
namespace Botan {
/**
* This class represents an elliptic curve over GF(p)
*/
class BOTAN_DLL CurveGFp
{
public:
/**
* Create an uninitialized CurveGFp
*/
CurveGFp() : p_words(0), p_dash(0) {}
/**
* 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), p_words(p.sig_words())
{
BigInt r(BigInt::Power2, p_words * BOTAN_MP_WORD_BITS);
p_dash = (((r * inverse_mod(r, p)) - 1) / p).word_at(0);
r2 = (r * r) % p;
a_r = (a * r) % p;
b_r = (b * r) % p;
}
// CurveGFp(const CurveGFp& other) = default;
// CurveGFp& operator=(const CurveGFp& other) = default;
/**
* @return curve coefficient a
*/
const BigInt& get_a() const { return a; }
/**
* @return curve coefficient b
*/
const BigInt& get_b() const { return b; }
/**
* Get prime modulus of the field of the curve
* @return prime modulus of the field of the curve
*/
const BigInt& get_p() const { return p; }
/**
* @return Montgomery parameter r^2 % p
*/
const BigInt& get_r2() const { return r2; }
/**
* @return a * r mod p
*/
const BigInt& get_a_r() const { return a_r; }
/**
* @return b * r mod p
*/
const BigInt& get_b_r() const { return b_r; }
/**
* @return Montgomery parameter p-dash
*/
word get_p_dash() const { return p_dash; }
/**
* @return p.sig_words()
*/
size_t get_p_words() const { return p_words; }
/**
* swaps the states of *this and other, does not throw
* @param other curve to swap values with
*/
void swap(CurveGFp& other)
{
std::swap(p, other.p);
std::swap(a, other.a);
std::swap(b, other.b);
std::swap(a_r, other.a_r);
std::swap(b_r, other.b_r);
std::swap(p_words, other.p_words);
std::swap(r2, other.r2);
std::swap(p_dash, other.p_dash);
}
/**
* Equality operator
* @param other curve to compare with
* @return true iff this is the same curve as other
*/
bool operator==(const CurveGFp& other) const
{
/*
Relies on choice of R, but that is fixed by constructor based
on size of p
*/
return (p == other.p && a_r == other.a_r && b_r == other.b_r);
}
private:
// Curve parameters
BigInt p, a, b;
size_t p_words; // cache of p.sig_words()
// Montgomery parameters
BigInt r2, a_r, b_r;
word p_dash;
};
/**
* Equality operator
* @param lhs a curve
* @param rhs a curve
* @return true iff lhs is not the same as rhs
*/
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
|