1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker // This file contains unit tests for the sid class.
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/win/sid.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <windows.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <sddl.h>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include <optional>
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/win/atl.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_localalloc.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/win/win_util.h"
20*6777b538SAndroid Build Coastguard Worker #include "build/branding_buildflags.h"
21*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker namespace base::win {
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker namespace {
26*6777b538SAndroid Build Coastguard Worker
EqualSid(const std::optional<Sid> & sid,const ATL::CSid & compare_sid)27*6777b538SAndroid Build Coastguard Worker bool EqualSid(const std::optional<Sid>& sid, const ATL::CSid& compare_sid) {
28*6777b538SAndroid Build Coastguard Worker if (!sid)
29*6777b538SAndroid Build Coastguard Worker return false;
30*6777b538SAndroid Build Coastguard Worker return sid->Equal(const_cast<SID*>(compare_sid.GetPSID()));
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
EqualSid(const Sid & sid,const std::wstring & sddl_sid)33*6777b538SAndroid Build Coastguard Worker bool EqualSid(const Sid& sid, const std::wstring& sddl_sid) {
34*6777b538SAndroid Build Coastguard Worker PSID compare_sid;
35*6777b538SAndroid Build Coastguard Worker if (!::ConvertStringSidToSid(sddl_sid.c_str(), &compare_sid)) {
36*6777b538SAndroid Build Coastguard Worker return false;
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker auto sid_ptr = TakeLocalAlloc(compare_sid);
39*6777b538SAndroid Build Coastguard Worker return sid.Equal(sid_ptr.get());
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
EqualSid(const std::optional<Sid> & sid,WELL_KNOWN_SID_TYPE known_sid)42*6777b538SAndroid Build Coastguard Worker bool EqualSid(const std::optional<Sid>& sid, WELL_KNOWN_SID_TYPE known_sid) {
43*6777b538SAndroid Build Coastguard Worker if (!sid)
44*6777b538SAndroid Build Coastguard Worker return false;
45*6777b538SAndroid Build Coastguard Worker char known_sid_buffer[SECURITY_MAX_SID_SIZE] = {};
46*6777b538SAndroid Build Coastguard Worker DWORD size = SECURITY_MAX_SID_SIZE;
47*6777b538SAndroid Build Coastguard Worker if (!::CreateWellKnownSid(known_sid, nullptr, known_sid_buffer, &size))
48*6777b538SAndroid Build Coastguard Worker return false;
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker return sid->Equal(known_sid_buffer);
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker
TestSidVector(std::optional<std::vector<Sid>> sids,const std::vector<std::wstring> & sddl)53*6777b538SAndroid Build Coastguard Worker bool TestSidVector(std::optional<std::vector<Sid>> sids,
54*6777b538SAndroid Build Coastguard Worker const std::vector<std::wstring>& sddl) {
55*6777b538SAndroid Build Coastguard Worker return sids && ranges::equal(*sids, sddl,
56*6777b538SAndroid Build Coastguard Worker [](const Sid& sid, const std::wstring& sddl) {
57*6777b538SAndroid Build Coastguard Worker return EqualSid(sid, sddl);
58*6777b538SAndroid Build Coastguard Worker });
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker
TestFromSddlStringVector(const std::vector<std::wstring> sddl)61*6777b538SAndroid Build Coastguard Worker bool TestFromSddlStringVector(const std::vector<std::wstring> sddl) {
62*6777b538SAndroid Build Coastguard Worker return TestSidVector(Sid::FromSddlStringVector(sddl), sddl);
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker typedef decltype(::DeriveCapabilitySidsFromName)*
66*6777b538SAndroid Build Coastguard Worker DeriveCapabilitySidsFromNameFunc;
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker // Get the DeriveCapabilitySidsFromName API dynamically. Versions of Windows 10
69*6777b538SAndroid Build Coastguard Worker // older than 1809 do not implement this method. By loading dynamically we can
70*6777b538SAndroid Build Coastguard Worker // skip tests when running on these older versions. Online documentation for
71*6777b538SAndroid Build Coastguard Worker // this API claims it's supported back to Windows 2003, however this is entirely
72*6777b538SAndroid Build Coastguard Worker // incorrect.
GetDeriveCapabilitySidsFromName()73*6777b538SAndroid Build Coastguard Worker DeriveCapabilitySidsFromNameFunc GetDeriveCapabilitySidsFromName() {
74*6777b538SAndroid Build Coastguard Worker static const DeriveCapabilitySidsFromNameFunc derive_capability_sids =
75*6777b538SAndroid Build Coastguard Worker []() -> DeriveCapabilitySidsFromNameFunc {
76*6777b538SAndroid Build Coastguard Worker HMODULE module = GetModuleHandle(L"api-ms-win-security-base-l1-2-2.dll");
77*6777b538SAndroid Build Coastguard Worker if (!module) {
78*6777b538SAndroid Build Coastguard Worker return nullptr;
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker return reinterpret_cast<DeriveCapabilitySidsFromNameFunc>(
81*6777b538SAndroid Build Coastguard Worker ::GetProcAddress(module, "DeriveCapabilitySidsFromName"));
82*6777b538SAndroid Build Coastguard Worker }();
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker return derive_capability_sids;
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker
EqualNamedCapSid(const Sid & sid,const std::wstring & capability_name)87*6777b538SAndroid Build Coastguard Worker bool EqualNamedCapSid(const Sid& sid, const std::wstring& capability_name) {
88*6777b538SAndroid Build Coastguard Worker DeriveCapabilitySidsFromNameFunc derive_capability_sids =
89*6777b538SAndroid Build Coastguard Worker GetDeriveCapabilitySidsFromName();
90*6777b538SAndroid Build Coastguard Worker CHECK(derive_capability_sids);
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker // Pre-reserve some space for SID deleters.
93*6777b538SAndroid Build Coastguard Worker std::vector<base::win::ScopedLocalAlloc> deleter_list;
94*6777b538SAndroid Build Coastguard Worker deleter_list.reserve(16);
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker PSID* capability_groups = nullptr;
97*6777b538SAndroid Build Coastguard Worker DWORD capability_group_count = 0;
98*6777b538SAndroid Build Coastguard Worker PSID* capability_sids = nullptr;
99*6777b538SAndroid Build Coastguard Worker DWORD capability_sid_count = 0;
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker CHECK(derive_capability_sids(capability_name.c_str(), &capability_groups,
102*6777b538SAndroid Build Coastguard Worker &capability_group_count, &capability_sids,
103*6777b538SAndroid Build Coastguard Worker &capability_sid_count));
104*6777b538SAndroid Build Coastguard Worker deleter_list.emplace_back(capability_groups);
105*6777b538SAndroid Build Coastguard Worker deleter_list.emplace_back(capability_sids);
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker for (DWORD i = 0; i < capability_group_count; ++i) {
108*6777b538SAndroid Build Coastguard Worker deleter_list.emplace_back(capability_groups[i]);
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker for (DWORD i = 0; i < capability_sid_count; ++i) {
111*6777b538SAndroid Build Coastguard Worker deleter_list.emplace_back(capability_sids[i]);
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker CHECK_GE(capability_sid_count, 1U);
115*6777b538SAndroid Build Coastguard Worker return sid.Equal(capability_sids[0]);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker struct KnownCapabilityTestEntry {
119*6777b538SAndroid Build Coastguard Worker WellKnownCapability capability;
120*6777b538SAndroid Build Coastguard Worker const wchar_t* sddl_sid;
121*6777b538SAndroid Build Coastguard Worker };
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker struct KnownSidTestEntry {
124*6777b538SAndroid Build Coastguard Worker WellKnownSid sid;
125*6777b538SAndroid Build Coastguard Worker WELL_KNOWN_SID_TYPE well_known_sid;
126*6777b538SAndroid Build Coastguard Worker };
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker } // namespace
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker // Tests the creation of a Sid.
TEST(SidTest,Initializers)131*6777b538SAndroid Build Coastguard Worker TEST(SidTest, Initializers) {
132*6777b538SAndroid Build Coastguard Worker ATL::CSid sid_world = ATL::Sids::World();
133*6777b538SAndroid Build Coastguard Worker PSID sid_world_pointer = const_cast<SID*>(sid_world.GetPSID());
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker // Check the PSID constructor.
136*6777b538SAndroid Build Coastguard Worker std::optional<Sid> sid_sid_star = Sid::FromPSID(sid_world_pointer);
137*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(sid_sid_star, sid_world));
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker char invalid_sid[16] = {};
140*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(Sid::FromPSID(invalid_sid));
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker std::optional<Sid> sid_sddl = Sid::FromSddlString(L"S-1-1-0");
143*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sid_sddl);
144*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(sid_sddl, sid_world));
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,KnownCapability)147*6777b538SAndroid Build Coastguard Worker TEST(SidTest, KnownCapability) {
148*6777b538SAndroid Build Coastguard Worker const KnownCapabilityTestEntry capabilities[] = {
149*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kInternetClient, L"S-1-15-3-1"},
150*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kInternetClientServer, L"S-1-15-3-2"},
151*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kPrivateNetworkClientServer, L"S-1-15-3-3"},
152*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kPicturesLibrary, L"S-1-15-3-4"},
153*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kVideosLibrary, L"S-1-15-3-5"},
154*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kMusicLibrary, L"S-1-15-3-6"},
155*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kDocumentsLibrary, L"S-1-15-3-7"},
156*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kEnterpriseAuthentication, L"S-1-15-3-8"},
157*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kSharedUserCertificates, L"S-1-15-3-9"},
158*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kRemovableStorage, L"S-1-15-3-10"},
159*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kAppointments, L"S-1-15-3-11"},
160*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kContacts, L"S-1-15-3-12"},
161*6777b538SAndroid Build Coastguard Worker };
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker for (auto capability : capabilities) {
164*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualSid(Sid::FromKnownCapability(capability.capability),
165*6777b538SAndroid Build Coastguard Worker capability.sddl_sid))
166*6777b538SAndroid Build Coastguard Worker << "Known Capability: " << capability.sddl_sid;
167*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualSid(Sid(capability.capability), capability.sddl_sid))
168*6777b538SAndroid Build Coastguard Worker << "Known Capability: " << capability.sddl_sid;
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,NamedCapability)172*6777b538SAndroid Build Coastguard Worker TEST(SidTest, NamedCapability) {
173*6777b538SAndroid Build Coastguard Worker if (!GetDeriveCapabilitySidsFromName()) {
174*6777b538SAndroid Build Coastguard Worker GTEST_SKIP()
175*6777b538SAndroid Build Coastguard Worker << "Platform doesn't support DeriveCapabilitySidsFromName function.";
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker const std::wstring capabilities[] = {L"",
178*6777b538SAndroid Build Coastguard Worker L"InternetClient",
179*6777b538SAndroid Build Coastguard Worker L"InternetClientServer",
180*6777b538SAndroid Build Coastguard Worker L"PrivateNetworkClientServer",
181*6777b538SAndroid Build Coastguard Worker L"PicturesLibrary",
182*6777b538SAndroid Build Coastguard Worker L"VideosLibrary",
183*6777b538SAndroid Build Coastguard Worker L"MusicLibrary",
184*6777b538SAndroid Build Coastguard Worker L"DocumentsLibrary",
185*6777b538SAndroid Build Coastguard Worker L"EnterpriseAuthentication",
186*6777b538SAndroid Build Coastguard Worker L"SharedUserCertificates",
187*6777b538SAndroid Build Coastguard Worker L"RemovableStorage",
188*6777b538SAndroid Build Coastguard Worker L"Appointments",
189*6777b538SAndroid Build Coastguard Worker L"Contacts",
190*6777b538SAndroid Build Coastguard Worker L"registryRead",
191*6777b538SAndroid Build Coastguard Worker L"lpacCryptoServices"};
192*6777b538SAndroid Build Coastguard Worker
193*6777b538SAndroid Build Coastguard Worker for (const std::wstring& capability : capabilities) {
194*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
195*6777b538SAndroid Build Coastguard Worker EqualNamedCapSid(Sid::FromNamedCapability(capability), capability))
196*6777b538SAndroid Build Coastguard Worker << "Named Capability: " << capability;
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,KnownSids)200*6777b538SAndroid Build Coastguard Worker TEST(SidTest, KnownSids) {
201*6777b538SAndroid Build Coastguard Worker const KnownSidTestEntry known_sids[] = {
202*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kNull, ::WinNullSid},
203*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kWorld, ::WinWorldSid},
204*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kCreatorOwner, ::WinCreatorOwnerSid},
205*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kNetwork, ::WinNetworkSid},
206*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kBatch, ::WinBatchSid},
207*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kInteractive, ::WinInteractiveSid},
208*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kService, ::WinServiceSid},
209*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kAnonymous, ::WinAnonymousSid},
210*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kSelf, ::WinSelfSid},
211*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kAuthenticatedUser, ::WinAuthenticatedUserSid},
212*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kRestricted, ::WinRestrictedCodeSid},
213*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kLocalSystem, ::WinLocalSystemSid},
214*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kLocalService, ::WinLocalServiceSid},
215*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kNetworkService, ::WinNetworkServiceSid},
216*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kBuiltinAdministrators, ::WinBuiltinAdministratorsSid},
217*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kBuiltinUsers, ::WinBuiltinUsersSid},
218*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kBuiltinGuests, ::WinBuiltinGuestsSid},
219*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kUntrustedLabel, ::WinUntrustedLabelSid},
220*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kLowLabel, ::WinLowLabelSid},
221*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kMediumLabel, ::WinMediumLabelSid},
222*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kHighLabel, ::WinHighLabelSid},
223*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kSystemLabel, ::WinSystemLabelSid},
224*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kWriteRestricted, ::WinWriteRestrictedCodeSid},
225*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kCreatorOwnerRights, ::WinCreatorOwnerRightsSid},
226*6777b538SAndroid Build Coastguard Worker {WellKnownSid::kAllApplicationPackages, ::WinBuiltinAnyPackageSid}};
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker for (auto known_sid : known_sids) {
229*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
230*6777b538SAndroid Build Coastguard Worker EqualSid(Sid::FromKnownSid(known_sid.sid), known_sid.well_known_sid))
231*6777b538SAndroid Build Coastguard Worker << "Known Sid: " << static_cast<int>(known_sid.sid);
232*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualSid(Sid(known_sid.sid), known_sid.well_known_sid))
233*6777b538SAndroid Build Coastguard Worker << "Known Sid: " << static_cast<int>(known_sid.sid);
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualSid(
237*6777b538SAndroid Build Coastguard Worker Sid::FromKnownSid(WellKnownSid::kAllRestrictedApplicationPackages),
238*6777b538SAndroid Build Coastguard Worker L"S-1-15-2-2"));
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,SddlString)241*6777b538SAndroid Build Coastguard Worker TEST(SidTest, SddlString) {
242*6777b538SAndroid Build Coastguard Worker std::optional<Sid> sid_sddl = Sid::FromSddlString(L"S-1-1-0");
243*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sid_sddl);
244*6777b538SAndroid Build Coastguard Worker std::optional<std::wstring> sddl_str = sid_sddl->ToSddlString();
245*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sddl_str);
246*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(L"S-1-1-0", *sddl_str);
247*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(Sid::FromSddlString(L"X-1-1-0"));
248*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(Sid::FromSddlString(L""));
249*6777b538SAndroid Build Coastguard Worker }
250*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,RandomSid)251*6777b538SAndroid Build Coastguard Worker TEST(SidTest, RandomSid) {
252*6777b538SAndroid Build Coastguard Worker Sid sid1 = Sid::GenerateRandomSid();
253*6777b538SAndroid Build Coastguard Worker Sid sid2 = Sid::GenerateRandomSid();
254*6777b538SAndroid Build Coastguard Worker EXPECT_NE(sid1, sid2);
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,FromIntegrityLevel)257*6777b538SAndroid Build Coastguard Worker TEST(SidTest, FromIntegrityLevel) {
258*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(
259*6777b538SAndroid Build Coastguard Worker Sid::FromIntegrityLevel(SECURITY_MANDATORY_UNTRUSTED_RID), L"S-1-16-0"));
260*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(Sid::FromIntegrityLevel(SECURITY_MANDATORY_LOW_RID),
261*6777b538SAndroid Build Coastguard Worker L"S-1-16-4096"));
262*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(Sid::FromIntegrityLevel(SECURITY_MANDATORY_MEDIUM_RID),
263*6777b538SAndroid Build Coastguard Worker L"S-1-16-8192"));
264*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
265*6777b538SAndroid Build Coastguard Worker EqualSid(Sid::FromIntegrityLevel(SECURITY_MANDATORY_MEDIUM_PLUS_RID),
266*6777b538SAndroid Build Coastguard Worker L"S-1-16-8448"));
267*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(Sid::FromIntegrityLevel(SECURITY_MANDATORY_HIGH_RID),
268*6777b538SAndroid Build Coastguard Worker L"S-1-16-12288"));
269*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(Sid::FromIntegrityLevel(SECURITY_MANDATORY_SYSTEM_RID),
270*6777b538SAndroid Build Coastguard Worker L"S-1-16-16384"));
271*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EqualSid(Sid::FromIntegrityLevel(1234), L"S-1-16-1234"));
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,FromSddlStringVector)274*6777b538SAndroid Build Coastguard Worker TEST(SidTest, FromSddlStringVector) {
275*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
276*6777b538SAndroid Build Coastguard Worker TestFromSddlStringVector({L"S-1-1-0", L"S-1-15-2-2", L"S-1-15-3-2"}));
277*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(
278*6777b538SAndroid Build Coastguard Worker TestFromSddlStringVector({L"S-1-1-0", L"X-1-15-2-2", L"S-1-15-3-2"}));
279*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(TestFromSddlStringVector({L""}));
280*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(TestFromSddlStringVector({}));
281*6777b538SAndroid Build Coastguard Worker }
282*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,FromNamedCapabilityVector)283*6777b538SAndroid Build Coastguard Worker TEST(SidTest, FromNamedCapabilityVector) {
284*6777b538SAndroid Build Coastguard Worker if (!GetDeriveCapabilitySidsFromName()) {
285*6777b538SAndroid Build Coastguard Worker GTEST_SKIP()
286*6777b538SAndroid Build Coastguard Worker << "Platform doesn't support DeriveCapabilitySidsFromName function.";
287*6777b538SAndroid Build Coastguard Worker }
288*6777b538SAndroid Build Coastguard Worker std::vector<std::wstring> capabilities = {L"",
289*6777b538SAndroid Build Coastguard Worker L"InternetClient",
290*6777b538SAndroid Build Coastguard Worker L"InternetClientServer",
291*6777b538SAndroid Build Coastguard Worker L"PrivateNetworkClientServer",
292*6777b538SAndroid Build Coastguard Worker L"PicturesLibrary",
293*6777b538SAndroid Build Coastguard Worker L"VideosLibrary",
294*6777b538SAndroid Build Coastguard Worker L"MusicLibrary",
295*6777b538SAndroid Build Coastguard Worker L"DocumentsLibrary",
296*6777b538SAndroid Build Coastguard Worker L"EnterpriseAuthentication",
297*6777b538SAndroid Build Coastguard Worker L"SharedUserCertificates",
298*6777b538SAndroid Build Coastguard Worker L"RemovableStorage",
299*6777b538SAndroid Build Coastguard Worker L"Appointments",
300*6777b538SAndroid Build Coastguard Worker L"Contacts",
301*6777b538SAndroid Build Coastguard Worker L"registryRead",
302*6777b538SAndroid Build Coastguard Worker L"lpacCryptoServices"};
303*6777b538SAndroid Build Coastguard Worker
304*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ranges::equal(Sid::FromNamedCapabilityVector(capabilities),
305*6777b538SAndroid Build Coastguard Worker capabilities, EqualNamedCapSid));
306*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Sid::FromNamedCapabilityVector({}).size(), 0U);
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,FromKnownCapabilityVector)309*6777b538SAndroid Build Coastguard Worker TEST(SidTest, FromKnownCapabilityVector) {
310*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(TestSidVector(
311*6777b538SAndroid Build Coastguard Worker Sid::FromKnownCapabilityVector(
312*6777b538SAndroid Build Coastguard Worker {WellKnownCapability::kInternetClient,
313*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kInternetClientServer,
314*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kPrivateNetworkClientServer,
315*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kPicturesLibrary,
316*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kVideosLibrary,
317*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kMusicLibrary,
318*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kDocumentsLibrary,
319*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kEnterpriseAuthentication,
320*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kSharedUserCertificates,
321*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kRemovableStorage,
322*6777b538SAndroid Build Coastguard Worker WellKnownCapability::kAppointments, WellKnownCapability::kContacts}),
323*6777b538SAndroid Build Coastguard Worker {L"S-1-15-3-1", L"S-1-15-3-2", L"S-1-15-3-3", L"S-1-15-3-4",
324*6777b538SAndroid Build Coastguard Worker L"S-1-15-3-5", L"S-1-15-3-6", L"S-1-15-3-7", L"S-1-15-3-8",
325*6777b538SAndroid Build Coastguard Worker L"S-1-15-3-9", L"S-1-15-3-10", L"S-1-15-3-11", L"S-1-15-3-12"}));
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(TestSidVector(
328*6777b538SAndroid Build Coastguard Worker Sid::FromKnownCapabilityVector({WellKnownCapability::kInternetClient}),
329*6777b538SAndroid Build Coastguard Worker {L"S-1-1-0"}));
330*6777b538SAndroid Build Coastguard Worker }
331*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,FromKnownSidVector)332*6777b538SAndroid Build Coastguard Worker TEST(SidTest, FromKnownSidVector) {
333*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(TestSidVector(
334*6777b538SAndroid Build Coastguard Worker Sid::FromKnownSidVector({WellKnownSid::kNull, WellKnownSid::kWorld}),
335*6777b538SAndroid Build Coastguard Worker {L"S-1-0-0", L"S-1-1-0"}));
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(TestSidVector(Sid::FromKnownSidVector({WellKnownSid::kNull}),
338*6777b538SAndroid Build Coastguard Worker {L"S-1-1-0"}));
339*6777b538SAndroid Build Coastguard Worker }
340*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,Equal)341*6777b538SAndroid Build Coastguard Worker TEST(SidTest, Equal) {
342*6777b538SAndroid Build Coastguard Worker Sid world_sid = Sid::FromKnownSid(WellKnownSid::kWorld);
343*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(world_sid, world_sid);
344*6777b538SAndroid Build Coastguard Worker auto world_sid_sddl = Sid::FromSddlString(L"S-1-1-0");
345*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(world_sid_sddl);
346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(world_sid, world_sid_sddl);
347*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(world_sid_sddl, world_sid);
348*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(world_sid.Equal(world_sid_sddl->GetPSID()));
349*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(world_sid_sddl->Equal(world_sid.GetPSID()));
350*6777b538SAndroid Build Coastguard Worker Sid null_sid = Sid::FromKnownSid(WellKnownSid::kNull);
351*6777b538SAndroid Build Coastguard Worker EXPECT_NE(world_sid, null_sid);
352*6777b538SAndroid Build Coastguard Worker EXPECT_NE(null_sid, world_sid);
353*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(world_sid.Equal(null_sid.GetPSID()));
354*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(null_sid.Equal(world_sid.GetPSID()));
355*6777b538SAndroid Build Coastguard Worker }
356*6777b538SAndroid Build Coastguard Worker
TEST(SidTest,Clone)357*6777b538SAndroid Build Coastguard Worker TEST(SidTest, Clone) {
358*6777b538SAndroid Build Coastguard Worker Sid world_sid = Sid::FromKnownSid(WellKnownSid::kWorld);
359*6777b538SAndroid Build Coastguard Worker auto world_sid_clone = world_sid.Clone();
360*6777b538SAndroid Build Coastguard Worker EXPECT_NE(world_sid.GetPSID(), world_sid_clone.GetPSID());
361*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(world_sid, world_sid_clone);
362*6777b538SAndroid Build Coastguard Worker }
363*6777b538SAndroid Build Coastguard Worker
364*6777b538SAndroid Build Coastguard Worker } // namespace base::win
365