summaryrefslogtreecommitdiff
path: root/cipher
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2021-12-06 11:49:15 +0100
committerNIIBE Yutaka <gniibe@fsij.org>2021-12-07 11:31:01 +0900
commite96980022e5ec079c9d4e3492eb6a1131c68e0f2 (patch)
tree04a9702e2c17060471ae448d4821de2a0b264e1a /cipher
parentbea8b9672c3c47c9bffb7edc52fb32cf9091c231 (diff)
downloadlibgcrypt-e96980022e5ec079c9d4e3492eb6a1131c68e0f2.tar.gz
Properly enforce disablement in other pubkey API
* cipher/pubkey.c (_gcry_pk_encrypt): Fail if algo is disabled (_gcry_pk_decrypt): Ditto. (_gcry_pk_sign): Ditto. (_gcry_pk_sign_md): Ditto. (_gcry_pk_verify): Ditto. (_gcry_pk_verify_md): Ditto. (_gcry_pk_testkey): Ditto. (_gcry_pk_get_nbits): Ditto. (_gcry_pk_get_curve): Ditto. * tests/basic.c (check_pubkey): Test also other API in FIPS mode to verify they fail as expected. -- GnuPG-bug-id: 5512 Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Diffstat (limited to 'cipher')
-rw-r--r--cipher/pubkey.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/cipher/pubkey.c b/cipher/pubkey.c
index dc4273aa..f19d5f66 100644
--- a/cipher/pubkey.c
+++ b/cipher/pubkey.c
@@ -322,7 +322,9 @@ _gcry_pk_encrypt (gcry_sexp_t *r_ciph, gcry_sexp_t s_data, gcry_sexp_t s_pkey)
if (rc)
goto leave;
- if (spec->encrypt)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->encrypt)
rc = spec->encrypt (r_ciph, s_data, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -374,7 +376,9 @@ _gcry_pk_decrypt (gcry_sexp_t *r_plain, gcry_sexp_t s_data, gcry_sexp_t s_skey)
if (rc)
goto leave;
- if (spec->decrypt)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->decrypt)
rc = spec->decrypt (r_plain, s_data, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -427,7 +431,9 @@ _gcry_pk_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_hash, gcry_sexp_t s_skey)
if (rc)
goto leave;
- if (spec->sign)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->sign)
rc = spec->sign (r_sig, s_hash, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -560,7 +566,9 @@ _gcry_pk_sign_md (gcry_sexp_t *r_sig, const char *tmpl, gcry_md_hd_t hd_orig,
if (rc)
goto leave;
- if (spec->sign)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->sign)
rc = spec->sign (r_sig, s_hash, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -590,7 +598,9 @@ _gcry_pk_verify (gcry_sexp_t s_sig, gcry_sexp_t s_hash, gcry_sexp_t s_pkey)
if (rc)
goto leave;
- if (spec->verify)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->verify)
rc = spec->verify (s_sig, s_hash, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -662,7 +672,9 @@ _gcry_pk_verify_md (gcry_sexp_t s_sig, const char *tmpl, gcry_md_hd_t hd_orig,
if (rc)
goto leave;
- if (spec->verify)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->verify)
rc = spec->verify (s_sig, s_hash, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -694,7 +706,9 @@ _gcry_pk_testkey (gcry_sexp_t s_key)
if (rc)
goto leave;
- if (spec->check_secret_key)
+ if (spec->flags.disabled)
+ rc = GPG_ERR_CIPHER_ALGO;
+ else if (spec->check_secret_key)
rc = spec->check_secret_key (keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
@@ -816,6 +830,8 @@ _gcry_pk_get_nbits (gcry_sexp_t key)
if (spec_from_sexp (key, 0, &spec, &parms))
return 0; /* Error - 0 is a suitable indication for that. */
+ if (spec->flags.disabled)
+ return 0;
nbits = spec->get_nbits (parms);
sexp_release (parms);
@@ -949,6 +965,8 @@ _gcry_pk_get_curve (gcry_sexp_t key, int iterator, unsigned int *r_nbits)
return NULL;
}
+ if (spec->flags.disabled)
+ return NULL;
if (spec->get_curve)
result = spec->get_curve (keyparms, iterator, r_nbits);