/// <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."); }