예제 #1
0
        public override int encodeBitString(Object obj, System.IO.Stream stream, ElementInfo elementInfo)
        {
            int       resultSize = 0;
            BitString str        = (BitString)obj;

            CoderUtils.checkConstraints(str.getLengthInBits(), elementInfo);
            byte[] buffer = str.Value;
            string s      = "";

            if (elementInfo.hasPreparedInfo() && elementInfo.hasPreparedASN1ElementInfo())
            {
                s = elementInfo.PreparedASN1ElementInfo.Name;
            }
            if (s == "")
            {
                s = "unnamedBitString" + unknown.ToString("D3");
                unknown++;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < buffer.Length; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    sb.Append((buffer[i] >> j & 1).ToString());
                }
                if (i < buffer.Length - 1)
                {
                    sb.Append(',');
                }
            }
            resultSize += printString(stream, "<" + s + " type=\"BitString\">" + sb.ToString() + "</" + s + ">\r\n");
            return(resultSize);
        }
예제 #2
0
        public override int encodeAny(object obj, System.IO.Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0, sizeOfString = 0;

            byte[] buffer = (byte[])obj;
            CoderUtils.checkConstraints(sizeOfString, elementInfo);
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < buffer.Length; i++)
            {
                sb.Append(buffer[i]);
                sb.Append(',');
            }
            string s = "";

            if (elementInfo.hasPreparedInfo() && elementInfo.hasPreparedASN1ElementInfo())
            {
                s = elementInfo.PreparedASN1ElementInfo.Name;
            }
            if (s == "")
            {
                s = "unnamedAny" + unknown.ToString("D3");
                unknown++;
            }
            resultSize += printString(stream, "<" + s + " type=\"Any\">" + sb.ToString() + "</" + s + ">\r\n");
            return(resultSize);
        }
예제 #3
0
        public override DecodedObject <object> decodeSequenceOf(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream)
        {
            if (!CoderUtils.isSequenceSetOf(elementInfo))
            {
                if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence, elementInfo))
                {
                    return(null);
                }
            }
            else
            {
                if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set, elementInfo))
                {
                    return(null);
                }
            }

            Type   paramType         = (System.Type)objectClass.GetGenericArguments()[0];
            Type   collectionType    = typeof(List <>);
            Type   genCollectionType = collectionType.MakeGenericType(paramType);
            Object param             = Activator.CreateInstance(genCollectionType);

            DecodedObject <int> len = decodeLength(stream);

            if (len.Value != 0)
            {
                int lenOfItems = 0;
                int itemsCnt   = 0;
                do
                {
                    ElementInfo info = new ElementInfo();
                    info.ParentAnnotatedClass = elementInfo.AnnotatedClass;
                    info.AnnotatedClass       = paramType;

                    if (elementInfo.hasPreparedInfo())
                    {
                        ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                        info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                    }

                    DecodedObject <object> itemTag = decodeTag(stream);
                    DecodedObject <object> item    = decodeClassType(itemTag, paramType, info, stream);
                    MethodInfo             method  = param.GetType().GetMethod("Add");
                    if (item != null)
                    {
                        lenOfItems += item.Size + itemTag.Size;
                        method.Invoke(param, new object[] { item.Value });
                        itemsCnt++;
                    }
                }while (lenOfItems < len.Value);
                CoderUtils.checkConstraints(itemsCnt, elementInfo);
            }
            return(new DecodedObject <object>(param, len.Value + len.Size));
        }
예제 #4
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeAny(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0, sizeOfString = 0;

            byte[] buffer = (byte[])obj;
            sizeOfString = buffer.Length;
            CoderUtils.checkConstraints(sizeOfString, elementInfo);
            stream.Write(buffer, 0, buffer.Length);
            resultSize += sizeOfString;
            return(resultSize);
        }
예제 #5
0
        public override DecodedObject <object> decodeOctetString(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream)
        {
            if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Primitive, UniversalTags.OctetString, elementInfo))
            {
                return(null);
            }
            DecodedObject <int> len = decodeLength(stream);

            CoderUtils.checkConstraints(len.Value, elementInfo);
            byte[] byteBuf = new byte[len.Value];
            stream.Read(byteBuf, 0, byteBuf.Length);
            return(new DecodedObject <object>(byteBuf, len.Value + len.Size));
        }
예제 #6
0
        public override DecodedObject <object> decodeBitString(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream)
        {
            if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Primitive, UniversalTags.Bitstring, elementInfo))
            {
                return(null);
            }
            DecodedObject <int> len = decodeLength(stream);
            int trailBitCnt         = stream.ReadByte();

            CoderUtils.checkConstraints(len.Value * 8 - trailBitCnt, elementInfo);
            byte[] byteBuf = new byte[len.Value - 1];
            stream.Read(byteBuf, 0, byteBuf.Length);
            return(new DecodedObject <object>(new BitString(byteBuf, trailBitCnt), len.Value + len.Size));
        }
예제 #7
0
        protected int encodeLength(int val, ElementInfo elementInfo, System.IO.Stream stream)
        {
            CoderUtils.checkConstraints(val, elementInfo);
            int resultSize = 0;
            BitArrayOutputStream bitStream = (BitArrayOutputStream)stream;

            if (elementInfo.hasPreparedInfo())
            {
                if (elementInfo.PreparedInfo.hasConstraint())
                {
                    IASN1ConstraintMetadata constraint = elementInfo.PreparedInfo.Constraint;
                    if (constraint is ASN1ValueRangeConstraintMetadata)
                    {
                        resultSize += encodeConstraintLengthDeterminant(
                            val,
                            (int)((ASN1ValueRangeConstraintMetadata)constraint).Min,
                            (int)((ASN1ValueRangeConstraintMetadata)constraint).Max,
                            bitStream
                            );
                    }
                    else
                    if (constraint is ASN1SizeConstraintMetadata)
                    {
                    }
                }
                else
                {
                    resultSize += encodeLengthDeterminant(val, bitStream);
                }
            }
            else
            {
                if (elementInfo.isAttributePresent <ASN1ValueRangeConstraint>())
                {
                    ASN1ValueRangeConstraint constraint = elementInfo.getAttribute <ASN1ValueRangeConstraint>();
                    resultSize += encodeConstraintLengthDeterminant(val, (int)constraint.Min, (int)constraint.Max, bitStream);
                }
                else
                if (elementInfo.isAttributePresent <ASN1SizeConstraint>())
                {
                    ASN1SizeConstraint constraint = elementInfo.getAttribute <ASN1SizeConstraint>();
                }
                else
                {
                    resultSize += encodeLengthDeterminant(val, bitStream);
                }
            }
            return(resultSize);
        }
예제 #8
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeString(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0, sizeOfString = 0;

            byte[] buffer = CoderUtils.ASN1StringToBuffer(obj, elementInfo);
            sizeOfString = buffer.Length;
            CoderUtils.checkConstraints(sizeOfString, elementInfo);

            stream.Write(buffer, 0, buffer.Length);

            resultSize += sizeOfString;
            resultSize += encodeLength(sizeOfString, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, CoderUtils.getStringTagForElement(elementInfo)), stream);
            return(resultSize);
        }
예제 #9
0
        public override DecodedObject <object> decodeString(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream)
        {
            if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Primitive, CoderUtils.getStringTagForElement(elementInfo), elementInfo))
            {
                return(null);
            }
            DecodedObject <int> len = decodeLength(stream);

            CoderUtils.checkConstraints(len.Value, elementInfo);
            byte[] byteBuf = new byte[len.Value];
            stream.Read(byteBuf, 0, byteBuf.Length);
            string result = CoderUtils.bufferToASN1String(byteBuf, elementInfo);

            return(new DecodedObject <object>(result, len.Value + len.Size));
        }
예제 #10
0
        protected virtual int decodeLength(ElementInfo elementInfo, System.IO.Stream stream)
        {
            int result = 0;
            BitArrayInputStream bitStream = (BitArrayInputStream)stream;

            if (elementInfo.hasPreparedInfo())
            {
                if (elementInfo.PreparedInfo.hasConstraint())
                {
                    IASN1ConstraintMetadata constraint = elementInfo.PreparedInfo.Constraint;
                    if (constraint is ASN1ValueRangeConstraintMetadata)
                    {
                        result = decodeConstraintLengthDeterminant(
                            (int)((ASN1ValueRangeConstraintMetadata)constraint).Min,
                            (int)((ASN1ValueRangeConstraintMetadata)constraint).Max,
                            bitStream
                            );
                    }
                    else
                    if (constraint is ASN1SizeConstraintMetadata)
                    {
                        result = (int)((ASN1SizeConstraintMetadata)constraint).Max;
                    }
                }
                else
                {
                    result = decodeLengthDeterminant(bitStream);
                }
            }
            else
            if (elementInfo.isAttributePresent <ASN1ValueRangeConstraint>())
            {
                ASN1ValueRangeConstraint constraint = elementInfo.getAttribute <ASN1ValueRangeConstraint>();
                result = decodeConstraintLengthDeterminant((int)constraint.Min, (int)constraint.Max, bitStream);
            }
            else
            if (elementInfo.isAttributePresent <ASN1SizeConstraint>())
            {
                ASN1SizeConstraint constraint = elementInfo.getAttribute <ASN1SizeConstraint>();
                result = (int)constraint.Max;
            }
            else
            {
                result = decodeLengthDeterminant(bitStream);
            }
            CoderUtils.checkConstraints(result, elementInfo);
            return(result);
        }
예제 #11
0
 public override DecodedObject <object> decodeInteger(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream)
 {
     if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Primitive, UniversalTags.Integer, elementInfo))
     {
         return(null);
     }
     if (objectClass.Equals(typeof(int)))
     {
         DecodedObject <object> result = decodeIntegerValue(stream);
         CoderUtils.checkConstraints((int)result.Value, elementInfo);
         return(result);
     }
     else
     {
         DecodedObject <object> result = decodeLongValue(stream);
         CoderUtils.checkConstraints((long)result.Value, elementInfo);
         return(result);
     }
 }
예제 #12
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeBitString(Object obj, Stream stream, ElementInfo elementInfo)
        {
            int       resultSize = 0, sizeOfString = 0;
            BitString str = (BitString)obj;

            CoderUtils.checkConstraints(str.getLengthInBits(), elementInfo);
            byte[] buffer = str.Value;
            stream.Write(buffer, 0, buffer.Length);
            stream.WriteByte((byte)str.getTrailBitsCnt());
            sizeOfString = buffer.Length + 1;

            resultSize += sizeOfString;
            resultSize += encodeLength(sizeOfString, stream);
            resultSize += encodeTag(
                BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Bitstring),
                stream
                );
            return(resultSize);
        }
예제 #13
0
        public override int encodeSequenceOf(object obj, System.IO.Stream stream, ElementInfo elementInfo)
        {
            int    resultSize = 0;
            string s          = "";

            if (elementInfo.hasPreparedInfo() && elementInfo.hasPreparedASN1ElementInfo())
            {
                s = elementInfo.PreparedASN1ElementInfo.Name;
            }
            if (s == "")
            {
                s = "unnamedSequenceOf" + unknown.ToString("D3");
                unknown++;
            }
            resultSize += printString(stream, "<" + s + " type=\"SequenceOf\">\r\n");
            indent     += indOfs;
            System.Collections.IList collection = (System.Collections.IList)obj;
            CoderUtils.checkConstraints(collection.Count, elementInfo);

            int sizeOfCollection = 0;

            //for (int i = 0; i < collection.Count; i++)
            for (int i = collection.Count - 1; i >= 0; i--)
            {
                object      item = collection[collection.Count - 1 - i];
                ElementInfo info = new ElementInfo();
                info.AnnotatedClass       = item.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo() && elementInfo.PreparedInfo.TypeMetadata != null)
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                sizeOfCollection += encodeClassType(item, stream, info);
            }
            resultSize += sizeOfCollection;
            indent     -= indOfs;
            resultSize += printString(stream, "</" + s + ">\r\n");
            return(resultSize);
        }
예제 #14
0
        public override DecodedObject <object> decodeAny(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream)
        {
            int bufSize = elementInfo.MaxAvailableLen;

            if (bufSize == 0)
            {
                return(null);
            }
            System.IO.MemoryStream anyStream = new System.IO.MemoryStream(1024);

            /*int tagValue = (int)decodedTag.Value;
             * for (int i = 0; i < decodedTag.Size; i++)
             * {
             *  anyStream.WriteByte((byte)tagValue);
             *  tagValue = tagValue >> 8;
             * }*/

            if (bufSize < 0)
            {
                bufSize = 1024;
            }
            int len = 0;

            if (bufSize > 0)
            {
                byte[] buffer = new byte[bufSize];
                int    readed = stream.Read(buffer, 0, buffer.Length);
                while (readed > 0)
                {
                    anyStream.Write(buffer, 0, readed);
                    len += readed;
                    if (elementInfo.MaxAvailableLen > 0)
                    {
                        break;
                    }
                    readed = stream.Read(buffer, 0, buffer.Length);
                }
            }
            CoderUtils.checkConstraints(len, elementInfo);
            return(new DecodedObject <object>(anyStream.ToArray(), len));
        }
예제 #15
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeInteger(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;
            int szOfInt    = 0;

            if (obj.GetType().Equals(typeof(int)))
            {
                int val = (int)obj;
                CoderUtils.checkConstraints(val, elementInfo);
                szOfInt = encodeIntegerValue(val, stream);
            }
            else
            {
                long val = (long)obj;
                CoderUtils.checkConstraints(val, elementInfo);
                szOfInt = encodeIntegerValue(val, stream);
            }
            resultSize += szOfInt;
            resultSize += encodeLength(szOfInt, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Integer), stream);
            return(resultSize);
        }
예제 #16
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeSequenceOf(object obj, Stream stream, ElementInfo elementInfo)
        {
            int   resultSize = 0;
            IList collection = (IList)obj;

            CoderUtils.checkConstraints(collection.Count, elementInfo);

            int sizeOfCollection = 0;

            for (int i = 0; i < collection.Count; i++)
            {
                object      item = collection[collection.Count - 1 - i];
                ElementInfo info = new ElementInfo();
                info.AnnotatedClass       = item.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo())
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                sizeOfCollection += encodeClassType(item, stream, info);
            }
            resultSize += sizeOfCollection;
            resultSize += encodeLength(sizeOfCollection, stream);

            if (!CoderUtils.isSequenceSetOf(elementInfo))
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence), stream);
            }
            else
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set), stream);
            }
            return(resultSize);
        }