aboutsummaryrefslogtreecommitdiffstats
path: root/sm/gpgsm.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sm/gpgsm.c91
1 files changed, 80 insertions, 11 deletions
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index 69f1532fd..c51eabd6d 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -491,25 +491,65 @@ static FILE *open_fwrite (const char *filename);
static estream_t open_es_fwrite (const char *filename);
static void run_protect_tool (int argc, char **argv);
+/* Remove this if libgcrypt 1.3.0 is required. */
+#define MY_GCRY_PK_ECDSA 301
+
static int
our_pk_test_algo (int algo)
{
- return 1;
+ switch (algo)
+ {
+ case GCRY_PK_RSA:
+ case MY_GCRY_PK_ECDSA:
+ return gcry_pk_test_algo (algo);
+ default:
+ return 1;
+ }
}
static int
our_cipher_test_algo (int algo)
{
- return 1;
+ switch (algo)
+ {
+ case GCRY_CIPHER_3DES:
+ case GCRY_CIPHER_AES128:
+ case GCRY_CIPHER_AES192:
+ case GCRY_CIPHER_AES256:
+ case GCRY_CIPHER_SERPENT128:
+ case GCRY_CIPHER_SERPENT192:
+ case GCRY_CIPHER_SERPENT256:
+ case 309 /*GCRY_CIPHER_SEED*/:
+ case 310 /*GCRY_CIPHER_CAMELLIA128*/:
+ case 311 /*GCRY_CIPHER_CAMELLIA192*/:
+ case 312 /*GCRY_CIPHER_CAMELLIA256*/:
+ return gcry_cipher_test_algo (algo);
+ default:
+ return 1;
+ }
}
+
static int
our_md_test_algo (int algo)
{
- return 1;
+ switch (algo)
+ {
+ case GCRY_MD_MD5:
+ case GCRY_MD_SHA1:
+ case GCRY_MD_RMD160:
+ case GCRY_MD_SHA256:
+ case GCRY_MD_SHA384:
+ case GCRY_MD_SHA512:
+ case 305 /*GCRY_MD_WHIRLPOOL*/:
+ return gcry_md_test_algo (algo);
+ default:
+ return 1;
+ }
}
+
static const char *
my_strusage( int level )
{
@@ -571,12 +611,12 @@ build_list (const char *text, const char * (*mapf)(int), int (*chkf)(int))
gcry_control (GCRYCTL_DROP_PRIVS); /* drop setuid */
}
- for (i=1; i < 110; i++ )
+ for (i=1; i < 400; i++ )
if (!chkf(i))
n += strlen(mapf(i)) + 2;
list = xmalloc (21 + n);
*list = 0;
- for (p=NULL, i=1; i < 110; i++)
+ for (p=NULL, i=1; i < 400; i++)
{
if (!chkf(i))
{
@@ -683,13 +723,15 @@ set_cmd (enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd)
/* Helper to add recipients to a list. */
static void
do_add_recipient (ctrl_t ctrl, const char *name,
- certlist_t *recplist, int is_encrypt_to)
+ certlist_t *recplist, int is_encrypt_to, int recp_required)
{
int rc = gpgsm_add_to_certlist (ctrl, name, 0, recplist, is_encrypt_to);
if (rc)
{
- log_error (_("can't encrypt to `%s': %s\n"), name, gpg_strerror (rc));
- gpgsm_status2 (ctrl, STATUS_INV_RECP,
+ if (recp_required)
+ {
+ log_error ("can't encrypt to `%s': %s\n", name, gpg_strerror (rc));
+ gpgsm_status2 (ctrl, STATUS_INV_RECP,
gpg_err_code (rc) == -1? "1":
gpg_err_code (rc) == GPG_ERR_NO_PUBKEY? "1":
gpg_err_code (rc) == GPG_ERR_AMBIGUOUS_NAME? "2":
@@ -701,6 +743,10 @@ do_add_recipient (ctrl_t ctrl, const char *name,
gpg_err_code (rc) == GPG_ERR_NO_POLICY_MATCH? "8":
"0",
name, NULL);
+ }
+ else
+ log_info (_("NOTE: won't be able to encrypt to `%s': %s\n"),
+ name, gpg_strerror (rc));
}
}
@@ -747,6 +793,7 @@ main ( int argc, char **argv)
certlist_t recplist = NULL;
certlist_t signerlist = NULL;
int do_not_setup_keys = 0;
+ int recp_required = 0;
/*mtrace();*/
@@ -943,9 +990,13 @@ main ( int argc, char **argv)
set_cmd (&cmd, pargs.r_opt);
break;
+ case aEncr:
+ recp_required = 1;
+ set_cmd (&cmd, pargs.r_opt);
+ break;
+
case aSym:
case aDecrypt:
- case aEncr:
case aSign:
case aClearsign:
case aVerify:
@@ -1295,6 +1346,22 @@ main ( int argc, char **argv)
opt.def_cipher_algoid = "2.16.840.1.101.3.4.1.2";
else if (!strcmp (opt.def_cipher_algoid, "AES256") )
opt.def_cipher_algoid = "2.16.840.1.101.3.4.1.42";
+ else if (!strcmp (opt.def_cipher_algoid, "SERPENT")
+ || !strcmp (opt.def_cipher_algoid, "SERPENT128") )
+ opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.2";
+ else if (!strcmp (opt.def_cipher_algoid, "SERPENT192") )
+ opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.22";
+ else if (!strcmp (opt.def_cipher_algoid, "SERPENT192") )
+ opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.42";
+ else if (!strcmp (opt.def_cipher_algoid, "SEED") )
+ opt.def_cipher_algoid = "1.2.410.200004.1.4";
+ else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA")
+ || !strcmp (opt.def_cipher_algoid, "CAMELLIA128") )
+ opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.2";
+ else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA192") )
+ opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.3";
+ else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA256") )
+ opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.4";
if (cmd != aGPGConfList)
{
@@ -1384,12 +1451,12 @@ main ( int argc, char **argv)
complain about no (regular) recipients. */
for (sl = remusr; sl; sl = sl->next)
if (!(sl->flags & 1))
- do_add_recipient (&ctrl, sl->d, &recplist, 0);
+ do_add_recipient (&ctrl, sl->d, &recplist, 0, recp_required);
if (!opt.no_encrypt_to)
{
for (sl = remusr; sl; sl = sl->next)
if ((sl->flags & 1))
- do_add_recipient (&ctrl, sl->d, &recplist, 1);
+ do_add_recipient (&ctrl, sl->d, &recplist, 1, recp_required);
}
}
@@ -1428,8 +1495,10 @@ main ( int argc, char **argv)
GC_OPT_FLAG_NONE );
printf ("auto-issuer-key-retrieve:%lu:\n",
GC_OPT_FLAG_NONE );
+#ifndef HAVE_W32_SYSTEM
printf ("prefer-system-dirmngr:%lu:\n",
GC_OPT_FLAG_NONE );
+#endif
printf ("cipher-algo:%lu:\"3DES:\n",
GC_OPT_FLAG_DEFAULT );
printf ("p12-charset:%lu:\n",