/[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 27 by twoaday, Tue Oct 18 07:57:13 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        /* XXX: we need a timer to update the 'enc_to' entries. */
74      switch (msg) {      switch (msg) {
75      case WM_INITDIALOG:      case WM_INITDIALOG:
76          c = (passphrase_cb_s *)lparam;          c = (passphrase_cb_s *)lparam;
# Line 69  passphrase_callback_proc (HWND dlg, UINT Line 82  passphrase_callback_proc (HWND dlg, UINT
82                  _("Encrypted with the following public key(s)") );                  _("Encrypted with the following public key(s)") );
83              CheckDlgButton( dlg, IDC_DECRYPT_HIDE, BST_CHECKED );              CheckDlgButton( dlg, IDC_DECRYPT_HIDE, BST_CHECKED );
84          }          }
85          else if( c->gpg_cmd == GPG_CMD_SIGN )          else if (c->gpg_cmd == GPG_CMD_SIGN)
86              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);
87          res = gpgme_op_decrypt_result (c->gpg);          res = gpgme_op_decrypt_result (c->gpg);
88          if (res != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {          if (res != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {
89              gpgme_recipient_t r;              gpgme_recipient_t r;
90    
91                /* XXX: not all ENCRYPT_TO entries are listed here. */
92              for (r = res->recipients; r; r = r->next) {              for (r = res->recipients; r; r = r->next) {
93                  get_pubkey (r->keyid, &key);                  get_pubkey (r->keyid, &key);
94                  if (key) {                  if (key) {
# Line 83  passphrase_callback_proc (HWND dlg, UINT Line 97  passphrase_callback_proc (HWND dlg, UINT
97                      if (!id)                      if (!id)
98                          id = _("Invalid User ID");                          id = _("Invalid User ID");
99                      uid = utf8_to_wincp (id, strlen (id));                      uid = utf8_to_wincp (id, strlen (id));
100                      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
101                                         + strlen (key->uids->email)+1];
102                      if (!info)                      if (!info)
103                          BUG (NULL);                          BUG (NULL);
104                      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 107  passphrase_callback_proc (HWND dlg, UINT
107                                            
108                  }                  }
109                  else {                  else {
110                      info = new char [32 + strlen (r->keyid) + 2];                      info = new char [32 + strlen (r->keyid)+1 + 4];
111                      if (!info)                      if (!info)
112                          BUG (NULL);                          BUG (NULL);
113                      sprintf (info, _("Unknown (key ID 0x%s)"),                      sprintf (info, _("Unknown key ID (%s, 0x%s)"),
114                               r->keyid? r->keyid+8 : "????????");                               get_key_pubalgo (r->pubkey_algo), r->keyid+8);
115                  }                  }
116                  listbox_add_string (GetDlgItem (dlg, IDC_DECRYPT_LIST), info);                  listbox_add_string (GetDlgItem (dlg, IDC_DECRYPT_LIST), info);
117                  free (info);                  free_if_alloc (info);
118              }              }
119          }          }
120          else if (c->gpg_cmd == GPG_CMD_DECRYPT)          else if (c->gpg_cmd == GPG_CMD_DECRYPT)
121              EnableWindow (GetDlgItem (dlg, IDC_DECRYPT_LIST), FALSE);              EnableWindow (GetDlgItem (dlg, IDC_DECRYPT_LIST), FALSE);
122          SetDlgItemText( dlg, c->gpg_cmd == GPG_CMD_DECRYPT?          SetDlgItemText (dlg, c->gpg_cmd == GPG_CMD_DECRYPT?
123                          IDC_DECRYPT_PWDINFO : IDC_DECRYPT_SIGN_PWDINFO,                          IDC_DECRYPT_PWDINFO : IDC_DECRYPT_SIGN_PWDINFO,
124                          _("Please enter your passphrase") );                          c->bad_pwd? _("Bad passphrase; Enter passphrase again") :
125                            _("Please enter your passphrase"));
126          if (c->gpg_cmd == GPG_CMD_DECRYPT) {          if (c->gpg_cmd == GPG_CMD_DECRYPT) {
127              SetFocus (GetDlgItem (dlg, IDC_DECRYPT_PWD));              SetFocus (GetDlgItem (dlg, IDC_DECRYPT_PWD));
128              if (res && !res->recipients)              if (res && !res->recipients) {
129                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, _("Symmetric encryption.\n"));                                                                      const char *s = _("Symmetric encryption.\n"
130                                      "%s encrypted data.");
131                    const char *alg = get_symkey_algo (c->sym.sym_algo);
132                    info = new char[strlen (s) + strlen (alg) + 2];
133                    if (!info)
134                        BUG (NULL);
135                    sprintf (info, s, alg);
136                    SetDlgItemText (dlg, IDC_DECRYPT_MSG, info);
137                    free_if_alloc (info);
138                }
139              else              else
140                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, c->info);                  SetDlgItemText (dlg, IDC_DECRYPT_MSG, c->info);
141          }          }
# Line 124  passphrase_callback_proc (HWND dlg, UINT Line 149  passphrase_callback_proc (HWND dlg, UINT
149          return FALSE;          return FALSE;
150    
151          case WM_SYSCOMMAND:          case WM_SYSCOMMAND:
152              if( LOWORD( wparam ) == SC_CLOSE ) {              if (LOWORD (wparam) == SC_CLOSE) {
153                  SetDlgItemText( dlg, item_ctrl_id( c->gpg_cmd ), "" );                  SetDlgItemText (dlg, item_ctrl_id( c->gpg_cmd ), "");
154                  c->cancel = 1;                  c->cancel = 1;
155                  EndDialog( dlg, TRUE );                  EndDialog (dlg, TRUE);
156              }              }
157              break;              break;
158    
# Line 139  passphrase_callback_proc (HWND dlg, UINT Line 164  passphrase_callback_proc (HWND dlg, UINT
164                      HWND hwnd;                      HWND hwnd;
165                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));
166                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));
167                      SendMessage( hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0 );                      SendMessage (hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0);
168                      SetFocus (hwnd);                      SetFocus (hwnd);
169                  }                  }
170              }              }
# Line 149  passphrase_callback_proc (HWND dlg, UINT Line 174  passphrase_callback_proc (HWND dlg, UINT
174                  /* fixme: the item is even cached when the passphrase is not                  /* fixme: the item is even cached when the passphrase is not
175                            correct, which means that the user needs to delete all                            correct, which means that the user needs to delete all
176                            cached entries to continue. */                            cached entries to continue. */
177                  if (c->pwd) {                  if (c->pwd)
178                      delete []c->pwd;                      burn_passphrase (&c->pwd);
                     c->pwd = NULL;  
                 }  
179                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));
180                  if (!n) {                  if (!n) {
181                      c->pwd = new char[2];                      c->pwd = new char[2];
182                        if (!c->pwd)
183                            BUG (NULL);
184                      strcpy (c->pwd, "");                      strcpy (c->pwd, "");
185                  }                  }
186                  else {                  else {
# Line 197  parse_gpg_keyid (const char *pass_info) Line 222  parse_gpg_keyid (const char *pass_info)
222  {  {
223      static char keyid[16+1];      static char keyid[16+1];
224            
225        /* XXX: check for leading alpha-chars? */
226      if (strlen (pass_info) < 16)      if (strlen (pass_info) < 16)
227          return NULL;          return NULL;
228      /* 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 236  parse_gpg_keyid (const char *pass_info)
236    
237  /* Parse the information in @uid_hint and @pass_info to generate  /* Parse the information in @uid_hint and @pass_info to generate
238     a input message for the user in @desc. */     a input message for the user in @desc. */
239  static void  static int
240  parse_gpg_description (const char *uid_hint, const char *pass_info,  parse_gpg_description (const char *uid_hint, const char *pass_info,
241                         char *desc, int size)                         char *desc, int size)
242  {  {
# Line 219  parse_gpg_description (const char *uid_h Line 245  parse_gpg_description (const char *uid_h
245      char *uid, *p;      char *uid, *p;
246      int n=0;      int n=0;
247    
248        if (strlen (uid_hint) < 17) {
249            *desc = 0;
250            return -1;
251        }
252    
253      while (p = strsep ((char**)&pass_info, " ")) {      while (p = strsep ((char**)&pass_info, " ")) {
254          switch (n++) {          switch (n++) {
255          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 275  parse_gpg_description (const char *uid_h
275                       "%s key, ID %s\n"),                       "%s key, ID %s\n"),
276                       uid, get_key_pubalgo (algo), usedkey+8);                       uid, get_key_pubalgo (algo), usedkey+8);
277      free (uid);      free (uid);
278        return 0;
279  }  }
280    
281    
282    /*
283  static int inline  static int inline
284  is_hexstring (const char * p)  is_hexstring (const char * p)
285  {  {
# Line 258  is_hexstring (const char * p) Line 291  is_hexstring (const char * p)
291      }      }
292      return 0;      return 0;
293  }  }
294    */
295    
296  /* Passphrase callback with the ability to support caching. */  /* Passphrase callback with the ability to support caching. */
297  gpgme_error_t  gpgme_error_t
# Line 273  passphrase_cb (void *hook, const char *u Line 306  passphrase_cb (void *hook, const char *u
306      DWORD n;      DWORD n;
307      int rc;      int rc;
308    
     /* XXX: pubkey_enc cancel does not quit gpg.exe */  
     /* XXX: handle prev_was_bad case. */  
309      if (!c)      if (!c)
310          return gpg_error (GPG_ERR_INV_ARG);          return gpg_error (GPG_ERR_INV_ARG);
311        c->bad_pwd = prev_was_bad? 1 : 0;
312        if (prev_was_bad && !c->cancel) {
313            if (c->pwd)
314                burn_passphrase (&c->pwd);
315            agent_del_cache (c->keyid);
316            c->pwd_init = 1;
317        }
318    
319      if (passphrase_info) {      if (passphrase_info) {
320            if (strlen (passphrase_info) < 16 &&
321                !strstr (passphrase_info, "OPENPGP")) {/* assume symetric encryption. */
322                int n=2;
323                c->sym.sym_algo = atoi (passphrase_info);
324                if (c->sym.sym_algo > 9)
325                    n++;
326                /* XXX: be more strict. */
327                c->sym.s2k_mode = atoi (passphrase_info+n);
328                c->sym.s2k_hash = atoi (passphrase_info+n+2);
329            }
330    
331          keyid = parse_gpg_keyid (passphrase_info);          keyid = parse_gpg_keyid (passphrase_info);
332          pass = agent_get_cache (keyid+8, &item);          pass = agent_get_cache (keyid+8, &item);
333          if (pass) {          if (pass) {
# Line 296  passphrase_cb (void *hook, const char *u Line 345  passphrase_cb (void *hook, const char *u
345          if (keyid && strlen (keyid) == 16)          if (keyid && strlen (keyid) == 16)
346              strcpy (c->keyid, keyid+8);              strcpy (c->keyid, keyid+8);
347    
348          /* 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
349             smart card has been used. */              has been used. */
350          if (uid_hint && strlen (uid_hint) == 32 && !is_hexstring (uid_hint)) {          if (strstr (passphrase_info, "OPENPGP")) {
351              char buf[16];              char buf[16];
352              memset (buf, 0, sizeof buf);              memset (buf, 0, sizeof buf);
353              strncpy (buf, uid_hint+20, 8);              strncpy (buf, "??", 2); /* XXX: fixme we need the serial no. */
354              _snprintf (c->info, sizeof c->info-1,              _snprintf (c->info, sizeof c->info-1,
355                         _("Please enter the PIN to unlock your secret card key\n"                         _("Please enter the PIN to unlock your secret card key\n"
356                           "Card: %s"), buf);                           "Card: %s"), buf);
# Line 322  passphrase_cb (void *hook, const char *u Line 371  passphrase_cb (void *hook, const char *u
371          }          }
372          if (rc == -1) {          if (rc == -1) {
373              WriteFile (hd, "\n", 1, &n, NULL);              WriteFile (hd, "\n", 1, &n, NULL);
374              return gpg_error (GPG_ERR_EOF);              return 0;
375          }          }
376          c->pwd_init = 0;          c->pwd_init = 0;
377      }      }
378      if (c->cancel) {      if (c->cancel) {
379          WriteFile (hd, "\n", 1, &n, NULL);          WriteFile (hd, "\n", 1, &n, NULL);
380          return gpg_error (GPG_ERR_EOF);          return 0;
381      }      }
382    
383      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 395  set_gpg_passphrase_cb (passphrase_cb_s *
395  {  {
396      memset (cb, 0, sizeof *cb);      memset (cb, 0, sizeof *cb);
397      cb->gpg_cmd = cmd;      cb->gpg_cmd = cmd;
398        cb->bad_pwd = 0;
399      cb->is_card = 0;      cb->is_card = 0;
400      cb->cancel = 0;      cb->cancel = 0;
401      cb->hwnd = hwnd;      cb->hwnd = hwnd;
# Line 369  release_gpg_passphrase_cb (passphrase_cb Line 419  release_gpg_passphrase_cb (passphrase_cb
419      free_if_alloc (ctx->title);      free_if_alloc (ctx->title);
420  }  }
421    
422    
423  /* Simple check to measure passphrase (@pass) quality.  /* Simple check to measure passphrase (@pass) quality.
424     Return value: 0 on success. */     Return value: 0 on success. */
425  int  int

Legend:
Removed from v.24  
changed lines
  Added in v.27

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26