summaryrefslogtreecommitdiff
path: root/dnscrypt/dnscrypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'dnscrypt/dnscrypt.c')
-rw-r--r--dnscrypt/dnscrypt.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/dnscrypt/dnscrypt.c b/dnscrypt/dnscrypt.c
index 0787dec23ddb..843735018b23 100644
--- a/dnscrypt/dnscrypt.c
+++ b/dnscrypt/dnscrypt.c
@@ -316,15 +316,15 @@ dnscrypt_server_uncurve(struct dnsc_env* env,
#else
return -1;
#endif
- } else {
- if (crypto_box_beforenm(nmkey,
- query_header->publickey,
- cert->keypair->crypt_secretkey) != 0) {
- return -1;
- }
- }
- // Cache the shared secret we just computed.
- dnsc_shared_secret_cache_insert(env->shared_secrets_cache,
+ } else {
+ if (crypto_box_beforenm(nmkey,
+ query_header->publickey,
+ cert->keypair->crypt_secretkey) != 0) {
+ return -1;
+ }
+ }
+ // Cache the shared secret we just computed.
+ dnsc_shared_secret_cache_insert(env->shared_secrets_cache,
key,
hash,
nmkey);
@@ -442,20 +442,7 @@ dnscrypt_hrtime(void)
static void
add_server_nonce(uint8_t *nonce)
{
- uint64_t ts;
- uint64_t tsn;
- uint32_t suffix;
- ts = dnscrypt_hrtime();
- // TODO? dnscrypt-wrapper does some logic with context->nonce_ts_last
- // unclear if we really need it, so skipping it for now.
- tsn = (ts << 10) | (randombytes_random() & 0x3ff);
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- tsn =
- (((uint64_t)htonl((uint32_t)tsn)) << 32) | htonl((uint32_t)(tsn >> 32));
-#endif
- memcpy(nonce + crypto_box_HALF_NONCEBYTES, &tsn, 8);
- suffix = randombytes_random();
- memcpy(nonce + crypto_box_HALF_NONCEBYTES + 8, &suffix, 4);
+ randombytes_buf(nonce + crypto_box_HALF_NONCEBYTES, 8/*tsn*/+4/*suffix*/);
}
/**
@@ -732,6 +719,11 @@ dnsc_load_local_data(struct dnsc_env* dnscenv, struct config_file *cfg)
);
continue;
}
+ if((unsigned)strlen(dnscenv->provider_name) >= (unsigned)0xffff0000) {
+ /* guard against integer overflow in rrlen calculation */
+ verbose(VERB_OPS, "cert #%" PRIu32 " is too long", serial);
+ continue;
+ }
rrlen = strlen(dnscenv->provider_name) +
strlen(ttl_class_type) +
4 * sizeof(struct SignedCert) + // worst case scenario
@@ -746,9 +738,9 @@ dnsc_load_local_data(struct dnsc_env* dnscenv, struct config_file *cfg)
for(j=0; j<sizeof(struct SignedCert); j++) {
int c = (int)*((const uint8_t *) cert + j);
if (isprint(c) && c != '"' && c != '\\') {
- snprintf(rr + strlen(rr), rrlen - 1 - strlen(rr), "%c", c);
+ snprintf(rr + strlen(rr), rrlen - strlen(rr), "%c", c);
} else {
- snprintf(rr + strlen(rr), rrlen - 1 - strlen(rr), "\\%03d", c);
+ snprintf(rr + strlen(rr), rrlen - strlen(rr), "\\%03d", c);
}
}
verbose(VERB_OPS,
@@ -757,7 +749,7 @@ dnsc_load_local_data(struct dnsc_env* dnscenv, struct config_file *cfg)
" to local-data to config: %s",
serial, rr
);
- snprintf(rr + strlen(rr), rrlen - 1 - strlen(rr), "\"");
+ snprintf(rr + strlen(rr), rrlen - strlen(rr), "\"");
cfg_strlist_insert(&cfg->local_data, strdup(rr));
free(rr);
}
@@ -877,7 +869,7 @@ sodium_misuse_handler(void)
fatal_exit(
"dnscrypt: libsodium could not be initialized, this typically"
" happens when no good source of entropy is found. If you run"
- " unbound in a chroot, make sure /dev/random is available. See"
+ " unbound in a chroot, make sure /dev/urandom is available. See"
" https://www.unbound.net/documentation/unbound.conf.html");
}