/*++ Copyright (c) 2000 Microsoft Corporation Module Name: ctcred.c Abstract: Component test for cred marshaling and unmarshaling Author: Cliff Van Dyke (CliffV) March 22, 2000 Environment: Revision History: --*/ #include #include #include #include #include #include #include #include #include int __cdecl main( IN int argc, IN char ** argv ) { DWORD WinStatus; NTSTATUS Status; UCHAR Buffer[1024]; UCHAR Buffer2[1024]; PCERT_CREDENTIAL_INFO CertCred1 = (PCERT_CREDENTIAL_INFO)Buffer; PCERT_CREDENTIAL_INFO CertCred2; PUSERNAME_TARGET_CREDENTIAL_INFO UsernameTargetCred1 = (PUSERNAME_TARGET_CREDENTIAL_INFO)Buffer; PUSERNAME_TARGET_CREDENTIAL_INFO UsernameTargetCred2; LONG Size; ULONG i; int j; NETRESOURCEW NetRes; LPWSTR MarshaledCredential; LPSTR argument; BOOLEAN TestCert = FALSE; BOOLEAN TestUsernameTarget = FALSE; BOOLEAN TestValidateTarget = FALSE; BOOLEAN TestNetUse = FALSE; BOOLEAN TestAll = TRUE; // // Loop through the arguments handle each in turn // for ( j=1; jcbSize = sizeof(*CertCred1); for ( i=0; irgbHashOfCert); i++ ) { CertCred1->rgbHashOfCert[i] = (BYTE)Size; } // // Marshal it. // if ( !CredMarshalCredentialW( CertCredential, CertCred1, &MarshaledCredential ) ) { printf( "Cert: Cannot marshal cred: %ld %ld\n", Size, GetLastError() ); return 1; } printf( "Cert: %ld: %ws\n", Size, MarshaledCredential ); // // Ensure it is a marshaled cred // if ( !CredIsMarshaledCredentialW( MarshaledCredential ) ) { printf( "Cert: Cred isn't marshaled: %ld\n", Size ); return 1; } // // Unmarshal it // CredType = (CRED_MARSHAL_TYPE) 87; if ( !CredUnmarshalCredentialW( MarshaledCredential, &CredType, &CertCred2 ) ) { printf( "Cert: Cannot unmarshal cred: %ld %ld\n", Size, GetLastError() ); return 1; } // // Verify it // if ( CredType != CertCredential ) { printf( "Cert: Bad CredType: %ld\n", Size ); return 1; } if ( !RtlEqualMemory( CertCred1, CertCred2, sizeof(*CertCred1) - 3 * sizeof(ULONG) ) ) { printf( "Cert: Bad Cred structure: %ld\n", Size ); return 1; } if ( TestNetUse || TestAll ) { NetRes.dwType = RESOURCETYPE_ANY; NetRes.lpLocalName = NULL; NetRes.lpRemoteName = L"\\\\CLIFFV1\\d$"; NetRes.lpProvider = NULL; WinStatus = WNetAddConnection2W( &NetRes, L"", // no password MarshaledCredential, 0 ); if ( WinStatus != NO_ERROR ) { printf( "Cert: Cannot connect: %ld %ld\n", Size, WinStatus ); } } CredFree( CertCred2 ); CredFree( MarshaledCredential ); } } // // Test UsernameTarget marshaling // if ( TestUsernameTarget || TestAll ) { // // NULL cred should fail // if ( CredMarshalCredentialW( UsernameTargetCredential, NULL, &MarshaledCredential ) ) { printf( "UsernameTarget: Marshal NULL cred should have failed\n" ); return 1; } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) { printf( "UsernameTarget: Marshal NULL cred failed with wrong status: %ld\n", GetLastError() ); return 1; } // // Empty cred should fail // RtlZeroMemory( UsernameTargetCred1, sizeof(*UsernameTargetCred1) ); if ( CredMarshalCredentialW( UsernameTargetCredential, UsernameTargetCred1, &MarshaledCredential ) ) { printf( "UsernameTarget: Marshal Short cred should have failed\n" ); return 1; } else if ( GetLastError() != ERROR_INVALID_PARAMETER ) { printf( "UsernameTarget: Marshal Short cred failed with wrong status: %ld\n", GetLastError() ); return 1; } // // Loop marshalling buffers of various sizes // for ( Size=-3; Size<255; Size ++ ) { CRED_MARSHAL_TYPE CredType; // // Build a cred to marshal // UsernameTargetCred1->UserName = (LPWSTR)Buffer2; if ( Size == -3 ) { wcscpy( UsernameTargetCred1->UserName, L"a" ); } else if ( Size == -2 ) { wcscpy( UsernameTargetCred1->UserName, L"ntdev\\cliffv" ); } else if ( Size == -1 ) { wcscpy( UsernameTargetCred1->UserName, L"cliffv@ms.com" ); } else { for ( i=0; iUserName, UsernameTargetCred2->UserName ) != 0 ) { printf( "UsernameTarget: %ws: Bad Cred structure: %ld\n", UsernameTargetCred1->UserName, Size ); return 1; } } else { if ( !RtlEqualMemory( UsernameTargetCred1->UserName, UsernameTargetCred2->UserName, Size*sizeof(WCHAR) ) ) { printf( "UsernameTarget: Bad Cred structure: %ld\n", Size ); return 1; } } // // Connect using the credential // if ( TestNetUse || TestAll ) { NetRes.dwType = RESOURCETYPE_ANY; NetRes.lpLocalName = NULL; NetRes.lpRemoteName = L"\\\\CLIFFV1\\d$"; NetRes.lpProvider = NULL; WinStatus = WNetAddConnection2W( &NetRes, L"", // no password MarshaledCredential, 0 ); if ( WinStatus != NO_ERROR ) { printf( "UsernameTarget: Cannot connect: %ld %ld\n", Size, WinStatus ); } } CredFree( UsernameTargetCred2 ); CredFree( MarshaledCredential ); } } // // Test ValidateTargetName // if ( TestValidateTarget || TestAll ) { struct { LPWSTR TargetName; ULONG Type; TARGET_NAME_TYPE TargetNameType; LPWSTR UserName; DWORD Persist; } ValidTests[] = { L"DfsRoot\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"www.dfsroot.com\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"www.dfsroot.com.\\DfsShare", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"www.ms.com", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"www.ms.com.", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"products1", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"*.acme.com", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"*.acme.com.", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"redmond\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"redmond.\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"corp.ms.com\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"corp.ms.com.\\*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"*Session", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"*", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"cliffv@ms.com", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, L"cliffv@ms.com.", CRED_TYPE_DOMAIN_PASSWORD, MightBeUsernameTarget, NULL, 0, }; for ( i=0; i