summaryrefslogtreecommitdiff
path: root/cipher/pubkey.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2021-10-20 12:09:39 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2021-10-20 12:09:39 +0900
commita23cf78102f3200dc441a3123c3fbeaa28f38b50 (patch)
tree4098dd33fd86aa0f4ef4d95a67285051cd0e6d28 /cipher/pubkey.c
parent8f31f652d453f480d4d2559dfa17e7bd42145a49 (diff)
downloadlibgcrypt-a23cf78102f3200dc441a3123c3fbeaa28f38b50.tar.gz
cipher: Reject SHA-1 for hash+sign/verify when FIPS enabled.
* cipher/pubkey.c (_gcry_pk_sign_md): Reject SHA-1 when FIPS. (_gcry_pk_verify_md): Likewise. -- GnuPG-bug-id: 5665 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to 'cipher/pubkey.c')
-rw-r--r--cipher/pubkey.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/cipher/pubkey.c b/cipher/pubkey.c
index f205f009..4a78123a 100644
--- a/cipher/pubkey.c
+++ b/cipher/pubkey.c
@@ -458,7 +458,7 @@ _gcry_pk_sign_md (gcry_sexp_t *r_sig, const char *tmpl, gcry_md_hd_t hd_orig,
/* Check if it has fixed hash name or %s */
s = strstr (tmpl, "(hash ");
if (s == NULL)
- return gpg_err_code (GPG_ERR_DIGEST_ALGO);
+ return GPG_ERR_DIGEST_ALGO;
s += 6;
if (!strncmp (s, "%s", 2))
@@ -487,11 +487,12 @@ _gcry_pk_sign_md (gcry_sexp_t *r_sig, const char *tmpl, gcry_md_hd_t hd_orig,
if (hash_name)
{
algo = _gcry_md_map_name (hash_name);
- if (algo == 0)
+ if (algo == 0
+ || (fips_mode () && algo == GCRY_MD_SHA1))
{
xfree (hash_name);
_gcry_md_close (hd);
- return gpg_err_code (GPG_ERR_DIGEST_ALGO);
+ return GPG_ERR_DIGEST_ALGO;
}
digest = _gcry_md_read (hd, algo);
@@ -499,6 +500,10 @@ _gcry_pk_sign_md (gcry_sexp_t *r_sig, const char *tmpl, gcry_md_hd_t hd_orig,
else
{
algo = _gcry_md_get_algo (hd);
+
+ if (fips_mode () && algo == GCRY_MD_SHA1)
+ return GPG_ERR_DIGEST_ALGO;
+
digest = _gcry_md_read (hd, 0);
}
@@ -615,6 +620,9 @@ _gcry_pk_verify_md (gcry_sexp_t s_sig, const char *tmpl, gcry_md_hd_t hd_orig,
algo = _gcry_md_get_algo (hd);
+ if (fips_mode () && algo == GCRY_MD_SHA1)
+ return GPG_ERR_DIGEST_ALGO;
+
digest = _gcry_md_read (hd, 0);
if (!digest)
{