# # # patch "automate.cc" # from [5fecee3d3a25cb9b4d6acc26f32c3015ec3a427c] # to [d0f925b2ed7ae16b90486a5ea16498de64c0b302] # # patch "cmd_key_cert.cc" # from [2c05d042474f603c0d90ff90eb18b54e147969c6] # to [741935834b05197af476486e19902cf961ea9851] # # patch "key_store.cc" # from [bd326bd1ecd08a77260bbb3e3b16bc5c6d3a3e23] # to [b083bb11781ce170e067859a28944fb9375843a4] # # patch "key_store.hh" # from [e766f5e892e86fd13789dab619dff23f8d18c61a] # to [4fa88a4df035a736c9535659d9a980bb2aceec7a] # # patch "options_list.hh" # from [ebf225b29163498b112186d68498e7811360fd85] # to [2639f171462ad980bcc46bceff9715d3389cdc3a] # # patch "tests/changing_passphrase_of_a_private_key/__driver__.lua" # from [ac936884d27af8c57029e69528d8d748025a6ce6] # to [98e0998dbf0375bfab1fba3a4fbf8fb9ff47135a] # ============================================================ --- automate.cc 5fecee3d3a25cb9b4d6acc26f32c3015ec3a427c +++ automate.cc d0f925b2ed7ae16b90486a5ea16498de64c0b302 @@ -1781,7 +1781,7 @@ namespace // // Error conditions: If the passphrase is empty or the key already exists, // prints an error message to stderr and exits with status 1. -CMD_AUTOMATE(genkey, N_("KEYID PASSPHRASE"), +CMD_AUTOMATE(genkey, N_("KEY_NAME PASSPHRASE"), N_("Generates a key"), "", options::opts::force_duplicate_key) ============================================================ --- cmd_key_cert.cc 2c05d042474f603c0d90ff90eb18b54e147969c6 +++ cmd_key_cert.cc 741935834b05197af476486e19902cf961ea9851 @@ -29,7 +29,7 @@ using std::string; using std::set; using std::string; -CMD(genkey, "genkey", "", CMD_REF(key_and_cert), N_("KEYID"), +CMD(genkey, "genkey", "", CMD_REF(key_and_cert), N_("KEY_NAME"), N_("Generates an RSA key-pair"), "", options::opts::force_duplicate_key) @@ -57,7 +57,7 @@ CMD(genkey, "genkey", "", CMD_REF(key_an keys.create_key_pair(db, name); } -CMD(dropkey, "dropkey", "", CMD_REF(key_and_cert), N_("KEYID"), +CMD(dropkey, "dropkey", "", CMD_REF(key_and_cert), N_("KEY_NAME_OR_HASH"), N_("Drops a public and/or private key"), "", options::opts::none) @@ -104,20 +104,22 @@ CMD(dropkey, "dropkey", "", CMD_REF(key_ E(key_deleted, origin::user, fmt % idx(args, 0)()); } -CMD(passphrase, "passphrase", "", CMD_REF(key_and_cert), N_("KEYID"), +CMD(passphrase, "passphrase", "", CMD_REF(key_and_cert), N_("KEY_NAME_OR_HASH"), N_("Changes the passphrase of a private RSA key"), "", options::opts::none) { - key_store keys(app); - if (args.size() != 1) throw usage(execid); - key_name name; - internalize_key_name(idx(args, 0), name); + key_store keys(app); + database db(app); + project_t project(db); + key_identity_info identity; - keys.change_key_passphrase(name); + project.get_key_identity(keys, app.lua, idx(args, 0), identity); + + keys.change_key_passphrase(identity.id); P(F("passphrase changed")); } ============================================================ --- key_store.cc bd326bd1ecd08a77260bbb3e3b16bc5c6d3a3e23 +++ key_store.cc b083bb11781ce170e067859a28944fb9375843a4 @@ -715,27 +715,18 @@ void } void -key_store::change_key_passphrase(key_name const & name) +key_store::change_key_passphrase(key_id const & id) { - key_id id; + key_name name; keypair kp; { bool found = false; s->maybe_read_key_dir(); - for (key_map::const_iterator i = s->keys.begin(); - i != s->keys.end(); ++i) - { - if (i->second.first == name) - { - E(!found, origin::user, - F("you have multiple private keys name '%s'") % name); - found = true; - id = i->first; - kp = i->second.second; - } - } - E(found, origin::user, F("no key pair '%s' found in key store '%s'") - % name % s->key_dir); + key_map::const_iterator i = s->keys.find(id); + E(i != s->keys.end(), origin::user, + F("no key pair '%s' found in key store '%s'") % id % s->key_dir); + name = i->second.first; + kp = i->second.second; } shared_ptr priv = s->decrypt_private_key(id, true); ============================================================ --- key_store.hh e766f5e892e86fd13789dab619dff23f8d18c61a +++ key_store.hh 4fa88a4df035a736c9535659d9a980bb2aceec7a @@ -94,7 +94,7 @@ public: // This is always your own key, so you probably want to // always use the given name. - void change_key_passphrase(key_name const & id); + void change_key_passphrase(key_id const & id); void decrypt_rsa(key_id const & id, rsa_oaep_sha_data const & ciphertext, ============================================================ --- options_list.hh ebf225b29163498b112186d68498e7811360fd85 +++ options_list.hh 2639f171462ad980bcc46bceff9715d3389cdc3a @@ -422,7 +422,9 @@ OPTVAR(key, external_key_name, signing_k OPTVAR(key, external_key_name, signing_key, ) -OPTION(globals, key, true, "key,k", gettext_noop("set key for signatures")) +OPTION(globals, key, true, "key,k", + gettext_noop("sets the key for signatures, using eith the key " + "name or th key hash")) #ifdef option_bodies { signing_key = external_key_name(arg, origin::user); ============================================================ --- tests/changing_passphrase_of_a_private_key/__driver__.lua ac936884d27af8c57029e69528d8d748025a6ce6 +++ tests/changing_passphrase_of_a_private_key/__driver__.lua 98e0998dbf0375bfab1fba3a4fbf8fb9ff47135a @@ -13,10 +13,17 @@ check(mtn("passphrase", tkey), 1, false, check(mtn("passphrase", tkey), 1, false, false, string.rep("bad\n", 3)) -- fail to repeat new password -check(mtn("passphrase", tkey), 1, false, false, tkey.."\n"..tkey.."-new\nbad\n\nnew\nbad") +check(mtn("passphrase", tkey), 1, false, false, + tkey.."\n"..tkey.."-new\nbad\n\nnew\nbad") -- change the passphrase successfully -check(mtn("passphrase", tkey), 0, false, false, tkey.."\n"..string.rep(tkey.."-new\n", 2)) +check(mtn("passphrase", tkey), 0, false, false, + tkey.."\n"..string.rep(tkey.."-new\n", 2)) -- check that the passphrase changed -check(mtn("passphrase", tkey), 0, false, false, tkey.."-new\n"..string.rep(tkey.."\n",2)) +check(mtn("passphrase", tkey), 0, false, false, + tkey.."-new\n"..string.rep(tkey.."\n",2)) + +-- change the passphrase using the key hash +check(mtn("passphrase", tkey), 0, false, false, + tkey.."\n"..string.rep(tkey.."-other\n", 2))