--- a/sys/vfs/ufs/ffs_alloc.c +++ b/sys/vfs/ufs/ffs_alloc.c @@ -639,7 +639,7 @@ * Set up a new generation number for this inode. */ if (ip->i_gen == 0 || ++ip->i_gen == 0) - ip->i_gen = krandom() / 2 + 1; + ip->i_gen = ((uint32_t)karc4random() >> 1) + 1; return (0); noinodes: ffs_fserr(fs, cred->cr_uid, "out of inodes"); --- a/sys/vfs/ufs/ffs_vfsops.c +++ b/sys/vfs/ufs/ffs_vfsops.c @@ -1172,7 +1172,7 @@ * already have one. This should only happen on old filesystems. */ if (ip->i_gen == 0) { - ip->i_gen = krandom() / 2 + 1; + ip->i_gen = ((uint32_t)karc4random() >> 1) + 1; if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0) ip->i_flag |= IN_MODIFIED; } --- a/sys/vfs/ext2fs/ext2_vfsops.c +++ b/sys/vfs/ext2fs/ext2_vfsops.c @@ -1418,7 +1418,7 @@ * already have one. This should only happen on old filesystems. */ if (ip->i_gen == 0) { - ip->i_gen = krandom() / 2 + 1; + ip->i_gen = ((uint32_t)karc4random() >> 1) + 1; if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0) ip->i_flag |= IN_MODIFIED; } --- a/sys/netinet6/frag6.c +++ b/sys/netinet6/frag6.c @@ -94,17 +94,10 @@ void frag6_init(void) { - struct timeval tv; - ip6_maxfragpackets = nmbclusters / 4; ip6_maxfrags = nmbclusters / 4; - /* - * in many cases, random() here does NOT return random number - * as initialization during bootstrap time occur in fixed order. - */ - microtime(&tv); - ip6_id = krandom() ^ tv.tv_usec; + ip6_id = karc4random(); ip6q.ip6q_next = ip6q.ip6q_prev = &ip6q; netmsg_init(&frag6_drain_nmsg, NULL, &netisr_adone_rport, --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -750,7 +750,7 @@ } else { struct mbuf **mnext, *m_frgpart; struct ip6_frag *ip6f; - u_int32_t id = htonl(ip6_id++); + u_int32_t id = htonl(karc4random()); u_char nextproto; /* --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -151,7 +151,6 @@ { struct protosw *pr; int i; - struct timeval tv; pr = pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW); if (pr == NULL) @@ -176,14 +175,8 @@ addrsel_policy_init(); nd6_init(); frag6_init(); - /* - * in many cases, random() here does NOT return random number - * as initialization during bootstrap time occur in fixed order. - */ - microtime(&tv); - ip6_flow_seq = krandom() ^ tv.tv_usec; - microtime(&tv); - ip6_desync_factor = (krandom() ^ tv.tv_usec) % MAX_TEMP_DESYNC_FACTOR; + ip6_flow_seq = karc4random(); + ip6_desync_factor = karc4random() % MAX_TEMP_DESYNC_FACTOR; } static void --- a/sys/netinet6/in6_ifattach.c +++ b/sys/netinet6/in6_ifattach.c @@ -133,7 +133,6 @@ MD5_CTX ctxt; u_int8_t seed[16], digest[16], nullbuf[8]; u_int32_t val32; - struct timeval tv; /* If there's no hisotry, start with a random seed. */ bzero(nullbuf, sizeof(nullbuf)); @@ -141,8 +140,7 @@ int i; for (i = 0; i < 2; i++) { - microtime(&tv); - val32 = krandom() ^ tv.tv_usec; + val32 = karc4random(); bcopy(&val32, seed + sizeof(val32) * i, sizeof(val32)); } } else { @@ -185,8 +183,7 @@ log(LOG_INFO, "generate_tmp_ifid: computed MD5 value is zero.\n"); - microtime(&tv); - val32 = krandom() ^ tv.tv_usec; + val32 = karc4random(); val32 = 1 + (val32 % (0xffffffff - 1)); } --- a/sys/vfs/nfs/nfsm_subs.c +++ b/sys/vfs/nfs/nfsm_subs.c @@ -101,8 +101,6 @@ #include -static u_int32_t nfs_xid = 0; - /* * Create the header for an rpc request packet * The hsiz is the size of the rest of the nfs request header. @@ -154,12 +152,9 @@ */ tl = nfsm_build(&info, 8 * NFSX_UNSIGNED); - /* Get a pretty random xid to start with */ - if (!nfs_xid) - nfs_xid = krandom(); - + /* Random XID per request (32 bits of arc4). */ do { - xid = atomic_fetchadd_int(&nfs_xid, 1); + xid = karc4random(); } while (xid == 0); *tl++ = *xidp = txdr_unsigned(xid); --- a/sys/net/sppp/if_spppsubr.c +++ b/sys/net/sppp/if_spppsubr.c @@ -1248,7 +1248,7 @@ ++sp->pp_loopcnt; /* Generate new local sequence number */ - sp->pp_seq[IDX_LCP] = krandom(); + sp->pp_seq[IDX_LCP] = karc4random(); break; } sp->pp_loopcnt = 0; @@ -2524,7 +2524,7 @@ if (magic == ~sp->lcp.magic) { if (debug) log(-1, "magic glitch "); - sp->lcp.magic = krandom(); + sp->lcp.magic = karc4random(); } else { sp->lcp.magic = magic; if (debug) @@ -2706,7 +2706,7 @@ if (sp->lcp.opts & (1 << LCP_OPT_MAGIC)) { if (! sp->lcp.magic) - sp->lcp.magic = krandom(); + sp->lcp.magic = karc4random(); opt[i++] = LCP_OPT_MAGIC; opt[i++] = 6; opt[i++] = sp->lcp.magic >> 24; @@ -4256,16 +4256,10 @@ static void sppp_chap_scr(struct sppp *sp) { - u_long *ch, seed; u_char clen; /* Compute random challenge. */ - ch = (u_long *)sp->myauth.challenge; - read_random(&seed, sizeof(seed), 0); - ch[0] = seed ^ krandom(); - ch[1] = seed ^ krandom(); - ch[2] = seed ^ krandom(); - ch[3] = seed ^ krandom(); + karc4random_buf(sp->myauth.challenge, AUTHKEYLEN); clen = AUTHKEYLEN; sp->confid[IDX_CHAP] = ++sp->pp_seq[IDX_CHAP]; --- a/sys/net/ipfw3_nat/ip_fw3_nat.c +++ b/sys/net/ipfw3_nat/ip_fw3_nat.c @@ -436,7 +436,7 @@ pick_alias_port(struct nat_state *s, struct state_tree *tree) { do { - s->alias_port = htons(krandom() % ALIAS_RANGE + ALIAS_BEGIN); + s->alias_port = htons(karc4random() % ALIAS_RANGE + ALIAS_BEGIN); } while (RB_FIND(state_tree, tree, s) != NULL); }