From: Ben Pfaff Date: Thu, 12 Aug 2010 22:47:25 +0000 (-0700) Subject: uuid: Break code to read /dev/urandom into a new module. X-Git-Tag: v1.1.0pre1~95 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=e251c8d0050acf8d3f35c91b6d2708fab5314ce7;hp=e2c1a82010cc4f35cb576d41c3c2020010503784;p=sliver-openvswitch.git uuid: Break code to read /dev/urandom into a new module. This code is useful for seeding other random number generators, so we might as well make it a separate source file. --- diff --git a/PORTING b/PORTING index 3b3e15052..5f88c940a 100644 --- a/PORTING +++ b/PORTING @@ -205,9 +205,9 @@ during a port: Miscellaneous Notes ------------------- -lib/uuid.c, used in OVSDB, assumes that it can obtain a high-quality -random number seed at startup by reading from /dev/urandom. You may -need to modify it if this is not true on your platform. +lib/entropy.c assumes that it can obtain high-quality random number +seeds at startup by reading from /dev/urandom. You will need to +modify it if this is not true on your platform. Questions --------- diff --git a/lib/automake.mk b/lib/automake.mk index 16b8d0218..eedb57213 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -40,6 +40,8 @@ lib_libopenvswitch_a_SOURCES = \ lib/dpif.h \ lib/dynamic-string.c \ lib/dynamic-string.h \ + lib/entropy.c \ + lib/entropy.h \ lib/fatal-signal.c \ lib/fatal-signal.h \ lib/flow.c \ diff --git a/lib/entropy.c b/lib/entropy.c new file mode 100644 index 000000000..b844d64ae --- /dev/null +++ b/lib/entropy.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2008, 2009, 2010 Nicira Networks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "entropy.h" + +#include +#include +#include + +#include "socket-util.h" +#include "vlog.h" + +VLOG_DEFINE_THIS_MODULE(entropy) + +static const char urandom[] = "/dev/urandom"; + +/* Initializes 'buffer' with 'n' bytes of high-quality random numbers. Returns + * 0 if successful, otherwise a positive errno value or EOF on error. */ +int +get_entropy(void *buffer, size_t n) +{ + size_t bytes_read; + int error; + int fd; + + fd = open(urandom, O_RDONLY); + if (fd < 0) { + VLOG_ERR("%s: open failed (%s)", urandom, strerror(errno)); + return errno ? errno : EINVAL; + } + + error = read_fully(fd, buffer, n, &bytes_read); + close(fd); + + if (error) { + VLOG_ERR("%s: read error (%s)", urandom, + error == EOF ? "unexpected end of file" : strerror(error)); + } + return error; +} + +/* Initializes 'buffer' with 'n' bytes of high-quality random numbers. Exits + * if an error occurs. */ +void +get_entropy_or_die(void *buffer, size_t n) +{ + int error = get_entropy(buffer, n); + if (error) { + ovs_fatal(error, "%s: read error", urandom); + } +} diff --git a/lib/entropy.h b/lib/entropy.h new file mode 100644 index 000000000..6d256e0b9 --- /dev/null +++ b/lib/entropy.h @@ -0,0 +1,24 @@ +/* Copyright (c) 2010 Nicira Networks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ENTROPY_H +#define ENTROPY_H 1 + +#include + +int get_entropy(void *, size_t); +void get_entropy_or_die(void *, size_t); + +#endif /* entropy.h */ diff --git a/lib/uuid.c b/lib/uuid.c index 9aaa91590..a1100f2fd 100644 --- a/lib/uuid.c +++ b/lib/uuid.c @@ -22,11 +22,10 @@ #include #include #include -#include #include "aes128.h" +#include "entropy.h" #include "sha1.h" -#include "socket-util.h" #include "util.h" static struct aes128 key; @@ -180,27 +179,6 @@ error: return false; } -static void -read_urandom(void *buffer, size_t n) -{ - static const char urandom[] = "/dev/urandom"; - size_t bytes_read; - int error; - int fd; - - fd = open(urandom, O_RDONLY); - if (fd < 0) { - ovs_fatal(errno, "%s: open failed", urandom); - } - error = read_fully(fd, buffer, n, &bytes_read); - if (error == EOF) { - ovs_fatal(0, "%s: unexpected end of file", urandom); - } else if (error) { - ovs_fatal(error, "%s: read error", urandom); - } - close(fd); -} - static void do_init(void) { @@ -213,7 +191,7 @@ do_init(void) gid_t gid; /* Get seed data. */ - read_urandom(random_seed, sizeof random_seed); + get_entropy_or_die(random_seed, sizeof random_seed); if (gettimeofday(&now, NULL)) { ovs_fatal(errno, "gettimeofday failed"); } @@ -236,5 +214,5 @@ do_init(void) aes128_schedule(&key, sha1); /* Generate initial counter. */ - read_urandom(counter, sizeof counter); + get_entropy_or_die(counter, sizeof counter); } diff --git a/lib/vlog-modules.def b/lib/vlog-modules.def index 11736578b..c3a5e4ad5 100644 --- a/lib/vlog-modules.def +++ b/lib/vlog-modules.def @@ -29,6 +29,7 @@ VLOG_MODULE(dpif) VLOG_MODULE(dpif_linux) VLOG_MODULE(dpif_netdev) VLOG_MODULE(dpctl) +VLOG_MODULE(entropy) VLOG_MODULE(ezio_term) VLOG_MODULE(fail_open) VLOG_MODULE(fatal_signal)