public void Ecdh(BigInt publicX, BigInt publicY, RandomNumberGenerator rng, out byte[] preMasterSecret, out Affine publicPoint) { var limbLen = (curveByteLen + 3) >> 2; var priv = GenPriv(rng); var serverPublic = new EllipticCurve.Projective() { x = publicX, y = publicY, z = new EllipticCurve.BigInt(1, limbLen) }; var commonSecretProj = EcMult(priv, serverPublic); var commonSecretAff = EcAffinify(commonSecretProj); serverPublic.Clear(); commonSecretProj.Clear(); var g = new EllipticCurve.Projective() { x = xg, y = yg, z = new EllipticCurve.BigInt(1, limbLen) }; var pubProj = EcMult(priv, g); var pubAff = EcAffinify(pubProj); priv.Clear(); pubProj.Clear(); preMasterSecret = commonSecretAff.x.ExportToBigEndian(curveByteLen); commonSecretAff.Clear(); publicPoint = pubAff; }