1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

gpg: Allow predefined names as answer to the keygen.algo prompt.

* g10/keygen.c (ask_algo): Add list of strings.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2015-01-28 09:11:02 +01:00
parent 7959654377
commit b1d5ed6ac8
2 changed files with 50 additions and 16 deletions

View File

@ -1236,3 +1236,33 @@ Status codes are:
This can be implemented using Hurd's translator mechanism. This can be implemented using Hurd's translator mechanism.
However, I think the whole key server stuff has to be re-thought; However, I think the whole key server stuff has to be re-thought;
I have some ideas and probably create a white paper. I have some ideas and probably create a white paper.
** Algorithm names for the "keygen.algo" prompt
When using a --command-fd controlled key generation or "addkey"
there is way to know the number to enter on the "keygen.algo"
prompt. The displayed numbers are for human reception and may
change with releases. To provide a stable way to enter a desired
algorithm choice the prompt also accepts predefined names for the
algorithms, which will not change.
| Name | No | Description |
|---------+----+---------------------------------|
| rsa+rsa | 1 | RSA and RSA (default) |
| dsa+elg | 2 | DSA and Elgamal |
| dsa | 3 | DSA (sign only) |
| rsa/s | 4 | RSA (sign only) |
| elg | 5 | Elgamal (encrypt only) |
| rsa/e | 6 | RSA (encrypt only) |
| dsa/* | 7 | DSA (set your own capabilities) |
| rsa/* | 8 | RSA (set your own capabilities) |
| ecc+ecc | 9 | ECC and ECC |
| ecc/s | 10 | ECC (sign only) |
| ecc/* | 11 | ECC (set your own capabilities) |
| ecc/e | 12 | ECC (encrypt only) |
| keygrip | 13 | Existing key |
If one of the "foo/*" names are used a "keygen.flags" prompt needs
to be answered as well. Instead of toggling the predefined flags,
it is also possible to set them direct: Use a "=" character
directly followed by a comination of "a" (for authentication), "s"
(for signing), or "c" (for certification).

View File

@ -1820,7 +1820,7 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
char **r_keygrip) char **r_keygrip)
{ {
char *keygrip = NULL; char *keygrip = NULL;
char *answer; char *answer = NULL;
int algo; int algo;
int dummy_algo; int dummy_algo;
@ -1875,84 +1875,86 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
{ {
*r_usage = 0; *r_usage = 0;
*r_subkey_algo = 0; *r_subkey_algo = 0;
xfree (answer);
answer = cpr_get ("keygen.algo", _("Your selection? ")); answer = cpr_get ("keygen.algo", _("Your selection? "));
cpr_kill_prompt (); cpr_kill_prompt ();
algo = *answer? atoi (answer) : 1; algo = *answer? atoi (answer) : 1;
xfree(answer); if ((algo == 1 || !strcmp (answer, "rsa+rsa")) && !addmode)
answer = NULL;
if (algo == 1 && !addmode)
{ {
algo = PUBKEY_ALGO_RSA; algo = PUBKEY_ALGO_RSA;
*r_subkey_algo = PUBKEY_ALGO_RSA; *r_subkey_algo = PUBKEY_ALGO_RSA;
break; break;
} }
else if (algo == 2 && !addmode) else if ((algo == 2 || !strcmp (answer, "dsa+elg")) && !addmode)
{ {
algo = PUBKEY_ALGO_DSA; algo = PUBKEY_ALGO_DSA;
*r_subkey_algo = PUBKEY_ALGO_ELGAMAL_E; *r_subkey_algo = PUBKEY_ALGO_ELGAMAL_E;
break; break;
} }
else if (algo == 3) else if (algo == 3 || !strcmp (answer, "dsa"))
{ {
algo = PUBKEY_ALGO_DSA; algo = PUBKEY_ALGO_DSA;
*r_usage = PUBKEY_USAGE_SIG; *r_usage = PUBKEY_USAGE_SIG;
break; break;
} }
else if (algo == 4) else if (algo == 4 || !strcmp (answer, "rsa/s"))
{ {
algo = PUBKEY_ALGO_RSA; algo = PUBKEY_ALGO_RSA;
*r_usage = PUBKEY_USAGE_SIG; *r_usage = PUBKEY_USAGE_SIG;
break; break;
} }
else if (algo == 5 && addmode) else if ((algo == 5 || !strcmp (answer, "elg")) && addmode)
{ {
algo = PUBKEY_ALGO_ELGAMAL_E; algo = PUBKEY_ALGO_ELGAMAL_E;
*r_usage = PUBKEY_USAGE_ENC; *r_usage = PUBKEY_USAGE_ENC;
break; break;
} }
else if (algo == 6 && addmode) else if ((algo == 6 || !strcmp (answer, "rsa/e")) && addmode)
{ {
algo = PUBKEY_ALGO_RSA; algo = PUBKEY_ALGO_RSA;
*r_usage = PUBKEY_USAGE_ENC; *r_usage = PUBKEY_USAGE_ENC;
break; break;
} }
else if (algo == 7 && opt.expert) else if ((algo == 7 || !strcmp (answer, "dsa/*")) && opt.expert)
{ {
algo = PUBKEY_ALGO_DSA; algo = PUBKEY_ALGO_DSA;
*r_usage = ask_key_flags (algo, addmode); *r_usage = ask_key_flags (algo, addmode);
break; break;
} }
else if (algo == 8 && opt.expert) else if ((algo == 8 || !strcmp (answer, "rsa/*")) && opt.expert)
{ {
algo = PUBKEY_ALGO_RSA; algo = PUBKEY_ALGO_RSA;
*r_usage = ask_key_flags (algo, addmode); *r_usage = ask_key_flags (algo, addmode);
break; break;
} }
else if (algo == 9 && opt.expert && !addmode) else if ((algo == 9 || !strcmp (answer, "ecc+ecc"))
&& opt.expert && !addmode)
{ {
algo = PUBKEY_ALGO_ECDSA; algo = PUBKEY_ALGO_ECDSA;
*r_subkey_algo = PUBKEY_ALGO_ECDH; *r_subkey_algo = PUBKEY_ALGO_ECDH;
break; break;
} }
else if (algo == 10 && opt.expert) else if ((algo == 10 || !strcmp (answer, "ecc/s")) && opt.expert)
{ {
algo = PUBKEY_ALGO_ECDSA; algo = PUBKEY_ALGO_ECDSA;
*r_usage = PUBKEY_USAGE_SIG; *r_usage = PUBKEY_USAGE_SIG;
break; break;
} }
else if (algo == 11 && opt.expert) else if ((algo == 11 || !strcmp (answer, "ecc/*")) && opt.expert)
{ {
algo = PUBKEY_ALGO_ECDSA; algo = PUBKEY_ALGO_ECDSA;
*r_usage = ask_key_flags (algo, addmode); *r_usage = ask_key_flags (algo, addmode);
break; break;
} }
else if (algo == 12 && opt.expert && addmode) else if ((algo == 12 || !strcmp (answer, "ecc/e"))
&& opt.expert && addmode)
{ {
algo = PUBKEY_ALGO_ECDH; algo = PUBKEY_ALGO_ECDH;
*r_usage = PUBKEY_USAGE_ENC; *r_usage = PUBKEY_USAGE_ENC;
break; break;
} }
else if (algo == 13 && opt.expert && r_keygrip) else if ((algo == 13 || !strcmp (answer, "keygrip"))
&& opt.expert && r_keygrip)
{ {
for (;;) for (;;)
{ {
@ -1984,8 +1986,10 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
} }
else else
tty_printf (_("Invalid selection.\n")); tty_printf (_("Invalid selection.\n"));
} }
xfree(answer);
if (r_keygrip) if (r_keygrip)
*r_keygrip = keygrip; *r_keygrip = keygrip;
return algo; return algo;