Hi,

In general it is a bad idea to use one random secret for two things.
The inet PCB uses one hash with local and foreign addresses, and
one with local port numbers.  Give both hashes separate keys.  Also
document the struct fields.

ok?

bluhm

Index: netinet/in_pcb.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.c,v
retrieving revision 1.244
diff -u -p -r1.244 in_pcb.c
--- netinet/in_pcb.c    13 Sep 2018 19:53:58 -0000      1.244
+++ netinet/in_pcb.c    13 Sep 2018 20:53:22 -0000
@@ -148,7 +148,7 @@ in_pcblhash(struct inpcbtable *table, in
        SIPHASH_CTX ctx;
        u_int32_t nrdom = htonl(rdom);
 
-       SipHash24_Init(&ctx, &table->inpt_key);
+       SipHash24_Init(&ctx, &table->inpt_lkey);
        SipHash24_Update(&ctx, &nrdom, sizeof(nrdom));
        SipHash24_Update(&ctx, &lport, sizeof(lport));
 
@@ -171,6 +171,7 @@ in_pcbinit(struct inpcbtable *table, int
        table->inpt_count = 0;
        table->inpt_size = hashsize;
        arc4random_buf(&table->inpt_key, sizeof(table->inpt_key));
+       arc4random_buf(&table->inpt_lkey, sizeof(table->inpt_lkey));
 }
 
 /*
@@ -999,6 +1000,7 @@ in_pcbresize(struct inpcbtable *table, i
        table->inpt_lmask = nlmask;
        table->inpt_size = hashsize;
        arc4random_buf(&table->inpt_key, sizeof(table->inpt_key));
+       arc4random_buf(&table->inpt_lkey, sizeof(table->inpt_lkey));
 
        TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
                in_pcbrehash(inp);
Index: netinet/in_pcb.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.h,v
retrieving revision 1.111
diff -u -p -r1.111 in_pcb.h
--- netinet/in_pcb.h    13 Sep 2018 19:53:58 -0000      1.111
+++ netinet/in_pcb.h    13 Sep 2018 21:09:33 -0000
@@ -90,10 +90,10 @@ union inpaddru {
  * control block.
  */
 struct inpcb {
-       LIST_ENTRY(inpcb) inp_hash;
-       LIST_ENTRY(inpcb) inp_lhash;            /* extra hash for lport */
-       TAILQ_ENTRY(inpcb) inp_queue;
-       struct    inpcbtable *inp_table;
+       LIST_ENTRY(inpcb) inp_hash;             /* local and foreign hash */
+       LIST_ENTRY(inpcb) inp_lhash;            /* locol port hash */
+       TAILQ_ENTRY(inpcb) inp_queue;           /* inet PCB queue */
+       struct    inpcbtable *inp_table;        /* inet queue/hash table */
        union     inpaddru inp_faddru;          /* Foreign address. */
        union     inpaddru inp_laddru;          /* Local address. */
 #define        inp_faddr       inp_faddru.iau_a4u.inaddr
@@ -149,11 +149,12 @@ struct inpcb {
 LIST_HEAD(inpcbhead, inpcb);
 
 struct inpcbtable {
-       TAILQ_HEAD(inpthead, inpcb) inpt_queue;
-       struct inpcbhead *inpt_hashtbl, *inpt_lhashtbl;
-       SIPHASH_KEY inpt_key;
-       u_long    inpt_mask, inpt_lmask;
-       int       inpt_count, inpt_size;
+       TAILQ_HEAD(inpthead, inpcb) inpt_queue; /* inet PCB queue */
+       struct  inpcbhead *inpt_hashtbl;        /* local and foreign hash */
+       struct  inpcbhead *inpt_lhashtbl;       /* local port hash */
+       SIPHASH_KEY inpt_key, inpt_lkey;        /* secrets for hashes */
+       u_long  inpt_mask, inpt_lmask;          /* hash masks */
+       int     inpt_count, inpt_size;          /* queue count, hash size */
 };
 
 /* flags in inp_flags: */

Reply via email to