public static EcdhTuple EcdhDecode(this EcdhTuple mask, byte[] recieverSK)
        {
            EcdhTuple unmask = mask;

            byte[] sharedSec1 = Cryptography.Crypto.Default.Hash256(ScalarFunctions.MulWithPoint(mask.senderPK, recieverSK));
            byte[] sharedSec2 = Cryptography.Crypto.Default.Hash256(sharedSec1);

            unmask.mask   = ScalarFunctions.Sub(mask.mask, sharedSec1);
            unmask.amount = ScalarFunctions.Sub(mask.amount, sharedSec2);

            return(unmask);
        }
        public static EcdhTuple EcdhEncode(this EcdhTuple unmask, ECPoint receiverPk)
        {
            EcdhTuple ret = new EcdhTuple();

            byte[] esk = SchnorrNonLinkable.GenerateRandomScalar();
            ret.senderPK = ECCurve.Secp256r1.G * esk;

            byte[] sharedSec1 = Cryptography.Crypto.Default.Hash256(ScalarFunctions.MulWithPoint(receiverPk, esk));
            byte[] sharedSec2 = Cryptography.Crypto.Default.Hash256(sharedSec1);

            ret.mask   = ScalarFunctions.Add(unmask.mask, sharedSec1);
            ret.amount = ScalarFunctions.Add(unmask.amount, sharedSec2);
            return(ret);
        }
        public void ECDH_ENCODE_TEST()
        {
            byte[]  RecieverSK = SchnorrNonLinkable.GenerateRandomScalar();
            ECPoint RecieverPK = ECCurve.Secp256r1.G * RecieverSK;

            byte[]  u_mask   = new byte[32];
            byte[]  u_amount = new byte[32];
            ECPoint pt       = new ECPoint();

            EcdhTuple unmask = new EcdhTuple(u_mask, u_amount, pt);

            EcdhTuple mask = unmask.EcdhEncode(RecieverPK);

            EcdhTuple t_unmask = mask.EcdhDecode(RecieverSK);

            unmask.amount.ToHexString().Should().Be(t_unmask.amount.ToHexString());
            unmask.mask.ToHexString().Should().Be(t_unmask.mask.ToHexString());
        }