summaryrefslogtreecommitdiffstats
path: root/src/kdc/dispatch.c
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>2012-09-11 22:59:35 -0400
committerTom Yu <tlyu@mit.edu>2012-10-15 19:41:14 -0400
commitcabd57b398bb10098df2fe7bdb5600671825415c (patch)
treec91f3bb7185da0e69e6fb2e7275e64a3caa99c90 /src/kdc/dispatch.c
parent0a2f14f752c32a24200363cc6b6ae64a92f81379 (diff)
downloadkrb5-cabd57b398bb10098df2fe7bdb5600671825415c.tar.gz
krb5-cabd57b398bb10098df2fe7bdb5600671825415c.tar.xz
krb5-cabd57b398bb10098df2fe7bdb5600671825415c.zip
Move KDC PRNG reseed logic to a helper function
Diffstat (limited to 'src/kdc/dispatch.c')
-rw-r--r--src/kdc/dispatch.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/kdc/dispatch.c b/src/kdc/dispatch.c
index 68c67f4d55..3a169ebc7f 100644
--- a/src/kdc/dispatch.c
+++ b/src/kdc/dispatch.c
@@ -90,6 +90,34 @@ 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,
@@ -97,7 +125,6 @@ dispatch(void *cb, struct sockaddr *local_saddr,
{
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;
@@ -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)) {