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"); } }
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"); }
/// <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)); }
/// <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())); }
/// <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); }
/// <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)); }
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); }
/// <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)); }
/// <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)); }
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)); }
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 // ... } } }
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()); }
/// <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)); }
public IKsiSignature Extend(CalendarHashChain calendarHashChain, PublicationRecordInPublicationFile publicationRecord, IKsiSignatureFactory signatureFactory) { return(ExtendedKsiSignature); }