/[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 24 by twoaday, Sat Oct 8 10:43:08 2005 UTC revision 26 by twoaday, Mon Oct 17 08:49:30 2005 UTC
# Line 37  Line 37 
37  #include "wptAgent.h"  #include "wptAgent.h"
38  #include "wptRegistry.h"  #include "wptRegistry.h"
39    
40    const char* get_symkey_algo (int algo);
41    
42  #define item_ctrl_id( cmd ) \  #define item_ctrl_id( cmd ) \
43      ((cmd) == GPG_CMD_DECRYPT? IDC_DECRYPT_PWD : IDC_DECRYPT_SIGN_PWD)      ((cmd) == GPG_CMD_DECRYPT? IDC_DECRYPT_PWD : IDC_DECRYPT_SIGN_PWD)
# Line 45  Line 46 
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 53  passphrase_callback_proc (HWND dlg, UINT Line 65  passphrase_callback_proc (HWND dlg, UINT
65      gpgme_decrypt_result_t res;      gpgme_decrypt_result_t res;
66      gpgme_sign_result_t res_sig;      gpgme_sign_result_t res_sig;
67      gpgme_key_t key;      gpgme_key_t key;
68        void *ctx = NULL, *item;
69      const char *id;      const char *id;
70      char *info;      char *info;
     void *ctx = NULL, *item;  
71      int n;      int n;
72    
73      switch (msg) {      switch (msg) {
# Line 69  passphrase_callback_proc (HWND dlg, UINT Line 81  passphrase_callback_proc (HWND dlg, UINT
81                  _("Encrypted with the following public key(s)") );                  _("Encrypted with the following public key(s)") );
82              CheckDlgButton( dlg, IDC_DECRYPT_HIDE, BST_CHECKED );              CheckDlgButton( dlg, IDC_DECRYPT_HIDE, BST_CHECKED );
83          }          }
84          else if( c->gpg_cmd == GPG_CMD_SIGN )          else if (c->gpg_cmd == GPG_CMD_SIGN)
85              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);
86          res = gpgme_op_decrypt_result (c->gpg);          res = gpgme_op_decrypt_result (c->gpg);
87          if (res != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {          if (res != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {
88              gpgme_recipient_t r;              gpgme_recipient_t r;
89    
90                /* XXX: not all ENCRYPT_TO entries are listed here. */
91              for (r = res->recipients; r; r = r->next) {              for (r = res->recipients; r; r = r->next) {
92                  get_pubkey (r->keyid, &key);                  get_pubkey (r->keyid, &key);
93                  if (key) {                  if (key) {
# Line 83  passphrase_callback_proc (HWND dlg, UINT Line 96  passphrase_callback_proc (HWND dlg, UINT
96                      if (!id)                      if (!id)
97                          id = _("Invalid User ID");                          id = _("Invalid User ID");
98                      uid = utf8_to_wincp (id, strlen (id));                      uid = utf8_to_wincp (id, strlen (id));
99                      info = new char [16+strlen (uid) + 4 + strlen (r->keyid) + strlen (key->uids->email) +  3];                      info = new char [32+strlen (uid)+1 + 4 + strlen (r->keyid)+1
100                                         + strlen (key->uids->email)+1];
101                      if (!info)                      if (!info)
102                          BUG (NULL);                          BUG (NULL);
103                      sprintf (info, "%s <%s> (%s, 0x%s)", uid, key->uids->email,                      sprintf (info, "%s <%s> (%s, 0x%s)", uid, key->uids->email,
# Line 92  passphrase_callback_proc (HWND dlg, UINT Line 106  passphrase_callback_proc (HWND dlg, UINT
106                                            
107                  }                  }
108                  else {                  else {
109                      info = new char [32 + strlen (r->keyid) + 2];                      info = new char [32 + strlen (r->keyid)+1 + 4];
110                      if (!info)                      if (!info)
111                          BUG (NULL);                          BUG (NULL);
112                      sprintf (info, _("Unknown (key ID 0x%s)"),                      sprintf (info, _("Unknown key ID (%s, 0x%s)"),
113                               r->keyid? r->keyid+8 : "????????");                               get_key_pubalgo (r->pubkey_algo), r->keyid+8);
114                  }                  }
115                  listbox_add_string (GetDlgItem (dlg, IDC_DECRYPT_LIST), info);                  listbox_add_string (GetDlgItem (dlg, IDC_DECRYPT_LIST), info);
116                  free (info);                  free_if_alloc (info);
117              }              }
118          }          }
119          else if (c->gpg_cmd == GPG_CMD_DECRYPT)          else if (c->gpg_cmd == GPG_CMD_DECRYPT)
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                          _("Please enter your passphrase") );                          c->bad_pwd? _("Bad passphrase; Enter passphrase again") :
124                            _("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));
127              if (res && !res->recipients)              if (res && !res->recipients) {
128                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, _("Symmetric encryption.\n"));                                                                      const char *s = _("Symmetric encryption.\n"
129                                      "%s encrypted data.");
130                    const char *alg = get_symkey_algo (c->sym.sym_algo);
131                    info = new char[strlen (s) + strlen (alg) + 2];
132                    if (!info)
133                        BUG (NULL);
134                    sprintf (info, s, alg);
135                    SetDlgItemText (dlg, IDC_DECRYPT_MSG, info);
136                    free_if_alloc (info);
137                }
138              else              else
139                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, c->info);                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, c->info);
140          }          }
# Line 124  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 139  passphrase_callback_proc (HWND dlg, UINT Line 163  passphrase_callback_proc (HWND dlg, UINT
163                      HWND hwnd;                      HWND hwnd;
164                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));
165                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));
166                      SendMessage( hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0 );                      SendMessage (hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0);
167                      SetFocus (hwnd);                      SetFocus (hwnd);
168                  }                  }
169              }              }
# Line 149  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 197  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 210  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 219  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 244  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 258  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 273  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 &&
320                !strstr (passphrase_info, "OPENPGP")) {/* assume symetric encryption. */
321                int n=2;
322                c->sym.sym_algo = atoi (passphrase_info);
323                if (c->sym.sym_algo > 9)
324                    n++;
325                /* XXX: be more strict. */
326                c->sym.s2k_mode = atoi (passphrase_info+n);
327                c->sym.s2k_hash = atoi (passphrase_info+n+2);
328            }
329    
330          keyid = parse_gpg_keyid (passphrase_info);          keyid = parse_gpg_keyid (passphrase_info);
331          pass = agent_get_cache (keyid+8, &item);          pass = agent_get_cache (keyid+8, &item);
332          if (pass) {          if (pass) {
# Line 296  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 322  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 346  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 369  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.24  
changed lines
  Added in v.26

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26