Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
	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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
CngKey::~CngKey() {
	if (m_pimpl)
		::EVP_PKEY_free(ToKey(_self));

//	::EC_KEY_free(ToKey(_self));
}