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-2005 OpenVPN Solutions LLC <info@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
26 #include "config-win32.h"
41 hash_init (const int n_buckets
,
42 uint32_t (*hash_function
)(const void *key
, uint32_t iv
),
43 bool (*compare_function
)(const void *key1
, const void *key2
))
48 ASSERT (n_buckets
> 0);
49 ALLOC_OBJ_CLEAR (h
, struct hash
);
50 h
->n_buckets
= (int) adjust_power_of_2 (n_buckets
);
51 h
->mask
= h
->n_buckets
- 1;
52 h
->hash_function
= hash_function
;
53 h
->compare_function
= compare_function
;
54 h
->iv
= get_random ();
55 ALLOC_ARRAY (h
->buckets
, struct hash_bucket
, h
->n_buckets
);
56 for (i
= 0; i
< h
->n_buckets
; ++i
)
58 struct hash_bucket
*b
= &h
->buckets
[i
];
60 mutex_init (&b
->mutex
);
66 hash_free (struct hash
*hash
)
69 for (i
= 0; i
< hash
->n_buckets
; ++i
)
71 struct hash_bucket
*b
= &hash
->buckets
[i
];
72 struct hash_element
*he
= b
->list
;
74 mutex_destroy (&b
->mutex
);
77 struct hash_element
*next
= he
->next
;
87 hash_lookup_fast (struct hash
*hash
,
88 struct hash_bucket
*bucket
,
92 struct hash_element
*he
;
93 struct hash_element
*prev
= NULL
;
99 if (hv
== he
->hash_value
&& (*hash
->compare_function
)(key
, he
->key
))
101 /* move to head of list */
104 prev
->next
= he
->next
;
105 he
->next
= bucket
->list
;
118 hash_remove_fast (struct hash
*hash
,
119 struct hash_bucket
*bucket
,
123 struct hash_element
*he
;
124 struct hash_element
*prev
= NULL
;
130 if (hv
== he
->hash_value
&& (*hash
->compare_function
)(key
, he
->key
))
133 prev
->next
= he
->next
;
135 bucket
->list
= he
->next
;
147 hash_add (struct hash
*hash
, const void *key
, void *value
, bool replace
)
150 struct hash_bucket
*bucket
;
151 struct hash_element
*he
;
154 hv
= hash_value (hash
, key
);
155 bucket
= &hash
->buckets
[hv
& hash
->mask
];
156 mutex_lock (&bucket
->mutex
);
158 if ((he
= hash_lookup_fast (hash
, bucket
, key
, hv
))) /* already exists? */
168 hash_add_fast (hash
, bucket
, key
, hv
, value
);
172 mutex_unlock (&bucket
->mutex
);
178 hash_remove_by_value (struct hash
*hash
, void *value
, bool autolock
)
180 struct hash_iterator hi
;
181 struct hash_element
*he
;
183 hash_iterator_init (hash
, &hi
, autolock
);
184 while ((he
= hash_iterator_next (&hi
)))
186 if (he
->value
== value
)
187 hash_iterator_delete_element (&hi
);
189 hash_iterator_free (&hi
);
193 hash_remove_marked (struct hash
*hash
, struct hash_bucket
*bucket
)
195 struct hash_element
*prev
= NULL
;
196 struct hash_element
*he
= bucket
->list
;
200 if (!he
->key
) /* marked? */
202 struct hash_element
*newhe
;
204 newhe
= prev
->next
= he
->next
;
206 newhe
= bucket
->list
= he
->next
;
220 void_ptr_hash_function (const void *key
, uint32_t iv
)
222 return hash_func ((const void *)&key
, sizeof (key
), iv
);
226 void_ptr_compare_function (const void *key1
, const void *key2
)
232 hash_iterator_init_range (struct hash
*hash
,
233 struct hash_iterator
*hi
,
238 if (end_bucket
> hash
->n_buckets
)
239 end_bucket
= hash
->n_buckets
;
241 ASSERT (start_bucket
>= 0 && start_bucket
<= end_bucket
);
246 hi
->autolock
= autolock
;
248 hi
->bucket_marked
= false;
249 hi
->bucket_index_start
= start_bucket
;
250 hi
->bucket_index_end
= end_bucket
;
251 hi
->bucket_index
= hi
->bucket_index_start
- 1;
255 hash_iterator_init (struct hash
*hash
,
256 struct hash_iterator
*hi
,
259 hash_iterator_init_range (hash
, hi
, autolock
, 0, hash
->n_buckets
);
263 hash_iterator_lock (struct hash_iterator
*hi
, struct hash_bucket
*b
)
267 mutex_lock (&b
->mutex
);
271 hi
->bucket_marked
= false;
275 hash_iterator_unlock (struct hash_iterator
*hi
)
279 if (hi
->bucket_marked
)
281 hash_remove_marked (hi
->hash
, hi
->bucket
);
282 hi
->bucket_marked
= false;
286 mutex_unlock (&hi
->bucket
->mutex
);
294 hash_iterator_advance (struct hash_iterator
*hi
)
297 hi
->elem
= hi
->elem
->next
;
301 hash_iterator_free (struct hash_iterator
*hi
)
303 hash_iterator_unlock (hi
);
306 struct hash_element
*
307 hash_iterator_next (struct hash_iterator
*hi
)
309 struct hash_element
*ret
= NULL
;
313 hash_iterator_advance (hi
);
317 while (++hi
->bucket_index
< hi
->bucket_index_end
)
319 struct hash_bucket
*b
;
320 hash_iterator_unlock (hi
);
321 b
= &hi
->hash
->buckets
[hi
->bucket_index
];
324 hash_iterator_lock (hi
, b
);
329 hash_iterator_advance (hi
);
339 hash_iterator_delete_element (struct hash_iterator
*hi
)
342 hi
->last
->key
= NULL
;
343 hi
->bucket_marked
= true;
350 * Test the hash code by implementing a simple
351 * word frequency algorithm.
361 word_hash_function (const void *key
, uint32_t iv
)
363 const char *str
= (const char *) key
;
364 const int len
= strlen (str
);
365 return hash_func ((const uint8_t *)str
, len
, iv
);
369 word_compare_function (const void *key1
, const void *key2
)
371 return strcmp ((const char *)key1
, (const char *)key2
) == 0;
375 print_nhash (struct hash
*hash
)
377 struct hash_iterator hi
;
378 struct hash_element
*he
;
381 hash_iterator_init (hash
, &hi
, true);
383 while ((he
= hash_iterator_next (&hi
)))
385 printf ("%d ", (int) he
->value
);
390 hash_iterator_free (&hi
);
391 ASSERT (count
== hash_n_elements (hash
));
395 rmhash (struct hash
*hash
, const char *word
)
397 hash_remove (hash
, word
);
403 openvpn_thread_init ();
406 struct gc_arena gc
= gc_new ();
407 struct hash
*hash
= hash_init (10000, word_hash_function
, word_compare_function
);
408 struct hash
*nhash
= hash_init (256, word_hash_function
, word_compare_function
);
410 printf ("hash_init n_buckets=%d mask=0x%08x\n", hash
->n_buckets
, hash
->mask
);
412 /* parse words from stdin */
421 if (!fgets(buf
, sizeof(buf
), stdin
))
428 if (isalnum (c
) || c
== '_')
430 ASSERT (wbi
< (int) sizeof (wordbuf
));
438 ASSERT (wbi
< (int) sizeof (wordbuf
));
439 wordbuf
[wbi
++] = '\0';
441 /* word is parsed from stdin */
443 /* does it already exist in table? */
444 w
= (struct word
*) hash_lookup (hash
, wordbuf
);
448 /* yes, increment count */
453 /* no, make a new object */
454 ALLOC_OBJ_GC (w
, struct word
, &gc
);
455 w
->word
= string_alloc (wordbuf
, &gc
);
457 ASSERT (hash_add (hash
, w
->word
, w
, false));
458 ASSERT (hash_add (nhash
, w
->word
, (void*) ((random() & 0x0F) + 1), false));
467 /* remove some words from the table */
469 rmhash (hash
, "true");
470 rmhash (hash
, "false");
474 /* output contents of hash table */
480 for (base
= 0; base
< hash_n_buckets (hash
); base
+= inc
) {
481 struct hash_iterator hi
;
482 struct hash_element
*he
;
483 inc
= (get_random () % 3) + 1;
484 hash_iterator_init_range (hash
, &hi
, true, base
, base
+ inc
);
486 while ((he
= hash_iterator_next (&hi
)))
488 struct word
*w
= (struct word
*) he
->value
;
489 printf ("%6d '%s'\n", w
->n
, w
->word
);
493 hash_iterator_free (&hi
);
495 ASSERT (count
== hash_n_elements (hash
));
499 /* test hash_remove_by_value function */
502 for (i
= 1; i
<= 16; ++i
)
504 printf ("[%d] ***********************************\n", i
);
506 hash_remove_by_value (nhash
, (void *) i
, true);
508 printf ("FINAL **************************\n");
518 openvpn_thread_cleanup ();
524 --------------------------------------------------------------------
525 hash() -- hash a variable-length key into a 32-bit value
526 k : the key (the unaligned variable-length array of bytes)
527 len : the length of the key, counting by bytes
528 level : can be any 4-byte value
529 Returns a 32-bit value. Every bit of the key affects every bit of
530 the return value. Every 1-bit and 2-bit delta achieves avalanche.
531 About 36+6len instructions.
533 The best hash table sizes are powers of 2. There is no need to do
534 mod a prime (mod is sooo slow!). If you need less than 32 bits,
535 use a bitmask. For example, if you need only 10 bits, do
536 h = (h & hashmask(10));
537 In which case, the hash table should have hashsize(10) elements.
539 If you are hashing n strings (uint8_t **)k, do it like this:
540 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
542 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
543 code any way you wish, private, educational, or commercial. It's free.
545 See http://burlteburtle.net/bob/hash/evahash.html
546 Use for hash table lookup, or anything where one collision in 2^32 is
547 acceptable. Do NOT use for cryptographic purposes.
549 --------------------------------------------------------------------
551 mix -- mix 3 32-bit values reversibly.
552 For every delta with one or two bit set, and the deltas of all three
553 high bits or all three low bits, whether the original value of a,b,c
554 is almost all zero or is uniformly distributed,
555 * If mix() is run forward or backward, at least 32 bits in a,b,c
556 have at least 1/4 probability of changing.
557 * If mix() is run forward, every bit of c will change between 1/3 and
558 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
559 mix() was built out of 36 single-cycle latency instructions in a
560 structure that could supported 2x parallelism, like so:
568 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
569 of that parallelism. They've also turned some of those single-cycle
570 latency instructions into multi-cycle latency instructions. Still,
571 this is the fastest good hash I could find. There were about 2^^68
572 to choose from. I only looked at a billion or so.
576 * This function is faster than it looks, and appears to be
577 appropriate for our usage in OpenVPN which is primarily
578 for hash-table based address lookup (IPv4, IPv6, and Ethernet MAC).
579 NOTE: This function is never used for cryptographic purposes, only
580 to produce evenly-distributed indexes into hash tables.
582 * Benchmark results: 11.39 machine cycles per byte on a P2 266Mhz,
583 and 12.1 machine cycles per byte on a
584 2.2 Ghz P4 when hashing a 6 byte string.
585 --------------------------------------------------------------------
590 a -= b; a -= c; a ^= (c>>13); \
591 b -= c; b -= a; b ^= (a<<8); \
592 c -= a; c -= b; c ^= (b>>13); \
593 a -= b; a -= c; a ^= (c>>12); \
594 b -= c; b -= a; b ^= (a<<16); \
595 c -= a; c -= b; c ^= (b>>5); \
596 a -= b; a -= c; a ^= (c>>3); \
597 b -= c; b -= a; b ^= (a<<10); \
598 c -= a; c -= b; c ^= (b>>15); \
602 hash_func (const uint8_t *k
, uint32_t length
, uint32_t initval
)
604 uint32_t a
, b
, c
, len
;
606 /* Set up the internal state */
608 a
= b
= 0x9e3779b9; /* the golden ratio; an arbitrary value */
609 c
= initval
; /* the previous hash value */
611 /*---------------------------------------- handle most of the key */
614 a
+= (k
[0] + ((uint32_t) k
[1] << 8)
615 + ((uint32_t) k
[2] << 16)
616 + ((uint32_t) k
[3] << 24));
617 b
+= (k
[4] + ((uint32_t) k
[5] << 8)
618 + ((uint32_t) k
[6] << 16)
619 + ((uint32_t) k
[7] << 24));
620 c
+= (k
[8] + ((uint32_t) k
[9] << 8)
621 + ((uint32_t) k
[10] << 16)
622 + ((uint32_t) k
[11] << 24));
628 /*------------------------------------- handle the last 11 bytes */
630 switch (len
) /* all the case statements fall through */
633 c
+= ((uint32_t) k
[10] << 24);
635 c
+= ((uint32_t) k
[9] << 16);
637 c
+= ((uint32_t) k
[8] << 8);
638 /* the first byte of c is reserved for the length */
640 b
+= ((uint32_t) k
[7] << 24);
642 b
+= ((uint32_t) k
[6] << 16);
644 b
+= ((uint32_t) k
[5] << 8);
648 a
+= ((uint32_t) k
[3] << 24);
650 a
+= ((uint32_t) k
[2] << 16);
652 a
+= ((uint32_t) k
[1] << 8);
655 /* case 0: nothing left to add */
658 /*-------------------------------------- report the result */
663 static void dummy(void) {}
664 #endif /* P2MP_SERVER */