Exemplo n.º 1
0
        public PacSignature(byte[] infoBuffer, ref byte[] signatureData)
        {
            var pacStream = new NdrBinaryReader(infoBuffer);

            Type = (ChecksumType)pacStream.ReadUnsignedInt();

            SignaturePosition = (int)pacStream.Position;

            switch (Type)
            {
            case ChecksumType.KERB_CHECKSUM_HMAC_MD5:
                Signature = pacStream.Read(16);
                Validator = new HmacMd5PacValidator(Signature, ref signatureData);
                break;

            case ChecksumType.HMAC_SHA1_96_AES128:
                Signature = pacStream.Read(12);
                Validator = new HmacAes128PacValidator(Signature, ref signatureData);
                break;

            case ChecksumType.HMAC_SHA1_96_AES256:
                Signature = pacStream.Read(12);
                Validator = new HmacAes256PacValidator(Signature, ref signatureData);
                break;
            }

            if (pacStream.Position < pacStream.Length)
            {
                RODCIdentifier = pacStream.ReadShort();
            }
        }
Exemplo n.º 2
0
        public ClaimsArray(NdrBinaryReader pacStream)
        {
            ClaimSource = (ClaimSourceType)pacStream.ReadInt();
            Count       = pacStream.ReadUnsignedInt();

            var claims = new List <ClaimEntry>();

            pacStream.Seek(4);

            var count = pacStream.ReadInt();

            if (Count != count)
            {
                throw new InvalidDataException($"Claims count {Count} doesn't match actual count {count}");
            }

            for (var i = 0; i < Count; i++)
            {
                claims.Add(new ClaimEntry(pacStream));
            }

            foreach (var entry in claims)
            {
                entry.ReadValue(pacStream);
            }

            ClaimEntries = claims;
        }
Exemplo n.º 3
0
        public ClaimEntry(NdrBinaryReader pacStream)
        {
            pacStream.Seek(4);

            Type = (ClaimType)pacStream.ReadShort();

            pacStream.Align(4);

            Count = pacStream.ReadUnsignedInt();

            pacStream.Seek(4);
        }
Exemplo n.º 4
0
        private static SecurityIdentifier[] ParseExtraSids(NdrBinaryReader pacStream, int extraSidCount, int extraSidPointer)
        {
            if (extraSidPointer == 0)
            {
                return(new SecurityIdentifier[0]);
            }

            int realExtraSidCount = pacStream.ReadInt();

            if (realExtraSidCount != extraSidCount)
            {
                throw new InvalidDataException($"Expected Sid count {extraSidCount} doesn't match actual sid count {realExtraSidCount}");
            }

            var extraSidAtts = new SecurityIdentifier[extraSidCount];

            var pointers   = new int[extraSidCount];
            var attributes = new SidAttributes[extraSidCount];

            for (int i = 0; i < extraSidCount; i++)
            {
                pointers[i]   = pacStream.ReadInt();
                attributes[i] = (SidAttributes)pacStream.ReadUnsignedInt();
            }

            for (int i = 0; i < extraSidCount; i++)
            {
                SecurityIdentifier sid = null;

                if (pointers[i] != 0)
                {
                    sid = new SecurityIdentifier(pacStream.ReadSid(), attributes[i]);
                }

                extraSidAtts[i] = sid;
            }

            return(extraSidAtts);
        }