}
dnscrypt_header = (struct dnscrypt_query_header *)sldns_buffer_begin(buffer);
for (i = 0U; i < dnscenv->signed_certs_count; i++) {
+ if(!certs[i].keypair)
+ continue;
if (memcmp(certs[i].magic_query, dnscrypt_header->magic_query,
DNSCRYPT_MAGIC_HEADER_LEN) == 0) {
return &certs[i];
sizeof *env->keypairs);
env->certs = sodium_allocarray(env->signed_certs_count,
sizeof *env->certs);
+ memset(env->certs, 0, env->signed_certs_count * sizeof(*env->certs));
cert_id = 0U;
keypair_id = 0U;
int
dnsc_apply_cfg(struct dnsc_env *env, struct config_file *cfg)
{
+ int nkeys;
if(dnsc_parse_certs(env, cfg) <= 0) {
fatal_exit("dnsc_apply_cfg: no cert file loaded");
}
- if(dnsc_parse_keys(env, cfg) <= 0) {
+ nkeys = dnsc_parse_keys(env, cfg);
+ if(nkeys <= 0) {
fatal_exit("dnsc_apply_cfg: no key file loaded");
}
+ if((size_t)nkeys < env->signed_certs_count) {
+ fatal_exit("dnsc_apply_cfg: %u dnscrypt-provider-cert file(s) have no "
+ "matching dnscrypt-secret-key",
+ (unsigned)(env->signed_certs_count - (size_t)nkeys));
+ }
randombytes_buf(env->hash_key, sizeof env->hash_key);
env->provider_name = cfg->dnscrypt_provider;