www.pudn.com > ntcrypto.rar > cppapi.c


///////////////////////////////////////////////////////////////////////////// 
//  FILE          : cppapi.c                                               // 
//  DESCRIPTION   : Cryptography Provider Private APIs                     // 
//  AUTHOR        :                                                        // 
//  HISTORY       :                                                        // 
//  May  9 1995 larrys  New                                                // 
//                                                                         // 
//  Copyright (C) 1993 Microsoft Corporation   All Rights Reserved         // 
///////////////////////////////////////////////////////////////////////////// 
 
#include  
#include "precomp.h" 
#include "ntagimp1.h" 
#include "cppapi.h" 
#include "resource.h" 
 
#define MAX_STRING_RSC_SIZE			512 
#define	MAX_AT_KEY_RSC_SIZE			32 
 
#define SIGN_TXT                    1 
#define EXPORT_PRIV_TXT             2 
#define GENKEY_NO_OVER_TXT          3 
#define GENKEY_OVER_TXT             4 
#define IMPORT_SIMPLE_TXT           5 
#define IMPORT_PRIV_NO_OVER_TXT     6 
#define IMPORT_PRIV_OVER_TXT        7 
#define SETKEYPARAM_CHGPWD_TXT      8 
 
extern HINSTANCE hInstance; 
 
typedef struct _DIALOG_INFO 
{ 
    DWORD	dwDialogType; 
    LPCTSTR szContainer; 
    DWORD	dwKeySpec; 
} DIALOG_INFO, *PDIALOG_INFO; 
 
DWORD GetShortFileName( 
			HINSTANCE hInstance, 
			LPTSTR szText, 
			DWORD dwSize) 
{ 
	DWORD dwText; 
    TCHAR *psz; 
    int i; 
	dwText = GetModuleFileName( 
		hInstance, 
		szText, 
		dwSize); 
 
	psz = szText+dwText;		 
 
	for (i=0; ( (*psz != '\\') && (psz != szText)); i++) 
		psz--; 
 
	// don't copy the first \, instead copy the end \n  
	MoveMemory(szText, psz+1, i*sizeof(TCHAR)); 
	return (i*sizeof(TCHAR)); 
} 
 
/* 
void WriteStuff(LPCSTR sz, DWORD dw, BOOL f) 
{ 
    HANDLE hFile; 
    DWORD dw1; 
    BOOL fResult; 
 
    if( INVALID_HANDLE_VALUE == (hFile = CreateFile("stuff", GENERIC_WRITE, 
	    FILE_SHARE_READ | FILE_SHARE_WRITE, 
	    NULL, OPEN_ALWAYS, 0, NULL))) 
        goto Ret; 
    if (f) 
    { 
	    if (!(fResult = WriteFile(hFile, sz, strlen(sz), &dw1, NULL))) 
	        goto Ret; 
    } 
    else 
    { 
	    if (!(fResult = WriteFile(hFile, &dw, sizeof(DWORD), &dw1, NULL))) 
	        goto Ret; 
    } 
Ret: 
    if (hFile) 
	    CloseHandle(hFile); 
} 
*/ 
#ifdef _USE_UI 
 
BOOL GetDialogInfo( 
                   IN PNTAGUserList pTmpUser, 
                   IN DWORD dwDialogType, 
                   IN DWORD dwKeySpec, 
                   IN OUT PDIALOG_INFO pInfo 
                   ) 
{ 
    pInfo->dwDialogType = dwDialogType; 
    pInfo->dwKeySpec = dwKeySpec; 
    pInfo->szContainer = pTmpUser->szUserName; 
    return TRUE; 
} 
 
LRESULT CALLBACK DialogSolicitPassword( 
                                       HWND hDlg, 
                                       UINT message, 
                                       WPARAM wParam, 
                                       LPARAM lParam 
                                       ) 
{ 
	TCHAR	szText[MAX_STRING_RSC_SIZE]; 
    TCHAR	szKeyType[MAX_AT_KEY_RSC_SIZE]; 
	TCHAR	szCallerName[MAX_PATH]; 
	TCHAR*	pszFinalText = NULL; 
	TCHAR	szBoxText[MAX_STRING_RSC_SIZE]; 
 
	LPCTSTR list[3]; 
 
	UINT	uiKeyText = 0; 
	UINT	uiBoxText = 0; 
	PDIALOG_INFO pDlgInfo = (PDIALOG_INFO)lParam; 
 
	switch (message) 
    { 
        case WM_INITDIALOG: 
            ShowWindow (hDlg, SW_HIDE); 
 
			switch(pDlgInfo->dwDialogType) 
            { 
                case SIGN_TXT: 
					uiBoxText = IDS_SIGN_BOXTEXT; 
                break; 
                case EXPORT_PRIV_TXT: 
					uiBoxText = IDS_EXPORT_PRIVATE_BOXTEXT; 
                break; 
                case IMPORT_SIMPLE_TXT: 
					uiBoxText = IDS_IMPORT_SIMPLE_BOXTEXT; 
                break; 
            } 
 
			// set boxtext 
			{ 
				// Key type: KeyX or Sig? 
				if (AT_SIGNATURE == pDlgInfo->dwKeySpec) 
					uiKeyText = IDS_AT_SIGNATURE; 
				else 
					uiKeyText = IDS_AT_KEYEXCHANGE; 
 
				LoadString( 
						hInstance,  
						uiKeyText, 
						szKeyType,  
						MAX_AT_KEY_RSC_SIZE); 
 
				// Caller? 
				GetShortFileName( 
						NULL, 
						szCallerName, 
						MAX_PATH); 
 
				LoadString( 
						hInstance,  
						uiBoxText, 
						szBoxText,  
						MAX_STRING_RSC_SIZE); 
 
				list[0]=szCallerName; 
				list[1]=pDlgInfo->szContainer; 
				list[2]=szKeyType; 
 
				if (0 != FormatMessage( 
						FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,	 
						szBoxText, 
						0, 
					    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  
						(LPTSTR)&pszFinalText,	 
						0,	 
						(va_list*)&list 
					   )) 
				{ 
					SetWindowText(GetDlgItem(hDlg, IDC_BOXTEXT), pszFinalText); 
					LocalFree(pszFinalText); 
				} 
			} 
 
			// titlebar 
			if (0 != LoadString( 
					hInstance, 
					IDS_SOLICIT_PASSWORD_TITLE, 
					szText, 
					MAX_STRING_RSC_SIZE)) 
				SetWindowText (hDlg, szText); 
 
			// prompts 
			if (0 != LoadString( 
					hInstance, 
					IDS_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_PASSWORD_STATICTEXT), szText); 
 
			ShowWindow (hDlg, SW_SHOW); 
			return (TRUE); 
 
      case WM_COMMAND: 
         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
         { 
            EndDialog(hDlg, (LOWORD(wParam) == IDOK)); 
            return TRUE; 
         } 
         break; 
   } 
 
    return FALSE; 
} 
 
LRESULT CALLBACK DialogNewPassword( 
                                   HWND hDlg, 
                                   UINT message, 
                                   WPARAM wParam, 
                                   LPARAM lParam 
                                   ) 
{ 
    TCHAR	szText[MAX_STRING_RSC_SIZE]; 
    TCHAR	szKeyType[MAX_AT_KEY_RSC_SIZE]; 
	TCHAR	szCallerName[MAX_PATH]; 
	TCHAR*	pszFinalText = NULL; 
	TCHAR	szBoxText[MAX_STRING_RSC_SIZE]; 
 
	LPCTSTR list[3]; 
 
	UINT	uiBoxText = 0; 
	UINT	uiKeyText = 0; 
	PDIALOG_INFO pDlgInfo = (PDIALOG_INFO)lParam; 
 
    DWORD dw; 
 
    switch (message) 
    { 
        case WM_INITDIALOG: 
            ShowWindow (hDlg, SW_HIDE); 
 
			switch(pDlgInfo->dwDialogType) 
            { 
                case GENKEY_NO_OVER_TXT: 
					uiBoxText = IDS_GENKEY_BOXTEXT; 
                break; 
                case IMPORT_PRIV_NO_OVER_TXT: 
					uiBoxText = IDS_IMPORT_PRIVATE_BOXTEXT; 
                break; 
            } 
             
			// set boxtext 
			{ 
				// Key type: KeyX or Sig? 
				if (AT_SIGNATURE == pDlgInfo->dwKeySpec) 
					uiKeyText = IDS_AT_SIGNATURE; 
				else 
					uiKeyText = IDS_AT_KEYEXCHANGE; 
 
				LoadString( 
						hInstance,  
						uiKeyText, 
						szKeyType,  
						MAX_AT_KEY_RSC_SIZE); 
 
 
				// Caller? 
				GetShortFileName( 
						NULL, 
						szCallerName, 
						MAX_PATH); 
 
				LoadString( 
						hInstance,  
						uiBoxText, 
						szBoxText,  
						MAX_STRING_RSC_SIZE); 
 
				list[0]=szCallerName; 
				list[1]=pDlgInfo->szContainer; 
				list[2]=szKeyType; 
 
				if (0 != FormatMessage( 
						FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,	 
						szBoxText, 
						0, 
					    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  
						(LPTSTR)&pszFinalText,	 
						0,	 
						(va_list*)&list 
					   )) 
                { 
 
					SetWindowText(GetDlgItem(hDlg, IDC_BOXTEXT), pszFinalText); 
					LocalFree(pszFinalText); 
                } 
			} 
 
			// titlebar 
			if (0 != LoadString( 
					hInstance, 
					IDS_NEW_PASSWORD_TITLE, 
					szText, 
					MAX_STRING_RSC_SIZE)) 
				SetWindowText (hDlg, szText); 
 
			// prompts 
			if (0 != LoadString( 
					hInstance, 
					IDS_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_PASSWORD_STATICTEXT), szText); 
 
			if (0 != LoadString( 
					hInstance, 
					IDS_CONFIRM_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_CONFIRM_PASSWORD_STATICTEXT), szText); 
 
			ShowWindow (hDlg, SW_SHOW); 
            return (TRUE); 
 
        case WM_COMMAND: 
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            { 
                EndDialog(hDlg, (LOWORD(wParam) == IDOK)); 
                return TRUE; 
            } 
            break; 
    } 
 
    return FALSE; 
} 
 
LRESULT CALLBACK DialogOverwritePassword( 
                                         HWND hDlg, 
                                         UINT message, 
                                         WPARAM wParam, 
                                         LPARAM lParam 
                                         ) 
{ 
    TCHAR	szText[MAX_STRING_RSC_SIZE]; 
    TCHAR	szKeyType[MAX_AT_KEY_RSC_SIZE]; 
	TCHAR	szCallerName[MAX_PATH]; 
	TCHAR*	pszFinalText = NULL; 
	TCHAR	szBoxText[MAX_STRING_RSC_SIZE]; 
 
	LPCTSTR list[3]; 
 
	UINT	uiKeyText = 0; 
	UINT	uiBoxText = 0; 
	PDIALOG_INFO pDlgInfo = (PDIALOG_INFO)lParam; 
 
    switch (message) 
    { 
        case WM_INITDIALOG: 
            ShowWindow (hDlg, SW_HIDE); 
 
			switch(pDlgInfo->dwDialogType) 
            { 
                case SETKEYPARAM_CHGPWD_TXT: 
					uiBoxText = IDS_CHANGEPASS_BOXTEXT; 
                break; 
                case GENKEY_OVER_TXT: 
					uiBoxText = IDS_GENKEY_OW_BOXTEXT; 
                break; 
                case IMPORT_PRIV_OVER_TXT: 
					uiBoxText = IDS_IMPORT_PRIVATE_OW_BOXTEXT; 
                break; 
            } 
 
			// set boxtext 
			{ 
				// Key type: KeyX or Sig? 
				if (AT_SIGNATURE == pDlgInfo->dwKeySpec) 
					uiKeyText = IDS_AT_SIGNATURE; 
				else 
					uiKeyText = IDS_AT_KEYEXCHANGE; 
 
				LoadString( 
						hInstance,  
						uiKeyText, 
						szKeyType,  
						MAX_AT_KEY_RSC_SIZE); 
 
				// Caller? 
				GetShortFileName( 
						NULL, 
						szCallerName, 
						MAX_PATH); 
 
				LoadString( 
						hInstance,  
						uiBoxText, 
						szBoxText,  
						MAX_STRING_RSC_SIZE); 
 
				list[0]=szCallerName; 
				list[1]=pDlgInfo->szContainer; 
				list[2]=szKeyType; 
 
				if (0 != FormatMessage( 
						FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,	 
						szBoxText, 
						0, 
					    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  
						(LPTSTR)&pszFinalText,	 
						0,	 
						(va_list*)&list 
					   )) 
				{ 
					SetWindowText(GetDlgItem(hDlg, IDC_BOXTEXT), pszFinalText); 
					LocalFree(pszFinalText); 
				} 
			} 
 
			// titlebar 
			if (0 != LoadString( 
					hInstance, 
					IDS_OVERWRITE_PASSWORD_TITLE, 
					szText, 
					MAX_STRING_RSC_SIZE)) 
				SetWindowText (hDlg, szText); 
 
			// prompts 
			if (0 != LoadString( 
					hInstance, 
					IDS_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_PASSWORD_STATICTEXT), szText); 
 
			if (0 != LoadString( 
					hInstance, 
					IDS_CONFIRM_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_CONFIRM_PASSWORD_STATICTEXT), szText); 
 
			if (0 != LoadString( 
					hInstance, 
					IDS_OLD_PASSWORD_PROMPT, 
					szText,  
					MAX_STRING_RSC_SIZE)) 
				SetWindowText(GetDlgItem(hDlg, IDC_OLD_PASSWORD_STATICTEXT), szText); 
 
            ShowWindow (hDlg, SW_SHOW); 
            return (TRUE); 
 
        case WM_COMMAND: 
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            { 
                EndDialog(hDlg, (LOWORD(wParam) == IDOK)); 
                return TRUE; 
            } 
            break; 
    } 
 
    return FALSE; 
} 
 
#endif	// _USE_UI 
 
/* 
 -  CryptLogonVerify 
 - 
 *  Purpose: 
 *                Used by CryptAcquireContext to verify logon password. 
 * 
 * 
 *  Parameters: 
 *               OUT     hPrivid -  Handle to the id of the user 
 * 
 *  Returns: 
 */ 
BOOL CryptLogonVerify(OUT HPRIVUID *hUID) 
{ 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    ret = MessageBox(NULL, "Type Password", "CryptLogonVerify", MB_OK); 
 
    *hUID = 0xdeadbeef; 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
/* 
 -  CryptGetUserData 
 - 
 *  Purpose: 
 *                Get required data from user. 
 * 
 * 
 *  Parameters: 
 *               IN      hPrivid  -  Handle to the id of the user 
 *               OUT     pbData   -  bufer containing user-supplied data 
 *               OUT     dwBufLen -  lenght of user-supplied data 
 * 
 *  Returns: 
 */ 
BOOL CryptGetUserData(IN  HPRIVUID hUID, 
                      OUT BYTE **pbData, 
                      OUT DWORD *dwBufLen) 
{ 
#ifdef MESSAGEBOXES 
    int     ret; 
    BYTE    *pbTmp; 
 
    ret = MessageBox(NULL, "Type User Data", "CryptGetUserData", MB_OK); 
 
    if (hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    *dwBufLen = strlen("This is a string to hash"); 
    if ((pbTmp = (BYTE *) malloc(*dwBufLen)) == NULL) 
    { 
	SetLastError(NTE_NO_MEMORY); 
	return CPPAPI_FAILED; 
    } 
 
    strcpy(pbTmp, "This is a string to hash"); 
 
    *pbData = pbTmp; 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
/* 
 -  CryptConfirmSignature 
 - 
 *  Purpose: 
 *                Determine weather the signing should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      pTmpUser     -  Pointer to the user list structure 
 *               IN      dwKeySpec    -  Type of key to be used for signing 
 *               IN      sDescription -  Description of document to be signed 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmSignature( 
                           IN PNTAGUserList pTmpUser, 
                           IN DWORD dwKeySpec, 
                           IN LPCTSTR sDescription 
                           ) 
{ 
    DWORD   dwResult = TRUE; 
 
#ifdef _USE_UI 
    DIALOG_INFO Info; 
 
    if (!GetDialogInfo(pTmpUser, SIGN_TXT, dwKeySpec, &Info)) 
        dwResult = FALSE; 
    else 
    { 
        if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                             MAKEINTRESOURCE(IDD_SOLICIT_PASSWORD), 
                                             pTmpUser->hWnd, 
                                             (DLGPROC)DialogSolicitPassword, 
                                             (long)&Info))) 
            dwResult = FALSE; 
    } 
#endif // _USE_UI 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (pTmpUser->hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (strcmp(sDescription, "signed") != 0) 
    { 
	SetLastError(NTE_BAD_SIGNATURE); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptConfirmSignature", MB_OK); 
#endif 
 
    return dwResult; 
 
} 
 
/* 
 -  CryptUserProtectKey 
 - 
 *  Purpose:      Obtain or determine user protection information. 
 *                 
 * 
 * 
 *  Parameters: 
 *               IN      hPrivid      -  Handle to the id of the user 
 *               IN      hKey         -  Handle to key 
 * 
 *  Returns: 
 */ 
BOOL CryptUserProtectKey(IN HPRIVUID hUID, 
                         IN HCRYPTKEY hKey) 
{ 
 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (hKey == 0) 
    { 
	SetLastError(NTE_BAD_KEY); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptUserProtectKey", MB_OK); 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
 
/* 
 -  CryptConfirmEncryption 
 - 
 *  Purpose: 
 *                Determine weather the encryption should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      hPrivid      -  Handle to the id of the user 
 *               IN      hKey         -  Handle to key 
 *               IN      final        -  flag indicating last encrypt for a 
 *                                       block of data 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmEncryption(IN HPRIVUID hUID, 
                            IN HCRYPTKEY hKey, 
                            IN BOOL final) 
{ 
 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (hKey == 0) 
    { 
	SetLastError(NTE_BAD_KEY); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptConfirmEncryption", MB_OK); 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
 
/* 
 -  CryptConfirmDecryption 
 - 
 *  Purpose: 
 *                Determine weather the DEcryption should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      hPrivid      -  Handle to the id of the user 
 *               IN      hKey         -  Handle to key 
 *               IN      final        -  flag indicating last encrypt for a 
 *                                       block of data 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmDecryption(IN HPRIVUID hUID, 
                            IN HCRYPTKEY hKey, 
                            IN BOOL final) 
{ 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (hKey == 0) 
    { 
	SetLastError(NTE_BAD_KEY); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptConfirmDecryption", MB_OK); 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
 
/* 
 -  CryptConfirmTranslation 
 - 
 *  Purpose: 
 *                Determine weather the translation should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      hPrivid      -  Handle to the id of the user 
 *               IN      hKey         -  Handle to key 
 *               IN      final        -  flag indicating last encrypt for a 
 *                                       block of data 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmTranslation(IN HPRIVUID hUID, 
                             IN HCRYPTKEY hKey, 
                             IN BOOL final) 
{ 
 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (hKey == 0) 
    { 
	SetLastError(NTE_BAD_KEY); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptConfirmTranslation", MB_OK); 
#endif 
 
    return CPPAPI_SUCCEED; 
 
} 
 
 
/* 
 -  CryptConfirmExportKey 
 - 
 *  Purpose: 
 *                Determine whether the export key should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      pTmpUser     -  Pointer to the user list structure 
 *               IN      dwKeySpec    -  Type of key to be exported 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmExportKey( 
                           IN PNTAGUserList pTmpUser, 
                           IN DWORD dwKeySpec 
                           ) 
{ 
    DWORD   dwResult = TRUE; 
 
#ifdef _USE_UI 
    DIALOG_INFO Info; 
 
    if (!GetDialogInfo(pTmpUser, EXPORT_PRIV_TXT, dwKeySpec, &Info)) 
        dwResult = FALSE; 
    else 
    { 
        if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                             MAKEINTRESOURCE(IDD_SOLICIT_PASSWORD), 
                                             pTmpUser->hWnd, 
                                             (DLGPROC)DialogSolicitPassword, 
                                             (long)&Info))) 
            dwResult = FALSE; 
    } 
#endif // _USE_UI 
#ifdef MESSAGEBOXES 
    int     ret; 
 
    if (pTmpUser->hUID !=  0xdeadbeef) 
    { 
	SetLastError(NTE_BAD_UID); 
	return CPPAPI_FAILED; 
    } 
 
    if (hKey == 0) 
    { 
	SetLastError(NTE_BAD_KEY); 
	return CPPAPI_FAILED; 
    } 
 
    ret = MessageBox(NULL, "Type password", "CryptConfirmExportKey", MB_OK); 
#endif 
 
    return dwResult; 
} 
 
/* 
 -  CryptConfirmImportKey 
 - 
 *  Purpose: 
 *                Determine whether the import key should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      pTmpUser     -  Pointer to the user list structure 
 *               IN      pKey         -  Pointer to the key list structure 
 *               IN      dwBlobType   -  Type of blob to be imported 
 *               IN      dwKeySpec    -  Type of key to be imported 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmImportKey( 
                           IN PNTAGUserList pTmpUser, 
                           IN DWORD dwBlobType, 
                           IN DWORD dwKeySpec 
                           ) 
{ 
    BOOL    fOverwrite = FALSE; 
    DWORD   dwResult = TRUE; 
 
#ifdef _USE_UI 
    DIALOG_INFO Info; 
 
    if (PRIVATEKEYBLOB == dwBlobType) 
    { 
        if (AT_SIGNATURE == dwKeySpec) 
        { 
            if (pTmpUser->SigPrivLen) 
                fOverwrite = TRUE; 
        } 
        else 
        { 
            if (pTmpUser->ExchPrivLen) 
                fOverwrite = TRUE; 
        } 
 
        if (fOverwrite) 
        { 
            if (!GetDialogInfo(pTmpUser, IMPORT_PRIV_OVER_TXT, dwKeySpec, &Info)) 
                dwResult = FALSE; 
            else 
            { 
                if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                                     MAKEINTRESOURCE(IDD_OVERWRITE_PASSWORD), 
                                                     pTmpUser->hWnd, 
                                                     (DLGPROC)DialogOverwritePassword, 
                                                     (long)&Info))) 
                    dwResult = FALSE; 
            } 
        } 
        else 
        { 
            if (!GetDialogInfo(pTmpUser, IMPORT_PRIV_NO_OVER_TXT, dwKeySpec, &Info)) 
                dwResult = FALSE; 
            else 
            { 
                if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                                     MAKEINTRESOURCE(IDD_NEW_PASSWORD), 
                                                     pTmpUser->hWnd, 
                                                     (DLGPROC)DialogNewPassword, 
                                                     (long)&Info))) 
                    dwResult = FALSE; 
            } 
        } 
    } 
    else if (SIMPLEBLOB == dwBlobType) 
    { 
        if (!GetDialogInfo(pTmpUser, IMPORT_SIMPLE_TXT, dwKeySpec, &Info)) 
            dwResult = FALSE; 
        else 
        { 
            if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                                 MAKEINTRESOURCE(IDD_SOLICIT_PASSWORD), 
                                                 pTmpUser->hWnd, 
                                                 (DLGPROC)DialogSolicitPassword, 
                                                 (long)&Info))) 
                dwResult = FALSE; 
        } 
    } 
 
#endif // _USE_UI 
 
    return dwResult; 
} 
 
/* 
 -  CryptConfirmGenKey 
 - 
 *  Purpose: 
 *                Determine whether the gen key should proceed. 
 * 
 * 
 *  Parameters: 
 *               IN      pTmpUser     -  Pointer to the user list structure 
 *               IN      pKey         -  Pointer to the key list structure 
 *               IN      dwKeySpec    -  Type of key to be imported 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmGenKey( 
                        IN PNTAGUserList pTmpUser, 
                        IN DWORD dwKeySpec 
                        ) 
{ 
    BOOL    fOverwrite = FALSE; 
    DWORD   dwResult = TRUE; 
 
#ifdef _USE_UI 
    DIALOG_INFO Info; 
 
    if (AT_SIGNATURE == dwKeySpec) 
    { 
        if (pTmpUser->SigPrivLen) 
            fOverwrite = TRUE; 
    } 
    else 
    { 
        if (pTmpUser->ExchPrivLen) 
            fOverwrite = TRUE; 
    } 
 
    if (fOverwrite) 
    { 
        if (!GetDialogInfo(pTmpUser, GENKEY_OVER_TXT, dwKeySpec, &Info)) 
            dwResult = FALSE; 
        else 
        { 
            if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                                 MAKEINTRESOURCE(IDD_OVERWRITE_PASSWORD), 
                                                 pTmpUser->hWnd, 
                                                 (DLGPROC)DialogOverwritePassword, 
                                                 (long)&Info))) 
                dwResult = FALSE; 
        } 
    } 
    else 
    { 
        if (!GetDialogInfo(pTmpUser, GENKEY_NO_OVER_TXT, dwKeySpec, &Info)) 
            dwResult = FALSE; 
        else 
        { 
            if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                                 MAKEINTRESOURCE(IDD_NEW_PASSWORD), 
                                                 pTmpUser->hWnd, 
                                                 (DLGPROC)DialogNewPassword, 
                                                 (long)&Info))) 
                dwResult = FALSE; 
        } 
    } 
#endif // _USE_UI 
 
    return dwResult; 
} 
 
/* 
 -  CryptConfirmChangePassword 
 - 
 *  Purpose: 
 *                Determine whether the key password should be changed. 
 * 
 * 
 *  Parameters: 
 *               IN      pTmpUser     -  Pointer to the user list structure 
 *               IN      dwKeySpec    -  Type of key changing the password for 
 * 
 *  Returns: 
 */ 
BOOL CryptConfirmChangePassword( 
                                IN PNTAGUserList pTmpUser, 
                                IN DWORD dwKeySpec 
                                ) 
{ 
    DWORD   dwResult = TRUE; 
 
#ifdef _USE_UI 
    DIALOG_INFO Info; 
 
    if (!GetDialogInfo(pTmpUser, SETKEYPARAM_CHGPWD_TXT, dwKeySpec, &Info)) 
        dwResult = FALSE; 
    else 
    { 
        if (-1 == (dwResult = DialogBoxParam(hInstance, 
                                             MAKEINTRESOURCE(IDD_OVERWRITE_PASSWORD), 
                                             pTmpUser->hWnd, 
                                             (DLGPROC)DialogOverwritePassword, 
                                             (long)&Info))) 
            dwResult = FALSE; 
    } 
#endif // _USE_UI 
 
    return dwResult; 
}