/// <summary> /// Get tweaked Schnorr public key and private key. /// </summary> /// <param name="privkey">private key</param> /// <param name="tweak">tweak</param> /// <param name="tweakedPubkey">tweaked public key</param> /// <param name="tweakedParity">tweaked parity flag</param> /// <param name="tweakedPrivkey">tweaked private key</param> public static void GetTweakAddKeyPair(Privkey privkey, ByteData tweak, out SchnorrPubkey tweakedPubkey, out bool tweakedParity, out Privkey tweakedPrivkey) { if (privkey is null) { throw new ArgumentNullException(nameof(privkey)); } if (tweak is null) { throw new ArgumentNullException(nameof(tweak)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdSchnorrKeyPairTweakAdd( handle.GetHandle(), privkey.ToHexString(), tweak.ToHexString(), out IntPtr tempPubkey, out tweakedParity, out IntPtr tempPrivkey); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } var pk = CCommon.ConvertToString(tempPubkey); var sk = CCommon.ConvertToString(tempPrivkey); tweakedPubkey = new SchnorrPubkey(pk); tweakedPrivkey = new Privkey(sk); } }
/// <summary> /// Sign schnorr with nonce. /// </summary> /// <param name="msg">32-byte msg</param> /// <param name="secretKey">secret key</param> /// <param name="nonce">32-byte nonce</param> /// <returns>schnorr signature</returns> public static SchnorrSignature SignWithNonce(ByteData msg, Privkey secretKey, ByteData nonce) { if (msg is null) { throw new ArgumentNullException(nameof(msg)); } if (secretKey is null) { throw new ArgumentNullException(nameof(secretKey)); } if (nonce is null) { throw new ArgumentNullException(nameof(nonce)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdSignSchnorrWithNonce( handle.GetHandle(), msg.ToHexString(), secretKey.ToHexString(), nonce.ToHexString(), out IntPtr signature); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } string tempSig = CCommon.ConvertToString(signature); return(new SchnorrSignature(tempSig)); } }
/// <summary> /// Constructor. (empty) /// </summary> public SchnorrSignature() { data = ""; nonce = new SchnorrPubkey(); key = new Privkey(); sighashType = new SignatureHashType(CfdSighashType.Default, false); }
/// <summary> /// Sign ECDSA-adaptor. /// </summary> /// <param name="msg">32-byte msg</param> /// <param name="secretKey">secret key</param> /// <param name="adaptor">adaptor pubkey</param> /// <returns>ECDSA-adaptor pair</returns> public static AdaptorPair Sign(ByteData msg, Privkey secretKey, Pubkey adaptor) { if (msg is null) { throw new ArgumentNullException(nameof(msg)); } if (secretKey is null) { throw new ArgumentNullException(nameof(secretKey)); } if (adaptor is null) { throw new ArgumentNullException(nameof(adaptor)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdSignEcdsaAdaptor( handle.GetHandle(), msg.ToHexString(), secretKey.ToHexString(), adaptor.ToHexString(), out IntPtr signature, out IntPtr proof); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } string tempSig = CCommon.ConvertToString(signature); string tempProof = CCommon.ConvertToString(proof); return(new AdaptorPair(new ByteData(tempSig), new ByteData(tempProof))); } }
/// <summary> /// Constructor. /// </summary> /// <param name="hex">hex string</param> public SchnorrSignature(string hex) { if ((hex == null) || (hex.Length != Size * 2)) { CfdCommon.ThrowError(CfdErrorCode.IllegalArgumentError, "Failed to signature size."); } data = hex; string[] list = Verify(data); nonce = new SchnorrPubkey(list[0]); key = new Privkey(list[1]); }
/// <summary> /// Constructor. /// </summary> /// <param name="bytes">byte array</param> public SchnorrSignature(byte[] bytes) { if ((bytes == null) || (bytes.Length != Size)) { CfdCommon.ThrowError(CfdErrorCode.IllegalArgumentError, "Failed to signature size."); } data = StringUtil.FromBytes(bytes); string[] list = Verify(data); nonce = new SchnorrPubkey(list[0]); key = new Privkey(list[1]); }
/// <summary> /// constructor. /// </summary> /// <param name="base58String">base58 string</param> public ExtPrivkey(string base58String) { if (base58String is null) { throw new ArgumentNullException(nameof(base58String)); } extkey = base58String; using (var handle = new ErrorHandle()) { GetExtkeyInformation(handle, extkey, out version, out fingerprint, out chainCode, out depth, out childNumber, out networkType); privkey = GetPrivkeyFromExtKey(handle, extkey, networkType); } }
/// <summary> /// Get Schnorr public key from private key. /// </summary> /// <param name="privkey">private key</param> /// <param name="parity">parity flag</param> /// <returns>schnorr pubkey</returns> public static SchnorrPubkey GetPubkeyFromPrivkey(Privkey privkey, out bool parity) { if (privkey is null) { throw new ArgumentNullException(nameof(privkey)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdGetSchnorrPubkeyFromPrivkey( handle.GetHandle(), privkey.ToHexString(), out IntPtr pubkey, out parity); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } string data = CCommon.ConvertToString(pubkey); return(new SchnorrPubkey(data)); } }
/// <summary> /// Get tweaked privkey from internal privkey. /// </summary> /// <param name="privkey">internal privkey.</param> /// <returns>tweaked privkey.</returns> public Privkey GetTweakedPrivkey(Privkey privkey) { if (privkey is null) { throw new ArgumentNullException(nameof(privkey)); } using (var handle = new ErrorHandle()) using (var treeHandle = new TreeHandle(handle)) { Load(handle, treeHandle); var ret = NativeMethods.CfdGetTaprootTweakedPrivkey( handle.GetHandle(), treeHandle.GetHandle(), privkey.ToHexString(), out IntPtr tweakedPrivkey); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } var tweakedPrivkeyStr = CCommon.ConvertToString(tweakedPrivkey); return(new Privkey(tweakedPrivkeyStr)); } }
/// <summary> /// Constructor. /// </summary> /// <param name="hex">hex string</param> public SchnorrSignature(string hex) { if (hex is null) { throw new ArgumentNullException(nameof(hex)); } if ((hex.Length != Size * 2) && (hex.Length != AddedSigHashTypeSize * 2)) { CfdCommon.ThrowError(CfdErrorCode.IllegalArgumentError, "Failed to signature size."); } data = hex; string[] list = Verify(data); nonce = new SchnorrPubkey(list[0]); key = new Privkey(list[1]); if (hex.Length == AddedSigHashTypeSize * 2) { sighashType = CollectSigHashType(data); } else { sighashType = new SignatureHashType(CfdSighashType.Default, false); } }
/// <summary> /// constructor. /// </summary> /// <param name="seed">seed bytes</param> /// <param name="networkType">network type</param> public ExtPrivkey(ByteData seed, CfdNetworkType networkType) { if (seed is null) { throw new ArgumentNullException(nameof(seed)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdCreateExtkeyFromSeed( handle.GetHandle(), seed.ToHexString(), (int)networkType, (int)CfdExtKeyType.Privkey, out IntPtr tempExtkey); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } extkey = CCommon.ConvertToString(tempExtkey); GetExtkeyInformation(handle, extkey, out version, out fingerprint, out chainCode, out depth, out childNumber, out _); privkey = GetPrivkeyFromExtKey(handle, extkey, networkType); this.networkType = networkType; } }
/// <summary> /// Adapt ECDSA-adaptor signature. /// </summary> /// <param name="adaptorSignature">adaptor signature</param> /// <param name="adaptorSecret">adaptor secret key</param> /// <returns>ecdsa signature in compact format</returns> public static ByteData Adapt(ByteData adaptorSignature, Privkey adaptorSecret) { if (adaptorSignature is null) { throw new ArgumentNullException(nameof(adaptorSignature)); } if (adaptorSecret is null) { throw new ArgumentNullException(nameof(adaptorSecret)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdAdaptEcdsaAdaptor( handle.GetHandle(), adaptorSignature.ToHexString(), adaptorSecret.ToHexString(), out IntPtr signature); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } string sig = CCommon.ConvertToString(signature); return(new ByteData(sig)); } }
/// <summary> /// Constructor. (empty) /// </summary> public SchnorrSignature() { data = ""; nonce = new SchnorrPubkey(); key = new Privkey(); }
/// <summary> /// Sign schnorr. /// </summary> /// <param name="msg">32-byte msg</param> /// <param name="secretKey">secret key</param> /// <returns>schnorr signature</returns> public static SchnorrSignature Sign(ByteData msg, Privkey secretKey) { return(Sign(msg, secretKey, new ByteData())); }