Esempio n. 1
0
        public void initWithDefaults()
        {
            BitString param_AttrBitStrDef =
                new BitString(CoderUtils.defStringToOctetString("'011'B"));

            AttrBitStrDef = param_AttrBitStrDef;
        }
Esempio n. 2
0
        public virtual int encodeSet(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;

            PropertyInfo[] fields = null;
            if (elementInfo.hasPreparedInfo())
            {
                fields = elementInfo.getProperties(obj.GetType());
            }
            else
            {
                SortedList <int, PropertyInfo> fieldOrder = CoderUtils.getSetOrder(obj.GetType());
                //TO DO Performance optimization need (unnecessary copy)
                fields = new PropertyInfo[fieldOrder.Count];
                fieldOrder.Values.CopyTo(fields, 0);
            }

            resultSize += encodeSequencePreamble(obj, fields, stream, elementInfo);
            int fieldIdx = 0;

            foreach (PropertyInfo field in fields)
            {
                resultSize += encodeSequenceField(obj, fieldIdx++, field, stream, elementInfo);
            }
            return(resultSize);
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
        public override int encode(IASN1TypesEncoder encoder, object obj, Stream stream, ElementInfo elementInfo)
        {
            Object result = null;
            ASN1ElementMetadata saveInfo = elementInfo.PreparedASN1ElementInfo;

            elementInfo.PreparedInfo = (valueFieldMeta);
            if (!CoderUtils.isNullField(valueField, elementInfo))
            {
                result = encoder.invokeGetterMethodForField(valueField, obj, elementInfo);
            }
            if (saveInfo != null)
            {
                if (!saveInfo.HasTag &&
                    elementInfo.hasPreparedASN1ElementInfo() &&
                    elementInfo.PreparedASN1ElementInfo.HasTag)
                {
                    ASN1ElementMetadata elData = new ASN1ElementMetadata(
                        saveInfo.Name,
                        saveInfo.IsOptional,
                        elementInfo.PreparedASN1ElementInfo.HasTag,
                        elementInfo.PreparedASN1ElementInfo.IsImplicitTag,
                        elementInfo.PreparedASN1ElementInfo.TagClass,
                        elementInfo.PreparedASN1ElementInfo.Tag,
                        saveInfo.HasDefaultValue
                        );
                    elementInfo.PreparedASN1ElementInfo = elData;
                }
                else
                {
                    elementInfo.PreparedASN1ElementInfo = (saveInfo);
                }
            }
            return(valueFieldMeta.TypeMetadata.encode(encoder, result, stream, elementInfo));
        }
Esempio n. 5
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);
        }
Esempio n. 6
0
        public override int encodeSequence(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;

            PropertyInfo[] fields = elementInfo.getProperties(obj.GetType());
            for (int i = 0; i < fields.Length; i++)
            {
                PropertyInfo field = fields[fields.Length - 1 - i];
                resultSize += encodeSequenceField(obj, fields.Length - 1 - i, field, stream, elementInfo);
            }

            if (!CoderUtils.isSequenceSet(elementInfo))
            {
                resultSize += encodeHeader(
                    BERCoderUtils.getTagValueForElement(
                        elementInfo,
                        TagClasses.Universal,
                        ElementType.Constructed,
                        UniversalTags.Sequence)
                    , resultSize, stream);
            }
            else
            {
                resultSize += encodeHeader(
                    BERCoderUtils.getTagValueForElement(
                        elementInfo,
                        TagClasses.Universal,
                        ElementType.Constructed,
                        UniversalTags.Set)
                    , resultSize, stream);
            }
            return(resultSize);
        }
Esempio n. 7
0
        public override int encodeEnumItem(object enumConstant, Type enumClass, Stream stream, ElementInfo elementInfo)
        {
            ASN1EnumItem enumObj = elementInfo.getAttribute <ASN1EnumItem>();
            //int min = 0, max = enumClass.GetFields().Length, val = 0;
            int min = 0, max = 0, val = 0;

            foreach (FieldInfo enumItem in enumClass.GetFields())
            {
                if (CoderUtils.isAttributePresent <ASN1EnumItem>(enumItem))
                {
                    ASN1EnumItem enumItemObj = CoderUtils.getAttribute <ASN1EnumItem>(enumItem);
                    if (enumItemObj.Tag == enumObj.Tag)
                    {
                        val = max;
                    }
                    max++; //val++;
                }
            }
            if (max > 0)
            {
                return(encodeConstraintNumber(val, min, max, (BitArrayOutputStream)stream));
            }
            else
            {
                throw new Exception("Unable to present any enum item!");
            }
        }
Esempio n. 8
0
            public void initWithDefaults()
            {
                ExtendedStatus param_ExtendedStatusMask =
                    new ExtendedStatus(CoderUtils.defStringToOctetString("'1111'B"));

                ExtendedStatusMask = param_ExtendedStatusMask;
            }
Esempio n. 9
0
        public override int encodeReal(object obj, Stream stream, ElementInfo elementInfo)
        {
            int    resultSize = 0;
            Double value      = (Double)obj;
            //CoderUtils.checkConstraints(value,elementInfo);
            int szOfInt = 0;

#if PocketPC
            byte[] dblValAsBytes = System.BitConverter.GetBytes(value);
            long   asLong        = System.BitConverter.ToInt64(dblValAsBytes, 0);
#else
            long asLong = BitConverter.DoubleToInt64Bits(value);
#endif
            if (value == Double.PositiveInfinity)
            {
                // positive infinity
                stream.WriteByte(0x40); // 01000000 Value is PLUS-INFINITY
            }
            else if (value == Double.NegativeInfinity)
            {
                // negative infinity
                stream.WriteByte(0x41); // 01000001 Value is MINUS-INFINITY
            }
            else if (asLong != 0x0)
            {
                long exponent = ((0x7ff0000000000000L & asLong) >> 52) - 1023 - 52;
                long mantissa = 0x000fffffffffffffL & asLong;
                mantissa |= 0x10000000000000L; // set virtual delimiter

                // pack mantissa for base 2
                while ((mantissa & 0xFFL) == 0x0)
                {
                    mantissa >>= 8;
                    exponent  += 8; //increment exponent to 8 (base 2)
                }
                while ((mantissa & 0x01L) == 0x0)
                {
                    mantissa >>= 1;
                    exponent  += 1; //increment exponent to 1
                }

                szOfInt += encodeIntegerValue(mantissa, stream);
                int szOfExp = CoderUtils.getIntegerLength(exponent);
                szOfInt += encodeIntegerValue(exponent, stream);

                byte realPreamble = 0x80;
                realPreamble |= (byte)(szOfExp - 1);
                if (((ulong)asLong & 0x8000000000000000L) == 1)
                {
                    realPreamble |= 0x40; // Sign
                }
                stream.WriteByte(realPreamble);
                szOfInt += 1;
            }
            resultSize += szOfInt;
            resultSize += encodeLength(szOfInt, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Real), stream);
            return(resultSize);
        }
Esempio n. 10
0
        public override int encodeReal(object obj, System.IO.Stream stream, ElementInfo elementInfo)
        {
            int result = 0;
            BitArrayOutputStream bitStream = (BitArrayOutputStream)stream;
            Double value = (Double)obj;
            //CoderUtils.checkConstraints(value,elementInfo);

            long asLong = System.BitConverter.DoubleToInt64Bits(value);

            if (value == Double.PositiveInfinity)
            { // positive infinity
                result += encodeLengthDeterminant(1, bitStream);
                doAlign(stream);
                stream.WriteByte(0x40); // 01000000 Value is PLUS-INFINITY
                result += 1;
            }
            else if (value == Double.NegativeInfinity)
            { // negative infinity
                result += encodeLengthDeterminant(1, bitStream);
                doAlign(stream);
                stream.WriteByte(0x41); // 01000001 Value is MINUS-INFINITY
                result += 1;
            }
            else if (asLong != 0)
            {
                long exponent = ((0x7ff0000000000000L & asLong) >> 52) - 1023 - 52;
                long mantissa = 0x000fffffffffffffL & asLong;
                mantissa |= 0x10000000000000L; // set virtual delimeter

                // pack mantissa for base 2
                while ((mantissa & 0xFFL) == 0)
                {
                    mantissa >>= 8;
                    exponent  += 8; //increment exponent to 8 (base 2)
                }
                while ((mantissa & 0x01L) == 0)
                {
                    mantissa >>= 1;
                    exponent  += 1; //increment exponent to 1
                }

                int szOfExp = CoderUtils.getIntegerLength(exponent);
                encodeLengthDeterminant(CoderUtils.getIntegerLength(mantissa) + szOfExp + 1, bitStream);
                doAlign(stream);

                byte realPreamble = 0x80;
                realPreamble |= (byte)(szOfExp - 1);
                if ((((ulong)asLong) & 0x8000000000000000L) == 0x8000000000000000L)
                {
                    realPreamble |= 0x40; // Sign
                }
                stream.WriteByte(realPreamble);
                result += 1;

                result += encodeIntegerValueAsBytes(exponent, stream);
                result += encodeIntegerValueAsBytes(mantissa, stream);
            }
            return(result);
        }
Esempio n. 11
0
        /// <summary>
        ///     Encoding of a constrained whole number
        ///     ITU-T X.691. 10.5.
        ///     NOTE – (Tutorial) This subclause is referenced by other clauses,
        ///     and itself references earlier clauses for the production of
        ///     a nonnegative-binary-integer or a 2's-complement-binary-integer encoding.
        /// </summary>
        protected virtual int encodeConstraintNumber(long val, long min, long max, BitArrayOutputStream stream)
        {
            int  result      = 0;
            long valueRange  = max - min;
            long narrowedVal = val - min;
            int  maxBitLen   = PERCoderUtils.getMaxBitLength(valueRange);

            if (valueRange == 0)
            {
                return(result);
            }

            // The rest of this Note addresses the ALIGNED variant.
            if (valueRange > 0 && valueRange < 256)
            {
                /*
                 * 1. Where the range is less than or equal to 255, the value encodes
                 * into a bit-field of the minimum size for the range.
                 * 2. Where the range is exactly 256, the value encodes
                 * into a single octet octet-aligned bit-field.
                 */
                doAlign(stream);
                for (int i = maxBitLen - 1; i >= 0; i--)
                {
                    int bitValue = (int)((narrowedVal >> i) & 0x1);
                    stream.writeBit(bitValue);
                }
                result = 1;
            }
            else if (valueRange > 0 && valueRange < 65536)
            {
                /*
                 * 3. Where the range is 257 to 64K, the value encodes into
                 * a two octet octet-aligned bit-field.
                 */
                doAlign(stream);
                stream.WriteByte((byte)(narrowedVal >> 8));
                stream.WriteByte((byte)(narrowedVal & 0xFF));
                result = 2;
            }
            else
            {
                /*
                 * 4. Where the range is greater than 64K, the range is ignored
                 * and the value encodes into an  octet-aligned bit-field
                 * which is the minimum number of octets for the value.
                 * In this latter case, later procedures (see 10.9)
                 * also encode a length field (usually a single octet) to indicate
                 * the length of the encoding. For the other cases, the length
                 * of the encoding is independent of the value being encoded,
                 * and is not explicitly encoded.
                 */
                result = encodeConstraintLengthDeterminant(CoderUtils.getIntegerLength(narrowedVal), 1, CoderUtils.getPositiveIntegerLength(valueRange), stream);
                doAlign(stream);
                result += encodeIntegerValueAsBytes(narrowedVal, stream);
            }
            return(result);
        }
Esempio n. 12
0
        /// <summary>
        ///     Decode of the constrained whole number
        ///     ITU-T X.691. 10.5.
        ///     NOTE – (Tutorial) This subclause is referenced by other clauses,
        ///     and itself references earlier clauses for the production of
        ///     a nonnegative-binary-integer or a 2's-complement-binary-integer encoding.
        /// </summary>
        protected virtual long decodeConstraintNumber(long min, long max, BitArrayInputStream stream)
        {
            long result     = 0;
            long valueRange = max - min;
            //!!!! int narrowedVal = value - min; !!!
            int maxBitLen = PERCoderUtils.getMaxBitLength(valueRange);

            if (valueRange == 0)
            {
                return(max);
            }

            // The rest of this Note addresses the ALIGNED variant.
            if (valueRange > 0 && valueRange < 256)
            {
                /*
                 * 1. Where the range is less than or equal to 255, the value encodes
                 * into a bit-field of the minimum size for the range.
                 * 2. Where the range is exactly 256, the value encodes
                 * into a single octet octet-aligned bit-field.
                 */
                skipAlignedBits(stream);
                result  = stream.readBits(maxBitLen);
                result += min;
            }
            else if (valueRange > 0 && valueRange < 65536)
            {
                /*
                 * 3. Where the range is 257 to 64K, the value encodes into
                 * a two octet octet-aligned bit-field.
                 */
                skipAlignedBits(stream);
                result  = stream.ReadByte() << 8;
                result  = (int)result | stream.ReadByte();
                result += min;
            }
            else
            {
                /*
                 * 4. Where the range is greater than 64K, the range is ignored
                 * and the value encodes into an  octet-aligned bit-field
                 * which is the minimum number of octets for the value.
                 * In this latter case, later procedures (see 10.9)
                 * also encode a length field (usually a single octet) to indicate
                 * the length of the encoding. For the other cases, the length
                 * of the encoding is independent of the value being encoded,
                 * and is not explicitly encoded.
                 */
                int intLen = decodeConstraintLengthDeterminant(1, CoderUtils.getPositiveIntegerLength(valueRange), stream);
                skipAlignedBits(stream);
                result  = (int)decodeIntegerValueAsBytes(intLen, stream);
                result += min;
            }

            return(result);
        }
Esempio n. 13
0
        /// <summary>
        ///     Encoding of a unconstrained whole number
        ///     ITU-T X.691. 10.8.
        ///     NOTE – (Tutorial) This case only arises in the encoding of the
        ///     value of an integer type with no lower bound. The procedure
        ///     encodes the value as a 2's-complement-binary-integer into
        ///     the minimum number of octets required to accommodate the encoding,
        ///     and requires an explicit length encoding (typically a single octet)
        ///     as specified in later procedures.
        /// </summary>
        protected virtual int encodeUnconstraintNumber(long val, BitArrayOutputStream stream)
        {
            int result = 0;
            int intLen = CoderUtils.getIntegerLength(val);

            result += encodeLengthDeterminant(intLen, stream);
            doAlign(stream);
            result += encodeIntegerValueAsBytes(val, stream);
            return(result);
        }
Esempio n. 14
0
        protected virtual int encodeIntegerValueAsBytes(long val, Stream stream)
        {
            int integerSize = CoderUtils.getIntegerLength(val);

            for (int i = integerSize - 1; i >= 0; i--)
            {
                long valueTmp = val >> (8 * i);
                stream.WriteByte((byte)valueTmp);
            }
            return(integerSize);
        }
Esempio n. 15
0
 public override void setParentAnnotated(ICustomAttributeProvider parent)
 {
     if (parent != null)
     {
         if (CoderUtils.isAttributePresent <ASN1String>(parent))
         {
             ASN1String value = CoderUtils.getAttribute <ASN1String>(parent);
             stringType = value.StringType;
         }
     }
 }
Esempio n. 16
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));
        }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        protected internal int encodeIntegerValue(long val, Stream stream)
        {
            int resultSize = CoderUtils.getIntegerLength(val);

            for (int i = 0; i < resultSize; i++)
            {
                stream.WriteByte((byte)val);
                val = val >> 8;
            }
            return(resultSize);
        }
Esempio n. 19
0
        /// <summary>
        ///     Encoding of a semi-constrained whole number
        ///     ITU-T X.691. 10.7.
        ///     NOTE – (Tutorial) This procedure is used when a lower bound can be
        ///     identified but not an upper bound. The encoding procedure places
        ///     the offset from the lower bound into the minimum number of octets
        ///     as a non-negative-binary-integer, and requires an explicit length
        ///     encoding (typically a single octet) as specified in later procedures.
        /// </summary>
        protected virtual int encodeSemiConstraintNumber(int val, int min, BitArrayOutputStream stream)
        {
            int result      = 0;
            int narrowedVal = val - min;
            int intLen      = CoderUtils.getIntegerLength(narrowedVal);

            result += encodeLengthDeterminant(intLen, stream);
            doAlign(stream);
            result += encodeIntegerValueAsBytes(narrowedVal, stream);
            return(result);
        }
Esempio n. 20
0
        public static bool is7BitEncodedString(ElementInfo info)
        {
            bool is7Bit     = false;
            int  stringType = CoderUtils.getStringTagForElement(info);

            is7Bit = (
                stringType == org.bn.coders.UniversalTags.PrintableString ||
                stringType == org.bn.coders.UniversalTags.VisibleString
                );
            return(is7Bit);
        }
Esempio n. 21
0
        public override DecodedObject <object> decode(IASN1TypesDecoder decoder, DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream)
        {
            IASN1PreparedElementData saveInfo     = elementInfo.PreparedInfo;
            IASN1PreparedElement     instance     = (IASN1PreparedElement)elementInfo.PreparedInstance;
            ASN1ElementMetadata      saveElemInfo = elementInfo.PreparedASN1ElementInfo;

            elementInfo.PreparedInfo = (valueFieldMeta);

            if (saveElemInfo != null)
            {
                if (!saveElemInfo.HasTag &&
                    elementInfo.hasPreparedASN1ElementInfo() &&
                    elementInfo.PreparedASN1ElementInfo.HasTag)
                {
                    ASN1ElementMetadata elData = new ASN1ElementMetadata(
                        saveElemInfo.Name,
                        saveElemInfo.IsOptional,
                        elementInfo.PreparedASN1ElementInfo.HasTag,
                        elementInfo.PreparedASN1ElementInfo.IsImplicitTag,
                        elementInfo.PreparedASN1ElementInfo.TagClass,
                        elementInfo.PreparedASN1ElementInfo.Tag,
                        saveElemInfo.HasDefaultValue
                        );
                    elementInfo.PreparedASN1ElementInfo = elData;
                }
                else
                {
                    elementInfo.PreparedASN1ElementInfo = (saveElemInfo);
                }
            }
            DecodedObject <object> decodedResult =
                valueFieldMeta.TypeMetadata.decode(decoder, decodedTag, valueField.PropertyType, elementInfo, stream);

            if (decodedResult != null)
            {
                if (!CoderUtils.isNullField(valueField, elementInfo))
                {
                    decoder.invokeSetterMethodForField(valueField, instance, decodedResult.Value, elementInfo);
                }
            }
            elementInfo.PreparedInfo            = (saveInfo);
            elementInfo.PreparedInstance        = (instance);
            elementInfo.PreparedASN1ElementInfo = (saveElemInfo);

            if (decodedResult != null)
            {
                return(new DecodedObject <object>(instance, decodedResult.Size));
            }
            else
            {
                return(decodedResult);
            }
        }
Esempio n. 22
0
        public override DecodedObject <object> decodeSequence(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream)
        {
            BitArrayInputStream bitStream = (BitArrayInputStream)stream;
            int preambleLen        = getSequencePreambleBitLen(objectClass, elementInfo);
            int preamble           = bitStream.readBits(preambleLen);
            int preambleCurrentBit = 32 - preambleLen;

            skipAlignedBits(stream);
            object sequence = createInstanceForElement(objectClass, elementInfo);

            initDefaultValues(sequence);
            ElementInfo info = new ElementInfo();
            int         idx  = 0;

            PropertyInfo[] fields = null;

            if (!CoderUtils.isSequenceSet(elementInfo) || elementInfo.hasPreparedInfo())
            {
                fields = elementInfo.getProperties(objectClass);
            }
            else
            {
                SortedList <int, PropertyInfo> fieldOrder = CoderUtils.getSetOrder(sequence.GetType());
                fields = new PropertyInfo[fieldOrder.Values.Count];
                fieldOrder.Values.CopyTo(fields, 0);
            }

            foreach (PropertyInfo field in fields)
            {
                if (elementInfo.hasPreparedInfo())
                {
                    info.PreparedInfo = elementInfo.PreparedInfo.getPropertyMetadata(idx);
                }
                if (CoderUtils.isOptionalField(field, info))
                {
                    if ((preamble & (0x80000000 >> preambleCurrentBit)) != 0)
                    {
                        decodeSequenceField(null, sequence, idx, field, stream, elementInfo, true);
                    }
                    preambleCurrentBit++;
                }
                else
                {
                    decodeSequenceField(null, sequence, idx, field, stream, elementInfo, true);
                }
                idx++;
            }
            return(new DecodedObject <object>(sequence));

            /*            }
             *          else
             *              return decodeSet(decodedTag, objectClass, elementInfo, stream);*/
        }
Esempio n. 23
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));
        }
Esempio n. 24
0
        public override int encodeString(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;

            byte[] val = CoderUtils.ASN1StringToBuffer(obj, elementInfo);
            resultSize = encodeLength(val.Length, elementInfo, stream);
            doAlign(stream);
            resultSize += val.Length;
            if (val.Length > 0)
            {
                stream.Write(val, 0, val.Length);
            }
            return(resultSize);
        }
Esempio n. 25
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));
        }
Esempio n. 26
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);
        }
Esempio n. 27
0
        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);
        }
Esempio n. 28
0
        /**
         * @see CoderUtils#defStringToOctetString(String)
         */
        public void testDefStringToOctetString()
        {
            BitString result = CoderUtils.defStringToOctetString("'FFAABBEE'H");

            ByteTools.checkBuffers(result.Value, new byte[] { (byte)0xFF, (byte)0xAA, (byte)0xBB, (byte)0xEE });

            result = CoderUtils.defStringToOctetString("'FFAABBEEC'H");
            ByteTools.checkBuffers(result.Value, new byte[] { (byte)0xFF, (byte)0xAA, (byte)0xBB, (byte)0xEE, (byte)0xC0 });

            result = CoderUtils.defStringToOctetString("'111100001111000010011001'B");
            ByteTools.checkBuffers(result.Value, new byte[] { (byte)0xF0, (byte)0xF0, (byte)0x99 });

            result = CoderUtils.defStringToOctetString("'1111000011110000100110011'B");
            ByteTools.checkBuffers(result.Value, new byte[] { (byte)0xF0, (byte)0xF0, (byte)0x99, (byte)0x80 });
        }
Esempio n. 29
0
        public override int encodeSequence(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;

            if (!CoderUtils.isSequenceSet(elementInfo))
            {
                resultSize += encodeSequencePreamble(obj, elementInfo.getProperties(obj.GetType()), stream, elementInfo);
                resultSize += base.encodeSequence(obj, stream, elementInfo);
            }
            else
            {
                resultSize += encodeSet(obj, stream, elementInfo);
            }
            return(resultSize);
        }
Esempio n. 30
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));
        }