]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 2830] ntpd doesn't always transfer the correct TAI offset via autokey
authorJuergen Perlinger <perlinger@ntp.org>
Sun, 7 Jun 2015 21:11:26 +0000 (23:11 +0200)
committerJuergen Perlinger <perlinger@ntp.org>
Sun, 7 Jun 2015 21:11:26 +0000 (23:11 +0200)
 - add changelog entry
 - add ASSERTS to ntp_crypto.c for length of signature

bk: 5574b37eOZl0Nv8C_KC_1STow-y9tw

ChangeLog
ntpd/ntp_crypto.c

index 6845d2e218519afe2a217afe73695a10249cce08..97d1605aae0d4d06913b45f5f2040481776fa3bd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,10 @@
 * [Bug 2830] ntpd doesn't always transfer the correct TAI offset via autokey
    NTPD transfers the current TAI (instead of an announcement) now.
    This might still needed improvement.
+   Update autokey data ASAP when 'sys_tai' changes.
+   Fix unit test that was broken by changes for autokey update.
+   Avoid potential signature length issue and use DPRINTF where possible
+     in ntp_crypto.c.
 * [Bug 2832] refclock_jjy.c supports the TDC-300.
 * [Bug 2834] Correct a broken html tag in html/refclock.html
 * [Bug 2836] DFC77 patches from Frank Kardel to make decoding more
index 802f560e753c593084f0d7d444ca423b48387fbe..6f5ee107e9e51ec9afa5f082ccb995ed8c0c8f34 100644 (file)
@@ -380,6 +380,7 @@ make_keylist(
                EVP_SignUpdate(&ctx, (u_char *)vp, 12);
                EVP_SignUpdate(&ctx, vp->ptr, sizeof(struct autokey));
                if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+                       NTP_INSIST(len <= sign_siglen);
                        vp->siglen = htonl(len);
                        peer->flags |= FLAG_ASSOC;
                }
@@ -1589,8 +1590,10 @@ crypto_encrypt(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, vallen);
-       if (EVP_SignFinal(&ctx, vp->sig, &vallen, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &vallen, sign_pkey)) {
+               NTP_INSIST(vallen <= sign_siglen);
                vp->siglen = htonl(vallen);
+       }
        return (XEVNT_OK);
 }
 
@@ -1821,8 +1824,10 @@ crypto_update(void)
                EVP_SignInit(&ctx, sign_digest);
                EVP_SignUpdate(&ctx, (u_char *)&pubkey, 12);
                EVP_SignUpdate(&ctx, pubkey.ptr, ntohl(pubkey.vallen));
-               if (EVP_SignFinal(&ctx, pubkey.sig, &len, sign_pkey))
+               if (EVP_SignFinal(&ctx, pubkey.sig, &len, sign_pkey)) {
+                       NTP_INSIST(len <= sign_siglen);
                        pubkey.siglen = htonl(len);
+               }
        }
 
        /*
@@ -1840,8 +1845,10 @@ crypto_update(void)
                EVP_SignUpdate(&ctx, (u_char *)&cp->cert, 12);
                EVP_SignUpdate(&ctx, cp->cert.ptr,
                    ntohl(cp->cert.vallen));
-               if (EVP_SignFinal(&ctx, cp->cert.sig, &len, sign_pkey))
+               if (EVP_SignFinal(&ctx, cp->cert.sig, &len, sign_pkey)) {
+                       NTP_INSIST(len <= sign_siglen);
                        cp->cert.siglen = htonl(len);
+               }
        }
 
        /*
@@ -1888,8 +1895,10 @@ crypto_update(void)
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&tai_leap, 12);
        EVP_SignUpdate(&ctx, tai_leap.ptr, len);
-       if (EVP_SignFinal(&ctx, tai_leap.sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, tai_leap.sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                tai_leap.siglen = htonl(len);
+       }
        crypto_flags |= CRYPTO_FLAG_TAI;
 
        snprintf(statstr, sizeof(statstr), "signature update ts %u",
@@ -2159,8 +2168,10 @@ crypto_alice(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, len);
-       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                vp->siglen = htonl(len);
+       }
        return (XEVNT_OK);
 }
 
@@ -2267,8 +2278,10 @@ crypto_bob(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, vallen);
-       if (EVP_SignFinal(&ctx, vp->sig, &vallen, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &vallen, sign_pkey)) {
+               NTP_INSIST(vallen <= sign_siglen);
                vp->siglen = htonl(vallen);
+       }
        return (XEVNT_OK);
 }
 
@@ -2472,8 +2485,10 @@ crypto_alice2(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, len);
-       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                vp->siglen = htonl(len);
+       }
        return (XEVNT_OK);
 }
 
@@ -2570,8 +2585,10 @@ crypto_bob2(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, len);
-       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                vp->siglen = htonl(len);
+       }
        return (XEVNT_OK);
 }
 
@@ -2799,8 +2816,10 @@ crypto_alice3(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, len);
-       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                vp->siglen = htonl(len);
+       }
        return (XEVNT_OK);
 }
 
@@ -2899,8 +2918,10 @@ crypto_bob3(
        EVP_SignInit(&ctx, sign_digest);
        EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
        EVP_SignUpdate(&ctx, vp->ptr, len);
-       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+       if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+               NTP_INSIST(len <= sign_siglen);
                vp->siglen = htonl(len);
+       }
        return (XEVNT_OK);
 }
 
@@ -3136,8 +3157,10 @@ cert_sign(
                EVP_SignInit(&ctx, sign_digest);
                EVP_SignUpdate(&ctx, (u_char *)vp, 12);
                EVP_SignUpdate(&ctx, vp->ptr, len);
-               if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
+               if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey)) {
+                       NTP_INSIST(len <= sign_siglen);
                        vp->siglen = htonl(len);
+               }
        }
 #ifdef DEBUG
        if (debug > 1)