public void dlc_schnorr_test() { var arr = JArray.Parse(File.ReadAllText("Data/dlc_schnorr_test.json")); foreach (var vector in arr.OfType <JObject>()) { var privKey = Context.Instance.CreateECPrivKey(Encoders.Hex.DecodeData(vector["inputs"]["privKey"].Value <string>())); var privNonce = Context.Instance.CreateECPrivKey(Encoders.Hex.DecodeData(vector["inputs"]["privNonce"].Value <string>())); var hash = Encoders.Hex.DecodeData(vector["inputs"]["msgHash"].Value <string>()); var pubkey = Context.Instance.CreateXOnlyPubKey(Encoders.Hex.DecodeData(vector["pubKey"].Value <string>())); var nonce = new SchnorrNonce(Context.Instance.CreateXOnlyPubKey(Encoders.Hex.DecodeData(vector["pubNonce"].Value <string>()))); Assert.Equal(nonce, privNonce.CreateSchnorrNonce()); Assert.Equal(pubkey, privKey.CreateXOnlyPubKey()); Assert.True(new OracleInfo(pubkey, nonce).TryComputeSigpoint(new DiscreteOutcome(hash), out var sigpoint)); Assert.True(Context.Instance.TryCreatePubKey(Encoders.Hex.DecodeData(vector["sigPoint"].Value <string>()), out var expectedSigPoint)); Assert.Equal(expectedSigPoint, sigpoint); Assert.True(SecpSchnorrSignature.TryCreate(Encoders.Hex.DecodeData(vector["signature"].Value <string>()), out var expectedSig)); Assert.Equal(expectedSig.rx, nonce.PubKey.Q.x); var expectedAttestation = expectedSig.s; var sig = privKey.SignBIP340(hash, new PrecomputedNonceFunctionHardened(privNonce.ToBytes())); Assert.Equal(expectedSig.rx, sig.rx); Assert.Equal(expectedSig.s, sig.s); } }
public SecpSchnorrSignature CreateSchnorrSignature(ECPrivKey key) { if (!SecpSchnorrSignature.TryCreate(PubKey.Q.x, key.sec, out var sig) || sig is null) { throw new InvalidOperationException("Invalid schnorr signature"); } return(sig); }
public void BIP340Tests() { var content = File.ReadAllText("data/bip340_vectors.csv"); var lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries).Skip(1).ToArray(); foreach (var line in lines) { var fields = line.Split(','); if (fields[0] == "5" || fields[0] == "14") // pubkey not on the field { Assert.False(Context.Instance.TryCreateXOnlyPubKey(Encoders.Hex.DecodeData(fields[2]), out _)); continue; } var expectedPubKey = Context.Instance.CreateXOnlyPubKey(Encoders.Hex.DecodeData(fields[2])); if (fields[1] != "") { var key = Context.Instance.CreateECPrivKey(Encoders.Hex.DecodeData(fields[1])); var actualPubKey = key.CreateXOnlyPubKey(); Assert.Equal(expectedPubKey, actualPubKey); } var msg = Encoders.Hex.DecodeData(fields[4]); if (fields[0] == "12" || fields[0] == "13") // invalid sig { Assert.False(SecpSchnorrSignature.TryCreate(Encoders.Hex.DecodeData(fields[5]), out _)); continue; } Assert.True(SecpSchnorrSignature.TryCreate(Encoders.Hex.DecodeData(fields[5]), out var sig)); var actual = expectedPubKey.SigVerifyBIP340(sig, msg); var expectedGoodSig = fields[6] == "TRUE"; Assert.Equal(expectedGoodSig, actual); if (fields[1] != "") { var aux = Encoders.Hex.DecodeData(fields[3]); var key = Context.Instance.CreateECPrivKey(Encoders.Hex.DecodeData(fields[1])); var actualSig = key.SignBIP340(msg, aux); Assert.True(expectedPubKey.SigVerifyBIP340(actualSig, msg)); if (expectedGoodSig) { var buf = new byte[64]; actualSig.WriteToSpan(buf); Assert.Equal(fields[5].ToLowerInvariant(), Encoders.Hex.EncodeData(buf)); } } } }