@@ -1790,6 +1790,21 @@ BIOPointer EVPKeyPointer::derPublicKey() const {
17901790 return bio;
17911791}
17921792
1793+ bool EVPKeyPointer::assign (const ECKeyPointer& eckey) {
1794+ if (!pkey_ || !eckey) return {};
1795+ return EVP_PKEY_assign_EC_KEY (pkey_.get (), eckey.get ());
1796+ }
1797+
1798+ bool EVPKeyPointer::set (const ECKeyPointer& eckey) {
1799+ if (!pkey_ || !eckey) return false ;
1800+ return EVP_PKEY_set1_EC_KEY (pkey_.get (), eckey);
1801+ }
1802+
1803+ EVPKeyPointer::operator const EC_KEY*() const {
1804+ if (!pkey_) return nullptr ;
1805+ return EVP_PKEY_get0_EC_KEY (pkey_.get ());
1806+ }
1807+
17931808namespace {
17941809EVPKeyPointer::ParseKeyResult TryParsePublicKeyInner (const BIOPointer& bp,
17951810 const char * name,
@@ -2749,4 +2764,109 @@ bool ECPointPointer::mul(const EC_GROUP* group, const BIGNUM* priv_key) {
27492764 return EC_POINT_mul (group, point_.get (), priv_key, nullptr , nullptr , nullptr );
27502765}
27512766
2767+ // ============================================================================
2768+
2769+ ECKeyPointer::ECKeyPointer () : key_(nullptr ) {}
2770+
2771+ ECKeyPointer::ECKeyPointer (EC_KEY* key) : key_(key) {}
2772+
2773+ ECKeyPointer::ECKeyPointer (ECKeyPointer&& other) noexcept
2774+ : key_(other.release()) {}
2775+
2776+ ECKeyPointer& ECKeyPointer::operator =(ECKeyPointer&& other) noexcept {
2777+ key_.reset (other.release ());
2778+ return *this ;
2779+ }
2780+
2781+ ECKeyPointer::~ECKeyPointer () {
2782+ reset ();
2783+ }
2784+
2785+ void ECKeyPointer::reset (EC_KEY* key) {
2786+ key_.reset (key);
2787+ }
2788+
2789+ EC_KEY* ECKeyPointer::release () {
2790+ return key_.release ();
2791+ }
2792+
2793+ ECKeyPointer ECKeyPointer::clone () const {
2794+ if (!key_) return {};
2795+ return ECKeyPointer (EC_KEY_dup (key_.get ()));
2796+ }
2797+
2798+ bool ECKeyPointer::generate () {
2799+ if (!key_) return false ;
2800+ return EC_KEY_generate_key (key_.get ());
2801+ }
2802+
2803+ bool ECKeyPointer::setPublicKey (const ECPointPointer& pub) {
2804+ if (!key_) return false ;
2805+ return EC_KEY_set_public_key (key_.get (), pub.get ()) == 1 ;
2806+ }
2807+
2808+ bool ECKeyPointer::setPublicKeyRaw (const BignumPointer& x,
2809+ const BignumPointer& y) {
2810+ if (!key_) return false ;
2811+ return EC_KEY_set_public_key_affine_coordinates (
2812+ key_.get (), x.get (), y.get ()) == 1 ;
2813+ }
2814+
2815+ bool ECKeyPointer::setPrivateKey (const BignumPointer& priv) {
2816+ if (!key_) return false ;
2817+ return EC_KEY_set_private_key (key_.get (), priv.get ()) == 1 ;
2818+ }
2819+
2820+ const BIGNUM* ECKeyPointer::getPrivateKey () const {
2821+ if (!key_) return nullptr ;
2822+ return GetPrivateKey (key_.get ());
2823+ }
2824+
2825+ const BIGNUM* ECKeyPointer::GetPrivateKey (const EC_KEY* key) {
2826+ return EC_KEY_get0_private_key (key);
2827+ }
2828+
2829+ const EC_POINT* ECKeyPointer::getPublicKey () const {
2830+ if (!key_) return nullptr ;
2831+ return GetPublicKey (key_.get ());
2832+ }
2833+
2834+ const EC_POINT* ECKeyPointer::GetPublicKey (const EC_KEY* key) {
2835+ return EC_KEY_get0_public_key (key);
2836+ }
2837+
2838+ const EC_GROUP* ECKeyPointer::getGroup () const {
2839+ if (!key_) return nullptr ;
2840+ return GetGroup (key_.get ());
2841+ }
2842+
2843+ const EC_GROUP* ECKeyPointer::GetGroup (const EC_KEY* key) {
2844+ return EC_KEY_get0_group (key);
2845+ }
2846+
2847+ int ECKeyPointer::GetGroupName (const EC_KEY* key) {
2848+ const EC_GROUP* group = GetGroup (key);
2849+ return group ? EC_GROUP_get_curve_name (group) : 0 ;
2850+ }
2851+
2852+ bool ECKeyPointer::Check (const EC_KEY* key) {
2853+ return EC_KEY_check_key (key) == 1 ;
2854+ }
2855+
2856+ bool ECKeyPointer::checkKey () {
2857+ if (!key_) return false ;
2858+ return Check (key_.get ());
2859+ }
2860+
2861+ ECKeyPointer ECKeyPointer::NewByCurveName (int nid) {
2862+ return ECKeyPointer (EC_KEY_new_by_curve_name (nid));
2863+ }
2864+
2865+ ECKeyPointer ECKeyPointer::New (const EC_GROUP* group) {
2866+ auto ptr = ECKeyPointer (EC_KEY_new ());
2867+ if (!ptr) return {};
2868+ if (!EC_KEY_set_group (ptr.get (), group)) return {};
2869+ return ptr;
2870+ }
2871+
27522872} // namespace ncrypto
0 commit comments