]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 3457] OpenSSL FIPS mode regression
authorJuergen Perlinger <perlinger@ntp.org>
Wed, 7 Feb 2018 07:14:35 +0000 (08:14 +0100)
committerJuergen Perlinger <perlinger@ntp.org>
Wed, 7 Feb 2018 07:14:35 +0000 (08:14 +0100)
bk: 5a7aa75bVAENRhCqqTrIb9Ky4frLYg

ChangeLog
libntp/a_md5encrypt.c
ntpd/ntp_control.c
ntpd/ntp_crypto.c
sntp/crypto.c

index e0086e0140e2490cecdc98a4fa0d2a92a2681870..48d965f1ca4c423e07048b0b06a9ef3a9f6b3393 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
   - initial patch by <stenn@ntp.org>, extended by <perlinger@ntp.org>
 * [Sec 3412] ctl_getitem(): Don't compare names past NUL. <perlinger@ntp.org>
 * [Sec 3012] Sybil vulnerability: noepeer support.  HStenn, JPerlinger.
+* [Bug 3457] OpenSSL FIPS mode regression <perlinger@ntp.org>
 * [Bug 3452] PARSE driver prints uninitialized memory. <perlinger@ntp.org>
 * [Bug 3450] Dubious error messages from plausibility checks in get_systime()
  - removed error log caused by rounding/slew, ensured postcondition <perlinger@ntp.org>
index b90170aaec90ed24d56fd6b866fc247ac7948243..7dc7e7ecf40dd3c628cf1cfb70ee83aa9ac25e0c 100644 (file)
@@ -114,8 +114,9 @@ make_mac(
                /* make sure MD5 is allowd */
                EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
            #endif
-               
-               if (!EVP_DigestInit(ctx, EVP_get_digestbynid(ktype))) {
+               /* [Bug 3457] DON'T use plain EVP_DigestInit! It would
+                * kill the flags! */
+               if (!EVP_DigestInit_ex(ctx, EVP_get_digestbynid(ktype), NULL)) {
                        msyslog(LOG_ERR, "MAC encrypt: MAC %s Digest Init failed.",
                                OBJ_nid2sn(ktype));
                        goto mac_fail;
@@ -265,10 +266,12 @@ addr2refid(sockaddr_u *addr)
        INIT_SSL();
 
        ctx = EVP_MD_CTX_new();
-#ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
+#   ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
        /* MD5 is not used as a crypto hash here. */
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-#endif
+#   endif
+       /* [Bug 3457] DON'T use plain EVP_DigestInit! It would kill the
+        * flags! */
        if (!EVP_DigestInit_ex(ctx, EVP_md5(), NULL)) {
                msyslog(LOG_ERR,
                    "MD5 init failed");
index 756a874c178a85bffcf5db8ac3d418fb90be9483..182dd0d8e0df06ec48926772d7f4b8249c616003 100644 (file)
@@ -3643,7 +3643,13 @@ static u_int32 derive_nonce(
        }
 
        ctx = EVP_MD_CTX_new();
+#   if defined(OPENSSL) && defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW)
+       /* [Bug 3457] set flags and don't kill them again */
+       EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+       EVP_DigestInit_ex(ctx, EVP_get_digestbynid(NID_md5), NULL);
+#   else       
        EVP_DigestInit(ctx, EVP_get_digestbynid(NID_md5));
+#   endif
        EVP_DigestUpdate(ctx, salt, sizeof(salt));
        EVP_DigestUpdate(ctx, &ts_i, sizeof(ts_i));
        EVP_DigestUpdate(ctx, &ts_f, sizeof(ts_f));
index 11d087a5ad69060b06d76f152dc02431262743a2..f2df4da8fcf417e96c38bcb3306e79b11dd13b4e 100644 (file)
@@ -268,7 +268,13 @@ session_key(
                break;
        }
        ctx = EVP_MD_CTX_new();
+#   if defined(OPENSSL) && defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW)
+       /* [Bug 3457] set flags and don't kill them again */
+       EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+       EVP_DigestInit_ex(ctx, EVP_get_digestbynid(crypto_nid), NULL);
+#   else
        EVP_DigestInit(ctx, EVP_get_digestbynid(crypto_nid));
+#   endif
        EVP_DigestUpdate(ctx, (u_char *)header, hdlen);
        EVP_DigestFinal(ctx, dgst, &len);
        EVP_MD_CTX_free(ctx);
@@ -2087,7 +2093,13 @@ bighash(
        ptr = emalloc(len);
        BN_bn2bin(bn, ptr);
        ctx = EVP_MD_CTX_new();
+#   if defined(OPENSSL) && defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW)
+       /* [Bug 3457] set flags and don't kill them again */
+       EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+       EVP_DigestInit_ex(ctx, EVP_md5(), NULL);
+#   else
        EVP_DigestInit(ctx, EVP_md5());
+#   endif
        EVP_DigestUpdate(ctx, ptr, len);
        EVP_DigestFinal(ctx, dgst, &len);
        EVP_MD_CTX_free(ctx);
index daba425be1e3cfa08cf1170e7e0c7110ad022270..ce5d136fcbf1227ad2d57de42945e64789aa87fd 100644 (file)
@@ -86,21 +86,30 @@ compute_mac(
                if (!(ctx = EVP_MD_CTX_new())) {
                        msyslog(LOG_ERR, "make_mac: MAC %s Digest CTX new failed.",
                                macname);
+                       goto mac_fail;
                }
 #ifdef OPENSSL /* OpenSSL 1 supports return codes 0 fail, 1 okay */
-               else if (!EVP_DigestInit(ctx, EVP_get_digestbynid(key_type))) {
+#          ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
+               EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+#          endif
+               /* [Bug 3457] DON'T use plain EVP_DigestInit! It would
+                *  kill the flags! */
+               if (!EVP_DigestInit_ex(ctx, EVP_get_digestbynid(key_type), NULL)) {
                        msyslog(LOG_ERR, "make_mac: MAC %s Digest Init failed.",
                                macname);
+                       goto mac_fail;
                }
-               else if (!EVP_DigestUpdate(ctx, key_data, key_size)) {
+               if (!EVP_DigestUpdate(ctx, key_data, key_size)) {
                        msyslog(LOG_ERR, "make_mac: MAC %s Digest Update key failed.",
                                macname);
+                       goto mac_fail;
                }
-               else if (!EVP_DigestUpdate(ctx, pkt_data, pkt_size)) {
+               if (!EVP_DigestUpdate(ctx, pkt_data, pkt_size)) {
                        msyslog(LOG_ERR, "make_mac: MAC %s Digest Update data failed.",
                                macname);
+                       goto mac_fail;
                }
-               else if (!EVP_DigestFinal(ctx, digest, &len)) {
+               if (!EVP_DigestFinal(ctx, digest, &len)) {
                        msyslog(LOG_ERR, "make_mac: MAC %s Digest Final failed.",
                                macname);
                        len = 0;
@@ -111,7 +120,7 @@ compute_mac(
                EVP_DigestUpdate(ctx, pkt_data, pkt_size);
                EVP_DigestFinal(ctx, digest, &len);
 #endif
-               
+         mac_fail:
                EVP_MD_CTX_free(ctx);
        }