public PrivilegedAttributeCertificate(KrbAuthorizationData authz, SignatureMode mode = SignatureMode.Kdc) : base(authz?.Type ?? 0, AuthorizationDataType.AdWin2kPac) { var pac = authz.Data; this.pacData = new byte[pac.Length]; this.Mode = mode; pac.CopyTo(this.pacData); using (var stream = new NdrBuffer(pac, align: false)) { var count = stream.ReadInt32LittleEndian(); this.Version = stream.ReadInt32LittleEndian(); if (this.Version != PAC_VERSION) { throw new InvalidDataException($"Unknown PAC Version {this.Version}"); } var errors = new List <PacDecodeError>(); for (var i = 0; i < count; i++) { var type = (PacType)stream.ReadInt32LittleEndian(); var size = stream.ReadInt32LittleEndian(); var offset = stream.ReadInt64LittleEndian(); var pacInfoBuffer = pac.Slice((int)offset, size); int exclusionStart; int exclusionLength; try { this.ParsePacType(type, pacInfoBuffer, out exclusionStart, out exclusionLength); } catch (Exception ex) { errors.Add(new PacDecodeError() { Type = type, Data = pacInfoBuffer, Exception = ex }); throw; } if (exclusionStart > 0 && exclusionLength > 0) { this.pacData.Span.Slice((int)offset + exclusionStart, exclusionLength).Clear(); } } this.DecodingErrors = errors; } }
public void Unmarshal(NdrBuffer buffer) { ClaimSource = (ClaimSourceType)buffer.ReadInt32LittleEndian(); Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <ClaimEntry>(Count, v => ClaimEntries = v); }
public PrivilegedAttributeCertificate(KrbAuthorizationData authz) : base(authz.Type, AuthorizationDataType.AdWin2kPac) { var pac = authz.Data; pacData = MemoryMarshal.AsMemory(pac); var stream = new NdrBuffer(pac, align: false); var count = stream.ReadInt32LittleEndian(); Version = stream.ReadInt32LittleEndian(); if (Version != PAC_VERSION) { throw new InvalidDataException($"Unknown PAC Version {Version}"); } var errors = new List <PacDecodeError>(); for (var i = 0; i < count; i++) { var type = (PacType)stream.ReadInt32LittleEndian(); var size = stream.ReadInt32LittleEndian(); var offset = stream.ReadInt64LittleEndian(); var pacInfoBuffer = pac.Slice((int)offset, size); int exclusionStart; int exclusionLength; try { ParsePacType(type, pacInfoBuffer, out exclusionStart, out exclusionLength); } catch (Exception ex) { errors.Add(new PacDecodeError() { Type = type, Data = pacInfoBuffer, Exception = ex }); throw; } if (exclusionStart > 0 && exclusionLength > 0) { pacData.Span.Slice((int)offset + exclusionStart, exclusionLength).Fill(0); } } DecodingErrors = errors; }
public override void Unmarshal(ReadOnlyMemory <byte> bytes) { var stream = new NdrBuffer(bytes); Version = stream.ReadInt32LittleEndian(); EncryptionType = (EncryptionType)stream.ReadInt32LittleEndian(); SerializedData = stream.ReadMemory(stream.BytesAvailable); }
public void Unmarshal(NdrBuffer buffer) { Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <ClaimsArray>(Count, v => ClaimsArray = v); ReservedType = buffer.ReadInt16LittleEndian(); ReservedFieldSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(ReservedFieldSize, v => ReservedField = v.ToArray()); }
public override void Unmarshal(NdrBuffer buffer) { LogonTime = buffer.ReadStruct <RpcFileTime>(); LogoffTime = buffer.ReadStruct <RpcFileTime>(); KickOffTime = buffer.ReadStruct <RpcFileTime>(); PwdLastChangeTime = buffer.ReadStruct <RpcFileTime>(); PwdCanChangeTime = buffer.ReadStruct <RpcFileTime>(); PwdMustChangeTime = buffer.ReadStruct <RpcFileTime>(); UserName = buffer.ReadStruct <RpcString>(); UserDisplayName = buffer.ReadStruct <RpcString>(); LogonScript = buffer.ReadStruct <RpcString>(); ProfilePath = buffer.ReadStruct <RpcString>(); HomeDirectory = buffer.ReadStruct <RpcString>(); HomeDrive = buffer.ReadStruct <RpcString>(); LogonCount = buffer.ReadInt16LittleEndian(); BadPasswordCount = buffer.ReadInt16LittleEndian(); UserId = buffer.ReadInt32LittleEndian(); GroupId = buffer.ReadInt32LittleEndian(); var groupCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <GroupMembership>(groupCount, v => GroupIds = v); UserFlags = (UserFlags)buffer.ReadInt32LittleEndian(); UserSessionKey = buffer.ReadMemory(16); ServerName = buffer.ReadStruct <RpcString>(); DomainName = buffer.ReadStruct <RpcString>(); buffer.ReadConformantStruct <RpcSid>(v => DomainId = v); Reserved1 = buffer.ReadFixedPrimitiveArray <int>(2).ToArray(); UserAccountControl = (UserAccountControlFlags)buffer.ReadInt32LittleEndian(); SubAuthStatus = buffer.ReadInt32LittleEndian(); LastSuccessfulILogon = buffer.ReadStruct <RpcFileTime>(); LastFailedILogon = buffer.ReadStruct <RpcFileTime>(); FailedILogonCount = buffer.ReadInt32LittleEndian(); Reserved3 = buffer.ReadInt32LittleEndian(); var extraSidsCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <RpcSidAttributes>(extraSidsCount, v => ExtraIds = v); buffer.ReadConformantStruct <RpcSid>(v => ResourceDomainId = v); var resourceGroupCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <GroupMembership>(resourceGroupCount, v => ResourceGroupIds = v); }
public void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.ClaimSource = (ClaimSourceType)buffer.ReadInt32LittleEndian(); this.Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <ClaimEntry>(this.Count, v => this.ClaimEntries = v); }
public override void Unmarshal(NdrBuffer buffer) { ClaimSetSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(ClaimSetSize, v => ClaimsSet = UnmarshalClaimsSet(v)); CompressionFormat = (CompressionFormat)buffer.ReadInt32LittleEndian(); UncompressedClaimSetSize = buffer.ReadInt32LittleEndian(); ReservedType = buffer.ReadInt16LittleEndian(); ReservedFieldSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(ReservedFieldSize, v => ReservedField = v.ToArray()); }
public override void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.LogonTime = buffer.ReadStruct <RpcFileTime>(); this.LogoffTime = buffer.ReadStruct <RpcFileTime>(); this.KickOffTime = buffer.ReadStruct <RpcFileTime>(); this.PwdLastChangeTime = buffer.ReadStruct <RpcFileTime>(); this.PwdCanChangeTime = buffer.ReadStruct <RpcFileTime>(); this.PwdMustChangeTime = buffer.ReadStruct <RpcFileTime>(); this.UserName = buffer.ReadStruct <RpcString>(); this.UserDisplayName = buffer.ReadStruct <RpcString>(); this.LogonScript = buffer.ReadStruct <RpcString>(); this.ProfilePath = buffer.ReadStruct <RpcString>(); this.HomeDirectory = buffer.ReadStruct <RpcString>(); this.HomeDrive = buffer.ReadStruct <RpcString>(); this.LogonCount = buffer.ReadInt16LittleEndian(); this.BadPasswordCount = buffer.ReadInt16LittleEndian(); this.UserId = buffer.ReadUInt32LittleEndian(); this.GroupId = buffer.ReadUInt32LittleEndian(); var groupCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <GroupMembership>(groupCount, v => this.GroupIds = v); this.UserFlags = (UserFlags)buffer.ReadInt32LittleEndian(); this.UserSessionKey = buffer.ReadMemory(16); this.ServerName = buffer.ReadStruct <RpcString>(); this.DomainName = buffer.ReadStruct <RpcString>(); buffer.ReadConformantStruct <RpcSid>(v => this.DomainId = v); this.Reserved1 = buffer.ReadFixedPrimitiveArray <int>(2).ToArray(); this.UserAccountControl = (UserAccountControlFlags)buffer.ReadInt32LittleEndian(); this.SubAuthStatus = buffer.ReadInt32LittleEndian(); this.LastSuccessfulILogon = buffer.ReadStruct <RpcFileTime>(); this.LastFailedILogon = buffer.ReadStruct <RpcFileTime>(); this.FailedILogonCount = buffer.ReadInt32LittleEndian(); this.Reserved3 = buffer.ReadInt32LittleEndian(); var extraSidsCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <RpcSidAttributes>(extraSidsCount, v => this.ExtraIds = v); buffer.ReadConformantStruct <RpcSid>(v => this.ResourceDomainId = v); var resourceGroupCount = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <GroupMembership>(resourceGroupCount, v => this.ResourceGroupIds = v); }
public void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <ClaimsArray>(this.Count, v => this.ClaimsArray = v); this.ReservedType = buffer.ReadInt16LittleEndian(); this.ReservedFieldSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(this.ReservedFieldSize, v => this.ReservedField = v.ToArray()); }
public KrbExtError DecodeExtendedError() { if (this.Type != KrbErrorDataType.KERB_ERR_TYPE_EXTENDED) { return(null); } using (var buffer = new NdrBuffer(this.Value, align: false)) { return(new KrbExtError { Status = (Win32StatusCode)buffer.ReadInt32LittleEndian(), Reserved = buffer.ReadInt32LittleEndian(), Flags = (ExtendedErrorFlag)buffer.ReadInt32LittleEndian() }); } }
public override void Unmarshal(NdrBuffer buffer) { S4U2ProxyTarget = buffer.ReadStruct <RpcString>(); var transitedListSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <RpcString>(transitedListSize, v => S4UTransitedServices = v); }
public override void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.ClaimSetSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(this.ClaimSetSize, v => this.ClaimsSet = this.UnmarshalClaimsSet(v)); this.CompressionFormat = (CompressionFormat)buffer.ReadInt32LittleEndian(); this.UncompressedClaimSetSize = buffer.ReadInt32LittleEndian(); this.ReservedType = buffer.ReadInt16LittleEndian(); this.ReservedFieldSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredConformantArray <byte>(this.ReservedFieldSize, v => this.ReservedField = v.ToArray()); }
public void UnmarshalConformance(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.conformance = buffer.ReadInt32LittleEndian(); }
public void Unmarshal(NdrBuffer buffer) { buffer.ReadDeferredConformantVaryingArray <char>(v => Id = v.ToString()); Type = (ClaimType)buffer.ReadInt16LittleEndian(); Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructUnion(this); }
public void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.RelativeId = buffer.ReadUInt32LittleEndian(); this.Attributes = (SidAttributes)buffer.ReadInt32LittleEndian(); }
public void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } buffer.ReadConformantStruct <RpcSid>(p => this.Sid = p); this.Attributes = (SidAttributes)buffer.ReadInt32LittleEndian(); }
public override void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.S4U2ProxyTarget = buffer.ReadStruct <RpcString>(); var transitedListSize = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructArray <RpcString>(transitedListSize, v => this.S4UTransitedServices = v); }
public void Unmarshal(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } buffer.ReadDeferredConformantVaryingArray <char>(v => this.Id = v.ToString()); this.Type = (ClaimType)buffer.ReadInt16LittleEndian(); this.Count = buffer.ReadInt32LittleEndian(); buffer.ReadDeferredStructUnion(this); }
public override void Unmarshal(ReadOnlyMemory <byte> bytes) { var stream = new NdrBuffer(bytes); Type = (ChecksumType)stream.ReadInt32LittleEndian(); SignaturePosition = stream.Offset; Signature = SetSignatureValue(Type, size => stream.ReadFixedPrimitiveArray <byte>(size).ToArray()); Validator = CryptoService.CreateChecksum(Type, Signature, SignatureData); if (stream.BytesAvailable > 0) { RODCIdentifier = stream.ReadInt16LittleEndian(); } }
public void UnmarshalUnion(NdrBuffer buffer) { Values = new List <object>(); var count = buffer.ReadInt32LittleEndian(); switch (Type) { case ClaimType.CLAIM_TYPE_STRING: buffer.ReadDeferredArray(count, () => Values.Add(buffer.ReadConformantVaryingCharArray().ToString())); break; default: Values = buffer.ReadFixedPrimitiveArray <long>(count).ToArray().Cast <object>().ToList(); break; } }
public void UnmarshalUnion(NdrBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } this.Values = new List <object>(); var count = buffer.ReadInt32LittleEndian(); switch (this.Type) { case ClaimType.CLAIM_TYPE_STRING: buffer.ReadDeferredArray(count, () => this.Values.Add(buffer.ReadConformantVaryingCharArray().ToString())); break; default: this.Values = buffer.ReadFixedPrimitiveArray <long>(count).ToArray().Cast <object>().ToList(); break; } }
public void Unmarshal(NdrBuffer buffer) { buffer.ReadConformantStruct <RpcSid>(p => Sid = p); Attributes = (SidAttributes)buffer.ReadInt32LittleEndian(); }
public void Unmarshal(NdrBuffer buffer) { RelativeId = buffer.ReadUInt32LittleEndian(); Attributes = (SidAttributes)buffer.ReadInt32LittleEndian(); }
public void UnmarshalConformance(NdrBuffer buffer) { conformance = buffer.ReadInt32LittleEndian(); }