示例#1
0
        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;
            }
        }
示例#2
0
        public void Unmarshal(NdrBuffer buffer)
        {
            ClaimSource = (ClaimSourceType)buffer.ReadInt32LittleEndian();
            Count       = buffer.ReadInt32LittleEndian();

            buffer.ReadDeferredStructArray <ClaimEntry>(Count, v => ClaimEntries = v);
        }
示例#3
0
        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;
        }
示例#4
0
        public override void Unmarshal(ReadOnlyMemory <byte> bytes)
        {
            var stream = new NdrBuffer(bytes);

            Version = stream.ReadInt32LittleEndian();

            EncryptionType = (EncryptionType)stream.ReadInt32LittleEndian();

            SerializedData = stream.ReadMemory(stream.BytesAvailable);
        }
示例#5
0
        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());
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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());
        }
示例#9
0
        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);
        }
示例#10
0
        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());
        }
示例#11
0
        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()
                });
            }
        }
示例#12
0
        public override void Unmarshal(NdrBuffer buffer)
        {
            S4U2ProxyTarget = buffer.ReadStruct <RpcString>();

            var transitedListSize = buffer.ReadInt32LittleEndian();

            buffer.ReadDeferredStructArray <RpcString>(transitedListSize, v => S4UTransitedServices = v);
        }
示例#13
0
        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());
        }
示例#14
0
        public void UnmarshalConformance(NdrBuffer buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }

            this.conformance = buffer.ReadInt32LittleEndian();
        }
示例#15
0
        public void Unmarshal(NdrBuffer buffer)
        {
            buffer.ReadDeferredConformantVaryingArray <char>(v => Id = v.ToString());

            Type  = (ClaimType)buffer.ReadInt16LittleEndian();
            Count = buffer.ReadInt32LittleEndian();

            buffer.ReadDeferredStructUnion(this);
        }
示例#16
0
        public void Unmarshal(NdrBuffer buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }

            this.RelativeId = buffer.ReadUInt32LittleEndian();
            this.Attributes = (SidAttributes)buffer.ReadInt32LittleEndian();
        }
示例#17
0
        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();
        }
示例#18
0
        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);
        }
示例#19
0
        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);
        }
示例#20
0
        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();
            }
        }
示例#21
0
        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;
            }
        }
示例#22
0
        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;
            }
        }
示例#23
0
        public void Unmarshal(NdrBuffer buffer)
        {
            buffer.ReadConformantStruct <RpcSid>(p => Sid = p);

            Attributes = (SidAttributes)buffer.ReadInt32LittleEndian();
        }
示例#24
0
 public void Unmarshal(NdrBuffer buffer)
 {
     RelativeId = buffer.ReadUInt32LittleEndian();
     Attributes = (SidAttributes)buffer.ReadInt32LittleEndian();
 }
示例#25
0
 public void UnmarshalConformance(NdrBuffer buffer)
 {
     conformance = buffer.ReadInt32LittleEndian();
 }