Skip to content

Commit

Permalink
Move KDC PRNG reseed logic to a helper function
Browse files Browse the repository at this point in the history
  • Loading branch information
tlyu committed Oct 15, 2012
1 parent 0a2f14f commit cabd57b
Showing 1 changed file with 29 additions and 20 deletions.
49 changes: 29 additions & 20 deletions src/kdc/dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,41 @@ finish_dispatch_cache(void *arg, krb5_error_code code, krb5_data *response)
finish_dispatch(state, code, response);
}

static void
reseed_random(krb5_context kdc_err_context)
{
krb5_error_code retval;
krb5_int32 now, now_usec;
krb5_int32 usec_difference;
krb5_data data;

retval = krb5_crypto_us_timeofday(&now, &now_usec);
if (retval == 0) {
usec_difference = now_usec - last_usec;
if (last_os_random == 0)
last_os_random = now;
/* Grab random data from OS every hour*/
if (now-last_os_random >= 60 * 60) {
krb5_c_random_os_entropy(kdc_err_context, 0, NULL);
last_os_random = now;
}

data.length = sizeof(krb5_int32);
data.data = (void *)&usec_difference;

krb5_c_random_add_entropy(kdc_err_context,
KRB5_C_RANDSOURCE_TIMING, &data);
last_usec = now_usec;
}
}

void
dispatch(void *cb, struct sockaddr *local_saddr,
const krb5_fulladdr *from, krb5_data *pkt, int is_tcp,
verto_ctx *vctx, loop_respond_fn respond, void *arg)
{
krb5_error_code retval;
krb5_kdc_req *as_req;
krb5_int32 now, now_usec;
krb5_data *response = NULL;
struct dispatch_state *state;
struct server_handle *handle = cb;
Expand Down Expand Up @@ -145,26 +172,8 @@ dispatch(void *cb, struct sockaddr *local_saddr,
* is currently being processed. */
kdc_insert_lookaside(kdc_err_context, pkt, NULL);
#endif
reseed_random(kdc_err_context);

retval = krb5_crypto_us_timeofday(&now, &now_usec);
if (retval == 0) {
krb5_int32 usec_difference = now_usec-last_usec;
krb5_data data;
if(last_os_random == 0)
last_os_random = now;
/* Grab random data from OS every hour*/
if(now-last_os_random >= 60*60) {
krb5_c_random_os_entropy(kdc_err_context, 0, NULL);
last_os_random = now;
}

data.length = sizeof(krb5_int32);
data.data = (void *) &usec_difference;

krb5_c_random_add_entropy(kdc_err_context,
KRB5_C_RANDSOURCE_TIMING, &data);
last_usec = now_usec;
}
/* try TGS_REQ first; they are more common! */

if (krb5_is_tgs_req(pkt)) {
Expand Down

0 comments on commit cabd57b

Please sign in to comment.