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()); }