aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keygen.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g10/keygen.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/g10/keygen.c b/g10/keygen.c
index 675acf603..f0de2fbf3 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -2287,7 +2287,8 @@ get_parameter_algo( struct para_data_s *para, enum para_name key )
}
/*
- * parse the usage parameter and set the keyflags. Return true on error.
+ * Parse the usage parameter and set the keyflags. Returns -1 on
+ * error, 0 for no usage given or 1 for usage available.
*/
static int
parse_parameter_usage (const char *fname,
@@ -2435,54 +2436,75 @@ proc_parameter_file( struct para_data_s *para, const char *fname,
algo=get_parameter_algo(para,pKEYTYPE);
if (openpgp_pk_test_algo2 (algo, PUBKEY_USAGE_SIG))
{
- log_error("%s:%d: invalid algorithm\n", fname, r->lnr );
+ log_error ("%s:%d: invalid algorithm\n", fname, r->lnr );
return -1;
}
}
else
{
- log_error("%s: no Key-Type specified\n",fname);
+ log_error ("%s: no Key-Type specified\n",fname);
return -1;
}
- err=parse_parameter_usage (fname, para, pKEYUSAGE);
- if(err==0)
+ err = parse_parameter_usage (fname, para, pKEYUSAGE);
+ if (!err)
{
/* Default to algo capabilities if key-usage is not provided */
- r=xmalloc_clear(sizeof(*r));
- r->key=pKEYUSAGE;
- r->u.usage=openpgp_pk_algo_usage(algo);
- r->next=para;
- para=r;
+ r = xmalloc_clear(sizeof(*r));
+ r->key = pKEYUSAGE;
+ r->u.usage = openpgp_pk_algo_usage(algo);
+ r->next = para;
+ para = r;
}
- else if(err==-1)
+ else if (err == -1)
return -1;
+ else
+ {
+ r = get_parameter (para, pKEYUSAGE);
+ if (r && (r->u.usage & ~openpgp_pk_algo_usage (algo)))
+ {
+ log_error ("%s:%d: specified Key-Usage not allowed for algo %d\n",
+ fname, r->lnr, algo);
+ return -1;
+ }
+ }
r = get_parameter( para, pSUBKEYTYPE );
if(r)
{
- algo=get_parameter_algo( para, pSUBKEYTYPE);
+ algo = get_parameter_algo (para, pSUBKEYTYPE);
if (openpgp_pk_test_algo (algo))
{
- log_error("%s:%d: invalid algorithm\n", fname, r->lnr );
+ log_error ("%s:%d: invalid algorithm\n", fname, r->lnr );
return -1;
}
- err=parse_parameter_usage (fname, para, pSUBKEYUSAGE);
- if(err==0)
+ err = parse_parameter_usage (fname, para, pSUBKEYUSAGE);
+ if (!err)
{
/* Default to algo capabilities if subkey-usage is not
provided */
- r=xmalloc_clear(sizeof(*r));
- r->key=pSUBKEYUSAGE;
- r->u.usage=openpgp_pk_algo_usage(algo);
- r->next=para;
- para=r;
+ r = xmalloc_clear (sizeof(*r));
+ r->key = pSUBKEYUSAGE;
+ r->u.usage = openpgp_pk_algo_usage (algo);
+ r->next = para;
+ para = r;
}
- else if(err==-1)
+ else if (err == -1)
return -1;
+ else
+ {
+ r = get_parameter (para, pSUBKEYUSAGE);
+ if (r && (r->u.usage & ~openpgp_pk_algo_usage (algo)))
+ {
+ log_error ("%s:%d: specified Subkey-Usage not allowed"
+ " for algo %d\n", fname, r->lnr, algo);
+ return -1;
+ }
+ }
}
+
if( get_parameter_value( para, pUSERID ) )
have_user_id=1;
else