Beispiel #1
0
        /// <summary>
        /// Constructs a RADIUS packet from the parameters passed.
        /// </summary>
        /// <param name="code">The RADIUS message code.</param>
        /// <param name="identifier">Used to aid matching requests and replies value (0..255).</param>
        /// <param name="authenticator">16 byte autheticator used for hiding passwords.</param>
        /// <param name="attributes">The packet attributes.</param>
        /// <remarks>
        /// <note>
        /// <b>authenticator</b> may be passed as null in situations where
        /// a response authenticator will be computed after the packet is fully
        /// initialized via the <see cref="ComputeResponseAuthenticator" /> method.
        /// </note>
        /// </remarks>
        public RadiusPacket(RadiusCode code, int identifier, byte[] authenticator, params RadiusAttribute[] attributes)
        {
            if (identifier < 0 || identifier > 255)
            {
                throw new ArgumentException("[identifier] must be in the range of 0..255");
            }

            if (authenticator == null)
            {
                authenticator = new byte[16];
            }

            if (authenticator.Length != 16)
            {
                throw new ArgumentException("[authenticator] must be 16 bytes.");
            }

            this.Code          = code;
            this.Identifier    = identifier;
            this.Authenticator = authenticator;
            this.SourceEP      = null;

            this.Attributes = new List <RadiusAttribute>();
            for (int i = 0; i < attributes.Length; i++)
            {
                this.Attributes.Add(attributes[i]);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Constructs a RADIUS packet by parsing the raw UDP packet bytes passed.
        /// </summary>
        /// <param name="sourceEP">The source endpoint for received packets.</param>
        /// <param name="raw">The raw UDP packet.</param>
        /// <param name="length">Size of the raw packet in bytes.</param>
        public RadiusPacket(IPEndPoint sourceEP, byte[] raw, int length)
        {
            int pos;
            int len;

            this.SourceEP = sourceEP;

            // Parse the packet header fields

            if (length < HeaderSize)
            {
                throw new RadiusException(raw, "Bad RADIUS packet: length < 20");
            }

            this.Code       = (RadiusCode)raw[0];
            this.Identifier = raw[1];

            len = (raw[2] << 8) | raw[3];
            if (len > length)
            {
                throw new RadiusException(raw, "Bad RADIUS packet: truncated");
            }

            length = len;

            this.Authenticator = Helper.Extract(raw, 4, 16);

            // Parse the packet attributes

            this.Attributes = new List <RadiusAttribute>();

            pos = HeaderSize;
            while (pos < length - 2)
            {
                RadiusAttributeType aType;
                int    aLen;
                byte[] aValue;

                aType = (RadiusAttributeType)raw[pos++];
                aLen  = raw[pos++] - 2;

                if (aLen < 0)
                {
                    throw new RadiusException(raw, "Bad RADIUS packet: attribute length < 2");
                }

                if (pos + aLen > length)
                {
                    throw new RadiusException(raw, "Bad RADIUS packet: attribute extends past packet");
                }

                aValue = Helper.Extract(raw, pos, aLen);
                pos   += aLen;

                this.Attributes.Add(new RadiusAttribute(aType, aValue));
            }
        }
        public RadiusPacket(RadiusCode packetType, byte identifier)
        {
            PacketType = packetType;
            Identifier = identifier;
            _Length    = RADIUS_HEADER_LENGTH;

            RawData = new byte[RADIUS_HEADER_LENGTH];
            RawData[RADIUS_CODE_INDEX]       = (byte)PacketType;
            RawData[RADIUS_IDENTIFIER_INDEX] = Identifier;
            Array.Copy(BitConverter.GetBytes(_Length), 0, RawData, RADIUS_LENGTH_INDEX, sizeof(ushort));
            Array.Reverse(RawData, RADIUS_LENGTH_INDEX, sizeof(ushort));
        }
Beispiel #4
0
		public RadiusPacket(RadiusCode packetType, byte identifier)
		{
			PacketType = packetType;
			Identifier = identifier;
			_Length = RADIUS_HEADER_LENGTH;

			RawData = new byte[RADIUS_HEADER_LENGTH];
			RawData[RADIUS_CODE_INDEX] = (byte)PacketType;
			RawData[RADIUS_IDENTIFIER_INDEX] = Identifier;
			Array.Copy(BitConverter.GetBytes(_Length), 0, RawData, RADIUS_LENGTH_INDEX, sizeof(ushort));
			Array.Reverse(RawData, RADIUS_LENGTH_INDEX, sizeof(ushort));
		}
            public IList <RadiusAttribute> this[RadiusCode responseType]
            {
                get
                {
                    if (!this.responseLists.ContainsKey(responseType))
                    {
                        this.responseLists[responseType] = new RadiusAttributeList(this.outer.ecb.GetResponse(this.outer.ecbPtr, responseType));
                    }

                    return(this.responseLists[responseType]);
                }
            }
            public IList<RadiusAttribute> this[RadiusCode responseType]
            {
                get
                {
                    if (!this.responseLists.ContainsKey(responseType))
                    {
                        this.responseLists[responseType] = new RadiusAttributeList(this.outer.ecb.GetResponse(this.outer.ecbPtr, responseType));
                    }

                    return this.responseLists[responseType];
                }
            }