Blob CngKey::Export(CngKeyBlobFormat format) const { EVP_PKEY* key = ToKey(_self); Blob r; int size; byte *buf; switch (format) { case CngKeyBlobFormat::OSslEccPrivateBlob: SslCheck((size = ::i2d_PrivateKey(key, 0)) >= 0); r.Size = size; SslCheck(::i2d_PrivateKey(key, &(buf = r.data())) == size); break; case CngKeyBlobFormat::OSslEccPrivateBignum: { const BIGNUM *bn = ::EC_KEY_get0_private_key(key->pkey.ec); SslCheck(bn); r.Size = BN_num_bytes(bn); if (::BN_bn2bin(bn, r.data()) != r.Size) Throw(E_FAIL); } break; case CngKeyBlobFormat::OSslEccPublicBlob: // SslCheck(size = ::i2o_ECPublicKey(key, 0)); SslCheck((size = ::i2d_PublicKey(key, 0)) >= 0); r.Size = size; // SslCheck(::i2o_ECPublicKey(key, &(buf = r.data())) == size); SslCheck(::i2d_PublicKey(key, &(buf = r.data())) == size); break; case CngKeyBlobFormat::OSslEccPublicCompressedBlob: { CngKey tmp = _self; key = ToKey(tmp); ::EC_KEY_set_conv_form(key->pkey.ec, POINT_CONVERSION_COMPRESSED); r = tmp.Export(CngKeyBlobFormat::OSslEccPublicBlob); } break; case CngKeyBlobFormat::OSslEccPublicUncompressedBlob: { CngKey tmp = _self; key = ToKey(tmp); ::EC_KEY_set_conv_form(key->pkey.ec, POINT_CONVERSION_UNCOMPRESSED); r = tmp.Export(CngKeyBlobFormat::OSslEccPublicBlob); } break; case CngKeyBlobFormat::OSslEccPrivateCompressedBlob: { CngKey tmp = _self; key = ToKey(tmp); ::EC_KEY_set_conv_form(key->pkey.ec, POINT_CONVERSION_COMPRESSED); r = tmp.Export(CngKeyBlobFormat::OSslEccPrivateBlob); } break; default: Throw(E_INVALIDARG); } return r; }
Blob ECDsa::SignHash(const ConstBuf& hash) { EC_KEY *ecKey = ToKey(Key)->pkey.ec; int size = ::ECDSA_size(ecKey); SslCheck(size); Blob r(0, size); unsigned int nSize = 0; SslCheck(::ECDSA_sign(0, hash.P, hash.Size, r.data(), &nSize, ecKey) > 0); r.Size = nSize; return r; }
CngKey& CngKey::operator=(const CngKey& key) { if (m_pimpl) { ::EVP_PKEY_free(ToKey(_self)); m_pimpl = 0; } if (m_pimpl = key.m_pimpl) CRYPTO_add(&ToKey(_self)->references, 1, CRYPTO_LOCK_EVP_PKEY); /*!!! EVP_PKEY *pMyKey = ::EVP_PKEY_new(), *pKey = ToKey(key); SslCheck(m_pimpl = pMyKey); SslCheck(::EVP_PKEY_set_type(pMyKey, pKey->type)); pMyKey->pkey.ec = ::EC_KEY_new_by_curve_name(NID_secp256k1); SslCheck(::EVP_PKEY_copy_parameters(pMyKey, pKey)); */ // SslCheck(::EC_KEY_copy(ToKey(_self), ToKey(key))); return _self; }
void key_callback( GLFWwindow* window, int key, int scancode, int action, int mods) { ImGui_ImplGlfwGL3_KeyCallback(window, key, scancode, action, mods); Key::Enum eKey = ToKey(key); KeyAction::Enum eAction = ToKeyAction(action); g_keyboard->QueueEvent(g_typeID); g_keyboard->_eventQueue.push({ eKey, eAction}); }
CVarRef Array::rvalAtRef(double key, ACCESSPARAMS_IMPL) const { if (m_px) return m_px->get(ToKey(key), flags & AccessFlags::Error); return null_variant; }
bool ECDsa::VerifyHash(const ConstBuf& hash, const ConstBuf& signature) { int rc = ::ECDSA_verify(0, hash.P, hash.Size, signature.P, signature.Size, ToKey(Key)->pkey.ec); SslCheck(rc >= 0); return rc; }
CngKey::~CngKey() { if (m_pimpl) ::EVP_PKEY_free(ToKey(_self)); // ::EC_KEY_free(ToKey(_self)); }