/[winpt]/trunk/Src/wptPassphraseCB.cpp
ViewVC logotype

Diff of /trunk/Src/wptPassphraseCB.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 25 by twoaday, Wed Oct 12 10:04:26 2005 UTC revision 26 by twoaday, Mon Oct 17 08:49:30 2005 UTC
# Line 46  const char* get_symkey_algo (int algo); Line 46  const char* get_symkey_algo (int algo);
46      ((cmd) == GPG_CMD_DECRYPT? IDC_DECRYPT_HIDE : IDC_DECRYPT_SIGN_HIDE)      ((cmd) == GPG_CMD_DECRYPT? IDC_DECRYPT_HIDE : IDC_DECRYPT_SIGN_HIDE)
47    
48    
49    /* Overwrite passphrase and free memory. */
50    static void
51    burn_passphrase (char **pwd)
52    {
53        char *pass = *pwd;  
54        memset (pass, 0, strlen (pass));
55        delete []pass;
56        *pwd = NULL;
57    }
58    
59    
60  /* Dialog procedure for the passphrase callback. */  /* Dialog procedure for the passphrase callback. */
61  static BOOL CALLBACK  static BOOL CALLBACK
62  passphrase_callback_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  passphrase_callback_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
# Line 109  passphrase_callback_proc (HWND dlg, UINT Line 120  passphrase_callback_proc (HWND dlg, UINT
120              EnableWindow (GetDlgItem (dlg, IDC_DECRYPT_LIST), FALSE);              EnableWindow (GetDlgItem (dlg, IDC_DECRYPT_LIST), FALSE);
121          SetDlgItemText (dlg, c->gpg_cmd == GPG_CMD_DECRYPT?          SetDlgItemText (dlg, c->gpg_cmd == GPG_CMD_DECRYPT?
122                          IDC_DECRYPT_PWDINFO : IDC_DECRYPT_SIGN_PWDINFO,                          IDC_DECRYPT_PWDINFO : IDC_DECRYPT_SIGN_PWDINFO,
123                            c->bad_pwd? _("Bad passphrase; Enter passphrase again") :
124                          _("Please enter your passphrase"));                          _("Please enter your passphrase"));
125          if (c->gpg_cmd == GPG_CMD_DECRYPT) {          if (c->gpg_cmd == GPG_CMD_DECRYPT) {
126              SetFocus (GetDlgItem (dlg, IDC_DECRYPT_PWD));              SetFocus (GetDlgItem (dlg, IDC_DECRYPT_PWD));
# Line 136  passphrase_callback_proc (HWND dlg, UINT Line 148  passphrase_callback_proc (HWND dlg, UINT
148          return FALSE;          return FALSE;
149    
150          case WM_SYSCOMMAND:          case WM_SYSCOMMAND:
151              if( LOWORD( wparam ) == SC_CLOSE ) {              if (LOWORD (wparam) == SC_CLOSE) {
152                  SetDlgItemText( dlg, item_ctrl_id( c->gpg_cmd ), "" );                  SetDlgItemText (dlg, item_ctrl_id( c->gpg_cmd ), "");
153                  c->cancel = 1;                  c->cancel = 1;
154                  EndDialog( dlg, TRUE );                  EndDialog (dlg, TRUE);
155              }              }
156              break;              break;
157    
# Line 161  passphrase_callback_proc (HWND dlg, UINT Line 173  passphrase_callback_proc (HWND dlg, UINT
173                  /* fixme: the item is even cached when the passphrase is not                  /* fixme: the item is even cached when the passphrase is not
174                            correct, which means that the user needs to delete all                            correct, which means that the user needs to delete all
175                            cached entries to continue. */                            cached entries to continue. */
176                  if (c->pwd) {                  if (c->pwd)
177                      delete []c->pwd;                      burn_passphrase (&c->pwd);
                     c->pwd = NULL;  
                 }  
178                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));
179                  if (!n) {                  if (!n) {
180                      c->pwd = new char[2];                      c->pwd = new char[2];
181                        if (!c->pwd)
182                            BUG (NULL);
183                      strcpy (c->pwd, "");                      strcpy (c->pwd, "");
184                  }                  }
185                  else {                  else {
# Line 209  parse_gpg_keyid (const char *pass_info) Line 221  parse_gpg_keyid (const char *pass_info)
221  {  {
222      static char keyid[16+1];      static char keyid[16+1];
223            
224        /* XXX: check for leading alpha-chars? */
225      if (strlen (pass_info) < 16)      if (strlen (pass_info) < 16)
226          return NULL;          return NULL;
227      /* the format of the desc buffer looks like this:      /* the format of the desc buffer looks like this:
# Line 222  parse_gpg_keyid (const char *pass_info) Line 235  parse_gpg_keyid (const char *pass_info)
235    
236  /* Parse the information in @uid_hint and @pass_info to generate  /* Parse the information in @uid_hint and @pass_info to generate
237     a input message for the user in @desc. */     a input message for the user in @desc. */
238  static void  static int
239  parse_gpg_description (const char *uid_hint, const char *pass_info,  parse_gpg_description (const char *uid_hint, const char *pass_info,
240                         char *desc, int size)                         char *desc, int size)
241  {  {
# Line 231  parse_gpg_description (const char *uid_h Line 244  parse_gpg_description (const char *uid_h
244      char *uid, *p;      char *uid, *p;
245      int n=0;      int n=0;
246    
247        if (strlen (uid_hint) < 17) {
248            *desc = 0;
249            return -1;
250        }
251    
252      while (p = strsep ((char**)&pass_info, " ")) {      while (p = strsep ((char**)&pass_info, " ")) {
253          switch (n++) {          switch (n++) {
254          case 0: strncpy (mainkey, p, 16); mainkey[16] = 0; break;          case 0: strncpy (mainkey, p, 16); mainkey[16] = 0; break;
# Line 256  parse_gpg_description (const char *uid_h Line 274  parse_gpg_description (const char *uid_h
274                       "%s key, ID %s\n"),                       "%s key, ID %s\n"),
275                       uid, get_key_pubalgo (algo), usedkey+8);                       uid, get_key_pubalgo (algo), usedkey+8);
276      free (uid);      free (uid);
277        return 0;
278  }  }
279    
280    
281    /*
282  static int inline  static int inline
283  is_hexstring (const char * p)  is_hexstring (const char * p)
284  {  {
# Line 270  is_hexstring (const char * p) Line 290  is_hexstring (const char * p)
290      }      }
291      return 0;      return 0;
292  }  }
293    */
294    
295  /* Passphrase callback with the ability to support caching. */  /* Passphrase callback with the ability to support caching. */
296  gpgme_error_t  gpgme_error_t
# Line 285  passphrase_cb (void *hook, const char *u Line 305  passphrase_cb (void *hook, const char *u
305      DWORD n;      DWORD n;
306      int rc;      int rc;
307    
     /* XXX: pubkey_enc cancel does not quit gpg.exe */  
     /* XXX: handle prev_was_bad case. */  
308      if (!c)      if (!c)
309          return gpg_error (GPG_ERR_INV_ARG);          return gpg_error (GPG_ERR_INV_ARG);
310        c->bad_pwd = prev_was_bad? 1 : 0;
311        if (prev_was_bad && !c->cancel) {
312            if (c->pwd)
313                burn_passphrase (&c->pwd);
314            agent_del_cache (c->keyid);
315            c->pwd_init = 1;
316        }
317    
318      if (passphrase_info) {      if (passphrase_info) {
319          if (strlen (passphrase_info) < 16) {/* assume symetric encryption. */          if (strlen (passphrase_info) < 16 &&
320                !strstr (passphrase_info, "OPENPGP")) {/* assume symetric encryption. */
321              int n=2;              int n=2;
322              c->sym.sym_algo = atoi (passphrase_info);              c->sym.sym_algo = atoi (passphrase_info);
323              if (c->sym.sym_algo > 9)              if (c->sym.sym_algo > 9)
# Line 318  passphrase_cb (void *hook, const char *u Line 344  passphrase_cb (void *hook, const char *u
344          if (keyid && strlen (keyid) == 16)          if (keyid && strlen (keyid) == 16)
345              strcpy (c->keyid, keyid+8);              strcpy (c->keyid, keyid+8);
346    
347          /* if the desc has a length of 32 and only hex digits, we assume a          /* if @passphrase_info contains 'OPENPGP' we assume a smart card
348             smart card has been used. */              has been used. */
349          if (uid_hint && strlen (uid_hint) == 32 && !is_hexstring (uid_hint)) {          if (strstr (passphrase_info, "OPENPGP")) {
350              char buf[16];              char buf[16];
351              memset (buf, 0, sizeof buf);              memset (buf, 0, sizeof buf);
352              strncpy (buf, uid_hint+20, 8);              strncpy (buf, "??", 2); /* XXX: fixme we need the serial no. */
353              _snprintf (c->info, sizeof c->info-1,              _snprintf (c->info, sizeof c->info-1,
354                         _("Please enter the PIN to unlock your secret card key\n"                         _("Please enter the PIN to unlock your secret card key\n"
355                           "Card: %s"), buf);                           "Card: %s"), buf);
# Line 344  passphrase_cb (void *hook, const char *u Line 370  passphrase_cb (void *hook, const char *u
370          }          }
371          if (rc == -1) {          if (rc == -1) {
372              WriteFile (hd, "\n", 1, &n, NULL);              WriteFile (hd, "\n", 1, &n, NULL);
373              return gpg_error (GPG_ERR_EOF);              return 0;
374          }          }
375          c->pwd_init = 0;          c->pwd_init = 0;
376      }      }
377      if (c->cancel) {      if (c->cancel) {
378          WriteFile (hd, "\n", 1, &n, NULL);          WriteFile (hd, "\n", 1, &n, NULL);
379          return gpg_error (GPG_ERR_EOF);          return 0;
380      }      }
381    
382      WriteFile (hd, c->pwd, strlen (c->pwd), &n, NULL);      WriteFile (hd, c->pwd, strlen (c->pwd), &n, NULL);
# Line 368  set_gpg_passphrase_cb (passphrase_cb_s * Line 394  set_gpg_passphrase_cb (passphrase_cb_s *
394  {  {
395      memset (cb, 0, sizeof *cb);      memset (cb, 0, sizeof *cb);
396      cb->gpg_cmd = cmd;      cb->gpg_cmd = cmd;
397        cb->bad_pwd = 0;
398      cb->is_card = 0;      cb->is_card = 0;
399      cb->cancel = 0;      cb->cancel = 0;
400      cb->hwnd = hwnd;      cb->hwnd = hwnd;
# Line 391  release_gpg_passphrase_cb (passphrase_cb Line 418  release_gpg_passphrase_cb (passphrase_cb
418      free_if_alloc (ctx->title);      free_if_alloc (ctx->title);
419  }  }
420    
421    
422  /* Simple check to measure passphrase (@pass) quality.  /* Simple check to measure passphrase (@pass) quality.
423     Return value: 0 on success. */     Return value: 0 on success. */
424  int  int

Legend:
Removed from v.25  
changed lines
  Added in v.26

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26