From d496cad407d8fc6c87b5bf3bb2bd1dc4d1d4157b Mon Sep 17 00:00:00 2001 From: Chris Oei Date: Sun, 2 Sep 2012 20:10:20 -0700 Subject: [PATCH] Remove fraction of total memory as a command line opt --- Makefile.in | 18 +-- lib/genpass/genpass.c | 24 ++-- lib/genpass/genpass.h | 2 +- lib/util/memlimit.c | 302 ------------------------------------------ lib/util/memlimit.h | 42 ------ main.c | 14 +- 6 files changed, 15 insertions(+), 387 deletions(-) delete mode 100644 lib/util/memlimit.c delete mode 100644 lib/util/memlimit.h diff --git a/Makefile.in b/Makefile.in index 9c16a27..c768e9a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -49,7 +49,7 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -am_scrypt_OBJECTS = scrypt-main.$(OBJEXT) scrypt-memlimit.$(OBJEXT) \ +am_scrypt_OBJECTS = scrypt-main.$(OBJEXT) \ scrypt-readpass.$(OBJEXT) scrypt-warn.$(OBJEXT) \ scrypt-genpass.$(OBJEXT) \ scrypt-sha256.$(OBJEXT) \ @@ -174,7 +174,6 @@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign dist_man_MANS = $(scrypt_man_MANS) scrypt_SOURCES = main.c \ - lib/util/memlimit.c \ lib/util/readpass.c \ lib/util/warn.c \ lib/genpass/genpass.c \ @@ -274,7 +273,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-memlimit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-readpass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-genpass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-sha256.Po@am__quote@ @@ -308,20 +306,6 @@ scrypt-main.obj: main.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -c -o scrypt-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` -scrypt-memlimit.o: lib/util/memlimit.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-memlimit.o -MD -MP -MF $(DEPDIR)/scrypt-memlimit.Tpo -c -o scrypt-memlimit.o `test -f 'lib/util/memlimit.c' || echo '$(srcdir)/'`lib/util/memlimit.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-memlimit.Tpo $(DEPDIR)/scrypt-memlimit.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/memlimit.c' object='scrypt-memlimit.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -c -o scrypt-memlimit.o `test -f 'lib/util/memlimit.c' || echo '$(srcdir)/'`lib/util/memlimit.c - -scrypt-memlimit.obj: lib/util/memlimit.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-memlimit.obj -MD -MP -MF $(DEPDIR)/scrypt-memlimit.Tpo -c -o scrypt-memlimit.obj `if test -f 'lib/util/memlimit.c'; then $(CYGPATH_W) 'lib/util/memlimit.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/memlimit.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-memlimit.Tpo $(DEPDIR)/scrypt-memlimit.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/memlimit.c' object='scrypt-memlimit.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -c -o scrypt-memlimit.obj `if test -f 'lib/util/memlimit.c'; then $(CYGPATH_W) 'lib/util/memlimit.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/memlimit.c'; fi` - scrypt-readpass.o: lib/util/readpass.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-readpass.o -MD -MP -MF $(DEPDIR)/scrypt-readpass.Tpo -c -o scrypt-readpass.o `test -f 'lib/util/readpass.c' || echo '$(srcdir)/'`lib/util/readpass.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-readpass.Tpo $(DEPDIR)/scrypt-readpass.Po diff --git a/lib/genpass/genpass.c b/lib/genpass/genpass.c index f2b9e0f..196ce81 100644 --- a/lib/genpass/genpass.c +++ b/lib/genpass/genpass.c @@ -38,7 +38,6 @@ #include #include "crypto_scrypt.h" -#include "memlimit.h" #include "sha256.h" #include "sysendian.h" @@ -46,13 +45,13 @@ #define ENCBLOCK 65536 -static int pickparams(size_t, double, int, +static int pickparams(size_t, int, int *, uint32_t *, uint32_t *); -static int checkparams(size_t, double, double, int, uint32_t, uint32_t); +static int checkparams(size_t, int, int, uint32_t, uint32_t); static int getsalt(uint8_t[32]); static int -pickparams(size_t maxmem, double maxmemfrac, int megaops, +pickparams(size_t maxmem, int megaops, int * logN, uint32_t * r, uint32_t * p) { size_t memlimit; @@ -62,8 +61,7 @@ pickparams(size_t maxmem, double maxmemfrac, int megaops, int rc; /* Figure out how much memory to use. */ - if (memtouse(maxmem, maxmemfrac, &memlimit)) - return (1); + memlimit = maxmem * 1000000; opslimit = 1000000 * megaops; @@ -112,7 +110,7 @@ pickparams(size_t maxmem, double maxmemfrac, int megaops, } static int -checkparams(size_t maxmem, double maxmemfrac, double maxtime, +checkparams(size_t maxmem, int megaops, int logN, uint32_t r, uint32_t p) { size_t memlimit; @@ -122,13 +120,9 @@ checkparams(size_t maxmem, double maxmemfrac, double maxtime, int rc; /* Figure out the maximum amount of memory we can use. */ - if (memtouse(maxmem, maxmemfrac, &memlimit)) - return (1); + memlimit = 1000000 * maxmem; - /* Figure out how fast the CPU is. */ - if ((rc = scryptenc_cpuperf(&opps)) != 0) - return (rc); - opslimit = opps * maxtime; + opslimit = 1000000 * megaops; /* Sanity-check values. */ if ((logN < 1) || (logN > 63)) @@ -192,7 +186,7 @@ err0: int genpass(uint8_t dk[64], const uint8_t * passwd, size_t passwdlen, - size_t maxmem, double maxmemfrac, int megaops) + size_t maxmem, int megaops) { uint8_t salt[32]; uint8_t hbuf[32]; @@ -206,7 +200,7 @@ genpass(uint8_t dk[64], int rc; /* Pick values for N, r, p. */ - if ((rc = pickparams(maxmem, maxmemfrac, megaops, + if ((rc = pickparams(maxmem, megaops, &logN, &r, &p)) != 0) return (rc); N = (uint64_t)(1) << logN; diff --git a/lib/genpass/genpass.h b/lib/genpass/genpass.h index cd1b73e..6f96eeb 100644 --- a/lib/genpass/genpass.h +++ b/lib/genpass/genpass.h @@ -74,6 +74,6 @@ int genpass(uint8_t dk[64], const uint8_t * passwd, size_t passwdlen, - size_t maxmem, double maxmemfrac, int megaops); + size_t maxmem, int megaops); #endif /* !_GENPASS_H_ */ diff --git a/lib/util/memlimit.c b/lib/util/memlimit.c deleted file mode 100644 index 8303f5c..0000000 --- a/lib/util/memlimit.c +++ /dev/null @@ -1,302 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#include "scrypt_platform.h" - -#include -#include - -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#ifdef HAVE_SYSCTL_HW_USERMEM -#include -#endif -#ifdef HAVE_SYS_SYSINFO_H -#include -#endif - -#include -#include -#include -#include - -#ifdef DEBUG -#include -#endif - -#include "memlimit.h" - -#ifdef HAVE_SYSCTL_HW_USERMEM -static int -memlimit_sysctl_hw_usermem(size_t * memlimit) -{ - int mib[2]; - uint8_t usermembuf[8]; - size_t usermemlen = 8; - uint64_t usermem; - - /* Ask the kernel how much RAM we have. */ - mib[0] = CTL_HW; - mib[1] = HW_USERMEM; - if (sysctl(mib, 2, usermembuf, &usermemlen, NULL, 0)) - return (1); - - /* - * Parse as either a uint64_t or a uint32_t based on the length of - * output the kernel reports having copied out. It appears that all - * systems providing a sysctl interface for reading integers copy - * them out as system-endian values, so we don't need to worry about - * parsing them. - */ - if (usermemlen == sizeof(uint64_t)) - usermem = *(uint64_t *)usermembuf; - else if (usermemlen == sizeof(uint32_t)) - usermem = *(uint32_t *)usermembuf; - else - return (1); - - /* Return the sysctl value, but clamp to SIZE_MAX if necessary. */ -#if UINT64_MAX > SIZE_MAX - if (usermem > SIZE_MAX) - *memlimit = SIZE_MAX; - else - *memlimit = usermem; -#else - *memlimit = usermem; -#endif - - /* Success! */ - return (0); -} -#endif - -/* If we don't HAVE_STRUCT_SYSINFO, we can't use sysinfo. */ -#ifndef HAVE_STRUCT_SYSINFO -#undef HAVE_SYSINFO -#endif - -/* If we don't HAVE_STRUCT_SYSINFO_TOTALRAM, we can't use sysinfo. */ -#ifndef HAVE_STRUCT_SYSINFO_TOTALRAM -#undef HAVE_SYSINFO -#endif - -#ifdef HAVE_SYSINFO -static int -memlimit_sysinfo(size_t * memlimit) -{ - struct sysinfo info; - uint64_t totalmem; - - /* Get information from the kernel. */ - if (sysinfo(&info)) - return (1); - totalmem = info.totalram; - - /* If we're on a modern kernel, adjust based on mem_unit. */ -#ifdef HAVE_STRUCT_SYSINFO_MEM_UNIT - totalmem = totalmem * info.mem_unit; -#endif - - /* Return the value, but clamp to SIZE_MAX if necessary. */ -#if UINT64_MAX > SIZE_MAX - if (totalmem > SIZE_MAX) - *memlimit = SIZE_MAX; - else - *memlimit = totalmem; -#else - *memlimit = totalmem; -#endif - - /* Success! */ - return (0); -} -#endif /* HAVE_SYSINFO */ - -static int -memlimit_rlimit(size_t * memlimit) -{ - struct rlimit rl; - uint64_t memrlimit; - - /* Find the least of... */ - memrlimit = (uint64_t)(-1); - - /* ... RLIMIT_AS... */ -#ifdef RLIMIT_AS - if (getrlimit(RLIMIT_AS, &rl)) - return (1); - if ((rl.rlim_cur != RLIM_INFINITY) && - ((uint64_t)rl.rlim_cur < memrlimit)) - memrlimit = rl.rlim_cur; -#endif - - /* ... RLIMIT_DATA... */ - if (getrlimit(RLIMIT_DATA, &rl)) - return (1); - if ((rl.rlim_cur != RLIM_INFINITY) && - ((uint64_t)rl.rlim_cur < memrlimit)) - memrlimit = rl.rlim_cur; - - /* ... and RLIMIT_RSS. */ -#ifdef RLIMIT_RSS - if (getrlimit(RLIMIT_RSS, &rl)) - return (1); - if ((rl.rlim_cur != RLIM_INFINITY) && - ((uint64_t)rl.rlim_cur < memrlimit)) - memrlimit = rl.rlim_cur; -#endif - - /* Return the value, but clamp to SIZE_MAX if necessary. */ -#if UINT64_MAX > SIZE_MAX - if (memrlimit > SIZE_MAX) - *memlimit = SIZE_MAX; - else - *memlimit = memrlimit; -#else - *memlimit = memrlimit; -#endif - - /* Success! */ - return (0); -} - -#ifdef _SC_PHYS_PAGES - -/* Some systems define _SC_PAGESIZE instead of _SC_PAGE_SIZE. */ -#ifndef _SC_PAGE_SIZE -#define _SC_PAGE_SIZE _SC_PAGESIZE -#endif - -static int -memlimit_sysconf(size_t * memlimit) -{ - long pagesize; - long physpages; - uint64_t totalmem; - - /* Set errno to 0 in order to distinguish "no limit" from "error". */ - errno = 0; - - /* Read the two limits. */ - if (((pagesize = sysconf(_SC_PAGE_SIZE)) == -1) || - ((physpages = sysconf(_SC_PHYS_PAGES)) == -1)) { - /* Did an error occur? */ - if (errno != 0) - return (1); - - /* If not, there is no limit. */ - totalmem = (uint64_t)(-1); - } else { - /* Compute the limit. */ - totalmem = (uint64_t)(pagesize) * (uint64_t)(physpages); - } - - /* Return the value, but clamp to SIZE_MAX if necessary. */ -#if UINT64_MAX > SIZE_MAX - if (totalmem > SIZE_MAX) - *memlimit = SIZE_MAX; - else - *memlimit = totalmem; -#else - *memlimit = totalmem; -#endif - - /* Success! */ - return (0); -} -#endif - -int -memtouse(size_t maxmem, double maxmemfrac, size_t * memlimit) -{ - size_t sysctl_memlimit, sysinfo_memlimit, rlimit_memlimit; - size_t sysconf_memlimit; - size_t memlimit_min; - size_t memavail; - - /* Get memory limits. */ -#ifdef HAVE_SYSCTL_HW_USERMEM - if (memlimit_sysctl_hw_usermem(&sysctl_memlimit)) - return (1); -#else - sysctl_memlimit = (size_t)(-1); -#endif -#ifdef HAVE_SYSINFO - if (memlimit_sysinfo(&sysinfo_memlimit)) - return (1); -#else - sysinfo_memlimit = (size_t)(-1); -#endif - if (memlimit_rlimit(&rlimit_memlimit)) - return (1); -#ifdef _SC_PHYS_PAGES - if (memlimit_sysconf(&sysconf_memlimit)) - return (1); -#else - sysconf_memlimit = (size_t)(-1); -#endif - -#ifdef DEBUG - fprintf(stderr, "Memory limits are %zu %zu %zu %zu\n", - sysctl_memlimit, sysinfo_memlimit, rlimit_memlimit, - sysconf_memlimit); -#endif - - /* Find the smallest of them. */ - memlimit_min = (size_t)(-1); - if (memlimit_min > sysctl_memlimit) - memlimit_min = sysctl_memlimit; - if (memlimit_min > sysinfo_memlimit) - memlimit_min = sysinfo_memlimit; - if (memlimit_min > rlimit_memlimit) - memlimit_min = rlimit_memlimit; - if (memlimit_min > sysconf_memlimit) - memlimit_min = sysconf_memlimit; - - /* Only use the specified fraction of the available memory. */ - if ((maxmemfrac > 0.5) || (maxmemfrac == 0.0)) - maxmemfrac = 0.5; - memavail = maxmemfrac * memlimit_min; - - /* Don't use more than the specified maximum. */ - if ((maxmem > 0) && (memavail > maxmem)) - memavail = maxmem; - - /* But always allow at least 1 MiB. */ - if (memavail < 1048576) - memavail = 1048576; - -#ifdef DEBUG - fprintf(stderr, "Allowing up to %zu memory to be used\n", memavail); -#endif - - /* Return limit via the provided pointer. */ - *memlimit = memavail; - return (0); -} diff --git a/lib/util/memlimit.h b/lib/util/memlimit.h deleted file mode 100644 index d3b4891..0000000 --- a/lib/util/memlimit.h +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#ifndef _MEMLIMIT_H_ -#define _MEMLIMIT_H_ - -#include - -/** - * memtouse(maxmem, maxmemfrac, memlimit): - * Examine the system and return via memlimit the amount of RAM which should - * be used -- the specified fraction of the available RAM, but no more than - * maxmem, and no less than 1MiB. - */ -int memtouse(size_t, double, size_t *); - -#endif /* !_MEMLIMIT_H_ */ diff --git a/main.c b/main.c index 777a751..31a491f 100644 --- a/main.c +++ b/main.c @@ -51,8 +51,7 @@ main(int argc, char *argv[]) FILE * infile = NULL; FILE * outfile = stdout; int dec = 0; - size_t maxmem = 0; - double maxmemfrac = 0.5; + size_t maxmem = 1000; int megaops = 5; char ch; char * passwd; @@ -65,17 +64,12 @@ main(int argc, char *argv[]) if (argc < 1) usage(); - maxmem = 0; - maxmemfrac = 0.125; /* Parse arguments. */ - while ((ch = getopt(argc, argv, "hm:M:o:")) != -1) { + while ((ch = getopt(argc, argv, "hm:o:")) != -1) { switch (ch) { - case 'M': - maxmem = strtoumax(optarg, NULL, 0); - break; case 'm': - maxmemfrac = strtod(optarg, NULL); + maxmem = strtoumax(optarg, NULL, 0); break; case 'o': megaops = atoi(optarg); @@ -98,7 +92,7 @@ main(int argc, char *argv[]) uint8_t dk[64]; rc = genpass(dk, (uint8_t *)passwd, - strlen(passwd), maxmem, maxmemfrac, megaops); + strlen(passwd), maxmem, megaops); /* Zero and free the password. */ memset(passwd, 0, strlen(passwd));