Ejemplo n.º 1
0
        public void ExtendToGivenPublicationDate()
        {
            KSI.Ksi       ksi       = GetKsi();
            IKsiSignature signature = LoadUnextendedSignature();

            PublicationRecordInPublicationFile publicationRecord = ksi.GetPublicationsFile().GetNearestPublicationRecord(new DateTime(2016, 2, 15));

            if (publicationRecord == null)
            {
                Console.WriteLine("ExtendToGivenPublicationDate > no suitable publication yet. signature not extended");
                return;
            }

            Console.WriteLine("ExtendToGivenPublicationDate > trying to extend signature to publication > "
                              + Util.ConvertUnixTimeToDateTime(publicationRecord.PublicationData.PublicationTime));

            IKsiSignature extendedSignature = ksi.Extend(signature, publicationRecord);

            if (extendedSignature.IsExtended)
            {
                Console.WriteLine("ExtendToGivenPublicationDate > signature extended to publication > "
                                  + Util.ConvertUnixTimeToDateTime(extendedSignature.PublicationRecord.PublicationData.PublicationTime));
                // Store the extended signature
                // ...
            }
            else
            {
                Console.WriteLine("ExtendToGivenPublicationDate > signature not extended");
            }
        }
Ejemplo n.º 2
0
        public void GetLatestPublication()
        {
            PublicationsFile publicationsFile = TestUtil.GetPublicationsFile();
            PublicationRecordInPublicationFile publicationRecord = publicationsFile.GetLatestPublication();

            Assert.AreEqual(1515974400, publicationRecord.PublicationData.PublicationTime, "Should be correct publication time for latest publication");
        }
Ejemplo n.º 3
0
        /// <see cref="VerificationRule.Verify" />
        public override VerificationResult Verify(IVerificationContext context)
        {
            IKsiSignature   signature = GetSignature(context);
            PublicationData publicationData;

            if (context.UserPublication != null)
            {
                publicationData = context.UserPublication;
            }
            else
            {
                PublicationRecordInPublicationFile publicationRecord = GetNearestPublicationRecord(GetPublicationsFile(context), signature.AggregationTime, true);

                if (publicationRecord == null)
                {
                    // if suitable publication record does not exist in publications file then return NA
                    return(new VerificationResult(GetRuleName(), VerificationResultCode.Na, VerificationError.Gen02));
                }

                publicationData = publicationRecord.PublicationData;
            }

            CalendarHashChain extendedCalendarHashChain = GetExtendedCalendarHashChain(context, publicationData.PublicationTime);
            HashAlgorithm     deprecatedHashAlgorithm   = GetDeprecatedHashAlgorithm(extendedCalendarHashChain);

            if (deprecatedHashAlgorithm != null)
            {
                Logger.Debug("Extender response calendar hash chain contains deprecated aggregation algorithm at publication time. Algorithm: {0}; Publication time: {1}",
                             deprecatedHashAlgorithm.Name, extendedCalendarHashChain.PublicationTime);
                return(new VerificationResult(GetRuleName(), VerificationResultCode.Na, VerificationError.Gen02));
            }

            return(new VerificationResult(GetRuleName(), VerificationResultCode.Ok));
        }
Ejemplo n.º 4
0
        /// <summary>
        ///     Extend signature to publication.
        /// </summary>
        /// <param name="signature">KSI signature</param>
        /// <param name="publicationRecord">publication</param>
        /// <returns>extended KSI signature</returns>
        public IKsiSignature Extend(IKsiSignature signature, PublicationRecordInPublicationFile publicationRecord)
        {
            if (publicationRecord == null)
            {
                throw new ArgumentNullException(nameof(publicationRecord));
            }

            return(Extend(signature, publicationRecord.ConvertToPublicationRecordInSignature()));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Get publication record from publications file that is nearest to the given time.
        /// </summary>
        /// <param name="publicationsFile">publications file</param>
        /// <param name="time">time</param>
        /// <param name="allowNullValue">indicates if returning null value is allowed</param>
        /// <returns></returns>
        public static PublicationRecordInPublicationFile GetNearestPublicationRecord(IPublicationsFile publicationsFile, ulong time, bool allowNullValue = false)
        {
            PublicationRecordInPublicationFile publicationRecord = publicationsFile.GetNearestPublicationRecord(time);

            if (!allowNullValue && publicationRecord == null)
            {
                throw new KsiVerificationException("No publication record found after given time in publications file: " + time + ".");
            }
            return(publicationRecord);
        }
Ejemplo n.º 6
0
        /// <see cref="VerificationRule.Verify" />
        public override VerificationResult Verify(IVerificationContext context)
        {
            IKsiSignature signature       = GetSignature(context);
            ulong         aggregationTime = signature.AggregationTime;
            PublicationRecordInPublicationFile publicationRecord = GetNearestPublicationRecord(GetPublicationsFile(context), aggregationTime);
            CalendarHashChain extendedCalendarHashChain          = GetExtendedCalendarHashChain(context, publicationRecord.PublicationData.PublicationTime);

            return(extendedCalendarHashChain.InputHash != signature.GetLastAggregationHashChainRootHash()
                ? new VerificationResult(GetRuleName(), VerificationResultCode.Fail, VerificationError.Pub03)
                : new VerificationResult(GetRuleName(), VerificationResultCode.Ok));
        }
Ejemplo n.º 7
0
        public void GetPublicationsFileTest(Ksi ksi)
        {
            IPublicationsFile publicationsFile = ksi.GetPublicationsFile();

            PublicationRecordInPublicationFile latest = publicationsFile.GetLatestPublication();
            PublicationRecordInPublicationFile prev   = publicationsFile.GetNearestPublicationRecord(latest.PublicationData.PublicationTime - 35 * 24 * 3600);

            Assert.True(latest.PublicationData.PublicationTime > prev.PublicationData.PublicationTime);
            prev = publicationsFile.GetNearestPublicationRecord(Util.ConvertUnixTimeToDateTime(latest.PublicationData.PublicationTime).AddDays(-35));
            Assert.True(latest.PublicationData.PublicationTime > prev.PublicationData.PublicationTime);
        }
Ejemplo n.º 8
0
        /// <see cref="VerificationRule.Verify" />
        public override VerificationResult Verify(IVerificationContext context)
        {
            IPublicationsFile            publicationsFile  = GetPublicationsFile(context);
            PublicationRecordInSignature publicationRecord = GetPublicationRecord(GetSignature(context));
            ulong publicationTime = publicationRecord.PublicationData.PublicationTime;
            PublicationRecordInPublicationFile publicationRecordInPublicationFile = GetNearestPublicationRecord(publicationsFile, publicationTime, true);

            if (publicationRecordInPublicationFile == null || publicationRecordInPublicationFile.PublicationData.PublicationTime != publicationTime)
            {
                return(new VerificationResult(GetRuleName(), VerificationResultCode.Na, VerificationError.Gen02));
            }

            return(publicationRecordInPublicationFile.PublicationData.PublicationHash != publicationRecord.PublicationData.PublicationHash
                ? new VerificationResult(GetRuleName(), VerificationResultCode.Fail, VerificationError.Pub05)
                : new VerificationResult(GetRuleName(), VerificationResultCode.Ok));
        }
        /// <see cref="VerificationRule.Verify" />
        public override VerificationResult Verify(IVerificationContext context)
        {
            IKsiSignature signature = GetSignature(context);

            PublicationRecordInPublicationFile publicationRecord = GetNearestPublicationRecord(GetPublicationsFile(context), signature.AggregationTime);
            CalendarHashChain extendedCalendarHashChain          = GetExtendedCalendarHashChain(context, publicationRecord.PublicationData.PublicationTime);

            if (publicationRecord.PublicationData.PublicationTime != extendedCalendarHashChain.PublicationTime)
            {
                return(new VerificationResult(GetRuleName(), VerificationResultCode.Fail, VerificationError.Pub02));
            }

            return(signature.AggregationTime != extendedCalendarHashChain.CalculateRegistrationTime()
                ? new VerificationResult(GetRuleName(), VerificationResultCode.Fail, VerificationError.Pub02)
                : new VerificationResult(GetRuleName(), VerificationResultCode.Ok));
        }
Ejemplo n.º 10
0
        /// <summary>
        ///     Extend signature to nearest publication record in publications file subsequent to signature aggregation time.
        /// </summary>
        /// <param name="signature">KSI signature</param>
        /// <returns>extended KSI signature</returns>
        public IKsiSignature Extend(IKsiSignature signature)
        {
            if (signature == null)
            {
                throw new ArgumentNullException(nameof(signature));
            }

            PublicationRecordInPublicationFile publicationRecord = GetPublicationsFile().GetNearestPublicationRecord(signature.AggregationTime);

            if (publicationRecord == null)
            {
                throw new KsiException("No suitable publication yet.");
            }

            return(Extend(signature, publicationRecord));
        }
Ejemplo n.º 11
0
        public void GetNearestPublicationRecordTest()
        {
            PublicationsFile publicationsFile         = TestUtil.GetPublicationsFile();
            PublicationRecordInPublicationFile latest = publicationsFile.GetLatestPublication();
            PublicationRecordInPublicationFile prev   = publicationsFile.GetNearestPublicationRecord(latest.PublicationData.PublicationTime - 35 * 24 * 3600);

            TlvTagBuilder  builder       = new TlvTagBuilder(publicationsFile.Type, publicationsFile.NonCritical, publicationsFile.Forward);
            List <ITlvTag> pubRecordList = new List <ITlvTag>();

            foreach (ITlvTag tag in publicationsFile)
            {
                if (tag.Type < Constants.PublicationRecord.TagTypeInPublicationsFile)
                {
                    builder.AddChildTag(tag);
                }

                if (tag.Type == Constants.PublicationRecord.TagTypeInPublicationsFile)
                {
                    pubRecordList.Add(tag);
                }
            }

            // add publication records in reverse order
            for (int index = pubRecordList.Count - 1; index >= 0; index--)
            {
                ITlvTag tag = pubRecordList[index];
                builder.AddChildTag(tag);
            }

            foreach (ITlvTag tag in publicationsFile)
            {
                if (tag.Type > Constants.PublicationRecord.TagTypeInPublicationsFile)
                {
                    builder.AddChildTag(tag);
                }
            }

            PublicationsFile newPublicationsFile = new PublicationsFile(builder.BuildTag());

            PublicationRecordInPublicationFile newPrev = newPublicationsFile.GetNearestPublicationRecord(latest.PublicationData.PublicationTime - 35 * 24 * 3600);

            Assert.AreEqual(prev.PublicationData, newPrev.PublicationData, "Unexpected nearest publicatoin record.");
        }
        /// <see cref="VerificationRule.Verify" />
        public override VerificationResult Verify(IVerificationContext context)
        {
            IPublicationsFile publicationsFile = GetPublicationsFile(context);
            IKsiSignature     signature        = GetSignature(context);

            PublicationRecordInPublicationFile publicationRecord = GetNearestPublicationRecord(publicationsFile, signature.AggregationTime, true);

            if (publicationRecord == null)
            {
                // if suitable publication record does not exist in publications file then return NA
                return(new VerificationResult(GetRuleName(), VerificationResultCode.Na, VerificationError.Gen02));
            }

            CalendarHashChain extendedCalendarHashChain = GetExtendedCalendarHashChain(context, publicationRecord.PublicationData.PublicationTime);

            return(extendedCalendarHashChain.OutputHash != publicationRecord.PublicationData.PublicationHash
                ? new VerificationResult(GetRuleName(), VerificationResultCode.Fail, VerificationError.Pub01)
                : new VerificationResult(GetRuleName(), VerificationResultCode.Ok));
        }
Ejemplo n.º 13
0
        public void ExtendToLatestPublication()
        {
            KSI.Ksi       ksi       = GetKsi();
            IKsiSignature signature = LoadUnextendedSignature();

            PublicationRecordInPublicationFile latestPublicationRecord = ksi.GetPublicationsFile().GetLatestPublication();

            if (!signature.IsExtended || signature.PublicationRecord.PublicationData.PublicationTime < latestPublicationRecord.PublicationData.PublicationTime)
            {
                IKsiSignature extendedSignature = ksi.Extend(signature, latestPublicationRecord);

                if (extendedSignature.IsExtended)
                {
                    Console.WriteLine("ExtendToLatestPublication > signature extended to publication > " +
                                      Util.ConvertUnixTimeToDateTime(extendedSignature.PublicationRecord.PublicationData.PublicationTime));

                    // Store the extended signature
                    // ...
                }
            }
        }
Ejemplo n.º 14
0
        public void TestKsiSignatureExtendWithPublicationRecordInPublicationsFile()
        {
            IKsiSignature signature = GetKsiSignatureFromFile(Resources.KsiSignature_Ok);

            byte[] publicationDataBytes =
                new PublicationData(1455494400, new DataHash(Base16.Decode("011878289E1A333DD85091D30F001B9F6F9ED4D428D57E049BD0EBD4DBC89BD210"))).Encode();
            byte[] uriTagBytes = new StringTag(Constants.PublicationRecord.PublicationRepositoryUriTagType, false, false, "Test uri (publication record in publications file)")
                                 .Encode();
            byte[] childBytes = new byte[publicationDataBytes.Length + uriTagBytes.Length];
            Array.Copy(publicationDataBytes, childBytes, publicationDataBytes.Length);
            Array.Copy(uriTagBytes, 0, childBytes, publicationDataBytes.Length, uriTagBytes.Length);
            PublicationRecordInPublicationFile publicationRecord =
                new PublicationRecordInPublicationFile(new RawTag(Constants.PublicationRecord.TagTypeInPublicationsFile, false, false, childBytes));

            IKsiSignature extendedSignature = signature.Extend(GetCalendarHashChain(), publicationRecord);

            Assert.True(extendedSignature.IsExtended, "IsExtended should be true.");
            Assert.AreEqual(1455494400, extendedSignature.PublicationRecord.PublicationData.PublicationTime, "Unexpected publication time");
            VerificationResult result = new DefaultVerificationPolicy().Verify(extendedSignature, null, TestUtil.GetPublicationsFile());

            Assert.AreEqual(VerificationResultCode.Ok, result.ResultCode, "Unexpected verification result code.");
            Assert.AreEqual("Test uri (publication record in publications file)", extendedSignature.PublicationRecord.RepositoryUri[0], "Unexpected repository uri.");
        }
        public void ToStringInPublicationFileTest()
        {
            PublicationRecord tag =
                TestUtil.GetCompositeTag <PublicationRecordInPublicationFile>(Constants.PublicationRecord.TagTypeInPublicationsFile,
                                                                              new ITlvTag[]
            {
                TestUtil.GetCompositeTag <PublicationData>(Constants.PublicationData.TagType,
                                                           new ITlvTag[]
                {
                    new IntegerTag(Constants.PublicationData.PublicationTimeTagType, false, false, 1),
                    new ImprintTag(Constants.PublicationData.PublicationHashTagType, false, false,
                                   new DataHash(HashAlgorithm.Sha2256,
                                                new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 })),
                }),
                new StringTag(Constants.PublicationRecord.PublicationReferencesTagType, false, false, "Test publication reference 1"),
                new StringTag(Constants.PublicationRecord.PublicationReferencesTagType, false, false, "Test publication reference 2"),
                new StringTag(Constants.PublicationRecord.PublicationRepositoryUriTagType, false, false, "Test publication repository uri 1"),
                new StringTag(Constants.PublicationRecord.PublicationRepositoryUriTagType, false, false, "Test publication repository uri 2"),
            });

            PublicationRecord tag2 = new PublicationRecordInPublicationFile(new RawTag(tag.Type, tag.NonCritical, tag.Forward, tag.EncodeValue()));

            Assert.AreEqual(tag.ToString(), tag2.ToString());
        }
Ejemplo n.º 16
0
 /// <summary>
 ///     Extend signature to publication.
 /// </summary>
 /// <param name="calendarHashChain">extended calendar hash chain</param>
 /// <param name="publicationRecord">extended publication record</param>
 /// <param name="signatureFactory">signature factory to be used when creating extended signature</param>
 /// <returns>extended KSI signature</returns>
 public IKsiSignature Extend(CalendarHashChain calendarHashChain, PublicationRecordInPublicationFile publicationRecord, IKsiSignatureFactory signatureFactory = null)
 {
     return(Extend(calendarHashChain, publicationRecord?.ConvertToPublicationRecordInSignature(), signatureFactory));
 }
Ejemplo n.º 17
0
 public IKsiSignature Extend(CalendarHashChain calendarHashChain, PublicationRecordInPublicationFile publicationRecord, IKsiSignatureFactory signatureFactory)
 {
     return(ExtendedKsiSignature);
 }