private static void parseUserInfo(byte[] data, CosemParameters parameters, CosemConnection connection)
        {
            if (data == null || data.Length < 16)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (data[0] != Constants.Ber.OCTET_STRING)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (data[1] < 14 || data[1] != data.Length - 2)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (parameters.securityType != SecurityType.NONE)
            {
                if (data[2] != Constants.xDlmsApdu.GlobalCiphering.INITIATE_RESPONSE)
                {
                    throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
                }
                if (data[3] != data.Length - 4)
                {
                    throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
                }
                byte[] encrypted = new byte[data[3] & 0xFF];
                Array.Copy(data, 4, encrypted, 0, encrypted.Length);
                data = Security.reverseAuthenticatedEncryption(parameters, connection, encrypted);
            }
            else
            {
                data = helper.extensions.copyOfRange(data, 2, data.Length);
            }
            if (data[0] != Constants.xDlmsApdu.NoCiphering.INITIATE_RESPONSE)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (data[1] != 0 || data[2] != Constants.DLMS_VERSION)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (data[3] != Constants.ConformanceBlock.TAG)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (data[4] != 0x1F || data[5] != 0x04 || data[6] != 0x00)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            connection.conformanceBlock = helper.extensions.copyOfRange(data, 7, 10);
            //int vaa = ByteBuffer.allocate(2).put(Arrays.copyOfRange(data, 12, data.Length)).getShort(0);
            byte[] aux = helper.extensions.copyOfRange(data, 12, data.Length);
            int    vaa = BitConverter.ToInt16(new byte[] { (aux[1]), (aux[0]) }, 0);

            if (parameters.referenceType == ReferenceType.LOGICAL_NAME && vaa != 0x0007)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            if (parameters.referenceType == ReferenceType.SHORT_NAME && vaa != 0xFA00)
            {
                throw new DlmsException(DlmsException.DlmsExceptionReason.MALFORMED_AARE_FRAME);
            }
            connection.maxPduSize = ((data[10] & 0xFF) << 8) | (data[11] & 0xFF);
        }