aboutsummaryrefslogtreecommitdiff
path: root/ntpd/ntp_crypto.c
diff options
context:
space:
mode:
Diffstat (limited to 'ntpd/ntp_crypto.c')
-rw-r--r--ntpd/ntp_crypto.c134
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 */