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(); } }
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; }
public ClaimEntry(NdrBinaryReader pacStream) { pacStream.Seek(4); Type = (ClaimType)pacStream.ReadShort(); pacStream.Align(4); Count = pacStream.ReadUnsignedInt(); pacStream.Seek(4); }
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); }