bool PointGFp::operator==(const PointGFp& other) const { if(m_curve != other.m_curve) return false; // If this is zero, only equal if other is also zero if(is_zero()) return other.is_zero(); return (get_affine_x() == other.get_affine_x() && get_affine_y() == other.get_affine_y()); }
// encoding and decoding secure_vector<uint8_t> EC2OSP(const PointGFp& point, uint8_t format) { if(point.is_zero()) return secure_vector<uint8_t>(1); // single 0 byte const size_t p_bytes = point.get_curve().get_p().bytes(); BigInt x = point.get_affine_x(); BigInt y = point.get_affine_y(); secure_vector<uint8_t> bX = BigInt::encode_1363(x, p_bytes); secure_vector<uint8_t> bY = BigInt::encode_1363(y, p_bytes); if(format == PointGFp::UNCOMPRESSED) { secure_vector<uint8_t> result; result.push_back(0x04); result += bX; result += bY; return result; } else if(format == PointGFp::COMPRESSED) { secure_vector<uint8_t> result; result.push_back(0x02 | static_cast<uint8_t>(y.get_bit(0))); result += bX; return result; } else if(format == PointGFp::HYBRID) { secure_vector<uint8_t> result; result.push_back(0x06 | static_cast<uint8_t>(y.get_bit(0))); result += bX; result += bY; return result; } else throw Invalid_Argument("EC2OSP illegal point encoding"); }