Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

474 lines
15 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. ctcred.c
  5. Abstract:
  6. Component test for cred marshaling and unmarshaling
  7. Author:
  8. Cliff Van Dyke (CliffV) March 22, 2000
  9. Environment:
  10. Revision History:
  11. --*/
  12. #include <nt.h>
  13. #include <ntrtl.h>
  14. #include <nturtl.h>
  15. #include <windows.h>
  16. #include <wincred.h>
  17. #include <credp.h>
  18. #include <stdio.h>
  19. #include <winnetwk.h>
  20. #include <lmerr.h>
  21. int __cdecl
  22. main(
  23. IN int argc,
  24. IN char ** argv
  25. )
  26. {
  27. DWORD WinStatus;
  28. NTSTATUS Status;
  29. UCHAR Buffer[1024];
  30. UCHAR Buffer2[1024];
  31. PCERT_CREDENTIAL_INFO CertCred1 = (PCERT_CREDENTIAL_INFO)Buffer;
  32. PCERT_CREDENTIAL_INFO CertCred2;
  33. PUSERNAME_TARGET_CREDENTIAL_INFO UsernameTargetCred1 = (PUSERNAME_TARGET_CREDENTIAL_INFO)Buffer;
  34. PUSERNAME_TARGET_CREDENTIAL_INFO UsernameTargetCred2;
  35. LONG Size;
  36. ULONG i;
  37. int j;
  38. NETRESOURCEW NetRes;
  39. LPWSTR MarshaledCredential;
  40. LPSTR argument;
  41. BOOLEAN TestCert = FALSE;
  42. BOOLEAN TestUsernameTarget = FALSE;
  43. BOOLEAN TestValidateTarget = FALSE;
  44. BOOLEAN TestNetUse = FALSE;
  45. BOOLEAN TestAll = TRUE;
  46. //
  47. // Loop through the arguments handle each in turn
  48. //
  49. for ( j=1; j<argc; j++ ) {
  50. argument = argv[j];
  51. //
  52. // Handle /Cert
  53. //
  54. if ( _stricmp( argument, "/Cert" ) == 0 ) {
  55. TestCert = TRUE;
  56. TestAll = FALSE;
  57. //
  58. // Handle /UsernameTarget
  59. //
  60. }else if ( _stricmp( argument, "/UsernameTarget" ) == 0 ) {
  61. TestUsernameTarget = TRUE;
  62. TestAll = FALSE;
  63. //
  64. // Handle /ValidateTarget
  65. //
  66. }else if ( _stricmp( argument, "/ValidateTarget" ) == 0 ) {
  67. TestValidateTarget = TRUE;
  68. TestAll = FALSE;
  69. //
  70. // Handle /NetUse
  71. //
  72. }else if ( _stricmp( argument, "/NetUse" ) == 0 ) {
  73. TestNetUse = TRUE;
  74. TestAll = FALSE;
  75. //
  76. // Handle all other parameters
  77. //
  78. } else {
  79. //Usage:
  80. fprintf( stderr, "Usage: ctcred [/Cert] [/UsernameTarget] [ValidateTarget] [/NetUse]\n\n" );
  81. return(1);
  82. }
  83. }
  84. //
  85. // Test cert marshaling
  86. //
  87. if ( TestCert || TestAll ) {
  88. //
  89. // NULL cred should fail
  90. //
  91. if ( CredMarshalCredentialW( CertCredential,
  92. NULL,
  93. &MarshaledCredential ) ) {
  94. printf( "Cert: Marshal NULL cred should have failed\n" );
  95. return 1;
  96. } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) {
  97. printf( "Cert: Marshal NULL cred failed with wrong status: %ld\n", GetLastError() );
  98. return 1;
  99. }
  100. //
  101. // Short cred should fail
  102. //
  103. RtlZeroMemory( CertCred1, sizeof(*CertCred1) );
  104. if ( CredMarshalCredentialW( CertCredential,
  105. CertCred1,
  106. &MarshaledCredential ) ) {
  107. printf( "Cert: Marshal Short cred should have failed\n" );
  108. return 1;
  109. } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) {
  110. printf( "Cert: Marshal Short cred failed with wrong status: %ld\n", GetLastError() );
  111. return 1;
  112. }
  113. //
  114. // Loop marshalling buffers of various sizes
  115. //
  116. for ( Size=0; Size<512; Size ++ ) {
  117. CRED_MARSHAL_TYPE CredType;
  118. //
  119. // Build a cred to marshal
  120. //
  121. CertCred1->cbSize = sizeof(*CertCred1);
  122. for ( i=0; i<sizeof(CertCred1->rgbHashOfCert); i++ ) {
  123. CertCred1->rgbHashOfCert[i] = (BYTE)Size;
  124. }
  125. //
  126. // Marshal it.
  127. //
  128. if ( !CredMarshalCredentialW( CertCredential,
  129. CertCred1,
  130. &MarshaledCredential ) ) {
  131. printf( "Cert: Cannot marshal cred: %ld %ld\n", Size, GetLastError() );
  132. return 1;
  133. }
  134. printf( "Cert: %ld: %ws\n", Size, MarshaledCredential );
  135. //
  136. // Ensure it is a marshaled cred
  137. //
  138. if ( !CredIsMarshaledCredentialW( MarshaledCredential ) ) {
  139. printf( "Cert: Cred isn't marshaled: %ld\n", Size );
  140. return 1;
  141. }
  142. //
  143. // Unmarshal it
  144. //
  145. CredType = (CRED_MARSHAL_TYPE) 87;
  146. if ( !CredUnmarshalCredentialW( MarshaledCredential,
  147. &CredType,
  148. &CertCred2 ) ) {
  149. printf( "Cert: Cannot unmarshal cred: %ld %ld\n", Size, GetLastError() );
  150. return 1;
  151. }
  152. //
  153. // Verify it
  154. //
  155. if ( CredType != CertCredential ) {
  156. printf( "Cert: Bad CredType: %ld\n", Size );
  157. return 1;
  158. }
  159. if ( !RtlEqualMemory( CertCred1, CertCred2, sizeof(*CertCred1) - 3 * sizeof(ULONG) ) ) {
  160. printf( "Cert: Bad Cred structure: %ld\n", Size );
  161. return 1;
  162. }
  163. if ( TestNetUse || TestAll ) {
  164. NetRes.dwType = RESOURCETYPE_ANY;
  165. NetRes.lpLocalName = NULL;
  166. NetRes.lpRemoteName = L"\\\\CLIFFV1\\d$";
  167. NetRes.lpProvider = NULL;
  168. WinStatus = WNetAddConnection2W( &NetRes,
  169. L"", // no password
  170. MarshaledCredential,
  171. 0 );
  172. if ( WinStatus != NO_ERROR ) {
  173. printf( "Cert: Cannot connect: %ld %ld\n", Size, WinStatus );
  174. }
  175. }
  176. CredFree( CertCred2 );
  177. CredFree( MarshaledCredential );
  178. }
  179. }
  180. //
  181. // Test UsernameTarget marshaling
  182. //
  183. if ( TestUsernameTarget || TestAll ) {
  184. //
  185. // NULL cred should fail
  186. //
  187. if ( CredMarshalCredentialW( UsernameTargetCredential,
  188. NULL,
  189. &MarshaledCredential ) ) {
  190. printf( "UsernameTarget: Marshal NULL cred should have failed\n" );
  191. return 1;
  192. } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) {
  193. printf( "UsernameTarget: Marshal NULL cred failed with wrong status: %ld\n", GetLastError() );
  194. return 1;
  195. }
  196. //
  197. // Empty cred should fail
  198. //
  199. RtlZeroMemory( UsernameTargetCred1, sizeof(*UsernameTargetCred1) );
  200. if ( CredMarshalCredentialW( UsernameTargetCredential,
  201. UsernameTargetCred1,
  202. &MarshaledCredential ) ) {
  203. printf( "UsernameTarget: Marshal Short cred should have failed\n" );
  204. return 1;
  205. } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) {
  206. printf( "UsernameTarget: Marshal Short cred failed with wrong status: %ld\n", GetLastError() );
  207. return 1;
  208. }
  209. //
  210. // Loop marshalling buffers of various sizes
  211. //
  212. for ( Size=-3; Size<255; Size ++ ) {
  213. CRED_MARSHAL_TYPE CredType;
  214. //
  215. // Build a cred to marshal
  216. //
  217. UsernameTargetCred1->UserName = (LPWSTR)Buffer2;
  218. if ( Size == -3 ) {
  219. wcscpy( UsernameTargetCred1->UserName, L"a" );
  220. } else if ( Size == -2 ) {
  221. wcscpy( UsernameTargetCred1->UserName, L"ntdev\\cliffv" );
  222. } else if ( Size == -1 ) {
  223. wcscpy( UsernameTargetCred1->UserName, L"[email protected]" );
  224. } else {
  225. for ( i=0; i<Size*sizeof(WCHAR); i++ ) {
  226. Buffer2[i] = (BYTE)Size;
  227. }
  228. Buffer2[i*sizeof(WCHAR)] = 0;
  229. Buffer2[i*sizeof(WCHAR)+1] = 0;
  230. }
  231. //
  232. // Marshal it.
  233. //
  234. if ( !CredMarshalCredentialW( UsernameTargetCredential,
  235. UsernameTargetCred1,
  236. &MarshaledCredential ) ) {
  237. WinStatus = GetLastError();
  238. if ( Size == 0 && WinStatus == ERROR_INVALID_PARAMETER ) {
  239. // This is OK
  240. continue;
  241. } else {
  242. printf( "UsernameTarget: Cannot marshal cred: %ld %ld\n", Size, WinStatus );
  243. return 1;
  244. }
  245. } else {
  246. if ( Size == 0 ) {
  247. printf( "UsernameTarget: Marshal empty cred should have failed\n" );
  248. return 1;
  249. }
  250. }
  251. if ( Size < 0 ) {
  252. printf( "UsernameTarget: %ld: %ws: %ws\n", Size, Buffer2, MarshaledCredential );
  253. } else {
  254. printf( "UsernameTarget: %ld: %ws\n", Size, MarshaledCredential );
  255. }
  256. //
  257. // Ensure it is a marshaled cred
  258. //
  259. if ( !CredIsMarshaledCredentialW( MarshaledCredential ) ) {
  260. printf( "UsernameTarget: Cred isn't marshaled: %ld\n", Size );
  261. return 1;
  262. }
  263. //
  264. // Unmarshal it
  265. //
  266. CredType = (CRED_MARSHAL_TYPE) 87;
  267. if ( !CredUnmarshalCredentialW( MarshaledCredential,
  268. &CredType,
  269. &UsernameTargetCred2 ) ) {
  270. printf( "UsernameTarget: Cannot unmarshal cred: %ld %ld\n", Size, GetLastError() );
  271. return 1;
  272. }
  273. //
  274. // Verify it
  275. //
  276. if ( CredType != UsernameTargetCredential ) {
  277. printf( "UsernameTarget: Bad CredType: %ld\n", Size );
  278. return 1;
  279. }
  280. if ( Size < 0 ) {
  281. if ( wcscmp( UsernameTargetCred1->UserName, UsernameTargetCred2->UserName ) != 0 ) {
  282. printf( "UsernameTarget: %ws: Bad Cred structure: %ld\n", UsernameTargetCred1->UserName, Size );
  283. return 1;
  284. }
  285. } else {
  286. if ( !RtlEqualMemory( UsernameTargetCred1->UserName, UsernameTargetCred2->UserName, Size*sizeof(WCHAR) ) ) {
  287. printf( "UsernameTarget: Bad Cred structure: %ld\n", Size );
  288. return 1;
  289. }
  290. }
  291. //
  292. // Connect using the credential
  293. //
  294. if ( TestNetUse || TestAll ) {
  295. NetRes.dwType = RESOURCETYPE_ANY;
  296. NetRes.lpLocalName = NULL;
  297. NetRes.lpRemoteName = L"\\\\CLIFFV1\\d$";
  298. NetRes.lpProvider = NULL;
  299. WinStatus = WNetAddConnection2W( &NetRes,
  300. L"", // no password
  301. MarshaledCredential,
  302. 0 );
  303. if ( WinStatus != NO_ERROR ) {
  304. printf( "UsernameTarget: Cannot connect: %ld %ld\n", Size, WinStatus );
  305. }
  306. }
  307. CredFree( UsernameTargetCred2 );
  308. CredFree( MarshaledCredential );
  309. }
  310. }
  311. //
  312. // Test ValidateTargetName
  313. //
  314. if ( TestValidateTarget || TestAll ) {
  315. struct {
  316. LPWSTR TargetName;
  317. ULONG Type;
  318. TARGET_NAME_TYPE TargetNameType;
  319. LPWSTR UserName;
  320. DWORD Persist;
  321. } ValidTests[] = {
  322. L"DfsRoot\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  323. L"www.dfsroot.com\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  324. L"www.dfsroot.com.\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  325. L"www.ms.com", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  326. L"www.ms.com.", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  327. L"products1", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  328. L"*.acme.com", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  329. L"*.acme.com.", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  330. L"redmond\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  331. L"redmond.\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  332. L"corp.ms.com\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  333. L"corp.ms.com.\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  334. L"*Session", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  335. L"*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  336. L"[email protected]", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  337. L"[email protected].", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0,
  338. };
  339. for ( i=0; i<sizeof(ValidTests)/sizeof(ValidTests[0]); i++ ) {
  340. WCHAR TargetName[1024];
  341. ULONG TargetNameSize;
  342. WILDCARD_TYPE WildcardType;
  343. UNICODE_STRING NonWildcardedTargetName;
  344. // Copy to a buffer that can be canonicalized
  345. wcscpy( TargetName, ValidTests[i].TargetName );
  346. printf("Target %ws: ", TargetName );
  347. Status = CredpValidateTargetName(
  348. TargetName,
  349. ValidTests[i].Type,
  350. ValidTests[i].TargetNameType,
  351. ValidTests[i].UserName == NULL ? NULL : &ValidTests[i].UserName,
  352. ValidTests[i].Persist == 0 ? NULL : &ValidTests[i].Persist,
  353. &TargetNameSize,
  354. &WildcardType,
  355. &NonWildcardedTargetName );
  356. if ( !NT_SUCCESS(Status) ) {
  357. printf("is not valid: 0x%lx\n", Status );
  358. } else {
  359. printf("\n %ws: ", TargetName );
  360. printf("(%ld) %ld %wZ\n", TargetNameSize, WildcardType, &NonWildcardedTargetName );
  361. }
  362. }
  363. }
  364. }