2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
8 * Copyright (C) 2002-2009 OpenVPN Technologies, Inc. <sales@openvpn.net>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program (see the file COPYING included with this
21 * distribution); if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 hash_init (const int n_buckets
,
37 uint32_t (*hash_function
)(const void *key
, uint32_t iv
),
38 bool (*compare_function
)(const void *key1
, const void *key2
))
43 ASSERT (n_buckets
> 0);
44 ALLOC_OBJ_CLEAR (h
, struct hash
);
45 h
->n_buckets
= (int) adjust_power_of_2 (n_buckets
);
46 h
->mask
= h
->n_buckets
- 1;
47 h
->hash_function
= hash_function
;
48 h
->compare_function
= compare_function
;
50 ALLOC_ARRAY (h
->buckets
, struct hash_bucket
, h
->n_buckets
);
51 for (i
= 0; i
< h
->n_buckets
; ++i
)
53 struct hash_bucket
*b
= &h
->buckets
[i
];
55 mutex_init (&b
->mutex
);
61 hash_free (struct hash
*hash
)
64 for (i
= 0; i
< hash
->n_buckets
; ++i
)
66 struct hash_bucket
*b
= &hash
->buckets
[i
];
67 struct hash_element
*he
= b
->list
;
69 mutex_destroy (&b
->mutex
);
72 struct hash_element
*next
= he
->next
;
82 hash_lookup_fast (struct hash
*hash
,
83 struct hash_bucket
*bucket
,
87 struct hash_element
*he
;
88 struct hash_element
*prev
= NULL
;
94 if (hv
== he
->hash_value
&& (*hash
->compare_function
)(key
, he
->key
))
96 /* move to head of list */
99 prev
->next
= he
->next
;
100 he
->next
= bucket
->list
;
113 hash_remove_fast (struct hash
*hash
,
114 struct hash_bucket
*bucket
,
118 struct hash_element
*he
;
119 struct hash_element
*prev
= NULL
;
125 if (hv
== he
->hash_value
&& (*hash
->compare_function
)(key
, he
->key
))
128 prev
->next
= he
->next
;
130 bucket
->list
= he
->next
;
142 hash_add (struct hash
*hash
, const void *key
, void *value
, bool replace
)
145 struct hash_bucket
*bucket
;
146 struct hash_element
*he
;
149 hv
= hash_value (hash
, key
);
150 bucket
= &hash
->buckets
[hv
& hash
->mask
];
151 mutex_lock (&bucket
->mutex
);
153 if ((he
= hash_lookup_fast (hash
, bucket
, key
, hv
))) /* already exists? */
163 hash_add_fast (hash
, bucket
, key
, hv
, value
);
167 mutex_unlock (&bucket
->mutex
);
173 hash_remove_by_value (struct hash
*hash
, void *value
, bool autolock
)
175 struct hash_iterator hi
;
176 struct hash_element
*he
;
178 hash_iterator_init (hash
, &hi
, autolock
);
179 while ((he
= hash_iterator_next (&hi
)))
181 if (he
->value
== value
)
182 hash_iterator_delete_element (&hi
);
184 hash_iterator_free (&hi
);
188 hash_remove_marked (struct hash
*hash
, struct hash_bucket
*bucket
)
190 struct hash_element
*prev
= NULL
;
191 struct hash_element
*he
= bucket
->list
;
195 if (!he
->key
) /* marked? */
197 struct hash_element
*newhe
;
199 newhe
= prev
->next
= he
->next
;
201 newhe
= bucket
->list
= he
->next
;
215 void_ptr_hash_function (const void *key
, uint32_t iv
)
217 return hash_func ((const void *)&key
, sizeof (key
), iv
);
221 void_ptr_compare_function (const void *key1
, const void *key2
)
227 hash_iterator_init_range (struct hash
*hash
,
228 struct hash_iterator
*hi
,
233 if (end_bucket
> hash
->n_buckets
)
234 end_bucket
= hash
->n_buckets
;
236 ASSERT (start_bucket
>= 0 && start_bucket
<= end_bucket
);
241 hi
->autolock
= autolock
;
243 hi
->bucket_marked
= false;
244 hi
->bucket_index_start
= start_bucket
;
245 hi
->bucket_index_end
= end_bucket
;
246 hi
->bucket_index
= hi
->bucket_index_start
- 1;
250 hash_iterator_init (struct hash
*hash
,
251 struct hash_iterator
*hi
,
254 hash_iterator_init_range (hash
, hi
, autolock
, 0, hash
->n_buckets
);
258 hash_iterator_lock (struct hash_iterator
*hi
, struct hash_bucket
*b
)
262 mutex_lock (&b
->mutex
);
266 hi
->bucket_marked
= false;
270 hash_iterator_unlock (struct hash_iterator
*hi
)
274 if (hi
->bucket_marked
)
276 hash_remove_marked (hi
->hash
, hi
->bucket
);
277 hi
->bucket_marked
= false;
281 mutex_unlock (&hi
->bucket
->mutex
);
289 hash_iterator_advance (struct hash_iterator
*hi
)
292 hi
->elem
= hi
->elem
->next
;
296 hash_iterator_free (struct hash_iterator
*hi
)
298 hash_iterator_unlock (hi
);
301 struct hash_element
*
302 hash_iterator_next (struct hash_iterator
*hi
)
304 struct hash_element
*ret
= NULL
;
308 hash_iterator_advance (hi
);
312 while (++hi
->bucket_index
< hi
->bucket_index_end
)
314 struct hash_bucket
*b
;
315 hash_iterator_unlock (hi
);
316 b
= &hi
->hash
->buckets
[hi
->bucket_index
];
319 hash_iterator_lock (hi
, b
);
324 hash_iterator_advance (hi
);
334 hash_iterator_delete_element (struct hash_iterator
*hi
)
337 hi
->last
->key
= NULL
;
338 hi
->bucket_marked
= true;
345 * Test the hash code by implementing a simple
346 * word frequency algorithm.
356 word_hash_function (const void *key
, uint32_t iv
)
358 const char *str
= (const char *) key
;
359 const int len
= strlen (str
);
360 return hash_func ((const uint8_t *)str
, len
, iv
);
364 word_compare_function (const void *key1
, const void *key2
)
366 return strcmp ((const char *)key1
, (const char *)key2
) == 0;
370 print_nhash (struct hash
*hash
)
372 struct hash_iterator hi
;
373 struct hash_element
*he
;
376 hash_iterator_init (hash
, &hi
, true);
378 while ((he
= hash_iterator_next (&hi
)))
380 printf ("%d ", (int) he
->value
);
385 hash_iterator_free (&hi
);
386 ASSERT (count
== hash_n_elements (hash
));
390 rmhash (struct hash
*hash
, const char *word
)
392 hash_remove (hash
, word
);
398 openvpn_thread_init ();
401 struct gc_arena gc
= gc_new ();
402 struct hash
*hash
= hash_init (10000, get_random (), word_hash_function
, word_compare_function
);
403 struct hash
*nhash
= hash_init (256, get_random (), word_hash_function
, word_compare_function
);
405 printf ("hash_init n_buckets=%d mask=0x%08x\n", hash
->n_buckets
, hash
->mask
);
407 /* parse words from stdin */
416 if (!fgets(buf
, sizeof(buf
), stdin
))
423 if (isalnum (c
) || c
== '_')
425 ASSERT (wbi
< (int) sizeof (wordbuf
));
433 ASSERT (wbi
< (int) sizeof (wordbuf
));
434 wordbuf
[wbi
++] = '\0';
436 /* word is parsed from stdin */
438 /* does it already exist in table? */
439 w
= (struct word
*) hash_lookup (hash
, wordbuf
);
443 /* yes, increment count */
448 /* no, make a new object */
449 ALLOC_OBJ_GC (w
, struct word
, &gc
);
450 w
->word
= string_alloc (wordbuf
, &gc
);
452 ASSERT (hash_add (hash
, w
->word
, w
, false));
453 ASSERT (hash_add (nhash
, w
->word
, (void*) ((random() & 0x0F) + 1), false));
462 /* remove some words from the table */
464 rmhash (hash
, "true");
465 rmhash (hash
, "false");
469 /* output contents of hash table */
475 for (base
= 0; base
< hash_n_buckets (hash
); base
+= inc
) {
476 struct hash_iterator hi
;
477 struct hash_element
*he
;
478 inc
= (get_random () % 3) + 1;
479 hash_iterator_init_range (hash
, &hi
, true, base
, base
+ inc
);
481 while ((he
= hash_iterator_next (&hi
)))
483 struct word
*w
= (struct word
*) he
->value
;
484 printf ("%6d '%s'\n", w
->n
, w
->word
);
488 hash_iterator_free (&hi
);
490 ASSERT (count
== hash_n_elements (hash
));
494 /* test hash_remove_by_value function */
497 for (i
= 1; i
<= 16; ++i
)
499 printf ("[%d] ***********************************\n", i
);
501 hash_remove_by_value (nhash
, (void *) i
, true);
503 printf ("FINAL **************************\n");
513 openvpn_thread_cleanup ();
519 --------------------------------------------------------------------
520 hash() -- hash a variable-length key into a 32-bit value
521 k : the key (the unaligned variable-length array of bytes)
522 len : the length of the key, counting by bytes
523 level : can be any 4-byte value
524 Returns a 32-bit value. Every bit of the key affects every bit of
525 the return value. Every 1-bit and 2-bit delta achieves avalanche.
526 About 36+6len instructions.
528 The best hash table sizes are powers of 2. There is no need to do
529 mod a prime (mod is sooo slow!). If you need less than 32 bits,
530 use a bitmask. For example, if you need only 10 bits, do
531 h = (h & hashmask(10));
532 In which case, the hash table should have hashsize(10) elements.
534 If you are hashing n strings (uint8_t **)k, do it like this:
535 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
537 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
538 code any way you wish, private, educational, or commercial. It's free.
540 See http://burlteburtle.net/bob/hash/evahash.html
541 Use for hash table lookup, or anything where one collision in 2^32 is
542 acceptable. Do NOT use for cryptographic purposes.
544 --------------------------------------------------------------------
546 mix -- mix 3 32-bit values reversibly.
547 For every delta with one or two bit set, and the deltas of all three
548 high bits or all three low bits, whether the original value of a,b,c
549 is almost all zero or is uniformly distributed,
550 * If mix() is run forward or backward, at least 32 bits in a,b,c
551 have at least 1/4 probability of changing.
552 * If mix() is run forward, every bit of c will change between 1/3 and
553 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
554 mix() was built out of 36 single-cycle latency instructions in a
555 structure that could supported 2x parallelism, like so:
563 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
564 of that parallelism. They've also turned some of those single-cycle
565 latency instructions into multi-cycle latency instructions. Still,
566 this is the fastest good hash I could find. There were about 2^^68
567 to choose from. I only looked at a billion or so.
571 * This function is faster than it looks, and appears to be
572 appropriate for our usage in OpenVPN which is primarily
573 for hash-table based address lookup (IPv4, IPv6, and Ethernet MAC).
574 NOTE: This function is never used for cryptographic purposes, only
575 to produce evenly-distributed indexes into hash tables.
577 * Benchmark results: 11.39 machine cycles per byte on a P2 266Mhz,
578 and 12.1 machine cycles per byte on a
579 2.2 Ghz P4 when hashing a 6 byte string.
580 --------------------------------------------------------------------
585 a -= b; a -= c; a ^= (c>>13); \
586 b -= c; b -= a; b ^= (a<<8); \
587 c -= a; c -= b; c ^= (b>>13); \
588 a -= b; a -= c; a ^= (c>>12); \
589 b -= c; b -= a; b ^= (a<<16); \
590 c -= a; c -= b; c ^= (b>>5); \
591 a -= b; a -= c; a ^= (c>>3); \
592 b -= c; b -= a; b ^= (a<<10); \
593 c -= a; c -= b; c ^= (b>>15); \
597 hash_func (const uint8_t *k
, uint32_t length
, uint32_t initval
)
599 uint32_t a
, b
, c
, len
;
601 /* Set up the internal state */
603 a
= b
= 0x9e3779b9; /* the golden ratio; an arbitrary value */
604 c
= initval
; /* the previous hash value */
606 /*---------------------------------------- handle most of the key */
609 a
+= (k
[0] + ((uint32_t) k
[1] << 8)
610 + ((uint32_t) k
[2] << 16)
611 + ((uint32_t) k
[3] << 24));
612 b
+= (k
[4] + ((uint32_t) k
[5] << 8)
613 + ((uint32_t) k
[6] << 16)
614 + ((uint32_t) k
[7] << 24));
615 c
+= (k
[8] + ((uint32_t) k
[9] << 8)
616 + ((uint32_t) k
[10] << 16)
617 + ((uint32_t) k
[11] << 24));
623 /*------------------------------------- handle the last 11 bytes */
625 switch (len
) /* all the case statements fall through */
628 c
+= ((uint32_t) k
[10] << 24);
630 c
+= ((uint32_t) k
[9] << 16);
632 c
+= ((uint32_t) k
[8] << 8);
633 /* the first byte of c is reserved for the length */
635 b
+= ((uint32_t) k
[7] << 24);
637 b
+= ((uint32_t) k
[6] << 16);
639 b
+= ((uint32_t) k
[5] << 8);
643 a
+= ((uint32_t) k
[3] << 24);
645 a
+= ((uint32_t) k
[2] << 16);
647 a
+= ((uint32_t) k
[1] << 8);
650 /* case 0: nothing left to add */
653 /*-------------------------------------- report the result */
658 static void dummy(void) {}
659 #endif /* P2MP_SERVER */