internal static bool IsValidReachSid(SecurityIdentifier sid) { if (!ExternalUser.IsExternalUserSid(sid)) { return(false); } string text = sid.ToString(); int num = text.LastIndexOf('-'); string a = text.Substring(num + 1); string input = text.Substring(0, num + 1); string b = ExternalUser.ComputeHash(input); return(string.Equals(a, b, StringComparison.Ordinal)); }
private static SecurityIdentifier GenerateSid(string source, bool forReachUser) { if (forReachUser) { source = Guid.NewGuid() + source; } byte[] sha1Hash = CryptoUtil.GetSha1Hash(Encoding.Unicode.GetBytes(source)); for (int i = 0; i < 4; i++) { byte[] array = sha1Hash; int num = i; array[num] ^= sha1Hash[i + 16]; } BinaryReader binaryReader = null; SecurityIdentifier result; try { binaryReader = new BinaryReader(new MemoryStream(sha1Hash)); StringBuilder stringBuilder = new StringBuilder("S-1-8-"); for (int j = 0; j < 4; j++) { if (j == 3 && forReachUser) { stringBuilder.Append(ExternalUser.ComputeHash(stringBuilder.ToString())); } else { stringBuilder.Append(binaryReader.ReadUInt32().ToString(NumberFormatInfo.InvariantInfo)); } if (j < 3) { stringBuilder.Append('-'); } } result = new SecurityIdentifier(stringBuilder.ToString()); } finally { if (binaryReader != null) { binaryReader.Dispose(); binaryReader = null; } } return(result); }