示例#1
0
 /// <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);
     }
 }
示例#2
0
 /// <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)));
     }
 }
示例#5
0
 /// <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]);
 }
示例#6
0
 /// <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]);
 }
示例#7
0
 /// <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);
     }
 }
示例#8
0
 /// <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);
     }
 }
示例#11
0
 /// <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));
     }
 }
示例#13
0
 /// <summary>
 /// Constructor. (empty)
 /// </summary>
 public SchnorrSignature()
 {
     data  = "";
     nonce = new SchnorrPubkey();
     key   = new Privkey();
 }
示例#14
0
 /// <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()));
 }