void ClearPassphrases(HWND hDlg,GPP *gpp) { HWND hwndPhrase1,hwndPhrase2; if(gpp->pszPassPhraseConf) { secFree(gpp->pszPassPhraseConf); gpp->pszPassPhraseConf=NULL; } if(gpp->szDummy) { secFree(gpp->szDummy); gpp->szDummy=NULL; } hwndPhrase1=GetDlgItem(hDlg,IDC_PHRASE1); hwndPhrase2=GetDlgItem(hDlg,IDC_PHRASE2); if(hwndPhrase1) { WipeEditBox (gpp,hDlg, IDC_PHRASE1); SetWindowText (hwndPhrase1, ""); } if(hwndPhrase2) { WipeEditBox (gpp,hDlg, IDC_PHRASE2); SetWindowText (hwndPhrase2, ""); } SetFocus (hwndPhrase1); }
static void FreePassphrases(GPP *gpp) { if (gpp->pszPassPhrase) { secFree(gpp->pszPassPhrase); gpp->pszPassPhrase=NULL; } if (gpp->pszPassPhraseConf) { secFree(gpp->pszPassPhraseConf); gpp->pszPassPhraseConf=NULL; } }
static void ClearPassphrases(GPP *gpp) { if(gpp->pszPassPhraseConf) { secFree(gpp->pszPassPhraseConf); gpp->pszPassPhraseConf=NULL; } }
static VOID sEmptyCache (PCACHE pcache) { if (pcache->pszCachedPassphrase) { secFree (pcache->pszCachedPassphrase); pcache->pszCachedPassphrase = NULL; pcache->iCachedPassphraseLength = 0; } if (pcache->pCachedPasskey) { secFree (pcache->pCachedPasskey); pcache->pCachedPasskey = NULL; pcache->iCachedPasskeyLength = 0; } pgpClearMemory (pcache->CachedKeyID, kPGPMaxExportedKeyIDSize); pcache->CachedKeyAlg = 0; pcache->CachedHashAlg = 0; pcache->uCachedOptions = 0; }
VOID WipeEditBox ( GPP *gpp, HWND hDlg, UINT uID) { CHAR* p; INT i; i = SendDlgItemMessage (hDlg, uID, WM_GETTEXTLENGTH, 0, 0); if (i > 0) { p = (char *)secAlloc (gpp->context,i+1); if (p) { FillMemory (p, i, ' '); SendDlgItemMessage (hDlg, uID, WM_SETTEXT, 0, (LPARAM)p); secFree (p); } } }
LRESULT APIENTRY PhraseSubclassProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { UINT uQuality; CHAR * szBuf; LRESULT lResult; BOOL OKactive; GPP *gpp; gpp=(GPP *)GetWindowLong (GetParent(hWnd), GWL_USERDATA); if (CommonPhraseMsgProc (hWnd, uMsg, wParam, lParam)) return 0; switch (uMsg) { case WM_GETTEXT : { if (!gpp->pszPassPhrase) return 0; lParam = (LPARAM)gpp->pszPassPhrase; break; } case WM_CHAR : { if (wParam == VK_TAB) { if (GetKeyState (VK_SHIFT) & 0x8000) SetFocus (GetDlgItem (GetParent (hWnd), IDC_HIDETYPING)); else SetFocus (GetDlgItem (GetParent (hWnd), gpp->iNextTabControl)); } else { OKactive=TRUE; lResult = CallWindowProc (gpp->wpOrigPhrase1Proc, hWnd, uMsg, wParam, lParam); // Get our passphrase in secure memory szBuf=(char *)secAlloc(gpp->context,1024); CallWindowProc (gpp->wpOrigPhrase1Proc, hWnd, WM_GETTEXT, 1024, (LPARAM)szBuf); // Estimate its quality uQuality=pgpEstimatePassphraseQuality(szBuf); /* // Check length for setting OK to TRUE if(options->mMinPassphraseLength!=0) { if(strlen(szBuf)<options->mMinPassphraseLength) { OKactive=FALSE; } } */ // Free the passphrase memset (szBuf, 0, sizeof(szBuf)); secFree(szBuf); // Check Quality for setting OK to TRUE if(gpp->options->mMinPassphraseQuality!=0) { if(uQuality<gpp->options->mMinPassphraseQuality) { OKactive=FALSE; } } if(gpp->hwndQuality) { // Set new quality SendMessage (gpp->hwndQuality, PBM_SETPOS, uQuality, 0); } // Enable/disable OK EnableWindow (GetDlgItem (GetParent(hWnd), IDOK), OKactive); return lResult; } break; } } return CallWindowProc (gpp->wpOrigPhrase1Proc, hWnd, uMsg, wParam, lParam); }
BOOL CALLBACK pgpConfirmationDlgProc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CPGPConfirmationPassphraseDialogOptions *options; GPP *gpp; INT i; DWORD Common; Common=DoCommonCalls (hDlg,uMsg,wParam,lParam); if(Common) return Common; switch (uMsg) { case WM_INITDIALOG: { gpp=(GPP *)GetWindowLong (hDlg, GWL_USERDATA); options = (CPGPConfirmationPassphraseDialogOptions *) gpp->options; gpp->iNextTabControl = IDC_PHRASE2; gpp->hwndQuality = GetDlgItem (hDlg, IDC_PHRASEQUALITY); gpp->hwndMinQuality = GetDlgItem (hDlg, IDC_MINQUALITY); gpp->wpOrigPhrase1Proc = (WNDPROC) SetWindowLong ( GetDlgItem (hDlg, IDC_PHRASE1), GWL_WNDPROC, (LONG) PhraseSubclassProc); gpp->wpOrigPhrase2Proc = (WNDPROC) SetWindowLong ( GetDlgItem (hDlg, IDC_PHRASE2), GWL_WNDPROC, (LONG) PhraseConfirmSubclassProc); gpp->hwndOptionsControl=DisplayOptions(hDlg,options->mDialogOptions,215); // If we aren't showing quality, don't show either bar if(!options->mShowPassphraseQuality) { EnableWindow (GetDlgItem (hDlg, IDC_STATICPASSQUAL), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_STATICPASSQUAL), SW_HIDE); EnableWindow (GetDlgItem (hDlg, IDC_STATICMINQUAL), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_STATICMINQUAL), SW_HIDE); EnableWindow (GetDlgItem (hDlg, IDC_MINQUALITY), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_MINQUALITY), SW_HIDE); EnableWindow (GetDlgItem (hDlg, IDC_PHRASEQUALITY), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_PHRASEQUALITY), SW_HIDE); } // If we don't give a min quality, don't show bar if(options->mMinPassphraseQuality==0) { EnableWindow (GetDlgItem (hDlg, IDC_STATICMINQUAL), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_STATICMINQUAL), SW_HIDE); EnableWindow (GetDlgItem (hDlg, IDC_MINQUALITY), FALSE); ShowWindow (GetDlgItem (hDlg, IDC_MINQUALITY), SW_HIDE); } // Set our min quality benchmark SendMessage (gpp->hwndMinQuality, PBM_SETPOS, options->mMinPassphraseQuality, 0); // Disable OK till we get a good passphrase if mins are active if(options->mMinPassphraseQuality!=0) // (options->mMinPassphraseLength!=0)) EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); return FALSE; } case WM_COMMAND: { gpp=(GPP *)GetWindowLong (hDlg, GWL_USERDATA); options = (CPGPConfirmationPassphraseDialogOptions *) gpp->options; switch(LOWORD (wParam)) { case IDOK: { FreePassphrases(gpp); // get passphrase i = SendDlgItemMessage (hDlg, IDC_PHRASE1, WM_GETTEXTLENGTH, 0, 0) +1; gpp->szDummy = (char *)secAlloc (gpp->context, i); if(gpp->szDummy) { gpp->pszPassPhrase = (char *)secAlloc (gpp->context, i); if (gpp->pszPassPhrase) { GetDlgItemText (hDlg, IDC_PHRASE1, gpp->szDummy, i); // get passphrase confirmation i = SendDlgItemMessage (hDlg, IDC_PHRASE2, WM_GETTEXTLENGTH, 0, 0) +1; gpp->pszPassPhraseConf = (char *)secAlloc (gpp->context, i); if (gpp->pszPassPhraseConf) { GetDlgItemText (hDlg, IDC_PHRASE2, gpp->szDummy, i); if(PassphraseLengthAndQualityOK(hDlg,options,gpp->pszPassPhrase)) { if (!lstrcmp (gpp->pszPassPhrase, gpp->pszPassPhraseConf)) { ClearPassphrases(hDlg,gpp); if(gpp->pszPassPhraseConf) { secFree(gpp->pszPassPhraseConf); gpp->pszPassPhraseConf=NULL; } SaveOptionSettings(gpp->hwndOptionsControl); EndDialog (hDlg, kPGPError_NoErr); break; } else { PGPsdkUIMessageBox (hDlg, IDS_PGPERROR, IDS_PHRASEMISMATCH, MB_OK|MB_ICONEXCLAMATION); } } // Badpassphrase/quality ClearPassphrases(hDlg,gpp); FreePassphrases(gpp); SendMessage (gpp->hwndQuality, PBM_SETPOS, 0, 0); if(options->mMinPassphraseQuality!=0) EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); break; } } } // Couldn't allocate passphrases ClearPassphrases(hDlg,gpp); FreePassphrases(gpp); EndDialog (hDlg, kPGPError_OutOfMemory); break; } } break; } } return FALSE; }
VOID PGPclExport PGPclFreeCachedPhrase (LPSTR szPhrase) { pgpClearMemory (szPhrase, lstrlen (szPhrase)); secFree (szPhrase); }
char* retrieveHeader(int fd, int timeout) { char* cp_header = NULL; ssize_t i = 0; ssize_t in_size = 0; bool b_gotnl = FALSE; bool b_gotcr = FALSE; // first of all allocated our big buffer cp_header = secCalloc(MAX_HEADER_SIZE + 1, sizeof(char)); for(i=0; i<MAX_HEADER_SIZE; ++i) { in_size = pollAndRead(fd, timeout, &cp_header[i], 1); // Error from file is never good if(in_size == EXIT_FAILURE) { debugVerbose(FILEHANDLING, "Got problems with our fds\n"); secFree(cp_header); return NULL; } // Header has to end with \n\n if(in_size == 0) { debugVerbose(NORMALISE, "Invalid Header delimiter detected\n"); secExit(STATUS_BAD_REQUEST); } // register a \r if(cp_header[i] == '\r') { b_gotcr = TRUE; continue; } // special things to do on \n if(cp_header[i] == '\n') { // replace previous \r by \n if(b_gotcr == TRUE) { cp_header[i-1] = '\n'; cp_header[i] = '\0'; --i; b_gotcr = FALSE; } // break up if we had found a previous \n, thats the only right way to get out here if(b_gotnl == TRUE) { ++i; break; } b_gotnl = TRUE; continue; } // if we found a non character or a single \r we will break if(isValid(cp_header, i) == EXIT_FAILURE || b_gotcr == TRUE) { debugVerbose(FILEHANDLING, "Detected invalid char while retrieving header\n"); secExit(STATUS_BAD_REQUEST); } b_gotnl = FALSE; b_gotcr = FALSE; } // Header is too large if(i == MAX_HEADER_SIZE) { debug(FILEHANDLING, "Too long header! We don't like to get overflowed, bye bye\n"); secExit(STATUS_BAD_REQUEST); } cp_header[i] = '\0'; return secRealloc(cp_header, (i + 1) * sizeof(char)); }