36 |
#include "wptKeyManager.h" |
#include "wptKeyManager.h" |
37 |
#include "wptRegistry.h" |
#include "wptRegistry.h" |
38 |
|
|
|
|
|
39 |
enum keyedit_commands { |
enum keyedit_commands { |
40 |
CMD_ADDKEY = 0, |
CMD_ADDKEY = 0, |
41 |
CMD_ADDUID, |
CMD_ADDUID, |
150 |
{ |
{ |
151 |
char info[128], keyid[32]; |
char info[128], keyid[32]; |
152 |
const char * expdate, * s; |
const char * expdate, * s; |
153 |
|
int n; |
154 |
|
|
155 |
expdate = keygen->expire? get_key_expire_date (keygen->expire) : _("Never"); |
expdate = keygen->expire? get_key_expire_date (keygen->expire) : _("Never"); |
156 |
_snprintf( info, sizeof info-1, "%d-bit %s", |
_snprintf (info, sizeof info-1, "%d-bit %s", |
157 |
keygen->bits, gpgme_key_expand_attr( GPGME_ATTR_ALGO, keygen->algo ) ); |
keygen->bits, |
158 |
_snprintf( keyid, sizeof keyid-1, "0x%s", keygen->fpr+32 ); |
gpgme_key_expand_attr (GPGME_ATTR_ALGO, keygen->algo)); |
159 |
listview_add_item( lv, "" ); |
_snprintf (keyid, sizeof keyid-1, "0x%s", keygen->fpr+32); |
160 |
listview_add_sub_item( lv, 0, 0, info ); |
n = listview_count_items (lv, 0); |
161 |
listview_add_sub_item( lv, 0, 1, keyid ); |
listview_add_item_pos (lv, n); |
162 |
listview_add_sub_item( lv, 0, 2, get_key_created( time(NULL) ) ); |
listview_add_sub_item (lv, n, 0, info); |
163 |
listview_add_sub_item( lv, 0, 3, expdate ); |
listview_add_sub_item (lv, n, 1, keyid); |
164 |
if( flags & KM_FLAG_REVOKED ) s = _("Revoked"); |
listview_add_sub_item (lv, n, 2, get_key_created (time (NULL))); |
165 |
else if( flags & KM_FLAG_EXPIRED ) s = _("Expired"); |
listview_add_sub_item (lv, n, 3, expdate); |
166 |
|
if (flags & KM_FLAG_REVOKED) s = _("Revoked"); |
167 |
|
else if (flags & KM_FLAG_EXPIRED) s = _("Expired"); |
168 |
else s = _("OK"); |
else s = _("OK"); |
169 |
listview_add_sub_item( lv, 0, 4, s ); |
listview_add_sub_item (lv, n, 4, s); |
170 |
} /* do_add_new_subkey */ |
} /* do_add_new_subkey */ |
171 |
|
|
172 |
|
|
462 |
|
|
463 |
|
|
464 |
BOOL CALLBACK |
BOOL CALLBACK |
465 |
keyedit_addsubkey_dlg_proc( HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam ) |
keyedit_addsubkey_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam) |
466 |
{ |
{ |
467 |
static KEYEDIT_CB * ctx; |
static KEYEDIT_CB * ctx; |
468 |
static KEYGEN_CB * keygen; |
static KEYGEN_CB * keygen; |
489 |
listbox_add_string( lb, "RSA (sign only)"); |
listbox_add_string( lb, "RSA (sign only)"); |
490 |
listbox_add_string( lb, "RSA (encrypt only)" ); |
listbox_add_string( lb, "RSA (encrypt only)" ); |
491 |
SetDlgItemInt( dlg, IDC_ADDSUBKEY_VALID, 0, FALSE ); |
SetDlgItemInt( dlg, IDC_ADDSUBKEY_VALID, 0, FALSE ); |
492 |
SetDlgItemInt( dlg, IDC_ADDSUBKEY_SIZE, 2048, FALSE ); |
SetDlgItemInt( dlg, IDC_ADDSUBKEY_SIZE, DFAULT_KEYSIZE, FALSE ); |
493 |
SetForegroundWindow( dlg ); |
SetForegroundWindow( dlg ); |
494 |
return FALSE; |
return FALSE; |
495 |
|
|
522 |
msg_box( dlg, _("Please enter the keysize."), _("Add Subkey"), MB_ERR ); |
msg_box( dlg, _("Please enter the keysize."), _("Add Subkey"), MB_ERR ); |
523 |
return FALSE; |
return FALSE; |
524 |
} |
} |
525 |
else if( index == 2 && size != 1024 ) { |
else if (index == 2 && size != 1024) { |
526 |
msg_box( dlg,_("DSS uses a fixed keysize of 1024. Size changed."), _("Add Subkey"), MB_INFO ); |
msg_box( dlg,_("DSS uses a fixed keysize of 1024. Size changed."), _("Add Subkey"), MB_INFO ); |
527 |
size = 1024; |
size = 1024; |
528 |
} |
} |
529 |
else if( size > 4096 ) { |
else if (size > 4096) { |
530 |
msg_box( dlg, _("Chosen size should be between 1024 and 4096. Size changed."), _("Add Subkey"), MB_ERR ); |
int id; |
531 |
size = 4096; |
msg_box (dlg, _("Chosen size must be between 1024 and 4096."), _("Add Subkey"), MB_ERR); |
532 |
|
id = msg_box (dlg, _("Do you really need such a large key?"), _("Add Subkey"), MB_QUEST_ASK); |
533 |
|
if (id == IDNO) |
534 |
|
size = DFAULT_KEYSIZE; |
535 |
|
else |
536 |
|
size = 4096; |
537 |
|
SetDlgItemInt (dlg, IDC_ADDSUBKEY_SIZE, size, TRUE); |
538 |
} |
} |
539 |
else if( size < 1024 ) { |
else if (size < 1024) { |
540 |
msg_box( dlg, _("Keys with a size of less then 1024 are considered insecure.\n" |
msg_box( dlg, _("Keys with a size of less then 1024 are considered insecure.\n" |
541 |
"Size changed to 1024!"), _("Add Subkey"), MB_INFO ); |
"Size changed to 1024!"), _("Add Subkey"), MB_INFO ); |
542 |
size = 1024; |
size = 1024; |
543 |
} |
} |
544 |
valid = GetDlgItemInt( dlg, IDC_ADDSUBKEY_VALID, NULL, TRUE ); |
valid = GetDlgItemInt (dlg, IDC_ADDSUBKEY_VALID, NULL, TRUE); |
545 |
if( valid < 0 ) { |
if (valid < 0) { |
546 |
msg_box( dlg, _("Please enter the days the key is valid."), _("Add Subkey"), MB_ERR ); |
msg_box( dlg, _("Please enter the days the key is valid."), _("Add Subkey"), MB_ERR ); |
547 |
return FALSE; |
return FALSE; |
548 |
} |
} |
632 |
} /* keyedit_add_userid */ |
} /* keyedit_add_userid */ |
633 |
|
|
634 |
|
|
635 |
|
char* |
636 |
|
get_subkey_fingerprint (gpgme_ctx_t ctx, const char *keyid) |
637 |
|
{ |
638 |
|
static char fpr[40]; |
639 |
|
const char *s; |
640 |
|
gpgme_error_t err; |
641 |
|
gpgme_key_t key, main; |
642 |
|
int n; |
643 |
|
|
644 |
|
/* XXX: this is very slow and complicated */ |
645 |
|
err = gpgme_op_keylist_start (ctx, keyid, 0); |
646 |
|
if (err) |
647 |
|
return NULL; |
648 |
|
err = gpgme_op_keylist_next (ctx, &key); |
649 |
|
if (err) |
650 |
|
return NULL; |
651 |
|
|
652 |
|
n = gpgme_key_count_items (key, GPGME_ATTR_KEYID); |
653 |
|
s = gpgme_key_get_string_attr (key, GPGME_ATTR_FPR, NULL, n-1); |
654 |
|
strcpy (fpr, s); |
655 |
|
|
656 |
|
get_pubkey (keyid, &main); |
657 |
|
gpgme_key_append (main, key, n-1); |
658 |
|
|
659 |
|
gpgme_key_release (key); |
660 |
|
return fpr; |
661 |
|
} |
662 |
|
|
663 |
|
|
664 |
BOOL |
BOOL |
665 |
keyedit_add_subkey (winpt_key_t k, HWND dlg, listview_ctrl_t lv) |
keyedit_add_subkey (winpt_key_t k, HWND dlg, listview_ctrl_t lv) |
666 |
{ |
{ |
685 |
if( ec ) |
if( ec ) |
686 |
BUG( dlg ); |
BUG( dlg ); |
687 |
|
|
688 |
memset( &keygen, 0, sizeof keygen ); |
memset (&keygen, 0, sizeof (keygen)); |
689 |
memset( &cb, 0, sizeof cb ); |
memset (&cb, 0, sizeof (cb)); |
690 |
cb.ek = ek; |
cb.ek = ek; |
691 |
cb.pass = k->is_protected? pass : NULL; |
cb.pass = k->is_protected? pass : NULL; |
692 |
cb.opaque = &keygen; |
cb.opaque = &keygen; |
693 |
dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDSUBKEY, |
dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDSUBKEY, |
694 |
dlg, keyedit_addsubkey_dlg_proc, |
dlg, keyedit_addsubkey_dlg_proc, |
699 |
return FALSE; |
return FALSE; |
700 |
} |
} |
701 |
|
|
702 |
ec = gpgme_new( &ctx ); |
ec = gpgme_new (&ctx); |
703 |
if( ec ) |
if (ec) |
704 |
BUG( dlg ); |
BUG (dlg); |
705 |
gpgme_enable_logging( ctx ); |
gpgme_enable_logging (ctx); |
706 |
gpgme_set_edit_ctx( ctx, ek, GPGME_EDITKEY_ADDKEY ); |
gpgme_set_edit_ctx (ctx, ek, GPGME_EDITKEY_ADDKEY); |
707 |
gpgme_set_progress_cb( ctx, keygen_cb, NULL ); |
gpgme_set_progress_cb (ctx, keygen_cb, NULL); |
708 |
keygen_cb_dlg_create (); |
keygen_cb_dlg_create (); |
709 |
|
|
710 |
ec = gpgme_op_editkey( ctx, k->keyid ); |
ec = gpgme_op_editkey (ctx, k->keyid); |
711 |
keygen.fpr = (char *)gpgme_control (ctx, GPGME_CTRL_FPR, -1); |
keygen.fpr = get_subkey_fingerprint (ctx, k->keyid); |
712 |
keygen_cb_dlg_destroy (); |
keygen_cb_dlg_destroy (); |
713 |
keygen_cb (NULL, NULL, 0, 0, 0); /* flush */ |
keygen_cb (NULL, NULL, 0, 0, 0); /* flush */ |
714 |
if( ec ) |
if (ec) |
715 |
gpgme_show_error( dlg, ec, ctx, _("Add Subkey"), MB_ERR ); |
gpgme_show_error (dlg, ec, ctx, _("Add Subkey"), MB_ERR); |
716 |
else { |
else { |
717 |
msg_box( dlg, _("Subkey successfully added."), _("GnuPG Status"), MB_OK ); |
msg_box (dlg, _("Subkey successfully added."), _("GnuPG Status"), MB_OK); |
718 |
if( lv ) |
if (lv) |
719 |
do_add_new_subkey( lv, &keygen, k->flags ); |
do_add_new_subkey (lv, &keygen, k->flags); |
720 |
keycache_set_reload( 1 ); |
keycache_set_reload (1); |
721 |
} |
} |
722 |
free_if_alloc( pass ); |
free_if_alloc (pass); |
723 |
gpgme_editkey_release( ek ); |
gpgme_editkey_release (ek); |
724 |
gpgme_release( ctx ); |
gpgme_release (ctx); |
725 |
|
|
726 |
return ec? FALSE : TRUE; |
return ec? FALSE : TRUE; |
727 |
} /* keyedit_add_subkey */ |
} /* keyedit_add_subkey */ |