/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.AggregationHashChain.AggregationTimeTagType: return(_aggregationTime = GetIntegerTag(childTag)); case Constants.AggregationHashChain.ChainIndexTagType: IntegerTag chainIndexTag = GetIntegerTag(childTag); _chainIndex.Add(chainIndexTag); return(chainIndexTag); case Constants.AggregationHashChain.InputDataTagType: return(_inputData = GetRawTag(childTag)); case Constants.AggregationHashChain.InputHashTagType: return(_inputHash = GetImprintTag(childTag)); case Constants.AggregationHashChain.AggregationAlgorithmIdTagType: IntegerTag aggrAlgorithmTag = GetIntegerTag(childTag); _aggrAlgorithm = HashAlgorithm.GetById((byte)aggrAlgorithmTag.Value); return(aggrAlgorithmTag); case (uint)LinkDirection.Left: case (uint)LinkDirection.Right: Link linkTag = childTag as Link ?? new Link(childTag); _links.Add(linkTag); return(linkTag); default: return(base.ParseChild(childTag)); } }
public static ITlvTag GetCompositeTag(Type type, uint tagType, ITlvTag[] childTags) { RawTag raw; using (TlvWriter writer = new TlvWriter(new MemoryStream())) { foreach (ITlvTag tag in childTags) { writer.WriteTag(tag); } raw = new RawTag(tagType, false, false, ((MemoryStream)writer.BaseStream).ToArray()); } object[] args = new object[] { raw }; ITlvTag value = (ITlvTag)Activator.CreateInstance(type, args); // set _value inside CompositeTag FieldInfo field = typeof(CompositeTag).GetField("_childTags", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { throw new Exception("Cannot find field '_value' inside CompositeTag class."); } field.SetValue(value, new List <ITlvTag>(childTags)); return(value); }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PublicationsFileHeader.TagType: _headerIndex = Count; return(_publicationsHeader = childTag as PublicationsFileHeader ?? new PublicationsFileHeader(childTag)); case Constants.CertificateRecord.TagType: _lastCertRecordIndex = Count; CertificateRecord certificateRecord = childTag as CertificateRecord ?? new CertificateRecord(childTag); _certificateRecordList.Add(certificateRecord); return(certificateRecord); case Constants.PublicationRecord.TagTypeInPublicationsFile: if (_firstPublicationRecordIndex == 0) { _firstPublicationRecordIndex = Count; } PublicationRecordInPublicationFile publicationRecord = childTag as PublicationRecordInPublicationFile ?? new PublicationRecordInPublicationFile(childTag); _publicationRecordList.Add(publicationRecord); return(publicationRecord); case Constants.PublicationsFile.CmsSignatureTagType: _cmsSignatureIndex = Count; return(_cmsSignature = GetRawTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Write TLV object to given stream. /// </summary> /// <param name="tag">TLV object</param> public static ushort GetTlvLength(ITlvTag tag) { if (tag == null) { throw new ArgumentNullException(nameof(tag)); } byte[] data = tag.EncodeValue(); bool tlv16 = tag.Type > Constants.Tlv.TypeMask || (data != null && data.Length > byte.MaxValue); if (tlv16) { if (data != null && data.Length > ushort.MaxValue) { throw new ArgumentOutOfRangeException(nameof(data)); } // first 2 bytes + 2 length bytes + data return((ushort)(4 + (data?.Length ?? 0))); } // first byte + length byte + data return((ushort)(2 + (data?.Length ?? 0))); }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.AggregationHashChain.TagType: AggregationHashChain aggregationChainTag = childTag as AggregationHashChain ?? new AggregationHashChain(childTag); _aggregationHashChains.Add(aggregationChainTag); return(aggregationChainTag); case Constants.CalendarHashChain.TagType: return(CalendarHashChain = childTag as CalendarHashChain ?? new CalendarHashChain(childTag)); case Constants.PublicationRecord.TagTypeInSignature: return(PublicationRecord = childTag as PublicationRecordInSignature ?? new PublicationRecordInSignature(childTag)); case Constants.CalendarAuthenticationRecord.TagType: return(CalendarAuthenticationRecord = childTag as CalendarAuthenticationRecord ?? new CalendarAuthenticationRecord(childTag)); case Constants.Rfc3161Record.TagType: return(Rfc3161Record = childTag as Rfc3161Record ?? new Rfc3161Record(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.AggregatorConfigResponsePayload.MaxLevelTagType: return(_maxLevel = GetIntegerTag(childTag)); case Constants.AggregatorConfigResponsePayload.AggregationAlgorithmTagType: return(_aggregationAlgorithm = GetIntegerTag(childTag)); case Constants.AggregatorConfigResponsePayload.AggregationPeriodTagType: return(_aggregationPeriod = GetIntegerTag(childTag)); case Constants.AggregatorConfigResponsePayload.MaxRequestsTagType: return(_maxRequests = GetIntegerTag(childTag)); case Constants.AggregatorConfigResponsePayload.ParentUriTagType: StringTag uriTag = GetStringTag(childTag); ParentsUris.Add(uriTag.Value); return(uriTag); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Add child TLV tag to the list of children tags. /// </summary> /// <param name="childTag">Child TLV tag to be added</param> public void AddChildTag(ITlvTag childTag) { if (childTag == null) { throw new ArgumentNullException(nameof(childTag)); } _childTags.Add(childTag); }
/// <summary> /// Create new imprint TLV element from TLV element. /// </summary> /// <param name="tag">TLV element</param> public ImprintTag(ITlvTag tag) : base(tag) { byte[] data = tag.EncodeValue(); if (data == null) { throw new TlvException("Invalid TLV element encoded value: null."); } Value = new DataHash(data); }
/// <summary> /// Create new Integer TLV element from TLV element. /// </summary> /// <param name="tag">TLV element</param> public IntegerTag(ITlvTag tag) : base(tag) { byte[] data = tag.EncodeValue(); if (data == null) { throw new TlvException("Invalid TLV element encoded value: null."); } Value = Util.DecodeUnsignedLong(data, 0, data.Length, true); }
/// <summary> /// Write TLV object to given stream. /// </summary> /// <param name="tag">TLV object</param> public void WriteTag(ITlvTag tag) { if (tag == null) { return; } if (tag.Type > Constants.Tlv.MaxType) { throw new ArgumentOutOfRangeException(nameof(tag)); } byte[] data = tag.EncodeValue(); bool tlv16 = ((tag as TlvTag)?.ForceTlv16Encoding ?? false) || tag.Type > Constants.Tlv.TypeMask || (data != null && data.Length > byte.MaxValue); byte firstByte = (byte)((tlv16 ? Constants.Tlv.Tlv16Flag : 0) + (tag.NonCritical ? Constants.Tlv.NonCriticalFlag : 0) + (tag.Forward ? Constants.Tlv.ForwardFlag : 0)); if (tlv16) { firstByte = (byte)(firstByte | (tag.Type >> Constants.BitsInByte) & Constants.Tlv.TypeMask); Write(firstByte); Write((byte)tag.Type); if (data == null) { Write((byte)0); } else { if (data.Length > ushort.MaxValue) { throw new ArgumentOutOfRangeException(nameof(data)); } Write((byte)(data.Length >> Constants.BitsInByte)); Write((byte)data.Length); Write(data); } } else { firstByte = (byte)(firstByte | tag.Type & Constants.Tlv.TypeMask); Write(firstByte); if (data == null) { Write((byte)0); } else { Write((byte)data.Length); Write(data); } } }
/// <summary> /// Create new octet string TLV element from TLV element. /// </summary> /// <param name="tag">TLV element</param> public RawTag(ITlvTag tag) : base(tag) { byte[] data = tag.EncodeValue(); if (data == null) { throw new TlvException("Invalid TLV element encoded value: null."); } _value = data; }
/// <summary> /// Create string TLV element from TLV element. /// </summary> /// <param name="tag">TLV element</param> public StringTag(ITlvTag tag) : base(tag) { byte[] data = tag.EncodeValue(); if (data == null) { throw new TlvException("Invalid TLV element encoded value: null."); } Value = Util.DecodeNullTerminatedUtf8String(data); }
/// <summary> /// Create new TLV element from TLV element. /// </summary> /// <param name="tag">TLV element</param> protected TlvTag(ITlvTag tag) { if (tag == null) { throw new ArgumentNullException(nameof(tag)); } Type = tag.Type; NonCritical = tag.NonCritical; Forward = tag.Forward; }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PduPayload.RequestIdTagType: return(_requestId = GetIntegerTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Verify unknown tag for critical flag and throw exception. /// </summary> /// <param name="tag">TLV element</param> protected void VerifyUnknownTag(ITlvTag tag) { if (tag == null) { throw new ArgumentNullException(nameof(tag)); } if (!tag.NonCritical) { throw new TlvException("Unknown tag type (0x" + tag.Type.ToString("X") + ")."); } }
/// <summary> /// Get the first child TLV tag of a given type. /// </summary> /// <param name="type">TLV tag type to be searched</param> /// <returns></returns> public ITlvTag GetChildByType(uint type) { for (int i = 0; i < _childTags.Count; i++) { ITlvTag childTag = _childTags[i]; if (childTag.Type == type) { return(childTag); } } return(null); }
/// <summary> /// Set MAC tag value /// </summary> /// <param name="macAlgorithm"></param> /// <param name="key">HMAC key</param> protected void SetMacValue(HashAlgorithm macAlgorithm, byte[] key) { for (int i = 0; i < Count; i++) { ITlvTag childTag = this[i]; if (childTag.Type == Constants.Pdu.MacTagType) { this[i] = Mac = CreateMacTag(CalcMacValue(macAlgorithm, key)); break; } } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PublicationData.PublicationTimeTagType: return(_publicationTime = GetIntegerTag(childTag)); case Constants.PublicationData.PublicationHashTagType: return(_publicationHash = GetImprintTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.ExtendResponsePayload.LastTimeTagType: return(_calendarLastTime = GetIntegerTag(childTag)); case Constants.CalendarHashChain.TagType: return(CalendarHashChain = childTag as CalendarHashChain ?? new CalendarHashChain(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PduPayload.StatusTagType: return(_status = GetIntegerTag(childTag)); case Constants.PduPayload.ErrorMessageTagType: return(_errorMessage = GetStringTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PduHeader.TagType: return(_header = childTag as PduHeader ?? new PduHeader(childTag)); case Constants.Pdu.MacTagType: return(Mac = GetImprintTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PublicationData.TagType: return(PublicationData = childTag as PublicationData ?? new PublicationData(childTag)); case Constants.SignatureData.TagType: return(SignatureData = childTag as SignatureData ?? new SignatureData(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.CertificateRecord.CertificateIdTagType: return(CertificateId = GetRawTag(childTag)); case Constants.CertificateRecord.X509CertificateTagType: return(X509Certificate = GetRawTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Create calendar hash chain link instance /// </summary> /// <param name="tag"></param> public Link(ITlvTag tag) : base(tag) { CheckTagType((uint)LinkDirection.Right, (uint)LinkDirection.Left); switch (Type) { case (uint)LinkDirection.Left: Direction = LinkDirection.Left; break; case (uint)LinkDirection.Right: Direction = LinkDirection.Right; break; } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { // following fields will be used to create KSI signature and parsed when creating the signature case Constants.AggregationHashChain.TagType: case Constants.CalendarHashChain.TagType: case Constants.PublicationRecord.TagTypeInSignature: case Constants.CalendarAuthenticationRecord.TagType: return(childTag); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Remove given child TLV tag. Reference equality is used when searching the tag to be removed. /// </summary> /// <param name="childTag"></param> public void RemoveChildTag(ITlvTag childTag) { if (childTag == null) { throw new ArgumentNullException(nameof(childTag)); } for (int i = 0; i < _childTags.Count; i++) { if (ReferenceEquals(childTag, _childTags[i])) { _childTags.RemoveAt(i); return; } } }
public void TlvTagBuilderGetTagByTypeReturnNullTest() { RawTag child1 = new RawTag(0x1, true, false, new byte[] { 0x1, 0x2 }); CompositeTestTag tag = new CompositeTestTag(0x1, false, false, new ITlvTag[] { child1, }); TlvTagBuilder builder = new TlvTagBuilder(tag); ITlvTag searchedTag = builder.GetChildByType(0x2); Assert.IsNull(searchedTag, "Invalid return tag"); }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PduHeader.LoginIdTagType: return(_loginId = GetStringTag(childTag)); case Constants.PduHeader.InstanceIdTagType: return(_instanceId = GetIntegerTag(childTag)); case Constants.PduHeader.MessageIdTagType: return(_messageId = GetIntegerTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.PublicationsFileHeader.VersionTagType: return(_version = GetIntegerTag(childTag)); case Constants.PublicationsFileHeader.CreationTimeTagType: return(_creationTime = GetIntegerTag(childTag)); case Constants.PublicationsFileHeader.RepositoryUriTagType: return(_repositoryUri = GetStringTag(childTag)); default: return(base.ParseChild(childTag)); } }
/// <summary> /// Parse child tag /// </summary> protected override ITlvTag ParseChild(ITlvTag childTag) { switch (childTag.Type) { case Constants.ExtendRequestPayload.LegacyTagType: return(Payload = childTag as LegacyExtendRequestPayload ?? new LegacyExtendRequestPayload(childTag)); case Constants.ExtendResponsePayload.LegacyTagType: return(Payload = childTag as LegacyExtendResponsePayload ?? new LegacyExtendResponsePayload(childTag)); case Constants.LegacyExtendErrorPayload.TagType: return(ErrorPayload = childTag as LegacyExtendErrorPayload ?? new LegacyExtendErrorPayload(childTag)); default: return(base.ParseChild(childTag)); } }