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)); }
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); } } }
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); }
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); }
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); }
private static DateTimeOffset ReadDateTimeOffset(NdrBuffer buffer) { var time = buffer.ReadInt32BigEndian(); return(DateTimeOffset.FromUnixTimeSeconds(time)); }