Do not allow large salt lengts with PSS padding
Related: rhbz#2137577
This commit is contained in:
		
							parent
							
								
									8d0820609b
								
							
						
					
					
						commit
						fdf75fc702
					
				
							
								
								
									
										109
									
								
								libgcrypt-1.10.0-fips-rsa-pss.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								libgcrypt-1.10.0-fips-rsa-pss.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,109 @@ | |||||||
|  | From bf1e62e59200b2046680d1d3d1599facc88cfe63 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Jakub Jelen <jjelen@redhat.com> | ||||||
|  | Date: Tue, 29 Nov 2022 14:04:59 +0100 | ||||||
|  | Subject: [PATCH] rsa: Prevent usage of long salt in FIPS mode | ||||||
|  | 
 | ||||||
|  | * cipher/rsa-common.c (_gcry_rsa_pss_encode): Prevent usage of large | ||||||
|  |   salt lengths | ||||||
|  |   (_gcry_rsa_pss_verify): Ditto. | ||||||
|  | * tests/basic.c (check_pubkey_sign): Check longer salt length fails in | ||||||
|  |   FIPS mode | ||||||
|  | * tests/t-rsa-pss.c (one_test_sexp): Fix function name in error message | ||||||
|  | ---
 | ||||||
|  |  cipher/rsa-common.c | 14 ++++++++++++++ | ||||||
|  |  tests/basic.c       | 19 ++++++++++++++++++- | ||||||
|  |  tests/t-rsa-pss.c   |  2 +- | ||||||
|  |  3 files changed, 33 insertions(+), 2 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/cipher/rsa-common.c b/cipher/rsa-common.c
 | ||||||
|  | index 233ddb2d..61cd60a4 100644
 | ||||||
|  | --- a/cipher/rsa-common.c
 | ||||||
|  | +++ b/cipher/rsa-common.c
 | ||||||
|  | @@ -809,6 +809,13 @@ _gcry_rsa_pss_encode (gcry_mpi_t *r_result, unsigned int nbits, int algo,
 | ||||||
|  |    hlen = _gcry_md_get_algo_dlen (algo); | ||||||
|  |    gcry_assert (hlen);  /* We expect a valid ALGO here.  */ | ||||||
|  |   | ||||||
|  | +  /* The FIPS 186-4 Section 5.5 allows only 0 <= sLen <= hLen */
 | ||||||
|  | +  if (fips_mode () && saltlen > hlen)
 | ||||||
|  | +    {
 | ||||||
|  | +      rc = GPG_ERR_INV_ARG;
 | ||||||
|  | +      goto leave;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  |    /* Allocate a help buffer and setup some pointers.  */ | ||||||
|  |    buflen = 8 + hlen + saltlen + (emlen - hlen - 1); | ||||||
|  |    buf = xtrymalloc (buflen); | ||||||
|  | @@ -950,6 +957,13 @@ _gcry_rsa_pss_verify (gcry_mpi_t value, int hashed_already,
 | ||||||
|  |    hlen = _gcry_md_get_algo_dlen (algo); | ||||||
|  |    gcry_assert (hlen);  /* We expect a valid ALGO here.  */ | ||||||
|  |   | ||||||
|  | +  /* The FIPS 186-4 Section 5.5 allows only 0 <= sLen <= hLen */
 | ||||||
|  | +  if (fips_mode () && saltlen > hlen)
 | ||||||
|  | +    {
 | ||||||
|  | +      rc = GPG_ERR_INV_ARG;
 | ||||||
|  | +      goto leave;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  |    /* Allocate a help buffer and setup some pointers. | ||||||
|  |       This buffer is used for two purposes: | ||||||
|  |          +------------------------------+-------+ | ||||||
|  | diff --git a/tests/basic.c b/tests/basic.c
 | ||||||
|  | index 77e2fd93..429bd237 100644
 | ||||||
|  | --- a/tests/basic.c
 | ||||||
|  | +++ b/tests/basic.c
 | ||||||
|  | @@ -16602,6 +16602,7 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
 | ||||||
|  |      const char *data; | ||||||
|  |      int algo; | ||||||
|  |      int expected_rc; | ||||||
|  | +    int flags;
 | ||||||
|  |    } datas[] = | ||||||
|  |      { | ||||||
|  |        { "(data\n (flags pkcs1)\n" | ||||||
|  | @@ -16672,6 +16673,22 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
 | ||||||
|  |          " (random-override #4253647587980912233445566778899019283747#))\n", | ||||||
|  |  	GCRY_PK_RSA, | ||||||
|  |  	0 }, | ||||||
|  | +      { "(data\n (flags pss)\n"
 | ||||||
|  | +	" (hash-algo sha256)\n"
 | ||||||
|  | +	" (value #11223344556677889900AABBCCDDEEFF#)\n"
 | ||||||
|  | +	" (salt-length 2:32)\n"
 | ||||||
|  | +        " (random-override #42536475879809122334455667788990192837465564738291"
 | ||||||
|  | +                           "00122334455667#))\n",
 | ||||||
|  | +	GCRY_PK_RSA,
 | ||||||
|  | +	0 },
 | ||||||
|  | +      { "(data\n (flags pss)\n"
 | ||||||
|  | +	" (hash-algo sha256)\n"
 | ||||||
|  | +	" (value #11223344556677889900AABBCCDDEEFF#)\n"
 | ||||||
|  | +	" (salt-length 2:33)\n"
 | ||||||
|  | +        " (random-override #42536475879809122334455667788990192837465564738291"
 | ||||||
|  | +                           "0012233445566778#))\n",
 | ||||||
|  | +	GCRY_PK_RSA,
 | ||||||
|  | +	0, FLAG_NOFIPS },
 | ||||||
|  |        { NULL } | ||||||
|  |      }; | ||||||
|  |   | ||||||
|  | @@ -16695,7 +16712,7 @@ check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
 | ||||||
|  |  	die ("converting data failed: %s\n", gpg_strerror (rc)); | ||||||
|  |   | ||||||
|  |        rc = gcry_pk_sign (&sig, hash, skey); | ||||||
|  | -      if (in_fips_mode && (flags & FLAG_NOFIPS))
 | ||||||
|  | +      if (in_fips_mode && (flags & FLAG_NOFIPS || datas[dataidx].flags & FLAG_NOFIPS))
 | ||||||
|  |          { | ||||||
|  |            if (!rc) | ||||||
|  |              fail ("gcry_pk_sign did not fail as expected in FIPS mode\n"); | ||||||
|  | diff --git a/tests/t-rsa-pss.c b/tests/t-rsa-pss.c
 | ||||||
|  | index c5f90116..82dd54b3 100644
 | ||||||
|  | --- a/tests/t-rsa-pss.c
 | ||||||
|  | +++ b/tests/t-rsa-pss.c
 | ||||||
|  | @@ -340,7 +340,7 @@ one_test_sexp (const char *n, const char *e, const char *d,
 | ||||||
|  |      snprintf (p, 3, "%02x", out[i]); | ||||||
|  |    if (strcmp (sig_string, s)) | ||||||
|  |      { | ||||||
|  | -      fail ("gcry_pkhash_sign failed: %s",
 | ||||||
|  | +      fail ("gcry_pk_hash_sign failed: %s",
 | ||||||
|  |              "wrong value returned"); | ||||||
|  |        info ("  expected: '%s'", s); | ||||||
|  |        info ("       got: '%s'", sig_string); | ||||||
|  | -- 
 | ||||||
|  | 2.39.0 | ||||||
|  | 
 | ||||||
| @ -48,6 +48,8 @@ Patch13: libgcrypt-1.10.0-fips-integrity.patch | |||||||
| Patch14: libgcrypt-1.10.0-fips-integrity2.patch | Patch14: libgcrypt-1.10.0-fips-integrity2.patch | ||||||
| # 06ea5b5332ffdb44a0a394d766be8989bcb6a95c | # 06ea5b5332ffdb44a0a394d766be8989bcb6a95c | ||||||
| Patch15: libgcrypt-1.10.0-fips-x931.patch | Patch15: libgcrypt-1.10.0-fips-x931.patch | ||||||
|  | # bf1e62e59200b2046680d1d3d1599facc88cfe63 | ||||||
|  | Patch16: libgcrypt-1.10.0-fips-rsa-pss.patch | ||||||
| 
 | 
 | ||||||
| %global gcrylibdir %{_libdir} | %global gcrylibdir %{_libdir} | ||||||
| %global gcrysoname libgcrypt.so.20 | %global gcrysoname libgcrypt.so.20 | ||||||
| @ -96,6 +98,7 @@ applications using libgcrypt. | |||||||
| %patch13 -p1 | %patch13 -p1 | ||||||
| %patch14 -p1 | %patch14 -p1 | ||||||
| %patch15 -p1 | %patch15 -p1 | ||||||
|  | %patch16 -p1 | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| # This package has a configure test which uses ASMs, but does not link the | # This package has a configure test which uses ASMs, but does not link the | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user