]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Reject incorrect RSA key lengths during key generation and and sign/verify context...
authorMukund Sivaraman <muks@isc.org>
Fri, 21 Apr 2017 12:00:15 +0000 (17:30 +0530)
committerMukund Sivaraman <muks@isc.org>
Fri, 21 Apr 2017 13:36:04 +0000 (19:06 +0530)
(cherry picked from commit 239e9dc81c94885d25572959d9c8597d2504d731)
(cherry picked from commit 264e17e73941059877ccf3c96f26aac15a25500b)

CHANGES
lib/dns/opensslrsa_link.c
lib/dns/pkcs11rsa_link.c

diff --git a/CHANGES b/CHANGES
index 546c29c6d957df3a9e3132a1f1f9bbac5e16ed21..3283df5723fda2893442cad6e2adb8bc182fb9a5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+4601.  [bug]           Reject incorrect RSA key lengths during key
+                       generation and and sign/verify context
+                       creation. [RT #45043]
+
 4600.  [bug]           Adjust RPZ trigger counts only when the entry
                        being deleted exists. [RT #43386]
 
index 9aa10c20edf531b2d3ca103e720fb6536fa885a7..6a8d4e39c030805fd7250a10dfaf7ca379c8675e 100644 (file)
@@ -269,6 +269,33 @@ opensslrsa_createctx(dst_key_t *key, dst_context_t *dctx) {
                dctx->key->key_alg == DST_ALG_RSASHA512);
 #endif
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (dctx->key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (dctx->key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 512) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 1024) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
 #if USE_EVP
        evp_md_ctx = EVP_MD_CTX_create();
        if (evp_md_ctx == NULL)
@@ -966,6 +993,33 @@ opensslrsa_generate(dst_key_t *key, int exp, void (*callback)(int)) {
        EVP_PKEY *pkey = EVP_PKEY_new();
 #endif
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (key->key_size > 4096)
+                       goto err;
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((key->key_size < 512) ||
+                   (key->key_size > 4096))
+                       goto err;
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((key->key_size < 1024) ||
+                   (key->key_size > 4096))
+                       goto err;
+               break;
+       default:
+               INSIST(0);
+       }
+
        if (rsa == NULL || e == NULL || cb == NULL)
                goto err;
 #if USE_EVP
index 8f5d47c6dfb43e73c13f47761014a86fc651a012..6b2f81127e317f42035ce6e40e3423aeaeafb995 100644 (file)
@@ -98,6 +98,33 @@ pkcs11rsa_createctx_sign(dst_key_t *key, dst_context_t *dctx) {
                key->key_alg == DST_ALG_RSASHA512);
 #endif
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (dctx->key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (dctx->key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 512) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 1024) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
        rsa = key->keydata.pkey;
 
        pk11_ctx = (pk11_context_t *) isc_mem_get(dctx->mctx,
@@ -307,6 +334,33 @@ pkcs11rsa_createctx_verify(dst_key_t *key, unsigned int maxbits,
                key->key_alg == DST_ALG_RSASHA512);
 #endif
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (dctx->key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (dctx->key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 512) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 1024) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
        rsa = key->keydata.pkey;
 
        pk11_ctx = (pk11_context_t *) isc_mem_get(dctx->mctx,
@@ -555,6 +609,33 @@ pkcs11rsa_createctx(dst_key_t *key, dst_context_t *dctx) {
 #endif
        REQUIRE(rsa != NULL);
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (dctx->key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (dctx->key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 512) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 1024) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
        switch (key->key_alg) {
 #ifndef PK11_MD5_DISABLE
        case DST_ALG_RSAMD5:
@@ -684,6 +765,33 @@ pkcs11rsa_sign(dst_context_t *dctx, isc_buffer_t *sig) {
 #endif
        REQUIRE(rsa != NULL);
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (dctx->key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (dctx->key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 512) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((dctx->key->key_size < 1024) ||
+                   (dctx->key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
        switch (key->key_alg) {
 #ifndef PK11_MD5_DISABLE
        case DST_ALG_RSAMD5:
@@ -1100,6 +1208,33 @@ pkcs11rsa_generate(dst_key_t *key, int exp, void (*callback)(int)) {
 
        UNUSED(callback);
 
+       /*
+        * Reject incorrect RSA key lengths.
+        */
+       switch (key->key_alg) {
+       case DST_ALG_RSAMD5:
+       case DST_ALG_RSASHA1:
+       case DST_ALG_NSEC3RSASHA1:
+               /* From RFC 3110 */
+               if (key->key_size > 4096)
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA256:
+               /* From RFC 5702 */
+               if ((key->key_size < 512) ||
+                   (key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       case DST_ALG_RSASHA512:
+               /* From RFC 5702 */
+               if ((key->key_size < 1024) ||
+                   (key->key_size > 4096))
+                       return (ISC_R_FAILURE);
+               break;
+       default:
+               INSIST(0);
+       }
+
        pk11_ctx = (pk11_context_t *) isc_mem_get(key->mctx,
                                                  sizeof(*pk11_ctx));
        if (pk11_ctx == NULL)