/* * ECC Domain Parameters * * (C) 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECC_DOMAIN_PARAMETERS_H__ #define BOTAN_ECC_DOMAIN_PARAMETERS_H__ #include #include #include namespace Botan { /** * This class represents elliptic curce domain parameters */ enum EC_Group_Encoding { EC_DOMPAR_ENC_EXPLICIT = 0, EC_DOMPAR_ENC_IMPLICITCA = 1, EC_DOMPAR_ENC_OID = 2 }; /** * Class representing an elliptic curve */ class BOTAN_DLL EC_Group { public: /** * Construct Domain paramers from specified parameters * @param curve elliptic curve * @param base_point a base point * @param order the order of the base point * @param cofactor the cofactor */ EC_Group(const CurveGFp& curve, const PointGFp& base_point, const BigInt& order, const BigInt& cofactor) : m_curve(curve), m_base_point(base_point), m_order(order), m_cofactor(cofactor), m_oid("") {} /** * Decode a BER encoded ECC domain parameter set * @param ber_encoding the bytes of the BER encoding */ explicit EC_Group(const std::vector& ber_encoding); /** * Create an EC domain by OID (or throw if unknown) * @param oid the OID of the EC domain to create */ explicit EC_Group(const OID& oid); /** * Create an EC domain from PEM encoding (as from PEM_encode), or * from an OID name (eg "secp256r1", or "1.2.840.10045.3.1.7") * @param pem_or_oid PEM-encoded data, or an OID */ EC_Group(const std::string& pem_or_oid = ""); /** * Create the DER encoding of this domain * @param form of encoding to use * @returns bytes encododed as DER */ std::vector DER_encode(EC_Group_Encoding form) const; /** * Return the PEM encoding (always in explicit form) * @return string containing PEM data */ std::string PEM_encode() const; /** * Return domain parameter curve * @result domain parameter curve */ const CurveGFp& get_curve() const { return m_curve; } /** * Return group base point * @result base point */ const PointGFp& get_base_point() const { return m_base_point; } /** * Return the order of the base point * @result order of the base point */ const BigInt& get_order() const { return m_order; } /** * Return the cofactor * @result the cofactor */ const BigInt& get_cofactor() const { return m_cofactor; } bool initialized() const { return !m_base_point.is_zero(); } /** * Return the OID of these domain parameters * @result the OID */ std::string get_oid() const { return m_oid; } /** * Verify EC_Group domain * @returns true if group is valid. false otherwise */ bool verify_group(RandomNumberGenerator& rng, bool strong = false) const; bool operator==(const EC_Group& other) const { return ((get_curve() == other.get_curve()) && (get_base_point() == other.get_base_point()) && (get_order() == other.get_order()) && (get_cofactor() == other.get_cofactor())); } /** * Return PEM representation of named EC group */ static std::string PEM_for_named_group(const std::string& name); private: CurveGFp m_curve; PointGFp m_base_point; BigInt m_order, m_cofactor; std::string m_oid; }; inline bool operator!=(const EC_Group& lhs, const EC_Group& rhs) { return !(lhs == rhs); } // For compatibility with 1.8 typedef EC_Group EC_Domain_Params; } #endif