]> git.ipfire.org Git - thirdparty/strongswan.git/blob - src/libstrongswan/plugins/random/random_plugin.c
lib: All settings use configured namespace
[thirdparty/strongswan.git] / src / libstrongswan / plugins / random / random_plugin.c
1 /*
2 * Copyright (C) 2008 Martin Willi
3 * Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "random_plugin.h"
17
18 #include <unistd.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 #include <fcntl.h>
22 #include <errno.h>
23
24 #include <library.h>
25 #include <utils/debug.h>
26 #include "random_rng.h"
27
28 #ifndef DEV_RANDOM
29 # define DEV_RANDOM "/dev/random"
30 #endif
31
32 #ifndef DEV_URANDOM
33 # define DEV_URANDOM "/dev/urandom"
34 #endif
35
36 typedef struct private_random_plugin_t private_random_plugin_t;
37
38 /**
39 * private data of random_plugin
40 */
41 struct private_random_plugin_t {
42
43 /**
44 * public functions
45 */
46 random_plugin_t public;
47 };
48
49 /** /dev/random file descriptor */
50 static int dev_random = -1;
51 /** /dev/urandom file descriptor */
52 static int dev_urandom = -1;
53
54 /** Is strong randomness equivalent to true randomness? */
55 static bool strong_equals_true = FALSE;
56
57 /**
58 * See header.
59 */
60 int random_plugin_get_dev_random()
61 {
62 return dev_random;
63 }
64
65 /**
66 * See header.
67 */
68 int random_plugin_get_dev_urandom()
69 {
70 return dev_urandom;
71 }
72
73 /**
74 * See header.
75 */
76 bool random_plugin_get_strong_equals_true()
77 {
78 return strong_equals_true;
79 }
80
81 /**
82 * Open a random device file
83 */
84 static bool open_dev(char *file, int *fd)
85 {
86 *fd = open(file, O_RDONLY);
87 if (*fd == -1)
88 {
89 DBG1(DBG_LIB, "opening \"%s\" failed: %s", file, strerror(errno));
90 return FALSE;
91 }
92 return TRUE;
93 }
94
95 METHOD(plugin_t, get_name, char*,
96 private_random_plugin_t *this)
97 {
98 return "random";
99 }
100
101 METHOD(plugin_t, get_features, int,
102 private_random_plugin_t *this, plugin_feature_t *features[])
103 {
104 static plugin_feature_t f[] = {
105 PLUGIN_REGISTER(RNG, random_rng_create),
106 PLUGIN_PROVIDE(RNG, RNG_STRONG),
107 PLUGIN_PROVIDE(RNG, RNG_TRUE),
108 };
109 *features = f;
110 return countof(f);
111 }
112
113 METHOD(plugin_t, destroy, void,
114 private_random_plugin_t *this)
115 {
116 if (dev_random != -1)
117 {
118 close(dev_random);
119 }
120 if (dev_urandom != -1)
121 {
122 close(dev_urandom);
123 }
124 free(this);
125 }
126
127 /*
128 * see header file
129 */
130 plugin_t *random_plugin_create()
131 {
132 private_random_plugin_t *this;
133 char *urandom_file, *random_file;
134
135 INIT(this,
136 .public = {
137 .plugin = {
138 .get_name = _get_name,
139 .get_features = _get_features,
140 .destroy = _destroy,
141 },
142 },
143 );
144
145 strong_equals_true = lib->settings->get_bool(lib->settings,
146 "%s.plugins.random.strong_equals_true", FALSE, lib->ns);
147 urandom_file = lib->settings->get_str(lib->settings,
148 "%s.plugins.random.urandom", DEV_URANDOM, lib->ns);
149 random_file = lib->settings->get_str(lib->settings,
150 "%s.plugins.random.random", DEV_RANDOM, lib->ns);
151 if (!open_dev(urandom_file, &dev_urandom) ||
152 !open_dev(random_file, &dev_random))
153 {
154 destroy(this);
155 return NULL;
156 }
157
158 return &this->public.plugin;
159 }
160