c818d75cfa1d1d1739d6464e63cbcf91eb463391
[platform/upstream/libnice.git] / random / random.c
1 /*
2  * This file is part of the Nice GLib ICE library.
3  *
4  * (C) 2006-2008 Collabora Ltd.
5  *  Contact: Dafydd Harries
6  * (C) 2006-2008 Nokia Corporation. All rights reserved.
7  *  Contact: Kai Vehmanen
8  *
9  * The contents of this file are subject to the Mozilla Public License Version
10  * 1.1 (the "License"); you may not use this file except in compliance with
11  * the License. You may obtain a copy of the License at
12  * http://www.mozilla.org/MPL/
13  *
14  * Software distributed under the License is distributed on an "AS IS" basis,
15  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16  * for the specific language governing rights and limitations under the
17  * License.
18  *
19  * The Original Code is the Nice GLib ICE library.
20  *
21  * The Initial Developers of the Original Code are Collabora Ltd and Nokia
22  * Corporation. All Rights Reserved.
23  *
24  * Contributors:
25  *   Dafydd Harries, Collabora Ltd.
26  *   Youness Alaoui, Collabora Ltd.
27  *   Kai Vehmanen, Nokia
28  *
29  * Alternatively, the contents of this file may be used under the terms of the
30  * the GNU Lesser General Public License Version 2.1 (the "LGPL"), in which
31  * case the provisions of LGPL are applicable instead of those above. If you
32  * wish to allow use of your version of this file only under the terms of the
33  * LGPL and not to allow others to use your version of this file under the
34  * MPL, indicate your decision by deleting the provisions above and replace
35  * them with the notice and other provisions required by the LGPL. If you do
36  * not delete the provisions above, a recipient may use your version of this
37  * file under either the MPL or the LGPL.
38  */
39 #ifdef HAVE_CONFIG_H
40 # include "config.h"
41 #endif
42
43 #include <string.h>
44
45 #include "random.h"
46 #include "random-glib.h"
47
48 static NiceRNG * (*nice_rng_new_func) (void) = NULL;
49
50 /* 
51  * Creates a new random number generator instance.
52  */
53 NiceRNG *
54 nice_rng_new (void)
55 {
56   if (nice_rng_new_func == NULL)
57     return nice_rng_glib_new ();
58   else
59     return nice_rng_new_func ();
60 }
61
62 /*
63  * Sets a new generator function.
64  */
65 void
66 nice_rng_set_new_func (NiceRNG * (*func) (void))
67 {
68   nice_rng_new_func = func;
69 }
70
71 /*
72  * Frees the random number generator instance.
73  *
74  * @param rng context
75  */
76 void
77 nice_rng_free (NiceRNG *rng)
78 {
79   rng->free (rng);
80 }
81
82 /*
83  * Generates random octets.
84  *
85  * @param rng context
86  * @param len number of octets to product
87  * @param buf buffer to store the results
88  */
89 void
90 nice_rng_generate_bytes (NiceRNG *rng, guint len, gchar *buf)
91 {
92   rng->generate_bytes (rng, len, buf);
93 }
94
95 /*
96  * Generates a random unsigned integer.
97  * 
98  * @param rng context
99  * @param low closed lower bound
100  * @param high open upper bound
101  */
102 guint
103 nice_rng_generate_int (NiceRNG *rng, guint low, guint high)
104 {
105   return rng->generate_int (rng, low, high);
106 }
107
108 /*
109  * Generates a stream of octets containing only characters
110  * with ASCII codecs of 0x41-5A (A-Z), 0x61-7A (a-z), 
111  * 0x30-39 (0-9), 0x2b (+) and 0x2f (/). This matches 
112  * the definition of 'ice-char' in ICE Ispecification,
113  * section 15.1 (ID-16).
114  *
115  * @param rng context
116  * @param len number of octets to product
117  * @param buf buffer to store the results
118  */
119 void
120 nice_rng_generate_bytes_print (NiceRNG *rng, guint len, gchar *buf)
121 {
122   guint i;
123   const gchar *chars =
124     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
125     "abcdefghijklmnopqrstuvwxyz"
126     "0123456789"
127     "+/";
128
129   for (i = 0; i < len; i++)
130     buf[i] = chars[nice_rng_generate_int (rng, 0, strlen (chars))];
131 }
132