Import scrypt-1.1.6.tgz with SHA-256
dfd0d1a544439265bbb9b58043ad3c8ce50a3987b44a61b1d39fd7a3ed5b7fb8
This commit is contained in:
parent
b490e825f3
commit
1acdffde66
30 changed files with 13307 additions and 0 deletions
18
FORMAT
Normal file
18
FORMAT
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
scrypt encrypted data format
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
offset length
|
||||||
|
0 6 "scrypt"
|
||||||
|
6 1 scrypt data file version number (== 0)
|
||||||
|
7 1 log2(N) (must be between 1 and 63 inclusive)
|
||||||
|
8 4 r (big-endian integer; must satisfy r * p < 2^30)
|
||||||
|
12 4 p (big-endian integer; must satisfy r * p < 2^30)
|
||||||
|
16 32 salt
|
||||||
|
48 16 first 16 bytes of SHA256(bytes 0 .. 47)
|
||||||
|
64 32 HMAC-SHA256(bytes 0 .. 63)
|
||||||
|
96 X data xor AES256-CTR key stream generated with nonce == 0
|
||||||
|
96+X 32 HMAC-SHA256(bytes 96 .. 96 + (X - 1))
|
||||||
|
|
||||||
|
AES256-CTR is computed with a 256-bit AES key key_enc, and HMAC-SHA256 is
|
||||||
|
computed with a 256-bit key key_hmac, where
|
||||||
|
scrypt(password, salt, N, r, p, 64) == [key_enc][key_hmac]
|
763
Makefile.in
Normal file
763
Makefile.in
Normal file
|
@ -0,0 +1,763 @@
|
||||||
|
# Makefile.in generated by automake 1.10.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
bin_PROGRAMS = scrypt$(EXEEXT)
|
||||||
|
subdir = .
|
||||||
|
DIST_COMMON = $(am__configure_deps) $(dist_man_MANS) \
|
||||||
|
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||||
|
$(srcdir)/config.h.in $(top_srcdir)/configure TODO \
|
||||||
|
config.aux/depcomp config.aux/install-sh config.aux/missing
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/acscrypt.m4 \
|
||||||
|
$(top_srcdir)/scrypt-version $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno config.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = config.h
|
||||||
|
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) \
|
||||||
|
scrypt-readpass.$(OBJEXT) scrypt-warn.$(OBJEXT) \
|
||||||
|
scrypt-scryptenc.$(OBJEXT) scrypt-scryptenc_cpuperf.$(OBJEXT) \
|
||||||
|
scrypt-crypto_aesctr.$(OBJEXT) scrypt-sha256.$(OBJEXT) \
|
||||||
|
scrypt-crypto_scrypt-@SCRYPTVER@.$(OBJEXT)
|
||||||
|
scrypt_OBJECTS = $(am_scrypt_OBJECTS)
|
||||||
|
scrypt_DEPENDENCIES =
|
||||||
|
scrypt_LINK = $(CCLD) $(scrypt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/config.aux/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(scrypt_SOURCES)
|
||||||
|
DIST_SOURCES = $(scrypt_SOURCES)
|
||||||
|
man1dir = $(mandir)/man1
|
||||||
|
NROFF = nroff
|
||||||
|
MANS = $(dist_man_MANS)
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
{ test ! -d $(distdir) \
|
||||||
|
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -fr $(distdir); }; }
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
GREP = @GREP@
|
||||||
|
HAVE_SYSCTL_HW_USERMEM = @HAVE_SYSCTL_HW_USERMEM@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
SCRYPTVER = @SCRYPTVER@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
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/scryptenc/scryptenc.c \
|
||||||
|
lib/scryptenc/scryptenc_cpuperf.c \
|
||||||
|
lib/crypto/crypto_aesctr.c \
|
||||||
|
lib/crypto/sha256.c \
|
||||||
|
lib/crypto/crypto_scrypt-@SCRYPTVER@.c
|
||||||
|
|
||||||
|
scrypt_CFLAGS = -I . -I lib/util -I lib/scryptenc -I lib/crypto
|
||||||
|
scrypt_LDADD = -lcrypto
|
||||||
|
scrypt_man_MANS = scrypt.1
|
||||||
|
all: config.h
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o .obj
|
||||||
|
am--refresh:
|
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
|
||||||
|
cd $(srcdir) && $(AUTOMAKE) --foreign \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
echo ' $(SHELL) ./config.status'; \
|
||||||
|
$(SHELL) ./config.status;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
|
cd $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
|
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
|
||||||
|
config.h: stamp-h1
|
||||||
|
@if test ! -f $@; then \
|
||||||
|
rm -f stamp-h1; \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
|
||||||
|
else :; fi
|
||||||
|
|
||||||
|
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||||
|
@rm -f stamp-h1
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||||
|
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
|
cd $(top_srcdir) && $(AUTOHEADER)
|
||||||
|
rm -f stamp-h1
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
distclean-hdr:
|
||||||
|
-rm -f config.h stamp-h1
|
||||||
|
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
|
||||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||||
|
p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||||
|
if test -f $$p \
|
||||||
|
; then \
|
||||||
|
f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||||
|
echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
|
||||||
|
$(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
|
||||||
|
else :; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-binPROGRAMS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||||
|
f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||||
|
echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
|
||||||
|
rm -f "$(DESTDIR)$(bindir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-binPROGRAMS:
|
||||||
|
-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
|
||||||
|
scrypt$(EXEEXT): $(scrypt_OBJECTS) $(scrypt_DEPENDENCIES)
|
||||||
|
@rm -f scrypt$(EXEEXT)
|
||||||
|
$(scrypt_LINK) $(scrypt_OBJECTS) $(scrypt_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-crypto_aesctr.Po@am__quote@
|
||||||
|
@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-scryptenc.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-scryptenc_cpuperf.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-sha256.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt-warn.Po@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
scrypt-main.o: main.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-main.o -MD -MP -MF $(DEPDIR)/scrypt-main.Tpo -c -o scrypt-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-main.Tpo $(DEPDIR)/scrypt-main.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='scrypt-main.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-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
||||||
|
|
||||||
|
scrypt-main.obj: main.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-main.obj -MD -MP -MF $(DEPDIR)/scrypt-main.Tpo -c -o scrypt-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-main.Tpo $(DEPDIR)/scrypt-main.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='scrypt-main.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-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
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/readpass.c' object='scrypt-readpass.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-readpass.o `test -f 'lib/util/readpass.c' || echo '$(srcdir)/'`lib/util/readpass.c
|
||||||
|
|
||||||
|
scrypt-readpass.obj: lib/util/readpass.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-readpass.obj -MD -MP -MF $(DEPDIR)/scrypt-readpass.Tpo -c -o scrypt-readpass.obj `if test -f 'lib/util/readpass.c'; then $(CYGPATH_W) 'lib/util/readpass.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/readpass.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-readpass.Tpo $(DEPDIR)/scrypt-readpass.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/readpass.c' object='scrypt-readpass.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-readpass.obj `if test -f 'lib/util/readpass.c'; then $(CYGPATH_W) 'lib/util/readpass.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/readpass.c'; fi`
|
||||||
|
|
||||||
|
scrypt-warn.o: lib/util/warn.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-warn.o -MD -MP -MF $(DEPDIR)/scrypt-warn.Tpo -c -o scrypt-warn.o `test -f 'lib/util/warn.c' || echo '$(srcdir)/'`lib/util/warn.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-warn.Tpo $(DEPDIR)/scrypt-warn.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/warn.c' object='scrypt-warn.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-warn.o `test -f 'lib/util/warn.c' || echo '$(srcdir)/'`lib/util/warn.c
|
||||||
|
|
||||||
|
scrypt-warn.obj: lib/util/warn.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-warn.obj -MD -MP -MF $(DEPDIR)/scrypt-warn.Tpo -c -o scrypt-warn.obj `if test -f 'lib/util/warn.c'; then $(CYGPATH_W) 'lib/util/warn.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/warn.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-warn.Tpo $(DEPDIR)/scrypt-warn.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/util/warn.c' object='scrypt-warn.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-warn.obj `if test -f 'lib/util/warn.c'; then $(CYGPATH_W) 'lib/util/warn.c'; else $(CYGPATH_W) '$(srcdir)/lib/util/warn.c'; fi`
|
||||||
|
|
||||||
|
scrypt-scryptenc.o: lib/scryptenc/scryptenc.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-scryptenc.o -MD -MP -MF $(DEPDIR)/scrypt-scryptenc.Tpo -c -o scrypt-scryptenc.o `test -f 'lib/scryptenc/scryptenc.c' || echo '$(srcdir)/'`lib/scryptenc/scryptenc.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-scryptenc.Tpo $(DEPDIR)/scrypt-scryptenc.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/scryptenc/scryptenc.c' object='scrypt-scryptenc.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-scryptenc.o `test -f 'lib/scryptenc/scryptenc.c' || echo '$(srcdir)/'`lib/scryptenc/scryptenc.c
|
||||||
|
|
||||||
|
scrypt-scryptenc.obj: lib/scryptenc/scryptenc.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-scryptenc.obj -MD -MP -MF $(DEPDIR)/scrypt-scryptenc.Tpo -c -o scrypt-scryptenc.obj `if test -f 'lib/scryptenc/scryptenc.c'; then $(CYGPATH_W) 'lib/scryptenc/scryptenc.c'; else $(CYGPATH_W) '$(srcdir)/lib/scryptenc/scryptenc.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-scryptenc.Tpo $(DEPDIR)/scrypt-scryptenc.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/scryptenc/scryptenc.c' object='scrypt-scryptenc.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-scryptenc.obj `if test -f 'lib/scryptenc/scryptenc.c'; then $(CYGPATH_W) 'lib/scryptenc/scryptenc.c'; else $(CYGPATH_W) '$(srcdir)/lib/scryptenc/scryptenc.c'; fi`
|
||||||
|
|
||||||
|
scrypt-scryptenc_cpuperf.o: lib/scryptenc/scryptenc_cpuperf.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-scryptenc_cpuperf.o -MD -MP -MF $(DEPDIR)/scrypt-scryptenc_cpuperf.Tpo -c -o scrypt-scryptenc_cpuperf.o `test -f 'lib/scryptenc/scryptenc_cpuperf.c' || echo '$(srcdir)/'`lib/scryptenc/scryptenc_cpuperf.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-scryptenc_cpuperf.Tpo $(DEPDIR)/scrypt-scryptenc_cpuperf.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/scryptenc/scryptenc_cpuperf.c' object='scrypt-scryptenc_cpuperf.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-scryptenc_cpuperf.o `test -f 'lib/scryptenc/scryptenc_cpuperf.c' || echo '$(srcdir)/'`lib/scryptenc/scryptenc_cpuperf.c
|
||||||
|
|
||||||
|
scrypt-scryptenc_cpuperf.obj: lib/scryptenc/scryptenc_cpuperf.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-scryptenc_cpuperf.obj -MD -MP -MF $(DEPDIR)/scrypt-scryptenc_cpuperf.Tpo -c -o scrypt-scryptenc_cpuperf.obj `if test -f 'lib/scryptenc/scryptenc_cpuperf.c'; then $(CYGPATH_W) 'lib/scryptenc/scryptenc_cpuperf.c'; else $(CYGPATH_W) '$(srcdir)/lib/scryptenc/scryptenc_cpuperf.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-scryptenc_cpuperf.Tpo $(DEPDIR)/scrypt-scryptenc_cpuperf.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/scryptenc/scryptenc_cpuperf.c' object='scrypt-scryptenc_cpuperf.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-scryptenc_cpuperf.obj `if test -f 'lib/scryptenc/scryptenc_cpuperf.c'; then $(CYGPATH_W) 'lib/scryptenc/scryptenc_cpuperf.c'; else $(CYGPATH_W) '$(srcdir)/lib/scryptenc/scryptenc_cpuperf.c'; fi`
|
||||||
|
|
||||||
|
scrypt-crypto_aesctr.o: lib/crypto/crypto_aesctr.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-crypto_aesctr.o -MD -MP -MF $(DEPDIR)/scrypt-crypto_aesctr.Tpo -c -o scrypt-crypto_aesctr.o `test -f 'lib/crypto/crypto_aesctr.c' || echo '$(srcdir)/'`lib/crypto/crypto_aesctr.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-crypto_aesctr.Tpo $(DEPDIR)/scrypt-crypto_aesctr.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/crypto_aesctr.c' object='scrypt-crypto_aesctr.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-crypto_aesctr.o `test -f 'lib/crypto/crypto_aesctr.c' || echo '$(srcdir)/'`lib/crypto/crypto_aesctr.c
|
||||||
|
|
||||||
|
scrypt-crypto_aesctr.obj: lib/crypto/crypto_aesctr.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-crypto_aesctr.obj -MD -MP -MF $(DEPDIR)/scrypt-crypto_aesctr.Tpo -c -o scrypt-crypto_aesctr.obj `if test -f 'lib/crypto/crypto_aesctr.c'; then $(CYGPATH_W) 'lib/crypto/crypto_aesctr.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/crypto_aesctr.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-crypto_aesctr.Tpo $(DEPDIR)/scrypt-crypto_aesctr.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/crypto_aesctr.c' object='scrypt-crypto_aesctr.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-crypto_aesctr.obj `if test -f 'lib/crypto/crypto_aesctr.c'; then $(CYGPATH_W) 'lib/crypto/crypto_aesctr.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/crypto_aesctr.c'; fi`
|
||||||
|
|
||||||
|
scrypt-sha256.o: lib/crypto/sha256.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-sha256.o -MD -MP -MF $(DEPDIR)/scrypt-sha256.Tpo -c -o scrypt-sha256.o `test -f 'lib/crypto/sha256.c' || echo '$(srcdir)/'`lib/crypto/sha256.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-sha256.Tpo $(DEPDIR)/scrypt-sha256.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/sha256.c' object='scrypt-sha256.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-sha256.o `test -f 'lib/crypto/sha256.c' || echo '$(srcdir)/'`lib/crypto/sha256.c
|
||||||
|
|
||||||
|
scrypt-sha256.obj: lib/crypto/sha256.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-sha256.obj -MD -MP -MF $(DEPDIR)/scrypt-sha256.Tpo -c -o scrypt-sha256.obj `if test -f 'lib/crypto/sha256.c'; then $(CYGPATH_W) 'lib/crypto/sha256.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/sha256.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-sha256.Tpo $(DEPDIR)/scrypt-sha256.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/sha256.c' object='scrypt-sha256.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-sha256.obj `if test -f 'lib/crypto/sha256.c'; then $(CYGPATH_W) 'lib/crypto/sha256.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/sha256.c'; fi`
|
||||||
|
|
||||||
|
scrypt-crypto_scrypt-@SCRYPTVER@.o: lib/crypto/crypto_scrypt-@SCRYPTVER@.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-crypto_scrypt-@SCRYPTVER@.o -MD -MP -MF $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Tpo -c -o scrypt-crypto_scrypt-@SCRYPTVER@.o `test -f 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c' || echo '$(srcdir)/'`lib/crypto/crypto_scrypt-@SCRYPTVER@.c
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Tpo $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/crypto_scrypt-@SCRYPTVER@.c' object='scrypt-crypto_scrypt-@SCRYPTVER@.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-crypto_scrypt-@SCRYPTVER@.o `test -f 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c' || echo '$(srcdir)/'`lib/crypto/crypto_scrypt-@SCRYPTVER@.c
|
||||||
|
|
||||||
|
scrypt-crypto_scrypt-@SCRYPTVER@.obj: lib/crypto/crypto_scrypt-@SCRYPTVER@.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scrypt_CFLAGS) $(CFLAGS) -MT scrypt-crypto_scrypt-@SCRYPTVER@.obj -MD -MP -MF $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Tpo -c -o scrypt-crypto_scrypt-@SCRYPTVER@.obj `if test -f 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; then $(CYGPATH_W) 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Tpo $(DEPDIR)/scrypt-crypto_scrypt-@SCRYPTVER@.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib/crypto/crypto_scrypt-@SCRYPTVER@.c' object='scrypt-crypto_scrypt-@SCRYPTVER@.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-crypto_scrypt-@SCRYPTVER@.obj `if test -f 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; then $(CYGPATH_W) 'lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; else $(CYGPATH_W) '$(srcdir)/lib/crypto/crypto_scrypt-@SCRYPTVER@.c'; fi`
|
||||||
|
install-man1: $(man1_MANS) $(man_MANS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
|
||||||
|
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
|
||||||
|
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
||||||
|
for i in $$l2; do \
|
||||||
|
case "$$i" in \
|
||||||
|
*.1*) list="$$list $$i" ;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
||||||
|
else file=$$i; fi; \
|
||||||
|
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||||
|
case "$$ext" in \
|
||||||
|
1*) ;; \
|
||||||
|
*) ext='1' ;; \
|
||||||
|
esac; \
|
||||||
|
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||||
|
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||||
|
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||||
|
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
|
||||||
|
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
|
||||||
|
done
|
||||||
|
uninstall-man1:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
|
||||||
|
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
||||||
|
for i in $$l2; do \
|
||||||
|
case "$$i" in \
|
||||||
|
*.1*) list="$$list $$i" ;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
for i in $$list; do \
|
||||||
|
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||||
|
case "$$ext" in \
|
||||||
|
1*) ;; \
|
||||||
|
*) ext='1' ;; \
|
||||||
|
esac; \
|
||||||
|
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||||
|
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||||
|
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||||
|
echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
|
||||||
|
rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$tags $$unique; \
|
||||||
|
fi
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& cd $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) $$here
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
test -d $(distdir) || mkdir $(distdir)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
|
||||||
|
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||||
|
|| chmod -R a+r $(distdir)
|
||||||
|
dist-gzip: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-lzma: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir
|
||||||
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir
|
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist
|
||||||
|
case '$(DIST_ARCHIVES)' in \
|
||||||
|
*.tar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
|
*.tar.lzma*) \
|
||||||
|
unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build
|
||||||
|
mkdir $(distdir)/_inst
|
||||||
|
chmod a-w $(distdir)
|
||||||
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
|
&& cd $(distdir)/_build \
|
||||||
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||||
|
distuninstallcheck \
|
||||||
|
&& chmod -R a-w "$$dc_install_base" \
|
||||||
|
&& ({ \
|
||||||
|
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||||
|
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||||
|
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||||
|
&& rm -rf "$$dc_destdir" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||||
|
&& rm -rf $(DIST_ARCHIVES) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
|
||||||
|
$(am__remove_distdir)
|
||||||
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
|
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||||
|
distuninstallcheck:
|
||||||
|
@cd $(distuninstallcheck_dir) \
|
||||||
|
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
||||||
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
|
if test -n "$(DESTDIR)"; then \
|
||||||
|
echo " (check DESTDIR support)"; \
|
||||||
|
fi ; \
|
||||||
|
$(distuninstallcheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
distcleancheck: distclean
|
||||||
|
@if test '$(srcdir)' = . ; then \
|
||||||
|
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||||
|
$(distcleancheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile $(PROGRAMS) $(MANS) config.h
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-hdr distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-man
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-exec-am: install-binPROGRAMS
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-man: install-man1
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-binPROGRAMS uninstall-man
|
||||||
|
|
||||||
|
uninstall-man: uninstall-man1
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
|
||||||
|
clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
|
||||||
|
dist-gzip dist-lzma dist-shar dist-tarZ dist-zip distcheck \
|
||||||
|
distclean distclean-compile distclean-generic distclean-hdr \
|
||||||
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
|
dvi-am html html-am info info-am install install-am \
|
||||||
|
install-binPROGRAMS install-data install-data-am install-dvi \
|
||||||
|
install-dvi-am install-exec install-exec-am install-html \
|
||||||
|
install-html-am install-info install-info-am install-man \
|
||||||
|
install-man1 install-pdf install-pdf-am install-ps \
|
||||||
|
install-ps-am install-strip installcheck installcheck-am \
|
||||||
|
installdirs maintainer-clean maintainer-clean-generic \
|
||||||
|
mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
|
||||||
|
ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS \
|
||||||
|
uninstall-man uninstall-man1
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
589
config.aux/depcomp
Executable file
589
config.aux/depcomp
Executable file
|
@ -0,0 +1,589 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2007-03-29.01
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
|
|
||||||
|
# This program 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 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program 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 this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
# 02110-1301, USA.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by `PROGRAMS ARGS'.
|
||||||
|
object Object file output by `PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputing dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say).
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
|
## The second -e expression handles DOS-style file names with drive letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the `deleted header file' problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" |
|
||||||
|
## Some versions of gcc put a space before the `:'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like `#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||||
|
tr '
|
||||||
|
' ' ' >> $depfile
|
||||||
|
echo >> $depfile
|
||||||
|
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> $depfile
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts `$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form `foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
# That's a tab and a space in the [].
|
||||||
|
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel's C compiler understands `-MD -MF file'. However on
|
||||||
|
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
|
# ICC 7.0 will fill foo.d with something like
|
||||||
|
# foo.o: sub/foo.c
|
||||||
|
# foo.o: sub/foo.h
|
||||||
|
# which is wrong. We want:
|
||||||
|
# sub/foo.o: sub/foo.c
|
||||||
|
# sub/foo.o: sub/foo.h
|
||||||
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using \ :
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form `foo.o: dependent.h',
|
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
||||||
|
sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add `dependent.h:' lines.
|
||||||
|
sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in `foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# generates 2 separate objects for the 2 libraries. These two
|
||||||
|
# compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||||
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.o.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
# That's a tab and a space in the [].
|
||||||
|
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test $1 != '--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove `-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for `:'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test $1 != '--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no
|
||||||
|
for arg in "$@"; do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix="`echo $object | sed 's/^.*\././'`"
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
||||||
|
' | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test $1 != '--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove `-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E |
|
||||||
|
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||||
|
sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o,
|
||||||
|
# because we must use -o when running libtool.
|
||||||
|
"$@" || exit $?
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
||||||
|
echo " " >> "$depfile"
|
||||||
|
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
519
config.aux/install-sh
Executable file
519
config.aux/install-sh
Executable file
|
@ -0,0 +1,519 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2006-12-25.00
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call `install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
trap '(exit $?); exit' 1 2 13 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $src in
|
||||||
|
-*) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dst=$dst_arg
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $dst in
|
||||||
|
-*) dst=./$dst;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writeable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
-*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test -z "$d" && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob set +f &&
|
||||||
|
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
367
config.aux/missing
Executable file
367
config.aux/missing
Executable file
|
@ -0,0 +1,367 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
|
scriptversion=2006-05-10.23
|
||||||
|
|
||||||
|
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program 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 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program 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 this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
# 02110-1301, USA.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
run=:
|
||||||
|
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||||
|
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||||
|
|
||||||
|
# In the cases where this matters, `missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
--run)
|
||||||
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file \`aclocal.m4'
|
||||||
|
autoconf touch file \`configure'
|
||||||
|
autoheader touch file \`config.h.in'
|
||||||
|
autom4te touch the output file, or create a stub one
|
||||||
|
automake touch all \`Makefile.in' files
|
||||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
tar try tar, gnutar, gtar, then tar without non-portable flags
|
||||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: Unknown \`$1' option"
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program).
|
||||||
|
case $1 in
|
||||||
|
lex|yacc)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
|
tar)
|
||||||
|
if test -n "$run"; then
|
||||||
|
echo 1>&2 "ERROR: \`tar' requires --run"
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
|
# We have it, but it failed.
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
|
# try to emulate it.
|
||||||
|
case $1 in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`${configure_ac}'. You might want to install the
|
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case $f in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
||||||
|
You might want to install the \`Automake' and \`Perl' packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get \`$1' as part of \`Autoconf' from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison|yacc)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' $msg. You should only need it if
|
||||||
|
you modified a \`.y' file. You may need the \`Bison' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Bison' from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case $LASTARG in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.h; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.c; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex|flex)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.l' file. You may need the \`Flex' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Flex' from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case $LASTARG in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f lex.yy.c; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
\`Help2man' package in order for those modifications to take
|
||||||
|
effect. You can get \`Help2man' from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy \`make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||||
|
the \`GNU make' package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '
|
||||||
|
/^@setfilename/{
|
||||||
|
s/.* \([^ ]*\) *$/\1/
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
tar)
|
||||||
|
shift
|
||||||
|
|
||||||
|
# We have already tried tar in the generic part.
|
||||||
|
# Look for gnutar/gtar before invocation to avoid ugly error
|
||||||
|
# messages.
|
||||||
|
if (gnutar --version > /dev/null 2>&1); then
|
||||||
|
gnutar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
if (gtar --version > /dev/null 2>&1); then
|
||||||
|
gtar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
firstarg="$1"
|
||||||
|
if shift; then
|
||||||
|
case $firstarg in
|
||||||
|
*o*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/o//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case $firstarg in
|
||||||
|
*h*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/h//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
||||||
|
You may want to install GNU tar or Free paxutils, or check the
|
||||||
|
command line arguments."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the \`README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing \`$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
98
config.h.in
Normal file
98
config.h.in
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `clock_gettime' function. */
|
||||||
|
#undef HAVE_CLOCK_GETTIME
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `be64enc', and to 0 if you
|
||||||
|
don't. */
|
||||||
|
#undef HAVE_DECL_BE64ENC
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <err.h> header file. */
|
||||||
|
#undef HAVE_ERR_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `rt' library (-lrt). */
|
||||||
|
#undef HAVE_LIBRT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `posix_memalign' function. */
|
||||||
|
#undef HAVE_POSIX_MEMALIGN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the type `struct sysinfo'. */
|
||||||
|
#undef HAVE_STRUCT_SYSINFO
|
||||||
|
|
||||||
|
/* Define to 1 if `mem_unit' is member of `struct sysinfo'. */
|
||||||
|
#undef HAVE_STRUCT_SYSINFO_MEM_UNIT
|
||||||
|
|
||||||
|
/* Define to 1 if `totalram' is member of `struct sysinfo'. */
|
||||||
|
#undef HAVE_STRUCT_SYSINFO_TOTALRAM
|
||||||
|
|
||||||
|
/* Define to 1 if the OS has a hw.usermem sysctl */
|
||||||
|
#undef HAVE_SYSCTL_HW_USERMEM
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `sysinfo' function. */
|
||||||
|
#undef HAVE_SYSINFO
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/endian.h> header file. */
|
||||||
|
#undef HAVE_SYS_ENDIAN_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||||
|
#undef HAVE_SYS_PARAM_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/sysinfo.h> header file. */
|
||||||
|
#undef HAVE_SYS_SYSINFO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Name of package */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||||
|
#undef _FILE_OFFSET_BITS
|
||||||
|
|
||||||
|
/* Define for large files, on AIX-style hosts. */
|
||||||
|
#undef _LARGE_FILES
|
6
lib/README
Normal file
6
lib/README
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
The source code under this directory is taken from the client for the
|
||||||
|
Tarsnap online backup system (and released under the 2-clause BSD license
|
||||||
|
with permission of the author); keeping this code in sync with the Tarsnap
|
||||||
|
code is highly desirable and explains why there is some functionality
|
||||||
|
included here which is not actually used by the scrypt file encryption
|
||||||
|
utility.
|
124
lib/crypto/crypto_aesctr.c
Normal file
124
lib/crypto/crypto_aesctr.c
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*-
|
||||||
|
* Copyright 2007-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 <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <openssl/aes.h>
|
||||||
|
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "crypto_aesctr.h"
|
||||||
|
|
||||||
|
struct crypto_aesctr {
|
||||||
|
AES_KEY * key;
|
||||||
|
uint64_t nonce;
|
||||||
|
uint64_t bytectr;
|
||||||
|
uint8_t buf[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_init(key, nonce):
|
||||||
|
* Prepare to encrypt/decrypt data with AES in CTR mode, using the provided
|
||||||
|
* expanded key and nonce. The key provided must remain valid for the
|
||||||
|
* lifetime of the stream.
|
||||||
|
*/
|
||||||
|
struct crypto_aesctr *
|
||||||
|
crypto_aesctr_init(AES_KEY * key, uint64_t nonce)
|
||||||
|
{
|
||||||
|
struct crypto_aesctr * stream;
|
||||||
|
|
||||||
|
/* Allocate memory. */
|
||||||
|
if ((stream = malloc(sizeof(struct crypto_aesctr))) == NULL)
|
||||||
|
goto err0;
|
||||||
|
|
||||||
|
/* Initialize values. */
|
||||||
|
stream->key = key;
|
||||||
|
stream->nonce = nonce;
|
||||||
|
stream->bytectr = 0;
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (stream);
|
||||||
|
|
||||||
|
err0:
|
||||||
|
/* Failure! */
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_stream(stream, inbuf, outbuf, buflen):
|
||||||
|
* Generate the next ${buflen} bytes of the AES-CTR stream and xor them with
|
||||||
|
* bytes from ${inbuf}, writing the result into ${outbuf}. If the buffers
|
||||||
|
* ${inbuf} and ${outbuf} overlap, they must be identical.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
crypto_aesctr_stream(struct crypto_aesctr * stream, const uint8_t * inbuf,
|
||||||
|
uint8_t * outbuf, size_t buflen)
|
||||||
|
{
|
||||||
|
uint8_t pblk[16];
|
||||||
|
size_t pos;
|
||||||
|
int bytemod;
|
||||||
|
|
||||||
|
for (pos = 0; pos < buflen; pos++) {
|
||||||
|
/* How far through the buffer are we? */
|
||||||
|
bytemod = stream->bytectr % 16;
|
||||||
|
|
||||||
|
/* Generate a block of cipherstream if needed. */
|
||||||
|
if (bytemod == 0) {
|
||||||
|
be64enc(pblk, stream->nonce);
|
||||||
|
be64enc(pblk + 8, stream->bytectr / 16);
|
||||||
|
AES_encrypt(pblk, stream->buf, stream->key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt a byte. */
|
||||||
|
outbuf[pos] = inbuf[pos] ^ stream->buf[bytemod];
|
||||||
|
|
||||||
|
/* Move to the next byte of cipherstream. */
|
||||||
|
stream->bytectr += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_free(stream):
|
||||||
|
* Free the provided stream object.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
crypto_aesctr_free(struct crypto_aesctr * stream)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Zero potentially sensitive information. */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
stream->buf[i] = 0;
|
||||||
|
stream->bytectr = stream->nonce = 0;
|
||||||
|
|
||||||
|
/* Free the stream. */
|
||||||
|
free(stream);
|
||||||
|
}
|
59
lib/crypto/crypto_aesctr.h
Normal file
59
lib/crypto/crypto_aesctr.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*-
|
||||||
|
* 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 _CRYPTO_AESCTR_H_
|
||||||
|
#define _CRYPTO_AESCTR_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <openssl/aes.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_init(key, nonce):
|
||||||
|
* Prepare to encrypt/decrypt data with AES in CTR mode, using the provided
|
||||||
|
* expanded key and nonce. The key provided must remain valid for the
|
||||||
|
* lifetime of the stream.
|
||||||
|
*/
|
||||||
|
struct crypto_aesctr * crypto_aesctr_init(AES_KEY *, uint64_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_stream(stream, inbuf, outbuf, buflen):
|
||||||
|
* Generate the next ${buflen} bytes of the AES-CTR stream and xor them with
|
||||||
|
* bytes from ${inbuf}, writing the result into ${outbuf}. If the buffers
|
||||||
|
* ${inbuf} and ${outbuf} overlap, they must be identical.
|
||||||
|
*/
|
||||||
|
void crypto_aesctr_stream(struct crypto_aesctr *, const uint8_t *,
|
||||||
|
uint8_t *, size_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_aesctr_free(stream):
|
||||||
|
* Free the provided stream object.
|
||||||
|
*/
|
||||||
|
void crypto_aesctr_free(struct crypto_aesctr *);
|
||||||
|
|
||||||
|
#endif /* !_CRYPTO_AESCTR_H_ */
|
338
lib/crypto/crypto_scrypt-nosse.c
Normal file
338
lib/crypto/crypto_scrypt-nosse.c
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
/*-
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "sha256.h"
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "crypto_scrypt.h"
|
||||||
|
|
||||||
|
static void blkcpy(void *, void *, size_t);
|
||||||
|
static void blkxor(void *, void *, size_t);
|
||||||
|
static void salsa20_8(uint32_t[16]);
|
||||||
|
static void blockmix_salsa8(uint32_t *, uint32_t *, uint32_t *, size_t);
|
||||||
|
static uint64_t integerify(void *, size_t);
|
||||||
|
static void smix(uint8_t *, size_t, uint64_t, uint32_t *, uint32_t *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkcpy(void * dest, void * src, size_t len)
|
||||||
|
{
|
||||||
|
size_t * D = dest;
|
||||||
|
size_t * S = src;
|
||||||
|
size_t L = len / sizeof(size_t);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < L; i++)
|
||||||
|
D[i] = S[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkxor(void * dest, void * src, size_t len)
|
||||||
|
{
|
||||||
|
size_t * D = dest;
|
||||||
|
size_t * S = src;
|
||||||
|
size_t L = len / sizeof(size_t);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < L; i++)
|
||||||
|
D[i] ^= S[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* salsa20_8(B):
|
||||||
|
* Apply the salsa20/8 core to the provided block.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
salsa20_8(uint32_t B[16])
|
||||||
|
{
|
||||||
|
uint32_t x[16];
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
blkcpy(x, B, 64);
|
||||||
|
for (i = 0; i < 8; i += 2) {
|
||||||
|
#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
|
||||||
|
/* Operate on columns. */
|
||||||
|
x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9);
|
||||||
|
x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18);
|
||||||
|
|
||||||
|
x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9);
|
||||||
|
x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18);
|
||||||
|
|
||||||
|
x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9);
|
||||||
|
x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18);
|
||||||
|
|
||||||
|
x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9);
|
||||||
|
x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18);
|
||||||
|
|
||||||
|
/* Operate on rows. */
|
||||||
|
x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9);
|
||||||
|
x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18);
|
||||||
|
|
||||||
|
x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9);
|
||||||
|
x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18);
|
||||||
|
|
||||||
|
x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9);
|
||||||
|
x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18);
|
||||||
|
|
||||||
|
x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9);
|
||||||
|
x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18);
|
||||||
|
#undef R
|
||||||
|
}
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
B[i] += x[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blockmix_salsa8(Bin, Bout, X, r):
|
||||||
|
* Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r
|
||||||
|
* bytes in length; the output Bout must also be the same size. The
|
||||||
|
* temporary space X must be 64 bytes.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
blockmix_salsa8(uint32_t * Bin, uint32_t * Bout, uint32_t * X, size_t r)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* 1: X <-- B_{2r - 1} */
|
||||||
|
blkcpy(X, &Bin[(2 * r - 1) * 16], 64);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to 2r - 1 do */
|
||||||
|
for (i = 0; i < 2 * r; i += 2) {
|
||||||
|
/* 3: X <-- H(X \xor B_i) */
|
||||||
|
blkxor(X, &Bin[i * 16], 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
|
||||||
|
/* 4: Y_i <-- X */
|
||||||
|
/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */
|
||||||
|
blkcpy(&Bout[i * 8], X, 64);
|
||||||
|
|
||||||
|
/* 3: X <-- H(X \xor B_i) */
|
||||||
|
blkxor(X, &Bin[i * 16 + 16], 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
|
||||||
|
/* 4: Y_i <-- X */
|
||||||
|
/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */
|
||||||
|
blkcpy(&Bout[i * 8 + r * 16], X, 64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* integerify(B, r):
|
||||||
|
* Return the result of parsing B_{2r-1} as a little-endian integer.
|
||||||
|
*/
|
||||||
|
static uint64_t
|
||||||
|
integerify(void * B, size_t r)
|
||||||
|
{
|
||||||
|
uint32_t * X = (void *)((uintptr_t)(B) + (2 * r - 1) * 64);
|
||||||
|
|
||||||
|
return (((uint64_t)(X[1]) << 32) + X[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* smix(B, r, N, V, XY):
|
||||||
|
* Compute B = SMix_r(B, N). The input B must be 128r bytes in length;
|
||||||
|
* the temporary storage V must be 128rN bytes in length; the temporary
|
||||||
|
* storage XY must be 256r + 64 bytes in length. The value N must be a
|
||||||
|
* power of 2 greater than 1. The arrays B, V, and XY must be aligned to a
|
||||||
|
* multiple of 64 bytes.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
smix(uint8_t * B, size_t r, uint64_t N, uint32_t * V, uint32_t * XY)
|
||||||
|
{
|
||||||
|
uint32_t * X = XY;
|
||||||
|
uint32_t * Y = &XY[32 * r];
|
||||||
|
uint32_t * Z = &XY[64 * r];
|
||||||
|
uint64_t i;
|
||||||
|
uint64_t j;
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
/* 1: X <-- B */
|
||||||
|
for (k = 0; k < 32 * r; k++)
|
||||||
|
X[k] = le32dec(&B[4 * k]);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i += 2) {
|
||||||
|
/* 3: V_i <-- X */
|
||||||
|
blkcpy(&V[i * (32 * r)], X, 128 * r);
|
||||||
|
|
||||||
|
/* 4: X <-- H(X) */
|
||||||
|
blockmix_salsa8(X, Y, Z, r);
|
||||||
|
|
||||||
|
/* 3: V_i <-- X */
|
||||||
|
blkcpy(&V[(i + 1) * (32 * r)], Y, 128 * r);
|
||||||
|
|
||||||
|
/* 4: X <-- H(X) */
|
||||||
|
blockmix_salsa8(Y, X, Z, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i += 2) {
|
||||||
|
/* 7: j <-- Integerify(X) mod N */
|
||||||
|
j = integerify(X, r) & (N - 1);
|
||||||
|
|
||||||
|
/* 8: X <-- H(X \xor V_j) */
|
||||||
|
blkxor(X, &V[j * (32 * r)], 128 * r);
|
||||||
|
blockmix_salsa8(X, Y, Z, r);
|
||||||
|
|
||||||
|
/* 7: j <-- Integerify(X) mod N */
|
||||||
|
j = integerify(Y, r) & (N - 1);
|
||||||
|
|
||||||
|
/* 8: X <-- H(X \xor V_j) */
|
||||||
|
blkxor(Y, &V[j * (32 * r)], 128 * r);
|
||||||
|
blockmix_salsa8(Y, X, Z, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 10: B' <-- X */
|
||||||
|
for (k = 0; k < 32 * r; k++)
|
||||||
|
le32enc(&B[4 * k], X[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
||||||
|
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
||||||
|
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
||||||
|
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
||||||
|
* must be a power of 2 greater than 1.
|
||||||
|
*
|
||||||
|
* Return 0 on success; or -1 on error.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
||||||
|
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p,
|
||||||
|
uint8_t * buf, size_t buflen)
|
||||||
|
{
|
||||||
|
void * B0, * V0, * XY0;
|
||||||
|
uint8_t * B;
|
||||||
|
uint32_t * V;
|
||||||
|
uint32_t * XY;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
/* Sanity-check parameters. */
|
||||||
|
#if SIZE_MAX > UINT32_MAX
|
||||||
|
if (buflen > (((uint64_t)(1) << 32) - 1) * 32) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if (((N & (N - 1)) != 0) || (N == 0)) {
|
||||||
|
errno = EINVAL;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if ((r > SIZE_MAX / 128 / p) ||
|
||||||
|
#if SIZE_MAX / 256 <= UINT32_MAX
|
||||||
|
(r > SIZE_MAX / 256) ||
|
||||||
|
#endif
|
||||||
|
(N > SIZE_MAX / 128 / r)) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory. */
|
||||||
|
#ifdef HAVE_POSIX_MEMALIGN
|
||||||
|
if ((errno = posix_memalign(&B0, 64, 128 * r * p)) != 0)
|
||||||
|
goto err0;
|
||||||
|
B = (uint8_t *)(B0);
|
||||||
|
if ((errno = posix_memalign(&XY0, 64, 256 * r + 64)) != 0)
|
||||||
|
goto err1;
|
||||||
|
XY = (uint32_t *)(XY0);
|
||||||
|
#ifndef MAP_ANON
|
||||||
|
if ((errno = posix_memalign(&V0, 64, 128 * r * N)) != 0)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(V0);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
if ((B0 = malloc(128 * r * p + 63)) == NULL)
|
||||||
|
goto err0;
|
||||||
|
B = (uint8_t *)(((uintptr_t)(B0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
if ((XY0 = malloc(256 * r + 64 + 63)) == NULL)
|
||||||
|
goto err1;
|
||||||
|
XY = (uint32_t *)(((uintptr_t)(XY0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
#ifndef MAP_ANON
|
||||||
|
if ((V0 = malloc(128 * r * N + 63)) == NULL)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(((uintptr_t)(V0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef MAP_ANON
|
||||||
|
if ((V0 = mmap(NULL, 128 * r * N, PROT_READ | PROT_WRITE,
|
||||||
|
#ifdef MAP_NOCORE
|
||||||
|
MAP_ANON | MAP_PRIVATE | MAP_NOCORE,
|
||||||
|
#else
|
||||||
|
MAP_ANON | MAP_PRIVATE,
|
||||||
|
#endif
|
||||||
|
-1, 0)) == MAP_FAILED)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(V0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to p - 1 do */
|
||||||
|
for (i = 0; i < p; i++) {
|
||||||
|
/* 3: B_i <-- MF(B_i, N) */
|
||||||
|
smix(&B[i * 128 * r], r, N, V, XY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen);
|
||||||
|
|
||||||
|
/* Free memory. */
|
||||||
|
#ifdef MAP_ANON
|
||||||
|
if (munmap(V0, 128 * r * N))
|
||||||
|
goto err2;
|
||||||
|
#else
|
||||||
|
free(V0);
|
||||||
|
#endif
|
||||||
|
free(XY0);
|
||||||
|
free(B0);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err2:
|
||||||
|
free(XY0);
|
||||||
|
err1:
|
||||||
|
free(B0);
|
||||||
|
err0:
|
||||||
|
/* Failure! */
|
||||||
|
return (-1);
|
||||||
|
}
|
284
lib/crypto/crypto_scrypt-ref.c
Normal file
284
lib/crypto/crypto_scrypt-ref.c
Normal file
|
@ -0,0 +1,284 @@
|
||||||
|
/*-
|
||||||
|
* 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 <errno.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "sha256.h"
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "crypto_scrypt.h"
|
||||||
|
|
||||||
|
static void blkcpy(uint8_t *, uint8_t *, size_t);
|
||||||
|
static void blkxor(uint8_t *, uint8_t *, size_t);
|
||||||
|
static void salsa20_8(uint8_t[64]);
|
||||||
|
static void blockmix_salsa8(uint8_t *, uint8_t *, size_t);
|
||||||
|
static uint64_t integerify(uint8_t *, size_t);
|
||||||
|
static void smix(uint8_t *, size_t, uint64_t, uint8_t *, uint8_t *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkcpy(uint8_t * dest, uint8_t * src, size_t len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
dest[i] = src[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkxor(uint8_t * dest, uint8_t * src, size_t len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
dest[i] ^= src[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* salsa20_8(B):
|
||||||
|
* Apply the salsa20/8 core to the provided block.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
salsa20_8(uint8_t B[64])
|
||||||
|
{
|
||||||
|
uint32_t B32[16];
|
||||||
|
uint32_t x[16];
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* Convert little-endian values in. */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
B32[i] = le32dec(&B[i * 4]);
|
||||||
|
|
||||||
|
/* Compute x = doubleround^4(B32). */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
x[i] = B32[i];
|
||||||
|
for (i = 0; i < 8; i += 2) {
|
||||||
|
#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
|
||||||
|
/* Operate on columns. */
|
||||||
|
x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9);
|
||||||
|
x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18);
|
||||||
|
|
||||||
|
x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9);
|
||||||
|
x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18);
|
||||||
|
|
||||||
|
x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9);
|
||||||
|
x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18);
|
||||||
|
|
||||||
|
x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9);
|
||||||
|
x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18);
|
||||||
|
|
||||||
|
/* Operate on rows. */
|
||||||
|
x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9);
|
||||||
|
x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18);
|
||||||
|
|
||||||
|
x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9);
|
||||||
|
x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18);
|
||||||
|
|
||||||
|
x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9);
|
||||||
|
x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18);
|
||||||
|
|
||||||
|
x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9);
|
||||||
|
x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18);
|
||||||
|
#undef R
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute B32 = B32 + x. */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
B32[i] += x[i];
|
||||||
|
|
||||||
|
/* Convert little-endian values out. */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
le32enc(&B[4 * i], B32[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blockmix_salsa8(B, Y, r):
|
||||||
|
* Compute B = BlockMix_{salsa20/8, r}(B). The input B must be 128r bytes in
|
||||||
|
* length; the temporary space Y must also be the same size.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
blockmix_salsa8(uint8_t * B, uint8_t * Y, size_t r)
|
||||||
|
{
|
||||||
|
uint8_t X[64];
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* 1: X <-- B_{2r - 1} */
|
||||||
|
blkcpy(X, &B[(2 * r - 1) * 64], 64);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to 2r - 1 do */
|
||||||
|
for (i = 0; i < 2 * r; i++) {
|
||||||
|
/* 3: X <-- H(X \xor B_i) */
|
||||||
|
blkxor(X, &B[i * 64], 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
|
||||||
|
/* 4: Y_i <-- X */
|
||||||
|
blkcpy(&Y[i * 64], X, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */
|
||||||
|
for (i = 0; i < r; i++)
|
||||||
|
blkcpy(&B[i * 64], &Y[(i * 2) * 64], 64);
|
||||||
|
for (i = 0; i < r; i++)
|
||||||
|
blkcpy(&B[(i + r) * 64], &Y[(i * 2 + 1) * 64], 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* integerify(B, r):
|
||||||
|
* Return the result of parsing B_{2r-1} as a little-endian integer.
|
||||||
|
*/
|
||||||
|
static uint64_t
|
||||||
|
integerify(uint8_t * B, size_t r)
|
||||||
|
{
|
||||||
|
uint8_t * X = &B[(2 * r - 1) * 64];
|
||||||
|
|
||||||
|
return (le64dec(X));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* smix(B, r, N, V, XY):
|
||||||
|
* Compute B = SMix_r(B, N). The input B must be 128r bytes in length; the
|
||||||
|
* temporary storage V must be 128rN bytes in length; the temporary storage
|
||||||
|
* XY must be 256r bytes in length. The value N must be a power of 2.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
smix(uint8_t * B, size_t r, uint64_t N, uint8_t * V, uint8_t * XY)
|
||||||
|
{
|
||||||
|
uint8_t * X = XY;
|
||||||
|
uint8_t * Y = &XY[128 * r];
|
||||||
|
uint64_t i;
|
||||||
|
uint64_t j;
|
||||||
|
|
||||||
|
/* 1: X <-- B */
|
||||||
|
blkcpy(X, B, 128 * r);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i++) {
|
||||||
|
/* 3: V_i <-- X */
|
||||||
|
blkcpy(&V[i * (128 * r)], X, 128 * r);
|
||||||
|
|
||||||
|
/* 4: X <-- H(X) */
|
||||||
|
blockmix_salsa8(X, Y, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i++) {
|
||||||
|
/* 7: j <-- Integerify(X) mod N */
|
||||||
|
j = integerify(X, r) & (N - 1);
|
||||||
|
|
||||||
|
/* 8: X <-- H(X \xor V_j) */
|
||||||
|
blkxor(X, &V[j * (128 * r)], 128 * r);
|
||||||
|
blockmix_salsa8(X, Y, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 10: B' <-- X */
|
||||||
|
blkcpy(B, X, 128 * r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
||||||
|
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
||||||
|
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
||||||
|
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
||||||
|
* must be a power of 2.
|
||||||
|
*
|
||||||
|
* Return 0 on success; or -1 on error.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
||||||
|
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p,
|
||||||
|
uint8_t * buf, size_t buflen)
|
||||||
|
{
|
||||||
|
uint8_t * B;
|
||||||
|
uint8_t * V;
|
||||||
|
uint8_t * XY;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
/* Sanity-check parameters. */
|
||||||
|
#if SIZE_MAX > UINT32_MAX
|
||||||
|
if (buflen > (((uint64_t)(1) << 32) - 1) * 32) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if (((N & (N - 1)) != 0) || (N == 0)) {
|
||||||
|
errno = EINVAL;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if ((r > SIZE_MAX / 128 / p) ||
|
||||||
|
#if SIZE_MAX / 256 <= UINT32_MAX
|
||||||
|
(r > SIZE_MAX / 256) ||
|
||||||
|
#endif
|
||||||
|
(N > SIZE_MAX / 128 / r)) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory. */
|
||||||
|
if ((B = malloc(128 * r * p)) == NULL)
|
||||||
|
goto err0;
|
||||||
|
if ((XY = malloc(256 * r)) == NULL)
|
||||||
|
goto err1;
|
||||||
|
if ((V = malloc(128 * r * N)) == NULL)
|
||||||
|
goto err2;
|
||||||
|
|
||||||
|
/* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to p - 1 do */
|
||||||
|
for (i = 0; i < p; i++) {
|
||||||
|
/* 3: B_i <-- MF(B_i, N) */
|
||||||
|
smix(&B[i * 128 * r], r, N, V, XY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen);
|
||||||
|
|
||||||
|
/* Free memory. */
|
||||||
|
free(V);
|
||||||
|
free(XY);
|
||||||
|
free(B);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err2:
|
||||||
|
free(XY);
|
||||||
|
err1:
|
||||||
|
free(B);
|
||||||
|
err0:
|
||||||
|
/* Failure! */
|
||||||
|
return (-1);
|
||||||
|
}
|
366
lib/crypto/crypto_scrypt-sse.c
Normal file
366
lib/crypto/crypto_scrypt-sse.c
Normal file
|
@ -0,0 +1,366 @@
|
||||||
|
/*-
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include <emmintrin.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "sha256.h"
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "crypto_scrypt.h"
|
||||||
|
|
||||||
|
static void blkcpy(void *, void *, size_t);
|
||||||
|
static void blkxor(void *, void *, size_t);
|
||||||
|
static void salsa20_8(__m128i *);
|
||||||
|
static void blockmix_salsa8(__m128i *, __m128i *, __m128i *, size_t);
|
||||||
|
static uint64_t integerify(void *, size_t);
|
||||||
|
static void smix(uint8_t *, size_t, uint64_t, void *, void *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkcpy(void * dest, void * src, size_t len)
|
||||||
|
{
|
||||||
|
__m128i * D = dest;
|
||||||
|
__m128i * S = src;
|
||||||
|
size_t L = len / 16;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < L; i++)
|
||||||
|
D[i] = S[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
blkxor(void * dest, void * src, size_t len)
|
||||||
|
{
|
||||||
|
__m128i * D = dest;
|
||||||
|
__m128i * S = src;
|
||||||
|
size_t L = len / 16;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < L; i++)
|
||||||
|
D[i] = _mm_xor_si128(D[i], S[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* salsa20_8(B):
|
||||||
|
* Apply the salsa20/8 core to the provided block.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
salsa20_8(__m128i B[4])
|
||||||
|
{
|
||||||
|
__m128i X0, X1, X2, X3;
|
||||||
|
__m128i T;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
X0 = B[0];
|
||||||
|
X1 = B[1];
|
||||||
|
X2 = B[2];
|
||||||
|
X3 = B[3];
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i += 2) {
|
||||||
|
/* Operate on "columns". */
|
||||||
|
T = _mm_add_epi32(X0, X3);
|
||||||
|
X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 7));
|
||||||
|
X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 25));
|
||||||
|
T = _mm_add_epi32(X1, X0);
|
||||||
|
X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9));
|
||||||
|
X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23));
|
||||||
|
T = _mm_add_epi32(X2, X1);
|
||||||
|
X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 13));
|
||||||
|
X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 19));
|
||||||
|
T = _mm_add_epi32(X3, X2);
|
||||||
|
X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18));
|
||||||
|
X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14));
|
||||||
|
|
||||||
|
/* Rearrange data. */
|
||||||
|
X1 = _mm_shuffle_epi32(X1, 0x93);
|
||||||
|
X2 = _mm_shuffle_epi32(X2, 0x4E);
|
||||||
|
X3 = _mm_shuffle_epi32(X3, 0x39);
|
||||||
|
|
||||||
|
/* Operate on "rows". */
|
||||||
|
T = _mm_add_epi32(X0, X1);
|
||||||
|
X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 7));
|
||||||
|
X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 25));
|
||||||
|
T = _mm_add_epi32(X3, X0);
|
||||||
|
X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9));
|
||||||
|
X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23));
|
||||||
|
T = _mm_add_epi32(X2, X3);
|
||||||
|
X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 13));
|
||||||
|
X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 19));
|
||||||
|
T = _mm_add_epi32(X1, X2);
|
||||||
|
X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18));
|
||||||
|
X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14));
|
||||||
|
|
||||||
|
/* Rearrange data. */
|
||||||
|
X1 = _mm_shuffle_epi32(X1, 0x39);
|
||||||
|
X2 = _mm_shuffle_epi32(X2, 0x4E);
|
||||||
|
X3 = _mm_shuffle_epi32(X3, 0x93);
|
||||||
|
}
|
||||||
|
|
||||||
|
B[0] = _mm_add_epi32(B[0], X0);
|
||||||
|
B[1] = _mm_add_epi32(B[1], X1);
|
||||||
|
B[2] = _mm_add_epi32(B[2], X2);
|
||||||
|
B[3] = _mm_add_epi32(B[3], X3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blockmix_salsa8(Bin, Bout, X, r):
|
||||||
|
* Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r
|
||||||
|
* bytes in length; the output Bout must also be the same size. The
|
||||||
|
* temporary space X must be 64 bytes.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
blockmix_salsa8(__m128i * Bin, __m128i * Bout, __m128i * X, size_t r)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* 1: X <-- B_{2r - 1} */
|
||||||
|
blkcpy(X, &Bin[8 * r - 4], 64);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to 2r - 1 do */
|
||||||
|
for (i = 0; i < r; i++) {
|
||||||
|
/* 3: X <-- H(X \xor B_i) */
|
||||||
|
blkxor(X, &Bin[i * 8], 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
|
||||||
|
/* 4: Y_i <-- X */
|
||||||
|
/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */
|
||||||
|
blkcpy(&Bout[i * 4], X, 64);
|
||||||
|
|
||||||
|
/* 3: X <-- H(X \xor B_i) */
|
||||||
|
blkxor(X, &Bin[i * 8 + 4], 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
|
||||||
|
/* 4: Y_i <-- X */
|
||||||
|
/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */
|
||||||
|
blkcpy(&Bout[(r + i) * 4], X, 64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* integerify(B, r):
|
||||||
|
* Return the result of parsing B_{2r-1} as a little-endian integer.
|
||||||
|
*/
|
||||||
|
static uint64_t
|
||||||
|
integerify(void * B, size_t r)
|
||||||
|
{
|
||||||
|
uint32_t * X = (void *)((uintptr_t)(B) + (2 * r - 1) * 64);
|
||||||
|
|
||||||
|
return (((uint64_t)(X[13]) << 32) + X[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* smix(B, r, N, V, XY):
|
||||||
|
* Compute B = SMix_r(B, N). The input B must be 128r bytes in length;
|
||||||
|
* the temporary storage V must be 128rN bytes in length; the temporary
|
||||||
|
* storage XY must be 256r + 64 bytes in length. The value N must be a
|
||||||
|
* power of 2 greater than 1. The arrays B, V, and XY must be aligned to a
|
||||||
|
* multiple of 64 bytes.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
smix(uint8_t * B, size_t r, uint64_t N, void * V, void * XY)
|
||||||
|
{
|
||||||
|
__m128i * X = XY;
|
||||||
|
__m128i * Y = (void *)((uintptr_t)(XY) + 128 * r);
|
||||||
|
__m128i * Z = (void *)((uintptr_t)(XY) + 256 * r);
|
||||||
|
uint32_t * X32 = (void *)X;
|
||||||
|
uint64_t i, j;
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
/* 1: X <-- B */
|
||||||
|
for (k = 0; k < 2 * r; k++) {
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
X32[k * 16 + i] =
|
||||||
|
le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 2: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i += 2) {
|
||||||
|
/* 3: V_i <-- X */
|
||||||
|
blkcpy((void *)((uintptr_t)(V) + i * 128 * r), X, 128 * r);
|
||||||
|
|
||||||
|
/* 4: X <-- H(X) */
|
||||||
|
blockmix_salsa8(X, Y, Z, r);
|
||||||
|
|
||||||
|
/* 3: V_i <-- X */
|
||||||
|
blkcpy((void *)((uintptr_t)(V) + (i + 1) * 128 * r),
|
||||||
|
Y, 128 * r);
|
||||||
|
|
||||||
|
/* 4: X <-- H(X) */
|
||||||
|
blockmix_salsa8(Y, X, Z, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6: for i = 0 to N - 1 do */
|
||||||
|
for (i = 0; i < N; i += 2) {
|
||||||
|
/* 7: j <-- Integerify(X) mod N */
|
||||||
|
j = integerify(X, r) & (N - 1);
|
||||||
|
|
||||||
|
/* 8: X <-- H(X \xor V_j) */
|
||||||
|
blkxor(X, (void *)((uintptr_t)(V) + j * 128 * r), 128 * r);
|
||||||
|
blockmix_salsa8(X, Y, Z, r);
|
||||||
|
|
||||||
|
/* 7: j <-- Integerify(X) mod N */
|
||||||
|
j = integerify(Y, r) & (N - 1);
|
||||||
|
|
||||||
|
/* 8: X <-- H(X \xor V_j) */
|
||||||
|
blkxor(Y, (void *)((uintptr_t)(V) + j * 128 * r), 128 * r);
|
||||||
|
blockmix_salsa8(Y, X, Z, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 10: B' <-- X */
|
||||||
|
for (k = 0; k < 2 * r; k++) {
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
le32enc(&B[(k * 16 + (i * 5 % 16)) * 4],
|
||||||
|
X32[k * 16 + i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
||||||
|
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
||||||
|
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
||||||
|
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
||||||
|
* must be a power of 2 greater than 1.
|
||||||
|
*
|
||||||
|
* Return 0 on success; or -1 on error.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
||||||
|
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p,
|
||||||
|
uint8_t * buf, size_t buflen)
|
||||||
|
{
|
||||||
|
void * B0, * V0, * XY0;
|
||||||
|
uint8_t * B;
|
||||||
|
uint32_t * V;
|
||||||
|
uint32_t * XY;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
/* Sanity-check parameters. */
|
||||||
|
#if SIZE_MAX > UINT32_MAX
|
||||||
|
if (buflen > (((uint64_t)(1) << 32) - 1) * 32) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) {
|
||||||
|
errno = EFBIG;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if (((N & (N - 1)) != 0) || (N == 0)) {
|
||||||
|
errno = EINVAL;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
if ((r > SIZE_MAX / 128 / p) ||
|
||||||
|
#if SIZE_MAX / 256 <= UINT32_MAX
|
||||||
|
(r > (SIZE_MAX - 64) / 256) ||
|
||||||
|
#endif
|
||||||
|
(N > SIZE_MAX / 128 / r)) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory. */
|
||||||
|
#ifdef HAVE_POSIX_MEMALIGN
|
||||||
|
if ((errno = posix_memalign(&B0, 64, 128 * r * p)) != 0)
|
||||||
|
goto err0;
|
||||||
|
B = (uint8_t *)(B0);
|
||||||
|
if ((errno = posix_memalign(&XY0, 64, 256 * r + 64)) != 0)
|
||||||
|
goto err1;
|
||||||
|
XY = (uint32_t *)(XY0);
|
||||||
|
#ifndef MAP_ANON
|
||||||
|
if ((errno = posix_memalign(&V0, 64, 128 * r * N)) != 0)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(V0);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
if ((B0 = malloc(128 * r * p + 63)) == NULL)
|
||||||
|
goto err0;
|
||||||
|
B = (uint8_t *)(((uintptr_t)(B0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
if ((XY0 = malloc(256 * r + 64 + 63)) == NULL)
|
||||||
|
goto err1;
|
||||||
|
XY = (uint32_t *)(((uintptr_t)(XY0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
#ifndef MAP_ANON
|
||||||
|
if ((V0 = malloc(128 * r * N + 63)) == NULL)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(((uintptr_t)(V0) + 63) & ~ (uintptr_t)(63));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef MAP_ANON
|
||||||
|
if ((V0 = mmap(NULL, 128 * r * N, PROT_READ | PROT_WRITE,
|
||||||
|
#ifdef MAP_NOCORE
|
||||||
|
MAP_ANON | MAP_PRIVATE | MAP_NOCORE,
|
||||||
|
#else
|
||||||
|
MAP_ANON | MAP_PRIVATE,
|
||||||
|
#endif
|
||||||
|
-1, 0)) == MAP_FAILED)
|
||||||
|
goto err2;
|
||||||
|
V = (uint32_t *)(V0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r);
|
||||||
|
|
||||||
|
/* 2: for i = 0 to p - 1 do */
|
||||||
|
for (i = 0; i < p; i++) {
|
||||||
|
/* 3: B_i <-- MF(B_i, N) */
|
||||||
|
smix(&B[i * 128 * r], r, N, V, XY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
|
||||||
|
PBKDF2_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen);
|
||||||
|
|
||||||
|
/* Free memory. */
|
||||||
|
#ifdef MAP_ANON
|
||||||
|
if (munmap(V0, 128 * r * N))
|
||||||
|
goto err2;
|
||||||
|
#else
|
||||||
|
free(V0);
|
||||||
|
#endif
|
||||||
|
free(XY0);
|
||||||
|
free(B0);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err2:
|
||||||
|
free(XY0);
|
||||||
|
err1:
|
||||||
|
free(B0);
|
||||||
|
err0:
|
||||||
|
/* Failure! */
|
||||||
|
return (-1);
|
||||||
|
}
|
46
lib/crypto/crypto_scrypt.h
Normal file
46
lib/crypto/crypto_scrypt.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*-
|
||||||
|
* 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 _CRYPTO_SCRYPT_H_
|
||||||
|
#define _CRYPTO_SCRYPT_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
||||||
|
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
||||||
|
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
||||||
|
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
||||||
|
* must be a power of 2 greater than 1.
|
||||||
|
*
|
||||||
|
* Return 0 on success; or -1 on error.
|
||||||
|
*/
|
||||||
|
int crypto_scrypt(const uint8_t *, size_t, const uint8_t *, size_t, uint64_t,
|
||||||
|
uint32_t, uint32_t, uint8_t *, size_t);
|
||||||
|
|
||||||
|
#endif /* !_CRYPTO_SCRYPT_H_ */
|
412
lib/crypto/sha256.c
Normal file
412
lib/crypto/sha256.c
Normal file
|
@ -0,0 +1,412 @@
|
||||||
|
/*-
|
||||||
|
* Copyright 2005,2007,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.
|
||||||
|
*/
|
||||||
|
#include "scrypt_platform.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "sha256.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode a length len/4 vector of (uint32_t) into a length len vector of
|
||||||
|
* (unsigned char) in big-endian form. Assumes len is a multiple of 4.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len / 4; i++)
|
||||||
|
be32enc(dst + i * 4, src[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decode a big-endian length len vector of (unsigned char) into a length
|
||||||
|
* len/4 vector of (uint32_t). Assumes len is a multiple of 4.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len / 4; i++)
|
||||||
|
dst[i] = be32dec(src + i * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Elementary functions used by SHA256 */
|
||||||
|
#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
||||||
|
#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
||||||
|
#define SHR(x, n) (x >> n)
|
||||||
|
#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
|
||||||
|
#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
|
||||||
|
#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
|
||||||
|
#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
|
||||||
|
#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
|
||||||
|
|
||||||
|
/* SHA256 round function */
|
||||||
|
#define RND(a, b, c, d, e, f, g, h, k) \
|
||||||
|
t0 = h + S1(e) + Ch(e, f, g) + k; \
|
||||||
|
t1 = S0(a) + Maj(a, b, c); \
|
||||||
|
d += t0; \
|
||||||
|
h = t0 + t1;
|
||||||
|
|
||||||
|
/* Adjusted round function for rotating state */
|
||||||
|
#define RNDr(S, W, i, k) \
|
||||||
|
RND(S[(64 - i) % 8], S[(65 - i) % 8], \
|
||||||
|
S[(66 - i) % 8], S[(67 - i) % 8], \
|
||||||
|
S[(68 - i) % 8], S[(69 - i) % 8], \
|
||||||
|
S[(70 - i) % 8], S[(71 - i) % 8], \
|
||||||
|
W[i] + k)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SHA256 block compression function. The 256-bit state is transformed via
|
||||||
|
* the 512-bit input block to produce a new state.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
SHA256_Transform(uint32_t * state, const unsigned char block[64])
|
||||||
|
{
|
||||||
|
uint32_t W[64];
|
||||||
|
uint32_t S[8];
|
||||||
|
uint32_t t0, t1;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* 1. Prepare message schedule W. */
|
||||||
|
be32dec_vect(W, block, 64);
|
||||||
|
for (i = 16; i < 64; i++)
|
||||||
|
W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
||||||
|
|
||||||
|
/* 2. Initialize working variables. */
|
||||||
|
memcpy(S, state, 32);
|
||||||
|
|
||||||
|
/* 3. Mix. */
|
||||||
|
RNDr(S, W, 0, 0x428a2f98);
|
||||||
|
RNDr(S, W, 1, 0x71374491);
|
||||||
|
RNDr(S, W, 2, 0xb5c0fbcf);
|
||||||
|
RNDr(S, W, 3, 0xe9b5dba5);
|
||||||
|
RNDr(S, W, 4, 0x3956c25b);
|
||||||
|
RNDr(S, W, 5, 0x59f111f1);
|
||||||
|
RNDr(S, W, 6, 0x923f82a4);
|
||||||
|
RNDr(S, W, 7, 0xab1c5ed5);
|
||||||
|
RNDr(S, W, 8, 0xd807aa98);
|
||||||
|
RNDr(S, W, 9, 0x12835b01);
|
||||||
|
RNDr(S, W, 10, 0x243185be);
|
||||||
|
RNDr(S, W, 11, 0x550c7dc3);
|
||||||
|
RNDr(S, W, 12, 0x72be5d74);
|
||||||
|
RNDr(S, W, 13, 0x80deb1fe);
|
||||||
|
RNDr(S, W, 14, 0x9bdc06a7);
|
||||||
|
RNDr(S, W, 15, 0xc19bf174);
|
||||||
|
RNDr(S, W, 16, 0xe49b69c1);
|
||||||
|
RNDr(S, W, 17, 0xefbe4786);
|
||||||
|
RNDr(S, W, 18, 0x0fc19dc6);
|
||||||
|
RNDr(S, W, 19, 0x240ca1cc);
|
||||||
|
RNDr(S, W, 20, 0x2de92c6f);
|
||||||
|
RNDr(S, W, 21, 0x4a7484aa);
|
||||||
|
RNDr(S, W, 22, 0x5cb0a9dc);
|
||||||
|
RNDr(S, W, 23, 0x76f988da);
|
||||||
|
RNDr(S, W, 24, 0x983e5152);
|
||||||
|
RNDr(S, W, 25, 0xa831c66d);
|
||||||
|
RNDr(S, W, 26, 0xb00327c8);
|
||||||
|
RNDr(S, W, 27, 0xbf597fc7);
|
||||||
|
RNDr(S, W, 28, 0xc6e00bf3);
|
||||||
|
RNDr(S, W, 29, 0xd5a79147);
|
||||||
|
RNDr(S, W, 30, 0x06ca6351);
|
||||||
|
RNDr(S, W, 31, 0x14292967);
|
||||||
|
RNDr(S, W, 32, 0x27b70a85);
|
||||||
|
RNDr(S, W, 33, 0x2e1b2138);
|
||||||
|
RNDr(S, W, 34, 0x4d2c6dfc);
|
||||||
|
RNDr(S, W, 35, 0x53380d13);
|
||||||
|
RNDr(S, W, 36, 0x650a7354);
|
||||||
|
RNDr(S, W, 37, 0x766a0abb);
|
||||||
|
RNDr(S, W, 38, 0x81c2c92e);
|
||||||
|
RNDr(S, W, 39, 0x92722c85);
|
||||||
|
RNDr(S, W, 40, 0xa2bfe8a1);
|
||||||
|
RNDr(S, W, 41, 0xa81a664b);
|
||||||
|
RNDr(S, W, 42, 0xc24b8b70);
|
||||||
|
RNDr(S, W, 43, 0xc76c51a3);
|
||||||
|
RNDr(S, W, 44, 0xd192e819);
|
||||||
|
RNDr(S, W, 45, 0xd6990624);
|
||||||
|
RNDr(S, W, 46, 0xf40e3585);
|
||||||
|
RNDr(S, W, 47, 0x106aa070);
|
||||||
|
RNDr(S, W, 48, 0x19a4c116);
|
||||||
|
RNDr(S, W, 49, 0x1e376c08);
|
||||||
|
RNDr(S, W, 50, 0x2748774c);
|
||||||
|
RNDr(S, W, 51, 0x34b0bcb5);
|
||||||
|
RNDr(S, W, 52, 0x391c0cb3);
|
||||||
|
RNDr(S, W, 53, 0x4ed8aa4a);
|
||||||
|
RNDr(S, W, 54, 0x5b9cca4f);
|
||||||
|
RNDr(S, W, 55, 0x682e6ff3);
|
||||||
|
RNDr(S, W, 56, 0x748f82ee);
|
||||||
|
RNDr(S, W, 57, 0x78a5636f);
|
||||||
|
RNDr(S, W, 58, 0x84c87814);
|
||||||
|
RNDr(S, W, 59, 0x8cc70208);
|
||||||
|
RNDr(S, W, 60, 0x90befffa);
|
||||||
|
RNDr(S, W, 61, 0xa4506ceb);
|
||||||
|
RNDr(S, W, 62, 0xbef9a3f7);
|
||||||
|
RNDr(S, W, 63, 0xc67178f2);
|
||||||
|
|
||||||
|
/* 4. Mix local working variables into global state */
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
state[i] += S[i];
|
||||||
|
|
||||||
|
/* Clean the stack. */
|
||||||
|
memset(W, 0, 256);
|
||||||
|
memset(S, 0, 32);
|
||||||
|
t0 = t1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char PAD[64] = {
|
||||||
|
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Add padding and terminating bit-count. */
|
||||||
|
static void
|
||||||
|
SHA256_Pad(SHA256_CTX * ctx)
|
||||||
|
{
|
||||||
|
unsigned char len[8];
|
||||||
|
uint32_t r, plen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert length to a vector of bytes -- we do this now rather
|
||||||
|
* than later because the length will change after we pad.
|
||||||
|
*/
|
||||||
|
be32enc_vect(len, ctx->count, 8);
|
||||||
|
|
||||||
|
/* Add 1--64 bytes so that the resulting length is 56 mod 64 */
|
||||||
|
r = (ctx->count[1] >> 3) & 0x3f;
|
||||||
|
plen = (r < 56) ? (56 - r) : (120 - r);
|
||||||
|
SHA256_Update(ctx, PAD, (size_t)plen);
|
||||||
|
|
||||||
|
/* Add the terminating bit-count */
|
||||||
|
SHA256_Update(ctx, len, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SHA-256 initialization. Begins a SHA-256 operation. */
|
||||||
|
void
|
||||||
|
SHA256_Init(SHA256_CTX * ctx)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Zero bits processed so far */
|
||||||
|
ctx->count[0] = ctx->count[1] = 0;
|
||||||
|
|
||||||
|
/* Magic initialization constants */
|
||||||
|
ctx->state[0] = 0x6A09E667;
|
||||||
|
ctx->state[1] = 0xBB67AE85;
|
||||||
|
ctx->state[2] = 0x3C6EF372;
|
||||||
|
ctx->state[3] = 0xA54FF53A;
|
||||||
|
ctx->state[4] = 0x510E527F;
|
||||||
|
ctx->state[5] = 0x9B05688C;
|
||||||
|
ctx->state[6] = 0x1F83D9AB;
|
||||||
|
ctx->state[7] = 0x5BE0CD19;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add bytes into the hash */
|
||||||
|
void
|
||||||
|
SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
|
||||||
|
{
|
||||||
|
uint32_t bitlen[2];
|
||||||
|
uint32_t r;
|
||||||
|
const unsigned char *src = in;
|
||||||
|
|
||||||
|
/* Number of bytes left in the buffer from previous updates */
|
||||||
|
r = (ctx->count[1] >> 3) & 0x3f;
|
||||||
|
|
||||||
|
/* Convert the length into a number of bits */
|
||||||
|
bitlen[1] = ((uint32_t)len) << 3;
|
||||||
|
bitlen[0] = (uint32_t)(len >> 29);
|
||||||
|
|
||||||
|
/* Update number of bits */
|
||||||
|
if ((ctx->count[1] += bitlen[1]) < bitlen[1])
|
||||||
|
ctx->count[0]++;
|
||||||
|
ctx->count[0] += bitlen[0];
|
||||||
|
|
||||||
|
/* Handle the case where we don't need to perform any transforms */
|
||||||
|
if (len < 64 - r) {
|
||||||
|
memcpy(&ctx->buf[r], src, len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finish the current block */
|
||||||
|
memcpy(&ctx->buf[r], src, 64 - r);
|
||||||
|
SHA256_Transform(ctx->state, ctx->buf);
|
||||||
|
src += 64 - r;
|
||||||
|
len -= 64 - r;
|
||||||
|
|
||||||
|
/* Perform complete blocks */
|
||||||
|
while (len >= 64) {
|
||||||
|
SHA256_Transform(ctx->state, src);
|
||||||
|
src += 64;
|
||||||
|
len -= 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy left over data into buffer */
|
||||||
|
memcpy(ctx->buf, src, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SHA-256 finalization. Pads the input data, exports the hash value,
|
||||||
|
* and clears the context state.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Add padding */
|
||||||
|
SHA256_Pad(ctx);
|
||||||
|
|
||||||
|
/* Write the hash */
|
||||||
|
be32enc_vect(digest, ctx->state, 32);
|
||||||
|
|
||||||
|
/* Clear the context state */
|
||||||
|
memset((void *)ctx, 0, sizeof(*ctx));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize an HMAC-SHA256 operation with the given key. */
|
||||||
|
void
|
||||||
|
HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
|
||||||
|
{
|
||||||
|
unsigned char pad[64];
|
||||||
|
unsigned char khash[32];
|
||||||
|
const unsigned char * K = _K;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* If Klen > 64, the key is really SHA256(K). */
|
||||||
|
if (Klen > 64) {
|
||||||
|
SHA256_Init(&ctx->ictx);
|
||||||
|
SHA256_Update(&ctx->ictx, K, Klen);
|
||||||
|
SHA256_Final(khash, &ctx->ictx);
|
||||||
|
K = khash;
|
||||||
|
Klen = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
|
||||||
|
SHA256_Init(&ctx->ictx);
|
||||||
|
memset(pad, 0x36, 64);
|
||||||
|
for (i = 0; i < Klen; i++)
|
||||||
|
pad[i] ^= K[i];
|
||||||
|
SHA256_Update(&ctx->ictx, pad, 64);
|
||||||
|
|
||||||
|
/* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
|
||||||
|
SHA256_Init(&ctx->octx);
|
||||||
|
memset(pad, 0x5c, 64);
|
||||||
|
for (i = 0; i < Klen; i++)
|
||||||
|
pad[i] ^= K[i];
|
||||||
|
SHA256_Update(&ctx->octx, pad, 64);
|
||||||
|
|
||||||
|
/* Clean the stack. */
|
||||||
|
memset(khash, 0, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add bytes to the HMAC-SHA256 operation. */
|
||||||
|
void
|
||||||
|
HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Feed data to the inner SHA256 operation. */
|
||||||
|
SHA256_Update(&ctx->ictx, in, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finish an HMAC-SHA256 operation. */
|
||||||
|
void
|
||||||
|
HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx)
|
||||||
|
{
|
||||||
|
unsigned char ihash[32];
|
||||||
|
|
||||||
|
/* Finish the inner SHA256 operation. */
|
||||||
|
SHA256_Final(ihash, &ctx->ictx);
|
||||||
|
|
||||||
|
/* Feed the inner hash to the outer SHA256 operation. */
|
||||||
|
SHA256_Update(&ctx->octx, ihash, 32);
|
||||||
|
|
||||||
|
/* Finish the outer SHA256 operation. */
|
||||||
|
SHA256_Final(digest, &ctx->octx);
|
||||||
|
|
||||||
|
/* Clean the stack. */
|
||||||
|
memset(ihash, 0, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
||||||
|
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
||||||
|
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
|
||||||
|
size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
|
||||||
|
{
|
||||||
|
HMAC_SHA256_CTX PShctx, hctx;
|
||||||
|
size_t i;
|
||||||
|
uint8_t ivec[4];
|
||||||
|
uint8_t U[32];
|
||||||
|
uint8_t T[32];
|
||||||
|
uint64_t j;
|
||||||
|
int k;
|
||||||
|
size_t clen;
|
||||||
|
|
||||||
|
/* Compute HMAC state after processing P and S. */
|
||||||
|
HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
|
||||||
|
HMAC_SHA256_Update(&PShctx, salt, saltlen);
|
||||||
|
|
||||||
|
/* Iterate through the blocks. */
|
||||||
|
for (i = 0; i * 32 < dkLen; i++) {
|
||||||
|
/* Generate INT(i + 1). */
|
||||||
|
be32enc(ivec, (uint32_t)(i + 1));
|
||||||
|
|
||||||
|
/* Compute U_1 = PRF(P, S || INT(i)). */
|
||||||
|
memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
|
||||||
|
HMAC_SHA256_Update(&hctx, ivec, 4);
|
||||||
|
HMAC_SHA256_Final(U, &hctx);
|
||||||
|
|
||||||
|
/* T_i = U_1 ... */
|
||||||
|
memcpy(T, U, 32);
|
||||||
|
|
||||||
|
for (j = 2; j <= c; j++) {
|
||||||
|
/* Compute U_j. */
|
||||||
|
HMAC_SHA256_Init(&hctx, passwd, passwdlen);
|
||||||
|
HMAC_SHA256_Update(&hctx, U, 32);
|
||||||
|
HMAC_SHA256_Final(U, &hctx);
|
||||||
|
|
||||||
|
/* ... xor U_j ... */
|
||||||
|
for (k = 0; k < 32; k++)
|
||||||
|
T[k] ^= U[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy as many bytes as necessary into buf. */
|
||||||
|
clen = dkLen - i * 32;
|
||||||
|
if (clen > 32)
|
||||||
|
clen = 32;
|
||||||
|
memcpy(&buf[i * 32], T, clen);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean PShctx, since we never called _Final on it. */
|
||||||
|
memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));
|
||||||
|
}
|
62
lib/crypto/sha256.h
Normal file
62
lib/crypto/sha256.h
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*-
|
||||||
|
* Copyright 2005,2007,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.
|
||||||
|
*
|
||||||
|
* $FreeBSD: src/lib/libmd/sha256.h,v 1.2 2006/01/17 15:35:56 phk Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SHA256_H_
|
||||||
|
#define _SHA256_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct SHA256Context {
|
||||||
|
uint32_t state[8];
|
||||||
|
uint32_t count[2];
|
||||||
|
unsigned char buf[64];
|
||||||
|
} SHA256_CTX;
|
||||||
|
|
||||||
|
typedef struct HMAC_SHA256Context {
|
||||||
|
SHA256_CTX ictx;
|
||||||
|
SHA256_CTX octx;
|
||||||
|
} HMAC_SHA256_CTX;
|
||||||
|
|
||||||
|
void SHA256_Init(SHA256_CTX *);
|
||||||
|
void SHA256_Update(SHA256_CTX *, const void *, size_t);
|
||||||
|
void SHA256_Final(unsigned char [32], SHA256_CTX *);
|
||||||
|
void HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t);
|
||||||
|
void HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t);
|
||||||
|
void HMAC_SHA256_Final(unsigned char [32], HMAC_SHA256_CTX *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
||||||
|
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
||||||
|
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
||||||
|
*/
|
||||||
|
void PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,
|
||||||
|
uint64_t, uint8_t *, size_t);
|
||||||
|
|
||||||
|
#endif /* !_SHA256_H_ */
|
606
lib/scryptenc/scryptenc.c
Normal file
606
lib/scryptenc/scryptenc.c
Normal file
|
@ -0,0 +1,606 @@
|
||||||
|
/*-
|
||||||
|
* 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 <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <openssl/aes.h>
|
||||||
|
|
||||||
|
#include "crypto_aesctr.h"
|
||||||
|
#include "crypto_scrypt.h"
|
||||||
|
#include "memlimit.h"
|
||||||
|
#include "scryptenc_cpuperf.h"
|
||||||
|
#include "sha256.h"
|
||||||
|
#include "sysendian.h"
|
||||||
|
|
||||||
|
#include "scryptenc.h"
|
||||||
|
|
||||||
|
#define ENCBLOCK 65536
|
||||||
|
|
||||||
|
static int pickparams(size_t, double, double,
|
||||||
|
int *, uint32_t *, uint32_t *);
|
||||||
|
static int checkparams(size_t, double, double, int, uint32_t, uint32_t);
|
||||||
|
static int getsalt(uint8_t[32]);
|
||||||
|
|
||||||
|
static int
|
||||||
|
pickparams(size_t maxmem, double maxmemfrac, double maxtime,
|
||||||
|
int * logN, uint32_t * r, uint32_t * p)
|
||||||
|
{
|
||||||
|
size_t memlimit;
|
||||||
|
double opps;
|
||||||
|
double opslimit;
|
||||||
|
double maxN, maxrp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Figure out how much memory to use. */
|
||||||
|
if (memtouse(maxmem, maxmemfrac, &memlimit))
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Figure out how fast the CPU is. */
|
||||||
|
if ((rc = scryptenc_cpuperf(&opps)) != 0)
|
||||||
|
return (rc);
|
||||||
|
opslimit = opps * maxtime;
|
||||||
|
|
||||||
|
/* Allow a minimum of 2^15 salsa20/8 cores. */
|
||||||
|
if (opslimit < 32768)
|
||||||
|
opslimit = 32768;
|
||||||
|
|
||||||
|
/* Fix r = 8 for now. */
|
||||||
|
*r = 8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The memory limit requires that 128Nr <= memlimit, while the CPU
|
||||||
|
* limit requires that 4Nrp <= opslimit. If opslimit < memlimit/32,
|
||||||
|
* opslimit imposes the stronger limit on N.
|
||||||
|
*/
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "Requiring 128Nr <= %zu, 4Nrp <= %f\n",
|
||||||
|
memlimit, opslimit);
|
||||||
|
#endif
|
||||||
|
if (opslimit < memlimit/32) {
|
||||||
|
/* Set p = 1 and choose N based on the CPU limit. */
|
||||||
|
*p = 1;
|
||||||
|
maxN = opslimit / (*r * 4);
|
||||||
|
for (*logN = 1; *logN < 63; *logN += 1) {
|
||||||
|
if ((uint64_t)(1) << *logN > maxN / 2)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Set N based on the memory limit. */
|
||||||
|
maxN = memlimit / (*r * 128);
|
||||||
|
for (*logN = 1; *logN < 63; *logN += 1) {
|
||||||
|
if ((uint64_t)(1) << *logN > maxN / 2)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Choose p based on the CPU limit. */
|
||||||
|
maxrp = (opslimit / 4) / ((uint64_t)(1) << *logN);
|
||||||
|
if (maxrp > 0x3fffffff)
|
||||||
|
maxrp = 0x3fffffff;
|
||||||
|
*p = (uint32_t)(maxrp) / *r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "N = %zu r = %d p = %d\n",
|
||||||
|
(size_t)(1) << *logN, (int)(*r), (int)(*p));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
checkparams(size_t maxmem, double maxmemfrac, double maxtime,
|
||||||
|
int logN, uint32_t r, uint32_t p)
|
||||||
|
{
|
||||||
|
size_t memlimit;
|
||||||
|
double opps;
|
||||||
|
double opslimit;
|
||||||
|
uint64_t N;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Figure out the maximum amount of memory we can use. */
|
||||||
|
if (memtouse(maxmem, maxmemfrac, &memlimit))
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Figure out how fast the CPU is. */
|
||||||
|
if ((rc = scryptenc_cpuperf(&opps)) != 0)
|
||||||
|
return (rc);
|
||||||
|
opslimit = opps * maxtime;
|
||||||
|
|
||||||
|
/* Sanity-check values. */
|
||||||
|
if ((logN < 1) || (logN > 63))
|
||||||
|
return (7);
|
||||||
|
if ((uint64_t)(r) * (uint64_t)(p) >= 0x40000000)
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Check limits. */
|
||||||
|
N = (uint64_t)(1) << logN;
|
||||||
|
if ((memlimit / N) / r < 128)
|
||||||
|
return (9);
|
||||||
|
if ((opslimit / N) / (r * p) < 4)
|
||||||
|
return (10);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getsalt(uint8_t salt[32])
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
ssize_t lenread;
|
||||||
|
uint8_t * buf = salt;
|
||||||
|
size_t buflen = 32;
|
||||||
|
|
||||||
|
/* Open /dev/urandom. */
|
||||||
|
if ((fd = open("/dev/urandom", O_RDONLY)) == -1)
|
||||||
|
goto err0;
|
||||||
|
|
||||||
|
/* Read bytes until we have filled the buffer. */
|
||||||
|
while (buflen > 0) {
|
||||||
|
if ((lenread = read(fd, buf, buflen)) == -1)
|
||||||
|
goto err1;
|
||||||
|
|
||||||
|
/* The random device should never EOF. */
|
||||||
|
if (lenread == 0)
|
||||||
|
goto err1;
|
||||||
|
|
||||||
|
/* We're partly done. */
|
||||||
|
buf += lenread;
|
||||||
|
buflen -= lenread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the device. */
|
||||||
|
while (close(fd) == -1) {
|
||||||
|
if (errno != EINTR)
|
||||||
|
goto err0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err1:
|
||||||
|
close(fd);
|
||||||
|
err0:
|
||||||
|
/* Failure! */
|
||||||
|
return (4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
scryptenc_setup(uint8_t header[96], uint8_t dk[64],
|
||||||
|
const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t salt[32];
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
int logN;
|
||||||
|
uint64_t N;
|
||||||
|
uint32_t r;
|
||||||
|
uint32_t p;
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Pick values for N, r, p. */
|
||||||
|
if ((rc = pickparams(maxmem, maxmemfrac, maxtime,
|
||||||
|
&logN, &r, &p)) != 0)
|
||||||
|
return (rc);
|
||||||
|
N = (uint64_t)(1) << logN;
|
||||||
|
|
||||||
|
/* Get some salt. */
|
||||||
|
if ((rc = getsalt(salt)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Generate the derived keys. */
|
||||||
|
if (crypto_scrypt(passwd, passwdlen, salt, 32, N, r, p, dk, 64))
|
||||||
|
return (3);
|
||||||
|
|
||||||
|
/* Construct the file header. */
|
||||||
|
memcpy(header, "scrypt", 6);
|
||||||
|
header[6] = 0;
|
||||||
|
header[7] = logN;
|
||||||
|
be32enc(&header[8], r);
|
||||||
|
be32enc(&header[12], p);
|
||||||
|
memcpy(&header[16], salt, 32);
|
||||||
|
|
||||||
|
/* Add header checksum. */
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, header, 48);
|
||||||
|
SHA256_Final(hbuf, &ctx);
|
||||||
|
memcpy(&header[48], hbuf, 16);
|
||||||
|
|
||||||
|
/* Add header signature (used for verifying password). */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, header, 64);
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
memcpy(&header[64], hbuf, 32);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
scryptdec_setup(const uint8_t header[96], uint8_t dk[64],
|
||||||
|
const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t salt[32];
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
int logN;
|
||||||
|
uint32_t r;
|
||||||
|
uint32_t p;
|
||||||
|
uint64_t N;
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Parse N, r, p, salt. */
|
||||||
|
logN = header[7];
|
||||||
|
r = be32dec(&header[8]);
|
||||||
|
p = be32dec(&header[12]);
|
||||||
|
memcpy(salt, &header[16], 32);
|
||||||
|
|
||||||
|
/* Verify header checksum. */
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, header, 48);
|
||||||
|
SHA256_Final(hbuf, &ctx);
|
||||||
|
if (memcmp(&header[48], hbuf, 16))
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether the provided parameters are valid and whether the
|
||||||
|
* key derivation function can be computed within the allowed memory
|
||||||
|
* and CPU time.
|
||||||
|
*/
|
||||||
|
if ((rc = checkparams(maxmem, maxmemfrac, maxtime, logN, r, p)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Compute the derived keys. */
|
||||||
|
N = (uint64_t)(1) << logN;
|
||||||
|
if (crypto_scrypt(passwd, passwdlen, salt, 32, N, r, p, dk, 64))
|
||||||
|
return (3);
|
||||||
|
|
||||||
|
/* Check header signature (i.e., verify password). */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, header, 64);
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
if (memcmp(hbuf, &header[64], 32))
|
||||||
|
return (11);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_buf(inbuf, inbuflen, outbuf, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Encrypt inbuflen bytes from inbuf, writing the resulting inbuflen + 128
|
||||||
|
* bytes to outbuf.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
scryptenc_buf(const uint8_t * inbuf, size_t inbuflen, uint8_t * outbuf,
|
||||||
|
const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t dk[64];
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
uint8_t header[96];
|
||||||
|
uint8_t * key_enc = dk;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
int rc;
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
AES_KEY key_enc_exp;
|
||||||
|
struct crypto_aesctr * AES;
|
||||||
|
|
||||||
|
/* Generate the header and derived key. */
|
||||||
|
if ((rc = scryptenc_setup(header, dk, passwd, passwdlen,
|
||||||
|
maxmem, maxmemfrac, maxtime)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Copy header into output buffer. */
|
||||||
|
memcpy(outbuf, header, 96);
|
||||||
|
|
||||||
|
/* Encrypt data. */
|
||||||
|
if (AES_set_encrypt_key(key_enc, 256, &key_enc_exp))
|
||||||
|
return (5);
|
||||||
|
if ((AES = crypto_aesctr_init(&key_enc_exp, 0)) == NULL)
|
||||||
|
return (6);
|
||||||
|
crypto_aesctr_stream(AES, inbuf, &outbuf[96], inbuflen);
|
||||||
|
crypto_aesctr_free(AES);
|
||||||
|
|
||||||
|
/* Add signature. */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, outbuf, 96 + inbuflen);
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
memcpy(&outbuf[96 + inbuflen], hbuf, 32);
|
||||||
|
|
||||||
|
/* Zero sensitive data. */
|
||||||
|
memset(dk, 0, 64);
|
||||||
|
memset(&key_enc_exp, 0, sizeof(AES_KEY));
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptdec_buf(inbuf, inbuflen, outbuf, outlen, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Decrypt inbuflen bytes fro inbuf, writing the result into outbuf and the
|
||||||
|
* decrypted data length to outlen. The allocated length of outbuf must
|
||||||
|
* be at least inbuflen.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
scryptdec_buf(const uint8_t * inbuf, size_t inbuflen, uint8_t * outbuf,
|
||||||
|
size_t * outlen, const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
uint8_t dk[64];
|
||||||
|
uint8_t * key_enc = dk;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
int rc;
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
AES_KEY key_enc_exp;
|
||||||
|
struct crypto_aesctr * AES;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All versions of the scrypt format will start with "scrypt" and
|
||||||
|
* have at least 7 bytes of header.
|
||||||
|
*/
|
||||||
|
if ((inbuflen < 7) || (memcmp(inbuf, "scrypt", 6) != 0))
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Check the format. */
|
||||||
|
if (inbuf[6] != 0)
|
||||||
|
return (8);
|
||||||
|
|
||||||
|
/* We must have at least 128 bytes. */
|
||||||
|
if (inbuflen < 128)
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Parse the header and generate derived keys. */
|
||||||
|
if ((rc = scryptdec_setup(inbuf, dk, passwd, passwdlen,
|
||||||
|
maxmem, maxmemfrac, maxtime)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Decrypt data. */
|
||||||
|
if (AES_set_encrypt_key(key_enc, 256, &key_enc_exp))
|
||||||
|
return (5);
|
||||||
|
if ((AES = crypto_aesctr_init(&key_enc_exp, 0)) == NULL)
|
||||||
|
return (6);
|
||||||
|
crypto_aesctr_stream(AES, &inbuf[96], outbuf, inbuflen - 128);
|
||||||
|
crypto_aesctr_free(AES);
|
||||||
|
*outlen = inbuflen - 128;
|
||||||
|
|
||||||
|
/* Verify signature. */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, inbuf, inbuflen - 32);
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
if (memcmp(hbuf, &inbuf[inbuflen - 32], 32))
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Zero sensitive data. */
|
||||||
|
memset(dk, 0, 64);
|
||||||
|
memset(&key_enc_exp, 0, sizeof(AES_KEY));
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_file(infile, outfile, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Read a stream from infile and encrypt it, writing the resulting stream to
|
||||||
|
* outfile.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
scryptenc_file(FILE * infile, FILE * outfile,
|
||||||
|
const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t buf[ENCBLOCK];
|
||||||
|
uint8_t dk[64];
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
uint8_t header[96];
|
||||||
|
uint8_t * key_enc = dk;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
size_t readlen;
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
AES_KEY key_enc_exp;
|
||||||
|
struct crypto_aesctr * AES;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Generate the header and derived key. */
|
||||||
|
if ((rc = scryptenc_setup(header, dk, passwd, passwdlen,
|
||||||
|
maxmem, maxmemfrac, maxtime)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Hash and write the header. */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, header, 96);
|
||||||
|
if (fwrite(header, 96, 1, outfile) != 1)
|
||||||
|
return (12);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read blocks of data, encrypt them, and write them out; hash the
|
||||||
|
* data as it is produced.
|
||||||
|
*/
|
||||||
|
if (AES_set_encrypt_key(key_enc, 256, &key_enc_exp))
|
||||||
|
return (5);
|
||||||
|
if ((AES = crypto_aesctr_init(&key_enc_exp, 0)) == NULL)
|
||||||
|
return (6);
|
||||||
|
do {
|
||||||
|
if ((readlen = fread(buf, 1, ENCBLOCK, infile)) == 0)
|
||||||
|
break;
|
||||||
|
crypto_aesctr_stream(AES, buf, buf, readlen);
|
||||||
|
HMAC_SHA256_Update(&hctx, buf, readlen);
|
||||||
|
if (fwrite(buf, 1, readlen, outfile) < readlen)
|
||||||
|
return (12);
|
||||||
|
} while (1);
|
||||||
|
crypto_aesctr_free(AES);
|
||||||
|
|
||||||
|
/* Did we exit the loop due to a read error? */
|
||||||
|
if (ferror(infile))
|
||||||
|
return (13);
|
||||||
|
|
||||||
|
/* Compute the final HMAC and output it. */
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
if (fwrite(hbuf, 32, 1, outfile) != 1)
|
||||||
|
return (12);
|
||||||
|
|
||||||
|
/* Zero sensitive data. */
|
||||||
|
memset(dk, 0, 64);
|
||||||
|
memset(&key_enc_exp, 0, sizeof(AES_KEY));
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptdec_file(infile, outfile, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Read a stream from infile and decrypt it, writing the resulting stream to
|
||||||
|
* outfile.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
scryptdec_file(FILE * infile, FILE * outfile,
|
||||||
|
const uint8_t * passwd, size_t passwdlen,
|
||||||
|
size_t maxmem, double maxmemfrac, double maxtime)
|
||||||
|
{
|
||||||
|
uint8_t buf[ENCBLOCK + 32];
|
||||||
|
uint8_t header[96];
|
||||||
|
uint8_t hbuf[32];
|
||||||
|
uint8_t dk[64];
|
||||||
|
uint8_t * key_enc = dk;
|
||||||
|
uint8_t * key_hmac = &dk[32];
|
||||||
|
size_t buflen = 0;
|
||||||
|
size_t readlen;
|
||||||
|
HMAC_SHA256_CTX hctx;
|
||||||
|
AES_KEY key_enc_exp;
|
||||||
|
struct crypto_aesctr * AES;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read the first 7 bytes of the file; all future version of scrypt
|
||||||
|
* are guaranteed to have at least 7 bytes of header.
|
||||||
|
*/
|
||||||
|
if (fread(header, 7, 1, infile) < 1) {
|
||||||
|
if (ferror(infile))
|
||||||
|
return (13);
|
||||||
|
else
|
||||||
|
return (7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do we have the right magic? */
|
||||||
|
if (memcmp(header, "scrypt", 6))
|
||||||
|
return (7);
|
||||||
|
if (header[6] != 0)
|
||||||
|
return (8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read another 89 bytes of the file; version 0 of the srypt file
|
||||||
|
* format has a 96-byte header.
|
||||||
|
*/
|
||||||
|
if (fread(&header[7], 89, 1, infile) < 1) {
|
||||||
|
if (ferror(infile))
|
||||||
|
return (13);
|
||||||
|
else
|
||||||
|
return (7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the header and generate derived keys. */
|
||||||
|
if ((rc = scryptdec_setup(header, dk, passwd, passwdlen,
|
||||||
|
maxmem, maxmemfrac, maxtime)) != 0)
|
||||||
|
return (rc);
|
||||||
|
|
||||||
|
/* Start hashing with the header. */
|
||||||
|
HMAC_SHA256_Init(&hctx, key_hmac, 32);
|
||||||
|
HMAC_SHA256_Update(&hctx, header, 96);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't know how long the encrypted data block is (we can't know,
|
||||||
|
* since data can be streamed into 'scrypt enc') so we need to read
|
||||||
|
* data and decrypt all of it except the final 32 bytes, then check
|
||||||
|
* if that final 32 bytes is the correct signature.
|
||||||
|
*/
|
||||||
|
if (AES_set_encrypt_key(key_enc, 256, &key_enc_exp))
|
||||||
|
return (5);
|
||||||
|
if ((AES = crypto_aesctr_init(&key_enc_exp, 0)) == NULL)
|
||||||
|
return (6);
|
||||||
|
do {
|
||||||
|
/* Read data until we have more than 32 bytes of it. */
|
||||||
|
if ((readlen = fread(&buf[buflen], 1,
|
||||||
|
ENCBLOCK + 32 - buflen, infile)) == 0)
|
||||||
|
break;
|
||||||
|
buflen += readlen;
|
||||||
|
if (buflen <= 32)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decrypt, hash, and output everything except the last 32
|
||||||
|
* bytes out of what we have in our buffer.
|
||||||
|
*/
|
||||||
|
HMAC_SHA256_Update(&hctx, buf, buflen - 32);
|
||||||
|
crypto_aesctr_stream(AES, buf, buf, buflen - 32);
|
||||||
|
if (fwrite(buf, 1, buflen - 32, outfile) < buflen - 32)
|
||||||
|
return (12);
|
||||||
|
|
||||||
|
/* Move the last 32 bytes to the start of the buffer. */
|
||||||
|
memmove(buf, &buf[buflen - 32], 32);
|
||||||
|
buflen = 32;
|
||||||
|
} while (1);
|
||||||
|
crypto_aesctr_free(AES);
|
||||||
|
|
||||||
|
/* Did we exit the loop due to a read error? */
|
||||||
|
if (ferror(infile))
|
||||||
|
return (13);
|
||||||
|
|
||||||
|
/* Did we read enough data that we *might* have a valid signature? */
|
||||||
|
if (buflen < 32)
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Verify signature. */
|
||||||
|
HMAC_SHA256_Final(hbuf, &hctx);
|
||||||
|
if (memcmp(hbuf, buf, 32))
|
||||||
|
return (7);
|
||||||
|
|
||||||
|
/* Zero sensitive data. */
|
||||||
|
memset(dk, 0, 64);
|
||||||
|
memset(&key_enc_exp, 0, sizeof(AES_KEY));
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
112
lib/scryptenc/scryptenc.h
Normal file
112
lib/scryptenc/scryptenc.h
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*-
|
||||||
|
* 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 _SCRYPTENC_H_
|
||||||
|
#define _SCRYPTENC_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parameters maxmem, maxmemfrac, and maxtime used by all of these
|
||||||
|
* functions are defined as follows:
|
||||||
|
* maxmem - maximum number of bytes of storage to use for V array (which is
|
||||||
|
* by far the largest consumer of memory). If this value is set to 0, no
|
||||||
|
* maximum will be enforced; any other value less than 1 MiB will be
|
||||||
|
* treated as 1 MiB.
|
||||||
|
* maxmemfrac - maximum fraction of available storage to use for the V array,
|
||||||
|
* where "available storage" is defined as the minimum out of the
|
||||||
|
* RLIMIT_AS, RLIMIT_DATA. and RLIMIT_RSS resource limits (if any are
|
||||||
|
* set). If this value is set to 0 or more than 0.5 it will be treated
|
||||||
|
* as 0.5; and this value will never cause a limit of less than 1 MiB to
|
||||||
|
* be enforced.
|
||||||
|
* maxtime - maximum amount of CPU time to spend computing the derived keys,
|
||||||
|
* in seconds. This limit is only approximately enforced; the CPU
|
||||||
|
* performance is estimated and parameter limits are chosen accordingly.
|
||||||
|
* For the encryption functions, the parameters to the scrypt key derivation
|
||||||
|
* function are chosen to make the key as strong as possible subject to the
|
||||||
|
* specified limits; for the decryption functions, the parameters used are
|
||||||
|
* compared to the computed limits and an error is returned if decrypting
|
||||||
|
* the data would take too much memory or CPU time.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Return codes from scrypt(enc|dec)_(buf|file):
|
||||||
|
* 0 success
|
||||||
|
* 1 getrlimit or sysctl(hw.usermem) failed
|
||||||
|
* 2 clock_getres or clock_gettime failed
|
||||||
|
* 3 error computing derived key
|
||||||
|
* 4 could not read salt from /dev/urandom
|
||||||
|
* 5 error in OpenSSL
|
||||||
|
* 6 malloc failed
|
||||||
|
* 7 data is not a valid scrypt-encrypted block
|
||||||
|
* 8 unrecognized scrypt format
|
||||||
|
* 9 decrypting file would take too much memory
|
||||||
|
* 10 decrypting file would take too long
|
||||||
|
* 11 password is incorrect
|
||||||
|
* 12 error writing output file
|
||||||
|
* 13 error reading input file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_buf(inbuf, inbuflen, outbuf, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Encrypt inbuflen bytes from inbuf, writing the resulting inbuflen + 128
|
||||||
|
* bytes to outbuf.
|
||||||
|
*/
|
||||||
|
int scryptenc_buf(const uint8_t *, size_t, uint8_t *,
|
||||||
|
const uint8_t *, size_t, size_t, double, double);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptdec_buf(inbuf, inbuflen, outbuf, outlen, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Decrypt inbuflen bytes from inbuf, writing the result into outbuf and the
|
||||||
|
* decrypted data length to outlen. The allocated length of outbuf must
|
||||||
|
* be at least inbuflen.
|
||||||
|
*/
|
||||||
|
int scryptdec_buf(const uint8_t *, size_t, uint8_t *, size_t *,
|
||||||
|
const uint8_t *, size_t, size_t, double, double);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_file(infile, outfile, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Read a stream from infile and encrypt it, writing the resulting stream to
|
||||||
|
* outfile.
|
||||||
|
*/
|
||||||
|
int scryptenc_file(FILE *, FILE *, const uint8_t *, size_t,
|
||||||
|
size_t, double, double);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptdec_file(infile, outfile, passwd, passwdlen,
|
||||||
|
* maxmem, maxmemfrac, maxtime):
|
||||||
|
* Read a stream from infile and decrypt it, writing the resulting stream to
|
||||||
|
* outfile.
|
||||||
|
*/
|
||||||
|
int scryptdec_file(FILE *, FILE *, const uint8_t *, size_t,
|
||||||
|
size_t, double, double);
|
||||||
|
|
||||||
|
#endif /* !_SCRYPTENC_H_ */
|
185
lib/scryptenc/scryptenc_cpuperf.c
Normal file
185
lib/scryptenc/scryptenc_cpuperf.c
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
/*-
|
||||||
|
* 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 <sys/time.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "crypto_scrypt.h"
|
||||||
|
|
||||||
|
#include "scryptenc_cpuperf.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_CLOCK_GETTIME
|
||||||
|
|
||||||
|
static clock_t clocktouse;
|
||||||
|
|
||||||
|
static int
|
||||||
|
getclockres(double * resd)
|
||||||
|
{
|
||||||
|
struct timespec res;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try clocks in order of preference until we find one which works.
|
||||||
|
* (We assume that if clock_getres works, clock_gettime will, too.)
|
||||||
|
* The use of if/else/if/else/if/else rather than if/elif/elif/else
|
||||||
|
* is ugly but legal, and allows us to #ifdef things appropriately.
|
||||||
|
*/
|
||||||
|
#ifdef CLOCK_VIRTUAL
|
||||||
|
if (clock_getres(CLOCK_VIRTUAL, &res) == 0)
|
||||||
|
clocktouse = CLOCK_VIRTUAL;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CLOCK_MONOTONIC
|
||||||
|
if (clock_getres(CLOCK_MONOTONIC, &res) == 0)
|
||||||
|
clocktouse = CLOCK_MONOTONIC;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (clock_getres(CLOCK_REALTIME, &res) == 0)
|
||||||
|
clocktouse = CLOCK_REALTIME;
|
||||||
|
else
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
/* Convert clock resolution to a double. */
|
||||||
|
*resd = res.tv_sec + res.tv_nsec * 0.000000001;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getclocktime(struct timespec * ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (clock_gettime(clocktouse, ts))
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
static int
|
||||||
|
getclockres(double * resd)
|
||||||
|
{
|
||||||
|
|
||||||
|
*resd = 1.0 / CLOCKS_PER_SEC;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getclocktime(struct timespec * ts)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
if (gettimeofday(&tv, NULL))
|
||||||
|
return (-1);
|
||||||
|
ts->tv_sec = tv.tv_sec;
|
||||||
|
ts->tv_nsec = tv.tv_usec * 1000;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int
|
||||||
|
getclockdiff(struct timespec * st, double * diffd)
|
||||||
|
{
|
||||||
|
struct timespec en;
|
||||||
|
|
||||||
|
if (getclocktime(&en))
|
||||||
|
return (1);
|
||||||
|
*diffd = (en.tv_nsec - st->tv_nsec) * 0.000000001 +
|
||||||
|
(en.tv_sec - st->tv_sec);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_cpuperf(opps):
|
||||||
|
* Estimate the number of salsa20/8 cores which can be executed per second,
|
||||||
|
* and return the value via opps.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
scryptenc_cpuperf(double * opps)
|
||||||
|
{
|
||||||
|
struct timespec st;
|
||||||
|
double resd, diffd;
|
||||||
|
uint64_t i = 0;
|
||||||
|
|
||||||
|
/* Get the clock resolution. */
|
||||||
|
if (getclockres(&resd))
|
||||||
|
return (2);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "Clock resolution is %f\n", resd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Loop until the clock ticks. */
|
||||||
|
if (getclocktime(&st))
|
||||||
|
return (2);
|
||||||
|
do {
|
||||||
|
/* Do an scrypt. */
|
||||||
|
if (crypto_scrypt(NULL, 0, NULL, 0, 16, 1, 1, NULL, 0))
|
||||||
|
return (3);
|
||||||
|
|
||||||
|
/* Has the clock ticked? */
|
||||||
|
if (getclockdiff(&st, &diffd))
|
||||||
|
return (2);
|
||||||
|
if (diffd > 0)
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
/* Could how many scryps we can do before the next tick. */
|
||||||
|
if (getclocktime(&st))
|
||||||
|
return (2);
|
||||||
|
do {
|
||||||
|
/* Do an scrypt. */
|
||||||
|
if (crypto_scrypt(NULL, 0, NULL, 0, 128, 1, 1, NULL, 0))
|
||||||
|
return (3);
|
||||||
|
|
||||||
|
/* We invoked the salsa20/8 core 512 times. */
|
||||||
|
i += 512;
|
||||||
|
|
||||||
|
/* Check if we have looped for long enough. */
|
||||||
|
if (getclockdiff(&st, &diffd))
|
||||||
|
return (2);
|
||||||
|
if (diffd > resd)
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "%ju salsa20/8 cores performed in %f seconds\n",
|
||||||
|
(uintmax_t)i, diffd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We can do approximately i salsa20/8 cores per diffd seconds. */
|
||||||
|
*opps = i / diffd;
|
||||||
|
return (0);
|
||||||
|
}
|
39
lib/scryptenc/scryptenc_cpuperf.h
Normal file
39
lib/scryptenc/scryptenc_cpuperf.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*-
|
||||||
|
* 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 _SCRYPTENC_CPUPERF_H_
|
||||||
|
#define _SCRYPTENC_CPUPERF_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scryptenc_cpuperf(opps):
|
||||||
|
* Estimate the number of salsa20/8 cores which can be executed per second,
|
||||||
|
* and return the value via opps.
|
||||||
|
*/
|
||||||
|
int scryptenc_cpuperf(double *);
|
||||||
|
|
||||||
|
#endif /* !_SCRYPTENC_CPUPERF_H_ */
|
302
lib/util/memlimit.c
Normal file
302
lib/util/memlimit.c
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
/*-
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
|
#include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYSCTL_HW_USERMEM
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SYSINFO_H
|
||||||
|
#include <sys/sysinfo.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#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);
|
||||||
|
}
|
42
lib/util/memlimit.h
Normal file
42
lib/util/memlimit.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*-
|
||||||
|
* 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 <stddef.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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_ */
|
143
lib/util/readpass.c
Normal file
143
lib/util/readpass.c
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/*-
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
#include "scrypt_platform.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "warn.h"
|
||||||
|
|
||||||
|
#include "readpass.h"
|
||||||
|
|
||||||
|
#define MAXPASSLEN 2048
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||||
|
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||||
|
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||||
|
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||||
|
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||||
|
* terminal is being used) and repeat until the user enters the same password
|
||||||
|
* twice. Return the password as a malloced NUL-terminated string via
|
||||||
|
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||||
|
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tarsnap_readpass(char ** passwd, const char * prompt,
|
||||||
|
const char * confirmprompt, int devtty)
|
||||||
|
{
|
||||||
|
FILE * readfrom;
|
||||||
|
char passbuf[MAXPASSLEN];
|
||||||
|
char confpassbuf[MAXPASSLEN];
|
||||||
|
struct termios term, term_old;
|
||||||
|
int usingtty;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If devtty != 0, try to open /dev/tty; if that fails, or if devtty
|
||||||
|
* is zero, we'll read the password from stdin instead.
|
||||||
|
*/
|
||||||
|
if ((devtty == 0) || ((readfrom = fopen("/dev/tty", "r")) == NULL))
|
||||||
|
readfrom = stdin;
|
||||||
|
|
||||||
|
/* If we're reading from a terminal, try to disable echo. */
|
||||||
|
if ((usingtty = isatty(fileno(readfrom))) != 0) {
|
||||||
|
if (tcgetattr(fileno(readfrom), &term_old)) {
|
||||||
|
warn("Cannot read terminal settings");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
memcpy(&term, &term_old, sizeof(struct termios));
|
||||||
|
term.c_lflag = (term.c_lflag & ~ECHO) | ECHONL;
|
||||||
|
if (tcsetattr(fileno(readfrom), TCSANOW, &term)) {
|
||||||
|
warn("Cannot set terminal settings");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retry:
|
||||||
|
/* If we have a terminal, prompt the user to enter the password. */
|
||||||
|
if (usingtty)
|
||||||
|
fprintf(stderr, "%s: ", prompt);
|
||||||
|
|
||||||
|
/* Read the password. */
|
||||||
|
if (fgets(passbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||||
|
warn("Cannot read password");
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Confirm the password if necessary. */
|
||||||
|
if (confirmprompt != NULL) {
|
||||||
|
if (usingtty)
|
||||||
|
fprintf(stderr, "%s: ", confirmprompt);
|
||||||
|
if (fgets(confpassbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||||
|
warn("Cannot read password");
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
if (strcmp(passbuf, confpassbuf)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Passwords mismatch, please try again\n");
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Terminate the string at the first "\r" or "\n" (if any). */
|
||||||
|
passbuf[strcspn(passbuf, "\r\n")] = '\0';
|
||||||
|
|
||||||
|
/* If we changed terminal settings, reset them. */
|
||||||
|
if (usingtty)
|
||||||
|
tcsetattr(fileno(readfrom), TCSANOW, &term_old);
|
||||||
|
|
||||||
|
/* Close /dev/tty if we opened it. */
|
||||||
|
if (readfrom != stdin)
|
||||||
|
fclose(readfrom);
|
||||||
|
|
||||||
|
/* Copy the password out. */
|
||||||
|
if ((*passwd = strdup(passbuf)) == NULL) {
|
||||||
|
warn("Cannot allocate memory");
|
||||||
|
goto err1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zero any stored passwords. */
|
||||||
|
memset(passbuf, 0, MAXPASSLEN);
|
||||||
|
memset(confpassbuf, 0, MAXPASSLEN);
|
||||||
|
|
||||||
|
/* Success! */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
err2:
|
||||||
|
/* Reset terminal settings if necessary. */
|
||||||
|
if (usingtty)
|
||||||
|
tcsetattr(fileno(readfrom), TCSAFLUSH, &term_old);
|
||||||
|
err1:
|
||||||
|
/* Close /dev/tty if we opened it. */
|
||||||
|
if (readfrom != stdin)
|
||||||
|
fclose(readfrom);
|
||||||
|
|
||||||
|
/* Failure! */
|
||||||
|
return (-1);
|
||||||
|
}
|
45
lib/util/readpass.h
Normal file
45
lib/util/readpass.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*-
|
||||||
|
* 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 _READPASS_H_
|
||||||
|
#define _READPASS_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||||
|
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||||
|
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||||
|
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||||
|
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||||
|
* terminal is being used) and repeat until the user enters the same password
|
||||||
|
* twice. Return the password as a malloced NUL-terminated string via
|
||||||
|
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||||
|
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||||
|
*/
|
||||||
|
int tarsnap_readpass(char **, const char *, const char *, int);
|
||||||
|
|
||||||
|
#endif /* !_READPASS_H_ */
|
140
lib/util/sysendian.h
Normal file
140
lib/util/sysendian.h
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
/*-
|
||||||
|
* Copyright 2007-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 _SYSENDIAN_H_
|
||||||
|
#define _SYSENDIAN_H_
|
||||||
|
|
||||||
|
#include "scrypt_platform.h"
|
||||||
|
|
||||||
|
/* If we don't have be64enc, the <sys/endian.h> we have isn't usable. */
|
||||||
|
#if !HAVE_DECL_BE64ENC
|
||||||
|
#undef HAVE_SYS_ENDIAN_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_ENDIAN_H
|
||||||
|
|
||||||
|
#include <sys/endian.h>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
be32dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +
|
||||||
|
((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
be32enc(void *pp, uint32_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[3] = x & 0xff;
|
||||||
|
p[2] = (x >> 8) & 0xff;
|
||||||
|
p[1] = (x >> 16) & 0xff;
|
||||||
|
p[0] = (x >> 24) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
be64dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
|
||||||
|
((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
|
||||||
|
((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
|
||||||
|
((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
be64enc(void *pp, uint64_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[7] = x & 0xff;
|
||||||
|
p[6] = (x >> 8) & 0xff;
|
||||||
|
p[5] = (x >> 16) & 0xff;
|
||||||
|
p[4] = (x >> 24) & 0xff;
|
||||||
|
p[3] = (x >> 32) & 0xff;
|
||||||
|
p[2] = (x >> 40) & 0xff;
|
||||||
|
p[1] = (x >> 48) & 0xff;
|
||||||
|
p[0] = (x >> 56) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
le32dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
|
||||||
|
((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
le32enc(void *pp, uint32_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[0] = x & 0xff;
|
||||||
|
p[1] = (x >> 8) & 0xff;
|
||||||
|
p[2] = (x >> 16) & 0xff;
|
||||||
|
p[3] = (x >> 24) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
le64dec(const void *pp)
|
||||||
|
{
|
||||||
|
const uint8_t *p = (uint8_t const *)pp;
|
||||||
|
|
||||||
|
return ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) +
|
||||||
|
((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) +
|
||||||
|
((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) +
|
||||||
|
((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
le64enc(void *pp, uint64_t x)
|
||||||
|
{
|
||||||
|
uint8_t * p = (uint8_t *)pp;
|
||||||
|
|
||||||
|
p[0] = x & 0xff;
|
||||||
|
p[1] = (x >> 8) & 0xff;
|
||||||
|
p[2] = (x >> 16) & 0xff;
|
||||||
|
p[3] = (x >> 24) & 0xff;
|
||||||
|
p[4] = (x >> 32) & 0xff;
|
||||||
|
p[5] = (x >> 40) & 0xff;
|
||||||
|
p[6] = (x >> 48) & 0xff;
|
||||||
|
p[7] = (x >> 56) & 0xff;
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_SYS_ENDIAN_H */
|
||||||
|
|
||||||
|
#endif /* !_SYSENDIAN_H_ */
|
75
lib/util/warn.c
Normal file
75
lib/util/warn.c
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*-
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#ifdef HAVE_ERR_H
|
||||||
|
/*
|
||||||
|
* Everything is provided through err.h and the associated library, so we
|
||||||
|
* don't need to do anything here.
|
||||||
|
*/
|
||||||
|
#else
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "warn.h"
|
||||||
|
|
||||||
|
const char * warn_progname = "(null)";
|
||||||
|
|
||||||
|
void
|
||||||
|
warn(const char * fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s", warn_progname);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
fprintf(stderr, ": ");
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
}
|
||||||
|
fprintf(stderr, ": %s\n", strerror(errno));
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warnx(const char * fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s", warn_progname);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
fprintf(stderr, ": ");
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
#endif
|
13
lib/util/warn.h
Normal file
13
lib/util/warn.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef _WARN_H_
|
||||||
|
#define _WARN_H_
|
||||||
|
|
||||||
|
#ifdef HAVE_ERR_H
|
||||||
|
#include <err.h>
|
||||||
|
#else
|
||||||
|
#define NEED_WARN_PROGNAME
|
||||||
|
const char * warn_progname;
|
||||||
|
void warn(const char *, ...);
|
||||||
|
void warnx(const char *, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_WARN_H_ */
|
181
main.c
Normal file
181
main.c
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
/*-
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
#include "scrypt_platform.h"
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "readpass.h"
|
||||||
|
#include "scryptenc.h"
|
||||||
|
#include "warn.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: scrypt {enc | dec} [...] infile [outfile]\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
FILE * infile = NULL;
|
||||||
|
FILE * outfile = stdout;
|
||||||
|
int dec = 0;
|
||||||
|
size_t maxmem = 0;
|
||||||
|
double maxmemfrac = 0.5;
|
||||||
|
double maxtime = 300.0;
|
||||||
|
char ch;
|
||||||
|
char * passwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
#ifdef NEED_WARN_PROGNAME
|
||||||
|
warn_progname = "scrypt";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We should have "enc" or "dec" first. */
|
||||||
|
if (argc < 2)
|
||||||
|
usage();
|
||||||
|
if (strcmp(argv[1], "enc") == 0) {
|
||||||
|
maxmem = 0;
|
||||||
|
maxmemfrac = 0.125;
|
||||||
|
maxtime = 5.0;
|
||||||
|
} else if (strcmp(argv[1], "dec") == 0) {
|
||||||
|
dec = 1;
|
||||||
|
} else
|
||||||
|
usage();
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
|
||||||
|
/* Parse arguments. */
|
||||||
|
while ((ch = getopt(argc, argv, "hm:M:t:")) != -1) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'M':
|
||||||
|
maxmem = strtoumax(optarg, NULL, 0);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
maxmemfrac = strtod(optarg, NULL);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
maxtime = strtod(optarg, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
/* We must have one or two parameters left. */
|
||||||
|
if ((argc < 1) || (argc > 2))
|
||||||
|
usage();
|
||||||
|
|
||||||
|
/* Open the input file. */
|
||||||
|
if ((infile = fopen(argv[0], "r")) == NULL) {
|
||||||
|
warn("Cannot open input file: %s", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we have an output file, open it. */
|
||||||
|
if (argc > 1) {
|
||||||
|
if ((outfile = fopen(argv[1], "w")) == NULL) {
|
||||||
|
warn("Cannot open output file: %s", argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prompt for a password. */
|
||||||
|
if (tarsnap_readpass(&passwd, "Please enter passphrase",
|
||||||
|
dec ? NULL : "Please confirm passphrase", 1))
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
/* Encrypt or decrypt. */
|
||||||
|
if (dec)
|
||||||
|
rc = scryptdec_file(infile, outfile, (uint8_t *)passwd,
|
||||||
|
strlen(passwd), maxmem, maxmemfrac, maxtime);
|
||||||
|
else
|
||||||
|
rc = scryptenc_file(infile, outfile, (uint8_t *)passwd,
|
||||||
|
strlen(passwd), maxmem, maxmemfrac, maxtime);
|
||||||
|
|
||||||
|
/* Zero and free the password. */
|
||||||
|
memset(passwd, 0, strlen(passwd));
|
||||||
|
free(passwd);
|
||||||
|
|
||||||
|
/* If we failed, print the right error message and exit. */
|
||||||
|
if (rc != 0) {
|
||||||
|
switch (rc) {
|
||||||
|
case 1:
|
||||||
|
warn("Error determining amount of available memory");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
warn("Error reading clocks");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
warn("Error computing derived key");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
warn("Error reading salt");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
warn("OpenSSL error");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
warn("Error allocating memory");
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
warnx("Input is not valid scrypt-encrypted block");
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
warnx("Unrecognized scrypt format version");
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
warnx("Decrypting file would require too much memory");
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
warnx("Decrypting file would take too much CPU time");
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
warnx("Passphrase is incorrect");
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
warn("Error writing file: %s",
|
||||||
|
(argc > 1) ? argv[1] : "standard output");
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
warn("Error reading file: %s", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
114
scrypt.1
Normal file
114
scrypt.1
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
.\" 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.
|
||||||
|
.Dd May 24, 2009
|
||||||
|
.Dt SCRYPT 1
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm scrypt
|
||||||
|
.Nd encrypt and decrypt files.
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Brq Cm enc | Cm dec
|
||||||
|
.Op Fl M Ar maxmem
|
||||||
|
.Op Fl m Ar maxmemfrac
|
||||||
|
.Op Fl t Ar maxtime
|
||||||
|
.Ar infile
|
||||||
|
.Op Ar outfile
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Nm Cm enc
|
||||||
|
encrypts
|
||||||
|
.Ar infile
|
||||||
|
and writes the result to
|
||||||
|
.Ar outfile
|
||||||
|
if specified, or the standard output otherwise.
|
||||||
|
The user will be prompted to enter a passphrase (twice) to
|
||||||
|
be used to generate a derived encryption key.
|
||||||
|
.Pp
|
||||||
|
.Nm Cm dec
|
||||||
|
decrypts
|
||||||
|
.Ar infile
|
||||||
|
and writes the result to
|
||||||
|
.Ar outfile
|
||||||
|
if specified, or the standard output otherwise.
|
||||||
|
The user will be prompted to enter the passphrase used at
|
||||||
|
encryption time to generate the derived encryption key.
|
||||||
|
.Sh OPTIONS
|
||||||
|
.Bl -tag -width "-m maxmemfrac"
|
||||||
|
.It Fl M Ar maxmem
|
||||||
|
Use at most
|
||||||
|
.Ar maxmem
|
||||||
|
bytes of RAM to compute the derived encryption key.
|
||||||
|
.It Fl m Ar maxmemfrac
|
||||||
|
Use at most the fraction
|
||||||
|
.Ar maxmemfrac
|
||||||
|
of the available RAM to compute the derived encryption key.
|
||||||
|
.It Fl t Ar maxtime
|
||||||
|
Usr at most
|
||||||
|
.Ar maxtime
|
||||||
|
seconds of CPU time to compute the derived encryption key.
|
||||||
|
.El
|
||||||
|
In
|
||||||
|
.Nm Cm enc ,
|
||||||
|
the memory and CPU time limits are enforced by picking
|
||||||
|
appropriate parameters to the
|
||||||
|
.Nm
|
||||||
|
key derivation function.
|
||||||
|
In
|
||||||
|
.Nm Cm dec ,
|
||||||
|
the memory and CPU time limits are enforced by exiting with
|
||||||
|
an error if decrypting the file would require too much memory
|
||||||
|
or CPU time.
|
||||||
|
.Sh EXIT STATUS
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility exits 0 on success, and >0 if an error occurs.
|
||||||
|
.Pp
|
||||||
|
Note that if the input encrypted file is corrupted,
|
||||||
|
.Nm Cm dec
|
||||||
|
may produce output prior to determining that the input
|
||||||
|
was corrupt and exiting with a non-zero status; so
|
||||||
|
users should direct the output to a safe location and
|
||||||
|
check the exit status of
|
||||||
|
.Nm
|
||||||
|
before using the decrypted data.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Rs
|
||||||
|
.%A "Colin Percival"
|
||||||
|
.%T "Stronger Key Derivation via Sequential Memory-Hard Functions"
|
||||||
|
.%O "Presented at BSDCan'09"
|
||||||
|
.%D "May 2009"
|
||||||
|
.Re
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility was written in May 2009 by Colin Percival as a
|
||||||
|
demonstration of the
|
||||||
|
.Nm
|
||||||
|
key derivation function.
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
key derivation function was invented in March 2009 by Colin
|
||||||
|
Percival in order to allow key files from the
|
||||||
|
.Nm tarsnap
|
||||||
|
backup system to be passphrase protected.
|
12
scrypt_platform.h
Normal file
12
scrypt_platform.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef _SCRYPT_PLATFORM_H_
|
||||||
|
#define _SCRYPT_PLATFORM_H_
|
||||||
|
|
||||||
|
#if defined(CONFIG_H_FILE)
|
||||||
|
#include CONFIG_H_FILE
|
||||||
|
#elif defined(HAVE_CONFIG_H)
|
||||||
|
#include "config.h"
|
||||||
|
#else
|
||||||
|
#error Need either CONFIG_H_FILE or HAVE_CONFIG_H defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_SCRYPT_PLATFORM_H_ */
|
Reference in a new issue