Esempio n. 1
0
        private static PrincipalName ReadPrincipal(NdrBuffer buffer)
        {
            var type  = (PrincipalNameType)buffer.ReadInt32BigEndian();
            var count = buffer.ReadInt32BigEndian();

            var realmData = ReadData(buffer);

            string realm = string.Empty;

            if (realmData.length > 0)
            {
                realm = Encoding.UTF8.GetString(realmData.value.ToArray());
            }

            var components = new List <string>();

            for (var i = 0; i < count; i++)
            {
                var component = ReadData(buffer);

                components.Add(Encoding.UTF8.GetString(component.value.ToArray()));
            }

            return(new PrincipalName(type, realm, components));
        }
Esempio n. 2
0
        private void ReadCredentials(NdrBuffer buffer)
        {
            while (buffer.BytesAvailable > 0)
            {
                var cred = new Krb5Credential
                {
                    Client       = ReadPrincipal(buffer),
                    Server       = ReadPrincipal(buffer),
                    KeyBlock     = ReadKeyBlock(buffer),
                    AuthTime     = ReadDateTimeOffset(buffer),
                    StartTime    = ReadDateTimeOffset(buffer),
                    EndTime      = ReadDateTimeOffset(buffer),
                    RenewTill    = ReadDateTimeOffset(buffer),
                    IsKey        = buffer.ReadByteLittleEndian() != 0,
                    Flags        = (TicketFlags)buffer.ReadInt32BigEndian(),
                    Addresses    = ReadAddresses(buffer),
                    AuthData     = ReadAuthData(buffer),
                    Ticket       = ReadData(buffer).value,
                    SecondTicket = ReadData(buffer).value
                };

                if ("X-CACHECONF:".Equals(cred.Server.Realm, StringComparison.OrdinalIgnoreCase))
                {
                    this.ParseConfiguration(cred);
                }
                else
                {
                    this.Credentials.Add(cred);
                }
            }
        }
Esempio n. 3
0
        private static (int length, ReadOnlyMemory <byte> value) ReadData(NdrBuffer buffer)
        {
            /*
             * data ::=
             *     length (32 bits)
             *     value (length bytes)
             */

            var length = buffer.ReadInt32BigEndian();
            var value  = buffer.ReadMemory(length);

            return(length, value);
        }
Esempio n. 4
0
        private static IEnumerable <KrbHostAddress> ReadAddresses(NdrBuffer buffer)
        {
            var count = buffer.ReadInt32BigEndian();

            var list = new List <KrbHostAddress>();

            for (var i = 0; i < count; i++)
            {
                var addrType = (AddressType)buffer.ReadInt16BigEndian();
                var data     = ReadData(buffer);

                list.Add(new KrbHostAddress {
                    AddressType = addrType, Address = data.value
                });
            }

            return(list);
        }
Esempio n. 5
0
        private static IEnumerable <KrbAuthorizationData> ReadAuthData(NdrBuffer buffer)
        {
            var count = buffer.ReadInt32BigEndian();

            var list = new List <KrbAuthorizationData>();

            for (var i = 0; i < count; i++)
            {
                var adType = (AuthorizationDataType)buffer.ReadInt16BigEndian();
                var data   = ReadData(buffer);

                list.Add(new KrbAuthorizationData {
                    Type = adType, Data = data.value
                });
            }

            return(list);
        }
Esempio n. 6
0
        private static DateTimeOffset ReadDateTimeOffset(NdrBuffer buffer)
        {
            var time = buffer.ReadInt32BigEndian();

            return(DateTimeOffset.FromUnixTimeSeconds(time));
        }