I have more questions. Wietse Venema: > Viktor Dukhovni: > > state->client_start_props->fd = state->ciphertext_fd; > > /* These predicates and warning belong inside tls_client_start(). */ > > if (!tls_dane_avail() /* mandatory side effects!! */ > > - &&TLS_DANE_BASED(state->client_start_props->tls_level)) > > + && TLS_DANE_HASTA(state->client_start_props->dane)) > > msg_warn("%s: DANE requested, but not available", > > state->client_start_props->namaddr);
Should there be a warning when tls_dane_avail() fails AND the TLS_DANE_BASED is true? Would the following be more correct: int missing_infrastructure = 0; if (!tls_dane_avail()) { /* mandatory side effects!! */ /* True DANE request. */ if (TLS_DANE_BASED(state->client_start_props->tls_level)) { msg_warn("%s: DANE requested, but not available", state->client_start_props->namaddr); missing_infrastructure = 1; } /* Not DANE, but TA support implicitly dependss on the DANE stack. */ else if (TLS_DANE_HASTA(state->client_start_props->dane)) { msg_warn("%s: TA support requested, but DANE is not available", state->client_start_props->namaddr); missing_infrastructure = 1; } ) if (missing_infrastructure == 0) state->tls_context = tls_client_start(state->client_start_props); Sorry that the above looks like "my first program" but it is the best I can do given the libtls API semantics. But wait, there is more... > > state->appl_state = tlsp_client_init(state->tls_params, > > state->client_init_props, > > - TLS_DANE_BASED(state->client_start_props->tls_level)); > > + TLS_DANE_HASTA(state->client_start_props->dane)); Will this also use the right verify callback function pointer when real DANE is requested? Or does real DANE not use those same callbacks? Wietse