diff --git a/ChangeLog b/ChangeLog index e54b76c59..f3a6c0659 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-10-04 Vladimir Serbinenko + + Split random retrieving code into separate files. + 2013-10-03 Vladimir Serbinenko * grub-core/kern/arm/dl.c (do_relocations): Accept and ignore diff --git a/Makefile.util.def b/Makefile.util.def index f5dc25bc3..cfd94d2c4 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -222,6 +222,7 @@ program = { common = util/grub-mkpasswd-pbkdf2.c; common = grub-core/kern/emu/argp_common.c; + common = util/random.c; ldadd = libgrubmods.a; ldadd = libgrubgcry.a; diff --git a/include/grub/crypto.h b/include/grub/crypto.h index ac2013270..9d16df1de 100644 --- a/include/grub/crypto.h +++ b/include/grub/crypto.h @@ -406,6 +406,10 @@ void _gcry_log_error( const char *fmt, ... ) __attribute__ ((format (printf, 1, #ifdef GRUB_UTIL void grub_gcry_init_all (void); void grub_gcry_fini_all (void); + +int +grub_get_random (void *out, grub_size_t len); + #endif #endif diff --git a/util/grub-mkpasswd-pbkdf2.c b/util/grub-mkpasswd-pbkdf2.c index 0e09a02c3..a7413e83d 100644 --- a/util/grub-mkpasswd-pbkdf2.c +++ b/util/grub-mkpasswd-pbkdf2.c @@ -34,11 +34,6 @@ #include -#if defined (_WIN32) || defined (__CYGWIN__) -#include -#include -#endif - #include "progname.h" static struct argp_option options[] = { @@ -109,48 +104,6 @@ hexify (char *hex, grub_uint8_t *bin, grub_size_t n) *hex = 0; } -static int -grub_get_random (void *out, grub_size_t len) -{ -#if ! defined (__linux__) && ! defined (__FreeBSD__) && ! defined (__OpenBSD__) && !defined (__GNU__) && ! defined (_WIN32) && !defined(__CYGWIN__) - /* TRANSLATORS: The generator might still be secure just GRUB isn't sure about it. */ - printf ("%s", _("WARNING: your random generator isn't known to be secure\n")); -#warning "your random generator isn't known to be secure" -#endif - -#if defined (_WIN32) || defined (__CYGWIN__) - HCRYPTPROV hCryptProv; - if (!CryptAcquireContext (&hCryptProv, - NULL, - MS_DEF_PROV, - PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) - return 1; - if (!CryptGenRandom (hCryptProv, len, out)) - { - CryptReleaseContext (hCryptProv, 0); - return 1; - } - - CryptReleaseContext (hCryptProv, 0); - - return 0; -#else - FILE *f; - size_t rd; - - f = fopen ("/dev/urandom", "rb"); - if (!f) - return 1; - rd = fread (out, 1, len, f); - fclose (f); - - if (rd != len) - return 1; - return 0; -#endif -} - int main (int argc, char *argv[]) { diff --git a/util/random.c b/util/random.c new file mode 100644 index 000000000..8ace0e402 --- /dev/null +++ b/util/random.c @@ -0,0 +1,5 @@ +#if defined (_WIN32) || defined (__CYGWIN__) +#include "random_windows.c" +#else +#include "random_unix.c" +#endif diff --git a/util/random_unix.c b/util/random_unix.c new file mode 100644 index 000000000..f57454858 --- /dev/null +++ b/util/random_unix.c @@ -0,0 +1,53 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 1992-1999,2001,2003,2004,2005,2009,2010,2011,2012,2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +int +grub_get_random (void *out, grub_size_t len) +{ +#if ! defined (__linux__) && ! defined (__FreeBSD__) && ! defined (__OpenBSD__) && !defined (__GNU__) && ! defined (_WIN32) && !defined(__CYGWIN__) + /* TRANSLATORS: The generator might still be secure just GRUB isn't sure about it. */ + printf ("%s", _("WARNING: your random generator isn't known to be secure\n")); +#warning "your random generator isn't known to be secure" +#endif + FILE *f; + size_t rd; + + f = fopen ("/dev/urandom", "rb"); + if (!f) + return 1; + rd = fread (out, 1, len, f); + fclose (f); + + if (rd != len) + return 1; + return 0; +} diff --git a/util/random_windows.c b/util/random_windows.c new file mode 100644 index 000000000..78f508202 --- /dev/null +++ b/util/random_windows.c @@ -0,0 +1,55 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 1992-1999,2001,2003,2004,2005,2009,2010,2011,2012,2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +int +grub_get_random (void *out, grub_size_t len) +{ + HCRYPTPROV hCryptProv; + if (!CryptAcquireContext (&hCryptProv, + NULL, + MS_DEF_PROV, + PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) + return 1; + if (!CryptGenRandom (hCryptProv, len, out)) + { + CryptReleaseContext (hCryptProv, 0); + return 1; + } + + CryptReleaseContext (hCryptProv, 0); + + return 0; +}