示例#1
0
        /// <summary>
        /// Create uni-signatures based on the root signature.
        /// </summary>
        /// <returns></returns>
        private IEnumerable <IKsiSignature> CreateUniSignatures(IKsiSignature rootSignature)
        {
            Logger.Debug("Start creating uni-signatures.");

            AggregationHashChain existingAggregationHashChain = rootSignature.GetAggregationHashChains()[0];

            byte[]  rootSignatureData = rootSignature.EncodeValue();
            ulong[] chainIndex        = PrepareChainIndex(existingAggregationHashChain);

            foreach (TreeNode node in _leafNodes)
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    AggregationHashChain aggregationHashChain = GetAggregationHashChain(existingAggregationHashChain, node, chainIndex);
                    aggregationHashChain.WriteTo(stream);

                    // Take root node signature data and add aggregation hash chain.
                    byte[] signatureData = new byte[rootSignatureData.Length + stream.Length];

                    Array.Copy(stream.ToArray(), signatureData, stream.Length);
                    Array.Copy(rootSignatureData, 0, signatureData, stream.Length, rootSignatureData.Length);

                    // Create new signature from the signature data.
                    yield return(_signatureFactory.CreateByContent(signatureData, node.Hash));
                }
            }

            Logger.Debug("End creating uni-signatures.");
        }
        public void CreateFromPartsTest()
        {
            KsiSignatureFactory signatureFactory = new KsiSignatureFactory();
            IKsiSignature       signature;

            using (FileStream stream = new FileStream(Path.Combine(TestSetup.LocalPath, Resources.KsiSignature_Ok), FileMode.Open))
            {
                signature = new KsiSignatureFactory().Create(stream);
            }

            IKsiSignature newSignature = signatureFactory.Create(signature.GetAggregationHashChains(), signature.CalendarHashChain, signature.CalendarAuthenticationRecord,
                                                                 signature.PublicationRecord,
                                                                 signature.Rfc3161Record, signature.InputHash);

            Assert.AreEqual(signature.EncodeValue(), newSignature.EncodeValue(), "Signatures should be equal.");
        }