예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="signedBundle"></param>
        /// <param name="inputAddress"></param>
        /// <returns></returns>
        public bool ValidateSignatures(Bundle signedBundle, string inputAddress)
        {
            string bundleHash = "";

            List <String> signatureFragments = new List <string>();

            foreach (var trx in signedBundle.Transactions)
            {
                if (trx.Address.Equals(inputAddress))
                {
                    bundleHash = trx.Bundle;

                    // if we reached remainder bundle
                    String signatureFragment = trx.SignatureMessageFragment;
                    if (InputValidator.IsNinesTrytes(signatureFragment, signatureFragment.Length))
                    {
                        break;
                    }
                    signatureFragments.Add(signatureFragment);
                }
            }

            return(ValidateSignatures(inputAddress, signatureFragments.ToArray(), bundleHash));
        }
예제 #2
0
        /// <summary>
        /// </summary>
        /// <param name="bundleToSign"></param>
        /// <param name="inputAddress"></param>
        /// <param name="keyTrytes"></param>
        /// <returns></returns>
        public Bundle AddSignature(Bundle bundleToSign, string inputAddress, string keyTrytes)
        {
            // Get the security used for the private key
            // 1 security level = 2187 trytes
            var security = keyTrytes.Length / Constants.MessageLength;

            // convert private key trytes into trits
            var key = Converter.ToTrits(keyTrytes);


            // First get the total number of already signed transactions
            // use that for the bundle hash calculation as well as knowing
            // where to add the signature
            var numSignedTxs = 0;


            for (var i = 0; i < bundleToSign.Transactions.Count; i++)
            {
                if (bundleToSign.Transactions[i].Address.Equals(inputAddress))
                {
                    if (!InputValidator.IsNinesTrytes(bundleToSign.Transactions[i].SignatureMessageFragment,
                                                      bundleToSign.Transactions[i].SignatureMessageFragment.Length))
                    {
                        numSignedTxs++;
                    }
                    // Else sign the transactions
                    else
                    {
                        var bundleHash = bundleToSign.Transactions[i].Bundle;

                        //  First 6561 trits for the firstFragment
                        var firstFragment = new int[6561];
                        Array.Copy(key, firstFragment, 6561);

                        //  Get the normalized bundle hash
                        var normalizedBundleFragments = new int[3][];
                        for (var n = 0; n < 3; n++)
                        {
                            normalizedBundleFragments[n] = new int[27];
                        }

                        var normalizedBundleHash = bundleToSign.NormalizedBundle(bundleHash);


                        // Split hash into 3 fragments
                        for (var k = 0; k < 3; k++)
                        {
                            Array.Copy(normalizedBundleHash, k * 27, normalizedBundleFragments[k], 0, 27);
                        }


                        //  First bundle fragment uses 27 trytes
                        var firstBundleFragment = normalizedBundleFragments[numSignedTxs % 3];

                        //  Calculate the new signatureFragment with the first bundle fragment
                        var firstSignedFragment = _signing.SignatureFragment(firstBundleFragment, firstFragment);

                        //  Convert signature to trytes and assign the new signatureFragment
                        bundleToSign.Transactions[i].SignatureMessageFragment = Converter.ToTrytes(firstSignedFragment);

                        for (var j = 1; j < security; j++)
                        {
                            //  Next 6561 trits for the firstFragment
                            var nextFragment = new int[6561];
                            Array.Copy(key, 6561 * j, nextFragment, 0, 6561);

                            //  Use the next 27 trytes
                            var nextBundleFragment = normalizedBundleFragments[(numSignedTxs + j) % 3];

                            //  Calculate the new signatureFragment with the first bundle fragment
                            var nextSignedFragment = _signing.SignatureFragment(nextBundleFragment, nextFragment);

                            //  Convert signature to trytes and add new bundle entry at i + j position
                            // Assign the signature fragment
                            bundleToSign.Transactions[i + j].SignatureMessageFragment = Converter.ToTrytes(nextSignedFragment);
                        }

                        break;
                    }
                }
            }

            return(bundleToSign);
        }