コード例 #1
0
        /// <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));
            }
        }
コード例 #2
0
ファイル: TestUtil.cs プロジェクト: Grinderofl/ksi-net-sdk
        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);
        }
コード例 #3
0
        /// <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));
            }
        }
コード例 #4
0
        /// <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)));
        }
コード例 #5
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));
            }
        }
コード例 #6
0
        /// <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));
            }
        }
コード例 #7
0
 /// <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);
 }
コード例 #8
0
 /// <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);
 }
コード例 #9
0
 /// <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);
 }
コード例 #10
0
        /// <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);
                }
            }
        }
コード例 #11
0
        /// <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;
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
ファイル: TlvTag.cs プロジェクト: betosmith2000/ksi-net-sdk
        /// <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;
        }
コード例 #14
0
        /// <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));
            }
        }
コード例 #15
0
        /// <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") + ").");
            }
        }
コード例 #16
0
        /// <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);
        }
コード例 #17
0
ファイル: Pdu.cs プロジェクト: betosmith2000/ksi-net-sdk
        /// <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;
                }
            }
        }
コード例 #18
0
        /// <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));
            }
        }
コード例 #19
0
        /// <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));
            }
        }
コード例 #20
0
        /// <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));
            }
        }
コード例 #21
0
        /// <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));
            }
        }
コード例 #22
0
        /// <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));
            }
        }
コード例 #23
0
        /// <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));
            }
        }
コード例 #24
0
            /// <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;
                }
            }
コード例 #25
0
        /// <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));
            }
        }
コード例 #26
0
        /// <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;
                }
            }
        }
コード例 #27
0
        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");
        }
コード例 #28
0
        /// <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));
            }
        }
コード例 #29
0
        /// <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));
            }
        }
コード例 #30
0
        /// <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));
            }
        }