diff options
Diffstat (limited to 'ntpd/ntp_crypto.c')
-rw-r--r-- | ntpd/ntp_crypto.c | 134 |
1 files changed, 62 insertions, 72 deletions
diff --git a/ntpd/ntp_crypto.c b/ntpd/ntp_crypto.c index 4a4207683331..38a62fdb4398 100644 --- a/ntpd/ntp_crypto.c +++ b/ntpd/ntp_crypto.c @@ -267,17 +267,10 @@ session_key( hdlen = 10 * sizeof(u_int32); 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 + ctx = digest_ctx; 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); memcpy(&keyid, dgst, 4); keyid = ntohl(keyid); if (lifetime != 0) { @@ -308,7 +301,7 @@ session_key( int make_keylist( struct peer *peer, /* peer structure pointer */ - struct interface *dstadr /* interface */ + endpt *dstadr /* interface */ ) { EVP_MD_CTX *ctx; /* signature context */ @@ -389,7 +382,7 @@ make_keylist( if (tstamp != 0) { if (vp->sig == NULL) vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)vp, 12); EVP_SignUpdate(ctx, vp->ptr, sizeof(struct autokey)); @@ -398,7 +391,6 @@ make_keylist( vp->siglen = htonl(len); peer->flags |= FLAG_ASSOC; } - EVP_MD_CTX_free(ctx); } DPRINTF(1, ("make_keys: %d %08x %08x ts %u fs %u poll %d\n", peer->keynumber, keyid, cookie, ntohl(vp->tstamp), @@ -834,7 +826,7 @@ crypto_recv( * errors. */ if (vallen == (u_int)EVP_PKEY_size(host_pkey)) { - RSA *rsa = EVP_PKEY_get0_RSA(host_pkey); + RSA *rsa = EVP_PKEY_get1_RSA(host_pkey); u_int32 *cookiebuf = malloc(RSA_size(rsa)); if (!cookiebuf) { rval = XEVNT_CKY; @@ -853,6 +845,7 @@ crypto_recv( cookie = ntohl(*cookiebuf); free(cookiebuf); } + RSA_free(rsa); } else { rval = XEVNT_CKY; break; @@ -1548,16 +1541,15 @@ crypto_verify( * signature. If the identity exchange is verified, light the * proventic bit. What a relief. */ - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_VerifyInit(ctx, peer->digest); - /* XXX: the "+ 12" needs to be at least documented... */ - EVP_VerifyUpdate(ctx, (u_char *)&ep->tstamp, vallen + 12); + EVP_VerifyUpdate(ctx, (u_char *)&ep->tstamp, vallen + + sizeof(ep->tstamp) + sizeof(ep->fstamp) + + sizeof(ep->vallen)); if (EVP_VerifyFinal(ctx, (u_char *)&ep->pkt[i], siglen, pkey) <= 0) { - EVP_MD_CTX_free(ctx); return (XEVNT_SIG); } - EVP_MD_CTX_free(ctx); if (peer->crypto & CRYPTO_FLAG_VRFY) peer->crypto |= CRYPTO_FLAG_PROV; @@ -1583,6 +1575,7 @@ crypto_encrypt( ) { EVP_PKEY *pkey; /* public key */ + RSA* rsa; /* public key */ EVP_MD_CTX *ctx; /* signature context */ tstamp_t tstamp; /* NTP timestamp */ u_int32 temp32; @@ -1610,8 +1603,9 @@ crypto_encrypt( vp->ptr = emalloc(vallen); puch = vp->ptr; temp32 = htonl(*cookie); - if (RSA_public_encrypt(4, (u_char *)&temp32, puch, - EVP_PKEY_get0_RSA(pkey), RSA_PKCS1_OAEP_PADDING) <= 0) { + rsa = EVP_PKEY_get1_RSA(pkey); + if (RSA_public_encrypt(4, (u_char *)&temp32, puch, rsa, + RSA_PKCS1_OAEP_PADDING) <= 0) { msyslog(LOG_ERR, "crypto_encrypt: %s", ERR_error_string(ERR_get_error(), NULL)); free(vp->ptr); @@ -1619,11 +1613,14 @@ crypto_encrypt( return (XEVNT_CKY); } EVP_PKEY_free(pkey); + pkey = NULL; + RSA_free(rsa); + rsa = NULL; if (tstamp == 0) return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, vallen); @@ -1631,7 +1628,6 @@ crypto_encrypt( INSIST(vallen <= sign_siglen); vp->siglen = htonl(vallen); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -1849,7 +1845,7 @@ crypto_update(void) if (hostval.tstamp == 0) return; - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; /* * Sign public key and timestamps. The filestamp is derived from @@ -1945,7 +1941,6 @@ crypto_update(void) ntohl(hostval.tstamp)); record_crypto_stats(NULL, statstr); DPRINTF(1, ("crypto_update: %s\n", statstr)); - EVP_MD_CTX_free(ctx); } /* @@ -2003,7 +1998,7 @@ value_free( * Returns NTP seconds if in synch, 0 otherwise */ tstamp_t -crypto_time() +crypto_time(void) { l_fp tstamp; /* NTP time */ @@ -2075,7 +2070,7 @@ asn_to_calendar ( /* - * bigdig() - compute a BIGNUM MD5 hash of a BIGNUM number. + * bighash() - compute a BIGNUM MD5 hash of a BIGNUM number. * * Returns void (no errors) */ @@ -2093,17 +2088,10 @@ bighash( len = BN_num_bytes(bn); 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 + ctx = digest_ctx; EVP_DigestInit(ctx, EVP_md5()); -# endif EVP_DigestUpdate(ctx, ptr, len); EVP_DigestFinal(ctx, dgst, &len); - EVP_MD_CTX_free(ctx); BN_bin2bn(dgst, len, bk); free(ptr); } @@ -2169,12 +2157,12 @@ crypto_alice( struct value *vp /* value pointer */ ) { - DSA *dsa; /* IFF parameters */ - BN_CTX *bctx; /* BIGNUM context */ - EVP_MD_CTX *ctx; /* signature context */ - tstamp_t tstamp; - u_int len; - const BIGNUM *q; + const DSA *dsa; /* IFF parameters */ + BN_CTX *bctx; /* BIGNUM context */ + EVP_MD_CTX *ctx; /* signature context */ + tstamp_t tstamp; + u_int len; + const BIGNUM *q; /* * The identity parameters must have correct format and content. @@ -2216,7 +2204,7 @@ crypto_alice( return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -2224,7 +2212,6 @@ crypto_alice( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -2243,7 +2230,8 @@ crypto_bob( struct value *vp /* value pointer */ ) { - DSA *dsa; /* IFF parameters */ + int retv; /* return value */ + const DSA *dsa; /* IFF parameters */ DSA_SIG *sdsa; /* DSA signature context fake */ BN_CTX *bctx; /* BIGNUM context */ EVP_MD_CTX *ctx; /* signature context */ @@ -2262,6 +2250,10 @@ crypto_bob( msyslog(LOG_NOTICE, "crypto_bob: scheme unavailable"); return (XEVNT_ID); } + + /* Initialize pointers that may need freeing in cleanup. */ + sdsa = NULL; + dsa = EVP_PKEY_get0_DSA(iffkey_info->pkey); DSA_get0_pqg(dsa, &p, &q, &g); DSA_get0_key(dsa, NULL, &priv_key); @@ -2306,16 +2298,16 @@ crypto_bob( if (len == 0) { msyslog(LOG_ERR, "crypto_bob: %s", ERR_error_string(ERR_get_error(), NULL)); - DSA_SIG_free(sdsa); - return (XEVNT_ERR); + retv = XEVNT_ERR; + goto cleanup; } if (len > MAX_VALLEN) { msyslog(LOG_ERR, "crypto_bob: signature is too big: %u", len); - DSA_SIG_free(sdsa); - return (XEVNT_LEN); + retv = XEVNT_ERR; + goto cleanup; } - memset(vp, 0, sizeof(struct value)); + ZERO(*vp); tstamp = crypto_time(); vp->tstamp = htonl(tstamp); vp->fstamp = htonl(iffkey_info->fstamp); @@ -2323,13 +2315,14 @@ crypto_bob( ptr = emalloc(len); vp->ptr = ptr; i2d_DSA_SIG(sdsa, &ptr); - DSA_SIG_free(sdsa); - if (tstamp == 0) - return (XEVNT_OK); + if (0 == tstamp) { + retv = XEVNT_OK; + goto cleanup; + } /* XXX: more validation to make sure the sign fits... */ vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -2337,8 +2330,11 @@ crypto_bob( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); - return (XEVNT_OK); + retv = XEVNT_OK; + + cleanup: + DSA_SIG_free(sdsa); + return retv; } @@ -2357,7 +2353,7 @@ crypto_iff( struct peer *peer /* peer structure pointer */ ) { - DSA *dsa; /* IFF parameters */ + const DSA *dsa; /* IFF parameters */ BN_CTX *bctx; /* BIGNUM context */ DSA_SIG *sdsa; /* DSA parameters */ BIGNUM *bn, *bk; @@ -2501,7 +2497,7 @@ crypto_alice2( struct value *vp /* value pointer */ ) { - RSA *rsa; /* GQ parameters */ + const RSA *rsa; /* GQ parameters */ BN_CTX *bctx; /* BIGNUM context */ EVP_MD_CTX *ctx; /* signature context */ tstamp_t tstamp; @@ -2546,7 +2542,7 @@ crypto_alice2( return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -2554,7 +2550,6 @@ crypto_alice2( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -2573,7 +2568,7 @@ crypto_bob2( struct value *vp /* value pointer */ ) { - RSA *rsa; /* GQ parameters */ + const RSA *rsa; /* GQ parameters */ DSA_SIG *sdsa; /* DSA parameters */ BN_CTX *bctx; /* BIGNUM context */ EVP_MD_CTX *ctx; /* signature context */ @@ -2651,7 +2646,7 @@ crypto_bob2( return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -2659,7 +2654,6 @@ crypto_bob2( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -2680,7 +2674,7 @@ crypto_gq( struct peer *peer /* peer structure pointer */ ) { - RSA *rsa; /* GQ parameters */ + const RSA *rsa; /* GQ parameters */ BN_CTX *bctx; /* BIGNUM context */ DSA_SIG *sdsa; /* RSA signature context fake */ BIGNUM *y, *v; @@ -2845,7 +2839,7 @@ crypto_alice3( struct value *vp /* value pointer */ ) { - DSA *dsa; /* MV parameters */ + const DSA *dsa; /* MV parameters */ BN_CTX *bctx; /* BIGNUM context */ EVP_MD_CTX *ctx; /* signature context */ tstamp_t tstamp; @@ -2890,7 +2884,7 @@ crypto_alice3( return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -2898,7 +2892,6 @@ crypto_alice3( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -2916,7 +2909,7 @@ crypto_bob3( struct value *vp /* value pointer */ ) { - DSA *dsa; /* MV parameters */ + const DSA *dsa; /* MV parameters */ DSA *sdsa; /* DSA signature context fake */ BN_CTX *bctx; /* BIGNUM context */ EVP_MD_CTX *ctx; /* signature context */ @@ -3003,7 +2996,7 @@ crypto_bob3( return (XEVNT_OK); vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)&vp->tstamp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -3011,7 +3004,6 @@ crypto_bob3( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); return (XEVNT_OK); } @@ -3032,7 +3024,7 @@ crypto_mv( struct peer *peer /* peer structure pointer */ ) { - DSA *dsa; /* MV parameters */ + const DSA *dsa; /* MV parameters */ DSA *sdsa; /* DSA parameters */ BN_CTX *bctx; /* BIGNUM context */ BIGNUM *k, *u, *v; @@ -3253,7 +3245,7 @@ cert_sign( vp->siglen = 0; if (tstamp != 0) { vp->sig = emalloc(sign_siglen); - ctx = EVP_MD_CTX_new(); + ctx = digest_ctx; EVP_SignInit(ctx, sign_digest); EVP_SignUpdate(ctx, (u_char *)vp, 12); EVP_SignUpdate(ctx, vp->ptr, len); @@ -3261,7 +3253,6 @@ cert_sign( INSIST(len <= sign_siglen); vp->siglen = htonl(len); } - EVP_MD_CTX_free(ctx); } #ifdef DEBUG if (debug > 1) @@ -3909,7 +3900,6 @@ crypto_setup(void) "crypto_setup: spurious crypto command"); return; } - ssl_check_version(); /* * Load required random seed file and seed the random number @@ -4168,5 +4158,5 @@ exten_payload_size( return (u_int)data_size; } # else /* !AUTOKEY follows */ -int ntp_crypto_bs_pubkey; +NONEMPTY_TRANSLATION_UNIT # endif /* !AUTOKEY */ |