@@ -1790,6 +1790,21 @@ BIOPointer EVPKeyPointer::derPublicKey() const {
1790
1790
return bio;
1791
1791
}
1792
1792
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
+
1793
1808
namespace {
1794
1809
EVPKeyPointer::ParseKeyResult TryParsePublicKeyInner (const BIOPointer& bp,
1795
1810
const char * name,
@@ -2749,4 +2764,109 @@ bool ECPointPointer::mul(const EC_GROUP* group, const BIGNUM* priv_key) {
2749
2764
return EC_POINT_mul (group, point_.get (), priv_key, nullptr , nullptr , nullptr );
2750
2765
}
2751
2766
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 () const {
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
+
2752
2872
} // namespace ncrypto
0 commit comments