public void GenEcdhKeys() { IntPtr ec_key = Libcrypto.EC_KEY_new_by_curve_name(415); Libcrypto.EC_KEY_generate_key(ec_key); IntPtr ec_group = Libcrypto.EC_KEY_get0_group(ec_key); IntPtr ec_point = Libcrypto.EC_KEY_get0_public_key(ec_key); Publen = Libcrypto.EC_POINT_point2oct(ec_group, ec_point, 4, PublicKey, 65, 0); ec_point = Libcrypto.EC_KEY_get0_private_key(ec_key); Prilen = Libcrypto.BN_bn2mpi(ec_point, PrivateKey); }
private byte[] GenShareKeyByte(byte[] publicKey, byte[] privateKey) { IntPtr ec_key = Libcrypto.EC_KEY_new_by_curve_name(415); IntPtr bn = Libcrypto.BN_new(); Libcrypto.BN_mpi2bn(privateKey, privateKey.Length, bn); Libcrypto.EC_KEY_set_private_key(ec_key, bn); Libcrypto.BN_free(bn); IntPtr ec_group = Libcrypto.EC_KEY_get0_group(ec_key); IntPtr ec_point = Libcrypto.EC_POINT_new(ec_group); Libcrypto.EC_POINT_oct2point(ec_group, ec_point, publicKey, publicKey.Length, 0); Libcrypto.ECDH_compute_key(ShareKey, 16, ec_point, ec_key, 0); return(ShareKey); }