Add libsodium to the tree and build what's needed from source.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3859 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										3
									
								
								deps/libsodium/src/Makefile.am
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								deps/libsodium/src/Makefile.am
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
|  | ||||
| SUBDIRS = \ | ||||
| 	libsodium | ||||
							
								
								
									
										677
									
								
								deps/libsodium/src/Makefile.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										677
									
								
								deps/libsodium/src/Makefile.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,677 @@ | ||||
| # Makefile.in generated by automake 1.16.5 from Makefile.am. | ||||
| # @configure_input@ | ||||
|  | ||||
| # Copyright (C) 1994-2021 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@ | ||||
| am__is_gnu_make = { \ | ||||
|   if test -z '$(MAKELEVEL)'; then \ | ||||
|     false; \ | ||||
|   elif test -n '$(MAKE_HOST)'; then \ | ||||
|     true; \ | ||||
|   elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ | ||||
|     true; \ | ||||
|   else \ | ||||
|     false; \ | ||||
|   fi; \ | ||||
| } | ||||
| am__make_running_with_option = \ | ||||
|   case $${target_option-} in \ | ||||
|       ?) ;; \ | ||||
|       *) echo "am__make_running_with_option: internal error: invalid" \ | ||||
|               "target option '$${target_option-}' specified" >&2; \ | ||||
|          exit 1;; \ | ||||
|   esac; \ | ||||
|   has_opt=no; \ | ||||
|   sane_makeflags=$$MAKEFLAGS; \ | ||||
|   if $(am__is_gnu_make); then \ | ||||
|     sane_makeflags=$$MFLAGS; \ | ||||
|   else \ | ||||
|     case $$MAKEFLAGS in \ | ||||
|       *\\[\ \	]*) \ | ||||
|         bs=\\; \ | ||||
|         sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | ||||
|           | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \ | ||||
|     esac; \ | ||||
|   fi; \ | ||||
|   skip_next=no; \ | ||||
|   strip_trailopt () \ | ||||
|   { \ | ||||
|     flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ | ||||
|   }; \ | ||||
|   for flg in $$sane_makeflags; do \ | ||||
|     test $$skip_next = yes && { skip_next=no; continue; }; \ | ||||
|     case $$flg in \ | ||||
|       *=*|--*) continue;; \ | ||||
|         -*I) strip_trailopt 'I'; skip_next=yes;; \ | ||||
|       -*I?*) strip_trailopt 'I';; \ | ||||
|         -*O) strip_trailopt 'O'; skip_next=yes;; \ | ||||
|       -*O?*) strip_trailopt 'O';; \ | ||||
|         -*l) strip_trailopt 'l'; skip_next=yes;; \ | ||||
|       -*l?*) strip_trailopt 'l';; \ | ||||
|       -[dEDm]) skip_next=yes;; \ | ||||
|       -[JT]) skip_next=yes;; \ | ||||
|     esac; \ | ||||
|     case $$flg in \ | ||||
|       *$$target_option*) has_opt=yes; break;; \ | ||||
|     esac; \ | ||||
|   done; \ | ||||
|   test $$has_opt = yes | ||||
| am__make_dryrun = (target_option=n; $(am__make_running_with_option)) | ||||
| am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) | ||||
| pkgdatadir = $(datadir)/@PACKAGE@ | ||||
| pkgincludedir = $(includedir)/@PACKAGE@ | ||||
| pkglibdir = $(libdir)/@PACKAGE@ | ||||
| pkglibexecdir = $(libexecdir)/@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 = : | ||||
| build_triplet = @build@ | ||||
| host_triplet = @host@ | ||||
| target_triplet = @target@ | ||||
| subdir = src | ||||
| ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ||||
| am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_catchable_abrt.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_catchable_segv.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_compile_flag.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_define.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_check_link_flag.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \ | ||||
| 	$(top_srcdir)/m4/ax_valgrind_check.m4 \ | ||||
| 	$(top_srcdir)/m4/ld-output-def.m4 $(top_srcdir)/m4/libtool.m4 \ | ||||
| 	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ | ||||
| 	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ | ||||
| 	$(top_srcdir)/configure.ac | ||||
| am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ | ||||
| 	$(ACLOCAL_M4) | ||||
| DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) | ||||
| mkinstalldirs = $(install_sh) -d | ||||
| CONFIG_CLEAN_FILES = | ||||
| CONFIG_CLEAN_VPATH_FILES = | ||||
| AM_V_P = $(am__v_P_@AM_V@) | ||||
| am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) | ||||
| am__v_P_0 = false | ||||
| am__v_P_1 = : | ||||
| AM_V_GEN = $(am__v_GEN_@AM_V@) | ||||
| am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) | ||||
| am__v_GEN_0 = @echo "  GEN     " $@; | ||||
| am__v_GEN_1 =  | ||||
| AM_V_at = $(am__v_at_@AM_V@) | ||||
| am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) | ||||
| am__v_at_0 = @ | ||||
| am__v_at_1 =  | ||||
| SOURCES = | ||||
| DIST_SOURCES = | ||||
| RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ | ||||
| 	ctags-recursive dvi-recursive html-recursive info-recursive \ | ||||
| 	install-data-recursive install-dvi-recursive \ | ||||
| 	install-exec-recursive install-html-recursive \ | ||||
| 	install-info-recursive install-pdf-recursive \ | ||||
| 	install-ps-recursive install-recursive installcheck-recursive \ | ||||
| 	installdirs-recursive pdf-recursive ps-recursive \ | ||||
| 	tags-recursive uninstall-recursive | ||||
| am__can_run_installinfo = \ | ||||
|   case $$AM_UPDATE_INFO_DIR in \ | ||||
|     n|no|NO) false;; \ | ||||
|     *) (install-info --version) >/dev/null 2>&1;; \ | ||||
|   esac | ||||
| RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\ | ||||
|   distclean-recursive maintainer-clean-recursive | ||||
| am__recursive_targets = \ | ||||
|   $(RECURSIVE_TARGETS) \ | ||||
|   $(RECURSIVE_CLEAN_TARGETS) \ | ||||
|   $(am__extra_recursive_targets) | ||||
| AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ | ||||
| 	distdir distdir-am | ||||
| am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) | ||||
| # Read a list of newline-separated strings from the standard input, | ||||
| # and print each of them once, without duplicates.  Input order is | ||||
| # *not* preserved. | ||||
| am__uniquify_input = $(AWK) '\ | ||||
|   BEGIN { nonempty = 0; } \ | ||||
|   { items[$$0] = 1; nonempty = 1; } \ | ||||
|   END { if (nonempty) { for (i in items) print i; }; } \ | ||||
| ' | ||||
| # Make sure the list of sources is unique.  This is necessary because, | ||||
| # e.g., the same source file might be shared among _SOURCES variables | ||||
| # for different programs/libraries. | ||||
| am__define_uniq_tagged_files = \ | ||||
|   list='$(am__tagged_files)'; \ | ||||
|   unique=`for i in $$list; do \ | ||||
|     if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ | ||||
|   done | $(am__uniquify_input)` | ||||
| DIST_SUBDIRS = $(SUBDIRS) | ||||
| am__DIST_COMMON = $(srcdir)/Makefile.in | ||||
| DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||||
| am__relativize = \ | ||||
|   dir0=`pwd`; \ | ||||
|   sed_first='s,^\([^/]*\)/.*$$,\1,'; \ | ||||
|   sed_rest='s,^[^/]*/*,,'; \ | ||||
|   sed_last='s,^.*/\([^/]*\)$$,\1,'; \ | ||||
|   sed_butlast='s,/*[^/]*$$,,'; \ | ||||
|   while test -n "$$dir1"; do \ | ||||
|     first=`echo "$$dir1" | sed -e "$$sed_first"`; \ | ||||
|     if test "$$first" != "."; then \ | ||||
|       if test "$$first" = ".."; then \ | ||||
|         dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ | ||||
|         dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ | ||||
|       else \ | ||||
|         first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ | ||||
|         if test "$$first2" = "$$first"; then \ | ||||
|           dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ | ||||
|         else \ | ||||
|           dir2="../$$dir2"; \ | ||||
|         fi; \ | ||||
|         dir0="$$dir0"/"$$first"; \ | ||||
|       fi; \ | ||||
|     fi; \ | ||||
|     dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ | ||||
|   done; \ | ||||
|   reldir="$$dir2" | ||||
| ACLOCAL = @ACLOCAL@ | ||||
| ALLOCA = @ALLOCA@ | ||||
| AMTAR = @AMTAR@ | ||||
| AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ | ||||
| AR = @AR@ | ||||
| AUTOCONF = @AUTOCONF@ | ||||
| AUTOHEADER = @AUTOHEADER@ | ||||
| AUTOMAKE = @AUTOMAKE@ | ||||
| AWK = @AWK@ | ||||
| CC = @CC@ | ||||
| CCAS = @CCAS@ | ||||
| CCASDEPMODE = @CCASDEPMODE@ | ||||
| CCASFLAGS = @CCASFLAGS@ | ||||
| CCDEPMODE = @CCDEPMODE@ | ||||
| CFLAGS = @CFLAGS@ | ||||
| CFLAGS_AESNI = @CFLAGS_AESNI@ | ||||
| CFLAGS_AVX = @CFLAGS_AVX@ | ||||
| CFLAGS_AVX2 = @CFLAGS_AVX2@ | ||||
| CFLAGS_AVX512F = @CFLAGS_AVX512F@ | ||||
| CFLAGS_MMX = @CFLAGS_MMX@ | ||||
| CFLAGS_PCLMUL = @CFLAGS_PCLMUL@ | ||||
| CFLAGS_RDRAND = @CFLAGS_RDRAND@ | ||||
| CFLAGS_SSE2 = @CFLAGS_SSE2@ | ||||
| CFLAGS_SSE3 = @CFLAGS_SSE3@ | ||||
| CFLAGS_SSE41 = @CFLAGS_SSE41@ | ||||
| CFLAGS_SSSE3 = @CFLAGS_SSSE3@ | ||||
| CPP = @CPP@ | ||||
| CPPFLAGS = @CPPFLAGS@ | ||||
| CSCOPE = @CSCOPE@ | ||||
| CTAGS = @CTAGS@ | ||||
| CWFLAGS = @CWFLAGS@ | ||||
| CYGPATH_W = @CYGPATH_W@ | ||||
| DEFS = @DEFS@ | ||||
| DEPDIR = @DEPDIR@ | ||||
| DLLTOOL = @DLLTOOL@ | ||||
| DLL_VERSION = @DLL_VERSION@ | ||||
| DSYMUTIL = @DSYMUTIL@ | ||||
| DUMPBIN = @DUMPBIN@ | ||||
| ECHO_C = @ECHO_C@ | ||||
| ECHO_N = @ECHO_N@ | ||||
| ECHO_T = @ECHO_T@ | ||||
| EGREP = @EGREP@ | ||||
| ENABLE_VALGRIND_drd = @ENABLE_VALGRIND_drd@ | ||||
| ENABLE_VALGRIND_helgrind = @ENABLE_VALGRIND_helgrind@ | ||||
| ENABLE_VALGRIND_memcheck = @ENABLE_VALGRIND_memcheck@ | ||||
| ENABLE_VALGRIND_sgcheck = @ENABLE_VALGRIND_sgcheck@ | ||||
| ETAGS = @ETAGS@ | ||||
| EXEEXT = @EXEEXT@ | ||||
| FGREP = @FGREP@ | ||||
| GREP = @GREP@ | ||||
| HAVE_AMD64_ASM_V = @HAVE_AMD64_ASM_V@ | ||||
| HAVE_AVX_ASM_V = @HAVE_AVX_ASM_V@ | ||||
| HAVE_CPUID_V = @HAVE_CPUID_V@ | ||||
| HAVE_TI_MODE_V = @HAVE_TI_MODE_V@ | ||||
| INSTALL = @INSTALL@ | ||||
| INSTALL_DATA = @INSTALL_DATA@ | ||||
| INSTALL_PROGRAM = @INSTALL_PROGRAM@ | ||||
| INSTALL_SCRIPT = @INSTALL_SCRIPT@ | ||||
| INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ | ||||
| LD = @LD@ | ||||
| LDFLAGS = @LDFLAGS@ | ||||
| LIBOBJS = @LIBOBJS@ | ||||
| LIBS = @LIBS@ | ||||
| LIBTOOL = @LIBTOOL@ | ||||
| LIBTOOL_DEPS = @LIBTOOL_DEPS@ | ||||
| LIBTOOL_EXTRA_FLAGS = @LIBTOOL_EXTRA_FLAGS@ | ||||
| LIPO = @LIPO@ | ||||
| LN_S = @LN_S@ | ||||
| LTLIBOBJS = @LTLIBOBJS@ | ||||
| LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ | ||||
| MAINT = @MAINT@ | ||||
| MAKEINFO = @MAKEINFO@ | ||||
| MANIFEST_TOOL = @MANIFEST_TOOL@ | ||||
| MKDIR_P = @MKDIR_P@ | ||||
| NM = @NM@ | ||||
| NMEDIT = @NMEDIT@ | ||||
| OBJDUMP = @OBJDUMP@ | ||||
| OBJEXT = @OBJEXT@ | ||||
| OTOOL = @OTOOL@ | ||||
| OTOOL64 = @OTOOL64@ | ||||
| PACKAGE = @PACKAGE@ | ||||
| PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ | ||||
| PACKAGE_NAME = @PACKAGE_NAME@ | ||||
| PACKAGE_STRING = @PACKAGE_STRING@ | ||||
| PACKAGE_TARNAME = @PACKAGE_TARNAME@ | ||||
| PACKAGE_URL = @PACKAGE_URL@ | ||||
| PACKAGE_VERSION = @PACKAGE_VERSION@ | ||||
| PATH_SEPARATOR = @PATH_SEPARATOR@ | ||||
| PKGCONFIG_LIBS_PRIVATE = @PKGCONFIG_LIBS_PRIVATE@ | ||||
| PTHREAD_CC = @PTHREAD_CC@ | ||||
| PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ | ||||
| PTHREAD_CXX = @PTHREAD_CXX@ | ||||
| PTHREAD_LIBS = @PTHREAD_LIBS@ | ||||
| RANLIB = @RANLIB@ | ||||
| SAFECODE_HOME = @SAFECODE_HOME@ | ||||
| SED = @SED@ | ||||
| SET_MAKE = @SET_MAKE@ | ||||
| SHELL = @SHELL@ | ||||
| SODIUM_LIBRARY_MINIMAL_DEF = @SODIUM_LIBRARY_MINIMAL_DEF@ | ||||
| SODIUM_LIBRARY_VERSION = @SODIUM_LIBRARY_VERSION@ | ||||
| SODIUM_LIBRARY_VERSION_MAJOR = @SODIUM_LIBRARY_VERSION_MAJOR@ | ||||
| SODIUM_LIBRARY_VERSION_MINOR = @SODIUM_LIBRARY_VERSION_MINOR@ | ||||
| STRIP = @STRIP@ | ||||
| TEST_LDFLAGS = @TEST_LDFLAGS@ | ||||
| VALGRIND = @VALGRIND@ | ||||
| VALGRIND_ENABLED = @VALGRIND_ENABLED@ | ||||
| VERSION = @VERSION@ | ||||
| abs_builddir = @abs_builddir@ | ||||
| abs_srcdir = @abs_srcdir@ | ||||
| abs_top_builddir = @abs_top_builddir@ | ||||
| abs_top_srcdir = @abs_top_srcdir@ | ||||
| ac_ct_AR = @ac_ct_AR@ | ||||
| ac_ct_CC = @ac_ct_CC@ | ||||
| ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ | ||||
| am__include = @am__include@ | ||||
| am__leading_dot = @am__leading_dot@ | ||||
| am__quote = @am__quote@ | ||||
| am__tar = @am__tar@ | ||||
| am__untar = @am__untar@ | ||||
| ax_pthread_config = @ax_pthread_config@ | ||||
| bindir = @bindir@ | ||||
| build = @build@ | ||||
| build_alias = @build_alias@ | ||||
| build_cpu = @build_cpu@ | ||||
| build_os = @build_os@ | ||||
| build_vendor = @build_vendor@ | ||||
| builddir = @builddir@ | ||||
| datadir = @datadir@ | ||||
| datarootdir = @datarootdir@ | ||||
| docdir = @docdir@ | ||||
| dvidir = @dvidir@ | ||||
| exec_prefix = @exec_prefix@ | ||||
| host = @host@ | ||||
| host_alias = @host_alias@ | ||||
| host_cpu = @host_cpu@ | ||||
| host_os = @host_os@ | ||||
| host_vendor = @host_vendor@ | ||||
| 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@ | ||||
| runstatedir = @runstatedir@ | ||||
| sbindir = @sbindir@ | ||||
| sharedstatedir = @sharedstatedir@ | ||||
| srcdir = @srcdir@ | ||||
| sysconfdir = @sysconfdir@ | ||||
| target = @target@ | ||||
| target_alias = @target_alias@ | ||||
| target_cpu = @target_cpu@ | ||||
| target_os = @target_os@ | ||||
| target_vendor = @target_vendor@ | ||||
| top_build_prefix = @top_build_prefix@ | ||||
| top_builddir = @top_builddir@ | ||||
| top_srcdir = @top_srcdir@ | ||||
| valgrind_enabled_tools = @valgrind_enabled_tools@ | ||||
| valgrind_tools = @valgrind_tools@ | ||||
| SUBDIRS = \ | ||||
| 	libsodium | ||||
|  | ||||
| all: all-recursive | ||||
|  | ||||
| .SUFFIXES: | ||||
| $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps) | ||||
| 	@for dep in $?; do \ | ||||
| 	  case '$(am__configure_deps)' in \ | ||||
| 	    *$$dep*) \ | ||||
| 	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ | ||||
| 	        && { if test -f $@; then exit 0; else break; fi; }; \ | ||||
| 	      exit 1;; \ | ||||
| 	  esac; \ | ||||
| 	done; \ | ||||
| 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ | ||||
| 	$(am__cd) $(top_srcdir) && \ | ||||
| 	  $(AUTOMAKE) --foreign src/Makefile | ||||
| Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status | ||||
| 	@case '$?' in \ | ||||
| 	  *config.status*) \ | ||||
| 	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ | ||||
| 	  *) \ | ||||
| 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ | ||||
| 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ | ||||
| 	esac; | ||||
|  | ||||
| $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) | ||||
| 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh | ||||
|  | ||||
| $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) | ||||
| 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh | ||||
| $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) | ||||
| 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh | ||||
| $(am__aclocal_m4_deps): | ||||
|  | ||||
| mostlyclean-libtool: | ||||
| 	-rm -f *.lo | ||||
|  | ||||
| clean-libtool: | ||||
| 	-rm -rf .libs _libs | ||||
|  | ||||
| # This directory's subdirectories are mostly independent; you can cd | ||||
| # into them and run 'make' without going through this Makefile. | ||||
| # To change the values of 'make' variables: instead of editing Makefiles, | ||||
| # (1) if the variable is set in 'config.status', edit 'config.status' | ||||
| #     (which will cause the Makefiles to be regenerated when you run 'make'); | ||||
| # (2) otherwise, pass the desired values on the 'make' command line. | ||||
| $(am__recursive_targets): | ||||
| 	@fail=; \ | ||||
| 	if $(am__make_keepgoing); then \ | ||||
| 	  failcom='fail=yes'; \ | ||||
| 	else \ | ||||
| 	  failcom='exit 1'; \ | ||||
| 	fi; \ | ||||
| 	dot_seen=no; \ | ||||
| 	target=`echo $@ | sed s/-recursive//`; \ | ||||
| 	case "$@" in \ | ||||
| 	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ | ||||
| 	  *) list='$(SUBDIRS)' ;; \ | ||||
| 	esac; \ | ||||
| 	for subdir in $$list; do \ | ||||
| 	  echo "Making $$target in $$subdir"; \ | ||||
| 	  if test "$$subdir" = "."; then \ | ||||
| 	    dot_seen=yes; \ | ||||
| 	    local_target="$$target-am"; \ | ||||
| 	  else \ | ||||
| 	    local_target="$$target"; \ | ||||
| 	  fi; \ | ||||
| 	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ | ||||
| 	  || eval $$failcom; \ | ||||
| 	done; \ | ||||
| 	if test "$$dot_seen" = "no"; then \ | ||||
| 	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ | ||||
| 	fi; test -z "$$fail" | ||||
|  | ||||
| ID: $(am__tagged_files) | ||||
| 	$(am__define_uniq_tagged_files); mkid -fID $$unique | ||||
| tags: tags-recursive | ||||
| TAGS: tags | ||||
|  | ||||
| tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) | ||||
| 	set x; \ | ||||
| 	here=`pwd`; \ | ||||
| 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ | ||||
| 	  include_option=--etags-include; \ | ||||
| 	  empty_fix=.; \ | ||||
| 	else \ | ||||
| 	  include_option=--include; \ | ||||
| 	  empty_fix=; \ | ||||
| 	fi; \ | ||||
| 	list='$(SUBDIRS)'; for subdir in $$list; do \ | ||||
| 	  if test "$$subdir" = .; then :; else \ | ||||
| 	    test ! -f $$subdir/TAGS || \ | ||||
| 	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ | ||||
| 	  fi; \ | ||||
| 	done; \ | ||||
| 	$(am__define_uniq_tagged_files); \ | ||||
| 	shift; \ | ||||
| 	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ | ||||
| 	  test -n "$$unique" || unique=$$empty_fix; \ | ||||
| 	  if test $$# -gt 0; then \ | ||||
| 	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ | ||||
| 	      "$$@" $$unique; \ | ||||
| 	  else \ | ||||
| 	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ | ||||
| 	      $$unique; \ | ||||
| 	  fi; \ | ||||
| 	fi | ||||
| ctags: ctags-recursive | ||||
|  | ||||
| CTAGS: ctags | ||||
| ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) | ||||
| 	$(am__define_uniq_tagged_files); \ | ||||
| 	test -z "$(CTAGS_ARGS)$$unique" \ | ||||
| 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ | ||||
| 	     $$unique | ||||
|  | ||||
| GTAGS: | ||||
| 	here=`$(am__cd) $(top_builddir) && pwd` \ | ||||
| 	  && $(am__cd) $(top_srcdir) \ | ||||
| 	  && gtags -i $(GTAGS_ARGS) "$$here" | ||||
| cscopelist: cscopelist-recursive | ||||
|  | ||||
| cscopelist-am: $(am__tagged_files) | ||||
| 	list='$(am__tagged_files)'; \ | ||||
| 	case "$(srcdir)" in \ | ||||
| 	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ | ||||
| 	  *) sdir=$(subdir)/$(srcdir) ;; \ | ||||
| 	esac; \ | ||||
| 	for i in $$list; do \ | ||||
| 	  if test -f "$$i"; then \ | ||||
| 	    echo "$(subdir)/$$i"; \ | ||||
| 	  else \ | ||||
| 	    echo "$$sdir/$$i"; \ | ||||
| 	  fi; \ | ||||
| 	done >> $(top_builddir)/cscope.files | ||||
|  | ||||
| distclean-tags: | ||||
| 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags | ||||
| distdir: $(BUILT_SOURCES) | ||||
| 	$(MAKE) $(AM_MAKEFLAGS) distdir-am | ||||
|  | ||||
| distdir-am: $(DISTFILES) | ||||
| 	@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 "$(distdir)/$$file"; then \ | ||||
| 	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ | ||||
| 	    fi; \ | ||||
| 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ | ||||
| 	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ | ||||
| 	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ | ||||
| 	    fi; \ | ||||
| 	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ | ||||
| 	  else \ | ||||
| 	    test -f "$(distdir)/$$file" \ | ||||
| 	    || cp -p $$d/$$file "$(distdir)/$$file" \ | ||||
| 	    || exit 1; \ | ||||
| 	  fi; \ | ||||
| 	done | ||||
| 	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ | ||||
| 	  if test "$$subdir" = .; then :; else \ | ||||
| 	    $(am__make_dryrun) \ | ||||
| 	      || test -d "$(distdir)/$$subdir" \ | ||||
| 	      || $(MKDIR_P) "$(distdir)/$$subdir" \ | ||||
| 	      || exit 1; \ | ||||
| 	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ | ||||
| 	    $(am__relativize); \ | ||||
| 	    new_distdir=$$reldir; \ | ||||
| 	    dir1=$$subdir; dir2="$(top_distdir)"; \ | ||||
| 	    $(am__relativize); \ | ||||
| 	    new_top_distdir=$$reldir; \ | ||||
| 	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ | ||||
| 	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ | ||||
| 	    ($(am__cd) $$subdir && \ | ||||
| 	      $(MAKE) $(AM_MAKEFLAGS) \ | ||||
| 	        top_distdir="$$new_top_distdir" \ | ||||
| 	        distdir="$$new_distdir" \ | ||||
| 		am__remove_distdir=: \ | ||||
| 		am__skip_length_check=: \ | ||||
| 		am__skip_mode_fix=: \ | ||||
| 	        distdir) \ | ||||
| 	      || exit 1; \ | ||||
| 	  fi; \ | ||||
| 	done | ||||
| check-am: all-am | ||||
| check: check-recursive | ||||
| all-am: Makefile | ||||
| installdirs: installdirs-recursive | ||||
| installdirs-am: | ||||
| install: install-recursive | ||||
| install-exec: install-exec-recursive | ||||
| install-data: install-data-recursive | ||||
| uninstall: uninstall-recursive | ||||
|  | ||||
| install-am: all-am | ||||
| 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am | ||||
|  | ||||
| installcheck: installcheck-recursive | ||||
| install-strip: | ||||
| 	if test -z '$(STRIP)'; then \ | ||||
| 	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ | ||||
| 	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ | ||||
| 	      install; \ | ||||
| 	else \ | ||||
| 	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ | ||||
| 	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ | ||||
| 	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ | ||||
| 	fi | ||||
| mostlyclean-generic: | ||||
|  | ||||
| clean-generic: | ||||
|  | ||||
| distclean-generic: | ||||
| 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) | ||||
| 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-recursive | ||||
|  | ||||
| clean-am: clean-generic clean-libtool mostlyclean-am | ||||
|  | ||||
| distclean: distclean-recursive | ||||
| 	-rm -f Makefile | ||||
| distclean-am: clean-am distclean-generic distclean-tags | ||||
|  | ||||
| dvi: dvi-recursive | ||||
|  | ||||
| dvi-am: | ||||
|  | ||||
| html: html-recursive | ||||
|  | ||||
| html-am: | ||||
|  | ||||
| info: info-recursive | ||||
|  | ||||
| info-am: | ||||
|  | ||||
| install-data-am: | ||||
|  | ||||
| install-dvi: install-dvi-recursive | ||||
|  | ||||
| install-dvi-am: | ||||
|  | ||||
| install-exec-am: | ||||
|  | ||||
| install-html: install-html-recursive | ||||
|  | ||||
| install-html-am: | ||||
|  | ||||
| install-info: install-info-recursive | ||||
|  | ||||
| install-info-am: | ||||
|  | ||||
| install-man: | ||||
|  | ||||
| install-pdf: install-pdf-recursive | ||||
|  | ||||
| install-pdf-am: | ||||
|  | ||||
| install-ps: install-ps-recursive | ||||
|  | ||||
| install-ps-am: | ||||
|  | ||||
| installcheck-am: | ||||
|  | ||||
| maintainer-clean: maintainer-clean-recursive | ||||
| 	-rm -f Makefile | ||||
| maintainer-clean-am: distclean-am maintainer-clean-generic | ||||
|  | ||||
| mostlyclean: mostlyclean-recursive | ||||
|  | ||||
| mostlyclean-am: mostlyclean-generic mostlyclean-libtool | ||||
|  | ||||
| pdf: pdf-recursive | ||||
|  | ||||
| pdf-am: | ||||
|  | ||||
| ps: ps-recursive | ||||
|  | ||||
| ps-am: | ||||
|  | ||||
| uninstall-am: | ||||
|  | ||||
| .MAKE: $(am__recursive_targets) install-am install-strip | ||||
|  | ||||
| .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ | ||||
| 	check-am clean clean-generic clean-libtool cscopelist-am ctags \ | ||||
| 	ctags-am distclean distclean-generic distclean-libtool \ | ||||
| 	distclean-tags distdir dvi dvi-am html html-am info info-am \ | ||||
| 	install install-am 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-pdf install-pdf-am install-ps install-ps-am \ | ||||
| 	install-strip installcheck installcheck-am installdirs \ | ||||
| 	installdirs-am maintainer-clean maintainer-clean-generic \ | ||||
| 	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ | ||||
| 	ps ps-am tags tags-am uninstall uninstall-am | ||||
|  | ||||
| .PRECIOUS: Makefile | ||||
|  | ||||
|  | ||||
| # 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: | ||||
							
								
								
									
										284
									
								
								deps/libsodium/src/libsodium/Makefile.am
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								deps/libsodium/src/libsodium/Makefile.am
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,284 @@ | ||||
| lib_LTLIBRARIES = \ | ||||
| 	libsodium.la | ||||
|  | ||||
| libsodium_la_SOURCES = \ | ||||
| 	crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \ | ||||
| 	crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c \ | ||||
| 	crypto_auth/crypto_auth.c \ | ||||
| 	crypto_auth/hmacsha256/auth_hmacsha256.c \ | ||||
| 	crypto_auth/hmacsha512/auth_hmacsha512.c \ | ||||
| 	crypto_auth/hmacsha512256/auth_hmacsha512256.c \ | ||||
| 	crypto_box/crypto_box.c \ | ||||
| 	crypto_box/crypto_box_easy.c \ | ||||
| 	crypto_box/crypto_box_seal.c \ | ||||
| 	crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c \ | ||||
| 	crypto_core/ed25519/ref10/ed25519_ref10.c \ | ||||
| 	crypto_core/hchacha20/core_hchacha20.c \ | ||||
| 	crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c \ | ||||
| 	crypto_core/hsalsa20/core_hsalsa20.c \ | ||||
| 	crypto_core/salsa/ref/core_salsa_ref.c \ | ||||
| 	crypto_generichash/crypto_generichash.c \ | ||||
| 	crypto_generichash/blake2b/generichash_blake2.c \ | ||||
| 	crypto_generichash/blake2b/ref/blake2.h \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-ref.c \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-load-sse2.h \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-load-sse41.h \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-load-avx2.h \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-ref.c \ | ||||
| 	crypto_generichash/blake2b/ref/generichash_blake2b.c \ | ||||
| 	crypto_hash/crypto_hash.c \ | ||||
| 	crypto_hash/sha256/hash_sha256.c \ | ||||
| 	crypto_hash/sha256/cp/hash_sha256_cp.c \ | ||||
| 	crypto_hash/sha512/hash_sha512.c \ | ||||
| 	crypto_hash/sha512/cp/hash_sha512_cp.c \ | ||||
| 	crypto_kdf/blake2b/kdf_blake2b.c \ | ||||
| 	crypto_kdf/crypto_kdf.c \ | ||||
| 	crypto_kx/crypto_kx.c \ | ||||
| 	crypto_onetimeauth/crypto_onetimeauth.c \ | ||||
| 	crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \ | ||||
| 	crypto_onetimeauth/poly1305/onetimeauth_poly1305.h \ | ||||
| 	crypto_onetimeauth/poly1305/donna/poly1305_donna.h \ | ||||
| 	crypto_onetimeauth/poly1305/donna/poly1305_donna32.h \ | ||||
| 	crypto_onetimeauth/poly1305/donna/poly1305_donna64.h \ | ||||
| 	crypto_onetimeauth/poly1305/donna/poly1305_donna.c \ | ||||
| 	crypto_pwhash/argon2/argon2-core.c \ | ||||
| 	crypto_pwhash/argon2/argon2-core.h \ | ||||
| 	crypto_pwhash/argon2/argon2-encoding.c \ | ||||
| 	crypto_pwhash/argon2/argon2-encoding.h \ | ||||
| 	crypto_pwhash/argon2/argon2-fill-block-ref.c \ | ||||
| 	crypto_pwhash/argon2/argon2.c \ | ||||
| 	crypto_pwhash/argon2/argon2.h \ | ||||
| 	crypto_pwhash/argon2/blake2b-long.c \ | ||||
| 	crypto_pwhash/argon2/blake2b-long.h \ | ||||
| 	crypto_pwhash/argon2/blamka-round-ref.h \ | ||||
| 	crypto_pwhash/argon2/pwhash_argon2i.c \ | ||||
| 	crypto_pwhash/argon2/pwhash_argon2id.c \ | ||||
| 	crypto_pwhash/crypto_pwhash.c \ | ||||
| 	crypto_scalarmult/crypto_scalarmult.c \ | ||||
| 	crypto_scalarmult/curve25519/ref10/x25519_ref10.c \ | ||||
| 	crypto_scalarmult/curve25519/ref10/x25519_ref10.h \ | ||||
| 	crypto_scalarmult/curve25519/scalarmult_curve25519.c \ | ||||
| 	crypto_scalarmult/curve25519/scalarmult_curve25519.h \ | ||||
| 	crypto_secretbox/crypto_secretbox.c \ | ||||
| 	crypto_secretbox/crypto_secretbox_easy.c \ | ||||
| 	crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305.c \ | ||||
| 	crypto_secretstream/xchacha20poly1305/secretstream_xchacha20poly1305.c \ | ||||
| 	crypto_shorthash/crypto_shorthash.c \ | ||||
| 	crypto_shorthash/siphash24/shorthash_siphash24.c \ | ||||
| 	crypto_shorthash/siphash24/ref/shorthash_siphash24_ref.c \ | ||||
| 	crypto_shorthash/siphash24/ref/shorthash_siphash_ref.h \ | ||||
| 	crypto_sign/crypto_sign.c \ | ||||
| 	crypto_sign/ed25519/sign_ed25519.c \ | ||||
| 	crypto_sign/ed25519/ref10/keypair.c \ | ||||
| 	crypto_sign/ed25519/ref10/open.c \ | ||||
| 	crypto_sign/ed25519/ref10/sign.c \ | ||||
| 	crypto_sign/ed25519/ref10/sign_ed25519_ref10.h \ | ||||
| 	crypto_stream/chacha20/stream_chacha20.c \ | ||||
| 	crypto_stream/chacha20/stream_chacha20.h \ | ||||
| 	crypto_stream/chacha20/ref/chacha20_ref.h \ | ||||
| 	crypto_stream/chacha20/ref/chacha20_ref.c \ | ||||
| 	crypto_stream/crypto_stream.c \ | ||||
| 	crypto_stream/salsa20/stream_salsa20.c \ | ||||
| 	crypto_stream/salsa20/stream_salsa20.h \ | ||||
| 	crypto_stream/xsalsa20/stream_xsalsa20.c \ | ||||
| 	crypto_verify/sodium/verify.c \ | ||||
| 	include/sodium/private/chacha20_ietf_ext.h \ | ||||
| 	include/sodium/private/common.h \ | ||||
| 	include/sodium/private/ed25519_ref10.h \ | ||||
| 	include/sodium/private/implementations.h \ | ||||
| 	include/sodium/private/mutex.h \ | ||||
| 	include/sodium/private/sse2_64_32.h \ | ||||
| 	randombytes/randombytes.c \ | ||||
| 	sodium/codecs.c \ | ||||
| 	sodium/core.c \ | ||||
| 	sodium/runtime.c \ | ||||
| 	sodium/utils.c \ | ||||
| 	sodium/version.c | ||||
|  | ||||
| if HAVE_TI_MODE | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_core/ed25519/ref10/fe_51/base.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_51/base2.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_51/constants.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_51/fe.h \ | ||||
| 	include/sodium/private/ed25519_ref10_fe_51.h | ||||
| else | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_core/ed25519/ref10/fe_25_5/base.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_25_5/base2.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_25_5/constants.h \ | ||||
| 	crypto_core/ed25519/ref10/fe_25_5/fe.h \ | ||||
| 	include/sodium/private/ed25519_ref10_fe_25_5.h | ||||
| endif | ||||
|  | ||||
| if HAVE_AMD64_ASM | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S \ | ||||
| 	crypto_stream/salsa20/xmm6/salsa20_xmm6.c \ | ||||
| 	crypto_stream/salsa20/xmm6/salsa20_xmm6.h | ||||
| else | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_stream/salsa20/ref/salsa20_ref.c \ | ||||
| 	crypto_stream/salsa20/ref/salsa20_ref.h | ||||
| endif | ||||
|  | ||||
| noinst_HEADERS = \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/consts.S \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51_mul.S \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51_pack.S \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/ladder.S | ||||
|  | ||||
| if HAVE_AVX_ASM | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/consts_namespace.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51_invert.c \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe51_namespace.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/ladder.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/ladder_namespace.h \ | ||||
| 	crypto_scalarmult/curve25519/sandy2x/sandy2x.S | ||||
| endif | ||||
|  | ||||
| if !MINIMAL | ||||
| libsodium_la_SOURCES += \ | ||||
| 	crypto_box/curve25519xchacha20poly1305/box_curve25519xchacha20poly1305.c \ | ||||
| 	crypto_box/curve25519xchacha20poly1305/box_seal_curve25519xchacha20poly1305.c \ | ||||
| 	crypto_core/ed25519/core_ed25519.c \ | ||||
| 	crypto_core/ed25519/core_ristretto255.c \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c \ | ||||
| 	crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c \ | ||||
| 	crypto_scalarmult/ristretto255/ref10/scalarmult_ristretto255_ref10.c \ | ||||
| 	crypto_secretbox/xchacha20poly1305/secretbox_xchacha20poly1305.c \ | ||||
| 	crypto_shorthash/siphash24/shorthash_siphashx24.c \ | ||||
| 	crypto_shorthash/siphash24/ref/shorthash_siphashx24_ref.c \ | ||||
| 	crypto_sign/ed25519/ref10/obsolete.c \ | ||||
| 	crypto_stream/salsa2012/ref/stream_salsa2012_ref.c \ | ||||
| 	crypto_stream/salsa2012/stream_salsa2012.c \ | ||||
| 	crypto_stream/salsa208/ref/stream_salsa208_ref.c \ | ||||
| 	crypto_stream/salsa208/stream_salsa208.c \ | ||||
| 	crypto_stream/xchacha20/stream_xchacha20.c | ||||
| endif | ||||
|  | ||||
| randombytes_internal_randombytes_internal_random_CFLAGS = @CFLAGS_RDRAND@ | ||||
|  | ||||
| libsodium_la_LDFLAGS = \ | ||||
| 	$(AM_LDFLAGS) \ | ||||
| 	-export-dynamic \ | ||||
| 	-no-undefined \ | ||||
| 	$(LIBTOOL_EXTRA_FLAGS) | ||||
|  | ||||
| libsodium_la_CPPFLAGS = \ | ||||
| 	$(LTDLINCL) \ | ||||
| 	-I$(srcdir)/include/sodium \ | ||||
| 	-I$(builddir)/include/sodium | ||||
|  | ||||
| if HAVE_LD_OUTPUT_DEF | ||||
| libsodium_la_LDFLAGS += -Wl,--output-def,libsodium-$(DLL_VERSION).def | ||||
| defexecdir = $(bindir) | ||||
| defexec_DATA = libsodium-$(DLL_VERSION).def | ||||
| CLEANFILES = $(defexec_DATA) | ||||
| libsodium-$(DLL_VERSION).def: libsodium.la | ||||
| endif | ||||
|  | ||||
| SUBDIRS = \ | ||||
| 	include | ||||
|  | ||||
| libsodium_la_LIBADD = libaesni.la libsse2.la libssse3.la libsse41.la libavx2.la libavx512f.la | ||||
| noinst_LTLIBRARIES  = libaesni.la libsse2.la libssse3.la libsse41.la libavx2.la libavx512f.la | ||||
|  | ||||
| librdrand_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| librdrand_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_RDRAND@ | ||||
| librdrand_la_SOURCES = \ | ||||
| 	randombytes/internal/randombytes_internal_random.c | ||||
|  | ||||
| if !EMSCRIPTEN | ||||
| libsodium_la_LIBADD += librdrand.la | ||||
| noinst_LTLIBRARIES  += librdrand.la | ||||
|  | ||||
| libsodium_la_SOURCES += \ | ||||
| 	randombytes/sysrandom/randombytes_sysrandom.c | ||||
| endif | ||||
|  | ||||
| libaesni_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libaesni_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_AESNI@ @CFLAGS_PCLMUL@ | ||||
| libaesni_la_SOURCES = \ | ||||
| 	crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c | ||||
|  | ||||
| libsse2_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libsse2_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ | ||||
| libsse2_la_SOURCES = \ | ||||
| 	crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c \ | ||||
| 	crypto_onetimeauth/poly1305/sse2/poly1305_sse2.h | ||||
| if !MINIMAL | ||||
| libsse2_la_SOURCES += \ | ||||
| 	crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c | ||||
| endif | ||||
|  | ||||
| if !HAVE_AMD64_ASM | ||||
| libsse2_la_SOURCES += \ | ||||
| 	crypto_stream/salsa20/xmm6int/salsa20_xmm6int-sse2.c \ | ||||
| 	crypto_stream/salsa20/xmm6int/salsa20_xmm6int-sse2.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u0.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u1.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u4.h | ||||
| endif | ||||
|  | ||||
| libssse3_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libssse3_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ @CFLAGS_SSSE3@ | ||||
| libssse3_la_SOURCES = \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-ssse3.c \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-ssse3.h \ | ||||
| 	crypto_pwhash/argon2/argon2-fill-block-ssse3.c \ | ||||
| 	crypto_pwhash/argon2/blamka-round-ssse3.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/chacha20_dolbeau-ssse3.c \ | ||||
| 	crypto_stream/chacha20/dolbeau/chacha20_dolbeau-ssse3.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/u0.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/u1.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/u4.h | ||||
|  | ||||
| libsse41_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libsse41_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_SSE41@ | ||||
| libsse41_la_SOURCES = \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-sse41.c \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-sse41.h | ||||
|  | ||||
| libavx2_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libavx2_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_SSE41@ @CFLAGS_AVX@ @CFLAGS_AVX2@ | ||||
| libavx2_la_SOURCES = \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-avx2.c \ | ||||
| 	crypto_generichash/blake2b/ref/blake2b-compress-avx2.h \ | ||||
| 	crypto_pwhash/argon2/argon2-fill-block-avx2.c \ | ||||
| 	crypto_pwhash/argon2/blamka-round-avx2.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/chacha20_dolbeau-avx2.c \ | ||||
| 	crypto_stream/chacha20/dolbeau/chacha20_dolbeau-avx2.h \ | ||||
| 	crypto_stream/chacha20/dolbeau/u8.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/salsa20_xmm6int-avx2.c \ | ||||
| 	crypto_stream/salsa20/xmm6int/salsa20_xmm6int-avx2.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u0.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u1.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u4.h \ | ||||
| 	crypto_stream/salsa20/xmm6int/u8.h | ||||
|  | ||||
| libavx512f_la_LDFLAGS = $(libsodium_la_LDFLAGS) | ||||
| libavx512f_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \ | ||||
| 	@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_SSE41@ @CFLAGS_AVX@ @CFLAGS_AVX2@ @CFLAGS_AVX512F@ | ||||
| libavx512f_la_SOURCES = \ | ||||
| 	crypto_pwhash/argon2/argon2-fill-block-avx512f.c \ | ||||
| 	crypto_pwhash/argon2/blamka-round-avx512f.h | ||||
							
								
								
									
										3753
									
								
								deps/libsodium/src/libsodium/Makefile.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3753
									
								
								deps/libsodium/src/libsodium/Makefile.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1079
									
								
								deps/libsodium/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1079
									
								
								deps/libsodium/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										400
									
								
								deps/libsodium/src/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								deps/libsodium/src/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,400 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_aead_chacha20poly1305.h" | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
| #include "crypto_stream_chacha20.h" | ||||
| #include "crypto_verify_16.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #include "private/chacha20_ietf_ext.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| static const unsigned char _pad0[16] = { 0 }; | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, | ||||
|                                               unsigned char *mac, | ||||
|                                               unsigned long long *maclen_p, | ||||
|                                               const unsigned char *m, | ||||
|                                               unsigned long long mlen, | ||||
|                                               const unsigned char *ad, | ||||
|                                               unsigned long long adlen, | ||||
|                                               const unsigned char *nsec, | ||||
|                                               const unsigned char *npub, | ||||
|                                               const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_stream_chacha20_xor_ic(c, m, mlen, npub, 1U, k); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     if (maclen_p != NULL) { | ||||
|         *maclen_p = crypto_aead_chacha20poly1305_ABYTES; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_encrypt(unsigned char *c, | ||||
|                                      unsigned long long *clen_p, | ||||
|                                      const unsigned char *m, | ||||
|                                      unsigned long long mlen, | ||||
|                                      const unsigned char *ad, | ||||
|                                      unsigned long long adlen, | ||||
|                                      const unsigned char *nsec, | ||||
|                                      const unsigned char *npub, | ||||
|                                      const unsigned char *k) | ||||
| { | ||||
|     unsigned long long clen = 0ULL; | ||||
|     int                ret; | ||||
|  | ||||
|     if (mlen > crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     ret = crypto_aead_chacha20poly1305_encrypt_detached(c, | ||||
|                                                         c + mlen, NULL, | ||||
|                                                         m, mlen, | ||||
|                                                         ad, adlen, | ||||
|                                                         nsec, npub, k); | ||||
|     if (clen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             clen = mlen + crypto_aead_chacha20poly1305_ABYTES; | ||||
|         } | ||||
|         *clen_p = clen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, | ||||
|                                                    unsigned char *mac, | ||||
|                                                    unsigned long long *maclen_p, | ||||
|                                                    const unsigned char *m, | ||||
|                                                    unsigned long long mlen, | ||||
|                                                    const unsigned char *ad, | ||||
|                                                    unsigned long long adlen, | ||||
|                                                    const unsigned char *nsec, | ||||
|                                                    const unsigned char *npub, | ||||
|                                                    const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf); | ||||
|  | ||||
|     crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, npub, 1U, k); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     if (maclen_p != NULL) { | ||||
|         *maclen_p = crypto_aead_chacha20poly1305_ietf_ABYTES; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, | ||||
|                                           unsigned long long *clen_p, | ||||
|                                           const unsigned char *m, | ||||
|                                           unsigned long long mlen, | ||||
|                                           const unsigned char *ad, | ||||
|                                           unsigned long long adlen, | ||||
|                                           const unsigned char *nsec, | ||||
|                                           const unsigned char *npub, | ||||
|                                           const unsigned char *k) | ||||
| { | ||||
|     unsigned long long clen = 0ULL; | ||||
|     int                ret; | ||||
|  | ||||
|     if (mlen > crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     ret = crypto_aead_chacha20poly1305_ietf_encrypt_detached(c, | ||||
|                                                              c + mlen, NULL, | ||||
|                                                              m, mlen, | ||||
|                                                              ad, adlen, | ||||
|                                                              nsec, npub, k); | ||||
|     if (clen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             clen = mlen + crypto_aead_chacha20poly1305_ietf_ABYTES; | ||||
|         } | ||||
|         *clen_p = clen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, | ||||
|                                               unsigned char *nsec, | ||||
|                                               const unsigned char *c, | ||||
|                                               unsigned long long clen, | ||||
|                                               const unsigned char *mac, | ||||
|                                               const unsigned char *ad, | ||||
|                                               unsigned long long adlen, | ||||
|                                               const unsigned char *npub, | ||||
|                                               const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|     unsigned char                     computed_mac[crypto_aead_chacha20poly1305_ABYTES]; | ||||
|     unsigned long long                mlen; | ||||
|     int                               ret; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     mlen = clen; | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, computed_mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     COMPILER_ASSERT(sizeof computed_mac == 16U); | ||||
|     ret = crypto_verify_16(computed_mac, mac); | ||||
|     sodium_memzero(computed_mac, sizeof computed_mac); | ||||
|     if (m == NULL) { | ||||
|         return ret; | ||||
|     } | ||||
|     if (ret != 0) { | ||||
|         memset(m, 0, mlen); | ||||
|         return -1; | ||||
|     } | ||||
|     crypto_stream_chacha20_xor_ic(m, c, mlen, npub, 1U, k); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_decrypt(unsigned char *m, | ||||
|                                      unsigned long long *mlen_p, | ||||
|                                      unsigned char *nsec, | ||||
|                                      const unsigned char *c, | ||||
|                                      unsigned long long clen, | ||||
|                                      const unsigned char *ad, | ||||
|                                      unsigned long long adlen, | ||||
|                                      const unsigned char *npub, | ||||
|                                      const unsigned char *k) | ||||
| { | ||||
|     unsigned long long mlen = 0ULL; | ||||
|     int                ret = -1; | ||||
|  | ||||
|     if (clen >= crypto_aead_chacha20poly1305_ABYTES) { | ||||
|         ret = crypto_aead_chacha20poly1305_decrypt_detached | ||||
|             (m, nsec, | ||||
|              c, clen - crypto_aead_chacha20poly1305_ABYTES, | ||||
|              c + clen - crypto_aead_chacha20poly1305_ABYTES, | ||||
|              ad, adlen, npub, k); | ||||
|     } | ||||
|     if (mlen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             mlen = clen - crypto_aead_chacha20poly1305_ABYTES; | ||||
|         } | ||||
|         *mlen_p = mlen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, | ||||
|                                                    unsigned char *nsec, | ||||
|                                                    const unsigned char *c, | ||||
|                                                    unsigned long long clen, | ||||
|                                                    const unsigned char *mac, | ||||
|                                                    const unsigned char *ad, | ||||
|                                                    unsigned long long adlen, | ||||
|                                                    const unsigned char *npub, | ||||
|                                                    const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|     unsigned char                     computed_mac[crypto_aead_chacha20poly1305_ietf_ABYTES]; | ||||
|     unsigned long long                mlen; | ||||
|     int                               ret; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf); | ||||
|  | ||||
|     mlen = clen; | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, computed_mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     COMPILER_ASSERT(sizeof computed_mac == 16U); | ||||
|     ret = crypto_verify_16(computed_mac, mac); | ||||
|     sodium_memzero(computed_mac, sizeof computed_mac); | ||||
|     if (m == NULL) { | ||||
|         return ret; | ||||
|     } | ||||
|     if (ret != 0) { | ||||
|         memset(m, 0, mlen); | ||||
|         return -1; | ||||
|     } | ||||
|     crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, npub, 1U, k); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, | ||||
|                                           unsigned long long *mlen_p, | ||||
|                                           unsigned char *nsec, | ||||
|                                           const unsigned char *c, | ||||
|                                           unsigned long long clen, | ||||
|                                           const unsigned char *ad, | ||||
|                                           unsigned long long adlen, | ||||
|                                           const unsigned char *npub, | ||||
|                                           const unsigned char *k) | ||||
| { | ||||
|     unsigned long long mlen = 0ULL; | ||||
|     int                ret = -1; | ||||
|  | ||||
|     if (clen >= crypto_aead_chacha20poly1305_ietf_ABYTES) { | ||||
|         ret = crypto_aead_chacha20poly1305_ietf_decrypt_detached | ||||
|             (m, nsec, | ||||
|              c, clen - crypto_aead_chacha20poly1305_ietf_ABYTES, | ||||
|              c + clen - crypto_aead_chacha20poly1305_ietf_ABYTES, | ||||
|              ad, adlen, npub, k); | ||||
|     } | ||||
|     if (mlen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             mlen = clen - crypto_aead_chacha20poly1305_ietf_ABYTES; | ||||
|         } | ||||
|         *mlen_p = mlen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_ietf_keybytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ietf_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_ietf_npubbytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ietf_NPUBBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_ietf_nsecbytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ietf_NSECBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_ietf_abytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ietf_ABYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_ietf_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_aead_chacha20poly1305_ietf_KEYBYTES); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_keybytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_npubbytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_NPUBBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_nsecbytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_NSECBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_abytes(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_ABYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_chacha20poly1305_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_aead_chacha20poly1305_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										262
									
								
								deps/libsodium/src/libsodium/crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								deps/libsodium/src/libsodium/crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,262 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_aead_chacha20poly1305.h" | ||||
| #include "crypto_aead_xchacha20poly1305.h" | ||||
| #include "crypto_core_hchacha20.h" | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
| #include "crypto_stream_chacha20.h" | ||||
| #include "crypto_verify_16.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #include "private/chacha20_ietf_ext.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| static const unsigned char _pad0[16] = { 0 }; | ||||
|  | ||||
| static int | ||||
| _encrypt_detached(unsigned char *c, | ||||
|                   unsigned char *mac, | ||||
|                   unsigned long long *maclen_p, | ||||
|                   const unsigned char *m, | ||||
|                   unsigned long long mlen, | ||||
|                   const unsigned char *ad, | ||||
|                   unsigned long long adlen, | ||||
|                   const unsigned char *nsec, | ||||
|                   const unsigned char *npub, | ||||
|                   const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20_ietf_ext(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf); | ||||
|  | ||||
|     crypto_stream_chacha20_ietf_ext_xor_ic(c, m, mlen, npub, 1U, k); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     if (maclen_p != NULL) { | ||||
|         *maclen_p = crypto_aead_chacha20poly1305_ietf_ABYTES; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| _decrypt_detached(unsigned char *m, | ||||
|                   unsigned char *nsec, | ||||
|                   const unsigned char *c, | ||||
|                   unsigned long long clen, | ||||
|                   const unsigned char *mac, | ||||
|                   const unsigned char *ad, | ||||
|                   unsigned long long adlen, | ||||
|                   const unsigned char *npub, | ||||
|                   const unsigned char *k) | ||||
| { | ||||
|     crypto_onetimeauth_poly1305_state state; | ||||
|     unsigned char                     block0[64U]; | ||||
|     unsigned char                     slen[8U]; | ||||
|     unsigned char                     computed_mac[crypto_aead_chacha20poly1305_ietf_ABYTES]; | ||||
|     unsigned long long                mlen; | ||||
|     int                               ret; | ||||
|  | ||||
|     (void) nsec; | ||||
|     crypto_stream_chacha20_ietf_ext(block0, sizeof block0, npub, k); | ||||
|     crypto_onetimeauth_poly1305_init(&state, block0); | ||||
|     sodium_memzero(block0, sizeof block0); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_update(&state, ad, adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf); | ||||
|  | ||||
|     mlen = clen; | ||||
|     crypto_onetimeauth_poly1305_update(&state, c, mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) adlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     STORE64_LE(slen, (uint64_t) mlen); | ||||
|     crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen); | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_final(&state, computed_mac); | ||||
|     sodium_memzero(&state, sizeof state); | ||||
|  | ||||
|     COMPILER_ASSERT(sizeof computed_mac == 16U); | ||||
|     ret = crypto_verify_16(computed_mac, mac); | ||||
|     sodium_memzero(computed_mac, sizeof computed_mac); | ||||
|     if (m == NULL) { | ||||
|         return ret; | ||||
|     } | ||||
|     if (ret != 0) { | ||||
|         memset(m, 0, mlen); | ||||
|         return -1; | ||||
|     } | ||||
|     crypto_stream_chacha20_ietf_ext_xor_ic(m, c, mlen, npub, 1U, k); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, | ||||
|                                                     unsigned char *mac, | ||||
|                                                     unsigned long long *maclen_p, | ||||
|                                                     const unsigned char *m, | ||||
|                                                     unsigned long long mlen, | ||||
|                                                     const unsigned char *ad, | ||||
|                                                     unsigned long long adlen, | ||||
|                                                     const unsigned char *nsec, | ||||
|                                                     const unsigned char *npub, | ||||
|                                                     const unsigned char *k) | ||||
| { | ||||
|     unsigned char k2[crypto_core_hchacha20_OUTPUTBYTES]; | ||||
|     unsigned char npub2[crypto_aead_chacha20poly1305_ietf_NPUBBYTES] = { 0 }; | ||||
|     int           ret; | ||||
|  | ||||
|     crypto_core_hchacha20(k2, npub, k, NULL); | ||||
|     memcpy(npub2 + 4, npub + crypto_core_hchacha20_INPUTBYTES, | ||||
|            crypto_aead_chacha20poly1305_ietf_NPUBBYTES - 4); | ||||
|     ret = _encrypt_detached(c, mac, maclen_p, m, mlen, ad, adlen, | ||||
|                             nsec, npub2, k2); | ||||
|     sodium_memzero(k2, crypto_core_hchacha20_OUTPUTBYTES); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, | ||||
|                                            unsigned long long *clen_p, | ||||
|                                            const unsigned char *m, | ||||
|                                            unsigned long long mlen, | ||||
|                                            const unsigned char *ad, | ||||
|                                            unsigned long long adlen, | ||||
|                                            const unsigned char *nsec, | ||||
|                                            const unsigned char *npub, | ||||
|                                            const unsigned char *k) | ||||
| { | ||||
|     unsigned long long clen = 0ULL; | ||||
|     int                ret; | ||||
|  | ||||
|     if (mlen > crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     ret = crypto_aead_xchacha20poly1305_ietf_encrypt_detached | ||||
|         (c, c + mlen, NULL, m, mlen, ad, adlen, nsec, npub, k); | ||||
|     if (clen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             clen = mlen + crypto_aead_xchacha20poly1305_ietf_ABYTES; | ||||
|         } | ||||
|         *clen_p = clen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, | ||||
|                                                     unsigned char *nsec, | ||||
|                                                     const unsigned char *c, | ||||
|                                                     unsigned long long clen, | ||||
|                                                     const unsigned char *mac, | ||||
|                                                     const unsigned char *ad, | ||||
|                                                     unsigned long long adlen, | ||||
|                                                     const unsigned char *npub, | ||||
|                                                     const unsigned char *k) | ||||
| { | ||||
|     unsigned char k2[crypto_core_hchacha20_OUTPUTBYTES]; | ||||
|     unsigned char npub2[crypto_aead_chacha20poly1305_ietf_NPUBBYTES] = { 0 }; | ||||
|     int           ret; | ||||
|  | ||||
|     crypto_core_hchacha20(k2, npub, k, NULL); | ||||
|     memcpy(npub2 + 4, npub + crypto_core_hchacha20_INPUTBYTES, | ||||
|            crypto_aead_chacha20poly1305_ietf_NPUBBYTES - 4); | ||||
|     ret = _decrypt_detached(m, nsec, c, clen, mac, ad, adlen, npub2, k2); | ||||
|     sodium_memzero(k2, crypto_core_hchacha20_OUTPUTBYTES); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, | ||||
|                                            unsigned long long *mlen_p, | ||||
|                                            unsigned char *nsec, | ||||
|                                            const unsigned char *c, | ||||
|                                            unsigned long long clen, | ||||
|                                            const unsigned char *ad, | ||||
|                                            unsigned long long adlen, | ||||
|                                            const unsigned char *npub, | ||||
|                                            const unsigned char *k) | ||||
| { | ||||
|     unsigned long long mlen = 0ULL; | ||||
|     int                ret  = -1; | ||||
|  | ||||
|     if (clen >= crypto_aead_xchacha20poly1305_ietf_ABYTES) { | ||||
|         ret = crypto_aead_xchacha20poly1305_ietf_decrypt_detached | ||||
|             (m, nsec, | ||||
|              c, clen - crypto_aead_xchacha20poly1305_ietf_ABYTES, | ||||
|              c + clen - crypto_aead_xchacha20poly1305_ietf_ABYTES, | ||||
|              ad, adlen, npub, k); | ||||
|     } | ||||
|     if (mlen_p != NULL) { | ||||
|         if (ret == 0) { | ||||
|             mlen = clen - crypto_aead_xchacha20poly1305_ietf_ABYTES; | ||||
|         } | ||||
|         *mlen_p = mlen; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_xchacha20poly1305_ietf_keybytes(void) | ||||
| { | ||||
|     return crypto_aead_xchacha20poly1305_ietf_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_xchacha20poly1305_ietf_npubbytes(void) | ||||
| { | ||||
|     return crypto_aead_xchacha20poly1305_ietf_NPUBBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_xchacha20poly1305_ietf_nsecbytes(void) | ||||
| { | ||||
|     return crypto_aead_xchacha20poly1305_ietf_NSECBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_xchacha20poly1305_ietf_abytes(void) | ||||
| { | ||||
|     return crypto_aead_xchacha20poly1305_ietf_ABYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_aead_xchacha20poly1305_ietf_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										41
									
								
								deps/libsodium/src/libsodium/crypto_auth/crypto_auth.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								deps/libsodium/src/libsodium/crypto_auth/crypto_auth.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
|  | ||||
| #include "crypto_auth.h" | ||||
| #include "randombytes.h" | ||||
|  | ||||
| size_t | ||||
| crypto_auth_bytes(void) | ||||
| { | ||||
|     return crypto_auth_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_keybytes(void) | ||||
| { | ||||
|     return crypto_auth_KEYBYTES; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_auth_primitive(void) | ||||
| { | ||||
|     return crypto_auth_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth(unsigned char *out, const unsigned char *in, | ||||
|             unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     return crypto_auth_hmacsha512256(out, in, inlen, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_verify(const unsigned char *h, const unsigned char *in, | ||||
|                    unsigned long long inlen,const unsigned char *k) | ||||
| { | ||||
|     return crypto_auth_hmacsha512256_verify(h, in, inlen, k); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_auth_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										118
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_auth_hmacsha256.h" | ||||
| #include "crypto_hash_sha256.h" | ||||
| #include "crypto_verify_32.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha256_bytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha256_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha256_keybytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha256_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha256_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_auth_hmacsha256_state); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_auth_hmacsha256_KEYBYTES); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, | ||||
|                             const unsigned char *key, size_t keylen) | ||||
| { | ||||
|     unsigned char pad[64]; | ||||
|     unsigned char khash[32]; | ||||
|     size_t        i; | ||||
|  | ||||
|     if (keylen > 64) { | ||||
|         crypto_hash_sha256_init(&state->ictx); | ||||
|         crypto_hash_sha256_update(&state->ictx, key, keylen); | ||||
|         crypto_hash_sha256_final(&state->ictx, khash); | ||||
|         key    = khash; | ||||
|         keylen = 32; | ||||
|     } | ||||
|     crypto_hash_sha256_init(&state->ictx); | ||||
|     memset(pad, 0x36, 64); | ||||
|     for (i = 0; i < keylen; i++) { | ||||
|         pad[i] ^= key[i]; | ||||
|     } | ||||
|     crypto_hash_sha256_update(&state->ictx, pad, 64); | ||||
|  | ||||
|     crypto_hash_sha256_init(&state->octx); | ||||
|     memset(pad, 0x5c, 64); | ||||
|     for (i = 0; i < keylen; i++) { | ||||
|         pad[i] ^= key[i]; | ||||
|     } | ||||
|     crypto_hash_sha256_update(&state->octx, pad, 64); | ||||
|  | ||||
|     sodium_memzero((void *) pad, sizeof pad); | ||||
|     sodium_memzero((void *) khash, sizeof khash); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, | ||||
|                               const unsigned char *in, unsigned long long inlen) | ||||
| { | ||||
|     crypto_hash_sha256_update(&state->ictx, in, inlen); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, | ||||
|                              unsigned char                *out) | ||||
| { | ||||
|     unsigned char ihash[32]; | ||||
|  | ||||
|     crypto_hash_sha256_final(&state->ictx, ihash); | ||||
|     crypto_hash_sha256_update(&state->octx, ihash, 32); | ||||
|     crypto_hash_sha256_final(&state->octx, out); | ||||
|  | ||||
|     sodium_memzero((void *) ihash, sizeof ihash); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha256(unsigned char *out, const unsigned char *in, | ||||
|                        unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     crypto_auth_hmacsha256_state state; | ||||
|  | ||||
|     crypto_auth_hmacsha256_init(&state, k, crypto_auth_hmacsha256_KEYBYTES); | ||||
|     crypto_auth_hmacsha256_update(&state, in, inlen); | ||||
|     crypto_auth_hmacsha256_final(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha256_verify(const unsigned char *h, const unsigned char *in, | ||||
|                               unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     unsigned char correct[32]; | ||||
|  | ||||
|     crypto_auth_hmacsha256(correct, in, inlen, k); | ||||
|  | ||||
|     return crypto_verify_32(h, correct) | (-(h == correct)) | | ||||
|            sodium_memcmp(correct, h, 32); | ||||
| } | ||||
							
								
								
									
										118
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_auth_hmacsha512.h" | ||||
| #include "crypto_hash_sha512.h" | ||||
| #include "crypto_verify_64.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512_bytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha512_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512_keybytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha512_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_auth_hmacsha512_state); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_auth_hmacsha512_KEYBYTES); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, | ||||
|                             const unsigned char *key, size_t keylen) | ||||
| { | ||||
|     unsigned char pad[128]; | ||||
|     unsigned char khash[64]; | ||||
|     size_t        i; | ||||
|  | ||||
|     if (keylen > 128) { | ||||
|         crypto_hash_sha512_init(&state->ictx); | ||||
|         crypto_hash_sha512_update(&state->ictx, key, keylen); | ||||
|         crypto_hash_sha512_final(&state->ictx, khash); | ||||
|         key    = khash; | ||||
|         keylen = 64; | ||||
|     } | ||||
|     crypto_hash_sha512_init(&state->ictx); | ||||
|     memset(pad, 0x36, 128); | ||||
|     for (i = 0; i < keylen; i++) { | ||||
|         pad[i] ^= key[i]; | ||||
|     } | ||||
|     crypto_hash_sha512_update(&state->ictx, pad, 128); | ||||
|  | ||||
|     crypto_hash_sha512_init(&state->octx); | ||||
|     memset(pad, 0x5c, 128); | ||||
|     for (i = 0; i < keylen; i++) { | ||||
|         pad[i] ^= key[i]; | ||||
|     } | ||||
|     crypto_hash_sha512_update(&state->octx, pad, 128); | ||||
|  | ||||
|     sodium_memzero((void *) pad, sizeof pad); | ||||
|     sodium_memzero((void *) khash, sizeof khash); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, | ||||
|                               const unsigned char *in, unsigned long long inlen) | ||||
| { | ||||
|     crypto_hash_sha512_update(&state->ictx, in, inlen); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, | ||||
|                              unsigned char                *out) | ||||
| { | ||||
|     unsigned char ihash[64]; | ||||
|  | ||||
|     crypto_hash_sha512_final(&state->ictx, ihash); | ||||
|     crypto_hash_sha512_update(&state->octx, ihash, 64); | ||||
|     crypto_hash_sha512_final(&state->octx, out); | ||||
|  | ||||
|     sodium_memzero((void *) ihash, sizeof ihash); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512(unsigned char *out, const unsigned char *in, | ||||
|                        unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     crypto_auth_hmacsha512_state state; | ||||
|  | ||||
|     crypto_auth_hmacsha512_init(&state, k, crypto_auth_hmacsha512_KEYBYTES); | ||||
|     crypto_auth_hmacsha512_update(&state, in, inlen); | ||||
|     crypto_auth_hmacsha512_final(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512_verify(const unsigned char *h, const unsigned char *in, | ||||
|                               unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     unsigned char correct[64]; | ||||
|  | ||||
|     crypto_auth_hmacsha512(correct, in, inlen, k); | ||||
|  | ||||
|     return crypto_verify_64(h, correct) | (-(h == correct)) | | ||||
|            sodium_memcmp(correct, h, 64); | ||||
| } | ||||
							
								
								
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_auth_hmacsha512.h" | ||||
| #include "crypto_auth_hmacsha512256.h" | ||||
| #include "crypto_hash_sha512.h" | ||||
| #include "crypto_verify_32.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512256_bytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha512256_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512256_keybytes(void) | ||||
| { | ||||
|     return crypto_auth_hmacsha512256_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_auth_hmacsha512256_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_auth_hmacsha512256_state); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_auth_hmacsha512256_keygen( | ||||
|     unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_auth_hmacsha512256_KEYBYTES); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, | ||||
|                                const unsigned char *key, size_t keylen) | ||||
| { | ||||
|     return crypto_auth_hmacsha512_init((crypto_auth_hmacsha512_state *) state, | ||||
|                                        key, keylen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, | ||||
|                                  const unsigned char             *in, | ||||
|                                  unsigned long long               inlen) | ||||
| { | ||||
|     return crypto_auth_hmacsha512_update((crypto_auth_hmacsha512_state *) state, | ||||
|                                          in, inlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, | ||||
|                                 unsigned char                   *out) | ||||
| { | ||||
|     unsigned char out0[64]; | ||||
|  | ||||
|     crypto_auth_hmacsha512_final((crypto_auth_hmacsha512_state *) state, out0); | ||||
|     memcpy(out, out0, 32); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512256(unsigned char *out, const unsigned char *in, | ||||
|                           unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     crypto_auth_hmacsha512256_state state; | ||||
|  | ||||
|     crypto_auth_hmacsha512256_init(&state, k, | ||||
|                                    crypto_auth_hmacsha512256_KEYBYTES); | ||||
|     crypto_auth_hmacsha512256_update(&state, in, inlen); | ||||
|     crypto_auth_hmacsha512256_final(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_auth_hmacsha512256_verify(const unsigned char *h, | ||||
|                                  const unsigned char *in, | ||||
|                                  unsigned long long   inlen, | ||||
|                                  const unsigned char *k) | ||||
| { | ||||
|     unsigned char correct[32]; | ||||
|  | ||||
|     crypto_auth_hmacsha512256(correct, in, inlen, k); | ||||
|  | ||||
|     return crypto_verify_32(h, correct) | (-(h == correct)) | | ||||
|            sodium_memcmp(correct, h, 32); | ||||
| } | ||||
							
								
								
									
										114
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
|  | ||||
| #include "crypto_box.h" | ||||
|  | ||||
| size_t | ||||
| crypto_box_seedbytes(void) | ||||
| { | ||||
|     return crypto_box_SEEDBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_publickeybytes(void) | ||||
| { | ||||
|     return crypto_box_PUBLICKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_secretkeybytes(void) | ||||
| { | ||||
|     return crypto_box_SECRETKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_beforenmbytes(void) | ||||
| { | ||||
|     return crypto_box_BEFORENMBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_noncebytes(void) | ||||
| { | ||||
|     return crypto_box_NONCEBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_zerobytes(void) | ||||
| { | ||||
|     return crypto_box_ZEROBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_boxzerobytes(void) | ||||
| { | ||||
|     return crypto_box_BOXZEROBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_macbytes(void) | ||||
| { | ||||
|     return crypto_box_MACBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_box_MESSAGEBYTES_MAX; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_box_primitive(void) | ||||
| { | ||||
|     return crypto_box_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, | ||||
|                         const unsigned char *seed) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_seed_keypair(pk, sk, seed); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_keypair(unsigned char *pk, unsigned char *sk) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_keypair(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_beforenm(unsigned char *k, const unsigned char *pk, | ||||
|                     const unsigned char *sk) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_beforenm(k, pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_afternm(unsigned char *c, const unsigned char *m, | ||||
|                    unsigned long long mlen, const unsigned char *n, | ||||
|                    const unsigned char *k) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_afternm(c, m, mlen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open_afternm(unsigned char *m, const unsigned char *c, | ||||
|                         unsigned long long clen, const unsigned char *n, | ||||
|                         const unsigned char *k) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_open_afternm(m, c, clen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box(unsigned char *c, const unsigned char *m, | ||||
|            unsigned long long mlen, const unsigned char *n, | ||||
|            const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305(c, m, mlen, n, pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open(unsigned char *m, const unsigned char *c, | ||||
|                 unsigned long long clen, const unsigned char *n, | ||||
|                 const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_open(m, c, clen, n, pk, sk); | ||||
| } | ||||
							
								
								
									
										115
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box_easy.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box_easy.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
|  | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_box.h" | ||||
| #include "crypto_secretbox.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, | ||||
|                             const unsigned char *m, unsigned long long mlen, | ||||
|                             const unsigned char *n, const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_detached(c, mac, m, mlen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_detached(unsigned char *c, unsigned char *mac, | ||||
|                     const unsigned char *m, unsigned long long mlen, | ||||
|                     const unsigned char *n, const unsigned char *pk, | ||||
|                     const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_box_BEFORENMBYTES >= crypto_secretbox_KEYBYTES); | ||||
|     if (crypto_box_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_detached_afternm(c, mac, m, mlen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, | ||||
|                         unsigned long long mlen, const unsigned char *n, | ||||
|                         const unsigned char *k) | ||||
| { | ||||
|     if (mlen > crypto_box_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     return crypto_box_detached_afternm(c + crypto_box_MACBYTES, c, m, mlen, n, | ||||
|                                        k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_easy(unsigned char *c, const unsigned char *m, | ||||
|                 unsigned long long mlen, const unsigned char *n, | ||||
|                 const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     if (mlen > crypto_box_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     return crypto_box_detached(c + crypto_box_MACBYTES, c, m, mlen, n, | ||||
|                                pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, | ||||
|                                  const unsigned char *mac, | ||||
|                                  unsigned long long clen, | ||||
|                                  const unsigned char *n, | ||||
|                                  const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_open_detached(m, c, mac, clen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open_detached(unsigned char *m, const unsigned char *c, | ||||
|                          const unsigned char *mac, | ||||
|                          unsigned long long clen, const unsigned char *n, | ||||
|                          const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_open_detached_afternm(m, c, mac, clen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, | ||||
|                              unsigned long long clen, const unsigned char *n, | ||||
|                              const unsigned char *k) | ||||
| { | ||||
|     if (clen < crypto_box_MACBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_box_open_detached_afternm(m, c + crypto_box_MACBYTES, c, | ||||
|                                             clen - crypto_box_MACBYTES, | ||||
|                                             n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_open_easy(unsigned char *m, const unsigned char *c, | ||||
|                      unsigned long long clen, const unsigned char *n, | ||||
|                      const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     if (clen < crypto_box_MACBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_box_open_detached(m, c + crypto_box_MACBYTES, c, | ||||
|                                     clen - crypto_box_MACBYTES, | ||||
|                                     n, pk, sk); | ||||
| } | ||||
							
								
								
									
										68
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box_seal.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								deps/libsodium/src/libsodium/crypto_box/crypto_box_seal.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_box.h" | ||||
| #include "crypto_generichash.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static int | ||||
| _crypto_box_seal_nonce(unsigned char *nonce, | ||||
|                        const unsigned char *pk1, const unsigned char *pk2) | ||||
| { | ||||
|     crypto_generichash_state st; | ||||
|  | ||||
|     crypto_generichash_init(&st, NULL, 0U, crypto_box_NONCEBYTES); | ||||
|     crypto_generichash_update(&st, pk1, crypto_box_PUBLICKEYBYTES); | ||||
|     crypto_generichash_update(&st, pk2, crypto_box_PUBLICKEYBYTES); | ||||
|     crypto_generichash_final(&st, nonce, crypto_box_NONCEBYTES); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_seal(unsigned char *c, const unsigned char *m, | ||||
|                 unsigned long long mlen, const unsigned char *pk) | ||||
| { | ||||
|     unsigned char nonce[crypto_box_NONCEBYTES]; | ||||
|     unsigned char epk[crypto_box_PUBLICKEYBYTES]; | ||||
|     unsigned char esk[crypto_box_SECRETKEYBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_keypair(epk, esk) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     _crypto_box_seal_nonce(nonce, epk, pk); | ||||
|     ret = crypto_box_easy(c + crypto_box_PUBLICKEYBYTES, m, mlen, | ||||
|                           nonce, pk, esk); | ||||
|     memcpy(c, epk, crypto_box_PUBLICKEYBYTES); | ||||
|     sodium_memzero(esk, sizeof esk); | ||||
|     sodium_memzero(epk, sizeof epk); | ||||
|     sodium_memzero(nonce, sizeof nonce); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_seal_open(unsigned char *m, const unsigned char *c, | ||||
|                      unsigned long long clen, | ||||
|                      const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     unsigned char nonce[crypto_box_NONCEBYTES]; | ||||
|  | ||||
|     if (clen < crypto_box_SEALBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     _crypto_box_seal_nonce(nonce, c, pk); | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_box_PUBLICKEYBYTES < crypto_box_SEALBYTES); | ||||
|     return crypto_box_open_easy(m, c + crypto_box_PUBLICKEYBYTES, | ||||
|                                 clen - crypto_box_PUBLICKEYBYTES, | ||||
|                                 nonce, c, sk); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_sealbytes(void) | ||||
| { | ||||
|     return crypto_box_SEALBYTES; | ||||
| } | ||||
| @@ -0,0 +1,204 @@ | ||||
|  | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_box_curve25519xchacha20poly1305.h" | ||||
| #include "crypto_core_hchacha20.h" | ||||
| #include "crypto_hash_sha512.h" | ||||
| #include "crypto_scalarmult_curve25519.h" | ||||
| #include "crypto_secretbox_xchacha20poly1305.h" | ||||
| #include "private/common.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, | ||||
|                                                     unsigned char *sk, | ||||
|                                                     const unsigned char *seed) | ||||
| { | ||||
|     unsigned char hash[64]; | ||||
|  | ||||
|     crypto_hash_sha512(hash, seed, 32); | ||||
|     memcpy(sk, hash, 32); | ||||
|     sodium_memzero(hash, sizeof hash); | ||||
|  | ||||
|     return crypto_scalarmult_curve25519_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, | ||||
|                                                unsigned char *sk) | ||||
| { | ||||
|     randombytes_buf(sk, 32); | ||||
|  | ||||
|     return crypto_scalarmult_curve25519_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, | ||||
|                                                 const unsigned char *pk, | ||||
|                                                 const unsigned char *sk) | ||||
| { | ||||
|     static const unsigned char zero[16] = { 0 }; | ||||
|     unsigned char s[32]; | ||||
|  | ||||
|     if (crypto_scalarmult_curve25519(s, sk, pk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_core_hchacha20(k, zero, s, NULL); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_detached_afternm( | ||||
|     unsigned char *c, unsigned char *mac, const unsigned char *m, | ||||
|     unsigned long long mlen, const unsigned char *n, const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_xchacha20poly1305_detached(c, mac, m, mlen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_detached( | ||||
|     unsigned char *c, unsigned char *mac, const unsigned char *m, | ||||
|     unsigned long long mlen, const unsigned char *n, const unsigned char *pk, | ||||
|     const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES >= | ||||
|                     crypto_secretbox_xchacha20poly1305_KEYBYTES); | ||||
|     if (crypto_box_curve25519xchacha20poly1305_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_curve25519xchacha20poly1305_detached_afternm(c, mac, m, | ||||
|                                                                   mlen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, | ||||
|                                                     const unsigned char *m, | ||||
|                                                     unsigned long long mlen, | ||||
|                                                     const unsigned char *n, | ||||
|                                                     const unsigned char *k) | ||||
| { | ||||
|     if (mlen > crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     return crypto_box_curve25519xchacha20poly1305_detached_afternm( | ||||
|         c + crypto_box_curve25519xchacha20poly1305_MACBYTES, c, m, mlen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_easy( | ||||
|     unsigned char *c, const unsigned char *m, unsigned long long mlen, | ||||
|     const unsigned char *n, const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     if (mlen > crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     return crypto_box_curve25519xchacha20poly1305_detached( | ||||
|         c + crypto_box_curve25519xchacha20poly1305_MACBYTES, c, m, mlen, n, pk, | ||||
|         sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_open_detached_afternm( | ||||
|     unsigned char *m, const unsigned char *c, const unsigned char *mac, | ||||
|     unsigned long long clen, const unsigned char *n, const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_xchacha20poly1305_open_detached(m, c, mac, clen, n, | ||||
|                                                             k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_open_detached( | ||||
|     unsigned char *m, const unsigned char *c, const unsigned char *mac, | ||||
|     unsigned long long clen, const unsigned char *n, const unsigned char *pk, | ||||
|     const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_curve25519xchacha20poly1305_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_curve25519xchacha20poly1305_open_detached_afternm( | ||||
|         m, c, mac, clen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_open_easy_afternm( | ||||
|     unsigned char *m, const unsigned char *c, unsigned long long clen, | ||||
|     const unsigned char *n, const unsigned char *k) | ||||
| { | ||||
|     if (clen < crypto_box_curve25519xchacha20poly1305_MACBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_box_curve25519xchacha20poly1305_open_detached_afternm( | ||||
|         m, c + crypto_box_curve25519xchacha20poly1305_MACBYTES, c, | ||||
|         clen - crypto_box_curve25519xchacha20poly1305_MACBYTES, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_open_easy( | ||||
|     unsigned char *m, const unsigned char *c, unsigned long long clen, | ||||
|     const unsigned char *n, const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     if (clen < crypto_box_curve25519xchacha20poly1305_MACBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_box_curve25519xchacha20poly1305_open_detached( | ||||
|         m, c + crypto_box_curve25519xchacha20poly1305_MACBYTES, c, | ||||
|         clen - crypto_box_curve25519xchacha20poly1305_MACBYTES, n, pk, sk); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_seedbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_SEEDBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_publickeybytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_secretkeybytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_beforenmbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_noncebytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_NONCEBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_macbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_MACBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX; | ||||
| } | ||||
| @@ -0,0 +1,79 @@ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_box_curve25519xchacha20poly1305.h" | ||||
| #include "crypto_generichash.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static int | ||||
| _crypto_box_curve25519xchacha20poly1305_seal_nonce(unsigned char *nonce, | ||||
|                                                    const unsigned char *pk1, | ||||
|                                                    const unsigned char *pk2) | ||||
| { | ||||
|     crypto_generichash_state st; | ||||
|  | ||||
|     crypto_generichash_init(&st, NULL, 0U, | ||||
|                             crypto_box_curve25519xchacha20poly1305_NONCEBYTES); | ||||
|     crypto_generichash_update(&st, pk1, | ||||
|                               crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES); | ||||
|     crypto_generichash_update(&st, pk2, | ||||
|                               crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES); | ||||
|     crypto_generichash_final(&st, nonce, | ||||
|                              crypto_box_curve25519xchacha20poly1305_NONCEBYTES); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, const unsigned char *m, | ||||
|                                             unsigned long long mlen, | ||||
|                                             const unsigned char *pk) | ||||
| { | ||||
|     unsigned char nonce[crypto_box_curve25519xchacha20poly1305_NONCEBYTES]; | ||||
|     unsigned char epk[crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES]; | ||||
|     unsigned char esk[crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_curve25519xchacha20poly1305_keypair(epk, esk) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     _crypto_box_curve25519xchacha20poly1305_seal_nonce(nonce, epk, pk); | ||||
|     ret = crypto_box_curve25519xchacha20poly1305_easy( | ||||
|          c + crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES, m, mlen, | ||||
|          nonce, pk, esk); | ||||
|     memcpy(c, epk, crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES); | ||||
|     sodium_memzero(esk, sizeof esk); | ||||
|     sodium_memzero(epk, sizeof epk); | ||||
|     sodium_memzero(nonce, sizeof nonce); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, const unsigned char *c, | ||||
|                                                  unsigned long long clen, | ||||
|                                                  const unsigned char *pk, | ||||
|                                                  const unsigned char *sk) | ||||
| { | ||||
|     unsigned char nonce[crypto_box_curve25519xchacha20poly1305_NONCEBYTES]; | ||||
|  | ||||
|     if (clen < crypto_box_curve25519xchacha20poly1305_SEALBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     _crypto_box_curve25519xchacha20poly1305_seal_nonce(nonce, c, pk); | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES < | ||||
|                     crypto_box_curve25519xchacha20poly1305_SEALBYTES); | ||||
|  | ||||
|     return crypto_box_curve25519xchacha20poly1305_open_easy( | ||||
|          m, c + crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES, | ||||
|          clen - crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES, | ||||
|          nonce, c, sk); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xchacha20poly1305_sealbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xchacha20poly1305_SEALBYTES; | ||||
| } | ||||
							
								
								
									
										156
									
								
								deps/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								deps/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_box_curve25519xsalsa20poly1305.h" | ||||
| #include "crypto_core_hsalsa20.h" | ||||
| #include "crypto_hash_sha512.h" | ||||
| #include "crypto_scalarmult_curve25519.h" | ||||
| #include "crypto_secretbox_xsalsa20poly1305.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, | ||||
|                                                    unsigned char *sk, | ||||
|                                                    const unsigned char *seed) | ||||
| { | ||||
|     unsigned char hash[64]; | ||||
|  | ||||
|     crypto_hash_sha512(hash, seed, 32); | ||||
|     memcpy(sk, hash, 32); | ||||
|     sodium_memzero(hash, sizeof hash); | ||||
|  | ||||
|     return crypto_scalarmult_curve25519_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, | ||||
|                                               unsigned char *sk) | ||||
| { | ||||
|     randombytes_buf(sk, 32); | ||||
|  | ||||
|     return crypto_scalarmult_curve25519_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, | ||||
|                                                const unsigned char *pk, | ||||
|                                                const unsigned char *sk) | ||||
| { | ||||
|     static const unsigned char zero[16] = { 0 }; | ||||
|     unsigned char s[32]; | ||||
|  | ||||
|     if (crypto_scalarmult_curve25519(s, sk, pk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_core_hsalsa20(k, zero, s, NULL); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, | ||||
|                                               const unsigned char *m, | ||||
|                                               unsigned long long mlen, | ||||
|                                               const unsigned char *n, | ||||
|                                               const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_xsalsa20poly1305(c, m, mlen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, | ||||
|                                                    const unsigned char *c, | ||||
|                                                    unsigned long long clen, | ||||
|                                                    const unsigned char *n, | ||||
|                                                    const unsigned char *k) | ||||
| { | ||||
|     return crypto_secretbox_xsalsa20poly1305_open(m, c, clen, n, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305(unsigned char *c, const unsigned char *m, | ||||
|                                       unsigned long long   mlen, | ||||
|                                       const unsigned char *n, | ||||
|                                       const unsigned char *pk, | ||||
|                                       const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_curve25519xsalsa20poly1305_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_curve25519xsalsa20poly1305_afternm(c, m, mlen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_box_curve25519xsalsa20poly1305_open( | ||||
|     unsigned char *m, const unsigned char *c, unsigned long long clen, | ||||
|     const unsigned char *n, const unsigned char *pk, const unsigned char *sk) | ||||
| { | ||||
|     unsigned char k[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES]; | ||||
|     int           ret; | ||||
|  | ||||
|     if (crypto_box_curve25519xsalsa20poly1305_beforenm(k, pk, sk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ret = crypto_box_curve25519xsalsa20poly1305_open_afternm(m, c, clen, n, k); | ||||
|     sodium_memzero(k, sizeof k); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_seedbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_SEEDBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_publickeybytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_noncebytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_NONCEBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_zerobytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_ZEROBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_macbytes(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_MACBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void) | ||||
| { | ||||
|     return crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX; | ||||
| } | ||||
							
								
								
									
										225
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/core_ed25519.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/core_ed25519.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,225 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "crypto_core_ed25519.h" | ||||
| #include "private/common.h" | ||||
| #include "private/ed25519_ref10.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_is_valid_point(const unsigned char *p) | ||||
| { | ||||
|     ge25519_p3 p_p3; | ||||
|  | ||||
|     if (ge25519_is_canonical(p) == 0 || | ||||
|         ge25519_has_small_order(p) != 0 || | ||||
|         ge25519_frombytes(&p_p3, p) != 0 || | ||||
|         ge25519_is_on_curve(&p_p3) == 0 || | ||||
|         ge25519_is_on_main_subgroup(&p_p3) == 0) { | ||||
|         return 0; | ||||
|     } | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_add(unsigned char *r, | ||||
|                         const unsigned char *p, const unsigned char *q) | ||||
| { | ||||
|     ge25519_p3     p_p3, q_p3, r_p3; | ||||
|     ge25519_p1p1   r_p1p1; | ||||
|     ge25519_cached q_cached; | ||||
|  | ||||
|     if (ge25519_frombytes(&p_p3, p) != 0 || ge25519_is_on_curve(&p_p3) == 0 || | ||||
|         ge25519_frombytes(&q_p3, q) != 0 || ge25519_is_on_curve(&q_p3) == 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ge25519_p3_to_cached(&q_cached, &q_p3); | ||||
|     ge25519_add(&r_p1p1, &p_p3, &q_cached); | ||||
|     ge25519_p1p1_to_p3(&r_p3, &r_p1p1); | ||||
|     ge25519_p3_tobytes(r, &r_p3); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_sub(unsigned char *r, | ||||
|                         const unsigned char *p, const unsigned char *q) | ||||
| { | ||||
|     ge25519_p3     p_p3, q_p3, r_p3; | ||||
|     ge25519_p1p1   r_p1p1; | ||||
|     ge25519_cached q_cached; | ||||
|  | ||||
|     if (ge25519_frombytes(&p_p3, p) != 0 || ge25519_is_on_curve(&p_p3) == 0 || | ||||
|         ge25519_frombytes(&q_p3, q) != 0 || ge25519_is_on_curve(&q_p3) == 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ge25519_p3_to_cached(&q_cached, &q_p3); | ||||
|     ge25519_sub(&r_p1p1, &p_p3, &q_cached); | ||||
|     ge25519_p1p1_to_p3(&r_p3, &r_p1p1); | ||||
|     ge25519_p3_tobytes(r, &r_p3); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) | ||||
| { | ||||
|     ge25519_from_uniform(p, r); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_from_hash(unsigned char *p, const unsigned char *h) | ||||
| { | ||||
|     ge25519_from_hash(p, h); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_random(unsigned char *p) | ||||
| { | ||||
|     unsigned char h[crypto_core_ed25519_UNIFORMBYTES]; | ||||
|  | ||||
|     randombytes_buf(h, sizeof h); | ||||
|     (void) crypto_core_ed25519_from_uniform(p, h); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_random(unsigned char *r) | ||||
| { | ||||
|     do { | ||||
|         randombytes_buf(r, crypto_core_ed25519_SCALARBYTES); | ||||
|         r[crypto_core_ed25519_SCALARBYTES - 1] &= 0x1f; | ||||
|     } while (sc25519_is_canonical(r) == 0 || | ||||
|              sodium_is_zero(r, crypto_core_ed25519_SCALARBYTES)); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) | ||||
| { | ||||
|     sc25519_invert(recip, s); | ||||
|  | ||||
|     return - sodium_is_zero(s, crypto_core_ed25519_SCALARBYTES); | ||||
| } | ||||
|  | ||||
| /* 2^252+27742317777372353535851937790883648493 */ | ||||
| static const unsigned char L[] = { | ||||
|     0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, | ||||
|     0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 | ||||
| }; | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) | ||||
| { | ||||
|     unsigned char t_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|     unsigned char s_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_core_ed25519_NONREDUCEDSCALARBYTES >= | ||||
|                     2 * crypto_core_ed25519_SCALARBYTES); | ||||
|     memset(t_, 0, sizeof t_); | ||||
|     memset(s_, 0, sizeof s_); | ||||
|     memcpy(t_ + crypto_core_ed25519_SCALARBYTES, L, | ||||
|            crypto_core_ed25519_SCALARBYTES); | ||||
|     memcpy(s_, s, crypto_core_ed25519_SCALARBYTES); | ||||
|     sodium_sub(t_, s_, sizeof t_); | ||||
|     sc25519_reduce(t_); | ||||
|     memcpy(neg, t_, crypto_core_ed25519_SCALARBYTES); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_complement(unsigned char *comp, | ||||
|                                       const unsigned char *s) | ||||
| { | ||||
|     unsigned char t_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|     unsigned char s_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|  | ||||
|     COMPILER_ASSERT(crypto_core_ed25519_NONREDUCEDSCALARBYTES >= | ||||
|                     2 * crypto_core_ed25519_SCALARBYTES); | ||||
|     memset(t_, 0, sizeof t_); | ||||
|     memset(s_, 0, sizeof s_); | ||||
|     t_[0]++; | ||||
|     memcpy(t_ + crypto_core_ed25519_SCALARBYTES, L, | ||||
|            crypto_core_ed25519_SCALARBYTES); | ||||
|     memcpy(s_, s, crypto_core_ed25519_SCALARBYTES); | ||||
|     sodium_sub(t_, s_, sizeof t_); | ||||
|     sc25519_reduce(t_); | ||||
|     memcpy(comp, t_, crypto_core_ed25519_SCALARBYTES); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, | ||||
|                                const unsigned char *y) | ||||
| { | ||||
|     unsigned char x_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|     unsigned char y_[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|  | ||||
|     memset(x_, 0, sizeof x_); | ||||
|     memset(y_, 0, sizeof y_); | ||||
|     memcpy(x_, x, crypto_core_ed25519_SCALARBYTES); | ||||
|     memcpy(y_, y, crypto_core_ed25519_SCALARBYTES); | ||||
|     sodium_add(x_, y_, crypto_core_ed25519_SCALARBYTES); | ||||
|     crypto_core_ed25519_scalar_reduce(z, x_); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, | ||||
|                                const unsigned char *y) | ||||
| { | ||||
|     unsigned char yn[crypto_core_ed25519_SCALARBYTES]; | ||||
|  | ||||
|     crypto_core_ed25519_scalar_negate(yn, y); | ||||
|     crypto_core_ed25519_scalar_add(z, x, yn); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, | ||||
|                                const unsigned char *y) | ||||
| { | ||||
|     sc25519_mul(z, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ed25519_scalar_reduce(unsigned char *r, | ||||
|                                   const unsigned char *s) | ||||
| { | ||||
|     unsigned char t[crypto_core_ed25519_NONREDUCEDSCALARBYTES]; | ||||
|  | ||||
|     memcpy(t, s, sizeof t); | ||||
|     sc25519_reduce(t); | ||||
|     memcpy(r, t, crypto_core_ed25519_SCALARBYTES); | ||||
|     sodium_memzero(t, sizeof t); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ed25519_bytes(void) | ||||
| { | ||||
|     return crypto_core_ed25519_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ed25519_nonreducedscalarbytes(void) | ||||
| { | ||||
|     return crypto_core_ed25519_NONREDUCEDSCALARBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ed25519_uniformbytes(void) | ||||
| { | ||||
|     return crypto_core_ed25519_UNIFORMBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ed25519_hashbytes(void) | ||||
| { | ||||
|     return crypto_core_ed25519_HASHBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ed25519_scalarbytes(void) | ||||
| { | ||||
|     return crypto_core_ed25519_SCALARBYTES; | ||||
| } | ||||
							
								
								
									
										156
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/core_ristretto255.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/core_ristretto255.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "crypto_core_ed25519.h" | ||||
| #include "crypto_core_ristretto255.h" | ||||
| #include "private/common.h" | ||||
| #include "private/ed25519_ref10.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_core_ristretto255_is_valid_point(const unsigned char *p) | ||||
| { | ||||
|     ge25519_p3 p_p3; | ||||
|  | ||||
|     if (ristretto255_frombytes(&p_p3, p) != 0) { | ||||
|         return 0; | ||||
|     } | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ristretto255_add(unsigned char *r, | ||||
|                              const unsigned char *p, const unsigned char *q) | ||||
| { | ||||
|     ge25519_p3     p_p3, q_p3, r_p3; | ||||
|     ge25519_p1p1   r_p1p1; | ||||
|     ge25519_cached q_cached; | ||||
|  | ||||
|     if (ristretto255_frombytes(&p_p3, p) != 0 || | ||||
|         ristretto255_frombytes(&q_p3, q) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ge25519_p3_to_cached(&q_cached, &q_p3); | ||||
|     ge25519_add(&r_p1p1, &p_p3, &q_cached); | ||||
|     ge25519_p1p1_to_p3(&r_p3, &r_p1p1); | ||||
|     ristretto255_p3_tobytes(r, &r_p3); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ristretto255_sub(unsigned char *r, | ||||
|                              const unsigned char *p, const unsigned char *q) | ||||
| { | ||||
|     ge25519_p3     p_p3, q_p3, r_p3; | ||||
|     ge25519_p1p1   r_p1p1; | ||||
|     ge25519_cached q_cached; | ||||
|  | ||||
|     if (ristretto255_frombytes(&p_p3, p) != 0 || | ||||
|         ristretto255_frombytes(&q_p3, q) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     ge25519_p3_to_cached(&q_cached, &q_p3); | ||||
|     ge25519_sub(&r_p1p1, &p_p3, &q_cached); | ||||
|     ge25519_p1p1_to_p3(&r_p3, &r_p1p1); | ||||
|     ristretto255_p3_tobytes(r, &r_p3); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ristretto255_from_hash(unsigned char *p, const unsigned char *r) | ||||
| { | ||||
|     ristretto255_from_hash(p, r); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_random(unsigned char *p) | ||||
| { | ||||
|     unsigned char h[crypto_core_ristretto255_HASHBYTES]; | ||||
|  | ||||
|     randombytes_buf(h, sizeof h); | ||||
|     (void) crypto_core_ristretto255_from_hash(p, h); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_random(unsigned char *r) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_random(r); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_ristretto255_scalar_invert(unsigned char *recip, | ||||
|                                        const unsigned char *s) | ||||
| { | ||||
|     return crypto_core_ed25519_scalar_invert(recip, s); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_negate(unsigned char *neg, | ||||
|                                        const unsigned char *s) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_negate(neg, s); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_complement(unsigned char *comp, | ||||
|                                            const unsigned char *s) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_complement(comp, s); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_add(unsigned char *z, const unsigned char *x, | ||||
|                                     const unsigned char *y) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_add(z, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_sub(unsigned char *z, const unsigned char *x, | ||||
|                                     const unsigned char *y) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_sub(z, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_mul(unsigned char *z, const unsigned char *x, | ||||
|                                     const unsigned char *y) | ||||
| { | ||||
|     sc25519_mul(z, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_core_ristretto255_scalar_reduce(unsigned char *r, | ||||
|                                        const unsigned char *s) | ||||
| { | ||||
|     crypto_core_ed25519_scalar_reduce(r, s); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ristretto255_bytes(void) | ||||
| { | ||||
|     return crypto_core_ristretto255_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ristretto255_nonreducedscalarbytes(void) | ||||
| { | ||||
|     return crypto_core_ristretto255_NONREDUCEDSCALARBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ristretto255_hashbytes(void) | ||||
| { | ||||
|     return crypto_core_ristretto255_HASHBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_ristretto255_scalarbytes(void) | ||||
| { | ||||
|     return crypto_core_ristretto255_SCALARBYTES; | ||||
| } | ||||
							
								
								
									
										2852
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2852
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1344
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1344
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
|   { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, | ||||
|   { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, | ||||
|   { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 } | ||||
| }, | ||||
| { | ||||
|   { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, | ||||
|   { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, | ||||
|   { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 } | ||||
| }, | ||||
| { | ||||
|   { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, | ||||
|   { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, | ||||
|   { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 } | ||||
| }, | ||||
| { | ||||
|   { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, | ||||
|   { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, | ||||
|   { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 } | ||||
| }, | ||||
| { | ||||
|   { -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 }, | ||||
|   { -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 }, | ||||
|   { 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 } | ||||
| }, | ||||
| { | ||||
|   { -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 }, | ||||
|   { 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 }, | ||||
|   { 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 } | ||||
| }, | ||||
| { | ||||
|   { -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 }, | ||||
|   { -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 }, | ||||
|   { -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 } | ||||
| }, | ||||
| { | ||||
|   { -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 }, | ||||
|   { -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 }, | ||||
|   { -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 } | ||||
| } | ||||
							
								
								
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/constants.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/constants.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| /* 37095705934669439343138083508754565189542113879843219016388785533085940283555 */ | ||||
| static const fe25519 d = { | ||||
|     -10913610, 13857413, -15372611, 6949391,   114729, -8787816, -6275908, -3247719, -18696448, -12055116 | ||||
| }; | ||||
|  | ||||
| /* 2 * d = | ||||
|  * 16295367250680780974490674513165176452449235426866156013048779062215315747161 | ||||
|  */ | ||||
| static const fe25519 d2 = { | ||||
|     -21827239, -5839606,  -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 }; | ||||
|  | ||||
| /* sqrt(-1) */ | ||||
| static const fe25519 sqrtm1 = { | ||||
|     -32595792, -7943725,  9377950,  3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 | ||||
| }; | ||||
|  | ||||
| /* A = 486662 */ | ||||
| static const fe25519 curve25519_A = { | ||||
|     486662, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||||
| }; | ||||
|  | ||||
| /* sqrt(ad - 1) with a = -1 (mod p) */ | ||||
| static const fe25519 sqrtadm1 = { | ||||
|     24849947, -153582, -23613485, 6347715, -21072328, -667138, -25271143, -15367704, -870347, 14525639 | ||||
| }; | ||||
|  | ||||
| /* 1 / sqrt(a - d) */ | ||||
| static const fe25519 invsqrtamd = { | ||||
|     6111485, 4156064, -27798727, 12243468, -25904040, 120897, 20826367, -7060776, 6093568, -1986012 | ||||
| }; | ||||
|  | ||||
| /* 1 - d ^ 2 */ | ||||
| static const fe25519 onemsqd = { | ||||
|     6275446, -16617371, -22938544, -3773710, 11667077, 7397348, -27922721, 1766195, -24433858, 672203 | ||||
| }; | ||||
|  | ||||
| /* (d - 1) ^ 2 */ | ||||
| static const fe25519 sqdmone = { | ||||
|     15551795, -11097455, -13425098, -10125071, -11896535, 10178284, -26634327, 4729244, -5282110, -10116402 | ||||
| }; | ||||
							
								
								
									
										220
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,220 @@ | ||||
| /* | ||||
|  Ignores top bit of h. | ||||
|  */ | ||||
|  | ||||
| void | ||||
| fe25519_frombytes(fe25519 h, const unsigned char *s) | ||||
| { | ||||
|     int64_t h0 = load_4(s); | ||||
|     int64_t h1 = load_3(s + 4) << 6; | ||||
|     int64_t h2 = load_3(s + 7) << 5; | ||||
|     int64_t h3 = load_3(s + 10) << 3; | ||||
|     int64_t h4 = load_3(s + 13) << 2; | ||||
|     int64_t h5 = load_4(s + 16); | ||||
|     int64_t h6 = load_3(s + 20) << 7; | ||||
|     int64_t h7 = load_3(s + 23) << 5; | ||||
|     int64_t h8 = load_3(s + 26) << 4; | ||||
|     int64_t h9 = (load_3(s + 29) & 8388607) << 2; | ||||
|  | ||||
|     int64_t carry0; | ||||
|     int64_t carry1; | ||||
|     int64_t carry2; | ||||
|     int64_t carry3; | ||||
|     int64_t carry4; | ||||
|     int64_t carry5; | ||||
|     int64_t carry6; | ||||
|     int64_t carry7; | ||||
|     int64_t carry8; | ||||
|     int64_t carry9; | ||||
|  | ||||
|     carry9 = (h9 + (int64_t)(1L << 24)) >> 25; | ||||
|     h0 += carry9 * 19; | ||||
|     h9 -= carry9 * ((uint64_t) 1L << 25); | ||||
|     carry1 = (h1 + (int64_t)(1L << 24)) >> 25; | ||||
|     h2 += carry1; | ||||
|     h1 -= carry1 * ((uint64_t) 1L << 25); | ||||
|     carry3 = (h3 + (int64_t)(1L << 24)) >> 25; | ||||
|     h4 += carry3; | ||||
|     h3 -= carry3 * ((uint64_t) 1L << 25); | ||||
|     carry5 = (h5 + (int64_t)(1L << 24)) >> 25; | ||||
|     h6 += carry5; | ||||
|     h5 -= carry5 * ((uint64_t) 1L << 25); | ||||
|     carry7 = (h7 + (int64_t)(1L << 24)) >> 25; | ||||
|     h8 += carry7; | ||||
|     h7 -= carry7 * ((uint64_t) 1L << 25); | ||||
|  | ||||
|     carry0 = (h0 + (int64_t)(1L << 25)) >> 26; | ||||
|     h1 += carry0; | ||||
|     h0 -= carry0 * ((uint64_t) 1L << 26); | ||||
|     carry2 = (h2 + (int64_t)(1L << 25)) >> 26; | ||||
|     h3 += carry2; | ||||
|     h2 -= carry2 * ((uint64_t) 1L << 26); | ||||
|     carry4 = (h4 + (int64_t)(1L << 25)) >> 26; | ||||
|     h5 += carry4; | ||||
|     h4 -= carry4 * ((uint64_t) 1L << 26); | ||||
|     carry6 = (h6 + (int64_t)(1L << 25)) >> 26; | ||||
|     h7 += carry6; | ||||
|     h6 -= carry6 * ((uint64_t) 1L << 26); | ||||
|     carry8 = (h8 + (int64_t)(1L << 25)) >> 26; | ||||
|     h9 += carry8; | ||||
|     h8 -= carry8 * ((uint64_t) 1L << 26); | ||||
|  | ||||
|     h[0] = (int32_t) h0; | ||||
|     h[1] = (int32_t) h1; | ||||
|     h[2] = (int32_t) h2; | ||||
|     h[3] = (int32_t) h3; | ||||
|     h[4] = (int32_t) h4; | ||||
|     h[5] = (int32_t) h5; | ||||
|     h[6] = (int32_t) h6; | ||||
|     h[7] = (int32_t) h7; | ||||
|     h[8] = (int32_t) h8; | ||||
|     h[9] = (int32_t) h9; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  Preconditions: | ||||
|  |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. | ||||
|  | ||||
|  Write p=2^255-19; q=floor(h/p). | ||||
|  Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). | ||||
|  | ||||
|  Proof: | ||||
|  Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. | ||||
|  Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. | ||||
|  | ||||
|  Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). | ||||
|  Then 0<y<1. | ||||
|  | ||||
|  Write r=h-pq. | ||||
|  Have 0<=r<=p-1=2^255-20. | ||||
|  Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1. | ||||
|  | ||||
|  Write x=r+19(2^-255)r+y. | ||||
|  Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q. | ||||
|  | ||||
|  Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1)) | ||||
|  so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q. | ||||
| */ | ||||
|  | ||||
| static void | ||||
| fe25519_reduce(fe25519 h, const fe25519 f) | ||||
| { | ||||
|     int32_t h0 = f[0]; | ||||
|     int32_t h1 = f[1]; | ||||
|     int32_t h2 = f[2]; | ||||
|     int32_t h3 = f[3]; | ||||
|     int32_t h4 = f[4]; | ||||
|     int32_t h5 = f[5]; | ||||
|     int32_t h6 = f[6]; | ||||
|     int32_t h7 = f[7]; | ||||
|     int32_t h8 = f[8]; | ||||
|     int32_t h9 = f[9]; | ||||
|  | ||||
|     int32_t q; | ||||
|     int32_t carry0, carry1, carry2, carry3, carry4, carry5, carry6, carry7, carry8, carry9; | ||||
|  | ||||
|     q = (19 * h9 + ((uint32_t) 1L << 24)) >> 25; | ||||
|     q = (h0 + q) >> 26; | ||||
|     q = (h1 + q) >> 25; | ||||
|     q = (h2 + q) >> 26; | ||||
|     q = (h3 + q) >> 25; | ||||
|     q = (h4 + q) >> 26; | ||||
|     q = (h5 + q) >> 25; | ||||
|     q = (h6 + q) >> 26; | ||||
|     q = (h7 + q) >> 25; | ||||
|     q = (h8 + q) >> 26; | ||||
|     q = (h9 + q) >> 25; | ||||
|  | ||||
|     /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ | ||||
|     h0 += 19 * q; | ||||
|     /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ | ||||
|  | ||||
|     carry0 = h0 >> 26; | ||||
|     h1 += carry0; | ||||
|     h0 -= carry0 * ((uint32_t) 1L << 26); | ||||
|     carry1 = h1 >> 25; | ||||
|     h2 += carry1; | ||||
|     h1 -= carry1 * ((uint32_t) 1L << 25); | ||||
|     carry2 = h2 >> 26; | ||||
|     h3 += carry2; | ||||
|     h2 -= carry2 * ((uint32_t) 1L << 26); | ||||
|     carry3 = h3 >> 25; | ||||
|     h4 += carry3; | ||||
|     h3 -= carry3 * ((uint32_t) 1L << 25); | ||||
|     carry4 = h4 >> 26; | ||||
|     h5 += carry4; | ||||
|     h4 -= carry4 * ((uint32_t) 1L << 26); | ||||
|     carry5 = h5 >> 25; | ||||
|     h6 += carry5; | ||||
|     h5 -= carry5 * ((uint32_t) 1L << 25); | ||||
|     carry6 = h6 >> 26; | ||||
|     h7 += carry6; | ||||
|     h6 -= carry6 * ((uint32_t) 1L << 26); | ||||
|     carry7 = h7 >> 25; | ||||
|     h8 += carry7; | ||||
|     h7 -= carry7 * ((uint32_t) 1L << 25); | ||||
|     carry8 = h8 >> 26; | ||||
|     h9 += carry8; | ||||
|     h8 -= carry8 * ((uint32_t) 1L << 26); | ||||
|     carry9 = h9 >> 25; | ||||
|     h9 -= carry9 * ((uint32_t) 1L << 25); | ||||
|  | ||||
|     h[0] = h0; | ||||
|     h[1] = h1; | ||||
|     h[2] = h2; | ||||
|     h[3] = h3; | ||||
|     h[4] = h4; | ||||
|     h[5] = h5; | ||||
|     h[6] = h6; | ||||
|     h[7] = h7; | ||||
|     h[8] = h8; | ||||
|     h[9] = h9; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. | ||||
|  Have h0+...+2^230 h9 between 0 and 2^255-1; | ||||
|  evidently 2^255 h10-2^255 q = 0. | ||||
|  | ||||
|  Goal: Output h0+...+2^230 h9. | ||||
|  */ | ||||
|  | ||||
| void | ||||
| fe25519_tobytes(unsigned char *s, const fe25519 h) | ||||
| { | ||||
|     fe25519 t; | ||||
|  | ||||
|     fe25519_reduce(t, h); | ||||
|     s[0]  = t[0] >> 0; | ||||
|     s[1]  = t[0] >> 8; | ||||
|     s[2]  = t[0] >> 16; | ||||
|     s[3]  = (t[0] >> 24) | (t[1] * ((uint32_t) 1 << 2)); | ||||
|     s[4]  = t[1] >> 6; | ||||
|     s[5]  = t[1] >> 14; | ||||
|     s[6]  = (t[1] >> 22) | (t[2] * ((uint32_t) 1 << 3)); | ||||
|     s[7]  = t[2] >> 5; | ||||
|     s[8]  = t[2] >> 13; | ||||
|     s[9]  = (t[2] >> 21) | (t[3] * ((uint32_t) 1 << 5)); | ||||
|     s[10] = t[3] >> 3; | ||||
|     s[11] = t[3] >> 11; | ||||
|     s[12] = (t[3] >> 19) | (t[4] * ((uint32_t) 1 << 6)); | ||||
|     s[13] = t[4] >> 2; | ||||
|     s[14] = t[4] >> 10; | ||||
|     s[15] = t[4] >> 18; | ||||
|     s[16] = t[5] >> 0; | ||||
|     s[17] = t[5] >> 8; | ||||
|     s[18] = t[5] >> 16; | ||||
|     s[19] = (t[5] >> 24) | (t[6] * ((uint32_t) 1 << 1)); | ||||
|     s[20] = t[6] >> 7; | ||||
|     s[21] = t[6] >> 15; | ||||
|     s[22] = (t[6] >> 23) | (t[7] * ((uint32_t) 1 << 3)); | ||||
|     s[23] = t[7] >> 5; | ||||
|     s[24] = t[7] >> 13; | ||||
|     s[25] = (t[7] >> 21) | (t[8] * ((uint32_t) 1 << 4)); | ||||
|     s[26] = t[8] >> 4; | ||||
|     s[27] = t[8] >> 12; | ||||
|     s[28] = (t[8] >> 20) | (t[9] * ((uint32_t) 1 << 6)); | ||||
|     s[29] = t[9] >> 2; | ||||
|     s[30] = t[9] >> 10; | ||||
|     s[31] = t[9] >> 18; | ||||
| } | ||||
							
								
								
									
										1344
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1344
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/base2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| { | ||||
|   { 1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563 }, | ||||
|   { 62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585 }, | ||||
|   { 301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142 } | ||||
| }, | ||||
| { | ||||
|   { 1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911 }, | ||||
|   { 316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597 }, | ||||
|   { 1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707 } | ||||
| }, | ||||
| { | ||||
|   { 769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016 }, | ||||
|   { 425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893 }, | ||||
|   { 1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339 } | ||||
| }, | ||||
| { | ||||
|   { 665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985 }, | ||||
|   { 2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113 }, | ||||
|   { 965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601 } | ||||
| }, | ||||
| { | ||||
|   { 1802695059465007, 1664899123557221, 593559490740857, 2160434469266659, 927570450755031 }, | ||||
|   { 1725674970513508, 1933645953859181, 1542344539275782, 1767788773573747, 1297447965928905 }, | ||||
|   { 1381809363726107, 1430341051343062, 2061843536018959, 1551778050872521, 2036394857967624 } | ||||
| }, | ||||
| { | ||||
|   { 1970894096313054, 528066325833207, 1619374932191227, 2207306624415883, 1169170329061080 }, | ||||
|   { 2070390218572616, 1458919061857835, 624171843017421, 1055332792707765, 433987520732508 }, | ||||
|   { 893653801273833, 1168026499324677, 1242553501121234, 1306366254304474, 1086752658510815 } | ||||
| }, | ||||
| { | ||||
|   { 213454002618221, 939771523987438, 1159882208056014, 317388369627517, 621213314200687 }, | ||||
|   { 1971678598905747, 338026507889165, 762398079972271, 655096486107477, 42299032696322 }, | ||||
|   { 177130678690680, 1754759263300204, 1864311296286618, 1180675631479880, 1292726903152791 } | ||||
| }, | ||||
| { | ||||
|   { 1913163449625248, 460779200291993, 2193883288642314, 1008900146920800, 1721983679009502 }, | ||||
|   { 1070401523076875, 1272492007800961, 1910153608563310, 2075579521696771, 1191169788841221 }, | ||||
|   { 692896803108118, 500174642072499, 2068223309439677, 1162190621851337, 1426986007309901 } | ||||
| } | ||||
							
								
								
									
										41
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/constants.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/constants.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| /* 37095705934669439343138083508754565189542113879843219016388785533085940283555 */ | ||||
| static const fe25519 d = { | ||||
|     929955233495203, 466365720129213, 1662059464998953, 2033849074728123, 1442794654840575 | ||||
| }; | ||||
|  | ||||
| /* 2 * d = | ||||
|  * 16295367250680780974490674513165176452449235426866156013048779062215315747161 | ||||
|  */ | ||||
| static const fe25519 d2 = { | ||||
|     1859910466990425, 932731440258426, 1072319116312658, 1815898335770999, 633789495995903 | ||||
| }; | ||||
|  | ||||
| /* sqrt(-1) */ | ||||
| static const fe25519 sqrtm1 = { | ||||
|     1718705420411056, 234908883556509, 2233514472574048, 2117202627021982, 765476049583133 | ||||
| }; | ||||
|  | ||||
| /* A = 486662 */ | ||||
| static const fe25519 curve25519_A = { | ||||
|     486662, 0, 0, 0, 0 | ||||
| }; | ||||
|  | ||||
| /* sqrt(ad - 1) with a = -1 (mod p) */ | ||||
| static const fe25519 sqrtadm1 = { | ||||
|     2241493124984347, 425987919032274, 2207028919301688, 1220490630685848, 974799131293748 | ||||
| }; | ||||
|  | ||||
| /* 1 / sqrt(a - d) */ | ||||
| static const fe25519 invsqrtamd = { | ||||
|     278908739862762, 821645201101625, 8113234426968, 1777959178193151, 2118520810568447 | ||||
| }; | ||||
|  | ||||
| /* 1 - d ^ 2 */ | ||||
| static const fe25519 onemsqd = { | ||||
|     1136626929484150, 1998550399581263, 496427632559748, 118527312129759, 45110755273534 | ||||
| }; | ||||
|  | ||||
| /* (d - 1) ^ 2 */ | ||||
| static const fe25519 sqdmone = { | ||||
|     1507062230895904, 1572317787530805, 683053064812840, 317374165784489, 1572899562415810 | ||||
| }; | ||||
							
								
								
									
										116
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								deps/libsodium/src/libsodium/crypto_core/ed25519/ref10/fe_51/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| /* | ||||
|  Ignores top bit of h. | ||||
|  */ | ||||
|  | ||||
| void | ||||
| fe25519_frombytes(fe25519 h, const unsigned char *s) | ||||
| { | ||||
|     const uint64_t mask = 0x7ffffffffffffULL; | ||||
|     uint64_t h0, h1, h2, h3, h4; | ||||
|  | ||||
|     h0 = (LOAD64_LE(s     )      ) & mask; | ||||
|     h1 = (LOAD64_LE(s +  6) >>  3) & mask; | ||||
|     h2 = (LOAD64_LE(s + 12) >>  6) & mask; | ||||
|     h3 = (LOAD64_LE(s + 19) >>  1) & mask; | ||||
|     h4 = (LOAD64_LE(s + 24) >> 12) & mask; | ||||
|  | ||||
|     h[0] = h0; | ||||
|     h[1] = h1; | ||||
|     h[2] = h2; | ||||
|     h[3] = h3; | ||||
|     h[4] = h4; | ||||
| } | ||||
|  | ||||
| static void | ||||
| fe25519_reduce(fe25519 h, const fe25519 f) | ||||
| { | ||||
|     const uint64_t mask = 0x7ffffffffffffULL; | ||||
|     uint128_t t[5]; | ||||
|  | ||||
|     t[0] = f[0]; | ||||
|     t[1] = f[1]; | ||||
|     t[2] = f[2]; | ||||
|     t[3] = f[3]; | ||||
|     t[4] = f[4]; | ||||
|  | ||||
|     t[1] += t[0] >> 51; | ||||
|     t[0] &= mask; | ||||
|     t[2] += t[1] >> 51; | ||||
|     t[1] &= mask; | ||||
|     t[3] += t[2] >> 51; | ||||
|     t[2] &= mask; | ||||
|     t[4] += t[3] >> 51; | ||||
|     t[3] &= mask; | ||||
|     t[0] += 19 * (t[4] >> 51); | ||||
|     t[4] &= mask; | ||||
|  | ||||
|     t[1] += t[0] >> 51; | ||||
|     t[0] &= mask; | ||||
|     t[2] += t[1] >> 51; | ||||
|     t[1] &= mask; | ||||
|     t[3] += t[2] >> 51; | ||||
|     t[2] &= mask; | ||||
|     t[4] += t[3] >> 51; | ||||
|     t[3] &= mask; | ||||
|     t[0] += 19 * (t[4] >> 51); | ||||
|     t[4] &= mask; | ||||
|  | ||||
|     /* now t is between 0 and 2^255-1, properly carried. */ | ||||
|     /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ | ||||
|  | ||||
|     t[0] += 19ULL; | ||||
|  | ||||
|     t[1] += t[0] >> 51; | ||||
|     t[0] &= mask; | ||||
|     t[2] += t[1] >> 51; | ||||
|     t[1] &= mask; | ||||
|     t[3] += t[2] >> 51; | ||||
|     t[2] &= mask; | ||||
|     t[4] += t[3] >> 51; | ||||
|     t[3] &= mask; | ||||
|     t[0] += 19ULL * (t[4] >> 51); | ||||
|     t[4] &= mask; | ||||
|  | ||||
|     /* now between 19 and 2^255-1 in both cases, and offset by 19. */ | ||||
|  | ||||
|     t[0] += 0x8000000000000 - 19ULL; | ||||
|     t[1] += 0x8000000000000 - 1ULL; | ||||
|     t[2] += 0x8000000000000 - 1ULL; | ||||
|     t[3] += 0x8000000000000 - 1ULL; | ||||
|     t[4] += 0x8000000000000 - 1ULL; | ||||
|  | ||||
|     /* now between 2^255 and 2^256-20, and offset by 2^255. */ | ||||
|  | ||||
|     t[1] += t[0] >> 51; | ||||
|     t[0] &= mask; | ||||
|     t[2] += t[1] >> 51; | ||||
|     t[1] &= mask; | ||||
|     t[3] += t[2] >> 51; | ||||
|     t[2] &= mask; | ||||
|     t[4] += t[3] >> 51; | ||||
|     t[3] &= mask; | ||||
|     t[4] &= mask; | ||||
|  | ||||
|     h[0] = t[0]; | ||||
|     h[1] = t[1]; | ||||
|     h[2] = t[2]; | ||||
|     h[3] = t[3]; | ||||
|     h[4] = t[4]; | ||||
| } | ||||
|  | ||||
| void | ||||
| fe25519_tobytes(unsigned char *s, const fe25519 h) | ||||
| { | ||||
|     fe25519  t; | ||||
|     uint64_t t0, t1, t2, t3; | ||||
|  | ||||
|     fe25519_reduce(t, h); | ||||
|     t0 = t[0] | (t[1] << 51); | ||||
|     t1 = (t[1] >> 13) | (t[2] << 38); | ||||
|     t2 = (t[2] >> 26) | (t[3] << 25); | ||||
|     t3 = (t[3] >> 39) | (t[4] << 12); | ||||
|     STORE64_LE(s +  0, t0); | ||||
|     STORE64_LE(s +  8, t1); | ||||
|     STORE64_LE(s + 16, t2); | ||||
|     STORE64_LE(s + 24, t3); | ||||
| } | ||||
							
								
								
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_core/hchacha20/core_hchacha20.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_core/hchacha20/core_hchacha20.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "crypto_core_hchacha20.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #define QUARTERROUND(A, B, C, D)     \ | ||||
|   do {                               \ | ||||
|       A += B; D = ROTL32(D ^ A, 16); \ | ||||
|       C += D; B = ROTL32(B ^ C, 12); \ | ||||
|       A += B; D = ROTL32(D ^ A,  8); \ | ||||
|       C += D; B = ROTL32(B ^ C,  7); \ | ||||
|   } while(0) | ||||
|  | ||||
| int | ||||
| crypto_core_hchacha20(unsigned char *out, const unsigned char *in, | ||||
|                       const unsigned char *k, const unsigned char *c) | ||||
| { | ||||
|     int      i; | ||||
|     uint32_t x0, x1, x2, x3, x4, x5, x6, x7; | ||||
|     uint32_t x8, x9, x10, x11, x12, x13, x14, x15; | ||||
|  | ||||
|     if (c == NULL) { | ||||
|         x0 = 0x61707865; | ||||
|         x1 = 0x3320646e; | ||||
|         x2 = 0x79622d32; | ||||
|         x3 = 0x6b206574; | ||||
|     } else { | ||||
|         x0 = LOAD32_LE(c +  0); | ||||
|         x1 = LOAD32_LE(c +  4); | ||||
|         x2 = LOAD32_LE(c +  8); | ||||
|         x3 = LOAD32_LE(c + 12); | ||||
|     } | ||||
|     x4  = LOAD32_LE(k +  0); | ||||
|     x5  = LOAD32_LE(k +  4); | ||||
|     x6  = LOAD32_LE(k +  8); | ||||
|     x7  = LOAD32_LE(k + 12); | ||||
|     x8  = LOAD32_LE(k + 16); | ||||
|     x9  = LOAD32_LE(k + 20); | ||||
|     x10 = LOAD32_LE(k + 24); | ||||
|     x11 = LOAD32_LE(k + 28); | ||||
|     x12 = LOAD32_LE(in +  0); | ||||
|     x13 = LOAD32_LE(in +  4); | ||||
|     x14 = LOAD32_LE(in +  8); | ||||
|     x15 = LOAD32_LE(in + 12); | ||||
|  | ||||
|     for (i = 0; i < 10; i++) { | ||||
|         QUARTERROUND(x0, x4,  x8, x12); | ||||
|         QUARTERROUND(x1, x5,  x9, x13); | ||||
|         QUARTERROUND(x2, x6, x10, x14); | ||||
|         QUARTERROUND(x3, x7, x11, x15); | ||||
|         QUARTERROUND(x0, x5, x10, x15); | ||||
|         QUARTERROUND(x1, x6, x11, x12); | ||||
|         QUARTERROUND(x2, x7,  x8, x13); | ||||
|         QUARTERROUND(x3, x4,  x9, x14); | ||||
|     } | ||||
|  | ||||
|     STORE32_LE(out +  0, x0); | ||||
|     STORE32_LE(out +  4, x1); | ||||
|     STORE32_LE(out +  8, x2); | ||||
|     STORE32_LE(out + 12, x3); | ||||
|     STORE32_LE(out + 16, x12); | ||||
|     STORE32_LE(out + 20, x13); | ||||
|     STORE32_LE(out + 24, x14); | ||||
|     STORE32_LE(out + 28, x15); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hchacha20_outputbytes(void) | ||||
| { | ||||
|     return crypto_core_hchacha20_OUTPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hchacha20_inputbytes(void) | ||||
| { | ||||
|     return crypto_core_hchacha20_INPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hchacha20_keybytes(void) | ||||
| { | ||||
|     return crypto_core_hchacha20_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hchacha20_constbytes(void) | ||||
| { | ||||
|     return crypto_core_hchacha20_CONSTBYTES; | ||||
| } | ||||
							
								
								
									
										21
									
								
								deps/libsodium/src/libsodium/crypto_core/hsalsa20/core_hsalsa20.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								deps/libsodium/src/libsodium/crypto_core/hsalsa20/core_hsalsa20.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #include "crypto_core_hsalsa20.h" | ||||
|  | ||||
| size_t | ||||
| crypto_core_hsalsa20_outputbytes(void) { | ||||
|     return crypto_core_hsalsa20_OUTPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hsalsa20_inputbytes(void) { | ||||
|     return crypto_core_hsalsa20_INPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hsalsa20_keybytes(void) { | ||||
|     return crypto_core_hsalsa20_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_hsalsa20_constbytes(void) { | ||||
|     return crypto_core_hsalsa20_CONSTBYTES; | ||||
| } | ||||
							
								
								
									
										95
									
								
								deps/libsodium/src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								deps/libsodium/src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| /* | ||||
| version 20080912 | ||||
| D. J. Bernstein | ||||
| Public domain. | ||||
| */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "crypto_core_hsalsa20.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #define ROUNDS 20 | ||||
| #define U32C(v) (v##U) | ||||
|  | ||||
| int | ||||
| crypto_core_hsalsa20(unsigned char *out, | ||||
|                      const unsigned char *in, | ||||
|                      const unsigned char *k, | ||||
|                      const unsigned char *c) | ||||
| { | ||||
|     uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, | ||||
|              x9, x10, x11, x12, x13, x14,  x15; | ||||
|     int      i; | ||||
|  | ||||
|     if (c == NULL) { | ||||
|         x0 = U32C(0x61707865); | ||||
|         x5 = U32C(0x3320646e); | ||||
|         x10 = U32C(0x79622d32); | ||||
|         x15 = U32C(0x6b206574); | ||||
|     } else { | ||||
|         x0 = LOAD32_LE(c + 0); | ||||
|         x5 = LOAD32_LE(c + 4); | ||||
|         x10 = LOAD32_LE(c + 8); | ||||
|         x15 = LOAD32_LE(c + 12); | ||||
|     } | ||||
|     x1 = LOAD32_LE(k + 0); | ||||
|     x2 = LOAD32_LE(k + 4); | ||||
|     x3 = LOAD32_LE(k + 8); | ||||
|     x4 = LOAD32_LE(k + 12); | ||||
|     x11 = LOAD32_LE(k + 16); | ||||
|     x12 = LOAD32_LE(k + 20); | ||||
|     x13 = LOAD32_LE(k + 24); | ||||
|     x14 = LOAD32_LE(k + 28); | ||||
|     x6 = LOAD32_LE(in + 0); | ||||
|     x7 = LOAD32_LE(in + 4); | ||||
|     x8 = LOAD32_LE(in + 8); | ||||
|     x9 = LOAD32_LE(in + 12); | ||||
|  | ||||
|     for (i = ROUNDS; i > 0; i -= 2) { | ||||
|         x4 ^= ROTL32(x0 + x12, 7); | ||||
|         x8 ^= ROTL32(x4 + x0, 9); | ||||
|         x12 ^= ROTL32(x8 + x4, 13); | ||||
|         x0 ^= ROTL32(x12 + x8, 18); | ||||
|         x9 ^= ROTL32(x5 + x1, 7); | ||||
|         x13 ^= ROTL32(x9 + x5, 9); | ||||
|         x1 ^= ROTL32(x13 + x9, 13); | ||||
|         x5 ^= ROTL32(x1 + x13, 18); | ||||
|         x14 ^= ROTL32(x10 + x6, 7); | ||||
|         x2 ^= ROTL32(x14 + x10, 9); | ||||
|         x6 ^= ROTL32(x2 + x14, 13); | ||||
|         x10 ^= ROTL32(x6 + x2, 18); | ||||
|         x3 ^= ROTL32(x15 + x11, 7); | ||||
|         x7 ^= ROTL32(x3 + x15, 9); | ||||
|         x11 ^= ROTL32(x7 + x3, 13); | ||||
|         x15 ^= ROTL32(x11 + x7, 18); | ||||
|         x1 ^= ROTL32(x0 + x3, 7); | ||||
|         x2 ^= ROTL32(x1 + x0, 9); | ||||
|         x3 ^= ROTL32(x2 + x1, 13); | ||||
|         x0 ^= ROTL32(x3 + x2, 18); | ||||
|         x6 ^= ROTL32(x5 + x4, 7); | ||||
|         x7 ^= ROTL32(x6 + x5, 9); | ||||
|         x4 ^= ROTL32(x7 + x6, 13); | ||||
|         x5 ^= ROTL32(x4 + x7, 18); | ||||
|         x11 ^= ROTL32(x10 + x9, 7); | ||||
|         x8 ^= ROTL32(x11 + x10, 9); | ||||
|         x9 ^= ROTL32(x8 + x11, 13); | ||||
|         x10 ^= ROTL32(x9 + x8, 18); | ||||
|         x12 ^= ROTL32(x15 + x14, 7); | ||||
|         x13 ^= ROTL32(x12 + x15, 9); | ||||
|         x14 ^= ROTL32(x13 + x12, 13); | ||||
|         x15 ^= ROTL32(x14 + x13, 18); | ||||
|     } | ||||
|  | ||||
|     STORE32_LE(out + 0, x0); | ||||
|     STORE32_LE(out + 4, x5); | ||||
|     STORE32_LE(out + 8, x10); | ||||
|     STORE32_LE(out + 12, x15); | ||||
|     STORE32_LE(out + 16, x6); | ||||
|     STORE32_LE(out + 20, x7); | ||||
|     STORE32_LE(out + 24, x8); | ||||
|     STORE32_LE(out + 28, x9); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										195
									
								
								deps/libsodium/src/libsodium/crypto_core/salsa/ref/core_salsa_ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								deps/libsodium/src/libsodium/crypto_core/salsa/ref/core_salsa_ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "crypto_core_salsa20.h" | ||||
| #include "crypto_core_salsa2012.h" | ||||
| #include "crypto_core_salsa208.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| static void | ||||
| crypto_core_salsa(unsigned char *out, const unsigned char *in, | ||||
|                   const unsigned char *k, const unsigned char *c, | ||||
|                   const int rounds) | ||||
| { | ||||
|     uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, | ||||
|         x15; | ||||
|     uint32_t j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, | ||||
|         j15; | ||||
|     int i; | ||||
|  | ||||
|     j0  = x0  = 0x61707865; | ||||
|     j5  = x5  = 0x3320646e; | ||||
|     j10 = x10 = 0x79622d32; | ||||
|     j15 = x15 = 0x6b206574; | ||||
|     if (c != NULL) { | ||||
|         j0  = x0  = LOAD32_LE(c + 0); | ||||
|         j5  = x5  = LOAD32_LE(c + 4); | ||||
|         j10 = x10 = LOAD32_LE(c + 8); | ||||
|         j15 = x15 = LOAD32_LE(c + 12); | ||||
|     } | ||||
|     j1  = x1  = LOAD32_LE(k + 0); | ||||
|     j2  = x2  = LOAD32_LE(k + 4); | ||||
|     j3  = x3  = LOAD32_LE(k + 8); | ||||
|     j4  = x4  = LOAD32_LE(k + 12); | ||||
|     j11 = x11 = LOAD32_LE(k + 16); | ||||
|     j12 = x12 = LOAD32_LE(k + 20); | ||||
|     j13 = x13 = LOAD32_LE(k + 24); | ||||
|     j14 = x14 = LOAD32_LE(k + 28); | ||||
|  | ||||
|     j6  = x6  = LOAD32_LE(in + 0); | ||||
|     j7  = x7  = LOAD32_LE(in + 4); | ||||
|     j8  = x8  = LOAD32_LE(in + 8); | ||||
|     j9  = x9  = LOAD32_LE(in + 12); | ||||
|  | ||||
|     for (i = 0; i < rounds; i += 2) { | ||||
|         x4  ^= ROTL32(x0  + x12, 7); | ||||
|         x8  ^= ROTL32(x4  + x0, 9); | ||||
|         x12 ^= ROTL32(x8  + x4, 13); | ||||
|         x0  ^= ROTL32(x12 + x8, 18); | ||||
|         x9  ^= ROTL32(x5  + x1, 7); | ||||
|         x13 ^= ROTL32(x9  + x5, 9); | ||||
|         x1  ^= ROTL32(x13 + x9, 13); | ||||
|         x5  ^= ROTL32(x1  + x13, 18); | ||||
|         x14 ^= ROTL32(x10 + x6, 7); | ||||
|         x2  ^= ROTL32(x14 + x10, 9); | ||||
|         x6  ^= ROTL32(x2  + x14, 13); | ||||
|         x10 ^= ROTL32(x6  + x2, 18); | ||||
|         x3  ^= ROTL32(x15 + x11, 7); | ||||
|         x7  ^= ROTL32(x3  + x15, 9); | ||||
|         x11 ^= ROTL32(x7  + x3, 13); | ||||
|         x15 ^= ROTL32(x11 + x7, 18); | ||||
|         x1  ^= ROTL32(x0  + x3, 7); | ||||
|         x2  ^= ROTL32(x1  + x0, 9); | ||||
|         x3  ^= ROTL32(x2  + x1, 13); | ||||
|         x0  ^= ROTL32(x3  + x2, 18); | ||||
|         x6  ^= ROTL32(x5  + x4, 7); | ||||
|         x7  ^= ROTL32(x6  + x5, 9); | ||||
|         x4  ^= ROTL32(x7  + x6, 13); | ||||
|         x5  ^= ROTL32(x4  + x7, 18); | ||||
|         x11 ^= ROTL32(x10 + x9, 7); | ||||
|         x8  ^= ROTL32(x11 + x10, 9); | ||||
|         x9  ^= ROTL32(x8  + x11, 13); | ||||
|         x10 ^= ROTL32(x9  + x8, 18); | ||||
|         x12 ^= ROTL32(x15 + x14, 7); | ||||
|         x13 ^= ROTL32(x12 + x15, 9); | ||||
|         x14 ^= ROTL32(x13 + x12, 13); | ||||
|         x15 ^= ROTL32(x14 + x13, 18); | ||||
|     } | ||||
|     STORE32_LE(out + 0,  x0  + j0); | ||||
|     STORE32_LE(out + 4,  x1  + j1); | ||||
|     STORE32_LE(out + 8,  x2  + j2); | ||||
|     STORE32_LE(out + 12, x3  + j3); | ||||
|     STORE32_LE(out + 16, x4  + j4); | ||||
|     STORE32_LE(out + 20, x5  + j5); | ||||
|     STORE32_LE(out + 24, x6  + j6); | ||||
|     STORE32_LE(out + 28, x7  + j7); | ||||
|     STORE32_LE(out + 32, x8  + j8); | ||||
|     STORE32_LE(out + 36, x9  + j9); | ||||
|     STORE32_LE(out + 40, x10 + j10); | ||||
|     STORE32_LE(out + 44, x11 + j11); | ||||
|     STORE32_LE(out + 48, x12 + j12); | ||||
|     STORE32_LE(out + 52, x13 + j13); | ||||
|     STORE32_LE(out + 56, x14 + j14); | ||||
|     STORE32_LE(out + 60, x15 + j15); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_salsa20(unsigned char *out, const unsigned char *in, | ||||
|                     const unsigned char *k, const unsigned char *c) | ||||
| { | ||||
|     crypto_core_salsa(out, in, k, c, 20); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa20_outputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa20_OUTPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa20_inputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa20_INPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa20_keybytes(void) | ||||
| { | ||||
|     return crypto_core_salsa20_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa20_constbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa20_CONSTBYTES; | ||||
| } | ||||
|  | ||||
| #ifndef MINIMAL | ||||
| /* LCOV_EXCL_START */ | ||||
| int | ||||
| crypto_core_salsa2012(unsigned char *out, const unsigned char *in, | ||||
|                       const unsigned char *k, const unsigned char *c) | ||||
| { | ||||
|     crypto_core_salsa(out, in, k, c, 12); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa2012_outputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa2012_OUTPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa2012_inputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa2012_INPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa2012_keybytes(void) | ||||
| { | ||||
|     return crypto_core_salsa2012_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa2012_constbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa2012_CONSTBYTES; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_core_salsa208(unsigned char *out, const unsigned char *in, | ||||
|                      const unsigned char *k, const unsigned char *c) | ||||
| { | ||||
|     crypto_core_salsa(out, in, k, c, 8); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa208_outputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa208_OUTPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa208_inputbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa208_INPUTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa208_keybytes(void) | ||||
| { | ||||
|     return crypto_core_salsa208_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_core_salsa208_constbytes(void) | ||||
| { | ||||
|     return crypto_core_salsa208_CONSTBYTES; | ||||
| } | ||||
| /* LCOV_EXCL_END */ | ||||
| #endif | ||||
							
								
								
									
										55
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/generichash_blake2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/generichash_blake2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "randombytes.h" | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_bytes_min(void) { | ||||
|     return crypto_generichash_blake2b_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_bytes_max(void) { | ||||
|     return crypto_generichash_blake2b_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_bytes(void) { | ||||
|     return crypto_generichash_blake2b_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_keybytes_min(void) { | ||||
|     return crypto_generichash_blake2b_KEYBYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_keybytes_max(void) { | ||||
|     return crypto_generichash_blake2b_KEYBYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_keybytes(void) { | ||||
|     return crypto_generichash_blake2b_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_saltbytes(void) { | ||||
|     return crypto_generichash_blake2b_SALTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_personalbytes(void) { | ||||
|     return crypto_generichash_blake2b_PERSONALBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_blake2b_statebytes(void) | ||||
| { | ||||
|     return (sizeof(crypto_generichash_blake2b_state) + (size_t) 63U) | ||||
|         & ~(size_t) 63U; | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_generichash_blake2b_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										106
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| /* | ||||
|    BLAKE2 reference source code package - reference C implementations | ||||
|  | ||||
|    Written in 2012 by Samuel Neves <sneves@dei.uc.pt> | ||||
|  | ||||
|    To the extent possible under law, the author(s) have dedicated all copyright | ||||
|    and related and neighboring rights to this software to the public domain | ||||
|    worldwide. This software is distributed without any warranty. | ||||
|  | ||||
|    All code is triple-licensed under the | ||||
|    [CC0](http://creativecommons.org/publicdomain/zero/1.0), the | ||||
|    [OpenSSL Licence](https://www.openssl.org/source/license.html), or | ||||
|    the [Apache Public License 2.0](http://www.apache.org/licenses/LICENSE-2.0), | ||||
|    at your choosing. | ||||
|  */ | ||||
|  | ||||
| #ifndef blake2_H | ||||
| #define blake2_H | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "export.h" | ||||
|  | ||||
| enum blake2b_constant { | ||||
|     BLAKE2B_BLOCKBYTES    = 128, | ||||
|     BLAKE2B_OUTBYTES      = 64, | ||||
|     BLAKE2B_KEYBYTES      = 64, | ||||
|     BLAKE2B_SALTBYTES     = 16, | ||||
|     BLAKE2B_PERSONALBYTES = 16 | ||||
| }; | ||||
|  | ||||
| #ifdef __IBMC__ | ||||
| # pragma pack(1) | ||||
| #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) | ||||
| # pragma pack(1) | ||||
| #else | ||||
| # pragma pack(push, 1) | ||||
| #endif | ||||
|  | ||||
| typedef struct blake2b_param_ { | ||||
|     uint8_t digest_length;                   /*  1 */ | ||||
|     uint8_t key_length;                      /*  2 */ | ||||
|     uint8_t fanout;                          /*  3 */ | ||||
|     uint8_t depth;                           /*  4 */ | ||||
|     uint8_t leaf_length[4];                  /*  8 */ | ||||
|     uint8_t node_offset[8];                  /* 16 */ | ||||
|     uint8_t node_depth;                      /* 17 */ | ||||
|     uint8_t inner_length;                    /* 18 */ | ||||
|     uint8_t reserved[14];                    /* 32 */ | ||||
|     uint8_t salt[BLAKE2B_SALTBYTES];         /* 48 */ | ||||
|     uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ | ||||
| } blake2b_param; | ||||
|  | ||||
| typedef struct blake2b_state { | ||||
|     uint64_t h[8]; | ||||
|     uint64_t t[2]; | ||||
|     uint64_t f[2]; | ||||
|     uint8_t  buf[2 * 128]; | ||||
|     size_t   buflen; | ||||
|     uint8_t  last_node; | ||||
| } blake2b_state; | ||||
|  | ||||
| #ifdef __IBMC__ | ||||
| # pragma pack(pop) | ||||
| #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) | ||||
| # pragma pack() | ||||
| #else | ||||
| # pragma pack(pop) | ||||
| #endif | ||||
|  | ||||
| /* Streaming API */ | ||||
| int blake2b_init(blake2b_state *S, const uint8_t outlen); | ||||
| int blake2b_init_salt_personal(blake2b_state *S, const uint8_t outlen, | ||||
|                                const void *salt, const void *personal); | ||||
| int blake2b_init_key(blake2b_state *S, const uint8_t outlen, const void *key, | ||||
|                      const uint8_t keylen); | ||||
| int blake2b_init_key_salt_personal(blake2b_state *S, const uint8_t outlen, | ||||
|                                    const void *key, const uint8_t keylen, | ||||
|                                    const void *salt, const void *personal); | ||||
| int blake2b_init_param(blake2b_state *S, const blake2b_param *P); | ||||
| int blake2b_update(blake2b_state *S, const uint8_t *in, uint64_t inlen); | ||||
| int blake2b_final(blake2b_state *S, uint8_t *out, uint8_t outlen); | ||||
|  | ||||
| /* Simple API */ | ||||
| int blake2b(uint8_t *out, const void *in, const void *key, const uint8_t outlen, | ||||
|             const uint64_t inlen, uint8_t keylen); | ||||
| int blake2b_salt_personal(uint8_t *out, const void *in, const void *key, | ||||
|                           const uint8_t outlen, const uint64_t inlen, | ||||
|                           uint8_t keylen, const void *salt, | ||||
|                           const void *personal); | ||||
|  | ||||
| typedef int (*blake2b_compress_fn)(blake2b_state *S, | ||||
|                                    const uint8_t  block[BLAKE2B_BLOCKBYTES]); | ||||
| int blake2b_pick_best_implementation(void); | ||||
| int blake2b_compress_ref(blake2b_state *S, | ||||
|                          const uint8_t  block[BLAKE2B_BLOCKBYTES]); | ||||
| int blake2b_compress_ssse3(blake2b_state *S, | ||||
|                            const uint8_t  block[BLAKE2B_BLOCKBYTES]); | ||||
| int blake2b_compress_sse41(blake2b_state *S, | ||||
|                            const uint8_t  block[BLAKE2B_BLOCKBYTES]); | ||||
| int blake2b_compress_avx2(blake2b_state *S, | ||||
|                           const uint8_t  block[BLAKE2B_BLOCKBYTES]); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										49
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
|  | ||||
| #define BLAKE2_USE_SSSE3 | ||||
| #define BLAKE2_USE_SSE41 | ||||
| #define BLAKE2_USE_AVX2 | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \ | ||||
|     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| #  pragma GCC target("sse4.1") | ||||
| #  pragma GCC target("avx2") | ||||
| # endif | ||||
|  | ||||
| # include <emmintrin.h> | ||||
| # include <immintrin.h> | ||||
| # include <smmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blake2b-compress-avx2.h" | ||||
|  | ||||
| CRYPTO_ALIGN(64) | ||||
| static const uint64_t blake2b_IV[8] = { | ||||
|     0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|     0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|     0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
| }; | ||||
|  | ||||
| int | ||||
| blake2b_compress_avx2(blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES]) | ||||
| { | ||||
|     __m256i a = LOADU(&S->h[0]); | ||||
|     __m256i b = LOADU(&S->h[4]); | ||||
|     BLAKE2B_COMPRESS_V1(a, b, block, S->t[0], S->t[1], S->f[0], S->f[1]); | ||||
|     STOREU(&S->h[0], a); | ||||
|     STOREU(&S->h[4], b); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										142
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
|  | ||||
| #ifndef blake2b_compress_avx2_H | ||||
| #define blake2b_compress_avx2_H | ||||
|  | ||||
| #define LOADU128(p) _mm_loadu_si128((const __m128i *) (p)) | ||||
| #define STOREU128(p, r) _mm_storeu_si128((__m128i *) (p), r) | ||||
|  | ||||
| #define LOADU(p) _mm256_loadu_si256((const __m256i *) (p)) | ||||
| #define STOREU(p, r) _mm256_storeu_si256((__m256i *) (p), r) | ||||
|  | ||||
| #if defined(__INTEL_COMPILER) || defined(_MSC_VER) || defined(__GNUC__) | ||||
| # define LOAD(p) _mm256_load_si256((const __m256i *) (p)) | ||||
| # define STORE(p, r) _mm256_store_si256((__m256i *) (p), r) | ||||
| #else | ||||
| # define LOAD(p) LOADU(p) | ||||
| # define STORE(p, r) STOREU(p, r) | ||||
| #endif | ||||
|  | ||||
| static inline uint64_t | ||||
| LOADU64(const void *p) | ||||
| { | ||||
|     uint64_t v; | ||||
|     memcpy(&v, p, sizeof v); | ||||
|     return v; | ||||
| } | ||||
|  | ||||
| #define ROTATE16                                                              \ | ||||
|     _mm256_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9, 2, \ | ||||
|                      3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9) | ||||
|  | ||||
| #define ROTATE24                                                              \ | ||||
|     _mm256_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10, 3, \ | ||||
|                      4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10) | ||||
|  | ||||
| #define ADD(a, b) _mm256_add_epi64(a, b) | ||||
| #define SUB(a, b) _mm256_sub_epi64(a, b) | ||||
|  | ||||
| #define XOR(a, b) _mm256_xor_si256(a, b) | ||||
| #define AND(a, b) _mm256_and_si256(a, b) | ||||
| #define OR(a, b) _mm256_or_si256(a, b) | ||||
|  | ||||
| #define ROT32(x) _mm256_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1)) | ||||
| #define ROT24(x) _mm256_shuffle_epi8((x), ROTATE24) | ||||
| #define ROT16(x) _mm256_shuffle_epi8((x), ROTATE16) | ||||
| #define ROT63(x) _mm256_or_si256(_mm256_srli_epi64((x), 63), ADD((x), (x))) | ||||
|  | ||||
| #define BLAKE2B_G1_V1(a, b, c, d, m) \ | ||||
|     do {                             \ | ||||
|         a = ADD(a, m);               \ | ||||
|         a = ADD(a, b);               \ | ||||
|         d = XOR(d, a);               \ | ||||
|         d = ROT32(d);                \ | ||||
|         c = ADD(c, d);               \ | ||||
|         b = XOR(b, c);               \ | ||||
|         b = ROT24(b);                \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_G2_V1(a, b, c, d, m) \ | ||||
|     do {                             \ | ||||
|         a = ADD(a, m);               \ | ||||
|         a = ADD(a, b);               \ | ||||
|         d = XOR(d, a);               \ | ||||
|         d = ROT16(d);                \ | ||||
|         c = ADD(c, d);               \ | ||||
|         b = XOR(b, c);               \ | ||||
|         b = ROT63(b);                \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_DIAG_V1(a, b, c, d)                               \ | ||||
|     do {                                                          \ | ||||
|         a = _mm256_permute4x64_epi64(a, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         d = _mm256_permute4x64_epi64(d, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         c = _mm256_permute4x64_epi64(c, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|     } while(0) | ||||
|  | ||||
| #define BLAKE2B_UNDIAG_V1(a, b, c, d)                             \ | ||||
|     do {                                                          \ | ||||
|         a = _mm256_permute4x64_epi64(a, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         d = _mm256_permute4x64_epi64(d, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         c = _mm256_permute4x64_epi64(c, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|     } while(0) | ||||
|  | ||||
| #include "blake2b-load-avx2.h" | ||||
|  | ||||
| #define BLAKE2B_ROUND_V1(a, b, c, d, r, m) \ | ||||
|     do {                                   \ | ||||
|         __m256i b0;                        \ | ||||
|         BLAKE2B_LOAD_MSG_##r##_1(b0);      \ | ||||
|         BLAKE2B_G1_V1(a, b, c, d, b0);     \ | ||||
|         BLAKE2B_LOAD_MSG_##r##_2(b0);      \ | ||||
|         BLAKE2B_G2_V1(a, b, c, d, b0);     \ | ||||
|         BLAKE2B_DIAG_V1(a, b, c, d);       \ | ||||
|         BLAKE2B_LOAD_MSG_##r##_3(b0);      \ | ||||
|         BLAKE2B_G1_V1(a, b, c, d, b0);     \ | ||||
|         BLAKE2B_LOAD_MSG_##r##_4(b0);      \ | ||||
|         BLAKE2B_G2_V1(a, b, c, d, b0);     \ | ||||
|         BLAKE2B_UNDIAG_V1(a, b, c, d);     \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_ROUNDS_V1(a, b, c, d, m)       \ | ||||
|     do {                                       \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 0, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 1, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 2, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 3, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 4, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 5, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 6, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 7, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 8, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 9, (m));  \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 10, (m)); \ | ||||
|         BLAKE2B_ROUND_V1(a, b, c, d, 11, (m)); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define DECLARE_MESSAGE_WORDS(m)                                         \ | ||||
|     const __m256i m0 = _mm256_broadcastsi128_si256(LOADU128((m) + 0));   \ | ||||
|     const __m256i m1 = _mm256_broadcastsi128_si256(LOADU128((m) + 16));  \ | ||||
|     const __m256i m2 = _mm256_broadcastsi128_si256(LOADU128((m) + 32));  \ | ||||
|     const __m256i m3 = _mm256_broadcastsi128_si256(LOADU128((m) + 48));  \ | ||||
|     const __m256i m4 = _mm256_broadcastsi128_si256(LOADU128((m) + 64));  \ | ||||
|     const __m256i m5 = _mm256_broadcastsi128_si256(LOADU128((m) + 80));  \ | ||||
|     const __m256i m6 = _mm256_broadcastsi128_si256(LOADU128((m) + 96));  \ | ||||
|     const __m256i m7 = _mm256_broadcastsi128_si256(LOADU128((m) + 112)); \ | ||||
|     __m256i       t0, t1; | ||||
|  | ||||
| #define BLAKE2B_COMPRESS_V1(a, b, m, t0, t1, f0, f1)                      \ | ||||
|     do {                                                                  \ | ||||
|         DECLARE_MESSAGE_WORDS(m)                                          \ | ||||
|         const __m256i iv0 = a;                                            \ | ||||
|         const __m256i iv1 = b;                                            \ | ||||
|         __m256i       c   = LOAD(&blake2b_IV[0]);                         \ | ||||
|         __m256i       d =                                                 \ | ||||
|             XOR(LOAD(&blake2b_IV[4]), _mm256_set_epi64x(f1, f0, t1, t0)); \ | ||||
|         BLAKE2B_ROUNDS_V1(a, b, c, d, m);                                 \ | ||||
|         a = XOR(a, c);                                                    \ | ||||
|         b = XOR(b, d);                                                    \ | ||||
|         a = XOR(a, iv0);                                                  \ | ||||
|         b = XOR(b, iv1);                                                  \ | ||||
|     } while (0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| CRYPTO_ALIGN(64) | ||||
| static const uint64_t blake2b_IV[8] = { | ||||
|     0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|     0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|     0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
| }; | ||||
|  | ||||
| static const uint8_t blake2b_sigma[12][16] = { | ||||
|     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, | ||||
|     { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, | ||||
|     { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, | ||||
|     { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, | ||||
|     { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, | ||||
|     { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, | ||||
|     { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, | ||||
|     { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, | ||||
|     { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, | ||||
|     { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, | ||||
|     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, | ||||
|     { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } | ||||
| }; | ||||
|  | ||||
| int | ||||
| blake2b_compress_ref(blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES]) | ||||
| { | ||||
|     uint64_t m[16]; | ||||
|     uint64_t v[16]; | ||||
|     int      i; | ||||
|  | ||||
|     for (i = 0; i < 16; ++i) { | ||||
|         m[i] = LOAD64_LE(block + i * sizeof m[i]); | ||||
|     } | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         v[i] = S->h[i]; | ||||
|     } | ||||
|     v[8]  = blake2b_IV[0]; | ||||
|     v[9]  = blake2b_IV[1]; | ||||
|     v[10] = blake2b_IV[2]; | ||||
|     v[11] = blake2b_IV[3]; | ||||
|     v[12] = S->t[0] ^ blake2b_IV[4]; | ||||
|     v[13] = S->t[1] ^ blake2b_IV[5]; | ||||
|     v[14] = S->f[0] ^ blake2b_IV[6]; | ||||
|     v[15] = S->f[1] ^ blake2b_IV[7]; | ||||
| #define G(r, i, a, b, c, d)                      \ | ||||
|     do {                                         \ | ||||
|         a += b + m[blake2b_sigma[r][2 * i + 0]]; \ | ||||
|         d = ROTR64(d ^ a, 32);                   \ | ||||
|         c += d;                                  \ | ||||
|         b = ROTR64(b ^ c, 24);                   \ | ||||
|         a += b + m[blake2b_sigma[r][2 * i + 1]]; \ | ||||
|         d = ROTR64(d ^ a, 16);                   \ | ||||
|         c += d;                                  \ | ||||
|         b = ROTR64(b ^ c, 63);                   \ | ||||
|     } while (0) | ||||
| #define ROUND(r)                           \ | ||||
|     do {                                   \ | ||||
|         G(r, 0, v[0], v[4], v[8], v[12]);  \ | ||||
|         G(r, 1, v[1], v[5], v[9], v[13]);  \ | ||||
|         G(r, 2, v[2], v[6], v[10], v[14]); \ | ||||
|         G(r, 3, v[3], v[7], v[11], v[15]); \ | ||||
|         G(r, 4, v[0], v[5], v[10], v[15]); \ | ||||
|         G(r, 5, v[1], v[6], v[11], v[12]); \ | ||||
|         G(r, 6, v[2], v[7], v[8], v[13]);  \ | ||||
|         G(r, 7, v[3], v[4], v[9], v[14]);  \ | ||||
|     } while (0) | ||||
|     ROUND(0); | ||||
|     ROUND(1); | ||||
|     ROUND(2); | ||||
|     ROUND(3); | ||||
|     ROUND(4); | ||||
|     ROUND(5); | ||||
|     ROUND(6); | ||||
|     ROUND(7); | ||||
|     ROUND(8); | ||||
|     ROUND(9); | ||||
|     ROUND(10); | ||||
|     ROUND(11); | ||||
|  | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; | ||||
|     } | ||||
|  | ||||
| #undef G | ||||
| #undef ROUND | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										87
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
|  | ||||
| #define BLAKE2_USE_SSSE3 | ||||
| #define BLAKE2_USE_SSE41 | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && \ | ||||
|     defined(HAVE_SMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| #  pragma GCC target("sse4.1") | ||||
| # endif | ||||
|  | ||||
| # include <emmintrin.h> | ||||
| # include <smmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blake2b-compress-sse41.h" | ||||
|  | ||||
| CRYPTO_ALIGN(64) | ||||
| static const uint64_t blake2b_IV[8] = { | ||||
|     0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|     0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|     0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
| }; | ||||
|  | ||||
| int | ||||
| blake2b_compress_sse41(blake2b_state *S, | ||||
|                        const uint8_t  block[BLAKE2B_BLOCKBYTES]) | ||||
| { | ||||
|     __m128i       row1l, row1h; | ||||
|     __m128i       row2l, row2h; | ||||
|     __m128i       row3l, row3h; | ||||
|     __m128i       row4l, row4h; | ||||
|     __m128i       b0, b1; | ||||
|     __m128i       t0, t1; | ||||
|     const __m128i r16 = | ||||
|         _mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9); | ||||
|     const __m128i r24 = | ||||
|         _mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10); | ||||
|     const __m128i m0 = LOADU(block + 00); | ||||
|     const __m128i m1 = LOADU(block + 16); | ||||
|     const __m128i m2 = LOADU(block + 32); | ||||
|     const __m128i m3 = LOADU(block + 48); | ||||
|     const __m128i m4 = LOADU(block + 64); | ||||
|     const __m128i m5 = LOADU(block + 80); | ||||
|     const __m128i m6 = LOADU(block + 96); | ||||
|     const __m128i m7 = LOADU(block + 112); | ||||
|     row1l            = LOADU(&S->h[0]); | ||||
|     row1h            = LOADU(&S->h[2]); | ||||
|     row2l            = LOADU(&S->h[4]); | ||||
|     row2h            = LOADU(&S->h[6]); | ||||
|     row3l            = LOADU(&blake2b_IV[0]); | ||||
|     row3h            = LOADU(&blake2b_IV[2]); | ||||
|     row4l            = _mm_xor_si128(LOADU(&blake2b_IV[4]), LOADU(&S->t[0])); | ||||
|     row4h            = _mm_xor_si128(LOADU(&blake2b_IV[6]), LOADU(&S->f[0])); | ||||
|     ROUND(0); | ||||
|     ROUND(1); | ||||
|     ROUND(2); | ||||
|     ROUND(3); | ||||
|     ROUND(4); | ||||
|     ROUND(5); | ||||
|     ROUND(6); | ||||
|     ROUND(7); | ||||
|     ROUND(8); | ||||
|     ROUND(9); | ||||
|     ROUND(10); | ||||
|     ROUND(11); | ||||
|     row1l = _mm_xor_si128(row3l, row1l); | ||||
|     row1h = _mm_xor_si128(row3h, row1h); | ||||
|     STOREU(&S->h[0], _mm_xor_si128(LOADU(&S->h[0]), row1l)); | ||||
|     STOREU(&S->h[2], _mm_xor_si128(LOADU(&S->h[2]), row1h)); | ||||
|     row2l = _mm_xor_si128(row4l, row2l); | ||||
|     row2h = _mm_xor_si128(row4h, row2h); | ||||
|     STOREU(&S->h[4], _mm_xor_si128(LOADU(&S->h[4]), row2l)); | ||||
|     STOREU(&S->h[6], _mm_xor_si128(LOADU(&S->h[6]), row2h)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										103
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
|  | ||||
| #ifndef blake2b_compress_sse41_H | ||||
| #define blake2b_compress_sse41_H | ||||
|  | ||||
| #define LOADU(p) _mm_loadu_si128((const __m128i *) (const void *) (p)) | ||||
| #define STOREU(p, r) _mm_storeu_si128((__m128i *) (void *) (p), r) | ||||
|  | ||||
| #define _mm_roti_epi64(x, c)                                         \ | ||||
|     (-(c) == 32)                                                     \ | ||||
|         ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1))            \ | ||||
|         : (-(c) == 24)                                               \ | ||||
|               ? _mm_shuffle_epi8((x), r24)                           \ | ||||
|               : (-(c) == 16)                                         \ | ||||
|                     ? _mm_shuffle_epi8((x), r16)                     \ | ||||
|                     : (-(c) == 63)                                   \ | ||||
|                           ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_add_epi64((x), (x)))   \ | ||||
|                           : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_slli_epi64((x), 64 - (-(c)))) | ||||
|  | ||||
| #define G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \ | ||||
|     row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l);                \ | ||||
|     row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h);                \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_xor_si128(row4l, row1l);                                   \ | ||||
|     row4h = _mm_xor_si128(row4h, row1h);                                   \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_roti_epi64(row4l, -32);                                    \ | ||||
|     row4h = _mm_roti_epi64(row4h, -32);                                    \ | ||||
|                                                                            \ | ||||
|     row3l = _mm_add_epi64(row3l, row4l);                                   \ | ||||
|     row3h = _mm_add_epi64(row3h, row4h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_xor_si128(row2l, row3l);                                   \ | ||||
|     row2h = _mm_xor_si128(row2h, row3h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_roti_epi64(row2l, -24);                                    \ | ||||
|     row2h = _mm_roti_epi64(row2h, -24); | ||||
|  | ||||
| #define G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \ | ||||
|     row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l);                \ | ||||
|     row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h);                \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_xor_si128(row4l, row1l);                                   \ | ||||
|     row4h = _mm_xor_si128(row4h, row1h);                                   \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_roti_epi64(row4l, -16);                                    \ | ||||
|     row4h = _mm_roti_epi64(row4h, -16);                                    \ | ||||
|                                                                            \ | ||||
|     row3l = _mm_add_epi64(row3l, row4l);                                   \ | ||||
|     row3h = _mm_add_epi64(row3h, row4h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_xor_si128(row2l, row3l);                                   \ | ||||
|     row2h = _mm_xor_si128(row2h, row3h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_roti_epi64(row2l, -63);                                    \ | ||||
|     row2h = _mm_roti_epi64(row2h, -63); | ||||
|  | ||||
| #define DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \ | ||||
|     t0    = _mm_alignr_epi8(row2h, row2l, 8);                               \ | ||||
|     t1    = _mm_alignr_epi8(row2l, row2h, 8);                               \ | ||||
|     row2l = t0;                                                             \ | ||||
|     row2h = t1;                                                             \ | ||||
|                                                                             \ | ||||
|     t0    = row3l;                                                          \ | ||||
|     row3l = row3h;                                                          \ | ||||
|     row3h = t0;                                                             \ | ||||
|                                                                             \ | ||||
|     t0    = _mm_alignr_epi8(row4h, row4l, 8);                               \ | ||||
|     t1    = _mm_alignr_epi8(row4l, row4h, 8);                               \ | ||||
|     row4l = t1;                                                             \ | ||||
|     row4h = t0; | ||||
|  | ||||
| #define UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \ | ||||
|     t0    = _mm_alignr_epi8(row2l, row2h, 8);                                 \ | ||||
|     t1    = _mm_alignr_epi8(row2h, row2l, 8);                                 \ | ||||
|     row2l = t0;                                                               \ | ||||
|     row2h = t1;                                                               \ | ||||
|                                                                               \ | ||||
|     t0    = row3l;                                                            \ | ||||
|     row3l = row3h;                                                            \ | ||||
|     row3h = t0;                                                               \ | ||||
|                                                                               \ | ||||
|     t0    = _mm_alignr_epi8(row4l, row4h, 8);                                 \ | ||||
|     t1    = _mm_alignr_epi8(row4h, row4l, 8);                                 \ | ||||
|     row4l = t1;                                                               \ | ||||
|     row4h = t0; | ||||
|  | ||||
| #include "blake2b-load-sse41.h" | ||||
|  | ||||
| #define ROUND(r)                                                         \ | ||||
|     LOAD_MSG_##r##_1(b0, b1);                                            \ | ||||
|     G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     LOAD_MSG_##r##_2(b0, b1);                                            \ | ||||
|     G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h); \ | ||||
|     LOAD_MSG_##r##_3(b0, b1);                                            \ | ||||
|     G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     LOAD_MSG_##r##_4(b0, b1);                                            \ | ||||
|     G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										90
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| # endif | ||||
|  | ||||
| # include <emmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blake2b-compress-ssse3.h" | ||||
|  | ||||
| CRYPTO_ALIGN(64) | ||||
| static const uint64_t blake2b_IV[8] = { | ||||
|     0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|     0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|     0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
| }; | ||||
|  | ||||
| int | ||||
| blake2b_compress_ssse3(blake2b_state *S, | ||||
|                        const uint8_t  block[BLAKE2B_BLOCKBYTES]) | ||||
| { | ||||
|     __m128i       row1l, row1h; | ||||
|     __m128i       row2l, row2h; | ||||
|     __m128i       row3l, row3h; | ||||
|     __m128i       row4l, row4h; | ||||
|     __m128i       b0, b1; | ||||
|     __m128i       t0, t1; | ||||
|     const __m128i r16 = | ||||
|         _mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9); | ||||
|     const __m128i r24 = | ||||
|         _mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10); | ||||
|     const uint64_t m0  = ((const uint64_t *) block)[0]; | ||||
|     const uint64_t m1  = ((const uint64_t *) block)[1]; | ||||
|     const uint64_t m2  = ((const uint64_t *) block)[2]; | ||||
|     const uint64_t m3  = ((const uint64_t *) block)[3]; | ||||
|     const uint64_t m4  = ((const uint64_t *) block)[4]; | ||||
|     const uint64_t m5  = ((const uint64_t *) block)[5]; | ||||
|     const uint64_t m6  = ((const uint64_t *) block)[6]; | ||||
|     const uint64_t m7  = ((const uint64_t *) block)[7]; | ||||
|     const uint64_t m8  = ((const uint64_t *) block)[8]; | ||||
|     const uint64_t m9  = ((const uint64_t *) block)[9]; | ||||
|     const uint64_t m10 = ((const uint64_t *) block)[10]; | ||||
|     const uint64_t m11 = ((const uint64_t *) block)[11]; | ||||
|     const uint64_t m12 = ((const uint64_t *) block)[12]; | ||||
|     const uint64_t m13 = ((const uint64_t *) block)[13]; | ||||
|     const uint64_t m14 = ((const uint64_t *) block)[14]; | ||||
|     const uint64_t m15 = ((const uint64_t *) block)[15]; | ||||
|  | ||||
|     row1l = LOADU(&S->h[0]); | ||||
|     row1h = LOADU(&S->h[2]); | ||||
|     row2l = LOADU(&S->h[4]); | ||||
|     row2h = LOADU(&S->h[6]); | ||||
|     row3l = LOADU(&blake2b_IV[0]); | ||||
|     row3h = LOADU(&blake2b_IV[2]); | ||||
|     row4l = _mm_xor_si128(LOADU(&blake2b_IV[4]), LOADU(&S->t[0])); | ||||
|     row4h = _mm_xor_si128(LOADU(&blake2b_IV[6]), LOADU(&S->f[0])); | ||||
|     ROUND(0); | ||||
|     ROUND(1); | ||||
|     ROUND(2); | ||||
|     ROUND(3); | ||||
|     ROUND(4); | ||||
|     ROUND(5); | ||||
|     ROUND(6); | ||||
|     ROUND(7); | ||||
|     ROUND(8); | ||||
|     ROUND(9); | ||||
|     ROUND(10); | ||||
|     ROUND(11); | ||||
|     row1l = _mm_xor_si128(row3l, row1l); | ||||
|     row1h = _mm_xor_si128(row3h, row1h); | ||||
|     STOREU(&S->h[0], _mm_xor_si128(LOADU(&S->h[0]), row1l)); | ||||
|     STOREU(&S->h[2], _mm_xor_si128(LOADU(&S->h[2]), row1h)); | ||||
|     row2l = _mm_xor_si128(row4l, row2l); | ||||
|     row2h = _mm_xor_si128(row4h, row2h); | ||||
|     STOREU(&S->h[4], _mm_xor_si128(LOADU(&S->h[4]), row2l)); | ||||
|     STOREU(&S->h[6], _mm_xor_si128(LOADU(&S->h[6]), row2h)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										103
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
|  | ||||
| #ifndef blake2b_compress_ssse3_H | ||||
| #define blake2b_compress_ssse3_H | ||||
|  | ||||
| #define LOADU(p) _mm_loadu_si128((const __m128i *) (const void *) (p)) | ||||
| #define STOREU(p, r) _mm_storeu_si128((__m128i *) (void *) (p), r) | ||||
|  | ||||
| #define _mm_roti_epi64(x, c)                                         \ | ||||
|     (-(c) == 32)                                                     \ | ||||
|         ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1))            \ | ||||
|         : (-(c) == 24)                                               \ | ||||
|               ? _mm_shuffle_epi8((x), r24)                           \ | ||||
|               : (-(c) == 16)                                         \ | ||||
|                     ? _mm_shuffle_epi8((x), r16)                     \ | ||||
|                     : (-(c) == 63)                                   \ | ||||
|                           ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_add_epi64((x), (x)))   \ | ||||
|                           : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_slli_epi64((x), 64 - (-(c)))) | ||||
|  | ||||
| #define G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \ | ||||
|     row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l);                \ | ||||
|     row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h);                \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_xor_si128(row4l, row1l);                                   \ | ||||
|     row4h = _mm_xor_si128(row4h, row1h);                                   \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_roti_epi64(row4l, -32);                                    \ | ||||
|     row4h = _mm_roti_epi64(row4h, -32);                                    \ | ||||
|                                                                            \ | ||||
|     row3l = _mm_add_epi64(row3l, row4l);                                   \ | ||||
|     row3h = _mm_add_epi64(row3h, row4h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_xor_si128(row2l, row3l);                                   \ | ||||
|     row2h = _mm_xor_si128(row2h, row3h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_roti_epi64(row2l, -24);                                    \ | ||||
|     row2h = _mm_roti_epi64(row2h, -24); | ||||
|  | ||||
| #define G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \ | ||||
|     row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l);                \ | ||||
|     row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h);                \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_xor_si128(row4l, row1l);                                   \ | ||||
|     row4h = _mm_xor_si128(row4h, row1h);                                   \ | ||||
|                                                                            \ | ||||
|     row4l = _mm_roti_epi64(row4l, -16);                                    \ | ||||
|     row4h = _mm_roti_epi64(row4h, -16);                                    \ | ||||
|                                                                            \ | ||||
|     row3l = _mm_add_epi64(row3l, row4l);                                   \ | ||||
|     row3h = _mm_add_epi64(row3h, row4h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_xor_si128(row2l, row3l);                                   \ | ||||
|     row2h = _mm_xor_si128(row2h, row3h);                                   \ | ||||
|                                                                            \ | ||||
|     row2l = _mm_roti_epi64(row2l, -63);                                    \ | ||||
|     row2h = _mm_roti_epi64(row2h, -63); | ||||
|  | ||||
| #define DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \ | ||||
|     t0    = _mm_alignr_epi8(row2h, row2l, 8);                               \ | ||||
|     t1    = _mm_alignr_epi8(row2l, row2h, 8);                               \ | ||||
|     row2l = t0;                                                             \ | ||||
|     row2h = t1;                                                             \ | ||||
|                                                                             \ | ||||
|     t0    = row3l;                                                          \ | ||||
|     row3l = row3h;                                                          \ | ||||
|     row3h = t0;                                                             \ | ||||
|                                                                             \ | ||||
|     t0    = _mm_alignr_epi8(row4h, row4l, 8);                               \ | ||||
|     t1    = _mm_alignr_epi8(row4l, row4h, 8);                               \ | ||||
|     row4l = t1;                                                             \ | ||||
|     row4h = t0; | ||||
|  | ||||
| #define UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \ | ||||
|     t0    = _mm_alignr_epi8(row2l, row2h, 8);                                 \ | ||||
|     t1    = _mm_alignr_epi8(row2h, row2l, 8);                                 \ | ||||
|     row2l = t0;                                                               \ | ||||
|     row2h = t1;                                                               \ | ||||
|                                                                               \ | ||||
|     t0    = row3l;                                                            \ | ||||
|     row3l = row3h;                                                            \ | ||||
|     row3h = t0;                                                               \ | ||||
|                                                                               \ | ||||
|     t0    = _mm_alignr_epi8(row4l, row4h, 8);                                 \ | ||||
|     t1    = _mm_alignr_epi8(row4h, row4l, 8);                                 \ | ||||
|     row4l = t1;                                                               \ | ||||
|     row4h = t0; | ||||
|  | ||||
| #include "blake2b-load-sse2.h" | ||||
|  | ||||
| #define ROUND(r)                                                         \ | ||||
|     LOAD_MSG_##r##_1(b0, b1);                                            \ | ||||
|     G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     LOAD_MSG_##r##_2(b0, b1);                                            \ | ||||
|     G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h); \ | ||||
|     LOAD_MSG_##r##_3(b0, b1);                                            \ | ||||
|     G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     LOAD_MSG_##r##_4(b0, b1);                                            \ | ||||
|     G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1);  \ | ||||
|     UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										340
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| #ifndef blake2b_load_avx2_H | ||||
| #define blake2b_load_avx2_H | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_0_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m0, m1);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m2, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_0_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m0, m1);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m2, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_0_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m7, m4);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m5, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_0_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m7, m4);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m5, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_1_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m7, m2);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m4, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_1_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m5, m4);    \ | ||||
|         t1 = _mm256_alignr_epi8(m3, m7, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_1_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m2, m0);    \ | ||||
|         t1 = _mm256_blend_epi32(m5, m0, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_1_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m6, m1, 8);    \ | ||||
|         t1 = _mm256_blend_epi32(m3, m1, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_2_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m6, m5, 8);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m2, m7);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_2_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m4, m0);    \ | ||||
|         t1 = _mm256_blend_epi32(m6, m1, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_2_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m5, m4, 8);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m1, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_2_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m2, m7);    \ | ||||
|         t1 = _mm256_blend_epi32(m0, m3, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_3_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m3, m1);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m6, m5);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_3_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m4, m0);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m6, m7);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_3_3(b0)                                \ | ||||
|     do {                                                        \ | ||||
|         t0 = _mm256_alignr_epi8(m1, m7, 8);                     \ | ||||
|         t1 = _mm256_shuffle_epi32(m2, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0);                  \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_3_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m4, m3);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m5, m0);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_4_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m4, m2);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m1, m5);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_4_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_blend_epi32(m3, m0, 0x33); \ | ||||
|         t1 = _mm256_blend_epi32(m7, m2, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_4_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m7, m1, 8);    \ | ||||
|         t1 = _mm256_alignr_epi8(m3, m5, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_4_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m6, m0);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m6, m4);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_5_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m1, m3);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m0, m4);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_5_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m6, m5);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m5, m1);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_5_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m2, m0, 8);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m3, m7);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_5_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m4, m6);    \ | ||||
|         t1 = _mm256_alignr_epi8(m7, m2, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_6_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_blend_epi32(m0, m6, 0x33); \ | ||||
|         t1 = _mm256_unpacklo_epi64(m7, m2);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_6_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m2, m7);    \ | ||||
|         t1 = _mm256_alignr_epi8(m5, m6, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_6_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m4, m0);    \ | ||||
|         t1 = _mm256_blend_epi32(m4, m3, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_6_4(b0)                                \ | ||||
|     do {                                                        \ | ||||
|         t0 = _mm256_unpackhi_epi64(m5, m3);                     \ | ||||
|         t1 = _mm256_shuffle_epi32(m1, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0);                  \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_7_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m6, m3);    \ | ||||
|         t1 = _mm256_blend_epi32(m1, m6, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_7_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m7, m5, 8);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m0, m4);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_7_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_blend_epi32(m2, m1, 0x33); \ | ||||
|         t1 = _mm256_alignr_epi8(m4, m7, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_7_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m5, m0);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m2, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_8_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m3, m7);    \ | ||||
|         t1 = _mm256_alignr_epi8(m0, m5, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_8_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m7, m4);    \ | ||||
|         t1 = _mm256_alignr_epi8(m4, m1, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_8_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m5, m6);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m6, m0);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_8_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m1, m2, 8);    \ | ||||
|         t1 = _mm256_alignr_epi8(m2, m3, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_9_1(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m5, m4);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m3, m0);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_9_2(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m1, m2);    \ | ||||
|         t1 = _mm256_blend_epi32(m2, m3, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_9_3(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m6, m7);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m4, m1);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_9_4(b0)               \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_blend_epi32(m5, m0, 0x33); \ | ||||
|         t1 = _mm256_unpacklo_epi64(m7, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_10_1(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m0, m1);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m2, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_10_2(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m0, m1);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m2, m3);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_10_3(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m7, m4);    \ | ||||
|         t1 = _mm256_unpacklo_epi64(m5, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_10_4(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m7, m4);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m5, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_11_1(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m7, m2);    \ | ||||
|         t1 = _mm256_unpackhi_epi64(m4, m6);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_11_2(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpacklo_epi64(m5, m4);    \ | ||||
|         t1 = _mm256_alignr_epi8(m3, m7, 8);    \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_11_3(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_unpackhi_epi64(m2, m0);    \ | ||||
|         t1 = _mm256_blend_epi32(m5, m0, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define BLAKE2B_LOAD_MSG_11_4(b0)              \ | ||||
|     do {                                       \ | ||||
|         t0 = _mm256_alignr_epi8(m6, m1, 8);    \ | ||||
|         t1 = _mm256_blend_epi32(m3, m1, 0x33); \ | ||||
|         b0 = _mm256_blend_epi32(t0, t1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										164
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-sse2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-sse2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| /* | ||||
|    BLAKE2 reference source code package - optimized C implementations | ||||
|  | ||||
|    Written in 2012 by Samuel Neves <sneves@dei.uc.pt> | ||||
|  | ||||
|    To the extent possible under law, the author(s) have dedicated all copyright | ||||
|    and related and neighboring rights to this software to the public domain | ||||
|    worldwide. This software is distributed without any warranty. | ||||
|  | ||||
|    You should have received a copy of the CC0 Public Domain Dedication along | ||||
|    with | ||||
|    this software. If not, see | ||||
|    <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
| */ | ||||
|  | ||||
| #ifndef blake2b_load_sse2_H | ||||
| #define blake2b_load_sse2_H | ||||
|  | ||||
| #define LOAD_MSG_0_1(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m2, m0); \ | ||||
|     b1 = _mm_set_epi64x(m6, m4) | ||||
| #define LOAD_MSG_0_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m3, m1); \ | ||||
|     b1 = _mm_set_epi64x(m7, m5) | ||||
| #define LOAD_MSG_0_3(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m10, m8); \ | ||||
|     b1 = _mm_set_epi64x(m14, m12) | ||||
| #define LOAD_MSG_0_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m11, m9); \ | ||||
|     b1 = _mm_set_epi64x(m15, m13) | ||||
| #define LOAD_MSG_1_1(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m4, m14); \ | ||||
|     b1 = _mm_set_epi64x(m13, m9) | ||||
| #define LOAD_MSG_1_2(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m8, m10); \ | ||||
|     b1 = _mm_set_epi64x(m6, m15) | ||||
| #define LOAD_MSG_1_3(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m0, m1); \ | ||||
|     b1 = _mm_set_epi64x(m5, m11) | ||||
| #define LOAD_MSG_1_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m2, m12); \ | ||||
|     b1 = _mm_set_epi64x(m3, m7) | ||||
| #define LOAD_MSG_2_1(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m12, m11); \ | ||||
|     b1 = _mm_set_epi64x(m15, m5) | ||||
| #define LOAD_MSG_2_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m0, m8); \ | ||||
|     b1 = _mm_set_epi64x(m13, m2) | ||||
| #define LOAD_MSG_2_3(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m3, m10); \ | ||||
|     b1 = _mm_set_epi64x(m9, m7) | ||||
| #define LOAD_MSG_2_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m6, m14); \ | ||||
|     b1 = _mm_set_epi64x(m4, m1) | ||||
| #define LOAD_MSG_3_1(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m3, m7); \ | ||||
|     b1 = _mm_set_epi64x(m11, m13) | ||||
| #define LOAD_MSG_3_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m1, m9); \ | ||||
|     b1 = _mm_set_epi64x(m14, m12) | ||||
| #define LOAD_MSG_3_3(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m5, m2); \ | ||||
|     b1 = _mm_set_epi64x(m15, m4) | ||||
| #define LOAD_MSG_3_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m10, m6); \ | ||||
|     b1 = _mm_set_epi64x(m8, m0) | ||||
| #define LOAD_MSG_4_1(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m5, m9); \ | ||||
|     b1 = _mm_set_epi64x(m10, m2) | ||||
| #define LOAD_MSG_4_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m7, m0); \ | ||||
|     b1 = _mm_set_epi64x(m15, m4) | ||||
| #define LOAD_MSG_4_3(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m11, m14); \ | ||||
|     b1 = _mm_set_epi64x(m3, m6) | ||||
| #define LOAD_MSG_4_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m12, m1); \ | ||||
|     b1 = _mm_set_epi64x(m13, m8) | ||||
| #define LOAD_MSG_5_1(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m6, m2); \ | ||||
|     b1 = _mm_set_epi64x(m8, m0) | ||||
| #define LOAD_MSG_5_2(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m10, m12); \ | ||||
|     b1 = _mm_set_epi64x(m3, m11) | ||||
| #define LOAD_MSG_5_3(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m7, m4); \ | ||||
|     b1 = _mm_set_epi64x(m1, m15) | ||||
| #define LOAD_MSG_5_4(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m5, m13); \ | ||||
|     b1 = _mm_set_epi64x(m9, m14) | ||||
| #define LOAD_MSG_6_1(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m1, m12); \ | ||||
|     b1 = _mm_set_epi64x(m4, m14) | ||||
| #define LOAD_MSG_6_2(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m15, m5); \ | ||||
|     b1 = _mm_set_epi64x(m10, m13) | ||||
| #define LOAD_MSG_6_3(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m6, m0); \ | ||||
|     b1 = _mm_set_epi64x(m8, m9) | ||||
| #define LOAD_MSG_6_4(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m3, m7); \ | ||||
|     b1 = _mm_set_epi64x(m11, m2) | ||||
| #define LOAD_MSG_7_1(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m7, m13); \ | ||||
|     b1 = _mm_set_epi64x(m3, m12) | ||||
| #define LOAD_MSG_7_2(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m14, m11); \ | ||||
|     b1 = _mm_set_epi64x(m9, m1) | ||||
| #define LOAD_MSG_7_3(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m15, m5); \ | ||||
|     b1 = _mm_set_epi64x(m2, m8) | ||||
| #define LOAD_MSG_7_4(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m4, m0); \ | ||||
|     b1 = _mm_set_epi64x(m10, m6) | ||||
| #define LOAD_MSG_8_1(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m14, m6); \ | ||||
|     b1 = _mm_set_epi64x(m0, m11) | ||||
| #define LOAD_MSG_8_2(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m9, m15); \ | ||||
|     b1 = _mm_set_epi64x(m8, m3) | ||||
| #define LOAD_MSG_8_3(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m13, m12); \ | ||||
|     b1 = _mm_set_epi64x(m10, m1) | ||||
| #define LOAD_MSG_8_4(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m7, m2); \ | ||||
|     b1 = _mm_set_epi64x(m5, m4) | ||||
| #define LOAD_MSG_9_1(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m8, m10); \ | ||||
|     b1 = _mm_set_epi64x(m1, m7) | ||||
| #define LOAD_MSG_9_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m4, m2); \ | ||||
|     b1 = _mm_set_epi64x(m5, m6) | ||||
| #define LOAD_MSG_9_3(b0, b1)      \ | ||||
|     b0 = _mm_set_epi64x(m9, m15); \ | ||||
|     b1 = _mm_set_epi64x(m13, m3) | ||||
| #define LOAD_MSG_9_4(b0, b1)       \ | ||||
|     b0 = _mm_set_epi64x(m14, m11); \ | ||||
|     b1 = _mm_set_epi64x(m0, m12) | ||||
| #define LOAD_MSG_10_1(b0, b1)    \ | ||||
|     b0 = _mm_set_epi64x(m2, m0); \ | ||||
|     b1 = _mm_set_epi64x(m6, m4) | ||||
| #define LOAD_MSG_10_2(b0, b1)    \ | ||||
|     b0 = _mm_set_epi64x(m3, m1); \ | ||||
|     b1 = _mm_set_epi64x(m7, m5) | ||||
| #define LOAD_MSG_10_3(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m10, m8); \ | ||||
|     b1 = _mm_set_epi64x(m14, m12) | ||||
| #define LOAD_MSG_10_4(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m11, m9); \ | ||||
|     b1 = _mm_set_epi64x(m15, m13) | ||||
| #define LOAD_MSG_11_1(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m4, m14); \ | ||||
|     b1 = _mm_set_epi64x(m13, m9) | ||||
| #define LOAD_MSG_11_2(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m8, m10); \ | ||||
|     b1 = _mm_set_epi64x(m6, m15) | ||||
| #define LOAD_MSG_11_3(b0, b1)    \ | ||||
|     b0 = _mm_set_epi64x(m0, m1); \ | ||||
|     b1 = _mm_set_epi64x(m5, m11) | ||||
| #define LOAD_MSG_11_4(b0, b1)     \ | ||||
|     b0 = _mm_set_epi64x(m2, m12); \ | ||||
|     b1 = _mm_set_epi64x(m3, m7) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										307
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-sse41.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-load-sse41.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,307 @@ | ||||
| /* | ||||
|    BLAKE2 reference source code package - optimized C implementations | ||||
|  | ||||
|    Written in 2012 by Samuel Neves <sneves@dei.uc.pt> | ||||
|  | ||||
|    To the extent possible under law, the author(s) have dedicated all copyright | ||||
|    and related and neighboring rights to this software to the public domain | ||||
|    worldwide. This software is distributed without any warranty. | ||||
|  | ||||
|    You should have received a copy of the CC0 Public Domain Dedication along | ||||
|    with | ||||
|    this software. If not, see | ||||
|    <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
| */ | ||||
|  | ||||
| #ifndef blake2b_load_sse41_H | ||||
| #define blake2b_load_sse41_H | ||||
|  | ||||
| #define LOAD_MSG_0_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m0, m1); \ | ||||
|         b1 = _mm_unpacklo_epi64(m2, m3); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_0_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m0, m1); \ | ||||
|         b1 = _mm_unpackhi_epi64(m2, m3); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_0_3(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m4, m5); \ | ||||
|         b1 = _mm_unpacklo_epi64(m6, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_0_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m4, m5); \ | ||||
|         b1 = _mm_unpackhi_epi64(m6, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_1_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m7, m2); \ | ||||
|         b1 = _mm_unpackhi_epi64(m4, m6); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_1_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m5, m4); \ | ||||
|         b1 = _mm_alignr_epi8(m3, m7, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_1_3(b0, b1)                                 \ | ||||
|     do {                                                     \ | ||||
|         b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         b1 = _mm_unpackhi_epi64(m5, m2);                     \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_1_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m6, m1); \ | ||||
|         b1 = _mm_unpackhi_epi64(m3, m1); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_2_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_alignr_epi8(m6, m5, 8); \ | ||||
|         b1 = _mm_unpackhi_epi64(m2, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_2_2(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_unpacklo_epi64(m4, m0);    \ | ||||
|         b1 = _mm_blend_epi16(m1, m6, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_2_3(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m5, m1, 0xF0); \ | ||||
|         b1 = _mm_unpackhi_epi64(m3, m4);    \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_2_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m7, m3); \ | ||||
|         b1 = _mm_alignr_epi8(m2, m0, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_3_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m3, m1); \ | ||||
|         b1 = _mm_unpackhi_epi64(m6, m5); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_3_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m4, m0); \ | ||||
|         b1 = _mm_unpacklo_epi64(m6, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_3_3(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m1, m2, 0xF0); \ | ||||
|         b1 = _mm_blend_epi16(m2, m7, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_3_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m3, m5); \ | ||||
|         b1 = _mm_unpacklo_epi64(m0, m4); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_4_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m4, m2); \ | ||||
|         b1 = _mm_unpacklo_epi64(m1, m5); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_4_2(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m0, m3, 0xF0); \ | ||||
|         b1 = _mm_blend_epi16(m2, m7, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_4_3(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m7, m5, 0xF0); \ | ||||
|         b1 = _mm_blend_epi16(m3, m1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_4_4(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_alignr_epi8(m6, m0, 8);    \ | ||||
|         b1 = _mm_blend_epi16(m4, m6, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_5_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m1, m3); \ | ||||
|         b1 = _mm_unpacklo_epi64(m0, m4); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_5_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m6, m5); \ | ||||
|         b1 = _mm_unpackhi_epi64(m5, m1); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_5_3(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m2, m3, 0xF0); \ | ||||
|         b1 = _mm_unpackhi_epi64(m7, m0);    \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_5_4(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_unpackhi_epi64(m6, m2);    \ | ||||
|         b1 = _mm_blend_epi16(m7, m4, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_6_1(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m6, m0, 0xF0); \ | ||||
|         b1 = _mm_unpacklo_epi64(m7, m2);    \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_6_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m2, m7); \ | ||||
|         b1 = _mm_alignr_epi8(m5, m6, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_6_3(b0, b1)                                 \ | ||||
|     do {                                                     \ | ||||
|         b0 = _mm_unpacklo_epi64(m0, m3);                     \ | ||||
|         b1 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_6_4(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_unpackhi_epi64(m3, m1);    \ | ||||
|         b1 = _mm_blend_epi16(m1, m5, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_7_1(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_unpackhi_epi64(m6, m3);    \ | ||||
|         b1 = _mm_blend_epi16(m6, m1, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_7_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_alignr_epi8(m7, m5, 8); \ | ||||
|         b1 = _mm_unpackhi_epi64(m0, m4); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_7_3(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m2, m7); \ | ||||
|         b1 = _mm_unpacklo_epi64(m4, m1); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_7_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m0, m2); \ | ||||
|         b1 = _mm_unpacklo_epi64(m3, m5); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_8_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m3, m7); \ | ||||
|         b1 = _mm_alignr_epi8(m0, m5, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_8_2(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m7, m4); \ | ||||
|         b1 = _mm_alignr_epi8(m4, m1, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_8_3(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = m6;                         \ | ||||
|         b1 = _mm_alignr_epi8(m5, m0, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_8_4(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_blend_epi16(m1, m3, 0xF0); \ | ||||
|         b1 = m2;                            \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_9_1(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m5, m4); \ | ||||
|         b1 = _mm_unpackhi_epi64(m3, m0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_9_2(b0, b1)                \ | ||||
|     do {                                    \ | ||||
|         b0 = _mm_unpacklo_epi64(m1, m2);    \ | ||||
|         b1 = _mm_blend_epi16(m3, m2, 0xF0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_9_3(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m7, m4); \ | ||||
|         b1 = _mm_unpackhi_epi64(m1, m6); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_9_4(b0, b1)             \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_alignr_epi8(m7, m5, 8); \ | ||||
|         b1 = _mm_unpacklo_epi64(m6, m0); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_10_1(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m0, m1); \ | ||||
|         b1 = _mm_unpacklo_epi64(m2, m3); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_10_2(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m0, m1); \ | ||||
|         b1 = _mm_unpackhi_epi64(m2, m3); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_10_3(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m4, m5); \ | ||||
|         b1 = _mm_unpacklo_epi64(m6, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_10_4(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpackhi_epi64(m4, m5); \ | ||||
|         b1 = _mm_unpackhi_epi64(m6, m7); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_11_1(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m7, m2); \ | ||||
|         b1 = _mm_unpackhi_epi64(m4, m6); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_11_2(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m5, m4); \ | ||||
|         b1 = _mm_alignr_epi8(m3, m7, 8); \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_11_3(b0, b1)                                \ | ||||
|     do {                                                     \ | ||||
|         b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         b1 = _mm_unpackhi_epi64(m5, m2);                     \ | ||||
|     } while (0) | ||||
|  | ||||
| #define LOAD_MSG_11_4(b0, b1)            \ | ||||
|     do {                                 \ | ||||
|         b0 = _mm_unpacklo_epi64(m6, m1); \ | ||||
|         b1 = _mm_unpackhi_epi64(m3, m1); \ | ||||
|     } while (0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										438
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										438
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,438 @@ | ||||
| /* | ||||
|    BLAKE2 reference source code package - C implementations | ||||
|  | ||||
|    Written in 2012 by Samuel Neves <sneves@dei.uc.pt> | ||||
|  | ||||
|    To the extent possible under law, the author(s) have dedicated all copyright | ||||
|    and related and neighboring rights to this software to the public domain | ||||
|    worldwide. This software is distributed without any warranty. | ||||
|  | ||||
|    You should have received a copy of the CC0 Public Domain Dedication along | ||||
|    with | ||||
|    this software. If not, see | ||||
|    <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
| */ | ||||
|  | ||||
| #include <assert.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "core.h" | ||||
| #include "private/common.h" | ||||
| #include "runtime.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static blake2b_compress_fn blake2b_compress = blake2b_compress_ref; | ||||
|  | ||||
| static const uint64_t blake2b_IV[8] = { | ||||
|     0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|     0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|     0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
| }; | ||||
|  | ||||
| /* LCOV_EXCL_START */ | ||||
| static inline int | ||||
| blake2b_set_lastnode(blake2b_state *S) | ||||
| { | ||||
|     S->f[1] = -1; | ||||
|     return 0; | ||||
| } | ||||
| /* LCOV_EXCL_STOP */ | ||||
|  | ||||
| static inline int | ||||
| blake2b_is_lastblock(const blake2b_state *S) | ||||
| { | ||||
|     return S->f[0] != 0; | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| blake2b_set_lastblock(blake2b_state *S) | ||||
| { | ||||
|     if (S->last_node) { | ||||
|         blake2b_set_lastnode(S); | ||||
|     } | ||||
|     S->f[0] = -1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| blake2b_increment_counter(blake2b_state *S, const uint64_t inc) | ||||
| { | ||||
| #ifdef HAVE_TI_MODE | ||||
|     uint128_t t = ((uint128_t) S->t[1] << 64) | S->t[0]; | ||||
|     t += inc; | ||||
|     S->t[0] = (uint64_t)(t >> 0); | ||||
|     S->t[1] = (uint64_t)(t >> 64); | ||||
| #else | ||||
|     S->t[0] += inc; | ||||
|     S->t[1] += (S->t[0] < inc); | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* Parameter-related functions */ | ||||
| static inline int | ||||
| blake2b_param_set_salt(blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES]) | ||||
| { | ||||
|     memcpy(P->salt, salt, BLAKE2B_SALTBYTES); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| blake2b_param_set_personal(blake2b_param *P, | ||||
|                            const uint8_t  personal[BLAKE2B_PERSONALBYTES]) | ||||
| { | ||||
|     memcpy(P->personal, personal, BLAKE2B_PERSONALBYTES); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| blake2b_init0(blake2b_state *S) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     for (i  = 0; i < 8; i++) { | ||||
|         S->h[i] = blake2b_IV[i]; | ||||
|     } | ||||
|     /* zero everything between .t and .last_node */ | ||||
|     memset((void *) &S->t, 0, | ||||
|            offsetof(blake2b_state, last_node) + sizeof(S->last_node) | ||||
|            - offsetof(blake2b_state, t)); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* init xors IV with input parameter block */ | ||||
| int | ||||
| blake2b_init_param(blake2b_state *S, const blake2b_param *P) | ||||
| { | ||||
|     size_t         i; | ||||
|     const uint8_t *p; | ||||
|  | ||||
|     COMPILER_ASSERT(sizeof *P == 64); | ||||
|     blake2b_init0(S); | ||||
|     p = (const uint8_t *) (P); | ||||
|  | ||||
|     /* IV XOR ParamBlock */ | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         S->h[i] ^= LOAD64_LE(p + sizeof(S->h[i]) * i); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_init(blake2b_state *S, const uint8_t outlen) | ||||
| { | ||||
|     blake2b_param P[1]; | ||||
|  | ||||
|     if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     P->digest_length = outlen; | ||||
|     P->key_length    = 0; | ||||
|     P->fanout        = 1; | ||||
|     P->depth         = 1; | ||||
|     STORE32_LE(P->leaf_length, 0); | ||||
|     STORE64_LE(P->node_offset, 0); | ||||
|     P->node_depth   = 0; | ||||
|     P->inner_length = 0; | ||||
|     memset(P->reserved, 0, sizeof(P->reserved)); | ||||
|     memset(P->salt, 0, sizeof(P->salt)); | ||||
|     memset(P->personal, 0, sizeof(P->personal)); | ||||
|     return blake2b_init_param(S, P); | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_init_salt_personal(blake2b_state *S, const uint8_t outlen, | ||||
|                            const void *salt, const void *personal) | ||||
| { | ||||
|     blake2b_param P[1]; | ||||
|  | ||||
|     if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     P->digest_length = outlen; | ||||
|     P->key_length    = 0; | ||||
|     P->fanout        = 1; | ||||
|     P->depth         = 1; | ||||
|     STORE32_LE(P->leaf_length, 0); | ||||
|     STORE64_LE(P->node_offset, 0); | ||||
|     P->node_depth   = 0; | ||||
|     P->inner_length = 0; | ||||
|     memset(P->reserved, 0, sizeof(P->reserved)); | ||||
|     if (salt != NULL) { | ||||
|         blake2b_param_set_salt(P, (const uint8_t *) salt); | ||||
|     } else { | ||||
|         memset(P->salt, 0, sizeof(P->salt)); | ||||
|     } | ||||
|     if (personal != NULL) { | ||||
|         blake2b_param_set_personal(P, (const uint8_t *) personal); | ||||
|     } else { | ||||
|         memset(P->personal, 0, sizeof(P->personal)); | ||||
|     } | ||||
|     return blake2b_init_param(S, P); | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_init_key(blake2b_state *S, const uint8_t outlen, const void *key, | ||||
|                  const uint8_t keylen) | ||||
| { | ||||
|     blake2b_param P[1]; | ||||
|  | ||||
|     if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (!key || !keylen || keylen > BLAKE2B_KEYBYTES) { | ||||
|         sodium_misuse(); /* does not return */ | ||||
|     } | ||||
|     P->digest_length = outlen; | ||||
|     P->key_length    = keylen; | ||||
|     P->fanout        = 1; | ||||
|     P->depth         = 1; | ||||
|     STORE32_LE(P->leaf_length, 0); | ||||
|     STORE64_LE(P->node_offset, 0); | ||||
|     P->node_depth   = 0; | ||||
|     P->inner_length = 0; | ||||
|     memset(P->reserved, 0, sizeof(P->reserved)); | ||||
|     memset(P->salt, 0, sizeof(P->salt)); | ||||
|     memset(P->personal, 0, sizeof(P->personal)); | ||||
|  | ||||
|     if (blake2b_init_param(S, P) < 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     { | ||||
|         uint8_t block[BLAKE2B_BLOCKBYTES]; | ||||
|         memset(block, 0, BLAKE2B_BLOCKBYTES); | ||||
|         memcpy(block, key, keylen); /* key and keylen cannot be 0 */ | ||||
|         blake2b_update(S, block, BLAKE2B_BLOCKBYTES); | ||||
|         sodium_memzero(block, BLAKE2B_BLOCKBYTES); /* Burn the key from stack */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_init_key_salt_personal(blake2b_state *S, const uint8_t outlen, | ||||
|                                const void *key, const uint8_t keylen, | ||||
|                                const void *salt, const void *personal) | ||||
| { | ||||
|     blake2b_param P[1]; | ||||
|  | ||||
|     if ((!outlen) || (outlen > BLAKE2B_OUTBYTES)) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (!key || !keylen || keylen > BLAKE2B_KEYBYTES) { | ||||
|         sodium_misuse(); /* does not return */ | ||||
|     } | ||||
|     P->digest_length = outlen; | ||||
|     P->key_length    = keylen; | ||||
|     P->fanout        = 1; | ||||
|     P->depth         = 1; | ||||
|     STORE32_LE(P->leaf_length, 0); | ||||
|     STORE64_LE(P->node_offset, 0); | ||||
|     P->node_depth   = 0; | ||||
|     P->inner_length = 0; | ||||
|     memset(P->reserved, 0, sizeof(P->reserved)); | ||||
|     if (salt != NULL) { | ||||
|         blake2b_param_set_salt(P, (const uint8_t *) salt); | ||||
|     } else { | ||||
|         memset(P->salt, 0, sizeof(P->salt)); | ||||
|     } | ||||
|     if (personal != NULL) { | ||||
|         blake2b_param_set_personal(P, (const uint8_t *) personal); | ||||
|     } else { | ||||
|         memset(P->personal, 0, sizeof(P->personal)); | ||||
|     } | ||||
|  | ||||
|     if (blake2b_init_param(S, P) < 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     { | ||||
|         uint8_t block[BLAKE2B_BLOCKBYTES]; | ||||
|         memset(block, 0, BLAKE2B_BLOCKBYTES); | ||||
|         memcpy(block, key, keylen); /* key and keylen cannot be 0 */ | ||||
|         blake2b_update(S, block, BLAKE2B_BLOCKBYTES); | ||||
|         sodium_memzero(block, BLAKE2B_BLOCKBYTES); /* Burn the key from stack */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* inlen now in bytes */ | ||||
| int | ||||
| blake2b_update(blake2b_state *S, const uint8_t *in, uint64_t inlen) | ||||
| { | ||||
|     while (inlen > 0) { | ||||
|         size_t left = S->buflen; | ||||
|         size_t fill = 2 * BLAKE2B_BLOCKBYTES - left; | ||||
|  | ||||
|         if (inlen > fill) { | ||||
|             memcpy(S->buf + left, in, fill); /* Fill buffer */ | ||||
|             S->buflen += fill; | ||||
|             blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); | ||||
|             blake2b_compress(S, S->buf); /* Compress */ | ||||
|             memcpy(S->buf, S->buf + BLAKE2B_BLOCKBYTES, | ||||
|                    BLAKE2B_BLOCKBYTES); /* Shift buffer left */ | ||||
|             S->buflen -= BLAKE2B_BLOCKBYTES; | ||||
|             in += fill; | ||||
|             inlen -= fill; | ||||
|         } else /* inlen <= fill */ | ||||
|         { | ||||
|             memcpy(S->buf + left, in, inlen); | ||||
|             S->buflen += inlen; /* Be lazy, do not compress */ | ||||
|             in += inlen; | ||||
|             inlen -= inlen; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_final(blake2b_state *S, uint8_t *out, uint8_t outlen) | ||||
| { | ||||
|     unsigned char buffer[BLAKE2B_OUTBYTES]; | ||||
|  | ||||
|     if (!outlen || outlen > BLAKE2B_OUTBYTES) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (blake2b_is_lastblock(S)) { | ||||
|         return -1; | ||||
|     } | ||||
|     if (S->buflen > BLAKE2B_BLOCKBYTES) { | ||||
|         blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); | ||||
|         blake2b_compress(S, S->buf); | ||||
|         S->buflen -= BLAKE2B_BLOCKBYTES; | ||||
|         assert(S->buflen <= BLAKE2B_BLOCKBYTES); | ||||
|         memcpy(S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen); | ||||
|     } | ||||
|  | ||||
|     blake2b_increment_counter(S, S->buflen); | ||||
|     blake2b_set_lastblock(S); | ||||
|     memset(S->buf + S->buflen, 0, | ||||
|            2 * BLAKE2B_BLOCKBYTES - S->buflen); /* Padding */ | ||||
|     blake2b_compress(S, S->buf); | ||||
|  | ||||
|     COMPILER_ASSERT(sizeof buffer == 64U); | ||||
|     STORE64_LE(buffer + 8 * 0, S->h[0]); | ||||
|     STORE64_LE(buffer + 8 * 1, S->h[1]); | ||||
|     STORE64_LE(buffer + 8 * 2, S->h[2]); | ||||
|     STORE64_LE(buffer + 8 * 3, S->h[3]); | ||||
|     STORE64_LE(buffer + 8 * 4, S->h[4]); | ||||
|     STORE64_LE(buffer + 8 * 5, S->h[5]); | ||||
|     STORE64_LE(buffer + 8 * 6, S->h[6]); | ||||
|     STORE64_LE(buffer + 8 * 7, S->h[7]); | ||||
|     memcpy(out, buffer, outlen); /* outlen <= BLAKE2B_OUTBYTES (64) */ | ||||
|  | ||||
|     sodium_memzero(S->h, sizeof S->h); | ||||
|     sodium_memzero(S->buf, sizeof S->buf); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* inlen, at least, should be uint64_t. Others can be size_t. */ | ||||
| int | ||||
| blake2b(uint8_t *out, const void *in, const void *key, const uint8_t outlen, | ||||
|         const uint64_t inlen, uint8_t keylen) | ||||
| { | ||||
|     CRYPTO_ALIGN(64) blake2b_state S[1]; | ||||
|  | ||||
|     /* Verify parameters */ | ||||
|     if (NULL == in && inlen > 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (NULL == out) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (!outlen || outlen > BLAKE2B_OUTBYTES) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (NULL == key && keylen > 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (keylen > BLAKE2B_KEYBYTES) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (keylen > 0) { | ||||
|         if (blake2b_init_key(S, outlen, key, keylen) < 0) { | ||||
|             sodium_misuse(); | ||||
|         } | ||||
|     } else { | ||||
|         if (blake2b_init(S, outlen) < 0) { | ||||
|             sodium_misuse(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     blake2b_update(S, (const uint8_t *) in, inlen); | ||||
|     blake2b_final(S, out, outlen); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_salt_personal(uint8_t *out, const void *in, const void *key, | ||||
|                       const uint8_t outlen, const uint64_t inlen, | ||||
|                       uint8_t keylen, const void *salt, const void *personal) | ||||
| { | ||||
|     CRYPTO_ALIGN(64) blake2b_state S[1]; | ||||
|  | ||||
|     /* Verify parameters */ | ||||
|     if (NULL == in && inlen > 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (NULL == out) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (!outlen || outlen > BLAKE2B_OUTBYTES) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (NULL == key && keylen > 0) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (keylen > BLAKE2B_KEYBYTES) { | ||||
|         sodium_misuse(); | ||||
|     } | ||||
|     if (keylen > 0) { | ||||
|         if (blake2b_init_key_salt_personal(S, outlen, key, keylen, salt, | ||||
|                                            personal) < 0) { | ||||
|             sodium_misuse(); | ||||
|         } | ||||
|     } else { | ||||
|         if (blake2b_init_salt_personal(S, outlen, salt, personal) < 0) { | ||||
|             sodium_misuse(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     blake2b_update(S, (const uint8_t *) in, inlen); | ||||
|     blake2b_final(S, out, outlen); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| blake2b_pick_best_implementation(void) | ||||
| { | ||||
| /* LCOV_EXCL_START */ | ||||
| #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_TMMINTRIN_H) && \ | ||||
|     defined(HAVE_SMMINTRIN_H) | ||||
|     if (sodium_runtime_has_avx2()) { | ||||
|         blake2b_compress = blake2b_compress_avx2; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && \ | ||||
|     defined(HAVE_SMMINTRIN_H) | ||||
|     if (sodium_runtime_has_sse41()) { | ||||
|         blake2b_compress = blake2b_compress_sse41; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) | ||||
|     if (sodium_runtime_has_ssse3()) { | ||||
|         blake2b_compress = blake2b_compress_ssse3; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
|     blake2b_compress = blake2b_compress_ref; | ||||
|  | ||||
|     return 0; | ||||
|     /* LCOV_EXCL_STOP */ | ||||
| } | ||||
							
								
								
									
										116
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								deps/libsodium/src/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
|  | ||||
| #include <assert.h> | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "blake2.h" | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "private/common.h" | ||||
| #include "private/implementations.h" | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b(unsigned char *out, size_t outlen, | ||||
|                            const unsigned char *in, unsigned long long inlen, | ||||
|                            const unsigned char *key, size_t keylen) | ||||
| { | ||||
|     if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES || | ||||
|         keylen > BLAKE2B_KEYBYTES || inlen > UINT64_MAX) { | ||||
|         return -1; | ||||
|     } | ||||
|     assert(outlen <= UINT8_MAX); | ||||
|     assert(keylen <= UINT8_MAX); | ||||
|  | ||||
|     return blake2b((uint8_t *) out, in, key, (uint8_t) outlen, (uint64_t) inlen, | ||||
|                    (uint8_t) keylen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b_salt_personal( | ||||
|     unsigned char *out, size_t outlen, const unsigned char *in, | ||||
|     unsigned long long inlen, const unsigned char *key, size_t keylen, | ||||
|     const unsigned char *salt, const unsigned char *personal) | ||||
| { | ||||
|     if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES || | ||||
|         keylen > BLAKE2B_KEYBYTES || inlen > UINT64_MAX) { | ||||
|         return -1; | ||||
|     } | ||||
|     assert(outlen <= UINT8_MAX); | ||||
|     assert(keylen <= UINT8_MAX); | ||||
|  | ||||
|     return blake2b_salt_personal((uint8_t *) out, in, key, (uint8_t) outlen, | ||||
|                                  (uint64_t) inlen, (uint8_t) keylen, salt, | ||||
|                                  personal); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, | ||||
|                                 const unsigned char *key, const size_t keylen, | ||||
|                                 const size_t outlen) | ||||
| { | ||||
|     if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES || | ||||
|         keylen > BLAKE2B_KEYBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     assert(outlen <= UINT8_MAX); | ||||
|     assert(keylen <= UINT8_MAX); | ||||
|     COMPILER_ASSERT(sizeof(blake2b_state) <= sizeof *state); | ||||
|     if (key == NULL || keylen <= 0U) { | ||||
|         if (blake2b_init((blake2b_state *) (void *) state, (uint8_t) outlen) != 0) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|     } else if (blake2b_init_key((blake2b_state *) (void *) state, (uint8_t) outlen, key, | ||||
|                                 (uint8_t) keylen) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b_init_salt_personal( | ||||
|     crypto_generichash_blake2b_state *state, const unsigned char *key, | ||||
|     const size_t keylen, const size_t outlen, const unsigned char *salt, | ||||
|     const unsigned char *personal) | ||||
| { | ||||
|     if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES || | ||||
|         keylen > BLAKE2B_KEYBYTES) { | ||||
|         return -1; | ||||
|     } | ||||
|     assert(outlen <= UINT8_MAX); | ||||
|     assert(keylen <= UINT8_MAX); | ||||
|     if (key == NULL || keylen <= 0U) { | ||||
|         if (blake2b_init_salt_personal((blake2b_state *) (void *) state, | ||||
|                                        (uint8_t) outlen, salt, personal) != 0) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|     } else if (blake2b_init_key_salt_personal((blake2b_state *) (void *) state, | ||||
|                                               (uint8_t) outlen, key, | ||||
|                                               (uint8_t) keylen, salt, | ||||
|                                               personal) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, | ||||
|                                   const unsigned char *in, | ||||
|                                   unsigned long long inlen) | ||||
| { | ||||
|     return blake2b_update((blake2b_state *) (void *) state, | ||||
|                           (const uint8_t *) in, (uint64_t) inlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, | ||||
|                                  unsigned char *out, const size_t outlen) | ||||
| { | ||||
|     assert(outlen <= UINT8_MAX); | ||||
|     return blake2b_final((blake2b_state *) (void *) state, | ||||
|                          (uint8_t *) out, (uint8_t) outlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| _crypto_generichash_blake2b_pick_best_implementation(void) | ||||
| { | ||||
|     return blake2b_pick_best_implementation(); | ||||
| } | ||||
							
								
								
									
										91
									
								
								deps/libsodium/src/libsodium/crypto_generichash/crypto_generichash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								deps/libsodium/src/libsodium/crypto_generichash/crypto_generichash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
|  | ||||
| #include "crypto_generichash.h" | ||||
| #include "randombytes.h" | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_bytes_min(void) | ||||
| { | ||||
|     return crypto_generichash_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_bytes_max(void) | ||||
| { | ||||
|     return crypto_generichash_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_bytes(void) | ||||
| { | ||||
|     return crypto_generichash_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_keybytes_min(void) | ||||
| { | ||||
|     return crypto_generichash_KEYBYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_keybytes_max(void) | ||||
| { | ||||
|     return crypto_generichash_KEYBYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_keybytes(void) | ||||
| { | ||||
|     return crypto_generichash_KEYBYTES; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_generichash_primitive(void) | ||||
| { | ||||
|     return crypto_generichash_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_generichash_statebytes(void) | ||||
| { | ||||
|     return (sizeof(crypto_generichash_state) + (size_t) 63U) & ~(size_t) 63U; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash(unsigned char *out, size_t outlen, const unsigned char *in, | ||||
|                    unsigned long long inlen, const unsigned char *key, | ||||
|                    size_t keylen) | ||||
| { | ||||
|     return crypto_generichash_blake2b(out, outlen, in, inlen, key, keylen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_init(crypto_generichash_state *state, | ||||
|                         const unsigned char *key, | ||||
|                         const size_t keylen, const size_t outlen) | ||||
| { | ||||
|     return crypto_generichash_blake2b_init | ||||
|         ((crypto_generichash_blake2b_state *) state, key, keylen, outlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_update(crypto_generichash_state *state, | ||||
|                           const unsigned char *in, | ||||
|                           unsigned long long inlen) | ||||
| { | ||||
|     return crypto_generichash_blake2b_update | ||||
|         ((crypto_generichash_blake2b_state *) state, in, inlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_generichash_final(crypto_generichash_state *state, | ||||
|                          unsigned char *out, const size_t outlen) | ||||
| { | ||||
|     return crypto_generichash_blake2b_final | ||||
|         ((crypto_generichash_blake2b_state *) state, out, outlen); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_generichash_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										20
									
								
								deps/libsodium/src/libsodium/crypto_hash/crypto_hash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								deps/libsodium/src/libsodium/crypto_hash/crypto_hash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
|  | ||||
| #include "crypto_hash.h" | ||||
|  | ||||
| size_t | ||||
| crypto_hash_bytes(void) | ||||
| { | ||||
|     return crypto_hash_BYTES; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash(unsigned char *out, const unsigned char *in, | ||||
|             unsigned long long inlen) | ||||
| { | ||||
|     return crypto_hash_sha512(out, in, inlen); | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_hash_primitive(void) { | ||||
|     return crypto_hash_PRIMITIVE; | ||||
| } | ||||
							
								
								
									
										254
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,254 @@ | ||||
|  | ||||
| /*- | ||||
|  * 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 <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "crypto_hash_sha256.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static void | ||||
| be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < len / 4; i++) { | ||||
|         STORE32_BE(dst + i * 4, src[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| 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] = LOAD32_BE(src + i * 4); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const uint32_t Krnd[64] = { | ||||
|     0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, | ||||
|     0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, | ||||
|     0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, | ||||
|     0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, | ||||
|     0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, | ||||
|     0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, | ||||
|     0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, | ||||
|     0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, | ||||
|     0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, | ||||
|     0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, | ||||
|     0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 | ||||
| }; | ||||
|  | ||||
| #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) ROTR32(x, 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)) | ||||
|  | ||||
| #define RND(a, b, c, d, e, f, g, h, k) \ | ||||
|     h += S1(e) + Ch(e, f, g) + k;      \ | ||||
|     d += h;                            \ | ||||
|     h += S0(a) + Maj(a, b, c); | ||||
|  | ||||
| #define RNDr(S, W, i, ii)                                                   \ | ||||
|     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 + ii] + Krnd[i + ii]) | ||||
|  | ||||
| #define MSCH(W, ii, i) \ | ||||
|     W[i + ii + 16] =   \ | ||||
|         s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii] | ||||
|  | ||||
| static void | ||||
| SHA256_Transform(uint32_t state[8], const uint8_t block[64], uint32_t W[64], | ||||
|                  uint32_t S[8]) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     be32dec_vect(W, block, 64); | ||||
|     memcpy(S, state, 32); | ||||
|     for (i = 0; i < 64; i += 16) { | ||||
|         RNDr(S, W, 0, i); | ||||
|         RNDr(S, W, 1, i); | ||||
|         RNDr(S, W, 2, i); | ||||
|         RNDr(S, W, 3, i); | ||||
|         RNDr(S, W, 4, i); | ||||
|         RNDr(S, W, 5, i); | ||||
|         RNDr(S, W, 6, i); | ||||
|         RNDr(S, W, 7, i); | ||||
|         RNDr(S, W, 8, i); | ||||
|         RNDr(S, W, 9, i); | ||||
|         RNDr(S, W, 10, i); | ||||
|         RNDr(S, W, 11, i); | ||||
|         RNDr(S, W, 12, i); | ||||
|         RNDr(S, W, 13, i); | ||||
|         RNDr(S, W, 14, i); | ||||
|         RNDr(S, W, 15, i); | ||||
|         if (i == 48) { | ||||
|             break; | ||||
|         } | ||||
|         MSCH(W, 0, i); | ||||
|         MSCH(W, 1, i); | ||||
|         MSCH(W, 2, i); | ||||
|         MSCH(W, 3, i); | ||||
|         MSCH(W, 4, i); | ||||
|         MSCH(W, 5, i); | ||||
|         MSCH(W, 6, i); | ||||
|         MSCH(W, 7, i); | ||||
|         MSCH(W, 8, i); | ||||
|         MSCH(W, 9, i); | ||||
|         MSCH(W, 10, i); | ||||
|         MSCH(W, 11, i); | ||||
|         MSCH(W, 12, i); | ||||
|         MSCH(W, 13, i); | ||||
|         MSCH(W, 14, i); | ||||
|         MSCH(W, 15, i); | ||||
|     } | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         state[i] += S[i]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const uint8_t 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 }; | ||||
|  | ||||
| static void | ||||
| SHA256_Pad(crypto_hash_sha256_state *state, uint32_t tmp32[64 + 8]) | ||||
| { | ||||
|     unsigned int r; | ||||
|     unsigned int i; | ||||
|  | ||||
|     r = (unsigned int) ((state->count >> 3) & 0x3f); | ||||
|     if (r < 56) { | ||||
|         for (i = 0; i < 56 - r; i++) { | ||||
|             state->buf[r + i] = PAD[i]; | ||||
|         } | ||||
|     } else { | ||||
|         for (i = 0; i < 64 - r; i++) { | ||||
|             state->buf[r + i] = PAD[i]; | ||||
|         } | ||||
|         SHA256_Transform(state->state, state->buf, &tmp32[0], &tmp32[64]); | ||||
|         memset(&state->buf[0], 0, 56); | ||||
|     } | ||||
|     STORE64_BE(&state->buf[56], state->count); | ||||
|     SHA256_Transform(state->state, state->buf, &tmp32[0], &tmp32[64]); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha256_init(crypto_hash_sha256_state *state) | ||||
| { | ||||
|     static const uint32_t sha256_initial_state[8] = { 0x6a09e667, 0xbb67ae85, | ||||
|                                                       0x3c6ef372, 0xa54ff53a, | ||||
|                                                       0x510e527f, 0x9b05688c, | ||||
|                                                       0x1f83d9ab, 0x5be0cd19 }; | ||||
|  | ||||
|     state->count = (uint64_t) 0U; | ||||
|     memcpy(state->state, sha256_initial_state, sizeof sha256_initial_state); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha256_update(crypto_hash_sha256_state *state, | ||||
|                           const unsigned char *in, unsigned long long inlen) | ||||
| { | ||||
|     uint32_t           tmp32[64 + 8]; | ||||
|     unsigned long long i; | ||||
|     unsigned long long r; | ||||
|  | ||||
|     if (inlen <= 0U) { | ||||
|         return 0; | ||||
|     } | ||||
|     r = (unsigned long long) ((state->count >> 3) & 0x3f); | ||||
|  | ||||
|     state->count += ((uint64_t) inlen) << 3; | ||||
|     if (inlen < 64 - r) { | ||||
|         for (i = 0; i < inlen; i++) { | ||||
|             state->buf[r + i] = in[i]; | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
|     for (i = 0; i < 64 - r; i++) { | ||||
|         state->buf[r + i] = in[i]; | ||||
|     } | ||||
|     SHA256_Transform(state->state, state->buf, &tmp32[0], &tmp32[64]); | ||||
|     in += 64 - r; | ||||
|     inlen -= 64 - r; | ||||
|  | ||||
|     while (inlen >= 64) { | ||||
|         SHA256_Transform(state->state, in, &tmp32[0], &tmp32[64]); | ||||
|         in += 64; | ||||
|         inlen -= 64; | ||||
|     } | ||||
|     inlen &= 63; | ||||
|     for (i = 0; i < inlen; i++) { | ||||
|         state->buf[i] = in[i]; | ||||
|     } | ||||
|     sodium_memzero((void *) tmp32, sizeof tmp32); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha256_final(crypto_hash_sha256_state *state, unsigned char *out) | ||||
| { | ||||
|     uint32_t tmp32[64 + 8]; | ||||
|  | ||||
|     SHA256_Pad(state, tmp32); | ||||
|     be32enc_vect(out, state->state, 32); | ||||
|     sodium_memzero((void *) tmp32, sizeof tmp32); | ||||
|     sodium_memzero((void *) state, sizeof *state); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha256(unsigned char *out, const unsigned char *in, | ||||
|                    unsigned long long inlen) | ||||
| { | ||||
|     crypto_hash_sha256_state state; | ||||
|  | ||||
|     crypto_hash_sha256_init(&state); | ||||
|     crypto_hash_sha256_update(&state, in, inlen); | ||||
|     crypto_hash_sha256_final(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										13
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha256/hash_sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha256/hash_sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #include "crypto_hash_sha256.h" | ||||
|  | ||||
| size_t | ||||
| crypto_hash_sha256_bytes(void) | ||||
| { | ||||
|     return crypto_hash_sha256_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_hash_sha256_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_hash_sha256_state); | ||||
| } | ||||
							
								
								
									
										282
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha512/cp/hash_sha512_cp.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha512/cp/hash_sha512_cp.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,282 @@ | ||||
|  | ||||
| /*- | ||||
|  * 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 <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "crypto_hash_sha512.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static void | ||||
| be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < len / 8; i++) { | ||||
|         STORE64_BE(dst + i * 8, src[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < len / 8; i++) { | ||||
|         dst[i] = LOAD64_BE(src + i * 8); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const uint64_t Krnd[80] = { | ||||
|     0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, | ||||
|     0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, | ||||
|     0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, | ||||
|     0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, | ||||
|     0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, | ||||
|     0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, | ||||
|     0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, | ||||
|     0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, | ||||
|     0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, | ||||
|     0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, | ||||
|     0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, | ||||
|     0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, | ||||
|     0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, | ||||
|     0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, | ||||
|     0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, | ||||
|     0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, | ||||
|     0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, | ||||
|     0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, | ||||
|     0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, | ||||
|     0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, | ||||
|     0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, | ||||
|     0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, | ||||
|     0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, | ||||
|     0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, | ||||
|     0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, | ||||
|     0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, | ||||
|     0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL | ||||
| }; | ||||
|  | ||||
| #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) ROTR64(x, n) | ||||
| #define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) | ||||
| #define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) | ||||
| #define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) | ||||
| #define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6)) | ||||
|  | ||||
| #define RND(a, b, c, d, e, f, g, h, k) \ | ||||
|     h += S1(e) + Ch(e, f, g) + k;      \ | ||||
|     d += h;                            \ | ||||
|     h += S0(a) + Maj(a, b, c); | ||||
|  | ||||
| #define RNDr(S, W, i, ii)                                                   \ | ||||
|     RND(S[(80 - i) % 8], S[(81 - i) % 8], S[(82 - i) % 8], S[(83 - i) % 8], \ | ||||
|         S[(84 - i) % 8], S[(85 - i) % 8], S[(86 - i) % 8], S[(87 - i) % 8], \ | ||||
|         W[i + ii] + Krnd[i + ii]) | ||||
|  | ||||
| #define MSCH(W, ii, i) \ | ||||
|     W[i + ii + 16] =   \ | ||||
|         s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii] | ||||
|  | ||||
| static void | ||||
| SHA512_Transform(uint64_t *state, const uint8_t block[128], uint64_t W[80], | ||||
|                  uint64_t S[8]) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     be64dec_vect(W, block, 128); | ||||
|     memcpy(S, state, 64); | ||||
|     for (i = 0; i < 80; i += 16) { | ||||
|         RNDr(S, W, 0, i); | ||||
|         RNDr(S, W, 1, i); | ||||
|         RNDr(S, W, 2, i); | ||||
|         RNDr(S, W, 3, i); | ||||
|         RNDr(S, W, 4, i); | ||||
|         RNDr(S, W, 5, i); | ||||
|         RNDr(S, W, 6, i); | ||||
|         RNDr(S, W, 7, i); | ||||
|         RNDr(S, W, 8, i); | ||||
|         RNDr(S, W, 9, i); | ||||
|         RNDr(S, W, 10, i); | ||||
|         RNDr(S, W, 11, i); | ||||
|         RNDr(S, W, 12, i); | ||||
|         RNDr(S, W, 13, i); | ||||
|         RNDr(S, W, 14, i); | ||||
|         RNDr(S, W, 15, i); | ||||
|         if (i == 64) { | ||||
|             break; | ||||
|         } | ||||
|         MSCH(W, 0, i); | ||||
|         MSCH(W, 1, i); | ||||
|         MSCH(W, 2, i); | ||||
|         MSCH(W, 3, i); | ||||
|         MSCH(W, 4, i); | ||||
|         MSCH(W, 5, i); | ||||
|         MSCH(W, 6, i); | ||||
|         MSCH(W, 7, i); | ||||
|         MSCH(W, 8, i); | ||||
|         MSCH(W, 9, i); | ||||
|         MSCH(W, 10, i); | ||||
|         MSCH(W, 11, i); | ||||
|         MSCH(W, 12, i); | ||||
|         MSCH(W, 13, i); | ||||
|         MSCH(W, 14, i); | ||||
|         MSCH(W, 15, i); | ||||
|     } | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         state[i] += S[i]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const uint8_t PAD[128] = { | ||||
|     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, 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, 0 | ||||
| }; | ||||
|  | ||||
| static void | ||||
| SHA512_Pad(crypto_hash_sha512_state *state, uint64_t tmp64[80 + 8]) | ||||
| { | ||||
|     unsigned int r; | ||||
|     unsigned int i; | ||||
|  | ||||
|     r = (unsigned int) ((state->count[1] >> 3) & 0x7f); | ||||
|     if (r < 112) { | ||||
|         for (i = 0; i < 112 - r; i++) { | ||||
|             state->buf[r + i] = PAD[i]; | ||||
|         } | ||||
|     } else { | ||||
|         for (i = 0; i < 128 - r; i++) { | ||||
|             state->buf[r + i] = PAD[i]; | ||||
|         } | ||||
|         SHA512_Transform(state->state, state->buf, &tmp64[0], &tmp64[80]); | ||||
|         memset(&state->buf[0], 0, 112); | ||||
|     } | ||||
|     be64enc_vect(&state->buf[112], state->count, 16); | ||||
|     SHA512_Transform(state->state, state->buf, &tmp64[0], &tmp64[80]); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha512_init(crypto_hash_sha512_state *state) | ||||
| { | ||||
|     static const uint64_t sha512_initial_state[8] = { | ||||
|         0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, | ||||
|         0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | ||||
|         0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | ||||
|     }; | ||||
|  | ||||
|     state->count[0] = state->count[1] = (uint64_t) 0U; | ||||
|     memcpy(state->state, sha512_initial_state, sizeof sha512_initial_state); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha512_update(crypto_hash_sha512_state *state, | ||||
|                           const unsigned char *in, unsigned long long inlen) | ||||
| { | ||||
|     uint64_t           tmp64[80 + 8]; | ||||
|     uint64_t           bitlen[2]; | ||||
|     unsigned long long i; | ||||
|     unsigned long long r; | ||||
|  | ||||
|     if (inlen <= 0U) { | ||||
|         return 0; | ||||
|     } | ||||
|     r = (unsigned long long) ((state->count[1] >> 3) & 0x7f); | ||||
|  | ||||
|     bitlen[1] = ((uint64_t) inlen) << 3; | ||||
|     bitlen[0] = ((uint64_t) inlen) >> 61; | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if ((state->count[1] += bitlen[1]) < bitlen[1]) { | ||||
|         state->count[0]++; | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|     state->count[0] += bitlen[0]; | ||||
|     if (inlen < 128 - r) { | ||||
|         for (i = 0; i < inlen; i++) { | ||||
|             state->buf[r + i] = in[i]; | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
|     for (i = 0; i < 128 - r; i++) { | ||||
|         state->buf[r + i] = in[i]; | ||||
|     } | ||||
|     SHA512_Transform(state->state, state->buf, &tmp64[0], &tmp64[80]); | ||||
|     in += 128 - r; | ||||
|     inlen -= 128 - r; | ||||
|  | ||||
|     while (inlen >= 128) { | ||||
|         SHA512_Transform(state->state, in, &tmp64[0], &tmp64[80]); | ||||
|         in += 128; | ||||
|         inlen -= 128; | ||||
|     } | ||||
|     inlen &= 127; | ||||
|     for (i = 0; i < inlen; i++) { | ||||
|         state->buf[i] = in[i]; | ||||
|     } | ||||
|     sodium_memzero((void *) tmp64, sizeof tmp64); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha512_final(crypto_hash_sha512_state *state, unsigned char *out) | ||||
| { | ||||
|     uint64_t tmp64[80 + 8]; | ||||
|  | ||||
|     SHA512_Pad(state, tmp64); | ||||
|     be64enc_vect(out, state->state, 64); | ||||
|     sodium_memzero((void *) tmp64, sizeof tmp64); | ||||
|     sodium_memzero((void *) state, sizeof *state); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_hash_sha512(unsigned char *out, const unsigned char *in, | ||||
|                    unsigned long long inlen) | ||||
| { | ||||
|     crypto_hash_sha512_state state; | ||||
|  | ||||
|     crypto_hash_sha512_init(&state); | ||||
|     crypto_hash_sha512_update(&state, in, inlen); | ||||
|     crypto_hash_sha512_final(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										13
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha512/hash_sha512.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deps/libsodium/src/libsodium/crypto_hash/sha512/hash_sha512.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #include "crypto_hash_sha512.h" | ||||
|  | ||||
| size_t | ||||
| crypto_hash_sha512_bytes(void) | ||||
| { | ||||
|     return crypto_hash_sha512_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_hash_sha512_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_hash_sha512_state); | ||||
| } | ||||
							
								
								
									
										52
									
								
								deps/libsodium/src/libsodium/crypto_kdf/blake2b/kdf_blake2b.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								deps/libsodium/src/libsodium/crypto_kdf/blake2b/kdf_blake2b.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| #include <errno.h> | ||||
|  | ||||
| #include "crypto_kdf_blake2b.h" | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_blake2b_bytes_min(void) | ||||
| { | ||||
|     return crypto_kdf_blake2b_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_blake2b_bytes_max(void) | ||||
| { | ||||
|     return crypto_kdf_blake2b_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_blake2b_contextbytes(void) | ||||
| { | ||||
|     return crypto_kdf_blake2b_CONTEXTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_blake2b_keybytes(void) | ||||
| { | ||||
|     return crypto_kdf_blake2b_KEYBYTES; | ||||
| } | ||||
|  | ||||
| int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, | ||||
|                                        uint64_t subkey_id, | ||||
|                                        const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], | ||||
|                                        const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) | ||||
| { | ||||
|     unsigned char ctx_padded[crypto_generichash_blake2b_PERSONALBYTES]; | ||||
|     unsigned char salt[crypto_generichash_blake2b_SALTBYTES]; | ||||
|  | ||||
|     memcpy(ctx_padded, ctx, crypto_kdf_blake2b_CONTEXTBYTES); | ||||
|     memset(ctx_padded + crypto_kdf_blake2b_CONTEXTBYTES, 0, sizeof ctx_padded - crypto_kdf_blake2b_CONTEXTBYTES); | ||||
|     STORE64_LE(salt, subkey_id); | ||||
|     memset(salt + 8, 0, (sizeof salt) - 8); | ||||
|     if (subkey_len < crypto_kdf_blake2b_BYTES_MIN || | ||||
|         subkey_len > crypto_kdf_blake2b_BYTES_MAX) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_generichash_blake2b_salt_personal(subkey, subkey_len, | ||||
|                                                     NULL, 0, | ||||
|                                                     key, crypto_kdf_blake2b_KEYBYTES, | ||||
|                                                     salt, ctx_padded); | ||||
| } | ||||
							
								
								
									
										49
									
								
								deps/libsodium/src/libsodium/crypto_kdf/crypto_kdf.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								deps/libsodium/src/libsodium/crypto_kdf/crypto_kdf.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
|  | ||||
| #include "crypto_kdf.h" | ||||
| #include "randombytes.h" | ||||
|  | ||||
| const char * | ||||
| crypto_kdf_primitive(void) | ||||
| { | ||||
|     return crypto_kdf_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_bytes_min(void) | ||||
| { | ||||
|     return crypto_kdf_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_bytes_max(void) | ||||
| { | ||||
|     return crypto_kdf_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_contextbytes(void) | ||||
| { | ||||
|     return crypto_kdf_CONTEXTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kdf_keybytes(void) | ||||
| { | ||||
|     return crypto_kdf_KEYBYTES; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, | ||||
|                            uint64_t subkey_id, | ||||
|                            const char ctx[crypto_kdf_CONTEXTBYTES], | ||||
|                            const unsigned char key[crypto_kdf_KEYBYTES]) | ||||
| { | ||||
|     return crypto_kdf_blake2b_derive_from_key(subkey, subkey_len, | ||||
|                                               subkey_id, ctx, key); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_kdf_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										143
									
								
								deps/libsodium/src/libsodium/crypto_kx/crypto_kx.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								deps/libsodium/src/libsodium/crypto_kx/crypto_kx.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
|  | ||||
| #include <stddef.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_generichash.h" | ||||
| #include "crypto_kx.h" | ||||
| #include "crypto_scalarmult.h" | ||||
| #include "private/common.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| int | ||||
| crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], | ||||
|                        unsigned char sk[crypto_kx_SECRETKEYBYTES], | ||||
|                        const unsigned char seed[crypto_kx_SEEDBYTES]) | ||||
| { | ||||
|     crypto_generichash(sk, crypto_kx_SECRETKEYBYTES, | ||||
|                        seed, crypto_kx_SEEDBYTES, NULL, 0); | ||||
|     return crypto_scalarmult_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], | ||||
|                   unsigned char sk[crypto_kx_SECRETKEYBYTES]) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_kx_SECRETKEYBYTES == crypto_scalarmult_SCALARBYTES); | ||||
|     COMPILER_ASSERT(crypto_kx_PUBLICKEYBYTES == crypto_scalarmult_BYTES); | ||||
|  | ||||
|     randombytes_buf(sk, crypto_kx_SECRETKEYBYTES); | ||||
|     return crypto_scalarmult_base(pk, sk); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], | ||||
|                               unsigned char tx[crypto_kx_SESSIONKEYBYTES], | ||||
|                               const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], | ||||
|                               const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], | ||||
|                               const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) | ||||
| { | ||||
|     crypto_generichash_state h; | ||||
|     unsigned char            q[crypto_scalarmult_BYTES]; | ||||
|     unsigned char            keys[2 * crypto_kx_SESSIONKEYBYTES]; | ||||
|     int                      i; | ||||
|  | ||||
|     if (rx == NULL) { | ||||
|         rx = tx; | ||||
|     } | ||||
|     if (tx == NULL) { | ||||
|         tx = rx; | ||||
|     } | ||||
|     if (rx == NULL) { | ||||
|         sodium_misuse(); /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (crypto_scalarmult(q, client_sk, server_pk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     COMPILER_ASSERT(sizeof keys <= crypto_generichash_BYTES_MAX); | ||||
|     crypto_generichash_init(&h, NULL, 0U, sizeof keys); | ||||
|     crypto_generichash_update(&h, q, crypto_scalarmult_BYTES); | ||||
|     sodium_memzero(q, sizeof q); | ||||
|     crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES); | ||||
|     crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES); | ||||
|     crypto_generichash_final(&h, keys, sizeof keys); | ||||
|     sodium_memzero(&h, sizeof h); | ||||
|     for (i = 0; i < crypto_kx_SESSIONKEYBYTES; i++) { | ||||
|         rx[i] = keys[i]; /* rx cannot be NULL */ | ||||
|         tx[i] = keys[i + crypto_kx_SESSIONKEYBYTES]; /* tx cannot be NULL */ | ||||
|     } | ||||
|     sodium_memzero(keys, sizeof keys); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], | ||||
|                               unsigned char tx[crypto_kx_SESSIONKEYBYTES], | ||||
|                               const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], | ||||
|                               const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], | ||||
|                               const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) | ||||
| { | ||||
|     crypto_generichash_state h; | ||||
|     unsigned char            q[crypto_scalarmult_BYTES]; | ||||
|     unsigned char            keys[2 * crypto_kx_SESSIONKEYBYTES]; | ||||
|     int                      i; | ||||
|  | ||||
|     if (rx == NULL) { | ||||
|         rx = tx; | ||||
|     } | ||||
|     if (tx == NULL) { | ||||
|         tx = rx; | ||||
|     } | ||||
|     if (rx == NULL) { | ||||
|         sodium_misuse(); /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (crypto_scalarmult(q, server_sk, client_pk) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|     COMPILER_ASSERT(sizeof keys <= crypto_generichash_BYTES_MAX); | ||||
|     crypto_generichash_init(&h, NULL, 0U, sizeof keys); | ||||
|     crypto_generichash_update(&h, q, crypto_scalarmult_BYTES); | ||||
|     sodium_memzero(q, sizeof q); | ||||
|     crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES); | ||||
|     crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES); | ||||
|     crypto_generichash_final(&h, keys, sizeof keys); | ||||
|     sodium_memzero(&h, sizeof h); | ||||
|     for (i = 0; i < crypto_kx_SESSIONKEYBYTES; i++) { | ||||
|         tx[i] = keys[i]; | ||||
|         rx[i] = keys[i + crypto_kx_SESSIONKEYBYTES]; | ||||
|     } | ||||
|     sodium_memzero(keys, sizeof keys); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kx_publickeybytes(void) | ||||
| { | ||||
|     return crypto_kx_PUBLICKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kx_secretkeybytes(void) | ||||
| { | ||||
|     return crypto_kx_SECRETKEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kx_seedbytes(void) | ||||
| { | ||||
|     return crypto_kx_SEEDBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_kx_sessionkeybytes(void) | ||||
| { | ||||
|     return crypto_kx_SESSIONKEYBYTES; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_kx_primitive(void) | ||||
| { | ||||
|     return crypto_kx_PRIMITIVE; | ||||
| } | ||||
							
								
								
									
										71
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/crypto_onetimeauth.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/crypto_onetimeauth.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
|  | ||||
| #include "crypto_onetimeauth.h" | ||||
| #include "randombytes.h" | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_onetimeauth_state); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_bytes(void) | ||||
| { | ||||
|     return crypto_onetimeauth_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_keybytes(void) | ||||
| { | ||||
|     return crypto_onetimeauth_KEYBYTES; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth(unsigned char *out, const unsigned char *in, | ||||
|                    unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305(out, in, inlen, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, | ||||
|                           unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_verify(h, in, inlen, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_init(crypto_onetimeauth_state *state, | ||||
|                         const unsigned char *key) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_init | ||||
|         ((crypto_onetimeauth_poly1305_state *) state, key); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_update(crypto_onetimeauth_state *state, | ||||
|                           const unsigned char *in, | ||||
|                           unsigned long long inlen) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_update | ||||
|         ((crypto_onetimeauth_poly1305_state *) state, in, inlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_final(crypto_onetimeauth_state *state, | ||||
|                          unsigned char *out) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_final | ||||
|         ((crypto_onetimeauth_poly1305_state *) state, out); | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_onetimeauth_primitive(void) | ||||
| { | ||||
|     return crypto_onetimeauth_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_onetimeauth_KEYBYTES); | ||||
| } | ||||
							
								
								
									
										124
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
|  | ||||
| #include "poly1305_donna.h" | ||||
| #include "crypto_verify_16.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #ifdef HAVE_TI_MODE | ||||
| #include "poly1305_donna64.h" | ||||
| #else | ||||
| #include "poly1305_donna32.h" | ||||
| #endif | ||||
| #include "../onetimeauth_poly1305.h" | ||||
|  | ||||
| static void | ||||
| poly1305_update(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                 unsigned long long bytes) | ||||
| { | ||||
|     unsigned long long i; | ||||
|  | ||||
|     /* handle leftover */ | ||||
|     if (st->leftover) { | ||||
|         unsigned long long want = (poly1305_block_size - st->leftover); | ||||
|  | ||||
|         if (want > bytes) { | ||||
|             want = bytes; | ||||
|         } | ||||
|         for (i = 0; i < want; i++) { | ||||
|             st->buffer[st->leftover + i] = m[i]; | ||||
|         } | ||||
|         bytes -= want; | ||||
|         m += want; | ||||
|         st->leftover += want; | ||||
|         if (st->leftover < poly1305_block_size) { | ||||
|             return; | ||||
|         } | ||||
|         poly1305_blocks(st, st->buffer, poly1305_block_size); | ||||
|         st->leftover = 0; | ||||
|     } | ||||
|  | ||||
|     /* process full blocks */ | ||||
|     if (bytes >= poly1305_block_size) { | ||||
|         unsigned long long want = (bytes & ~(poly1305_block_size - 1)); | ||||
|  | ||||
|         poly1305_blocks(st, m, want); | ||||
|         m += want; | ||||
|         bytes -= want; | ||||
|     } | ||||
|  | ||||
|     /* store leftover */ | ||||
|     if (bytes) { | ||||
|         for (i = 0; i < bytes; i++) { | ||||
|             st->buffer[st->leftover + i] = m[i]; | ||||
|         } | ||||
|         st->leftover += bytes; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_donna(unsigned char *out, const unsigned char *m, | ||||
|                                   unsigned long long   inlen, | ||||
|                                   const unsigned char *key) | ||||
| { | ||||
|     CRYPTO_ALIGN(64) poly1305_state_internal_t state; | ||||
|  | ||||
|     poly1305_init(&state, key); | ||||
|     poly1305_update(&state, m, inlen); | ||||
|     poly1305_finish(&state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_donna_init(crypto_onetimeauth_poly1305_state *state, | ||||
|                                        const unsigned char *key) | ||||
| { | ||||
|     COMPILER_ASSERT(sizeof(crypto_onetimeauth_poly1305_state) >= | ||||
|         sizeof(poly1305_state_internal_t)); | ||||
|     poly1305_init((poly1305_state_internal_t *) (void *) state, key); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_donna_update( | ||||
|     crypto_onetimeauth_poly1305_state *state, const unsigned char *in, | ||||
|     unsigned long long inlen) | ||||
| { | ||||
|     poly1305_update((poly1305_state_internal_t *) (void *) state, in, inlen); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_donna_final( | ||||
|     crypto_onetimeauth_poly1305_state *state, unsigned char *out) | ||||
| { | ||||
|     poly1305_finish((poly1305_state_internal_t *) (void *) state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_donna_verify(const unsigned char *h, | ||||
|                                          const unsigned char *in, | ||||
|                                          unsigned long long   inlen, | ||||
|                                          const unsigned char *k) | ||||
| { | ||||
|     unsigned char correct[16]; | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_donna(correct, in, inlen, k); | ||||
|  | ||||
|     return crypto_verify_16(h, correct); | ||||
| } | ||||
|  | ||||
| struct crypto_onetimeauth_poly1305_implementation | ||||
|     crypto_onetimeauth_poly1305_donna_implementation = { | ||||
|         SODIUM_C99(.onetimeauth =) crypto_onetimeauth_poly1305_donna, | ||||
|         SODIUM_C99(.onetimeauth_verify =) | ||||
|             crypto_onetimeauth_poly1305_donna_verify, | ||||
|         SODIUM_C99(.onetimeauth_init =) crypto_onetimeauth_poly1305_donna_init, | ||||
|         SODIUM_C99(.onetimeauth_update =) | ||||
|             crypto_onetimeauth_poly1305_donna_update, | ||||
|         SODIUM_C99(.onetimeauth_final =) crypto_onetimeauth_poly1305_donna_final | ||||
|     }; | ||||
							
								
								
									
										12
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #ifndef poly1305_donna_H | ||||
| #define poly1305_donna_H | ||||
|  | ||||
| #include <stddef.h> | ||||
|  | ||||
| #include "../onetimeauth_poly1305.h" | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
|  | ||||
| extern struct crypto_onetimeauth_poly1305_implementation | ||||
|     crypto_onetimeauth_poly1305_donna_implementation; | ||||
|  | ||||
| #endif /* poly1305_donna_H */ | ||||
							
								
								
									
										235
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna32.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna32.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| /* | ||||
|    poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication | ||||
|    and 64 bit addition | ||||
| */ | ||||
|  | ||||
| #if defined(_MSC_VER) | ||||
| # define POLY1305_NOINLINE __declspec(noinline) | ||||
| #elif defined(__clang__) || defined(__GNUC__) | ||||
| # define POLY1305_NOINLINE __attribute__((noinline)) | ||||
| #else | ||||
| # define POLY1305_NOINLINE | ||||
| #endif | ||||
|  | ||||
| #include "private/common.h" | ||||
|  | ||||
| #define poly1305_block_size 16 | ||||
|  | ||||
| /* 17 + sizeof(unsigned long long) + 14*sizeof(unsigned long) */ | ||||
| typedef struct poly1305_state_internal_t { | ||||
|     unsigned long      r[5]; | ||||
|     unsigned long      h[5]; | ||||
|     unsigned long      pad[4]; | ||||
|     unsigned long long leftover; | ||||
|     unsigned char      buffer[poly1305_block_size]; | ||||
|     unsigned char      final; | ||||
| } poly1305_state_internal_t; | ||||
|  | ||||
| static void | ||||
| poly1305_init(poly1305_state_internal_t *st, const unsigned char key[32]) | ||||
| { | ||||
|     /* r &= 0xffffffc0ffffffc0ffffffc0fffffff - wiped after finalization */ | ||||
|     st->r[0] = (LOAD32_LE(&key[0])) & 0x3ffffff; | ||||
|     st->r[1] = (LOAD32_LE(&key[3]) >> 2) & 0x3ffff03; | ||||
|     st->r[2] = (LOAD32_LE(&key[6]) >> 4) & 0x3ffc0ff; | ||||
|     st->r[3] = (LOAD32_LE(&key[9]) >> 6) & 0x3f03fff; | ||||
|     st->r[4] = (LOAD32_LE(&key[12]) >> 8) & 0x00fffff; | ||||
|  | ||||
|     /* h = 0 */ | ||||
|     st->h[0] = 0; | ||||
|     st->h[1] = 0; | ||||
|     st->h[2] = 0; | ||||
|     st->h[3] = 0; | ||||
|     st->h[4] = 0; | ||||
|  | ||||
|     /* save pad for later */ | ||||
|     st->pad[0] = LOAD32_LE(&key[16]); | ||||
|     st->pad[1] = LOAD32_LE(&key[20]); | ||||
|     st->pad[2] = LOAD32_LE(&key[24]); | ||||
|     st->pad[3] = LOAD32_LE(&key[28]); | ||||
|  | ||||
|     st->leftover = 0; | ||||
|     st->final    = 0; | ||||
| } | ||||
|  | ||||
| static void | ||||
| poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                 unsigned long long bytes) | ||||
| { | ||||
|     const unsigned long hibit = (st->final) ? 0UL : (1UL << 24); /* 1 << 128 */ | ||||
|     unsigned long       r0, r1, r2, r3, r4; | ||||
|     unsigned long       s1, s2, s3, s4; | ||||
|     unsigned long       h0, h1, h2, h3, h4; | ||||
|     unsigned long long  d0, d1, d2, d3, d4; | ||||
|     unsigned long       c; | ||||
|  | ||||
|     r0 = st->r[0]; | ||||
|     r1 = st->r[1]; | ||||
|     r2 = st->r[2]; | ||||
|     r3 = st->r[3]; | ||||
|     r4 = st->r[4]; | ||||
|  | ||||
|     s1 = r1 * 5; | ||||
|     s2 = r2 * 5; | ||||
|     s3 = r3 * 5; | ||||
|     s4 = r4 * 5; | ||||
|  | ||||
|     h0 = st->h[0]; | ||||
|     h1 = st->h[1]; | ||||
|     h2 = st->h[2]; | ||||
|     h3 = st->h[3]; | ||||
|     h4 = st->h[4]; | ||||
|  | ||||
|     while (bytes >= poly1305_block_size) { | ||||
|         /* h += m[i] */ | ||||
|         h0 += (LOAD32_LE(m + 0)) & 0x3ffffff; | ||||
|         h1 += (LOAD32_LE(m + 3) >> 2) & 0x3ffffff; | ||||
|         h2 += (LOAD32_LE(m + 6) >> 4) & 0x3ffffff; | ||||
|         h3 += (LOAD32_LE(m + 9) >> 6) & 0x3ffffff; | ||||
|         h4 += (LOAD32_LE(m + 12) >> 8) | hibit; | ||||
|  | ||||
|         /* h *= r */ | ||||
|         d0 = ((unsigned long long) h0 * r0) + ((unsigned long long) h1 * s4) + | ||||
|              ((unsigned long long) h2 * s3) + ((unsigned long long) h3 * s2) + | ||||
|              ((unsigned long long) h4 * s1); | ||||
|         d1 = ((unsigned long long) h0 * r1) + ((unsigned long long) h1 * r0) + | ||||
|              ((unsigned long long) h2 * s4) + ((unsigned long long) h3 * s3) + | ||||
|              ((unsigned long long) h4 * s2); | ||||
|         d2 = ((unsigned long long) h0 * r2) + ((unsigned long long) h1 * r1) + | ||||
|              ((unsigned long long) h2 * r0) + ((unsigned long long) h3 * s4) + | ||||
|              ((unsigned long long) h4 * s3); | ||||
|         d3 = ((unsigned long long) h0 * r3) + ((unsigned long long) h1 * r2) + | ||||
|              ((unsigned long long) h2 * r1) + ((unsigned long long) h3 * r0) + | ||||
|              ((unsigned long long) h4 * s4); | ||||
|         d4 = ((unsigned long long) h0 * r4) + ((unsigned long long) h1 * r3) + | ||||
|              ((unsigned long long) h2 * r2) + ((unsigned long long) h3 * r1) + | ||||
|              ((unsigned long long) h4 * r0); | ||||
|  | ||||
|         /* (partial) h %= p */ | ||||
|         c  = (unsigned long) (d0 >> 26); | ||||
|         h0 = (unsigned long) d0 & 0x3ffffff; | ||||
|         d1 += c; | ||||
|         c  = (unsigned long) (d1 >> 26); | ||||
|         h1 = (unsigned long) d1 & 0x3ffffff; | ||||
|         d2 += c; | ||||
|         c  = (unsigned long) (d2 >> 26); | ||||
|         h2 = (unsigned long) d2 & 0x3ffffff; | ||||
|         d3 += c; | ||||
|         c  = (unsigned long) (d3 >> 26); | ||||
|         h3 = (unsigned long) d3 & 0x3ffffff; | ||||
|         d4 += c; | ||||
|         c  = (unsigned long) (d4 >> 26); | ||||
|         h4 = (unsigned long) d4 & 0x3ffffff; | ||||
|         h0 += c * 5; | ||||
|         c  = (h0 >> 26); | ||||
|         h0 = h0 & 0x3ffffff; | ||||
|         h1 += c; | ||||
|  | ||||
|         m += poly1305_block_size; | ||||
|         bytes -= poly1305_block_size; | ||||
|     } | ||||
|  | ||||
|     st->h[0] = h0; | ||||
|     st->h[1] = h1; | ||||
|     st->h[2] = h2; | ||||
|     st->h[3] = h3; | ||||
|     st->h[4] = h4; | ||||
| } | ||||
|  | ||||
| static POLY1305_NOINLINE void | ||||
| poly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16]) | ||||
| { | ||||
|     unsigned long      h0, h1, h2, h3, h4, c; | ||||
|     unsigned long      g0, g1, g2, g3, g4; | ||||
|     unsigned long long f; | ||||
|     unsigned long      mask; | ||||
|  | ||||
|     /* process the remaining block */ | ||||
|     if (st->leftover) { | ||||
|         unsigned long long i = st->leftover; | ||||
|  | ||||
|         st->buffer[i++] = 1; | ||||
|         for (; i < poly1305_block_size; i++) { | ||||
|             st->buffer[i] = 0; | ||||
|         } | ||||
|         st->final = 1; | ||||
|         poly1305_blocks(st, st->buffer, poly1305_block_size); | ||||
|     } | ||||
|  | ||||
|     /* fully carry h */ | ||||
|     h0 = st->h[0]; | ||||
|     h1 = st->h[1]; | ||||
|     h2 = st->h[2]; | ||||
|     h3 = st->h[3]; | ||||
|     h4 = st->h[4]; | ||||
|  | ||||
|     c  = h1 >> 26; | ||||
|     h1 = h1 & 0x3ffffff; | ||||
|     h2 += c; | ||||
|     c  = h2 >> 26; | ||||
|     h2 = h2 & 0x3ffffff; | ||||
|     h3 += c; | ||||
|     c  = h3 >> 26; | ||||
|     h3 = h3 & 0x3ffffff; | ||||
|     h4 += c; | ||||
|     c  = h4 >> 26; | ||||
|     h4 = h4 & 0x3ffffff; | ||||
|     h0 += c * 5; | ||||
|     c  = h0 >> 26; | ||||
|     h0 = h0 & 0x3ffffff; | ||||
|     h1 += c; | ||||
|  | ||||
|     /* compute h + -p */ | ||||
|     g0 = h0 + 5; | ||||
|     c  = g0 >> 26; | ||||
|     g0 &= 0x3ffffff; | ||||
|     g1 = h1 + c; | ||||
|     c  = g1 >> 26; | ||||
|     g1 &= 0x3ffffff; | ||||
|     g2 = h2 + c; | ||||
|     c  = g2 >> 26; | ||||
|     g2 &= 0x3ffffff; | ||||
|     g3 = h3 + c; | ||||
|     c  = g3 >> 26; | ||||
|     g3 &= 0x3ffffff; | ||||
|     g4 = h4 + c - (1UL << 26); | ||||
|  | ||||
|     /* select h if h < p, or h + -p if h >= p */ | ||||
|     mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1; | ||||
|     g0 &= mask; | ||||
|     g1 &= mask; | ||||
|     g2 &= mask; | ||||
|     g3 &= mask; | ||||
|     g4 &= mask; | ||||
|     mask = ~mask; | ||||
|  | ||||
|     h0 = (h0 & mask) | g0; | ||||
|     h1 = (h1 & mask) | g1; | ||||
|     h2 = (h2 & mask) | g2; | ||||
|     h3 = (h3 & mask) | g3; | ||||
|     h4 = (h4 & mask) | g4; | ||||
|  | ||||
|     /* h = h % (2^128) */ | ||||
|     h0 = ((h0) | (h1 << 26)) & 0xffffffff; | ||||
|     h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff; | ||||
|     h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff; | ||||
|     h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff; | ||||
|  | ||||
|     /* mac = (h + pad) % (2^128) */ | ||||
|     f  = (unsigned long long) h0 + st->pad[0]; | ||||
|     h0 = (unsigned long) f; | ||||
|     f  = (unsigned long long) h1 + st->pad[1] + (f >> 32); | ||||
|     h1 = (unsigned long) f; | ||||
|     f  = (unsigned long long) h2 + st->pad[2] + (f >> 32); | ||||
|     h2 = (unsigned long) f; | ||||
|     f  = (unsigned long long) h3 + st->pad[3] + (f >> 32); | ||||
|     h3 = (unsigned long) f; | ||||
|  | ||||
|     STORE32_LE(mac + 0, (uint32_t) h0); | ||||
|     STORE32_LE(mac + 4, (uint32_t) h1); | ||||
|     STORE32_LE(mac + 8, (uint32_t) h2); | ||||
|     STORE32_LE(mac + 12, (uint32_t) h3); | ||||
|  | ||||
|     /* zero out the state */ | ||||
|     sodium_memzero((void *) st, sizeof *st); | ||||
| } | ||||
							
								
								
									
										221
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna64.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna64.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | ||||
| /* | ||||
|    poly1305 implementation using 64 bit * 64 bit = 128 bit multiplication | ||||
|    and 128 bit addition | ||||
| */ | ||||
|  | ||||
| #include "private/common.h" | ||||
|  | ||||
| #define MUL(out, x, y) out = ((uint128_t) x * y) | ||||
| #define ADD(out, in) out += in | ||||
| #define ADDLO(out, in) out += in | ||||
| #define SHR(in, shift) (unsigned long long) (in >> (shift)) | ||||
| #define LO(in) (unsigned long long) (in) | ||||
|  | ||||
| #if defined(_MSC_VER) | ||||
| # define POLY1305_NOINLINE __declspec(noinline) | ||||
| #elif defined(__clang__) || defined(__GNUC__) | ||||
| # define POLY1305_NOINLINE __attribute__((noinline)) | ||||
| #else | ||||
| # define POLY1305_NOINLINE | ||||
| #endif | ||||
|  | ||||
| #define poly1305_block_size 16 | ||||
|  | ||||
| /* 17 + sizeof(unsigned long long) + 8*sizeof(unsigned long long) */ | ||||
| typedef struct poly1305_state_internal_t { | ||||
|     unsigned long long r[3]; | ||||
|     unsigned long long h[3]; | ||||
|     unsigned long long pad[2]; | ||||
|     unsigned long long leftover; | ||||
|     unsigned char      buffer[poly1305_block_size]; | ||||
|     unsigned char      final; | ||||
| } poly1305_state_internal_t; | ||||
|  | ||||
| static void | ||||
| poly1305_init(poly1305_state_internal_t *st, const unsigned char key[32]) | ||||
| { | ||||
|     unsigned long long t0, t1; | ||||
|  | ||||
|     /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ | ||||
|     t0 = LOAD64_LE(&key[0]); | ||||
|     t1 = LOAD64_LE(&key[8]); | ||||
|  | ||||
|     /* wiped after finalization */ | ||||
|     st->r[0] = (t0) & 0xffc0fffffff; | ||||
|     st->r[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff; | ||||
|     st->r[2] = ((t1 >> 24)) & 0x00ffffffc0f; | ||||
|  | ||||
|     /* h = 0 */ | ||||
|     st->h[0] = 0; | ||||
|     st->h[1] = 0; | ||||
|     st->h[2] = 0; | ||||
|  | ||||
|     /* save pad for later */ | ||||
|     st->pad[0] = LOAD64_LE(&key[16]); | ||||
|     st->pad[1] = LOAD64_LE(&key[24]); | ||||
|  | ||||
|     st->leftover = 0; | ||||
|     st->final    = 0; | ||||
| } | ||||
|  | ||||
| static void | ||||
| poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                 unsigned long long bytes) | ||||
| { | ||||
|     const unsigned long long hibit = | ||||
|         (st->final) ? 0ULL : (1ULL << 40); /* 1 << 128 */ | ||||
|     unsigned long long r0, r1, r2; | ||||
|     unsigned long long s1, s2; | ||||
|     unsigned long long h0, h1, h2; | ||||
|     unsigned long long c; | ||||
|     uint128_t          d0, d1, d2, d; | ||||
|  | ||||
|     r0 = st->r[0]; | ||||
|     r1 = st->r[1]; | ||||
|     r2 = st->r[2]; | ||||
|  | ||||
|     h0 = st->h[0]; | ||||
|     h1 = st->h[1]; | ||||
|     h2 = st->h[2]; | ||||
|  | ||||
|     s1 = r1 * (5 << 2); | ||||
|     s2 = r2 * (5 << 2); | ||||
|  | ||||
|     while (bytes >= poly1305_block_size) { | ||||
|         unsigned long long t0, t1; | ||||
|  | ||||
|         /* h += m[i] */ | ||||
|         t0 = LOAD64_LE(&m[0]); | ||||
|         t1 = LOAD64_LE(&m[8]); | ||||
|  | ||||
|         h0 += t0 & 0xfffffffffff; | ||||
|         h1 += ((t0 >> 44) | (t1 << 20)) & 0xfffffffffff; | ||||
|         h2 += (((t1 >> 24)) & 0x3ffffffffff) | hibit; | ||||
|  | ||||
|         /* h *= r */ | ||||
|         MUL(d0, h0, r0); | ||||
|         MUL(d, h1, s2); | ||||
|         ADD(d0, d); | ||||
|         MUL(d, h2, s1); | ||||
|         ADD(d0, d); | ||||
|         MUL(d1, h0, r1); | ||||
|         MUL(d, h1, r0); | ||||
|         ADD(d1, d); | ||||
|         MUL(d, h2, s2); | ||||
|         ADD(d1, d); | ||||
|         MUL(d2, h0, r2); | ||||
|         MUL(d, h1, r1); | ||||
|         ADD(d2, d); | ||||
|         MUL(d, h2, r0); | ||||
|         ADD(d2, d); | ||||
|  | ||||
|         /* (partial) h %= p */ | ||||
|         c  = SHR(d0, 44); | ||||
|         h0 = LO(d0) & 0xfffffffffff; | ||||
|         ADDLO(d1, c); | ||||
|         c  = SHR(d1, 44); | ||||
|         h1 = LO(d1) & 0xfffffffffff; | ||||
|         ADDLO(d2, c); | ||||
|         c  = SHR(d2, 42); | ||||
|         h2 = LO(d2) & 0x3ffffffffff; | ||||
|         h0 += c * 5; | ||||
|         c  = (h0 >> 44); | ||||
|         h0 = h0 & 0xfffffffffff; | ||||
|         h1 += c; | ||||
|  | ||||
|         m += poly1305_block_size; | ||||
|         bytes -= poly1305_block_size; | ||||
|     } | ||||
|  | ||||
|     st->h[0] = h0; | ||||
|     st->h[1] = h1; | ||||
|     st->h[2] = h2; | ||||
| } | ||||
|  | ||||
| static POLY1305_NOINLINE void | ||||
| poly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16]) | ||||
| { | ||||
|     unsigned long long h0, h1, h2, c; | ||||
|     unsigned long long g0, g1, g2; | ||||
|     unsigned long long t0, t1; | ||||
|     unsigned long long mask; | ||||
|  | ||||
|     /* process the remaining block */ | ||||
|     if (st->leftover) { | ||||
|         unsigned long long i = st->leftover; | ||||
|  | ||||
|         st->buffer[i] = 1; | ||||
|  | ||||
|         for (i = i + 1; i < poly1305_block_size; i++) { | ||||
|             st->buffer[i] = 0; | ||||
|         } | ||||
|         st->final = 1; | ||||
|         poly1305_blocks(st, st->buffer, poly1305_block_size); | ||||
|     } | ||||
|  | ||||
|     /* fully carry h */ | ||||
|     h0 = st->h[0]; | ||||
|     h1 = st->h[1]; | ||||
|     h2 = st->h[2]; | ||||
|  | ||||
|     c = h1 >> 44; | ||||
|     h1 &= 0xfffffffffff; | ||||
|     h2 += c; | ||||
|     c = h2 >> 42; | ||||
|     h2 &= 0x3ffffffffff; | ||||
|     h0 += c * 5; | ||||
|     c = h0 >> 44; | ||||
|     h0 &= 0xfffffffffff; | ||||
|     h1 += c; | ||||
|     c = h1 >> 44; | ||||
|     h1 &= 0xfffffffffff; | ||||
|     h2 += c; | ||||
|     c = h2 >> 42; | ||||
|     h2 &= 0x3ffffffffff; | ||||
|     h0 += c * 5; | ||||
|     c = h0 >> 44; | ||||
|     h0 &= 0xfffffffffff; | ||||
|     h1 += c; | ||||
|  | ||||
|     /* compute h + -p */ | ||||
|     g0 = h0 + 5; | ||||
|     c  = g0 >> 44; | ||||
|     g0 &= 0xfffffffffff; | ||||
|     g1 = h1 + c; | ||||
|     c  = g1 >> 44; | ||||
|     g1 &= 0xfffffffffff; | ||||
|     g2 = h2 + c - (1ULL << 42); | ||||
|  | ||||
|     /* select h if h < p, or h + -p if h >= p */ | ||||
|     mask = (g2 >> ((sizeof(unsigned long long) * 8) - 1)) - 1; | ||||
|     g0   &= mask; | ||||
|     g1   &= mask; | ||||
|     g2   &= mask; | ||||
|     mask =  ~mask; | ||||
|     h0   =  (h0 & mask) | g0; | ||||
|     h1   =  (h1 & mask) | g1; | ||||
|     h2   =  (h2 & mask) | g2; | ||||
|  | ||||
|     /* h = (h + pad) */ | ||||
|     t0 = st->pad[0]; | ||||
|     t1 = st->pad[1]; | ||||
|  | ||||
|     h0 += ((t0) &0xfffffffffff); | ||||
|     c = (h0 >> 44); | ||||
|     h0 &= 0xfffffffffff; | ||||
|     h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c; | ||||
|     c = (h1 >> 44); | ||||
|     h1 &= 0xfffffffffff; | ||||
|     h2 += (((t1 >> 24)) & 0x3ffffffffff) + c; | ||||
|     h2 &= 0x3ffffffffff; | ||||
|  | ||||
|     /* mac = h % (2^128) */ | ||||
|     h0 = (h0) | (h1 << 44); | ||||
|     h1 = (h1 >> 20) | (h2 << 24); | ||||
|  | ||||
|     STORE64_LE(&mac[0], h0); | ||||
|     STORE64_LE(&mac[8], h1); | ||||
|  | ||||
|     /* zero out the state */ | ||||
|     sodium_memzero((void *) st, sizeof *st); | ||||
| } | ||||
							
								
								
									
										90
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
|  | ||||
| #include "onetimeauth_poly1305.h" | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
| #include "private/common.h" | ||||
| #include "private/implementations.h" | ||||
| #include "randombytes.h" | ||||
| #include "runtime.h" | ||||
|  | ||||
| #include "donna/poly1305_donna.h" | ||||
| #if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H) | ||||
| # include "sse2/poly1305_sse2.h" | ||||
| #endif | ||||
|  | ||||
| static const crypto_onetimeauth_poly1305_implementation *implementation = | ||||
|     &crypto_onetimeauth_poly1305_donna_implementation; | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_poly1305(unsigned char *out, const unsigned char *in, | ||||
|                             unsigned long long inlen, const unsigned char *k) | ||||
| { | ||||
|     return implementation->onetimeauth(out, in, inlen, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_poly1305_verify(const unsigned char *h, | ||||
|                                    const unsigned char *in, | ||||
|                                    unsigned long long   inlen, | ||||
|                                    const unsigned char *k) | ||||
| { | ||||
|     return implementation->onetimeauth_verify(h, in, inlen, k); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, | ||||
|                                  const unsigned char *key) | ||||
| { | ||||
|     return implementation->onetimeauth_init(state, key); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, | ||||
|                                    const unsigned char *in, | ||||
|                                    unsigned long long inlen) | ||||
| { | ||||
|     return implementation->onetimeauth_update(state, in, inlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, | ||||
|                                   unsigned char *out) | ||||
| { | ||||
|     return implementation->onetimeauth_final(state, out); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_poly1305_bytes(void) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_poly1305_keybytes(void) | ||||
| { | ||||
|     return crypto_onetimeauth_poly1305_KEYBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_onetimeauth_poly1305_statebytes(void) | ||||
| { | ||||
|     return sizeof(crypto_onetimeauth_poly1305_state); | ||||
| } | ||||
|  | ||||
| void | ||||
| crypto_onetimeauth_poly1305_keygen( | ||||
|     unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) | ||||
| { | ||||
|     randombytes_buf(k, crypto_onetimeauth_poly1305_KEYBYTES); | ||||
| } | ||||
|  | ||||
| int | ||||
| _crypto_onetimeauth_poly1305_pick_best_implementation(void) | ||||
| { | ||||
|     implementation = &crypto_onetimeauth_poly1305_donna_implementation; | ||||
| #if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H) | ||||
|     if (sodium_runtime_has_sse2()) { | ||||
|         implementation = &crypto_onetimeauth_poly1305_sse2_implementation; | ||||
|     } | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										21
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
|  | ||||
| #ifndef onetimeauth_poly1305_H | ||||
| #define onetimeauth_poly1305_H | ||||
|  | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
|  | ||||
| typedef struct crypto_onetimeauth_poly1305_implementation { | ||||
|     int (*onetimeauth)(unsigned char *out, const unsigned char *in, | ||||
|                        unsigned long long inlen, const unsigned char *k); | ||||
|     int (*onetimeauth_verify)(const unsigned char *h, const unsigned char *in, | ||||
|                               unsigned long long inlen, const unsigned char *k); | ||||
|     int (*onetimeauth_init)(crypto_onetimeauth_poly1305_state *state, | ||||
|                             const unsigned char *              key); | ||||
|     int (*onetimeauth_update)(crypto_onetimeauth_poly1305_state *state, | ||||
|                               const unsigned char *              in, | ||||
|                               unsigned long long                 inlen); | ||||
|     int (*onetimeauth_final)(crypto_onetimeauth_poly1305_state *state, | ||||
|                              unsigned char *                    out); | ||||
| } crypto_onetimeauth_poly1305_implementation; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										949
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										949
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,949 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "../onetimeauth_poly1305.h" | ||||
| #include "crypto_verify_16.h" | ||||
| #include "poly1305_sse2.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| # endif | ||||
|  | ||||
| # include <emmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| typedef __m128i xmmi; | ||||
|  | ||||
| # if defined(_MSC_VER) | ||||
| #  define POLY1305_NOINLINE __declspec(noinline) | ||||
| # elif defined(__clang__) || defined(__GNUC__) | ||||
| #  define POLY1305_NOINLINE __attribute__((noinline)) | ||||
| # else | ||||
| #  define POLY1305_NOINLINE | ||||
| # endif | ||||
|  | ||||
| # define poly1305_block_size 32 | ||||
|  | ||||
| enum poly1305_state_flags_t { | ||||
|     poly1305_started       = 1, | ||||
|     poly1305_final_shift8  = 4, | ||||
|     poly1305_final_shift16 = 8, | ||||
|     poly1305_final_r2_r    = 16, /* use [r^2,r] for the final block */ | ||||
|     poly1305_final_r_1     = 32  /* use [r,1] for the final block */ | ||||
| }; | ||||
|  | ||||
| typedef struct poly1305_state_internal_t { | ||||
|     union { | ||||
|         uint64_t h[3]; | ||||
|         uint32_t hh[10]; | ||||
|     } H;                                            /*  40 bytes  */ | ||||
|     uint32_t           R[5];                        /*  20 bytes  */ | ||||
|     uint32_t           R2[5];                       /*  20 bytes  */ | ||||
|     uint32_t           R4[5];                       /*  20 bytes  */ | ||||
|     uint64_t           pad[2];                      /*  16 bytes  */ | ||||
|     uint64_t           flags;                       /*   8 bytes  */ | ||||
|     unsigned long long leftover;                    /* 8 bytes */ | ||||
|     unsigned char      buffer[poly1305_block_size]; /* 32 bytes */ | ||||
| } poly1305_state_internal_t;                        /* 164 bytes total */ | ||||
|  | ||||
| /* | ||||
|  * _mm_loadl_epi64() is turned into a simple MOVQ. So, unaligned accesses are | ||||
|  * totally fine, even though this intrinsic requires a __m128i* input. | ||||
|  * This confuses dynamic analysis, so force alignment, only in debug mode. | ||||
|  */ | ||||
| # ifdef DEBUG | ||||
| static xmmi | ||||
| _fakealign_mm_loadl_epi64(const void *m) | ||||
| { | ||||
|     xmmi tmp; | ||||
|     memcpy(&tmp, m, 8); | ||||
|  | ||||
|     return _mm_loadl_epi64(&tmp); | ||||
| } | ||||
| # define _mm_loadl_epi64(X) _fakealign_mm_loadl_epi64(X) | ||||
| #endif | ||||
|  | ||||
| /* copy 0-31 bytes */ | ||||
| static inline void | ||||
| poly1305_block_copy31(unsigned char *dst, const unsigned char *src, | ||||
|                       unsigned long long bytes) | ||||
| { | ||||
|     if (bytes & 16) { | ||||
|         _mm_store_si128((xmmi *) (void *) dst, | ||||
|                         _mm_loadu_si128((const xmmi *) (const void *) src)); | ||||
|         src += 16; | ||||
|         dst += 16; | ||||
|     } | ||||
|     if (bytes & 8) { | ||||
|         memcpy(dst, src, 8); | ||||
|         src += 8; | ||||
|         dst += 8; | ||||
|     } | ||||
|     if (bytes & 4) { | ||||
|         memcpy(dst, src, 4); | ||||
|         src += 4; | ||||
|         dst += 4; | ||||
|     } | ||||
|     if (bytes & 2) { | ||||
|         memcpy(dst, src, 2); | ||||
|         src += 2; | ||||
|         dst += 2; | ||||
|     } | ||||
|     if (bytes & 1) { | ||||
|         *dst = *src; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static POLY1305_NOINLINE void | ||||
| poly1305_init_ext(poly1305_state_internal_t *st, const unsigned char key[32], | ||||
|                   unsigned long long bytes) | ||||
| { | ||||
|     uint32_t          *R; | ||||
|     uint128_t          d[3]; | ||||
|     uint64_t           r0, r1, r2; | ||||
|     uint64_t           rt0, rt1, rt2, st2, c; | ||||
|     uint64_t           t0, t1; | ||||
|     unsigned long long i; | ||||
|  | ||||
|     if (!bytes) { | ||||
|         bytes = ~(unsigned long long) 0; | ||||
|     } | ||||
|     /* H = 0 */ | ||||
|     _mm_storeu_si128((xmmi *) (void *) &st->H.hh[0], _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) &st->H.hh[4], _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) &st->H.hh[8], _mm_setzero_si128()); | ||||
|  | ||||
|     /* clamp key */ | ||||
|     memcpy(&t0, key, 8); | ||||
|     memcpy(&t1, key + 8, 8); | ||||
|     r0 = t0 & 0xffc0fffffff; | ||||
|     t0 >>= 44; | ||||
|     t0 |= t1 << 20; | ||||
|     r1 = t0 & 0xfffffc0ffff; | ||||
|     t1 >>= 24; | ||||
|     r2 = t1 & 0x00ffffffc0f; | ||||
|  | ||||
|     /* r^1 */ | ||||
|     R    = st->R; | ||||
|     R[0] = (uint32_t)(r0) &0x3ffffff; | ||||
|     R[1] = (uint32_t)((r0 >> 26) | (r1 << 18)) & 0x3ffffff; | ||||
|     R[2] = (uint32_t)((r1 >> 8)) & 0x3ffffff; | ||||
|     R[3] = (uint32_t)((r1 >> 34) | (r2 << 10)) & 0x3ffffff; | ||||
|     R[4] = (uint32_t)((r2 >> 16)); | ||||
|  | ||||
|     /* save pad */ | ||||
|     memcpy(&st->pad[0], key + 16, 8); | ||||
|     memcpy(&st->pad[1], key + 24, 8); | ||||
|  | ||||
|     rt0 = r0; | ||||
|     rt1 = r1; | ||||
|     rt2 = r2; | ||||
|  | ||||
|     /* r^2, r^4 */ | ||||
|     for (i = 0; i < 2; i++) { | ||||
|         if (i == 0) { | ||||
|             R = st->R2; | ||||
|             if (bytes <= 16) { | ||||
|                 break; | ||||
|             } | ||||
|         } else if (i == 1) { | ||||
|             R = st->R4; | ||||
|             if (bytes < 96) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         st2 = rt2 * (5 << 2); | ||||
|  | ||||
|         d[0] = ((uint128_t) rt0 * rt0) + ((uint128_t)(rt1 * 2) * st2); | ||||
|         d[1] = ((uint128_t) rt2 * st2) + ((uint128_t)(rt0 * 2) * rt1); | ||||
|         d[2] = ((uint128_t) rt1 * rt1) + ((uint128_t)(rt2 * 2) * rt0); | ||||
|  | ||||
|         rt0 = (uint64_t) d[0] & 0xfffffffffff; | ||||
|         c   = (uint64_t)(d[0] >> 44); | ||||
|         d[1] += c; | ||||
|  | ||||
|         rt1 = (uint64_t) d[1] & 0xfffffffffff; | ||||
|         c   = (uint64_t)(d[1] >> 44); | ||||
|         d[2] += c; | ||||
|  | ||||
|         rt2 = (uint64_t) d[2] & 0x3ffffffffff; | ||||
|         c   = (uint64_t)(d[2] >> 42); | ||||
|         rt0 += c * 5; | ||||
|         c   = (rt0 >> 44); | ||||
|         rt0 = rt0 & 0xfffffffffff; | ||||
|         rt1 += c; | ||||
|         c   = (rt1 >> 44); | ||||
|         rt1 = rt1 & 0xfffffffffff; | ||||
|         rt2 += c; /* even if rt2 overflows, it will still fit in rp4 safely, and | ||||
|                      is safe to multiply with */ | ||||
|  | ||||
|         R[0] = (uint32_t)(rt0) &0x3ffffff; | ||||
|         R[1] = (uint32_t)((rt0 >> 26) | (rt1 << 18)) & 0x3ffffff; | ||||
|         R[2] = (uint32_t)((rt1 >> 8)) & 0x3ffffff; | ||||
|         R[3] = (uint32_t)((rt1 >> 34) | (rt2 << 10)) & 0x3ffffff; | ||||
|         R[4] = (uint32_t)((rt2 >> 16)); | ||||
|     } | ||||
|     st->flags    = 0; | ||||
|     st->leftover = 0U; | ||||
| } | ||||
|  | ||||
| static POLY1305_NOINLINE void | ||||
| poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                 unsigned long long bytes) | ||||
| { | ||||
|     CRYPTO_ALIGN(64) | ||||
|     xmmi HIBIT = | ||||
|         _mm_shuffle_epi32(_mm_cvtsi32_si128(1 << 24), _MM_SHUFFLE(1, 0, 1, 0)); | ||||
|     const xmmi MMASK = _mm_shuffle_epi32(_mm_cvtsi32_si128((1 << 26) - 1), | ||||
|                                          _MM_SHUFFLE(1, 0, 1, 0)); | ||||
|     const xmmi FIVE = | ||||
|         _mm_shuffle_epi32(_mm_cvtsi32_si128(5), _MM_SHUFFLE(1, 0, 1, 0)); | ||||
|     xmmi H0, H1, H2, H3, H4; | ||||
|     xmmi T0, T1, T2, T3, T4, T5, T6, T7, T8; | ||||
|     xmmi M0, M1, M2, M3, M4; | ||||
|     xmmi M5, M6, M7, M8; | ||||
|     xmmi C1, C2; | ||||
|     xmmi R20, R21, R22, R23, R24, S21, S22, S23, S24; | ||||
|     xmmi R40, R41, R42, R43, R44, S41, S42, S43, S44; | ||||
|  | ||||
|     if (st->flags & poly1305_final_shift8) { | ||||
|         HIBIT = _mm_srli_si128(HIBIT, 8); | ||||
|     } | ||||
|     if (st->flags & poly1305_final_shift16) { | ||||
|         HIBIT = _mm_setzero_si128(); | ||||
|     } | ||||
|     if (!(st->flags & poly1305_started)) { | ||||
|         /* H = [Mx,My] */ | ||||
|         T5 = _mm_unpacklo_epi64( | ||||
|             _mm_loadl_epi64((const xmmi *) (const void *) (m + 0)), | ||||
|             _mm_loadl_epi64((const xmmi *) (const void *) (m + 16))); | ||||
|         T6 = _mm_unpacklo_epi64( | ||||
|             _mm_loadl_epi64((const xmmi *) (const void *) (m + 8)), | ||||
|             _mm_loadl_epi64((const xmmi *) (const void *) (m + 24))); | ||||
|         H0 = _mm_and_si128(MMASK, T5); | ||||
|         H1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); | ||||
|         T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); | ||||
|         H2 = _mm_and_si128(MMASK, T5); | ||||
|         H3 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); | ||||
|         H4 = _mm_srli_epi64(T6, 40); | ||||
|         H4 = _mm_or_si128(H4, HIBIT); | ||||
|         m += 32; | ||||
|         bytes -= 32; | ||||
|         st->flags |= poly1305_started; | ||||
|     } else { | ||||
|         T0 = _mm_loadu_si128((const xmmi *) (const void *) &st->H.hh[0]); | ||||
|         T1 = _mm_loadu_si128((const xmmi *) (const void *) &st->H.hh[4]); | ||||
|         T2 = _mm_loadu_si128((const xmmi *) (const void *) &st->H.hh[8]); | ||||
|         H0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1, 1, 0, 0)); | ||||
|         H1 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 3, 2, 2)); | ||||
|         H2 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(1, 1, 0, 0)); | ||||
|         H3 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3, 3, 2, 2)); | ||||
|         H4 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(1, 1, 0, 0)); | ||||
|     } | ||||
|     if (st->flags & (poly1305_final_r2_r | poly1305_final_r_1)) { | ||||
|         if (st->flags & poly1305_final_r2_r) { | ||||
|             /* use [r^2, r] */ | ||||
|             T2  = _mm_loadu_si128((const xmmi *) (const void *) &st->R[0]); | ||||
|             T3  = _mm_cvtsi32_si128(st->R[4]); | ||||
|             T0  = _mm_loadu_si128((const xmmi *) (const void *) &st->R2[0]); | ||||
|             T1  = _mm_cvtsi32_si128(st->R2[4]); | ||||
|             T4  = _mm_unpacklo_epi32(T0, T2); | ||||
|             T5  = _mm_unpackhi_epi32(T0, T2); | ||||
|             R24 = _mm_unpacklo_epi64(T1, T3); | ||||
|         } else { | ||||
|             /* use [r^1, 1] */ | ||||
|             T0  = _mm_loadu_si128((const xmmi *) (const void *) &st->R[0]); | ||||
|             T1  = _mm_cvtsi32_si128(st->R[4]); | ||||
|             T2  = _mm_cvtsi32_si128(1); | ||||
|             T4  = _mm_unpacklo_epi32(T0, T2); | ||||
|             T5  = _mm_unpackhi_epi32(T0, T2); | ||||
|             R24 = T1; | ||||
|         } | ||||
|         R20 = _mm_shuffle_epi32(T4, _MM_SHUFFLE(1, 1, 0, 0)); | ||||
|         R21 = _mm_shuffle_epi32(T4, _MM_SHUFFLE(3, 3, 2, 2)); | ||||
|         R22 = _mm_shuffle_epi32(T5, _MM_SHUFFLE(1, 1, 0, 0)); | ||||
|         R23 = _mm_shuffle_epi32(T5, _MM_SHUFFLE(3, 3, 2, 2)); | ||||
|     } else { | ||||
|         /* use [r^2, r^2] */ | ||||
|         T0  = _mm_loadu_si128((const xmmi *) (const void *) &st->R2[0]); | ||||
|         T1  = _mm_cvtsi32_si128(st->R2[4]); | ||||
|         R20 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(0, 0, 0, 0)); | ||||
|         R21 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1, 1, 1, 1)); | ||||
|         R22 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(2, 2, 2, 2)); | ||||
|         R23 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 3, 3, 3)); | ||||
|         R24 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(0, 0, 0, 0)); | ||||
|     } | ||||
|     S21 = _mm_mul_epu32(R21, FIVE); | ||||
|     S22 = _mm_mul_epu32(R22, FIVE); | ||||
|     S23 = _mm_mul_epu32(R23, FIVE); | ||||
|     S24 = _mm_mul_epu32(R24, FIVE); | ||||
|  | ||||
|     if (bytes >= 64) { | ||||
|         T0  = _mm_loadu_si128((const xmmi *) (const void *) &st->R4[0]); | ||||
|         T1  = _mm_cvtsi32_si128(st->R4[4]); | ||||
|         R40 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(0, 0, 0, 0)); | ||||
|         R41 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1, 1, 1, 1)); | ||||
|         R42 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(2, 2, 2, 2)); | ||||
|         R43 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 3, 3, 3)); | ||||
|         R44 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(0, 0, 0, 0)); | ||||
|         S41 = _mm_mul_epu32(R41, FIVE); | ||||
|         S42 = _mm_mul_epu32(R42, FIVE); | ||||
|         S43 = _mm_mul_epu32(R43, FIVE); | ||||
|         S44 = _mm_mul_epu32(R44, FIVE); | ||||
|  | ||||
|         while (bytes >= 64) { | ||||
|             xmmi v00, v01, v02, v03, v04; | ||||
|             xmmi v10, v11, v12, v13, v14; | ||||
|             xmmi v20, v21, v22, v23, v24; | ||||
|             xmmi v30, v31, v32, v33, v34; | ||||
|             xmmi v40, v41, v42, v43, v44; | ||||
|             xmmi T14, T15; | ||||
|  | ||||
|             /* H *= [r^4,r^4], preload [Mx,My] */ | ||||
|             T15 = S42; | ||||
|             T0  = H4; | ||||
|             T0  = _mm_mul_epu32(T0, S41); | ||||
|             v01 = H3; | ||||
|             v01 = _mm_mul_epu32(v01, T15); | ||||
|             T14 = S43; | ||||
|             T1  = H4; | ||||
|             T1  = _mm_mul_epu32(T1, T15); | ||||
|             v11 = H3; | ||||
|             v11 = _mm_mul_epu32(v11, T14); | ||||
|             T2  = H4; | ||||
|             T2  = _mm_mul_epu32(T2, T14); | ||||
|             T0  = _mm_add_epi64(T0, v01); | ||||
|             T15 = S44; | ||||
|             v02 = H2; | ||||
|             v02 = _mm_mul_epu32(v02, T14); | ||||
|             T3  = H4; | ||||
|             T3  = _mm_mul_epu32(T3, T15); | ||||
|             T1  = _mm_add_epi64(T1, v11); | ||||
|             v03 = H1; | ||||
|             v03 = _mm_mul_epu32(v03, T15); | ||||
|             v12 = H2; | ||||
|             v12 = _mm_mul_epu32(v12, T15); | ||||
|             T0  = _mm_add_epi64(T0, v02); | ||||
|             T14 = R40; | ||||
|             v21 = H3; | ||||
|             v21 = _mm_mul_epu32(v21, T15); | ||||
|             v31 = H3; | ||||
|             v31 = _mm_mul_epu32(v31, T14); | ||||
|             T0  = _mm_add_epi64(T0, v03); | ||||
|             T4  = H4; | ||||
|             T4  = _mm_mul_epu32(T4, T14); | ||||
|             T1  = _mm_add_epi64(T1, v12); | ||||
|             v04 = H0; | ||||
|             v04 = _mm_mul_epu32(v04, T14); | ||||
|             T2  = _mm_add_epi64(T2, v21); | ||||
|             v13 = H1; | ||||
|             v13 = _mm_mul_epu32(v13, T14); | ||||
|             T3  = _mm_add_epi64(T3, v31); | ||||
|             T15 = R41; | ||||
|             v22 = H2; | ||||
|             v22 = _mm_mul_epu32(v22, T14); | ||||
|             v32 = H2; | ||||
|             v32 = _mm_mul_epu32(v32, T15); | ||||
|             T0  = _mm_add_epi64(T0, v04); | ||||
|             v41 = H3; | ||||
|             v41 = _mm_mul_epu32(v41, T15); | ||||
|             T1  = _mm_add_epi64(T1, v13); | ||||
|             v14 = H0; | ||||
|             v14 = _mm_mul_epu32(v14, T15); | ||||
|             T2  = _mm_add_epi64(T2, v22); | ||||
|             T14 = R42; | ||||
|             T5  = _mm_unpacklo_epi64( | ||||
|                 _mm_loadl_epi64((const xmmi *) (const void *) (m + 0)), | ||||
|                 _mm_loadl_epi64((const xmmi *) (const void *) (m + 16))); | ||||
|             v23 = H1; | ||||
|             v23 = _mm_mul_epu32(v23, T15); | ||||
|             T3  = _mm_add_epi64(T3, v32); | ||||
|             v33 = H1; | ||||
|             v33 = _mm_mul_epu32(v33, T14); | ||||
|             T4  = _mm_add_epi64(T4, v41); | ||||
|             v42 = H2; | ||||
|             v42 = _mm_mul_epu32(v42, T14); | ||||
|             T1  = _mm_add_epi64(T1, v14); | ||||
|             T15 = R43; | ||||
|             T6  = _mm_unpacklo_epi64( | ||||
|                 _mm_loadl_epi64((const xmmi *) (const void *) (m + 8)), | ||||
|                 _mm_loadl_epi64((const xmmi *) (const void *) (m + 24))); | ||||
|             v24 = H0; | ||||
|             v24 = _mm_mul_epu32(v24, T14); | ||||
|             T2  = _mm_add_epi64(T2, v23); | ||||
|             v34 = H0; | ||||
|             v34 = _mm_mul_epu32(v34, T15); | ||||
|             T3  = _mm_add_epi64(T3, v33); | ||||
|             M0  = _mm_and_si128(MMASK, T5); | ||||
|             v43 = H1; | ||||
|             v43 = _mm_mul_epu32(v43, T15); | ||||
|             T4  = _mm_add_epi64(T4, v42); | ||||
|             M1  = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); | ||||
|             v44 = H0; | ||||
|             v44 = _mm_mul_epu32(v44, R44); | ||||
|             T2  = _mm_add_epi64(T2, v24); | ||||
|             T5  = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); | ||||
|             T3  = _mm_add_epi64(T3, v34); | ||||
|             M3  = _mm_and_si128(MMASK, _mm_srli_epi64(T6, 14)); | ||||
|             T4  = _mm_add_epi64(T4, v43); | ||||
|             M2  = _mm_and_si128(MMASK, T5); | ||||
|             T4  = _mm_add_epi64(T4, v44); | ||||
|             M4  = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT); | ||||
|  | ||||
|             /* H += [Mx',My'] */ | ||||
|             T5 = _mm_loadu_si128((const xmmi *) (const void *) (m + 32)); | ||||
|             T6 = _mm_loadu_si128((const xmmi *) (const void *) (m + 48)); | ||||
|             T7 = _mm_unpacklo_epi32(T5, T6); | ||||
|             T8 = _mm_unpackhi_epi32(T5, T6); | ||||
|             M5 = _mm_unpacklo_epi32(T7, _mm_setzero_si128()); | ||||
|             M6 = _mm_unpackhi_epi32(T7, _mm_setzero_si128()); | ||||
|             M7 = _mm_unpacklo_epi32(T8, _mm_setzero_si128()); | ||||
|             M8 = _mm_unpackhi_epi32(T8, _mm_setzero_si128()); | ||||
|             M6 = _mm_slli_epi64(M6, 6); | ||||
|             M7 = _mm_slli_epi64(M7, 12); | ||||
|             M8 = _mm_slli_epi64(M8, 18); | ||||
|             T0 = _mm_add_epi64(T0, M5); | ||||
|             T1 = _mm_add_epi64(T1, M6); | ||||
|             T2 = _mm_add_epi64(T2, M7); | ||||
|             T3 = _mm_add_epi64(T3, M8); | ||||
|             T4 = _mm_add_epi64(T4, HIBIT); | ||||
|  | ||||
|             /* H += [Mx,My]*[r^2,r^2] */ | ||||
|             T15 = S22; | ||||
|             v00 = M4; | ||||
|             v00 = _mm_mul_epu32(v00, S21); | ||||
|             v01 = M3; | ||||
|             v01 = _mm_mul_epu32(v01, T15); | ||||
|             T14 = S23; | ||||
|             v10 = M4; | ||||
|             v10 = _mm_mul_epu32(v10, T15); | ||||
|             v11 = M3; | ||||
|             v11 = _mm_mul_epu32(v11, T14); | ||||
|             T0  = _mm_add_epi64(T0, v00); | ||||
|             v20 = M4; | ||||
|             v20 = _mm_mul_epu32(v20, T14); | ||||
|             T0  = _mm_add_epi64(T0, v01); | ||||
|             T15 = S24; | ||||
|             v02 = M2; | ||||
|             v02 = _mm_mul_epu32(v02, T14); | ||||
|             T1  = _mm_add_epi64(T1, v10); | ||||
|             v30 = M4; | ||||
|             v30 = _mm_mul_epu32(v30, T15); | ||||
|             T1  = _mm_add_epi64(T1, v11); | ||||
|             v03 = M1; | ||||
|             v03 = _mm_mul_epu32(v03, T15); | ||||
|             T2  = _mm_add_epi64(T2, v20); | ||||
|             v12 = M2; | ||||
|             v12 = _mm_mul_epu32(v12, T15); | ||||
|             T0  = _mm_add_epi64(T0, v02); | ||||
|             T14 = R20; | ||||
|             v21 = M3; | ||||
|             v21 = _mm_mul_epu32(v21, T15); | ||||
|             T3  = _mm_add_epi64(T3, v30); | ||||
|             v31 = M3; | ||||
|             v31 = _mm_mul_epu32(v31, T14); | ||||
|             T0  = _mm_add_epi64(T0, v03); | ||||
|             v40 = M4; | ||||
|             v40 = _mm_mul_epu32(v40, T14); | ||||
|             T1  = _mm_add_epi64(T1, v12); | ||||
|             v04 = M0; | ||||
|             v04 = _mm_mul_epu32(v04, T14); | ||||
|             T2  = _mm_add_epi64(T2, v21); | ||||
|             v13 = M1; | ||||
|             v13 = _mm_mul_epu32(v13, T14); | ||||
|             T3  = _mm_add_epi64(T3, v31); | ||||
|             T15 = R21; | ||||
|             v22 = M2; | ||||
|             v22 = _mm_mul_epu32(v22, T14); | ||||
|             T4  = _mm_add_epi64(T4, v40); | ||||
|             v32 = M2; | ||||
|             v32 = _mm_mul_epu32(v32, T15); | ||||
|             T0  = _mm_add_epi64(T0, v04); | ||||
|             v41 = M3; | ||||
|             v41 = _mm_mul_epu32(v41, T15); | ||||
|             T1  = _mm_add_epi64(T1, v13); | ||||
|             v14 = M0; | ||||
|             v14 = _mm_mul_epu32(v14, T15); | ||||
|             T2  = _mm_add_epi64(T2, v22); | ||||
|             T14 = R22; | ||||
|             v23 = M1; | ||||
|             v23 = _mm_mul_epu32(v23, T15); | ||||
|             T3  = _mm_add_epi64(T3, v32); | ||||
|             v33 = M1; | ||||
|             v33 = _mm_mul_epu32(v33, T14); | ||||
|             T4  = _mm_add_epi64(T4, v41); | ||||
|             v42 = M2; | ||||
|             v42 = _mm_mul_epu32(v42, T14); | ||||
|             T1  = _mm_add_epi64(T1, v14); | ||||
|             T15 = R23; | ||||
|             v24 = M0; | ||||
|             v24 = _mm_mul_epu32(v24, T14); | ||||
|             T2  = _mm_add_epi64(T2, v23); | ||||
|             v34 = M0; | ||||
|             v34 = _mm_mul_epu32(v34, T15); | ||||
|             T3  = _mm_add_epi64(T3, v33); | ||||
|             v43 = M1; | ||||
|             v43 = _mm_mul_epu32(v43, T15); | ||||
|             T4  = _mm_add_epi64(T4, v42); | ||||
|             v44 = M0; | ||||
|             v44 = _mm_mul_epu32(v44, R24); | ||||
|             T2  = _mm_add_epi64(T2, v24); | ||||
|             T3  = _mm_add_epi64(T3, v34); | ||||
|             T4  = _mm_add_epi64(T4, v43); | ||||
|             T4  = _mm_add_epi64(T4, v44); | ||||
|  | ||||
|             /* reduce */ | ||||
|             C1 = _mm_srli_epi64(T0, 26); | ||||
|             C2 = _mm_srli_epi64(T3, 26); | ||||
|             T0 = _mm_and_si128(T0, MMASK); | ||||
|             T3 = _mm_and_si128(T3, MMASK); | ||||
|             T1 = _mm_add_epi64(T1, C1); | ||||
|             T4 = _mm_add_epi64(T4, C2); | ||||
|             C1 = _mm_srli_epi64(T1, 26); | ||||
|             C2 = _mm_srli_epi64(T4, 26); | ||||
|             T1 = _mm_and_si128(T1, MMASK); | ||||
|             T4 = _mm_and_si128(T4, MMASK); | ||||
|             T2 = _mm_add_epi64(T2, C1); | ||||
|             T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE)); | ||||
|             C1 = _mm_srli_epi64(T2, 26); | ||||
|             C2 = _mm_srli_epi64(T0, 26); | ||||
|             T2 = _mm_and_si128(T2, MMASK); | ||||
|             T0 = _mm_and_si128(T0, MMASK); | ||||
|             T3 = _mm_add_epi64(T3, C1); | ||||
|             T1 = _mm_add_epi64(T1, C2); | ||||
|             C1 = _mm_srli_epi64(T3, 26); | ||||
|             T3 = _mm_and_si128(T3, MMASK); | ||||
|             T4 = _mm_add_epi64(T4, C1); | ||||
|  | ||||
|             /* Final: H = (H*[r^4,r^4] + [Mx,My]*[r^2,r^2] + [Mx',My']) */ | ||||
|             H0 = T0; | ||||
|             H1 = T1; | ||||
|             H2 = T2; | ||||
|             H3 = T3; | ||||
|             H4 = T4; | ||||
|  | ||||
|             m += 64; | ||||
|             bytes -= 64; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (bytes >= 32) { | ||||
|         xmmi v01, v02, v03, v04; | ||||
|         xmmi v11, v12, v13, v14; | ||||
|         xmmi v21, v22, v23, v24; | ||||
|         xmmi v31, v32, v33, v34; | ||||
|         xmmi v41, v42, v43, v44; | ||||
|         xmmi T14, T15; | ||||
|  | ||||
|         /* H *= [r^2,r^2] */ | ||||
|         T15 = S22; | ||||
|         T0  = H4; | ||||
|         T0  = _mm_mul_epu32(T0, S21); | ||||
|         v01 = H3; | ||||
|         v01 = _mm_mul_epu32(v01, T15); | ||||
|         T14 = S23; | ||||
|         T1  = H4; | ||||
|         T1  = _mm_mul_epu32(T1, T15); | ||||
|         v11 = H3; | ||||
|         v11 = _mm_mul_epu32(v11, T14); | ||||
|         T2  = H4; | ||||
|         T2  = _mm_mul_epu32(T2, T14); | ||||
|         T0  = _mm_add_epi64(T0, v01); | ||||
|         T15 = S24; | ||||
|         v02 = H2; | ||||
|         v02 = _mm_mul_epu32(v02, T14); | ||||
|         T3  = H4; | ||||
|         T3  = _mm_mul_epu32(T3, T15); | ||||
|         T1  = _mm_add_epi64(T1, v11); | ||||
|         v03 = H1; | ||||
|         v03 = _mm_mul_epu32(v03, T15); | ||||
|         v12 = H2; | ||||
|         v12 = _mm_mul_epu32(v12, T15); | ||||
|         T0  = _mm_add_epi64(T0, v02); | ||||
|         T14 = R20; | ||||
|         v21 = H3; | ||||
|         v21 = _mm_mul_epu32(v21, T15); | ||||
|         v31 = H3; | ||||
|         v31 = _mm_mul_epu32(v31, T14); | ||||
|         T0  = _mm_add_epi64(T0, v03); | ||||
|         T4  = H4; | ||||
|         T4  = _mm_mul_epu32(T4, T14); | ||||
|         T1  = _mm_add_epi64(T1, v12); | ||||
|         v04 = H0; | ||||
|         v04 = _mm_mul_epu32(v04, T14); | ||||
|         T2  = _mm_add_epi64(T2, v21); | ||||
|         v13 = H1; | ||||
|         v13 = _mm_mul_epu32(v13, T14); | ||||
|         T3  = _mm_add_epi64(T3, v31); | ||||
|         T15 = R21; | ||||
|         v22 = H2; | ||||
|         v22 = _mm_mul_epu32(v22, T14); | ||||
|         v32 = H2; | ||||
|         v32 = _mm_mul_epu32(v32, T15); | ||||
|         T0  = _mm_add_epi64(T0, v04); | ||||
|         v41 = H3; | ||||
|         v41 = _mm_mul_epu32(v41, T15); | ||||
|         T1  = _mm_add_epi64(T1, v13); | ||||
|         v14 = H0; | ||||
|         v14 = _mm_mul_epu32(v14, T15); | ||||
|         T2  = _mm_add_epi64(T2, v22); | ||||
|         T14 = R22; | ||||
|         v23 = H1; | ||||
|         v23 = _mm_mul_epu32(v23, T15); | ||||
|         T3  = _mm_add_epi64(T3, v32); | ||||
|         v33 = H1; | ||||
|         v33 = _mm_mul_epu32(v33, T14); | ||||
|         T4  = _mm_add_epi64(T4, v41); | ||||
|         v42 = H2; | ||||
|         v42 = _mm_mul_epu32(v42, T14); | ||||
|         T1  = _mm_add_epi64(T1, v14); | ||||
|         T15 = R23; | ||||
|         v24 = H0; | ||||
|         v24 = _mm_mul_epu32(v24, T14); | ||||
|         T2  = _mm_add_epi64(T2, v23); | ||||
|         v34 = H0; | ||||
|         v34 = _mm_mul_epu32(v34, T15); | ||||
|         T3  = _mm_add_epi64(T3, v33); | ||||
|         v43 = H1; | ||||
|         v43 = _mm_mul_epu32(v43, T15); | ||||
|         T4  = _mm_add_epi64(T4, v42); | ||||
|         v44 = H0; | ||||
|         v44 = _mm_mul_epu32(v44, R24); | ||||
|         T2  = _mm_add_epi64(T2, v24); | ||||
|         T3  = _mm_add_epi64(T3, v34); | ||||
|         T4  = _mm_add_epi64(T4, v43); | ||||
|         T4  = _mm_add_epi64(T4, v44); | ||||
|  | ||||
|         /* H += [Mx,My] */ | ||||
|         if (m) { | ||||
|             T5 = _mm_loadu_si128((const xmmi *) (const void *) (m + 0)); | ||||
|             T6 = _mm_loadu_si128((const xmmi *) (const void *) (m + 16)); | ||||
|             T7 = _mm_unpacklo_epi32(T5, T6); | ||||
|             T8 = _mm_unpackhi_epi32(T5, T6); | ||||
|             M0 = _mm_unpacklo_epi32(T7, _mm_setzero_si128()); | ||||
|             M1 = _mm_unpackhi_epi32(T7, _mm_setzero_si128()); | ||||
|             M2 = _mm_unpacklo_epi32(T8, _mm_setzero_si128()); | ||||
|             M3 = _mm_unpackhi_epi32(T8, _mm_setzero_si128()); | ||||
|             M1 = _mm_slli_epi64(M1, 6); | ||||
|             M2 = _mm_slli_epi64(M2, 12); | ||||
|             M3 = _mm_slli_epi64(M3, 18); | ||||
|             T0 = _mm_add_epi64(T0, M0); | ||||
|             T1 = _mm_add_epi64(T1, M1); | ||||
|             T2 = _mm_add_epi64(T2, M2); | ||||
|             T3 = _mm_add_epi64(T3, M3); | ||||
|             T4 = _mm_add_epi64(T4, HIBIT); | ||||
|         } | ||||
|  | ||||
|         /* reduce */ | ||||
|         C1 = _mm_srli_epi64(T0, 26); | ||||
|         C2 = _mm_srli_epi64(T3, 26); | ||||
|         T0 = _mm_and_si128(T0, MMASK); | ||||
|         T3 = _mm_and_si128(T3, MMASK); | ||||
|         T1 = _mm_add_epi64(T1, C1); | ||||
|         T4 = _mm_add_epi64(T4, C2); | ||||
|         C1 = _mm_srli_epi64(T1, 26); | ||||
|         C2 = _mm_srli_epi64(T4, 26); | ||||
|         T1 = _mm_and_si128(T1, MMASK); | ||||
|         T4 = _mm_and_si128(T4, MMASK); | ||||
|         T2 = _mm_add_epi64(T2, C1); | ||||
|         T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE)); | ||||
|         C1 = _mm_srli_epi64(T2, 26); | ||||
|         C2 = _mm_srli_epi64(T0, 26); | ||||
|         T2 = _mm_and_si128(T2, MMASK); | ||||
|         T0 = _mm_and_si128(T0, MMASK); | ||||
|         T3 = _mm_add_epi64(T3, C1); | ||||
|         T1 = _mm_add_epi64(T1, C2); | ||||
|         C1 = _mm_srli_epi64(T3, 26); | ||||
|         T3 = _mm_and_si128(T3, MMASK); | ||||
|         T4 = _mm_add_epi64(T4, C1); | ||||
|  | ||||
|         /* H = (H*[r^2,r^2] + [Mx,My]) */ | ||||
|         H0 = T0; | ||||
|         H1 = T1; | ||||
|         H2 = T2; | ||||
|         H3 = T3; | ||||
|         H4 = T4; | ||||
|     } | ||||
|  | ||||
|     if (m) { | ||||
|         T0 = _mm_shuffle_epi32(H0, _MM_SHUFFLE(0, 0, 2, 0)); | ||||
|         T1 = _mm_shuffle_epi32(H1, _MM_SHUFFLE(0, 0, 2, 0)); | ||||
|         T2 = _mm_shuffle_epi32(H2, _MM_SHUFFLE(0, 0, 2, 0)); | ||||
|         T3 = _mm_shuffle_epi32(H3, _MM_SHUFFLE(0, 0, 2, 0)); | ||||
|         T4 = _mm_shuffle_epi32(H4, _MM_SHUFFLE(0, 0, 2, 0)); | ||||
|         T0 = _mm_unpacklo_epi64(T0, T1); | ||||
|         T1 = _mm_unpacklo_epi64(T2, T3); | ||||
|         _mm_storeu_si128((xmmi *) (void *) &st->H.hh[0], T0); | ||||
|         _mm_storeu_si128((xmmi *) (void *) &st->H.hh[4], T1); | ||||
|         _mm_storel_epi64((xmmi *) (void *) &st->H.hh[8], T4); | ||||
|     } else { | ||||
|         uint32_t t0, t1, t2, t3, t4, b; | ||||
|         uint64_t h0, h1, h2, g0, g1, g2, c, nc; | ||||
|  | ||||
|         /* H = H[0]+H[1] */ | ||||
|         T0 = H0; | ||||
|         T1 = H1; | ||||
|         T2 = H2; | ||||
|         T3 = H3; | ||||
|         T4 = H4; | ||||
|  | ||||
|         T0 = _mm_add_epi64(T0, _mm_srli_si128(T0, 8)); | ||||
|         T1 = _mm_add_epi64(T1, _mm_srli_si128(T1, 8)); | ||||
|         T2 = _mm_add_epi64(T2, _mm_srli_si128(T2, 8)); | ||||
|         T3 = _mm_add_epi64(T3, _mm_srli_si128(T3, 8)); | ||||
|         T4 = _mm_add_epi64(T4, _mm_srli_si128(T4, 8)); | ||||
|  | ||||
|         t0 = _mm_cvtsi128_si32(T0); | ||||
|         b  = (t0 >> 26); | ||||
|         t0 &= 0x3ffffff; | ||||
|         t1 = _mm_cvtsi128_si32(T1) + b; | ||||
|         b  = (t1 >> 26); | ||||
|         t1 &= 0x3ffffff; | ||||
|         t2 = _mm_cvtsi128_si32(T2) + b; | ||||
|         b  = (t2 >> 26); | ||||
|         t2 &= 0x3ffffff; | ||||
|         t3 = _mm_cvtsi128_si32(T3) + b; | ||||
|         b  = (t3 >> 26); | ||||
|         t3 &= 0x3ffffff; | ||||
|         t4 = _mm_cvtsi128_si32(T4) + b; | ||||
|  | ||||
|         /* everything except t4 is in range, so this is all safe */ | ||||
|         h0 = (((uint64_t) t0) | ((uint64_t) t1 << 26)) & 0xfffffffffffull; | ||||
|         h1 = (((uint64_t) t1 >> 18) | ((uint64_t) t2 << 8) | | ||||
|               ((uint64_t) t3 << 34)) & | ||||
|              0xfffffffffffull; | ||||
|         h2 = (((uint64_t) t3 >> 10) | ((uint64_t) t4 << 16)); | ||||
|  | ||||
|         c = (h2 >> 42); | ||||
|         h2 &= 0x3ffffffffff; | ||||
|         h0 += c * 5; | ||||
|         c = (h0 >> 44); | ||||
|         h0 &= 0xfffffffffff; | ||||
|         h1 += c; | ||||
|         c = (h1 >> 44); | ||||
|         h1 &= 0xfffffffffff; | ||||
|         h2 += c; | ||||
|         c = (h2 >> 42); | ||||
|         h2 &= 0x3ffffffffff; | ||||
|         h0 += c * 5; | ||||
|         c = (h0 >> 44); | ||||
|         h0 &= 0xfffffffffff; | ||||
|         h1 += c; | ||||
|  | ||||
|         g0 = h0 + 5; | ||||
|         c  = (g0 >> 44); | ||||
|         g0 &= 0xfffffffffff; | ||||
|         g1 = h1 + c; | ||||
|         c  = (g1 >> 44); | ||||
|         g1 &= 0xfffffffffff; | ||||
|         g2 = h2 + c - ((uint64_t) 1 << 42); | ||||
|  | ||||
|         c  = (g2 >> 63) - 1; | ||||
|         nc = ~c; | ||||
|         h0 = (h0 & nc) | (g0 & c); | ||||
|         h1 = (h1 & nc) | (g1 & c); | ||||
|         h2 = (h2 & nc) | (g2 & c); | ||||
|  | ||||
|         st->H.h[0] = h0; | ||||
|         st->H.h[1] = h1; | ||||
|         st->H.h[2] = h2; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| poly1305_update(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                 unsigned long long bytes) | ||||
| { | ||||
|     unsigned long long i; | ||||
|  | ||||
|     /* handle leftover */ | ||||
|     if (st->leftover) { | ||||
|         unsigned long long want = (poly1305_block_size - st->leftover); | ||||
|  | ||||
|         if (want > bytes) { | ||||
|             want = bytes; | ||||
|         } | ||||
|         for (i = 0; i < want; i++) { | ||||
|             st->buffer[st->leftover + i] = m[i]; | ||||
|         } | ||||
|         bytes -= want; | ||||
|         m += want; | ||||
|         st->leftover += want; | ||||
|         if (st->leftover < poly1305_block_size) { | ||||
|             return; | ||||
|         } | ||||
|         poly1305_blocks(st, st->buffer, poly1305_block_size); | ||||
|         st->leftover = 0; | ||||
|     } | ||||
|  | ||||
|     /* process full blocks */ | ||||
|     if (bytes >= poly1305_block_size) { | ||||
|         unsigned long long want = (bytes & ~(poly1305_block_size - 1)); | ||||
|  | ||||
|         poly1305_blocks(st, m, want); | ||||
|         m += want; | ||||
|         bytes -= want; | ||||
|     } | ||||
|  | ||||
|     /* store leftover */ | ||||
|     if (bytes) { | ||||
|         for (i = 0; i < bytes; i++) { | ||||
|             st->buffer[st->leftover + i] = m[i]; | ||||
|         } | ||||
|         st->leftover += bytes; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static POLY1305_NOINLINE void | ||||
| poly1305_finish_ext(poly1305_state_internal_t *st, const unsigned char *m, | ||||
|                     unsigned long long leftover, unsigned char mac[16]) | ||||
| { | ||||
|     uint64_t h0, h1, h2; | ||||
|  | ||||
|     if (leftover) { | ||||
|         CRYPTO_ALIGN(16) unsigned char final[32] = { 0 }; | ||||
|  | ||||
|         poly1305_block_copy31(final, m, leftover); | ||||
|         if (leftover != 16) { | ||||
|             final[leftover] = 1; | ||||
|         } | ||||
|         st->flags |= | ||||
|             (leftover >= 16) ? poly1305_final_shift8 : poly1305_final_shift16; | ||||
|         poly1305_blocks(st, final, 32); | ||||
|     } | ||||
|  | ||||
|     if (st->flags & poly1305_started) { | ||||
|         /* finalize, H *= [r^2,r], or H *= [r,1] */ | ||||
|         if (!leftover || (leftover > 16)) { | ||||
|             st->flags |= poly1305_final_r2_r; | ||||
|         } else { | ||||
|             st->flags |= poly1305_final_r_1; | ||||
|         } | ||||
|         poly1305_blocks(st, NULL, 32); | ||||
|     } | ||||
|  | ||||
|     h0 = st->H.h[0]; | ||||
|     h1 = st->H.h[1]; | ||||
|     h2 = st->H.h[2]; | ||||
|  | ||||
|     /* pad */ | ||||
|     h0 = ((h0) | (h1 << 44)); | ||||
|     h1 = ((h1 >> 20) | (h2 << 24)); | ||||
| #ifdef HAVE_AMD64_ASM | ||||
|     __asm__ __volatile__( | ||||
|         "addq %2, %0 ;\n" | ||||
|         "adcq %3, %1 ;\n" | ||||
|         : "+r"(h0), "+r"(h1) | ||||
|         : "r"(st->pad[0]), "r"(st->pad[1]) | ||||
|         : "flags", "cc"); | ||||
| #else | ||||
|     { | ||||
|         uint128_t h; | ||||
|  | ||||
|         memcpy(&h, &st->pad[0], 16); | ||||
|         h += ((uint128_t) h1 << 64) | h0; | ||||
|         h0 = (uint64_t) h; | ||||
|         h1 = (uint64_t)(h >> 64); | ||||
|     } | ||||
| #endif | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 0, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 1, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 2, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 3, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 4, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 5, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 6, _mm_setzero_si128()); | ||||
|     _mm_storeu_si128((xmmi *) (void *) st + 7, _mm_setzero_si128()); | ||||
|  | ||||
|     memcpy(&mac[0], &h0, 8); | ||||
|     memcpy(&mac[8], &h1, 8); | ||||
|  | ||||
|     sodium_memzero((void *) st, sizeof *st); | ||||
| } | ||||
|  | ||||
| static void | ||||
| poly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16]) | ||||
| { | ||||
|     poly1305_finish_ext(st, st->buffer, st->leftover, mac); | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_sse2_init(crypto_onetimeauth_poly1305_state *state, | ||||
|                                       const unsigned char *key) | ||||
| { | ||||
|     COMPILER_ASSERT(sizeof(crypto_onetimeauth_poly1305_state) >= | ||||
|                     sizeof(poly1305_state_internal_t)); | ||||
|     poly1305_init_ext((poly1305_state_internal_t *) (void *) state, key, 0U); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_sse2_update( | ||||
|     crypto_onetimeauth_poly1305_state *state, const unsigned char *in, | ||||
|     unsigned long long inlen) | ||||
| { | ||||
|     poly1305_update((poly1305_state_internal_t *) (void *) state, in, inlen); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_sse2_final(crypto_onetimeauth_poly1305_state *state, | ||||
|                                        unsigned char *out) | ||||
| { | ||||
|     poly1305_finish((poly1305_state_internal_t *) (void *) state, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_sse2(unsigned char *out, const unsigned char *m, | ||||
|                                  unsigned long long   inlen, | ||||
|                                  const unsigned char *key) | ||||
| { | ||||
|     CRYPTO_ALIGN(64) poly1305_state_internal_t st; | ||||
|     unsigned long long                         blocks; | ||||
|  | ||||
|     poly1305_init_ext(&st, key, inlen); | ||||
|     blocks = inlen & ~31; | ||||
|     if (blocks > 0) { | ||||
|         poly1305_blocks(&st, m, blocks); | ||||
|         m += blocks; | ||||
|         inlen -= blocks; | ||||
|     } | ||||
|     poly1305_finish_ext(&st, m, inlen, out); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_onetimeauth_poly1305_sse2_verify(const unsigned char *h, | ||||
|                                         const unsigned char *in, | ||||
|                                         unsigned long long   inlen, | ||||
|                                         const unsigned char *k) | ||||
| { | ||||
|     unsigned char correct[16]; | ||||
|  | ||||
|     crypto_onetimeauth_poly1305_sse2(correct, in, inlen, k); | ||||
|  | ||||
|     return crypto_verify_16(h, correct); | ||||
| } | ||||
|  | ||||
| struct crypto_onetimeauth_poly1305_implementation | ||||
|     crypto_onetimeauth_poly1305_sse2_implementation = { | ||||
|         SODIUM_C99(.onetimeauth =) crypto_onetimeauth_poly1305_sse2, | ||||
|         SODIUM_C99(.onetimeauth_verify =) | ||||
|             crypto_onetimeauth_poly1305_sse2_verify, | ||||
|         SODIUM_C99(.onetimeauth_init =) crypto_onetimeauth_poly1305_sse2_init, | ||||
|         SODIUM_C99(.onetimeauth_update =) | ||||
|             crypto_onetimeauth_poly1305_sse2_update, | ||||
|         SODIUM_C99(.onetimeauth_final =) crypto_onetimeauth_poly1305_sse2_final | ||||
|     }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										12
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								deps/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #ifndef poly1305_sse2_H | ||||
| #define poly1305_sse2_H | ||||
|  | ||||
| #include <stddef.h> | ||||
|  | ||||
| #include "../onetimeauth_poly1305.h" | ||||
| #include "crypto_onetimeauth_poly1305.h" | ||||
|  | ||||
| extern struct crypto_onetimeauth_poly1305_implementation | ||||
|     crypto_onetimeauth_poly1305_sse2_implementation; | ||||
|  | ||||
| #endif /* poly1305_sse2_H */ | ||||
							
								
								
									
										556
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										556
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,556 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #ifdef HAVE_SYS_MMAN_H | ||||
| # include <sys/mman.h> | ||||
| #endif | ||||
|  | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "private/common.h" | ||||
| #include "private/implementations.h" | ||||
| #include "runtime.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "blake2b-long.h" | ||||
|  | ||||
| #if !defined(MAP_ANON) && defined(MAP_ANONYMOUS) | ||||
| # define MAP_ANON MAP_ANONYMOUS | ||||
| #endif | ||||
| #ifndef MAP_NOCORE | ||||
| # ifdef MAP_CONCEAL | ||||
| #  define MAP_NOCORE MAP_CONCEAL | ||||
| # else | ||||
| #  define MAP_NOCORE 0 | ||||
| # endif | ||||
| #endif | ||||
| #ifndef MAP_POPULATE | ||||
| # define MAP_POPULATE 0 | ||||
| #endif | ||||
|  | ||||
| static fill_segment_fn fill_segment = argon2_fill_segment_ref; | ||||
|  | ||||
| static void | ||||
| load_block(block *dst, const void *input) | ||||
| { | ||||
|     unsigned i; | ||||
|     for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { | ||||
|         dst->v[i] = LOAD64_LE((const uint8_t *) input + i * sizeof(dst->v[i])); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| store_block(void *output, const block *src) | ||||
| { | ||||
|     unsigned i; | ||||
|     for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { | ||||
|         STORE64_LE((uint8_t *) output + i * sizeof(src->v[i]), src->v[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /***************Memory allocators*****************/ | ||||
| /* Allocates memory to the given pointer | ||||
|  * @param memory pointer to the pointer to the memory | ||||
|  * @param m_cost number of blocks to allocate in the memory | ||||
|  * @return ARGON2_OK if @memory is a valid pointer and memory is allocated | ||||
|  */ | ||||
| static int allocate_memory(block_region **region, uint32_t m_cost); | ||||
|  | ||||
| static int | ||||
| allocate_memory(block_region **region, uint32_t m_cost) | ||||
| { | ||||
|     void  *base; | ||||
|     block *memory; | ||||
|     size_t memory_size; | ||||
|  | ||||
|     if (region == NULL) { | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     memory_size = sizeof(block) * m_cost; | ||||
|     if (m_cost == 0 || memory_size / m_cost != sizeof(block)) { | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     *region = (block_region *) malloc(sizeof(block_region)); | ||||
|     if (*region == NULL) { | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     (*region)->base = (*region)->memory = NULL; | ||||
|  | ||||
| #if defined(MAP_ANON) && defined(HAVE_MMAP) | ||||
|     if ((base = mmap(NULL, memory_size, PROT_READ | PROT_WRITE, | ||||
|                      MAP_ANON | MAP_PRIVATE | MAP_NOCORE | MAP_POPULATE, | ||||
|                      -1, 0)) == MAP_FAILED) { | ||||
|         base = NULL; /* LCOV_EXCL_LINE */ | ||||
|     }                /* LCOV_EXCL_LINE */ | ||||
|     memory = (block *) base; | ||||
| #elif defined(HAVE_POSIX_MEMALIGN) | ||||
|     if ((errno = posix_memalign((void **) &base, 64, memory_size)) != 0) { | ||||
|         base = NULL; | ||||
|     } | ||||
|     memory = (block *) base; | ||||
| #else | ||||
|     memory = NULL; | ||||
|     if (memory_size + 63 < memory_size) { | ||||
|         base  = NULL; | ||||
|         errno = ENOMEM; | ||||
|     } else if ((base = malloc(memory_size + 63)) != NULL) { | ||||
|         uint8_t *aligned = ((uint8_t *) base) + 63; | ||||
|         aligned -= (uintptr_t) aligned & 63; | ||||
|         memory = (block *) aligned; | ||||
|     } | ||||
| #endif | ||||
|     if (base == NULL) { | ||||
|         /* LCOV_EXCL_START */ | ||||
|         free(*region); | ||||
|         *region = NULL; | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; | ||||
|         /* LCOV_EXCL_STOP */ | ||||
|     } | ||||
|     (*region)->base   = base; | ||||
|     (*region)->memory = memory; | ||||
|     (*region)->size   = memory_size; | ||||
|  | ||||
|     return ARGON2_OK; | ||||
| } | ||||
|  | ||||
| /*********Memory functions*/ | ||||
|  | ||||
| /* Clears memory | ||||
|  * @param instance pointer to the current instance | ||||
|  * @param clear_memory indicates if we clear the memory with zeros. | ||||
|  */ | ||||
| static void clear_memory(argon2_instance_t *instance, int clear); | ||||
|  | ||||
| static void | ||||
| clear_memory(argon2_instance_t *instance, int clear) | ||||
| { | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (clear) { | ||||
|         if (instance->region != NULL) { | ||||
|             sodium_memzero(instance->region->memory, | ||||
|                            sizeof(block) * instance->memory_blocks); | ||||
|         } | ||||
|         if (instance->pseudo_rands != NULL) { | ||||
|             sodium_memzero(instance->pseudo_rands, | ||||
|                            sizeof(uint64_t) * instance->segment_length); | ||||
|         } | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
| } | ||||
|  | ||||
| /* Deallocates memory | ||||
|  * @param memory pointer to the blocks | ||||
|  */ | ||||
| static void free_memory(block_region *region); | ||||
|  | ||||
| static void | ||||
| free_memory(block_region *region) | ||||
| { | ||||
|     if (region && region->base) { | ||||
| #if defined(MAP_ANON) && defined(HAVE_MMAP) | ||||
|         if (munmap(region->base, region->size)) { | ||||
|             return; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
| #else | ||||
|         free(region->base); | ||||
| #endif | ||||
|     } | ||||
|     free(region); | ||||
| } | ||||
|  | ||||
| static void | ||||
| argon2_free_instance(argon2_instance_t *instance, int flags) | ||||
| { | ||||
|     /* Clear memory */ | ||||
|     clear_memory(instance, flags & ARGON2_FLAG_CLEAR_MEMORY); | ||||
|  | ||||
|     /* Deallocate the memory */ | ||||
|     free(instance->pseudo_rands); | ||||
|     instance->pseudo_rands = NULL; | ||||
|     free_memory(instance->region); | ||||
|     instance->region = NULL; | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_finalize(const argon2_context *context, argon2_instance_t *instance) | ||||
| { | ||||
|     if (context != NULL && instance != NULL) { | ||||
|         block    blockhash; | ||||
|         uint32_t l; | ||||
|  | ||||
|         copy_block(&blockhash, | ||||
|                    instance->region->memory + instance->lane_length - 1); | ||||
|  | ||||
|         /* XOR the last blocks */ | ||||
|         for (l = 1; l < instance->lanes; ++l) { | ||||
|             uint32_t last_block_in_lane = | ||||
|                 l * instance->lane_length + (instance->lane_length - 1); | ||||
|             xor_block(&blockhash, | ||||
|                       instance->region->memory + last_block_in_lane); | ||||
|         } | ||||
|  | ||||
|         /* Hash the result */ | ||||
|         { | ||||
|             uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; | ||||
|             store_block(blockhash_bytes, &blockhash); | ||||
|             blake2b_long(context->out, context->outlen, blockhash_bytes, | ||||
|                          ARGON2_BLOCK_SIZE); | ||||
|             sodium_memzero(blockhash.v, | ||||
|                            ARGON2_BLOCK_SIZE); /* clear blockhash */ | ||||
|             sodium_memzero(blockhash_bytes, | ||||
|                            ARGON2_BLOCK_SIZE); /* clear blockhash_bytes */ | ||||
|         } | ||||
|  | ||||
|         argon2_free_instance(instance, context->flags); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_fill_memory_blocks(argon2_instance_t *instance, uint32_t pass) | ||||
| { | ||||
|     argon2_position_t position; | ||||
|     uint32_t l; | ||||
|     uint32_t s; | ||||
|  | ||||
|     if (instance == NULL || instance->lanes == 0) { | ||||
|         return; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|  | ||||
|     position.pass = pass; | ||||
|     for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { | ||||
|         position.slice = (uint8_t) s; | ||||
|         for (l = 0; l < instance->lanes; ++l) { | ||||
|             position.lane  = l; | ||||
|             position.index = 0; | ||||
|             fill_segment(instance, position); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2_validate_inputs(const argon2_context *context) | ||||
| { | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (NULL == context) { | ||||
|         return ARGON2_INCORRECT_PARAMETER; | ||||
|     } | ||||
|  | ||||
|     if (NULL == context->out) { | ||||
|         return ARGON2_OUTPUT_PTR_NULL; | ||||
|     } | ||||
|  | ||||
|     /* Validate output length */ | ||||
|     if (ARGON2_MIN_OUTLEN > context->outlen) { | ||||
|         return ARGON2_OUTPUT_TOO_SHORT; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_OUTLEN < context->outlen) { | ||||
|         return ARGON2_OUTPUT_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     /* Validate password (required param) */ | ||||
|     if (NULL == context->pwd) { | ||||
|         if (0 != context->pwdlen) { | ||||
|             return ARGON2_PWD_PTR_MISMATCH; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MIN_PWD_LENGTH > context->pwdlen) { | ||||
|         return ARGON2_PWD_TOO_SHORT; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_PWD_LENGTH < context->pwdlen) { | ||||
|         return ARGON2_PWD_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     /* Validate salt (required param) */ | ||||
|     if (NULL == context->salt) { | ||||
|         if (0 != context->saltlen) { | ||||
|             return ARGON2_SALT_PTR_MISMATCH; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MIN_SALT_LENGTH > context->saltlen) { | ||||
|         return ARGON2_SALT_TOO_SHORT; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_SALT_LENGTH < context->saltlen) { | ||||
|         return ARGON2_SALT_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     /* Validate secret (optional param) */ | ||||
|     if (NULL == context->secret) { | ||||
|         if (0 != context->secretlen) { | ||||
|             return ARGON2_SECRET_PTR_MISMATCH; | ||||
|         } | ||||
|     } else { | ||||
|         if (ARGON2_MIN_SECRET > context->secretlen) { | ||||
|             return ARGON2_SECRET_TOO_SHORT; | ||||
|         } | ||||
|  | ||||
|         if (ARGON2_MAX_SECRET < context->secretlen) { | ||||
|             return ARGON2_SECRET_TOO_LONG; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* Validate associated data (optional param) */ | ||||
|     if (NULL == context->ad) { | ||||
|         if (0 != context->adlen) { | ||||
|             return ARGON2_AD_PTR_MISMATCH; | ||||
|         } | ||||
|     } else { | ||||
|         if (ARGON2_MIN_AD_LENGTH > context->adlen) { | ||||
|             return ARGON2_AD_TOO_SHORT; | ||||
|         } | ||||
|  | ||||
|         if (ARGON2_MAX_AD_LENGTH < context->adlen) { | ||||
|             return ARGON2_AD_TOO_LONG; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* Validate lanes */ | ||||
|     if (ARGON2_MIN_LANES > context->lanes) { | ||||
|         return ARGON2_LANES_TOO_FEW; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_LANES < context->lanes) { | ||||
|         return ARGON2_LANES_TOO_MANY; | ||||
|     } | ||||
|  | ||||
|     /* Validate memory cost */ | ||||
|     if (ARGON2_MIN_MEMORY > context->m_cost) { | ||||
|         return ARGON2_MEMORY_TOO_LITTLE; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_MEMORY < context->m_cost) { | ||||
|         return ARGON2_MEMORY_TOO_MUCH; | ||||
|     } | ||||
|  | ||||
|     if (context->m_cost < 8 * context->lanes) { | ||||
|         return ARGON2_MEMORY_TOO_LITTLE; | ||||
|     } | ||||
|  | ||||
|     /* Validate time cost */ | ||||
|     if (ARGON2_MIN_TIME > context->t_cost) { | ||||
|         return ARGON2_TIME_TOO_SMALL; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_TIME < context->t_cost) { | ||||
|         return ARGON2_TIME_TOO_LARGE; | ||||
|     } | ||||
|  | ||||
|     /* Validate threads */ | ||||
|     if (ARGON2_MIN_THREADS > context->threads) { | ||||
|         return ARGON2_THREADS_TOO_FEW; | ||||
|     } | ||||
|  | ||||
|     if (ARGON2_MAX_THREADS < context->threads) { | ||||
|         return ARGON2_THREADS_TOO_MANY; | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|     return ARGON2_OK; | ||||
| } | ||||
|  | ||||
| static void | ||||
| argon2_fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) | ||||
| { | ||||
|     uint32_t l; | ||||
|     /* Make the first and second block in each lane as G(H0||i||0) or | ||||
|        G(H0||i||1) */ | ||||
|     uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; | ||||
|     for (l = 0; l < instance->lanes; ++l) { | ||||
|         STORE32_LE(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0); | ||||
|         STORE32_LE(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l); | ||||
|         blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, | ||||
|                      ARGON2_PREHASH_SEED_LENGTH); | ||||
|         load_block(&instance->region->memory[l * instance->lane_length + 0], | ||||
|                    blockhash_bytes); | ||||
|  | ||||
|         STORE32_LE(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1); | ||||
|         blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, | ||||
|                      ARGON2_PREHASH_SEED_LENGTH); | ||||
|         load_block(&instance->region->memory[l * instance->lane_length + 1], | ||||
|                    blockhash_bytes); | ||||
|     } | ||||
|     sodium_memzero(blockhash_bytes, ARGON2_BLOCK_SIZE); | ||||
| } | ||||
|  | ||||
| static void | ||||
| argon2_initial_hash(uint8_t *blockhash, argon2_context *context, | ||||
|                     argon2_type type) | ||||
| { | ||||
|     crypto_generichash_blake2b_state BlakeHash; | ||||
|     uint8_t                          value[4U /* sizeof(uint32_t) */]; | ||||
|  | ||||
|     if (NULL == context || NULL == blockhash) { | ||||
|         return; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|  | ||||
|     crypto_generichash_blake2b_init(&BlakeHash, NULL, 0U, | ||||
|                                     ARGON2_PREHASH_DIGEST_LENGTH); | ||||
|  | ||||
|     STORE32_LE(value, context->lanes); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, context->outlen); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, context->m_cost); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, context->t_cost); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, ARGON2_VERSION_NUMBER); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, (uint32_t) type); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     STORE32_LE(value, context->pwdlen); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     if (context->pwd != NULL) { | ||||
|         crypto_generichash_blake2b_update( | ||||
|             &BlakeHash, (const uint8_t *) context->pwd, context->pwdlen); | ||||
|  | ||||
|         /* LCOV_EXCL_START */ | ||||
|         if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) { | ||||
|             sodium_memzero(context->pwd, context->pwdlen); | ||||
|             context->pwdlen = 0; | ||||
|         } | ||||
|         /* LCOV_EXCL_STOP */ | ||||
|     } | ||||
|  | ||||
|     STORE32_LE(value, context->saltlen); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     if (context->salt != NULL) { | ||||
|         crypto_generichash_blake2b_update( | ||||
|             &BlakeHash, (const uint8_t *) context->salt, context->saltlen); | ||||
|     } | ||||
|  | ||||
|     STORE32_LE(value, context->secretlen); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (context->secret != NULL) { | ||||
|         crypto_generichash_blake2b_update( | ||||
|             &BlakeHash, (const uint8_t *) context->secret, context->secretlen); | ||||
|  | ||||
|         if (context->flags & ARGON2_FLAG_CLEAR_SECRET) { | ||||
|             sodium_memzero(context->secret, context->secretlen); | ||||
|             context->secretlen = 0; | ||||
|         } | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|     STORE32_LE(value, context->adlen); | ||||
|     crypto_generichash_blake2b_update(&BlakeHash, value, sizeof(value)); | ||||
|  | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (context->ad != NULL) { | ||||
|         crypto_generichash_blake2b_update( | ||||
|             &BlakeHash, (const uint8_t *) context->ad, context->adlen); | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|     crypto_generichash_blake2b_final(&BlakeHash, blockhash, | ||||
|                                      ARGON2_PREHASH_DIGEST_LENGTH); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2_initialize(argon2_instance_t *instance, argon2_context *context) | ||||
| { | ||||
|     uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; | ||||
|     int     result = ARGON2_OK; | ||||
|  | ||||
|     if (instance == NULL || context == NULL) { | ||||
|         return ARGON2_INCORRECT_PARAMETER; | ||||
|     } | ||||
|  | ||||
|     /* 1. Memory allocation */ | ||||
|  | ||||
|     if ((instance->pseudo_rands = (uint64_t *) | ||||
|          malloc(sizeof(uint64_t) * instance->segment_length)) == NULL) { | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; | ||||
|     } | ||||
|  | ||||
|     result = allocate_memory(&(instance->region), instance->memory_blocks); | ||||
|     if (ARGON2_OK != result) { | ||||
|         argon2_free_instance(instance, context->flags); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     /* 2. Initial hashing */ | ||||
|     /* H_0 + 8 extra bytes to produce the first blocks */ | ||||
|     /* uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; */ | ||||
|     /* Hashing all inputs */ | ||||
|     argon2_initial_hash(blockhash, context, instance->type); | ||||
|     /* Zeroing 8 extra bytes */ | ||||
|     sodium_memzero(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, | ||||
|                    ARGON2_PREHASH_SEED_LENGTH - ARGON2_PREHASH_DIGEST_LENGTH); | ||||
|  | ||||
|     /* 3. Creating first blocks, we always have at least two blocks in a slice | ||||
|      */ | ||||
|     argon2_fill_first_blocks(blockhash, instance); | ||||
|     /* Clearing the hash */ | ||||
|     sodium_memzero(blockhash, ARGON2_PREHASH_SEED_LENGTH); | ||||
|  | ||||
|     return ARGON2_OK; | ||||
| } | ||||
|  | ||||
| static int | ||||
| argon2_pick_best_implementation(void) | ||||
| { | ||||
| /* LCOV_EXCL_START */ | ||||
| #if defined(HAVE_AVX512FINTRIN_H) && defined(HAVE_AVX2INTRIN_H) && \ | ||||
|     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H) && \ | ||||
|     !defined(__APPLE__) | ||||
|     if (sodium_runtime_has_avx512f()) { | ||||
|         fill_segment = argon2_fill_segment_avx512f; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
| #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_TMMINTRIN_H) && \ | ||||
|     defined(HAVE_SMMINTRIN_H) | ||||
|     if (sodium_runtime_has_avx2()) { | ||||
|         fill_segment = argon2_fill_segment_avx2; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) | ||||
|     if (sodium_runtime_has_ssse3()) { | ||||
|         fill_segment = argon2_fill_segment_ssse3; | ||||
|         return 0; | ||||
|     } | ||||
| #endif | ||||
|     fill_segment = argon2_fill_segment_ref; | ||||
|  | ||||
|     return 0; | ||||
|     /* LCOV_EXCL_STOP */ | ||||
| } | ||||
|  | ||||
| int | ||||
| _crypto_pwhash_argon2_pick_best_implementation(void) | ||||
| { | ||||
|     return argon2_pick_best_implementation(); | ||||
| } | ||||
							
								
								
									
										271
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-core.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,271 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef argon2_core_H | ||||
| #define argon2_core_H | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2.h" | ||||
|  | ||||
| /*************************Argon2 internal | ||||
|  * constants**************************************************/ | ||||
|  | ||||
| enum argon2_ctx_constants { | ||||
|     /* Version of the algorithm */ | ||||
|     ARGON2_VERSION_NUMBER = 0x13, | ||||
|  | ||||
|     /* Memory block size in bytes */ | ||||
|     ARGON2_BLOCK_SIZE      = 1024, | ||||
|     ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 8, | ||||
|     ARGON2_OWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 16, | ||||
|     ARGON2_HWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 32, | ||||
|     ARGON2_512BIT_WORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 64, | ||||
|  | ||||
|     /* Number of pseudo-random values generated by one call to Blake in Argon2i | ||||
|        to | ||||
|        generate reference block positions */ | ||||
|     ARGON2_ADDRESSES_IN_BLOCK = 128, | ||||
|  | ||||
|     /* Pre-hashing digest length and its extension*/ | ||||
|     ARGON2_PREHASH_DIGEST_LENGTH = 64, | ||||
|     ARGON2_PREHASH_SEED_LENGTH   = 72 | ||||
| }; | ||||
|  | ||||
| /*************************Argon2 internal data | ||||
|  * types**************************************************/ | ||||
|  | ||||
| /* | ||||
|  * Structure for the (1KB) memory block implemented as 128 64-bit words. | ||||
|  * Memory blocks can be copied, XORed. Internal words can be accessed by [] (no | ||||
|  * bounds checking). | ||||
|  */ | ||||
| typedef struct block_ { | ||||
|     uint64_t v[ARGON2_QWORDS_IN_BLOCK]; | ||||
| } block; | ||||
|  | ||||
| typedef struct block_region_ { | ||||
|     void * base; | ||||
|     block *memory; | ||||
|     size_t size; | ||||
| } block_region; | ||||
|  | ||||
| /*****************Functions that work with the block******************/ | ||||
|  | ||||
| /* Initialize each byte of the block with @in */ | ||||
| static inline void | ||||
| init_block_value(block *b, uint8_t in) | ||||
| { | ||||
|     memset(b->v, in, sizeof(b->v)); | ||||
| } | ||||
|  | ||||
| /* Copy block @src to block @dst */ | ||||
| static inline void | ||||
| copy_block(block *dst, const block *src) | ||||
| { | ||||
|     memcpy(dst->v, src->v, sizeof(uint64_t) * ARGON2_QWORDS_IN_BLOCK); | ||||
| } | ||||
|  | ||||
| /* XOR @src onto @dst bytewise */ | ||||
| static inline void | ||||
| xor_block(block *dst, const block *src) | ||||
| { | ||||
|     int i; | ||||
|     for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { | ||||
|         dst->v[i] ^= src->v[i]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Argon2 instance: memory pointer, number of passes, amount of memory, type, | ||||
|  * and derived values. | ||||
|  * Used to evaluate the number and location of blocks to construct in each | ||||
|  * thread | ||||
|  */ | ||||
| typedef struct Argon2_instance_t { | ||||
|     block_region *region;        /* Memory region pointer */ | ||||
|     uint64_t     *pseudo_rands; | ||||
|     uint32_t      passes;        /* Number of passes */ | ||||
|     uint32_t      current_pass; | ||||
|     uint32_t      memory_blocks; /* Number of blocks in memory */ | ||||
|     uint32_t      segment_length; | ||||
|     uint32_t      lane_length; | ||||
|     uint32_t      lanes; | ||||
|     uint32_t      threads; | ||||
|     argon2_type   type; | ||||
|     int           print_internals; /* whether to print the memory blocks */ | ||||
| } argon2_instance_t; | ||||
|  | ||||
| /* | ||||
|  * Argon2 position: where we construct the block right now. Used to distribute | ||||
|  * work between threads. | ||||
|  */ | ||||
| typedef struct Argon2_position_t { | ||||
|     uint32_t pass; | ||||
|     uint32_t lane; | ||||
|     uint8_t  slice; | ||||
|     uint32_t index; | ||||
| } argon2_position_t; | ||||
|  | ||||
| /*Struct that holds the inputs for thread handling FillSegment*/ | ||||
| typedef struct Argon2_thread_data { | ||||
|     argon2_instance_t *instance_ptr; | ||||
|     argon2_position_t  pos; | ||||
| } argon2_thread_data; | ||||
|  | ||||
| /*************************Argon2 core | ||||
|  * functions**************************************************/ | ||||
|  | ||||
| /* | ||||
|  * Computes absolute position of reference block in the lane following a skewed | ||||
|  * distribution and using a pseudo-random value as input | ||||
|  * @param instance Pointer to the current instance | ||||
|  * @param position Pointer to the current position | ||||
|  * @param pseudo_rand 32-bit pseudo-random value used to determine the position | ||||
|  * @param same_lane Indicates if the block will be taken from the current lane. | ||||
|  * If so we can reference the current segment | ||||
|  * @pre All pointers must be valid | ||||
|  */ | ||||
| static uint32_t index_alpha(const argon2_instance_t *instance, | ||||
|                             const argon2_position_t *position, uint32_t pseudo_rand, | ||||
|                             int same_lane) | ||||
| { | ||||
|     /* | ||||
|      * Pass 0: | ||||
|      *      This lane : all already finished segments plus already constructed | ||||
|      * blocks in this segment | ||||
|      *      Other lanes : all already finished segments | ||||
|      * Pass 1+: | ||||
|      *      This lane : (SYNC_POINTS - 1) last segments plus already constructed | ||||
|      * blocks in this segment | ||||
|      *      Other lanes : (SYNC_POINTS - 1) last segments | ||||
|      */ | ||||
|     uint32_t reference_area_size; | ||||
|     uint64_t relative_position; | ||||
|     uint32_t start_position, absolute_position; | ||||
|  | ||||
|     if (position->pass == 0) { | ||||
|         /* First pass */ | ||||
|         if (position->slice == 0) { | ||||
|             /* First slice */ | ||||
|             reference_area_size = | ||||
|                 position->index - 1; /* all but the previous */ | ||||
|         } else { | ||||
|             if (same_lane) { | ||||
|                 /* The same lane => add current segment */ | ||||
|                 reference_area_size = | ||||
|                     position->slice * instance->segment_length + | ||||
|                     position->index - 1; | ||||
|             } else { | ||||
|                 reference_area_size = | ||||
|                     position->slice * instance->segment_length + | ||||
|                     ((position->index == 0) ? (-1) : 0); | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         /* Second pass */ | ||||
|         if (same_lane) { | ||||
|             reference_area_size = instance->lane_length - | ||||
|                                   instance->segment_length + position->index - | ||||
|                                   1; | ||||
|         } else { | ||||
|             reference_area_size = instance->lane_length - | ||||
|                                   instance->segment_length + | ||||
|                                   ((position->index == 0) ? (-1) : 0); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* 1.2.4. Mapping pseudo_rand to 0..<reference_area_size-1> and produce | ||||
|      * relative position */ | ||||
|     relative_position = pseudo_rand; | ||||
|     relative_position = relative_position * relative_position >> 32; | ||||
|     relative_position = reference_area_size - 1 - | ||||
|                         (reference_area_size * relative_position >> 32); | ||||
|  | ||||
|     /* 1.2.5 Computing starting position */ | ||||
|     start_position = 0; | ||||
|  | ||||
|     if (position->pass != 0) { | ||||
|         start_position = (position->slice == ARGON2_SYNC_POINTS - 1) | ||||
|                              ? 0 | ||||
|                              : (position->slice + 1) * instance->segment_length; | ||||
|     } | ||||
|  | ||||
|     /* 1.2.6. Computing absolute position */ | ||||
|     absolute_position = (start_position + relative_position) % | ||||
|                         instance->lane_length; /* absolute position */ | ||||
|     return absolute_position; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Function that validates all inputs against predefined restrictions and return | ||||
|  * an error code | ||||
|  * @param context Pointer to current Argon2 context | ||||
|  * @return ARGON2_OK if everything is all right, otherwise one of error codes | ||||
|  * (all defined in <argon2.h> | ||||
|  */ | ||||
| int argon2_validate_inputs(const argon2_context *context); | ||||
|  | ||||
| /* | ||||
|  * Function allocates memory, hashes the inputs with Blake,  and creates first | ||||
|  * two blocks. Returns the pointer to the main memory with 2 blocks per lane | ||||
|  * initialized | ||||
|  * @param  context  Pointer to the Argon2 internal structure containing memory | ||||
|  * pointer, and parameters for time and space requirements. | ||||
|  * @param  instance Current Argon2 instance | ||||
|  * @return Zero if successful, -1 if memory failed to allocate. @context->state | ||||
|  * will be modified if successful. | ||||
|  */ | ||||
| int argon2_initialize(argon2_instance_t *instance, argon2_context *context); | ||||
|  | ||||
| /* | ||||
|  * XORing the last block of each lane, hashing it, making the tag. Deallocates | ||||
|  * the memory. | ||||
|  * @param context Pointer to current Argon2 context (use only the out parameters | ||||
|  * from it) | ||||
|  * @param instance Pointer to current instance of Argon2 | ||||
|  * @pre instance->state must point to necessary amount of memory | ||||
|  * @pre context->out must point to outlen bytes of memory | ||||
|  * @pre if context->free_cbk is not NULL, it should point to a function that | ||||
|  * deallocates memory | ||||
|  */ | ||||
| void argon2_finalize(const argon2_context *context, | ||||
|                      argon2_instance_t *instance); | ||||
|  | ||||
| /* | ||||
|  * Function that fills the segment using previous segments also from other | ||||
|  * threads | ||||
|  * @param instance Pointer to the current instance | ||||
|  * @param position Current position | ||||
|  * @pre all block pointers must be valid | ||||
|  */ | ||||
| typedef void (*fill_segment_fn)(const argon2_instance_t *instance, | ||||
|                                 argon2_position_t        position); | ||||
| void argon2_fill_segment_avx512f(const argon2_instance_t *instance, | ||||
|                                  argon2_position_t        position); | ||||
| void argon2_fill_segment_avx2(const argon2_instance_t *instance, | ||||
|                               argon2_position_t        position); | ||||
| void argon2_fill_segment_ssse3(const argon2_instance_t *instance, | ||||
|                                argon2_position_t        position); | ||||
| void argon2_fill_segment_ref(const argon2_instance_t *instance, | ||||
|                              argon2_position_t        position); | ||||
|  | ||||
| /* | ||||
|  * Function that fills the entire memory t_cost times based on the first two | ||||
|  * blocks in each lane | ||||
|  * @param instance Pointer to the current instance | ||||
|  * @return Zero if successful, -1 if memory failed to allocate | ||||
|  */ | ||||
| void argon2_fill_memory_blocks(argon2_instance_t *instance, uint32_t pass); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										306
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| #include "argon2-encoding.h" | ||||
| #include "argon2-core.h" | ||||
| #include "utils.h" | ||||
| #include <limits.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /* | ||||
|  * Example code for a decoder and encoder of "hash strings", with Argon2 | ||||
|  * parameters. | ||||
|  * | ||||
|  * The code was originally written by Thomas Pornin <pornin@bolet.org>, | ||||
|  * to whom comments and remarks may be sent. It is released under what | ||||
|  * should amount to Public Domain or its closest equivalent; the | ||||
|  * following mantra is supposed to incarnate that fact with all the | ||||
|  * proper legal rituals: | ||||
|  * | ||||
|  * --------------------------------------------------------------------- | ||||
|  * This file is provided under the terms of Creative Commons CC0 1.0 | ||||
|  * Public Domain Dedication. To the extent possible under law, the | ||||
|  * author (Thomas Pornin) has waived all copyright and related or | ||||
|  * neighboring rights to this file. This work is published from: Canada. | ||||
|  * --------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (c) 2015 Thomas Pornin | ||||
|  */ | ||||
|  | ||||
| /* ==================================================================== */ | ||||
|  | ||||
| /* | ||||
|  * Decode decimal integer from 'str'; the value is written in '*v'. | ||||
|  * Returned value is a pointer to the next non-decimal character in the | ||||
|  * string. If there is no digit at all, or the value encoding is not | ||||
|  * minimal (extra leading zeros), or the value does not fit in an | ||||
|  * 'unsigned long', then NULL is returned. | ||||
|  */ | ||||
| static const char * | ||||
| decode_decimal(const char *str, unsigned long *v) | ||||
| { | ||||
|     const char    *orig; | ||||
|     unsigned long  acc; | ||||
|  | ||||
|     acc = 0; | ||||
|     for (orig = str;; str++) { | ||||
|         int c; | ||||
|  | ||||
|         c = *str; | ||||
|         if (c < '0' || c > '9') { | ||||
|             break; | ||||
|         } | ||||
|         c -= '0'; | ||||
|         if (acc > (ULONG_MAX / 10)) { | ||||
|             return NULL; | ||||
|         } | ||||
|         acc *= 10; | ||||
|         if ((unsigned long) c > (ULONG_MAX - acc)) { | ||||
|             return NULL; | ||||
|         } | ||||
|         acc += (unsigned long) c; | ||||
|     } | ||||
|     if (str == orig || (*orig == '0' && str != (orig + 1))) { | ||||
|         return NULL; | ||||
|     } | ||||
|     *v = acc; | ||||
|     return str; | ||||
| } | ||||
|  | ||||
| /* ==================================================================== */ | ||||
| /* | ||||
|  * Code specific to Argon2. | ||||
|  * | ||||
|  * The code below applies the following format: | ||||
|  * | ||||
|  *  $argon2<T>[$v=<num>]$m=<num>,t=<num>,p=<num>$<bin>$<bin> | ||||
|  * | ||||
|  * where <T> is either 'i', <num> is a decimal integer (positive, fits in an | ||||
|  * 'unsigned long') and <bin> is Base64-encoded data (no '=' padding characters, | ||||
|  * no newline or whitespace). | ||||
|  * | ||||
|  * The last two binary chunks (encoded in Base64) are, in that order, | ||||
|  * the salt and the output. Both are required. The binary salt length and the | ||||
|  * output length must be in the allowed ranges defined in argon2.h. | ||||
|  * | ||||
|  * The ctx struct must contain buffers large enough to hold the salt and pwd | ||||
|  * when it is fed into argon2_decode_string. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Decode an Argon2i hash string into the provided structure 'ctx'. | ||||
|  * Returned value is ARGON2_OK on success. | ||||
|  */ | ||||
| int | ||||
| argon2_decode_string(argon2_context *ctx, const char *str, argon2_type type) | ||||
| { | ||||
| /* Prefix checking */ | ||||
| #define CC(prefix)                               \ | ||||
|     do {                                         \ | ||||
|         size_t cc_len = strlen(prefix);          \ | ||||
|         if (strncmp(str, prefix, cc_len) != 0) { \ | ||||
|             return ARGON2_DECODING_FAIL;         \ | ||||
|         }                                        \ | ||||
|         str += cc_len;                           \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| /* Optional prefix checking with supplied code */ | ||||
| #define CC_opt(prefix, code)                     \ | ||||
|     do {                                         \ | ||||
|         size_t cc_len = strlen(prefix);          \ | ||||
|         if (strncmp(str, prefix, cc_len) == 0) { \ | ||||
|             str += cc_len;                       \ | ||||
|             {                                    \ | ||||
|                 code;                            \ | ||||
|             }                                    \ | ||||
|         }                                        \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| /* Decoding prefix into decimal */ | ||||
| #define DECIMAL(x)                         \ | ||||
|     do {                                   \ | ||||
|         unsigned long dec_x;               \ | ||||
|         str = decode_decimal(str, &dec_x); \ | ||||
|         if (str == NULL) {                 \ | ||||
|             return ARGON2_DECODING_FAIL;   \ | ||||
|         }                                  \ | ||||
|         (x) = dec_x;                       \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| /* Decoding prefix into uint32_t decimal */ | ||||
| #define DECIMAL_U32(x)                           \ | ||||
|     do {                                         \ | ||||
|         unsigned long dec_x;                     \ | ||||
|         str = decode_decimal(str, &dec_x);       \ | ||||
|         if (str == NULL || dec_x > UINT32_MAX) { \ | ||||
|             return ARGON2_DECODING_FAIL;         \ | ||||
|         }                                        \ | ||||
|         (x) = (uint32_t)dec_x;                   \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| /* Decoding base64 into a binary buffer */ | ||||
| #define BIN(buf, max_len, len)                                                   \ | ||||
|     do {                                                                         \ | ||||
|         size_t bin_len = (max_len);                                              \ | ||||
|         const char *str_end;                                                     \ | ||||
|         if (sodium_base642bin((buf), (max_len), str, strlen(str), NULL,          \ | ||||
|                               &bin_len, &str_end,                                \ | ||||
|                               sodium_base64_VARIANT_ORIGINAL_NO_PADDING) != 0 || \ | ||||
|             bin_len > UINT32_MAX) {                                              \ | ||||
|             return ARGON2_DECODING_FAIL;                                         \ | ||||
|         }                                                                        \ | ||||
|         (len) = (uint32_t) bin_len;                                              \ | ||||
|         str = str_end;                                                           \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
|     size_t        maxsaltlen = ctx->saltlen; | ||||
|     size_t        maxoutlen  = ctx->outlen; | ||||
|     int           validation_result; | ||||
|     uint32_t      version = 0; | ||||
|  | ||||
|     ctx->saltlen = 0; | ||||
|     ctx->outlen  = 0; | ||||
|  | ||||
|     if (type == Argon2_id) { | ||||
|         CC("$argon2id"); | ||||
|     } else if (type == Argon2_i) { | ||||
|         CC("$argon2i"); | ||||
|     } else { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|     CC("$v="); | ||||
|     DECIMAL_U32(version); | ||||
|     if (version != ARGON2_VERSION_NUMBER) { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|     CC("$m="); | ||||
|     DECIMAL_U32(ctx->m_cost); | ||||
|     if (ctx->m_cost > UINT32_MAX) { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|     CC(",t="); | ||||
|     DECIMAL_U32(ctx->t_cost); | ||||
|     if (ctx->t_cost > UINT32_MAX) { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|     CC(",p="); | ||||
|     DECIMAL_U32(ctx->lanes); | ||||
|     if (ctx->lanes > UINT32_MAX) { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|     ctx->threads = ctx->lanes; | ||||
|  | ||||
|     CC("$"); | ||||
|     BIN(ctx->salt, maxsaltlen, ctx->saltlen); | ||||
|     CC("$"); | ||||
|     BIN(ctx->out, maxoutlen, ctx->outlen); | ||||
|     validation_result = argon2_validate_inputs(ctx); | ||||
|     if (validation_result != ARGON2_OK) { | ||||
|         return validation_result; | ||||
|     } | ||||
|     if (*str == 0) { | ||||
|         return ARGON2_OK; | ||||
|     } | ||||
|     return ARGON2_DECODING_FAIL; | ||||
|  | ||||
| #undef CC | ||||
| #undef CC_opt | ||||
| #undef DECIMAL | ||||
| #undef BIN | ||||
| } | ||||
|  | ||||
| #define U32_STR_MAXSIZE 11U | ||||
|  | ||||
| static void | ||||
| u32_to_string(char *str, uint32_t x) | ||||
| { | ||||
|     char   tmp[U32_STR_MAXSIZE - 1U]; | ||||
|     size_t i; | ||||
|  | ||||
|     i = sizeof tmp; | ||||
|     do { | ||||
|         tmp[--i] = (x % (uint32_t) 10U) + '0'; | ||||
|         x /= (uint32_t) 10U; | ||||
|     } while (x != 0U && i != 0U); | ||||
|     memcpy(str, &tmp[i], (sizeof tmp) - i); | ||||
|     str[(sizeof tmp) - i] = 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Encode an argon2i hash string into the provided buffer. 'dst_len' | ||||
|  * contains the size, in characters, of the 'dst' buffer; if 'dst_len' | ||||
|  * is less than the number of required characters (including the | ||||
|  * terminating 0), then this function returns 0. | ||||
|  * | ||||
|  * If pp->output_len is 0, then the hash string will be a salt string | ||||
|  * (no output). if pp->salt_len is also 0, then the string will be a | ||||
|  * parameter-only string (no salt and no output). | ||||
|  * | ||||
|  * On success, ARGON2_OK is returned. | ||||
|  */ | ||||
| int | ||||
| argon2_encode_string(char *dst, size_t dst_len, argon2_context *ctx, | ||||
|                      argon2_type type) | ||||
| { | ||||
| #define SS(str)                          \ | ||||
|     do {                                 \ | ||||
|         size_t pp_len = strlen(str);     \ | ||||
|         if (pp_len >= dst_len) {         \ | ||||
|             return ARGON2_ENCODING_FAIL; \ | ||||
|         }                                \ | ||||
|         memcpy(dst, str, pp_len + 1);    \ | ||||
|         dst += pp_len;                   \ | ||||
|         dst_len -= pp_len;               \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define SX(x)                      \ | ||||
|     do {                           \ | ||||
|         char tmp[U32_STR_MAXSIZE]; \ | ||||
|         u32_to_string(tmp, x);     \ | ||||
|         SS(tmp);                   \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define SB(buf, len)                                                                \ | ||||
|     do {                                                                            \ | ||||
|         size_t sb_len;                                                              \ | ||||
|         if (sodium_bin2base64(dst, dst_len, (buf), (len),                           \ | ||||
|                               sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == NULL) { \ | ||||
|             return ARGON2_ENCODING_FAIL;                                            \ | ||||
|         }                                                                           \ | ||||
|         sb_len = strlen(dst);                                                       \ | ||||
|         dst += sb_len;                                                              \ | ||||
|         dst_len -= sb_len;                                                          \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
|     int validation_result; | ||||
|  | ||||
|     switch (type) { | ||||
|     case Argon2_id: | ||||
|         SS("$argon2id$v="); break; | ||||
|     case Argon2_i: | ||||
|         SS("$argon2i$v="); break; | ||||
|     default: | ||||
|         return ARGON2_ENCODING_FAIL; | ||||
|     } | ||||
|     validation_result = argon2_validate_inputs(ctx); | ||||
|     if (validation_result != ARGON2_OK) { | ||||
|         return validation_result; | ||||
|     } | ||||
|     SX(ARGON2_VERSION_NUMBER); | ||||
|     SS("$m="); | ||||
|     SX(ctx->m_cost); | ||||
|     SS(",t="); | ||||
|     SX(ctx->t_cost); | ||||
|     SS(",p="); | ||||
|     SX(ctx->lanes); | ||||
|  | ||||
|     SS("$"); | ||||
|     SB(ctx->salt, ctx->saltlen); | ||||
|  | ||||
|     SS("$"); | ||||
|     SB(ctx->out, ctx->outlen); | ||||
|     return ARGON2_OK; | ||||
|  | ||||
| #undef SS | ||||
| #undef SX | ||||
| #undef SB | ||||
| } | ||||
							
								
								
									
										34
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-encoding.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-encoding.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #ifndef argon2_encoding_H | ||||
| #define argon2_encoding_H | ||||
|  | ||||
| #include "argon2.h" | ||||
|  | ||||
| /* | ||||
|  * encode an Argon2 hash string into the provided buffer. 'dst_len' | ||||
|  * contains the size, in characters, of the 'dst' buffer; if 'dst_len' | ||||
|  * is less than the number of required characters (including the | ||||
|  * terminating 0), then this function returns 0. | ||||
|  * | ||||
|  * if ctx->outlen is 0, then the hash string will be a salt string | ||||
|  * (no output). if ctx->saltlen is also 0, then the string will be a | ||||
|  * parameter-only string (no salt and no output). | ||||
|  * | ||||
|  * On success, ARGON2_OK is returned. | ||||
|  * | ||||
|  * No other parameters are checked | ||||
|  */ | ||||
| int argon2_encode_string(char *dst, size_t dst_len, argon2_context *ctx, | ||||
|                          argon2_type type); | ||||
|  | ||||
| /* | ||||
|  * Decodes an Argon2 hash string into the provided structure 'ctx'. | ||||
|  * The fields ctx.saltlen, ctx.adlen, ctx.outlen set the maximal salt, ad, out | ||||
|  * length values | ||||
|  * that are allowed; invalid input string causes an error | ||||
|  * | ||||
|  * Returned value is ARGON2_OK on success. | ||||
|  */ | ||||
| int argon2_decode_string(argon2_context *ctx, const char *str, | ||||
|                          argon2_type type); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										239
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \ | ||||
|     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| #  pragma GCC target("sse4.1") | ||||
| #  pragma GCC target("avx2") | ||||
| # endif | ||||
|  | ||||
| # ifdef _MSC_VER | ||||
| #  include <intrin.h> /* for _mm_set_epi64x */ | ||||
| # endif | ||||
| # include <emmintrin.h> | ||||
| # include <immintrin.h> | ||||
| # include <smmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blamka-round-avx2.h" | ||||
|  | ||||
| static void | ||||
| fill_block(__m256i *state, const uint8_t *ref_block, uint8_t *next_block) | ||||
| { | ||||
|     __m256i  block_XY[ARGON2_HWORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { | ||||
|         block_XY[i] = state[i] = _mm256_xor_si256( | ||||
|             state[i], _mm256_loadu_si256((__m256i const *) (&ref_block[32 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 4; ++i) { | ||||
|         BLAKE2_ROUND_1(state[8 * i + 0], state[8 * i + 4], state[8 * i + 1], state[8 * i + 5], | ||||
|                        state[8 * i + 2], state[8 * i + 6], state[8 * i + 3], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 4; ++i) { | ||||
|         BLAKE2_ROUND_2(state[ 0 + i], state[ 4 + i], state[ 8 + i], state[12 + i], | ||||
|                        state[16 + i], state[20 + i], state[24 + i], state[28 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm256_xor_si256(state[i], block_XY[i]); | ||||
|         _mm256_storeu_si256((__m256i *) (&next_block[32 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| fill_block_with_xor(__m256i *state, const uint8_t *ref_block, | ||||
|                     uint8_t *next_block) | ||||
| { | ||||
|     __m256i  block_XY[ARGON2_HWORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm256_xor_si256( | ||||
|             state[i], _mm256_loadu_si256((__m256i const *) (&ref_block[32 * i]))); | ||||
|         block_XY[i] = _mm256_xor_si256( | ||||
|             state[i], _mm256_loadu_si256((__m256i const *) (&next_block[32 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 4; ++i) { | ||||
|         BLAKE2_ROUND_1(state[8 * i + 0], state[8 * i + 4], state[8 * i + 1], state[8 * i + 5], | ||||
|                        state[8 * i + 2], state[8 * i + 6], state[8 * i + 3], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 4; ++i) { | ||||
|         BLAKE2_ROUND_2(state[ 0 + i], state[ 4 + i], state[ 8 + i], state[12 + i], | ||||
|                        state[16 + i], state[20 + i], state[24 + i], state[28 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm256_xor_si256(state[i], block_XY[i]); | ||||
|         _mm256_storeu_si256((__m256i *) (&next_block[32 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| generate_addresses(const argon2_instance_t *instance, | ||||
|                    const argon2_position_t *position, uint64_t *pseudo_rands) | ||||
| { | ||||
|     block    address_block, input_block, tmp_block; | ||||
|     uint32_t i; | ||||
|  | ||||
|     init_block_value(&address_block, 0); | ||||
|     init_block_value(&input_block, 0); | ||||
|  | ||||
|     if (instance != NULL && position != NULL) { | ||||
|         input_block.v[0] = position->pass; | ||||
|         input_block.v[1] = position->lane; | ||||
|         input_block.v[2] = position->slice; | ||||
|         input_block.v[3] = instance->memory_blocks; | ||||
|         input_block.v[4] = instance->passes; | ||||
|         input_block.v[5] = instance->type; | ||||
|  | ||||
|         for (i = 0; i < instance->segment_length; ++i) { | ||||
|             if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { | ||||
|                 /* Temporary zero-initialized blocks */ | ||||
|                 __m256i zero_block[ARGON2_HWORDS_IN_BLOCK]; | ||||
|                 __m256i zero2_block[ARGON2_HWORDS_IN_BLOCK]; | ||||
|  | ||||
|                 memset(zero_block, 0, sizeof(zero_block)); | ||||
|                 memset(zero2_block, 0, sizeof(zero2_block)); | ||||
|                 init_block_value(&address_block, 0); | ||||
|                 init_block_value(&tmp_block, 0); | ||||
|                 /* Increasing index counter */ | ||||
|                 input_block.v[6]++; | ||||
|                 /* First iteration of G */ | ||||
|                 fill_block_with_xor(zero_block, (uint8_t *) &input_block.v, | ||||
|                                     (uint8_t *) &tmp_block.v); | ||||
|                 /* Second iteration of G */ | ||||
|                 fill_block_with_xor(zero2_block, (uint8_t *) &tmp_block.v, | ||||
|                                     (uint8_t *) &address_block.v); | ||||
|             } | ||||
|  | ||||
|             pseudo_rands[i] = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_fill_segment_avx2(const argon2_instance_t *instance, | ||||
|                          argon2_position_t        position) | ||||
| { | ||||
|     block    *ref_block = NULL, *curr_block = NULL; | ||||
|     uint64_t  pseudo_rand, ref_index, ref_lane; | ||||
|     uint32_t  prev_offset, curr_offset; | ||||
|     uint32_t  starting_index, i; | ||||
|     __m256i   state[ARGON2_HWORDS_IN_BLOCK]; | ||||
|     int       data_independent_addressing = 1; | ||||
|  | ||||
|     /* Pseudo-random values that determine the reference block position */ | ||||
|     uint64_t *pseudo_rands = NULL; | ||||
|  | ||||
|     if (instance == NULL) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (instance->type == Argon2_id && | ||||
|         (position.pass != 0 || position.slice >= ARGON2_SYNC_POINTS / 2)) { | ||||
|         data_independent_addressing = 0; | ||||
|     } | ||||
|  | ||||
|     pseudo_rands = instance->pseudo_rands; | ||||
|  | ||||
|     if (data_independent_addressing) { | ||||
|         generate_addresses(instance, &position, pseudo_rands); | ||||
|     } | ||||
|  | ||||
|     starting_index = 0; | ||||
|  | ||||
|     if ((0 == position.pass) && (0 == position.slice)) { | ||||
|         starting_index = 2; /* we have already generated the first two blocks */ | ||||
|     } | ||||
|  | ||||
|     /* Offset of the current block */ | ||||
|     curr_offset = position.lane * instance->lane_length + | ||||
|                   position.slice * instance->segment_length + starting_index; | ||||
|  | ||||
|     if (0 == curr_offset % instance->lane_length) { | ||||
|         /* Last block in this lane */ | ||||
|         prev_offset = curr_offset + instance->lane_length - 1; | ||||
|     } else { | ||||
|         /* Previous block */ | ||||
|         prev_offset = curr_offset - 1; | ||||
|     } | ||||
|  | ||||
|     memcpy(state, ((instance->region->memory + prev_offset)->v), | ||||
|            ARGON2_BLOCK_SIZE); | ||||
|  | ||||
|     for (i = starting_index; i < instance->segment_length; | ||||
|          ++i, ++curr_offset, ++prev_offset) { | ||||
|         /*1.1 Rotating prev_offset if needed */ | ||||
|         if (curr_offset % instance->lane_length == 1) { | ||||
|             prev_offset = curr_offset - 1; | ||||
|         } | ||||
|  | ||||
|         /* 1.2 Computing the index of the reference block */ | ||||
|         /* 1.2.1 Taking pseudo-random value from the previous block */ | ||||
|         if (data_independent_addressing) { | ||||
| #pragma warning(push) | ||||
| #pragma warning(disable : 6385) | ||||
|             pseudo_rand = pseudo_rands[i]; | ||||
| #pragma warning(pop) | ||||
|         } else { | ||||
|             pseudo_rand = instance->region->memory[prev_offset].v[0]; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.2 Computing the lane of the reference block */ | ||||
|         ref_lane = ((pseudo_rand >> 32)) % instance->lanes; | ||||
|  | ||||
|         if ((position.pass == 0) && (position.slice == 0)) { | ||||
|             /* Can not reference other lanes yet */ | ||||
|             ref_lane = position.lane; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.3 Computing the number of possible reference block within the | ||||
|          * lane. | ||||
|          */ | ||||
|         position.index = i; | ||||
|         ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, | ||||
|                                 ref_lane == position.lane); | ||||
|  | ||||
|         /* 2 Creating a new block */ | ||||
|         ref_block = instance->region->memory + | ||||
|                     instance->lane_length * ref_lane + ref_index; | ||||
|         curr_block = instance->region->memory + curr_offset; | ||||
|         if (position.pass != 0) { | ||||
|             fill_block_with_xor(state, (uint8_t *) ref_block->v, | ||||
|                                 (uint8_t *) curr_block->v); | ||||
|         } else { | ||||
|             fill_block(state, (uint8_t *) ref_block->v, | ||||
|                        (uint8_t *) curr_block->v); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										244
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx512f.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx512f.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_AVX512FINTRIN_H) && defined(HAVE_AVX2INTRIN_H) && \ | ||||
|     defined(HAVE_EMMINTRIN_H) &&  defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| #  pragma GCC target("sse4.1") | ||||
| #  pragma GCC target("avx2") | ||||
| #  pragma GCC target("avx512f") | ||||
| # endif | ||||
|  | ||||
| # ifdef _MSC_VER | ||||
| #  include <intrin.h> /* for _mm_set_epi64x */ | ||||
| # endif | ||||
| # include <emmintrin.h> | ||||
| # include <immintrin.h> | ||||
| # include <smmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blamka-round-avx512f.h" | ||||
|  | ||||
| static void | ||||
| fill_block(__m512i *state, const uint8_t *ref_block, uint8_t *next_block) | ||||
| { | ||||
|     __m512i  block_XY[ARGON2_512BIT_WORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { | ||||
|         block_XY[i] = state[i] = _mm512_xor_si512( | ||||
|             state[i], _mm512_loadu_si512((__m512i const *) (&ref_block[64 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 2; ++i) { | ||||
|         BLAKE2_ROUND_1( | ||||
|             state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], state[8 * i + 3], | ||||
|             state[8 * i + 4], state[8 * i + 5], state[8 * i + 6], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 2; ++i) { | ||||
|         BLAKE2_ROUND_2( | ||||
|             state[2 * 0 + i], state[2 * 1 + i], state[2 * 2 + i], state[2 * 3 + i], | ||||
|             state[2 * 4 + i], state[2 * 5 + i], state[2 * 6 + i], state[2 * 7 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm512_xor_si512(state[i], block_XY[i]); | ||||
|         _mm512_storeu_si512((__m512i *) (&next_block[64 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| fill_block_with_xor(__m512i *state, const uint8_t *ref_block, | ||||
|                     uint8_t *next_block) | ||||
| { | ||||
|     __m512i  block_XY[ARGON2_512BIT_WORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm512_xor_si512( | ||||
|             state[i], _mm512_loadu_si512((__m512i const *) (&ref_block[64 * i]))); | ||||
|         block_XY[i] = _mm512_xor_si512( | ||||
|             state[i], _mm512_loadu_si512((__m512i const *) (&next_block[64 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 2; ++i) { | ||||
|         BLAKE2_ROUND_1( | ||||
|             state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], state[8 * i + 3], | ||||
|             state[8 * i + 4], state[8 * i + 5], state[8 * i + 6], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 2; ++i) { | ||||
|         BLAKE2_ROUND_2( | ||||
|             state[2 * 0 + i], state[2 * 1 + i], state[2 * 2 + i], state[2 * 3 + i], | ||||
|             state[2 * 4 + i], state[2 * 5 + i], state[2 * 6 + i], state[2 * 7 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm512_xor_si512(state[i], block_XY[i]); | ||||
|         _mm512_storeu_si512((__m512i *) (&next_block[64 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| generate_addresses(const argon2_instance_t *instance, | ||||
|                    const argon2_position_t *position, uint64_t *pseudo_rands) | ||||
| { | ||||
|     block    address_block, input_block, tmp_block; | ||||
|     uint32_t i; | ||||
|  | ||||
|     init_block_value(&address_block, 0); | ||||
|     init_block_value(&input_block, 0); | ||||
|  | ||||
|     if (instance != NULL && position != NULL) { | ||||
|         input_block.v[0] = position->pass; | ||||
|         input_block.v[1] = position->lane; | ||||
|         input_block.v[2] = position->slice; | ||||
|         input_block.v[3] = instance->memory_blocks; | ||||
|         input_block.v[4] = instance->passes; | ||||
|         input_block.v[5] = instance->type; | ||||
|  | ||||
|         for (i = 0; i < instance->segment_length; ++i) { | ||||
|             if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { | ||||
|                 /* Temporary zero-initialized blocks */ | ||||
|                 __m512i zero_block[ARGON2_512BIT_WORDS_IN_BLOCK]; | ||||
|                 __m512i zero2_block[ARGON2_512BIT_WORDS_IN_BLOCK]; | ||||
|  | ||||
|                 memset(zero_block, 0, sizeof(zero_block)); | ||||
|                 memset(zero2_block, 0, sizeof(zero2_block)); | ||||
|                 init_block_value(&address_block, 0); | ||||
|                 init_block_value(&tmp_block, 0); | ||||
|                 /* Increasing index counter */ | ||||
|                 input_block.v[6]++; | ||||
|                 /* First iteration of G */ | ||||
|                 fill_block_with_xor(zero_block, (uint8_t *) &input_block.v, | ||||
|                                     (uint8_t *) &tmp_block.v); | ||||
|                 /* Second iteration of G */ | ||||
|                 fill_block_with_xor(zero2_block, (uint8_t *) &tmp_block.v, | ||||
|                                     (uint8_t *) &address_block.v); | ||||
|             } | ||||
|  | ||||
|             pseudo_rands[i] = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_fill_segment_avx512f(const argon2_instance_t *instance, | ||||
|                             argon2_position_t        position) | ||||
| { | ||||
|     block    *ref_block = NULL, *curr_block = NULL; | ||||
|     uint64_t  pseudo_rand, ref_index, ref_lane; | ||||
|     uint32_t  prev_offset, curr_offset; | ||||
|     uint32_t  starting_index, i; | ||||
|     __m512i   state[ARGON2_512BIT_WORDS_IN_BLOCK]; | ||||
|     int       data_independent_addressing = 1; | ||||
|  | ||||
|     /* Pseudo-random values that determine the reference block position */ | ||||
|     uint64_t *pseudo_rands = NULL; | ||||
|  | ||||
|     if (instance == NULL) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (instance->type == Argon2_id && | ||||
|         (position.pass != 0 || position.slice >= ARGON2_SYNC_POINTS / 2)) { | ||||
|         data_independent_addressing = 0; | ||||
|     } | ||||
|  | ||||
|     pseudo_rands = instance->pseudo_rands; | ||||
|  | ||||
|     if (data_independent_addressing) { | ||||
|         generate_addresses(instance, &position, pseudo_rands); | ||||
|     } | ||||
|  | ||||
|     starting_index = 0; | ||||
|  | ||||
|     if ((0 == position.pass) && (0 == position.slice)) { | ||||
|         starting_index = 2; /* we have already generated the first two blocks */ | ||||
|     } | ||||
|  | ||||
|     /* Offset of the current block */ | ||||
|     curr_offset = position.lane * instance->lane_length + | ||||
|                   position.slice * instance->segment_length + starting_index; | ||||
|  | ||||
|     if (0 == curr_offset % instance->lane_length) { | ||||
|         /* Last block in this lane */ | ||||
|         prev_offset = curr_offset + instance->lane_length - 1; | ||||
|     } else { | ||||
|         /* Previous block */ | ||||
|         prev_offset = curr_offset - 1; | ||||
|     } | ||||
|  | ||||
|     memcpy(state, ((instance->region->memory + prev_offset)->v), | ||||
|            ARGON2_BLOCK_SIZE); | ||||
|  | ||||
|     for (i = starting_index; i < instance->segment_length; | ||||
|          ++i, ++curr_offset, ++prev_offset) { | ||||
|         /*1.1 Rotating prev_offset if needed */ | ||||
|         if (curr_offset % instance->lane_length == 1) { | ||||
|             prev_offset = curr_offset - 1; | ||||
|         } | ||||
|  | ||||
|         /* 1.2 Computing the index of the reference block */ | ||||
|         /* 1.2.1 Taking pseudo-random value from the previous block */ | ||||
|         if (data_independent_addressing) { | ||||
| #pragma warning(push) | ||||
| #pragma warning(disable : 6385) | ||||
|             pseudo_rand = pseudo_rands[i]; | ||||
| #pragma warning(pop) | ||||
|         } else { | ||||
|             pseudo_rand = instance->region->memory[prev_offset].v[0]; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.2 Computing the lane of the reference block */ | ||||
|         ref_lane = ((pseudo_rand >> 32)) % instance->lanes; | ||||
|  | ||||
|         if ((position.pass == 0) && (position.slice == 0)) { | ||||
|             /* Can not reference other lanes yet */ | ||||
|             ref_lane = position.lane; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.3 Computing the number of possible reference block within the | ||||
|          * lane. | ||||
|          */ | ||||
|         position.index = i; | ||||
|         ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, | ||||
|                                 ref_lane == position.lane); | ||||
|  | ||||
|         /* 2 Creating a new block */ | ||||
|         ref_block = instance->region->memory + | ||||
|                     instance->lane_length * ref_lane + ref_index; | ||||
|         curr_block = instance->region->memory + curr_offset; | ||||
|         if (position.pass != 0) { | ||||
|             fill_block_with_xor(state, (uint8_t *) ref_block->v, | ||||
|                                 (uint8_t *) curr_block->v); | ||||
|         } else { | ||||
|             fill_block(state, (uint8_t *) ref_block->v, | ||||
|                        (uint8_t *) curr_block->v); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										234
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ref.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2.h" | ||||
| #include "blamka-round-ref.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| static void | ||||
| fill_block(const block *prev_block, const block *ref_block, block *next_block) | ||||
| { | ||||
|     block    blockR, block_tmp; | ||||
|     unsigned i; | ||||
|  | ||||
|     copy_block(&blockR, ref_block); | ||||
|     xor_block(&blockR, prev_block); | ||||
|     copy_block(&block_tmp, &blockR); | ||||
|     /* Now blockR = ref_block + prev_block and bloc_tmp = ref_block + prev_block | ||||
|        Apply Blake2 on columns of 64-bit words: (0,1,...,15), then | ||||
|        (16,17,..31)... finally (112,113,...127) */ | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND_NOMSG( | ||||
|             blockR.v[16 * i], blockR.v[16 * i + 1], blockR.v[16 * i + 2], | ||||
|             blockR.v[16 * i + 3], blockR.v[16 * i + 4], blockR.v[16 * i + 5], | ||||
|             blockR.v[16 * i + 6], blockR.v[16 * i + 7], blockR.v[16 * i + 8], | ||||
|             blockR.v[16 * i + 9], blockR.v[16 * i + 10], blockR.v[16 * i + 11], | ||||
|             blockR.v[16 * i + 12], blockR.v[16 * i + 13], blockR.v[16 * i + 14], | ||||
|             blockR.v[16 * i + 15]); | ||||
|     } | ||||
|  | ||||
|     /* Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), then | ||||
|        (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) */ | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         BLAKE2_ROUND_NOMSG( | ||||
|             blockR.v[2 * i], blockR.v[2 * i + 1], blockR.v[2 * i + 16], | ||||
|             blockR.v[2 * i + 17], blockR.v[2 * i + 32], blockR.v[2 * i + 33], | ||||
|             blockR.v[2 * i + 48], blockR.v[2 * i + 49], blockR.v[2 * i + 64], | ||||
|             blockR.v[2 * i + 65], blockR.v[2 * i + 80], blockR.v[2 * i + 81], | ||||
|             blockR.v[2 * i + 96], blockR.v[2 * i + 97], blockR.v[2 * i + 112], | ||||
|             blockR.v[2 * i + 113]); | ||||
|     } | ||||
|  | ||||
|     copy_block(next_block, &block_tmp); | ||||
|     xor_block(next_block, &blockR); | ||||
| } | ||||
|  | ||||
| static void | ||||
| fill_block_with_xor(const block *prev_block, const block *ref_block, | ||||
|                     block *next_block) | ||||
| { | ||||
|     block    blockR, block_tmp; | ||||
|     unsigned i; | ||||
|  | ||||
|     copy_block(&blockR, ref_block); | ||||
|     xor_block(&blockR, prev_block); | ||||
|     copy_block(&block_tmp, &blockR); | ||||
|     xor_block(&block_tmp, | ||||
|               next_block); /* Saving the next block contents for XOR over */ | ||||
|     /* Now blockR = ref_block + prev_block and bloc_tmp = ref_block + prev_block | ||||
|      * + next_block */ | ||||
|     /* Apply Blake2 on columns of 64-bit words: (0,1,...,15) , then | ||||
|        (16,17,..31)... finally (112,113,...127) */ | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND_NOMSG( | ||||
|             blockR.v[16 * i], blockR.v[16 * i + 1], blockR.v[16 * i + 2], | ||||
|             blockR.v[16 * i + 3], blockR.v[16 * i + 4], blockR.v[16 * i + 5], | ||||
|             blockR.v[16 * i + 6], blockR.v[16 * i + 7], blockR.v[16 * i + 8], | ||||
|             blockR.v[16 * i + 9], blockR.v[16 * i + 10], blockR.v[16 * i + 11], | ||||
|             blockR.v[16 * i + 12], blockR.v[16 * i + 13], blockR.v[16 * i + 14], | ||||
|             blockR.v[16 * i + 15]); | ||||
|     } | ||||
|  | ||||
|     /* Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), then | ||||
|        (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) */ | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         BLAKE2_ROUND_NOMSG( | ||||
|             blockR.v[2 * i], blockR.v[2 * i + 1], blockR.v[2 * i + 16], | ||||
|             blockR.v[2 * i + 17], blockR.v[2 * i + 32], blockR.v[2 * i + 33], | ||||
|             blockR.v[2 * i + 48], blockR.v[2 * i + 49], blockR.v[2 * i + 64], | ||||
|             blockR.v[2 * i + 65], blockR.v[2 * i + 80], blockR.v[2 * i + 81], | ||||
|             blockR.v[2 * i + 96], blockR.v[2 * i + 97], blockR.v[2 * i + 112], | ||||
|             blockR.v[2 * i + 113]); | ||||
|     } | ||||
|  | ||||
|     copy_block(next_block, &block_tmp); | ||||
|     xor_block(next_block, &blockR); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Generate pseudo-random values to reference blocks in the segment and puts | ||||
|  * them into the array | ||||
|  * @param instance Pointer to the current instance | ||||
|  * @param position Pointer to the current position | ||||
|  * @param pseudo_rands Pointer to the array of 64-bit values | ||||
|  * @pre pseudo_rands must point to @a instance->segment_length allocated values | ||||
|  */ | ||||
| static void | ||||
| generate_addresses(const argon2_instance_t *instance, | ||||
|                    const argon2_position_t *position, uint64_t *pseudo_rands) | ||||
| { | ||||
|     block    zero_block, input_block, address_block, tmp_block; | ||||
|     uint32_t i; | ||||
|  | ||||
|     init_block_value(&zero_block, 0); | ||||
|     init_block_value(&input_block, 0); | ||||
|  | ||||
|     if (instance != NULL && position != NULL) { | ||||
|         input_block.v[0] = position->pass; | ||||
|         input_block.v[1] = position->lane; | ||||
|         input_block.v[2] = position->slice; | ||||
|         input_block.v[3] = instance->memory_blocks; | ||||
|         input_block.v[4] = instance->passes; | ||||
|         input_block.v[5] = instance->type; | ||||
|  | ||||
|         for (i = 0; i < instance->segment_length; ++i) { | ||||
|             if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { | ||||
|                 input_block.v[6]++; | ||||
|                 init_block_value(&tmp_block, 0); | ||||
|                 init_block_value(&address_block, 0); | ||||
|                 fill_block_with_xor(&zero_block, &input_block, &tmp_block); | ||||
|                 fill_block_with_xor(&zero_block, &tmp_block, &address_block); | ||||
|             } | ||||
|  | ||||
|             pseudo_rands[i] = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_fill_segment_ref(const argon2_instance_t *instance, | ||||
|                         argon2_position_t position) | ||||
| { | ||||
|     block    *ref_block = NULL, *curr_block = NULL; | ||||
|     /* Pseudo-random values that determine the reference block position */ | ||||
|     uint64_t *pseudo_rands = NULL; | ||||
|     uint64_t  pseudo_rand, ref_index, ref_lane; | ||||
|     uint32_t  prev_offset, curr_offset; | ||||
|     uint32_t  starting_index; | ||||
|     uint32_t  i; | ||||
|     int       data_independent_addressing = 1; | ||||
|  | ||||
|     if (instance == NULL) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (instance->type == Argon2_id && | ||||
|         (position.pass != 0 || position.slice >= ARGON2_SYNC_POINTS / 2)) { | ||||
|         data_independent_addressing = 0; | ||||
|     } | ||||
|  | ||||
|     pseudo_rands = instance->pseudo_rands; | ||||
|  | ||||
|     if (data_independent_addressing) { | ||||
|         generate_addresses(instance, &position, pseudo_rands); | ||||
|     } | ||||
|  | ||||
|     starting_index = 0; | ||||
|  | ||||
|     if ((0 == position.pass) && (0 == position.slice)) { | ||||
|         starting_index = 2; /* we have already generated the first two blocks */ | ||||
|     } | ||||
|  | ||||
|     /* Offset of the current block */ | ||||
|     curr_offset = position.lane * instance->lane_length + | ||||
|                   position.slice * instance->segment_length + starting_index; | ||||
|  | ||||
|     if (0 == curr_offset % instance->lane_length) { | ||||
|         /* Last block in this lane */ | ||||
|         prev_offset = curr_offset + instance->lane_length - 1; | ||||
|     } else { | ||||
|         /* Previous block */ | ||||
|         prev_offset = curr_offset - 1; | ||||
|     } | ||||
|  | ||||
|     for (i = starting_index; i < instance->segment_length; | ||||
|          ++i, ++curr_offset, ++prev_offset) { | ||||
|         /*1.1 Rotating prev_offset if needed */ | ||||
|         if (curr_offset % instance->lane_length == 1) { | ||||
|             prev_offset = curr_offset - 1; | ||||
|         } | ||||
|  | ||||
|         /* 1.2 Computing the index of the reference block */ | ||||
|         /* 1.2.1 Taking pseudo-random value from the previous block */ | ||||
|         if (data_independent_addressing) { | ||||
| #pragma warning(push) | ||||
| #pragma warning(disable : 6385) | ||||
|             pseudo_rand = pseudo_rands[i]; | ||||
| #pragma warning(pop) | ||||
|         } else { | ||||
|             pseudo_rand = instance->region->memory[prev_offset].v[0]; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.2 Computing the lane of the reference block */ | ||||
|         ref_lane = ((pseudo_rand >> 32)) % instance->lanes; | ||||
|  | ||||
|         if ((position.pass == 0) && (position.slice == 0)) { | ||||
|             /* Can not reference other lanes yet */ | ||||
|             ref_lane = position.lane; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.3 Computing the number of possible reference block within the | ||||
|          * lane. | ||||
|          */ | ||||
|         position.index = i; | ||||
|         ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, | ||||
|                                 ref_lane == position.lane); | ||||
|  | ||||
|         /* 2 Creating a new block */ | ||||
|         ref_block = instance->region->memory + | ||||
|                     instance->lane_length * ref_lane + ref_index; | ||||
|         curr_block = instance->region->memory + curr_offset; | ||||
|         if (position.pass != 0) { | ||||
|             fill_block_with_xor(instance->region->memory + prev_offset, | ||||
|                                 ref_block, curr_block); | ||||
|         } else { | ||||
|             fill_block(instance->region->memory + prev_offset, ref_block, | ||||
|                        curr_block); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										238
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ssse3.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ssse3.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,238 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| #  pragma GCC target("ssse3") | ||||
| # endif | ||||
|  | ||||
| # ifdef _MSC_VER | ||||
| #  include <intrin.h> /* for _mm_set_epi64x */ | ||||
| # endif | ||||
| # include <emmintrin.h> | ||||
| # include <tmmintrin.h> | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "blamka-round-ssse3.h" | ||||
|  | ||||
| static void | ||||
| fill_block(__m128i *state, const uint8_t *ref_block, uint8_t *next_block) | ||||
| { | ||||
|     __m128i  block_XY[ARGON2_OWORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { | ||||
|         block_XY[i] = state[i] = _mm_xor_si128( | ||||
|             state[i], _mm_loadu_si128((__m128i const *) (&ref_block[16 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND(state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], | ||||
|                      state[8 * i + 3], state[8 * i + 4], state[8 * i + 5], | ||||
|                      state[8 * i + 6], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND(state[8 * 0 + i], state[8 * 1 + i], state[8 * 2 + i], | ||||
|                      state[8 * 3 + i], state[8 * 4 + i], state[8 * 5 + i], | ||||
|                      state[8 * 6 + i], state[8 * 7 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm_xor_si128(state[i], block_XY[i]); | ||||
|         _mm_storeu_si128((__m128i *) (&next_block[16 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| fill_block_with_xor(__m128i *state, const uint8_t *ref_block, | ||||
|                     uint8_t *next_block) | ||||
| { | ||||
|     __m128i  block_XY[ARGON2_OWORDS_IN_BLOCK]; | ||||
|     uint32_t i; | ||||
|  | ||||
|     for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm_xor_si128( | ||||
|             state[i], _mm_loadu_si128((__m128i const *) (&ref_block[16 * i]))); | ||||
|         block_XY[i] = _mm_xor_si128( | ||||
|             state[i], _mm_loadu_si128((__m128i const *) (&next_block[16 * i]))); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND(state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], | ||||
|                      state[8 * i + 3], state[8 * i + 4], state[8 * i + 5], | ||||
|                      state[8 * i + 6], state[8 * i + 7]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         BLAKE2_ROUND(state[8 * 0 + i], state[8 * 1 + i], state[8 * 2 + i], | ||||
|                      state[8 * 3 + i], state[8 * 4 + i], state[8 * 5 + i], | ||||
|                      state[8 * 6 + i], state[8 * 7 + i]); | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { | ||||
|         state[i] = _mm_xor_si128(state[i], block_XY[i]); | ||||
|         _mm_storeu_si128((__m128i *) (&next_block[16 * i]), state[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| generate_addresses(const argon2_instance_t *instance, | ||||
|                    const argon2_position_t *position, uint64_t *pseudo_rands) | ||||
| { | ||||
|     block    address_block, input_block, tmp_block; | ||||
|     uint32_t i; | ||||
|  | ||||
|     init_block_value(&address_block, 0); | ||||
|     init_block_value(&input_block, 0); | ||||
|  | ||||
|     if (instance != NULL && position != NULL) { | ||||
|         input_block.v[0] = position->pass; | ||||
|         input_block.v[1] = position->lane; | ||||
|         input_block.v[2] = position->slice; | ||||
|         input_block.v[3] = instance->memory_blocks; | ||||
|         input_block.v[4] = instance->passes; | ||||
|         input_block.v[5] = instance->type; | ||||
|  | ||||
|         for (i = 0; i < instance->segment_length; ++i) { | ||||
|             if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { | ||||
|                 /* Temporary zero-initialized blocks */ | ||||
|                 __m128i zero_block[ARGON2_OWORDS_IN_BLOCK]; | ||||
|                 __m128i zero2_block[ARGON2_OWORDS_IN_BLOCK]; | ||||
|  | ||||
|                 memset(zero_block, 0, sizeof(zero_block)); | ||||
|                 memset(zero2_block, 0, sizeof(zero2_block)); | ||||
|                 init_block_value(&address_block, 0); | ||||
|                 init_block_value(&tmp_block, 0); | ||||
|                 /* Increasing index counter */ | ||||
|                 input_block.v[6]++; | ||||
|                 /* First iteration of G */ | ||||
|                 fill_block_with_xor(zero_block, (uint8_t *) &input_block.v, | ||||
|                                     (uint8_t *) &tmp_block.v); | ||||
|                 /* Second iteration of G */ | ||||
|                 fill_block_with_xor(zero2_block, (uint8_t *) &tmp_block.v, | ||||
|                                     (uint8_t *) &address_block.v); | ||||
|             } | ||||
|  | ||||
|             pseudo_rands[i] = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| argon2_fill_segment_ssse3(const argon2_instance_t *instance, | ||||
|                           argon2_position_t        position) | ||||
| { | ||||
|     block    *ref_block = NULL, *curr_block = NULL; | ||||
|     uint64_t  pseudo_rand, ref_index, ref_lane; | ||||
|     uint32_t  prev_offset, curr_offset; | ||||
|     uint32_t  starting_index, i; | ||||
|     __m128i   state[ARGON2_OWORDS_IN_BLOCK]; | ||||
|     int       data_independent_addressing = 1; | ||||
|  | ||||
|     /* Pseudo-random values that determine the reference block position */ | ||||
|     uint64_t *pseudo_rands = NULL; | ||||
|  | ||||
|     if (instance == NULL) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (instance->type == Argon2_id && | ||||
|         (position.pass != 0 || position.slice >= ARGON2_SYNC_POINTS / 2)) { | ||||
|         data_independent_addressing = 0; | ||||
|     } | ||||
|  | ||||
|     pseudo_rands = instance->pseudo_rands; | ||||
|  | ||||
|     if (data_independent_addressing) { | ||||
|         generate_addresses(instance, &position, pseudo_rands); | ||||
|     } | ||||
|  | ||||
|     starting_index = 0; | ||||
|  | ||||
|     if ((0 == position.pass) && (0 == position.slice)) { | ||||
|         starting_index = 2; /* we have already generated the first two blocks */ | ||||
|     } | ||||
|  | ||||
|     /* Offset of the current block */ | ||||
|     curr_offset = position.lane * instance->lane_length + | ||||
|                   position.slice * instance->segment_length + starting_index; | ||||
|  | ||||
|     if (0 == curr_offset % instance->lane_length) { | ||||
|         /* Last block in this lane */ | ||||
|         prev_offset = curr_offset + instance->lane_length - 1; | ||||
|     } else { | ||||
|         /* Previous block */ | ||||
|         prev_offset = curr_offset - 1; | ||||
|     } | ||||
|  | ||||
|     memcpy(state, ((instance->region->memory + prev_offset)->v), | ||||
|            ARGON2_BLOCK_SIZE); | ||||
|  | ||||
|     for (i = starting_index; i < instance->segment_length; | ||||
|          ++i, ++curr_offset, ++prev_offset) { | ||||
|         /*1.1 Rotating prev_offset if needed */ | ||||
|         if (curr_offset % instance->lane_length == 1) { | ||||
|             prev_offset = curr_offset - 1; | ||||
|         } | ||||
|  | ||||
|         /* 1.2 Computing the index of the reference block */ | ||||
|         /* 1.2.1 Taking pseudo-random value from the previous block */ | ||||
|         if (data_independent_addressing) { | ||||
| #pragma warning(push) | ||||
| #pragma warning(disable : 6385) | ||||
|             pseudo_rand = pseudo_rands[i]; | ||||
| #pragma warning(pop) | ||||
|         } else { | ||||
|             pseudo_rand = instance->region->memory[prev_offset].v[0]; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.2 Computing the lane of the reference block */ | ||||
|         ref_lane = ((pseudo_rand >> 32)) % instance->lanes; | ||||
|  | ||||
|         if ((position.pass == 0) && (position.slice == 0)) { | ||||
|             /* Can not reference other lanes yet */ | ||||
|             ref_lane = position.lane; | ||||
|         } | ||||
|  | ||||
|         /* 1.2.3 Computing the number of possible reference block within the | ||||
|          * lane. | ||||
|          */ | ||||
|         position.index = i; | ||||
|         ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, | ||||
|                                 ref_lane == position.lane); | ||||
|  | ||||
|         /* 2 Creating a new block */ | ||||
|         ref_block = instance->region->memory + | ||||
|                     instance->lane_length * ref_lane + ref_index; | ||||
|         curr_block = instance->region->memory + curr_offset; | ||||
|         if (position.pass != 0) { | ||||
|             fill_block_with_xor(state, (uint8_t *) ref_block->v, | ||||
|                                 (uint8_t *) curr_block->v); | ||||
|         } else { | ||||
|             fill_block(state, (uint8_t *) ref_block->v, | ||||
|                        (uint8_t *) curr_block->v); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										278
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,278 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with | ||||
|  * this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
|  | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "utils.h" | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2-encoding.h" | ||||
| #include "argon2.h" | ||||
|  | ||||
| int | ||||
| argon2_ctx(argon2_context *context, argon2_type type) | ||||
| { | ||||
|     /* 1. Validate all inputs */ | ||||
|     int               result = argon2_validate_inputs(context); | ||||
|     uint32_t          memory_blocks, segment_length; | ||||
|     uint32_t          pass; | ||||
|     argon2_instance_t instance; | ||||
|  | ||||
|     if (ARGON2_OK != result) { | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     if (type != Argon2_id && type != Argon2_i) { | ||||
|         return ARGON2_INCORRECT_TYPE; | ||||
|     } | ||||
|  | ||||
|     /* 2. Align memory size */ | ||||
|     /* Minimum memory_blocks = 8L blocks, where L is the number of lanes */ | ||||
|     memory_blocks = context->m_cost; | ||||
|  | ||||
|     if (memory_blocks < 2 * ARGON2_SYNC_POINTS * context->lanes) { | ||||
|         memory_blocks = 2 * ARGON2_SYNC_POINTS * context->lanes; | ||||
|     } | ||||
|  | ||||
|     segment_length = memory_blocks / (context->lanes * ARGON2_SYNC_POINTS); | ||||
|     /* Ensure that all segments have equal length */ | ||||
|     memory_blocks = segment_length * (context->lanes * ARGON2_SYNC_POINTS); | ||||
|  | ||||
|     instance.region         = NULL; | ||||
|     instance.passes         = context->t_cost; | ||||
|     instance.current_pass   = ~ 0U; | ||||
|     instance.memory_blocks  = memory_blocks; | ||||
|     instance.segment_length = segment_length; | ||||
|     instance.lane_length    = segment_length * ARGON2_SYNC_POINTS; | ||||
|     instance.lanes          = context->lanes; | ||||
|     instance.threads        = context->threads; | ||||
|     instance.type           = type; | ||||
|  | ||||
|     /* 3. Initialization: Hashing inputs, allocating memory, filling first | ||||
|      * blocks | ||||
|      */ | ||||
|     result = argon2_initialize(&instance, context); | ||||
|  | ||||
|     if (ARGON2_OK != result) { | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     /* 4. Filling memory */ | ||||
|     for (pass = 0; pass < instance.passes; pass++) { | ||||
|         argon2_fill_memory_blocks(&instance, pass); | ||||
|     } | ||||
|  | ||||
|     /* 5. Finalization */ | ||||
|     argon2_finalize(context, &instance); | ||||
|  | ||||
|     return ARGON2_OK; | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2_hash(const uint32_t t_cost, const uint32_t m_cost, | ||||
|             const uint32_t parallelism, const void *pwd, const size_t pwdlen, | ||||
|             const void *salt, const size_t saltlen, void *hash, | ||||
|             const size_t hashlen, char *encoded, const size_t encodedlen, | ||||
|             argon2_type type) | ||||
| { | ||||
|     argon2_context context; | ||||
|     int            result; | ||||
|     uint8_t       *out; | ||||
|  | ||||
|     if (pwdlen > ARGON2_MAX_PWD_LENGTH) { | ||||
|         return ARGON2_PWD_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     if (hashlen > ARGON2_MAX_OUTLEN) { | ||||
|         return ARGON2_OUTPUT_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     if (saltlen > ARGON2_MAX_SALT_LENGTH) { | ||||
|         return ARGON2_SALT_TOO_LONG; | ||||
|     } | ||||
|  | ||||
|     out = (uint8_t *) malloc(hashlen); | ||||
|     if (!out) { | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; | ||||
|     } | ||||
|  | ||||
|     context.out       = (uint8_t *) out; | ||||
|     context.outlen    = (uint32_t) hashlen; | ||||
|     context.pwd       = (uint8_t *) pwd; | ||||
|     context.pwdlen    = (uint32_t) pwdlen; | ||||
|     context.salt      = (uint8_t *) salt; | ||||
|     context.saltlen   = (uint32_t) saltlen; | ||||
|     context.secret    = NULL; | ||||
|     context.secretlen = 0; | ||||
|     context.ad        = NULL; | ||||
|     context.adlen     = 0; | ||||
|     context.t_cost    = t_cost; | ||||
|     context.m_cost    = m_cost; | ||||
|     context.lanes     = parallelism; | ||||
|     context.threads   = parallelism; | ||||
|     context.flags     = ARGON2_DEFAULT_FLAGS; | ||||
|  | ||||
|     result = argon2_ctx(&context, type); | ||||
|  | ||||
|     if (result != ARGON2_OK) { | ||||
|         sodium_memzero(out, hashlen); | ||||
|         free(out); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     /* if encoding requested, write it */ | ||||
|     if (encoded && encodedlen) { | ||||
|         if (argon2_encode_string(encoded, encodedlen, | ||||
|                                  &context, type) != ARGON2_OK) { | ||||
|             sodium_memzero(out, hashlen); | ||||
|             sodium_memzero(encoded, encodedlen); | ||||
|             free(out); | ||||
|             return ARGON2_ENCODING_FAIL; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* if raw hash requested, write it */ | ||||
|     if (hash) { | ||||
|         memcpy(hash, out, hashlen); | ||||
|     } | ||||
|  | ||||
|     sodium_memzero(out, hashlen); | ||||
|     free(out); | ||||
|  | ||||
|     return ARGON2_OK; | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2i_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                      const uint32_t parallelism, const void *pwd, | ||||
|                      const size_t pwdlen, const void *salt, | ||||
|                      const size_t saltlen, const size_t hashlen, char *encoded, | ||||
|                      const size_t encodedlen) | ||||
| { | ||||
|     return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, | ||||
|                        NULL, hashlen, encoded, encodedlen, Argon2_i); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                  const uint32_t parallelism, const void *pwd, | ||||
|                  const size_t pwdlen, const void *salt, const size_t saltlen, | ||||
|                  void *hash, const size_t hashlen) | ||||
| { | ||||
|     return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, | ||||
|                        hash, hashlen, NULL, 0, Argon2_i); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2id_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                       const uint32_t parallelism, const void *pwd, | ||||
|                       const size_t pwdlen, const void *salt, | ||||
|                       const size_t saltlen, const size_t hashlen, char *encoded, | ||||
|                       const size_t encodedlen) | ||||
| { | ||||
|     return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, | ||||
|                        NULL, hashlen, encoded, encodedlen, Argon2_id); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2id_hash_raw(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                   const uint32_t parallelism, const void *pwd, | ||||
|                   const size_t pwdlen, const void *salt, const size_t saltlen, | ||||
|                   void *hash, const size_t hashlen) | ||||
| { | ||||
|     return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, | ||||
|                        hash, hashlen, NULL, 0, Argon2_id); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen, | ||||
|               argon2_type type) | ||||
| { | ||||
|     argon2_context ctx; | ||||
|     uint8_t       *out; | ||||
|     int            decode_result; | ||||
|     int            ret; | ||||
|     size_t         encoded_len; | ||||
|  | ||||
|     memset(&ctx, 0, sizeof ctx); | ||||
|  | ||||
|     ctx.pwd       = NULL; | ||||
|     ctx.pwdlen    = 0; | ||||
|     ctx.secret    = NULL; | ||||
|     ctx.secretlen = 0; | ||||
|  | ||||
|     /* max values, to be updated in argon2_decode_string */ | ||||
|     encoded_len = strlen(encoded); | ||||
|     if (encoded_len > UINT32_MAX) { | ||||
|         return ARGON2_DECODING_LENGTH_FAIL; | ||||
|     } | ||||
|     ctx.adlen   = (uint32_t) encoded_len; | ||||
|     ctx.saltlen = (uint32_t) encoded_len; | ||||
|     ctx.outlen  = (uint32_t) encoded_len; | ||||
|  | ||||
|     ctx.ad   = (uint8_t *) malloc(ctx.adlen); | ||||
|     ctx.salt = (uint8_t *) malloc(ctx.saltlen); | ||||
|     ctx.out  = (uint8_t *) malloc(ctx.outlen); | ||||
|     if (!ctx.out || !ctx.salt || !ctx.ad) { | ||||
|         free(ctx.ad); | ||||
|         free(ctx.salt); | ||||
|         free(ctx.out); | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; | ||||
|     } | ||||
|     out = (uint8_t *) malloc(ctx.outlen); | ||||
|     if (!out) { | ||||
|         free(ctx.ad); | ||||
|         free(ctx.salt); | ||||
|         free(ctx.out); | ||||
|         return ARGON2_MEMORY_ALLOCATION_ERROR; | ||||
|     } | ||||
|  | ||||
|     decode_result = argon2_decode_string(&ctx, encoded, type); | ||||
|     if (decode_result != ARGON2_OK) { | ||||
|         free(ctx.ad); | ||||
|         free(ctx.salt); | ||||
|         free(ctx.out); | ||||
|         free(out); | ||||
|         return decode_result; | ||||
|     } | ||||
|  | ||||
|     ret = argon2_hash(ctx.t_cost, ctx.m_cost, ctx.threads, pwd, pwdlen, | ||||
|                       ctx.salt, ctx.saltlen, out, ctx.outlen, NULL, 0, type); | ||||
|  | ||||
|     free(ctx.ad); | ||||
|     free(ctx.salt); | ||||
|  | ||||
|     if (ret != ARGON2_OK || sodium_memcmp(out, ctx.out, ctx.outlen) != 0) { | ||||
|         ret = ARGON2_VERIFY_MISMATCH; | ||||
|     } | ||||
|     free(out); | ||||
|     free(ctx.out); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen) | ||||
| { | ||||
|     return argon2_verify(encoded, pwd, pwdlen, Argon2_i); | ||||
| } | ||||
|  | ||||
| int | ||||
| argon2id_verify(const char *encoded, const void *pwd, const size_t pwdlen) | ||||
| { | ||||
|     return argon2_verify(encoded, pwd, pwdlen, Argon2_id); | ||||
| } | ||||
							
								
								
									
										305
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/argon2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,305 @@ | ||||
| /* | ||||
|  * Argon2 source code package | ||||
|  * | ||||
|  * Written by Daniel Dinu and Dmitry Khovratovich, 2015 | ||||
|  * | ||||
|  * This work is licensed under a Creative Commons CC0 1.0 License/Waiver. | ||||
|  * | ||||
|  * You should have received a copy of the CC0 Public Domain Dedication along | ||||
|  * with this software. If not, see | ||||
|  * <http://creativecommons.org/publicdomain/zero/1.0/>. | ||||
|  */ | ||||
| #ifndef argon2_H | ||||
| #define argon2_H | ||||
|  | ||||
| #include <limits.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* | ||||
|  * Argon2 input parameter restrictions | ||||
|  */ | ||||
|  | ||||
| /* Minimum and maximum number of lanes (degree of parallelism) */ | ||||
| #define ARGON2_MIN_LANES UINT32_C(1) | ||||
| #define ARGON2_MAX_LANES UINT32_C(0xFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum number of threads */ | ||||
| #define ARGON2_MIN_THREADS UINT32_C(1) | ||||
| #define ARGON2_MAX_THREADS UINT32_C(0xFFFFFF) | ||||
|  | ||||
| /* Number of synchronization points between lanes per pass */ | ||||
| #define ARGON2_SYNC_POINTS UINT32_C(4) | ||||
|  | ||||
| /* Minimum and maximum digest size in bytes */ | ||||
| #define ARGON2_MIN_OUTLEN UINT32_C(16) | ||||
| #define ARGON2_MAX_OUTLEN UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum number of memory blocks (each of BLOCK_SIZE bytes) */ | ||||
| #define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) /* 2 blocks per slice */ | ||||
|  | ||||
| #define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b)) | ||||
| /* Max memory size is half the addressing space, topping at 2^32 blocks (4 TB) | ||||
|  */ | ||||
| #define ARGON2_MAX_MEMORY_BITS \ | ||||
|     ARGON2_MIN(UINT32_C(32), (sizeof(void *) * CHAR_BIT - 10 - 1)) | ||||
| #define ARGON2_MAX_MEMORY \ | ||||
|     ARGON2_MIN(UINT32_C(0xFFFFFFFF), UINT64_C(1) << ARGON2_MAX_MEMORY_BITS) | ||||
|  | ||||
| /* Minimum and maximum number of passes */ | ||||
| #define ARGON2_MIN_TIME UINT32_C(1) | ||||
| #define ARGON2_MAX_TIME UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum password length in bytes */ | ||||
| #define ARGON2_MIN_PWD_LENGTH UINT32_C(0) | ||||
| #define ARGON2_MAX_PWD_LENGTH UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum associated data length in bytes */ | ||||
| #define ARGON2_MIN_AD_LENGTH UINT32_C(0) | ||||
| #define ARGON2_MAX_AD_LENGTH UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum salt length in bytes */ | ||||
| #define ARGON2_MIN_SALT_LENGTH UINT32_C(8) | ||||
| #define ARGON2_MAX_SALT_LENGTH UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| /* Minimum and maximum key length in bytes */ | ||||
| #define ARGON2_MIN_SECRET UINT32_C(0) | ||||
| #define ARGON2_MAX_SECRET UINT32_C(0xFFFFFFFF) | ||||
|  | ||||
| #define ARGON2_FLAG_CLEAR_PASSWORD (UINT32_C(1) << 0) | ||||
| #define ARGON2_FLAG_CLEAR_SECRET (UINT32_C(1) << 1) | ||||
| #define ARGON2_FLAG_CLEAR_MEMORY (UINT32_C(1) << 2) | ||||
| #define ARGON2_DEFAULT_FLAGS (UINT32_C(0)) | ||||
|  | ||||
| /* Error codes */ | ||||
| typedef enum Argon2_ErrorCodes { | ||||
|     ARGON2_OK = 0, | ||||
|  | ||||
|     ARGON2_OUTPUT_PTR_NULL = -1, | ||||
|  | ||||
|     ARGON2_OUTPUT_TOO_SHORT = -2, | ||||
|     ARGON2_OUTPUT_TOO_LONG  = -3, | ||||
|  | ||||
|     ARGON2_PWD_TOO_SHORT = -4, | ||||
|     ARGON2_PWD_TOO_LONG  = -5, | ||||
|  | ||||
|     ARGON2_SALT_TOO_SHORT = -6, | ||||
|     ARGON2_SALT_TOO_LONG  = -7, | ||||
|  | ||||
|     ARGON2_AD_TOO_SHORT = -8, | ||||
|     ARGON2_AD_TOO_LONG  = -9, | ||||
|  | ||||
|     ARGON2_SECRET_TOO_SHORT = -10, | ||||
|     ARGON2_SECRET_TOO_LONG  = -11, | ||||
|  | ||||
|     ARGON2_TIME_TOO_SMALL = -12, | ||||
|     ARGON2_TIME_TOO_LARGE = -13, | ||||
|  | ||||
|     ARGON2_MEMORY_TOO_LITTLE = -14, | ||||
|     ARGON2_MEMORY_TOO_MUCH   = -15, | ||||
|  | ||||
|     ARGON2_LANES_TOO_FEW  = -16, | ||||
|     ARGON2_LANES_TOO_MANY = -17, | ||||
|  | ||||
|     ARGON2_PWD_PTR_MISMATCH    = -18, /* NULL ptr with non-zero length */ | ||||
|     ARGON2_SALT_PTR_MISMATCH   = -19, /* NULL ptr with non-zero length */ | ||||
|     ARGON2_SECRET_PTR_MISMATCH = -20, /* NULL ptr with non-zero length */ | ||||
|     ARGON2_AD_PTR_MISMATCH     = -21, /* NULL ptr with non-zero length */ | ||||
|  | ||||
|     ARGON2_MEMORY_ALLOCATION_ERROR = -22, | ||||
|  | ||||
|     ARGON2_FREE_MEMORY_CBK_NULL     = -23, | ||||
|     ARGON2_ALLOCATE_MEMORY_CBK_NULL = -24, | ||||
|  | ||||
|     ARGON2_INCORRECT_PARAMETER = -25, | ||||
|     ARGON2_INCORRECT_TYPE      = -26, | ||||
|  | ||||
|     ARGON2_OUT_PTR_MISMATCH = -27, | ||||
|  | ||||
|     ARGON2_THREADS_TOO_FEW  = -28, | ||||
|     ARGON2_THREADS_TOO_MANY = -29, | ||||
|  | ||||
|     ARGON2_MISSING_ARGS = -30, | ||||
|  | ||||
|     ARGON2_ENCODING_FAIL = -31, | ||||
|  | ||||
|     ARGON2_DECODING_FAIL = -32, | ||||
|  | ||||
|     ARGON2_THREAD_FAIL = -33, | ||||
|  | ||||
|     ARGON2_DECODING_LENGTH_FAIL = -34, | ||||
|  | ||||
|     ARGON2_VERIFY_MISMATCH = -35 | ||||
| } argon2_error_codes; | ||||
|  | ||||
| /* Argon2 external data structures */ | ||||
|  | ||||
| /* | ||||
|  * Context: structure to hold Argon2 inputs: | ||||
|  * output array and its length, | ||||
|  * password and its length, | ||||
|  * salt and its length, | ||||
|  * secret and its length, | ||||
|  * associated data and its length, | ||||
|  * number of passes, amount of used memory (in KBytes, can be rounded up a bit) | ||||
|  * number of parallel threads that will be run. | ||||
|  * All the parameters above affect the output hash value. | ||||
|  * Additionally, two function pointers can be provided to allocate and | ||||
|  * deallocate the memory (if NULL, memory will be allocated internally). | ||||
|  * Also, three flags indicate whether to erase password, secret as soon as they | ||||
|  * are pre-hashed (and thus not needed anymore), and the entire memory | ||||
|  ***** | ||||
|  * Simplest situation: you have output array out[8], password is stored in | ||||
|  * pwd[32], salt is stored in salt[16], you do not have keys nor associated | ||||
|  *data. | ||||
|  * You need to spend 1 GB of RAM and you run 5 passes of Argon2 with 4 parallel | ||||
|  *lanes. | ||||
|  * You want to erase the password, but you're OK with last pass not being | ||||
|  *erased. | ||||
|  * You want to use the default memory allocator. | ||||
|  * Then you initialize: | ||||
|  * Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false). | ||||
|  */ | ||||
| typedef struct Argon2_Context { | ||||
|     uint8_t *out;    /* output array */ | ||||
|     uint32_t outlen; /* digest length */ | ||||
|  | ||||
|     uint8_t *pwd;    /* password array */ | ||||
|     uint32_t pwdlen; /* password length */ | ||||
|  | ||||
|     uint8_t *salt;    /* salt array */ | ||||
|     uint32_t saltlen; /* salt length */ | ||||
|  | ||||
|     uint8_t *secret;    /* key array */ | ||||
|     uint32_t secretlen; /* key length */ | ||||
|  | ||||
|     uint8_t *ad;    /* associated data array */ | ||||
|     uint32_t adlen; /* associated data length */ | ||||
|  | ||||
|     uint32_t t_cost;  /* number of passes */ | ||||
|     uint32_t m_cost;  /* amount of memory requested (KB) */ | ||||
|     uint32_t lanes;   /* number of lanes */ | ||||
|     uint32_t threads; /* maximum number of threads */ | ||||
|  | ||||
|     uint32_t flags; /* array of bool options */ | ||||
| } argon2_context; | ||||
|  | ||||
| /* Argon2 primitive type */ | ||||
| typedef enum Argon2_type { Argon2_i = 1, Argon2_id = 2 } argon2_type; | ||||
|  | ||||
| /* | ||||
|  * Function that performs memory-hard hashing with certain degree of parallelism | ||||
|  * @param  context  Pointer to the Argon2 internal structure | ||||
|  * @return Error code if smth is wrong, ARGON2_OK otherwise | ||||
|  */ | ||||
| int argon2_ctx(argon2_context *context, argon2_type type); | ||||
|  | ||||
| /** | ||||
|  * Hashes a password with Argon2i, producing an encoded hash | ||||
|  * @param t_cost Number of iterations | ||||
|  * @param m_cost Sets memory usage to m_cost kibibytes | ||||
|  * @param parallelism Number of threads and compute lanes | ||||
|  * @param pwd Pointer to password | ||||
|  * @param pwdlen Password size in bytes | ||||
|  * @param salt Pointer to salt | ||||
|  * @param saltlen Salt size in bytes | ||||
|  * @param hashlen Desired length of the hash in bytes | ||||
|  * @param encoded Buffer where to write the encoded hash | ||||
|  * @param encodedlen Size of the buffer (thus max size of the encoded hash) | ||||
|  * @pre   Different parallelism levels will give different results | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2i_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                          const uint32_t parallelism, const void *pwd, | ||||
|                          const size_t pwdlen, const void *salt, | ||||
|                          const size_t saltlen, const size_t hashlen, | ||||
|                          char *encoded, const size_t encodedlen); | ||||
|  | ||||
| /** | ||||
|  * Hashes a password with Argon2id, producing an encoded hash | ||||
|  * @param t_cost Number of iterations | ||||
|  * @param m_cost Sets memory usage to m_cost kibibytes | ||||
|  * @param parallelism Number of threads and compute lanes | ||||
|  * @param pwd Pointer to password | ||||
|  * @param pwdlen Password size in bytes | ||||
|  * @param salt Pointer to salt | ||||
|  * @param saltlen Salt size in bytes | ||||
|  * @param hashlen Desired length of the hash in bytes | ||||
|  * @param encoded Buffer where to write the encoded hash | ||||
|  * @param encodedlen Size of the buffer (thus max size of the encoded hash) | ||||
|  * @pre   Different parallelism levels will give different results | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2id_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                           const uint32_t parallelism, const void *pwd, | ||||
|                           const size_t pwdlen, const void *salt, | ||||
|                           const size_t saltlen, const size_t hashlen, | ||||
|                           char *encoded, const size_t encodedlen); | ||||
|  | ||||
| /** | ||||
|  * Hashes a password with Argon2i, producing a raw hash | ||||
|  * @param t_cost Number of iterations | ||||
|  * @param m_cost Sets memory usage to m_cost kibibytes | ||||
|  * @param parallelism Number of threads and compute lanes | ||||
|  * @param pwd Pointer to password | ||||
|  * @param pwdlen Password size in bytes | ||||
|  * @param salt Pointer to salt | ||||
|  * @param saltlen Salt size in bytes | ||||
|  * @param hash Buffer where to write the raw hash | ||||
|  * @param hashlen Desired length of the hash in bytes | ||||
|  * @pre   Different parallelism levels will give different results | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                      const uint32_t parallelism, const void *pwd, | ||||
|                      const size_t pwdlen, const void *salt, | ||||
|                      const size_t saltlen, void *hash, const size_t hashlen); | ||||
|  | ||||
| /** | ||||
|  * Hashes a password with Argon2id, producing a raw hash | ||||
|  * @param t_cost Number of iterations | ||||
|  * @param m_cost Sets memory usage to m_cost kibibytes | ||||
|  * @param parallelism Number of threads and compute lanes | ||||
|  * @param pwd Pointer to password | ||||
|  * @param pwdlen Password size in bytes | ||||
|  * @param salt Pointer to salt | ||||
|  * @param saltlen Salt size in bytes | ||||
|  * @param hash Buffer where to write the raw hash | ||||
|  * @param hashlen Desired length of the hash in bytes | ||||
|  * @pre   Different parallelism levels will give different results | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2id_hash_raw(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                       const uint32_t parallelism, const void *pwd, | ||||
|                       const size_t pwdlen, const void *salt, | ||||
|                       const size_t saltlen, void *hash, const size_t hashlen); | ||||
|  | ||||
| /* generic function underlying the above ones */ | ||||
| int argon2_hash(const uint32_t t_cost, const uint32_t m_cost, | ||||
|                 const uint32_t parallelism, const void *pwd, | ||||
|                 const size_t pwdlen, const void *salt, const size_t saltlen, | ||||
|                 void *hash, const size_t hashlen, char *encoded, | ||||
|                 const size_t encodedlen, argon2_type type); | ||||
|  | ||||
| /** | ||||
|  * Verifies a password against an encoded string | ||||
|  * Encoded string is restricted as in argon2_validate_inputs() | ||||
|  * @param encoded String encoding parameters, salt, hash | ||||
|  * @param pwd Pointer to password | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen); | ||||
|  | ||||
| /** | ||||
|  * Verifies a password against an encoded string | ||||
|  * Encoded string is restricted as in argon2_validate_inputs() | ||||
|  * @param encoded String encoding parameters, salt, hash | ||||
|  * @param pwd Pointer to password | ||||
|  * @pre   Returns ARGON2_OK if successful | ||||
|  */ | ||||
| int argon2id_verify(const char *encoded, const void *pwd, const size_t pwdlen); | ||||
|  | ||||
| /* generic function underlying the above ones */ | ||||
| int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen, | ||||
|                   argon2_type type); | ||||
| #endif | ||||
							
								
								
									
										79
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blake2b-long.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blake2b-long.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_generichash_blake2b.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #include "blake2b-long.h" | ||||
|  | ||||
| int | ||||
| blake2b_long(void *pout, size_t outlen, const void *in, size_t inlen) | ||||
| { | ||||
|     uint8_t *out = (uint8_t *) pout; | ||||
|     crypto_generichash_blake2b_state blake_state; | ||||
|     uint8_t outlen_bytes[4 /* sizeof(uint32_t) */] = { 0 }; | ||||
|     int     ret = -1; | ||||
|  | ||||
|     if (outlen > UINT32_MAX) { | ||||
|         goto fail; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|  | ||||
|     /* Ensure little-endian byte order! */ | ||||
|     STORE32_LE(outlen_bytes, (uint32_t) outlen); | ||||
|  | ||||
| #define TRY(statement)   \ | ||||
|     do {                 \ | ||||
|         ret = statement; \ | ||||
|         if (ret < 0) {   \ | ||||
|             goto fail;   \ | ||||
|         }                \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
|     if (outlen <= crypto_generichash_blake2b_BYTES_MAX) { | ||||
|         TRY(crypto_generichash_blake2b_init(&blake_state, NULL, 0U, outlen)); | ||||
|         TRY(crypto_generichash_blake2b_update(&blake_state, outlen_bytes, | ||||
|                                               sizeof(outlen_bytes))); | ||||
|         TRY(crypto_generichash_blake2b_update( | ||||
|             &blake_state, (const unsigned char *) in, inlen)); | ||||
|         TRY(crypto_generichash_blake2b_final(&blake_state, out, outlen)); | ||||
|     } else { | ||||
|         uint32_t toproduce; | ||||
|         uint8_t  out_buffer[crypto_generichash_blake2b_BYTES_MAX]; | ||||
|         uint8_t  in_buffer[crypto_generichash_blake2b_BYTES_MAX]; | ||||
|         TRY(crypto_generichash_blake2b_init( | ||||
|             &blake_state, NULL, 0U, crypto_generichash_blake2b_BYTES_MAX)); | ||||
|         TRY(crypto_generichash_blake2b_update(&blake_state, outlen_bytes, | ||||
|                                               sizeof(outlen_bytes))); | ||||
|         TRY(crypto_generichash_blake2b_update( | ||||
|             &blake_state, (const unsigned char *) in, inlen)); | ||||
|         TRY(crypto_generichash_blake2b_final( | ||||
|             &blake_state, out_buffer, crypto_generichash_blake2b_BYTES_MAX)); | ||||
|         memcpy(out, out_buffer, crypto_generichash_blake2b_BYTES_MAX / 2); | ||||
|         out += crypto_generichash_blake2b_BYTES_MAX / 2; | ||||
|         toproduce = | ||||
|             (uint32_t) outlen - crypto_generichash_blake2b_BYTES_MAX / 2; | ||||
|  | ||||
|         while (toproduce > crypto_generichash_blake2b_BYTES_MAX) { | ||||
|             memcpy(in_buffer, out_buffer, crypto_generichash_blake2b_BYTES_MAX); | ||||
|             TRY(crypto_generichash_blake2b( | ||||
|                 out_buffer, crypto_generichash_blake2b_BYTES_MAX, in_buffer, | ||||
|                 crypto_generichash_blake2b_BYTES_MAX, NULL, 0U)); | ||||
|             memcpy(out, out_buffer, crypto_generichash_blake2b_BYTES_MAX / 2); | ||||
|             out += crypto_generichash_blake2b_BYTES_MAX / 2; | ||||
|             toproduce -= crypto_generichash_blake2b_BYTES_MAX / 2; | ||||
|         } | ||||
|  | ||||
|         memcpy(in_buffer, out_buffer, crypto_generichash_blake2b_BYTES_MAX); | ||||
|         TRY(crypto_generichash_blake2b(out_buffer, toproduce, in_buffer, | ||||
|                                        crypto_generichash_blake2b_BYTES_MAX, | ||||
|                                        NULL, 0U)); | ||||
|         memcpy(out, out_buffer, toproduce); | ||||
|     } | ||||
| fail: | ||||
|     sodium_memzero(&blake_state, sizeof(blake_state)); | ||||
|     return ret; | ||||
| #undef TRY | ||||
| } | ||||
							
								
								
									
										8
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blake2b-long.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blake2b-long.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #ifndef blake2b_long_H | ||||
| #define blake2b_long_H | ||||
|  | ||||
| #include <stddef.h> | ||||
|  | ||||
| int blake2b_long(void *pout, size_t outlen, const void *in, size_t inlen); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										150
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-avx2.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,150 @@ | ||||
| #ifndef blamka_round_avx2_H | ||||
| #define blamka_round_avx2_H | ||||
|  | ||||
| #include "private/common.h" | ||||
| #include "private/sse2_64_32.h" | ||||
|  | ||||
| #define rotr32(x) _mm256_shuffle_epi32(x, _MM_SHUFFLE(2, 3, 0, 1)) | ||||
| #define rotr24(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10, 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) | ||||
| #define rotr16(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9, 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) | ||||
| #define rotr63(x) _mm256_xor_si256(_mm256_srli_epi64((x), 63), _mm256_add_epi64((x), (x))) | ||||
|  | ||||
| #define G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do { \ | ||||
|         __m256i ml = _mm256_mul_epu32(A0, B0); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ | ||||
|         D0 = _mm256_xor_si256(D0, A0); \ | ||||
|         D0 = rotr32(D0); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(C0, D0); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ | ||||
|         \ | ||||
|         B0 = _mm256_xor_si256(B0, C0); \ | ||||
|         B0 = rotr24(B0); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(A1, B1); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ | ||||
|         D1 = _mm256_xor_si256(D1, A1); \ | ||||
|         D1 = rotr32(D1); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(C1, D1); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ | ||||
|         \ | ||||
|         B1 = _mm256_xor_si256(B1, C1); \ | ||||
|         B1 = rotr24(B1); \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do { \ | ||||
|         __m256i ml = _mm256_mul_epu32(A0, B0); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ | ||||
|         D0 = _mm256_xor_si256(D0, A0); \ | ||||
|         D0 = rotr16(D0); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(C0, D0); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ | ||||
|         B0 = _mm256_xor_si256(B0, C0); \ | ||||
|         B0 = rotr63(B0); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(A1, B1); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ | ||||
|         D1 = _mm256_xor_si256(D1, A1); \ | ||||
|         D1 = rotr16(D1); \ | ||||
|         \ | ||||
|         ml = _mm256_mul_epu32(C1, D1); \ | ||||
|         ml = _mm256_add_epi64(ml, ml); \ | ||||
|         C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ | ||||
|         B1 = _mm256_xor_si256(B1, C1); \ | ||||
|         B1 = rotr63(B1); \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         \ | ||||
|         B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do { \ | ||||
|         __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ | ||||
|         __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ | ||||
|         B1 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         B0 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         \ | ||||
|         tmp1 = C0; \ | ||||
|         C0 = C1; \ | ||||
|         C1 = tmp1; \ | ||||
|         \ | ||||
|         tmp1 = _mm256_blend_epi32(D0, D1, 0xCC); \ | ||||
|         tmp2 = _mm256_blend_epi32(D0, D1, 0x33); \ | ||||
|         D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|     } while(0); | ||||
|  | ||||
| #define UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         \ | ||||
|         B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do { \ | ||||
|         __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ | ||||
|         __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ | ||||
|         B0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         B1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         \ | ||||
|         tmp1 = C0; \ | ||||
|         C0 = C1; \ | ||||
|         C1 = tmp1; \ | ||||
|         \ | ||||
|         tmp1 = _mm256_blend_epi32(D0, D1, 0x33); \ | ||||
|         tmp2 = _mm256_blend_epi32(D0, D1, 0xCC); \ | ||||
|         D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|         D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define BLAKE2_ROUND_1(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do{ \ | ||||
|         G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         \ | ||||
|         DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|         \ | ||||
|         G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         \ | ||||
|         UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do{ \ | ||||
|         G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         \ | ||||
|         DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         \ | ||||
|         G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|         \ | ||||
|         UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     } while((void)0, 0); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										145
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-avx512f.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-avx512f.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| #ifndef blamka_round_avx512f_H | ||||
| #define blamka_round_avx512f_H | ||||
|  | ||||
| #include "private/common.h" | ||||
| #include "private/sse2_64_32.h" | ||||
|  | ||||
| #define ror64(x, n) _mm512_ror_epi64((x), (n)) | ||||
|  | ||||
| static inline __m512i | ||||
| muladd(__m512i x, __m512i y) | ||||
| { | ||||
|     __m512i z = _mm512_mul_epu32(x, y); | ||||
|  | ||||
|     return _mm512_add_epi64(_mm512_add_epi64(x, y), _mm512_add_epi64(z, z)); | ||||
| } | ||||
|  | ||||
| #define G1_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         A0 = muladd(A0, B0); \ | ||||
|         A1 = muladd(A1, B1); \ | ||||
|         \ | ||||
|         D0 = _mm512_xor_si512(D0, A0); \ | ||||
|         D1 = _mm512_xor_si512(D1, A1); \ | ||||
|         \ | ||||
|         D0 = ror64(D0, 32); \ | ||||
|         D1 = ror64(D1, 32); \ | ||||
|         \ | ||||
|         C0 = muladd(C0, D0); \ | ||||
|         C1 = muladd(C1, D1); \ | ||||
|         \ | ||||
|         B0 = _mm512_xor_si512(B0, C0); \ | ||||
|         B1 = _mm512_xor_si512(B1, C1); \ | ||||
|         \ | ||||
|         B0 = ror64(B0, 24); \ | ||||
|         B1 = ror64(B1, 24); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define G2_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         A0 = muladd(A0, B0); \ | ||||
|         A1 = muladd(A1, B1); \ | ||||
|         \ | ||||
|         D0 = _mm512_xor_si512(D0, A0); \ | ||||
|         D1 = _mm512_xor_si512(D1, A1); \ | ||||
|         \ | ||||
|         D0 = ror64(D0, 16); \ | ||||
|         D1 = ror64(D1, 16); \ | ||||
|         \ | ||||
|         C0 = muladd(C0, D0); \ | ||||
|         C1 = muladd(C1, D1); \ | ||||
|         \ | ||||
|         B0 = _mm512_xor_si512(B0, C0); \ | ||||
|         B1 = _mm512_xor_si512(B1, C1); \ | ||||
|         \ | ||||
|         B0 = ror64(B0, 63); \ | ||||
|         B1 = ror64(B1, 63); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         \ | ||||
|         C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         \ | ||||
|         D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ | ||||
|         \ | ||||
|         C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ | ||||
|         \ | ||||
|         D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|         D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do { \ | ||||
|         G1_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         G2_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         \ | ||||
|         DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         \ | ||||
|         G1_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         G2_AVX512F(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         \ | ||||
|         UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define SWAP_HALVES(A0, A1) \ | ||||
|     do { \ | ||||
|         __m512i t0, t1; \ | ||||
|         t0 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(1, 0, 1, 0)); \ | ||||
|         t1 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(3, 2, 3, 2)); \ | ||||
|         A0 = t0; \ | ||||
|         A1 = t1; \ | ||||
|     } while((void)0, 0) | ||||
|  | ||||
| #define SWAP_QUARTERS(A0, A1) \ | ||||
|     do { \ | ||||
|         SWAP_HALVES(A0, A1); \ | ||||
|         A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ | ||||
|         A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ | ||||
|     } while((void)0, 0) | ||||
|  | ||||
| #define UNSWAP_QUARTERS(A0, A1) \ | ||||
|     do { \ | ||||
|         A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ | ||||
|         A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ | ||||
|         SWAP_HALVES(A0, A1); \ | ||||
|     } while((void)0, 0) | ||||
|  | ||||
| #define BLAKE2_ROUND_1(A0, C0, B0, D0, A1, C1, B1, D1) \ | ||||
|     do { \ | ||||
|         SWAP_HALVES(A0, B0); \ | ||||
|         SWAP_HALVES(C0, D0); \ | ||||
|         SWAP_HALVES(A1, B1); \ | ||||
|         SWAP_HALVES(C1, D1); \ | ||||
|         BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         SWAP_HALVES(A0, B0); \ | ||||
|         SWAP_HALVES(C0, D0); \ | ||||
|         SWAP_HALVES(A1, B1); \ | ||||
|         SWAP_HALVES(C1, D1); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ | ||||
|     do { \ | ||||
|         SWAP_QUARTERS(A0, A1); \ | ||||
|         SWAP_QUARTERS(B0, B1); \ | ||||
|         SWAP_QUARTERS(C0, C1); \ | ||||
|         SWAP_QUARTERS(D0, D1); \ | ||||
|         BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|         UNSWAP_QUARTERS(A0, A1); \ | ||||
|         UNSWAP_QUARTERS(B0, B1); \ | ||||
|         UNSWAP_QUARTERS(C0, C1); \ | ||||
|         UNSWAP_QUARTERS(D0, D1); \ | ||||
|     } while ((void)0, 0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-ref.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-ref.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #ifndef blamka_round_ref_H | ||||
| #define blamka_round_ref_H | ||||
|  | ||||
| #include "private/common.h" | ||||
|  | ||||
| /*designed by the Lyra PHC team */ | ||||
| static inline uint64_t | ||||
| fBlaMka(uint64_t x, uint64_t y) | ||||
| { | ||||
|     const uint64_t m  = UINT64_C(0xFFFFFFFF); | ||||
|     const uint64_t xy = (x & m) * (y & m); | ||||
|     return x + y + 2 * xy; | ||||
| } | ||||
|  | ||||
| #define G(a, b, c, d)          \ | ||||
|     do {                       \ | ||||
|         a = fBlaMka(a, b);     \ | ||||
|         d = ROTR64(d ^ a, 32); \ | ||||
|         c = fBlaMka(c, d);     \ | ||||
|         b = ROTR64(b ^ c, 24); \ | ||||
|         a = fBlaMka(a, b);     \ | ||||
|         d = ROTR64(d ^ a, 16); \ | ||||
|         c = fBlaMka(c, d);     \ | ||||
|         b = ROTR64(b ^ c, 63); \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define BLAKE2_ROUND_NOMSG(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, \ | ||||
|                            v12, v13, v14, v15)                               \ | ||||
|     do {                                                                     \ | ||||
|         G(v0, v4, v8, v12);                                                  \ | ||||
|         G(v1, v5, v9, v13);                                                  \ | ||||
|         G(v2, v6, v10, v14);                                                 \ | ||||
|         G(v3, v7, v11, v15);                                                 \ | ||||
|         G(v0, v5, v10, v15);                                                 \ | ||||
|         G(v1, v6, v11, v12);                                                 \ | ||||
|         G(v2, v7, v8, v13);                                                  \ | ||||
|         G(v3, v4, v9, v14);                                                  \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										120
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-ssse3.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/blamka-round-ssse3.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| #ifndef blamka_round_ssse3_H | ||||
| #define blamka_round_ssse3_H | ||||
|  | ||||
| #include "private/common.h" | ||||
| #include "private/sse2_64_32.h" | ||||
|  | ||||
| #define r16 \ | ||||
|     (_mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) | ||||
| #define r24 \ | ||||
|     (_mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) | ||||
| #define _mm_roti_epi64(x, c)                                         \ | ||||
|     (-(c) == 32)                                                     \ | ||||
|         ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1))            \ | ||||
|         : (-(c) == 24)                                               \ | ||||
|               ? _mm_shuffle_epi8((x), r24)                           \ | ||||
|               : (-(c) == 16)                                         \ | ||||
|                     ? _mm_shuffle_epi8((x), r16)                     \ | ||||
|                     : (-(c) == 63)                                   \ | ||||
|                           ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_add_epi64((x), (x)))   \ | ||||
|                           : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ | ||||
|                                           _mm_slli_epi64((x), 64 - (-(c)))) | ||||
|  | ||||
| static inline __m128i | ||||
| fBlaMka(__m128i x, __m128i y) | ||||
| { | ||||
|     const __m128i z = _mm_mul_epu32(x, y); | ||||
|     return _mm_add_epi64(_mm_add_epi64(x, y), _mm_add_epi64(z, z)); | ||||
| } | ||||
|  | ||||
| #define G1(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do {                                   \ | ||||
|         A0 = fBlaMka(A0, B0);              \ | ||||
|         A1 = fBlaMka(A1, B1);              \ | ||||
|                                            \ | ||||
|         D0 = _mm_xor_si128(D0, A0);        \ | ||||
|         D1 = _mm_xor_si128(D1, A1);        \ | ||||
|                                            \ | ||||
|         D0 = _mm_roti_epi64(D0, -32);      \ | ||||
|         D1 = _mm_roti_epi64(D1, -32);      \ | ||||
|                                            \ | ||||
|         C0 = fBlaMka(C0, D0);              \ | ||||
|         C1 = fBlaMka(C1, D1);              \ | ||||
|                                            \ | ||||
|         B0 = _mm_xor_si128(B0, C0);        \ | ||||
|         B1 = _mm_xor_si128(B1, C1);        \ | ||||
|                                            \ | ||||
|         B0 = _mm_roti_epi64(B0, -24);      \ | ||||
|         B1 = _mm_roti_epi64(B1, -24);      \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define G2(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do {                                   \ | ||||
|         A0 = fBlaMka(A0, B0);              \ | ||||
|         A1 = fBlaMka(A1, B1);              \ | ||||
|                                            \ | ||||
|         D0 = _mm_xor_si128(D0, A0);        \ | ||||
|         D1 = _mm_xor_si128(D1, A1);        \ | ||||
|                                            \ | ||||
|         D0 = _mm_roti_epi64(D0, -16);      \ | ||||
|         D1 = _mm_roti_epi64(D1, -16);      \ | ||||
|                                            \ | ||||
|         C0 = fBlaMka(C0, D0);              \ | ||||
|         C1 = fBlaMka(C1, D1);              \ | ||||
|                                            \ | ||||
|         B0 = _mm_xor_si128(B0, C0);        \ | ||||
|         B1 = _mm_xor_si128(B1, C1);        \ | ||||
|                                            \ | ||||
|         B0 = _mm_roti_epi64(B0, -63);      \ | ||||
|         B1 = _mm_roti_epi64(B1, -63);      \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do {                                            \ | ||||
|         __m128i t0 = _mm_alignr_epi8(B1, B0, 8);    \ | ||||
|         __m128i t1 = _mm_alignr_epi8(B0, B1, 8);    \ | ||||
|         B0         = t0;                            \ | ||||
|         B1         = t1;                            \ | ||||
|                                                     \ | ||||
|         t0 = C0;                                    \ | ||||
|         C0 = C1;                                    \ | ||||
|         C1 = t0;                                    \ | ||||
|                                                     \ | ||||
|         t0 = _mm_alignr_epi8(D1, D0, 8);            \ | ||||
|         t1 = _mm_alignr_epi8(D0, D1, 8);            \ | ||||
|         D0 = t1;                                    \ | ||||
|         D1 = t0;                                    \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ | ||||
|     do {                                              \ | ||||
|         __m128i t0 = _mm_alignr_epi8(B0, B1, 8);      \ | ||||
|         __m128i t1 = _mm_alignr_epi8(B1, B0, 8);      \ | ||||
|         B0         = t0;                              \ | ||||
|         B1         = t1;                              \ | ||||
|                                                       \ | ||||
|         t0 = C0;                                      \ | ||||
|         C0 = C1;                                      \ | ||||
|         C1 = t0;                                      \ | ||||
|                                                       \ | ||||
|         t0 = _mm_alignr_epi8(D0, D1, 8);              \ | ||||
|         t1 = _mm_alignr_epi8(D1, D0, 8);              \ | ||||
|         D0 = t1;                                      \ | ||||
|         D1 = t0;                                      \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #define BLAKE2_ROUND(A0, A1, B0, B1, C0, C1, D0, D1)   \ | ||||
|     do {                                               \ | ||||
|         G1(A0, B0, C0, D0, A1, B1, C1, D1);            \ | ||||
|         G2(A0, B0, C0, D0, A1, B1, C1, D1);            \ | ||||
|                                                        \ | ||||
|         DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1);   \ | ||||
|                                                        \ | ||||
|         G1(A0, B0, C0, D0, A1, B1, C1, D1);            \ | ||||
|         G2(A0, B0, C0, D0, A1, B1, C1, D1);            \ | ||||
|                                                        \ | ||||
|         UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ | ||||
|     } while ((void) 0, 0) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										294
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/pwhash_argon2i.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/pwhash_argon2i.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <limits.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2-encoding.h" | ||||
| #include "argon2.h" | ||||
| #include "crypto_pwhash.h" | ||||
| #include "crypto_pwhash_argon2i.h" | ||||
| #include "crypto_pwhash_argon2id.h" | ||||
| #include "private/common.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #define STR_HASHBYTES 32U | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2i_alg_argon2i13(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_ALG_ARGON2I13; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_bytes_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_BYTES_MIN >= ARGON2_MIN_OUTLEN); | ||||
|     return crypto_pwhash_argon2i_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_bytes_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_BYTES_MAX <= ARGON2_MAX_OUTLEN); | ||||
|     return crypto_pwhash_argon2i_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_passwd_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_PASSWD_MIN >= ARGON2_MIN_PWD_LENGTH); | ||||
|     return crypto_pwhash_argon2i_PASSWD_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_passwd_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_PASSWD_MAX <= ARGON2_MAX_PWD_LENGTH); | ||||
|     return crypto_pwhash_argon2i_PASSWD_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_saltbytes(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_SALTBYTES >= ARGON2_MIN_SALT_LENGTH); | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_SALTBYTES <= ARGON2_MAX_SALT_LENGTH); | ||||
|     return crypto_pwhash_argon2i_SALTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_strbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_STRBYTES; | ||||
| } | ||||
|  | ||||
| const char* | ||||
| crypto_pwhash_argon2i_strprefix(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_STRPREFIX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_opslimit_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_OPSLIMIT_MIN >= ARGON2_MIN_TIME); | ||||
|     return crypto_pwhash_argon2i_OPSLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_opslimit_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2i_OPSLIMIT_MAX <= ARGON2_MAX_TIME); | ||||
|     return crypto_pwhash_argon2i_OPSLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_memlimit_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT((crypto_pwhash_argon2i_MEMLIMIT_MIN / 1024U) >= ARGON2_MIN_MEMORY); | ||||
|     return crypto_pwhash_argon2i_MEMLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_memlimit_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT((crypto_pwhash_argon2i_MEMLIMIT_MAX / 1024U) <= ARGON2_MAX_MEMORY); | ||||
|     return crypto_pwhash_argon2i_MEMLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_opslimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_memlimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_opslimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_OPSLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_memlimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_MEMLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_opslimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2i_memlimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2i(unsigned char *const out, unsigned long long outlen, | ||||
|                       const char *const passwd, unsigned long long passwdlen, | ||||
|                       const unsigned char *const salt, | ||||
|                       unsigned long long opslimit, size_t memlimit, int alg) | ||||
| { | ||||
|     memset(out, 0, outlen); | ||||
|     if (outlen > crypto_pwhash_argon2i_BYTES_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (outlen < crypto_pwhash_argon2i_BYTES_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen > crypto_pwhash_argon2i_PASSWD_MAX || | ||||
|         opslimit > crypto_pwhash_argon2i_OPSLIMIT_MAX || | ||||
|         memlimit > crypto_pwhash_argon2i_MEMLIMIT_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen < crypto_pwhash_argon2i_PASSWD_MIN || | ||||
|         opslimit < crypto_pwhash_argon2i_OPSLIMIT_MIN || | ||||
|         memlimit < crypto_pwhash_argon2i_MEMLIMIT_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if ((const void *) out == (const void *) passwd) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     switch (alg) { | ||||
|     case crypto_pwhash_argon2i_ALG_ARGON2I13: | ||||
|         if (argon2i_hash_raw((uint32_t) opslimit, (uint32_t) (memlimit / 1024U), | ||||
|                              (uint32_t) 1U, passwd, (size_t) passwdlen, salt, | ||||
|                              (size_t) crypto_pwhash_argon2i_SALTBYTES, out, | ||||
|                              (size_t) outlen) != ARGON2_OK) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|         return 0; | ||||
|     default: | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], | ||||
|                           const char *const passwd, | ||||
|                           unsigned long long passwdlen, | ||||
|                           unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     unsigned char salt[crypto_pwhash_argon2i_SALTBYTES]; | ||||
|  | ||||
|     memset(out, 0, crypto_pwhash_argon2i_STRBYTES); | ||||
|     if (passwdlen > crypto_pwhash_argon2i_PASSWD_MAX || | ||||
|         opslimit > crypto_pwhash_argon2i_OPSLIMIT_MAX || | ||||
|         memlimit > crypto_pwhash_argon2i_MEMLIMIT_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen < crypto_pwhash_argon2i_PASSWD_MIN || | ||||
|         opslimit < crypto_pwhash_argon2i_OPSLIMIT_MIN || | ||||
|         memlimit < crypto_pwhash_argon2i_MEMLIMIT_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     randombytes_buf(salt, sizeof salt); | ||||
|     if (argon2i_hash_encoded((uint32_t) opslimit, (uint32_t) (memlimit / 1024U), | ||||
|                              (uint32_t) 1U, passwd, (size_t) passwdlen, salt, | ||||
|                              sizeof salt, STR_HASHBYTES, out, | ||||
|                              crypto_pwhash_argon2i_STRBYTES) != ARGON2_OK) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2i_str_verify(const char str[crypto_pwhash_argon2i_STRBYTES], | ||||
|                                  const char *const  passwd, | ||||
|                                  unsigned long long passwdlen) | ||||
| { | ||||
|     int verify_ret; | ||||
|  | ||||
|     if (passwdlen > crypto_pwhash_argon2i_PASSWD_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (passwdlen < crypto_pwhash_argon2i_PASSWD_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|     verify_ret = argon2i_verify(str, passwd, (size_t) passwdlen); | ||||
|     if (verify_ret == ARGON2_OK) { | ||||
|         return 0; | ||||
|     } | ||||
|     if (verify_ret == ARGON2_VERIFY_MISMATCH) { | ||||
|         errno = EINVAL; | ||||
|     } | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| static int | ||||
| _needs_rehash(const char *str, unsigned long long opslimit, size_t memlimit, | ||||
|               argon2_type type) | ||||
| { | ||||
|     unsigned char  *fodder; | ||||
|     argon2_context  ctx; | ||||
|     size_t          fodder_len; | ||||
|     int             ret = -1; | ||||
|  | ||||
|     fodder_len = strlen(str); | ||||
|     memlimit /= 1024U; | ||||
|     if (opslimit > UINT32_MAX || memlimit > UINT32_MAX || | ||||
|         fodder_len >= crypto_pwhash_STRBYTES) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     memset(&ctx, 0, sizeof ctx); | ||||
|     if ((fodder = (unsigned char *) calloc(fodder_len, 1U)) == NULL) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     ctx.out    = ctx.pwd       = ctx.salt    = fodder; | ||||
|     ctx.outlen = ctx.pwdlen    = ctx.saltlen = (uint32_t) fodder_len; | ||||
|     ctx.ad     = ctx.secret    = NULL; | ||||
|     ctx.adlen  = ctx.secretlen = 0U; | ||||
|     if (argon2_decode_string(&ctx, str, type) != 0) { | ||||
|         errno = EINVAL; | ||||
|         ret = -1; | ||||
|     } else if (ctx.t_cost != (uint32_t) opslimit || | ||||
|                ctx.m_cost != (uint32_t) memlimit) { | ||||
|         ret = 1; | ||||
|     } else { | ||||
|         ret = 0; | ||||
|     } | ||||
|     free(fodder); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2i_str_needs_rehash(const char str[crypto_pwhash_argon2i_STRBYTES], | ||||
|                                        unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     return _needs_rehash(str, opslimit, memlimit, Argon2_i); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2id_str_needs_rehash(const char str[crypto_pwhash_argon2id_STRBYTES], | ||||
|                                         unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     return _needs_rehash(str, opslimit, memlimit, Argon2_id); | ||||
| } | ||||
							
								
								
									
										238
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/pwhash_argon2id.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/argon2/pwhash_argon2id.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,238 @@ | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <limits.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "argon2-core.h" | ||||
| #include "argon2.h" | ||||
| #include "crypto_pwhash_argon2id.h" | ||||
| #include "private/common.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #define STR_HASHBYTES 32U | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2id_alg_argon2id13(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_ALG_ARGON2ID13; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_bytes_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_BYTES_MIN >= ARGON2_MIN_OUTLEN); | ||||
|     return crypto_pwhash_argon2id_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_bytes_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_BYTES_MAX <= ARGON2_MAX_OUTLEN); | ||||
|     return crypto_pwhash_argon2id_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_passwd_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_PASSWD_MIN >= ARGON2_MIN_PWD_LENGTH); | ||||
|     return crypto_pwhash_argon2id_PASSWD_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_passwd_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_PASSWD_MAX <= ARGON2_MAX_PWD_LENGTH); | ||||
|     return crypto_pwhash_argon2id_PASSWD_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_saltbytes(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_SALTBYTES >= ARGON2_MIN_SALT_LENGTH); | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_SALTBYTES <= ARGON2_MAX_SALT_LENGTH); | ||||
|     return crypto_pwhash_argon2id_SALTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_strbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_STRBYTES; | ||||
| } | ||||
|  | ||||
| const char* | ||||
| crypto_pwhash_argon2id_strprefix(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_STRPREFIX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_opslimit_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_OPSLIMIT_MIN >= ARGON2_MIN_TIME); | ||||
|     return crypto_pwhash_argon2id_OPSLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_opslimit_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT(crypto_pwhash_argon2id_OPSLIMIT_MAX <= ARGON2_MAX_TIME); | ||||
|     return crypto_pwhash_argon2id_OPSLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_memlimit_min(void) | ||||
| { | ||||
|     COMPILER_ASSERT((crypto_pwhash_argon2id_MEMLIMIT_MIN / 1024U) >= ARGON2_MIN_MEMORY); | ||||
|     return crypto_pwhash_argon2id_MEMLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_memlimit_max(void) | ||||
| { | ||||
|     COMPILER_ASSERT((crypto_pwhash_argon2id_MEMLIMIT_MAX / 1024U) <= ARGON2_MAX_MEMORY); | ||||
|     return crypto_pwhash_argon2id_MEMLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_opslimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_memlimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_opslimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_OPSLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_memlimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_MEMLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_opslimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_argon2id_memlimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2id(unsigned char *const out, unsigned long long outlen, | ||||
|                        const char *const passwd, unsigned long long passwdlen, | ||||
|                        const unsigned char *const salt, | ||||
|                        unsigned long long opslimit, size_t memlimit, int alg) | ||||
| { | ||||
|     memset(out, 0, outlen); | ||||
|     if (outlen > crypto_pwhash_argon2id_BYTES_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (outlen < crypto_pwhash_argon2id_BYTES_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen > crypto_pwhash_argon2id_PASSWD_MAX || | ||||
|         opslimit > crypto_pwhash_argon2id_OPSLIMIT_MAX || | ||||
|         memlimit > crypto_pwhash_argon2id_MEMLIMIT_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen < crypto_pwhash_argon2id_PASSWD_MIN || | ||||
|         opslimit < crypto_pwhash_argon2id_OPSLIMIT_MIN || | ||||
|         memlimit < crypto_pwhash_argon2id_MEMLIMIT_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if ((const void *) out == (const void *) passwd) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     switch (alg) { | ||||
|     case crypto_pwhash_argon2id_ALG_ARGON2ID13: | ||||
|         if (argon2id_hash_raw((uint32_t) opslimit, (uint32_t) (memlimit / 1024U), | ||||
|                               (uint32_t) 1U, passwd, (size_t) passwdlen, salt, | ||||
|                               (size_t) crypto_pwhash_argon2id_SALTBYTES, out, | ||||
|                               (size_t) outlen) != ARGON2_OK) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|         return 0; | ||||
|     default: | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], | ||||
|                            const char *const passwd, | ||||
|                            unsigned long long passwdlen, | ||||
|                            unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     unsigned char salt[crypto_pwhash_argon2id_SALTBYTES]; | ||||
|  | ||||
|     memset(out, 0, crypto_pwhash_argon2id_STRBYTES); | ||||
|     if (passwdlen > crypto_pwhash_argon2id_PASSWD_MAX || | ||||
|         opslimit > crypto_pwhash_argon2id_OPSLIMIT_MAX || | ||||
|         memlimit > crypto_pwhash_argon2id_MEMLIMIT_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (passwdlen < crypto_pwhash_argon2id_PASSWD_MIN || | ||||
|         opslimit < crypto_pwhash_argon2id_OPSLIMIT_MIN || | ||||
|         memlimit < crypto_pwhash_argon2id_MEMLIMIT_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     randombytes_buf(salt, sizeof salt); | ||||
|     if (argon2id_hash_encoded((uint32_t) opslimit, (uint32_t) (memlimit / 1024U), | ||||
|                               (uint32_t) 1U, passwd, (size_t) passwdlen, salt, | ||||
|                               sizeof salt, STR_HASHBYTES, out, | ||||
|                               crypto_pwhash_argon2id_STRBYTES) != ARGON2_OK) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_argon2id_str_verify(const char str[crypto_pwhash_argon2id_STRBYTES], | ||||
|                                   const char *const  passwd, | ||||
|                                   unsigned long long passwdlen) | ||||
| { | ||||
|     int verify_ret; | ||||
|  | ||||
|     if (passwdlen > crypto_pwhash_argon2id_PASSWD_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     /* LCOV_EXCL_START */ | ||||
|     if (passwdlen < crypto_pwhash_argon2id_PASSWD_MIN) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|     verify_ret = argon2id_verify(str, passwd, (size_t) passwdlen); | ||||
|     if (verify_ret == ARGON2_OK) { | ||||
|         return 0; | ||||
|     } | ||||
|     if (verify_ret == ARGON2_VERIFY_MISMATCH) { | ||||
|         errno = EINVAL; | ||||
|     } | ||||
|     return -1; | ||||
| } | ||||
							
								
								
									
										212
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/crypto_pwhash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/crypto_pwhash.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_pwhash.h" | ||||
|  | ||||
| int | ||||
| crypto_pwhash_alg_argon2i13(void) | ||||
| { | ||||
|     return crypto_pwhash_ALG_ARGON2I13; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_alg_argon2id13(void) | ||||
| { | ||||
|     return crypto_pwhash_ALG_ARGON2ID13; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_alg_default(void) | ||||
| { | ||||
|     return crypto_pwhash_ALG_DEFAULT; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_bytes_min(void) | ||||
| { | ||||
|     return crypto_pwhash_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_bytes_max(void) | ||||
| { | ||||
|     return crypto_pwhash_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_passwd_min(void) | ||||
| { | ||||
|     return crypto_pwhash_PASSWD_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_passwd_max(void) | ||||
| { | ||||
|     return crypto_pwhash_PASSWD_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_saltbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_SALTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_strbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_STRBYTES; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_pwhash_strprefix(void) | ||||
| { | ||||
|     return crypto_pwhash_STRPREFIX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_opslimit_min(void) | ||||
| { | ||||
|     return crypto_pwhash_OPSLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_opslimit_max(void) | ||||
| { | ||||
|     return crypto_pwhash_OPSLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_memlimit_min(void) | ||||
| { | ||||
|     return crypto_pwhash_MEMLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_memlimit_max(void) | ||||
| { | ||||
|     return crypto_pwhash_MEMLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_opslimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_OPSLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_memlimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_MEMLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_opslimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_OPSLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_memlimit_moderate(void) | ||||
| { | ||||
|     return crypto_pwhash_MEMLIMIT_MODERATE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_opslimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_OPSLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_memlimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_MEMLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash(unsigned char * const out, unsigned long long outlen, | ||||
|               const char * const passwd, unsigned long long passwdlen, | ||||
|               const unsigned char * const salt, | ||||
|               unsigned long long opslimit, size_t memlimit, int alg) | ||||
| { | ||||
|     switch (alg) { | ||||
|     case crypto_pwhash_ALG_ARGON2I13: | ||||
|         return crypto_pwhash_argon2i(out, outlen, passwd, passwdlen, salt, | ||||
|                                      opslimit, memlimit, alg); | ||||
|     case crypto_pwhash_ALG_ARGON2ID13: | ||||
|         return crypto_pwhash_argon2id(out, outlen, passwd, passwdlen, salt, | ||||
|                                       opslimit, memlimit, alg); | ||||
|     default: | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], | ||||
|                   const char * const passwd, unsigned long long passwdlen, | ||||
|                   unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     return crypto_pwhash_argon2id_str(out, passwd, passwdlen, | ||||
|                                       opslimit, memlimit); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], | ||||
|                       const char * const passwd, unsigned long long passwdlen, | ||||
|                       unsigned long long opslimit, size_t memlimit, int alg) | ||||
| { | ||||
|     switch (alg) { | ||||
|     case crypto_pwhash_ALG_ARGON2I13: | ||||
|         return crypto_pwhash_argon2i_str(out, passwd, passwdlen, | ||||
|                                          opslimit, memlimit); | ||||
|     case crypto_pwhash_ALG_ARGON2ID13: | ||||
|         return crypto_pwhash_argon2id_str(out, passwd, passwdlen, | ||||
|                                           opslimit, memlimit); | ||||
|     } | ||||
|     sodium_misuse(); | ||||
|     /* NOTREACHED */ | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_str_verify(const char str[crypto_pwhash_STRBYTES], | ||||
|                          const char * const passwd, | ||||
|                          unsigned long long passwdlen) | ||||
| { | ||||
|     if (strncmp(str, crypto_pwhash_argon2id_STRPREFIX, | ||||
|                 sizeof crypto_pwhash_argon2id_STRPREFIX - 1) == 0) { | ||||
|         return crypto_pwhash_argon2id_str_verify(str, passwd, passwdlen); | ||||
|     } | ||||
|     if (strncmp(str, crypto_pwhash_argon2i_STRPREFIX, | ||||
|                 sizeof crypto_pwhash_argon2i_STRPREFIX - 1) == 0) { | ||||
|         return crypto_pwhash_argon2i_str_verify(str, passwd, passwdlen); | ||||
|     } | ||||
|     errno = EINVAL; | ||||
|  | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_str_needs_rehash(const char str[crypto_pwhash_STRBYTES], | ||||
|                                unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     if (strncmp(str, crypto_pwhash_argon2id_STRPREFIX, | ||||
|                 sizeof crypto_pwhash_argon2id_STRPREFIX - 1) == 0) { | ||||
|         return crypto_pwhash_argon2id_str_needs_rehash(str, opslimit, memlimit); | ||||
|     } | ||||
|     if (strncmp(str, crypto_pwhash_argon2i_STRPREFIX, | ||||
|                 sizeof crypto_pwhash_argon2i_STRPREFIX - 1) == 0) { | ||||
|         return crypto_pwhash_argon2i_str_needs_rehash(str, opslimit, memlimit); | ||||
|     } | ||||
|     errno = EINVAL; | ||||
|  | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_pwhash_primitive(void) { | ||||
|     return crypto_pwhash_PRIMITIVE; | ||||
| } | ||||
							
								
								
									
										263
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,263 @@ | ||||
| /*- | ||||
|  * Copyright 2013 Alexander Peslyak | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * 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 <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_pwhash_scryptsalsa208sha256.h" | ||||
| #include "crypto_scrypt.h" | ||||
| #include "private/common.h" | ||||
| #include "runtime.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| static const char *const itoa64 = | ||||
|     "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||
|  | ||||
| static uint8_t * | ||||
| encode64_uint32(uint8_t *dst, size_t dstlen, uint32_t src, uint32_t srcbits) | ||||
| { | ||||
|     uint32_t bit; | ||||
|  | ||||
|     for (bit = 0; bit < srcbits; bit += 6) { | ||||
|         if (dstlen < 1) { | ||||
|             return NULL; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|         *dst++ = itoa64[src & 0x3f]; | ||||
|         dstlen--; | ||||
|         src >>= 6; | ||||
|     } | ||||
|     return dst; | ||||
| } | ||||
|  | ||||
| static uint8_t * | ||||
| encode64(uint8_t *dst, size_t dstlen, const uint8_t *src, size_t srclen) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < srclen;) { | ||||
|         uint8_t *dnext; | ||||
|         uint32_t value = 0, bits = 0; | ||||
|  | ||||
|         do { | ||||
|             value |= (uint32_t) src[i++] << bits; | ||||
|             bits += 8; | ||||
|         } while (bits < 24 && i < srclen); | ||||
|  | ||||
|         dnext = encode64_uint32(dst, dstlen, value, bits); | ||||
|         if (!dnext) { | ||||
|             return NULL; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|         dstlen -= dnext - dst; | ||||
|         dst = dnext; | ||||
|     } | ||||
|     return dst; | ||||
| } | ||||
|  | ||||
| static int | ||||
| decode64_one(uint32_t *dst, uint8_t src) | ||||
| { | ||||
|     const char *ptr = strchr(itoa64, src); | ||||
|  | ||||
|     if (ptr) { | ||||
|         *dst = (uint32_t)(ptr - itoa64); | ||||
|         return 0; | ||||
|     } | ||||
|     *dst = 0; | ||||
|  | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| static const uint8_t * | ||||
| decode64_uint32(uint32_t *dst, uint32_t dstbits, const uint8_t *src) | ||||
| { | ||||
|     uint32_t bit; | ||||
|     uint32_t value; | ||||
|  | ||||
|     value = 0; | ||||
|     for (bit = 0; bit < dstbits; bit += 6) { | ||||
|         uint32_t one; | ||||
|         if (decode64_one(&one, *src)) { | ||||
|             *dst = 0; | ||||
|             return NULL; | ||||
|         } | ||||
|         src++; | ||||
|         value |= one << bit; | ||||
|     } | ||||
|     *dst = value; | ||||
|  | ||||
|     return src; | ||||
| } | ||||
|  | ||||
| const uint8_t * | ||||
| escrypt_parse_setting(const uint8_t *setting, | ||||
|                       uint32_t *N_log2_p, uint32_t *r_p, uint32_t *p_p) | ||||
| { | ||||
|     const uint8_t *src; | ||||
|  | ||||
|     if (setting[0] != '$' || setting[1] != '7' || setting[2] != '$') { | ||||
|         return NULL; | ||||
|     } | ||||
|     src = setting + 3; | ||||
|  | ||||
|     if (decode64_one(N_log2_p, *src)) { | ||||
|         return NULL; | ||||
|     } | ||||
|     src++; | ||||
|  | ||||
|     src = decode64_uint32(r_p, 30, src); | ||||
|     if (!src) { | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     src = decode64_uint32(p_p, 30, src); | ||||
|     if (!src) { | ||||
|         return NULL; | ||||
|     } | ||||
|     return src; | ||||
| } | ||||
|  | ||||
| uint8_t * | ||||
| escrypt_r(escrypt_local_t *local, const uint8_t *passwd, size_t passwdlen, | ||||
|           const uint8_t *setting, uint8_t *buf, size_t buflen) | ||||
| { | ||||
|     uint8_t        hash[crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES]; | ||||
|     escrypt_kdf_t  escrypt_kdf; | ||||
|     const uint8_t *src; | ||||
|     const uint8_t *salt; | ||||
|     uint8_t       *dst; | ||||
|     size_t         prefixlen; | ||||
|     size_t         saltlen; | ||||
|     size_t         need; | ||||
|     uint64_t       N; | ||||
|     uint32_t       N_log2; | ||||
|     uint32_t       r; | ||||
|     uint32_t       p; | ||||
|  | ||||
|     src = escrypt_parse_setting(setting, &N_log2, &r, &p); | ||||
|     if (!src) { | ||||
|         return NULL; | ||||
|     } | ||||
|     N = (uint64_t) 1 << N_log2; | ||||
|     prefixlen = src - setting; | ||||
|  | ||||
|     salt = src; | ||||
|     src  = (const uint8_t *) strrchr((const char *) salt, '$'); | ||||
|     if (src) { | ||||
|         saltlen = src - salt; | ||||
|     } else { | ||||
|         saltlen = strlen((const char *) salt); | ||||
|     } | ||||
|     need = prefixlen + saltlen + 1 + | ||||
|            crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED + 1; | ||||
|     if (need > buflen || need < saltlen) { | ||||
|         return NULL; | ||||
|     } | ||||
| #ifdef HAVE_EMMINTRIN_H | ||||
|     escrypt_kdf = | ||||
|         sodium_runtime_has_sse2() ? escrypt_kdf_sse : escrypt_kdf_nosse; | ||||
| #else | ||||
|     escrypt_kdf = escrypt_kdf_nosse; | ||||
| #endif | ||||
|     if (escrypt_kdf(local, passwd, passwdlen, salt, saltlen, N, r, p, hash, | ||||
|                     sizeof(hash))) { | ||||
|         return NULL; | ||||
|     } | ||||
|     dst = buf; | ||||
|     memcpy(dst, setting, prefixlen + saltlen); | ||||
|     dst += prefixlen + saltlen; | ||||
|     *dst++ = '$'; | ||||
|  | ||||
|     dst = encode64(dst, buflen - (dst - buf), hash, sizeof(hash)); | ||||
|     sodium_memzero(hash, sizeof hash); | ||||
|     if (!dst || dst >= buf + buflen) { | ||||
|         return NULL; /* Can't happen LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     *dst = 0; /* NUL termination */ | ||||
|  | ||||
|     return buf; | ||||
| } | ||||
|  | ||||
| uint8_t * | ||||
| escrypt_gensalt_r(uint32_t N_log2, uint32_t r, uint32_t p, const uint8_t *src, | ||||
|                   size_t srclen, uint8_t *buf, size_t buflen) | ||||
| { | ||||
|     uint8_t *dst; | ||||
|     size_t   prefixlen = | ||||
|         (sizeof "$7$" - 1U) + (1U /* N_log2 */) + (5U /* r */) + (5U /* p */); | ||||
|     size_t saltlen = BYTES2CHARS(srclen); | ||||
|     size_t need; | ||||
|  | ||||
|     need = prefixlen + saltlen + 1; | ||||
|     if (need > buflen || need < saltlen || saltlen < srclen) { | ||||
|         return NULL; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (N_log2 > 63 || ((uint64_t) r * (uint64_t) p >= (1U << 30))) { | ||||
|         return NULL; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     dst    = buf; | ||||
|     *dst++ = '$'; | ||||
|     *dst++ = '7'; | ||||
|     *dst++ = '$'; | ||||
|  | ||||
|     *dst++ = itoa64[N_log2]; | ||||
|  | ||||
|     dst = encode64_uint32(dst, buflen - (dst - buf), r, 30); | ||||
|     if (!dst) { | ||||
|         return NULL; /* Can't happen LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     dst = encode64_uint32(dst, buflen - (dst - buf), p, 30); | ||||
|     if (!dst) { | ||||
|         return NULL; /* Can't happen LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     dst = encode64(dst, buflen - (dst - buf), src, srclen); | ||||
|     if (!dst || dst >= buf + buflen) { | ||||
|         return NULL; /* Can't happen LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     *dst = 0; /* NUL termination */ | ||||
|  | ||||
|     return buf; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_scryptsalsa208sha256_ll(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) | ||||
| { | ||||
|     escrypt_kdf_t   escrypt_kdf; | ||||
|     escrypt_local_t local; | ||||
|     int             retval; | ||||
|  | ||||
|     if (escrypt_init_local(&local)) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
| #if defined(HAVE_EMMINTRIN_H) | ||||
|     escrypt_kdf = | ||||
|         sodium_runtime_has_sse2() ? escrypt_kdf_sse : escrypt_kdf_nosse; | ||||
| #else | ||||
|     escrypt_kdf = escrypt_kdf_nosse; | ||||
| #endif | ||||
|     retval = escrypt_kdf(&local, passwd, passwdlen, salt, saltlen, N, r, p, buf, | ||||
|                          buflen); | ||||
|     if (escrypt_free_local(&local)) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     return retval; | ||||
| } | ||||
							
								
								
									
										98
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| /*- | ||||
|  * Copyright 2009 Colin Percival | ||||
|  * Copyright 2013 Alexander Peslyak | ||||
|  * 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 <limits.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #if SIZE_MAX > 0xffffffffULL | ||||
| #define ARCH_BITS 64 | ||||
| #else | ||||
| #define ARCH_BITS 32 | ||||
| #endif | ||||
|  | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRPREFIXBYTES 14 | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES 57 | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES 32 | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES_ENCODED 43 | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES 32 | ||||
| #define crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED 43 | ||||
|  | ||||
| #define BYTES2CHARS(bytes) ((((bytes) *8) + 5) / 6) | ||||
|  | ||||
| typedef struct { | ||||
|     void * base, *aligned; | ||||
|     size_t size; | ||||
| } escrypt_region_t; | ||||
|  | ||||
| typedef union { | ||||
|     uint64_t d[8]; | ||||
|     uint32_t w[16]; | ||||
| } escrypt_block_t; | ||||
|  | ||||
| typedef escrypt_region_t escrypt_local_t; | ||||
|  | ||||
| int escrypt_init_local(escrypt_local_t *__local); | ||||
|  | ||||
| int escrypt_free_local(escrypt_local_t *__local); | ||||
|  | ||||
| void *escrypt_alloc_region(escrypt_region_t *region, size_t size); | ||||
| int escrypt_free_region(escrypt_region_t *region); | ||||
|  | ||||
| typedef int (*escrypt_kdf_t)(escrypt_local_t *__local, 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); | ||||
|  | ||||
| int escrypt_kdf_nosse(escrypt_local_t *__local, 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); | ||||
|  | ||||
| int escrypt_kdf_sse(escrypt_local_t *__local, 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 *escrypt_r(escrypt_local_t *__local, const uint8_t *__passwd, | ||||
|                    size_t __passwdlen, const uint8_t *__setting, | ||||
|                    uint8_t *__buf, size_t __buflen); | ||||
|  | ||||
| uint8_t *escrypt_gensalt_r(uint32_t __N_log2, uint32_t __r, uint32_t __p, | ||||
|                            const uint8_t *__src, size_t __srclen, | ||||
|                            uint8_t *__buf, size_t __buflen); | ||||
|  | ||||
| const uint8_t *escrypt_parse_setting(const uint8_t *setting, | ||||
|                                      uint32_t *N_log2_p, uint32_t *r_p, | ||||
|                                      uint32_t *p_p); | ||||
|  | ||||
| #endif /* !_CRYPTO_SCRYPT_H_ */ | ||||
| @@ -0,0 +1,380 @@ | ||||
| /*- | ||||
|  * Copyright 2009 Colin Percival | ||||
|  * Copyright 2013 Alexander Peslyak | ||||
|  * 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 <errno.h> | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "../crypto_scrypt.h" | ||||
| #include "../pbkdf2-sha256.h" | ||||
| #include "private/common.h" | ||||
|  | ||||
| static inline void | ||||
| blkcpy_64(escrypt_block_t *dest, const escrypt_block_t *src) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
| #if (ARCH_BITS == 32) | ||||
|     for (i = 0; i < 16; ++i) { | ||||
|         dest->w[i] = src->w[i]; | ||||
|     } | ||||
| #else | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         dest->d[i] = src->d[i]; | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| blkxor_64(escrypt_block_t *dest, const escrypt_block_t *src) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
| #if (ARCH_BITS == 32) | ||||
|     for (i = 0; i < 16; ++i) { | ||||
|         dest->w[i] ^= src->w[i]; | ||||
|     } | ||||
| #else | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         dest->d[i] ^= src->d[i]; | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| blkcpy(escrypt_block_t *dest, const escrypt_block_t *src, size_t len) | ||||
| { | ||||
|     size_t i, L; | ||||
|  | ||||
| #if (ARCH_BITS == 32) | ||||
|     L = (len >> 2); | ||||
|     for (i = 0; i < L; ++i) { | ||||
|         dest->w[i] = src->w[i]; | ||||
|     } | ||||
| #else | ||||
|     L = (len >> 3); | ||||
|     for (i = 0; i < L; ++i) { | ||||
|         dest->d[i] = src->d[i]; | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| blkxor(escrypt_block_t *dest, const escrypt_block_t *src, size_t len) | ||||
| { | ||||
|     size_t i, L; | ||||
|  | ||||
| #if (ARCH_BITS == 32) | ||||
|     L = (len >> 2); | ||||
|     for (i = 0; i < L; ++i) { | ||||
|         dest->w[i] ^= src->w[i]; | ||||
|     } | ||||
| #else | ||||
|     L = (len >> 3); | ||||
|     for (i = 0; i < L; ++i) { | ||||
|         dest->d[i] ^= src->d[i]; | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * salsa20_8(B): | ||||
|  * Apply the salsa20/8 core to the provided block. | ||||
|  */ | ||||
| static void | ||||
| salsa20_8(uint32_t B[16]) | ||||
| { | ||||
|     escrypt_block_t  X; | ||||
|     uint32_t        *x = X.w; | ||||
|     size_t           i; | ||||
|  | ||||
|     blkcpy_64(&X, (escrypt_block_t *) B); | ||||
|     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(const uint32_t *Bin, uint32_t *Bout, uint32_t *X, size_t r) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     /* 1: X <-- B_{2r - 1} */ | ||||
|     blkcpy_64((escrypt_block_t *) X, | ||||
|               (const escrypt_block_t *) &Bin[(2 * r - 1) * 16]); | ||||
|  | ||||
|     /* 2: for i = 0 to 2r - 1 do */ | ||||
|     for (i = 0; i < 2 * r; i += 2) { | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         blkxor_64((escrypt_block_t *) X, | ||||
|                   (const escrypt_block_t *) &Bin[i * 16]); | ||||
|         salsa20_8(X); | ||||
|  | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         blkcpy_64((escrypt_block_t *) &Bout[i * 8], | ||||
|                   (const escrypt_block_t *) X); | ||||
|  | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         blkxor_64((escrypt_block_t *) X, | ||||
|                   (const escrypt_block_t *) &Bin[i * 16 + 16]); | ||||
|         salsa20_8(X); | ||||
|  | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         blkcpy_64((escrypt_block_t *) &Bout[i * 8 + r * 16], | ||||
|                   (escrypt_block_t *) X); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * integerify(B, r): | ||||
|  * Return the result of parsing B_{2r-1} as a little-endian integer. | ||||
|  */ | ||||
| static inline uint64_t | ||||
| integerify(const void *B, size_t r) | ||||
| { | ||||
|     const uint32_t *X = ((const uint32_t *) B) + (2 * r - 1) * 16; | ||||
|  | ||||
|     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] = LOAD32_LE(&B[4 * k]); | ||||
|     } | ||||
|     /* 2: for i = 0 to N - 1 do */ | ||||
|     for (i = 0; i < N; i += 2) { | ||||
|         /* 3: V_i <-- X */ | ||||
|         blkcpy((escrypt_block_t *) &V[i * (32 * r)], (escrypt_block_t *) X, | ||||
|                128 * r); | ||||
|  | ||||
|         /* 4: X <-- H(X) */ | ||||
|         blockmix_salsa8(X, Y, Z, r); | ||||
|  | ||||
|         /* 3: V_i <-- X */ | ||||
|         blkcpy((escrypt_block_t *) &V[(i + 1) * (32 * r)], | ||||
|                (escrypt_block_t *) 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((escrypt_block_t *) X, (escrypt_block_t *) &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((escrypt_block_t *) Y, (escrypt_block_t *) &V[j * (32 * r)], | ||||
|                128 * r); | ||||
|         blockmix_salsa8(Y, X, Z, r); | ||||
|     } | ||||
|     /* 10: B' <-- X */ | ||||
|     for (k = 0; k < 32 * r; k++) { | ||||
|         STORE32_LE(&B[4 * k], X[k]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * escrypt_kdf(local, 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 | ||||
| escrypt_kdf_nosse(escrypt_local_t *local, 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) | ||||
| { | ||||
|     size_t    B_size, V_size, XY_size, need; | ||||
|     uint8_t * B; | ||||
|     uint32_t *V, *XY; | ||||
|     size_t    r = _r, p = _p; | ||||
|     uint32_t  i; | ||||
|  | ||||
| /* Sanity-check parameters. */ | ||||
| #if SIZE_MAX > UINT32_MAX | ||||
|     if (buflen > (((uint64_t)(1) << 32) - 1) * 32) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
| #endif | ||||
|     if ((uint64_t)(r) * (uint64_t)(p) >= ((uint64_t) 1 << 30)) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (N > UINT32_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (((N & (N - 1)) != 0) || (N < 2)) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (r == 0 || p == 0) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if ((r > SIZE_MAX / 128 / p) || | ||||
| #if SIZE_MAX / 256 <= UINT32_MAX | ||||
|         (r > SIZE_MAX / 256) || | ||||
| #endif | ||||
|         (N > SIZE_MAX / 128 / r)) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     /* Allocate memory. */ | ||||
|     B_size = (size_t) 128 * r * p; | ||||
|     V_size = (size_t) 128 * r * (size_t) N; | ||||
|     need   = B_size + V_size; | ||||
|     if (need < V_size) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
|     XY_size = (size_t) 256 * r + 64; | ||||
|     need += XY_size; | ||||
|     if (need < XY_size) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
|     if (local->size < need) { | ||||
|         if (escrypt_free_region(local)) { | ||||
|             return -1; | ||||
|         } | ||||
|         if (!escrypt_alloc_region(local, need)) { | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
|     B  = (uint8_t *) local->aligned; | ||||
|     V  = (uint32_t *) ((uint8_t *) B + B_size); | ||||
|     XY = (uint32_t *) ((uint8_t *) V + V_size); | ||||
|  | ||||
|     /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ | ||||
|     escrypt_PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size); | ||||
|  | ||||
|     /* 2: for i = 0 to p - 1 do */ | ||||
|     for (i = 0; i < p; i++) { | ||||
|         /* 3: B_i <-- MF(B_i, N) */ | ||||
|         smix(&B[(size_t) 128 * i * r], r, N, V, XY); | ||||
|     } | ||||
|  | ||||
|     /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ | ||||
|     escrypt_PBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen); | ||||
|  | ||||
|     /* Success! */ | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										96
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| /*- | ||||
|  * 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 <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include "crypto_auth_hmacsha256.h" | ||||
| #include "crypto_pwhash_scryptsalsa208sha256.h" | ||||
| #include "pbkdf2-sha256.h" | ||||
| #include "private/common.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| /** | ||||
|  * escrypt_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 | ||||
| escrypt_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) | ||||
| { | ||||
|     crypto_auth_hmacsha256_state 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; | ||||
|  | ||||
| #if SIZE_MAX > 0x1fffffffe0ULL | ||||
|     COMPILER_ASSERT(crypto_pwhash_scryptsalsa208sha256_BYTES_MAX | ||||
|                     <= 0x1fffffffe0ULL); | ||||
|     if (dkLen > 0x1fffffffe0ULL) { | ||||
|         sodium_misuse(); /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
| #endif | ||||
|     crypto_auth_hmacsha256_init(&PShctx, passwd, passwdlen); | ||||
|     crypto_auth_hmacsha256_update(&PShctx, salt, saltlen); | ||||
|  | ||||
|     for (i = 0; i * 32 < dkLen; i++) { | ||||
|         STORE32_BE(ivec, (uint32_t)(i + 1)); | ||||
|         memcpy(&hctx, &PShctx, sizeof(crypto_auth_hmacsha256_state)); | ||||
|         crypto_auth_hmacsha256_update(&hctx, ivec, 4); | ||||
|         crypto_auth_hmacsha256_final(&hctx, U); | ||||
|  | ||||
|         memcpy(T, U, 32); | ||||
|         /* LCOV_EXCL_START */ | ||||
|         for (j = 2; j <= c; j++) { | ||||
|             crypto_auth_hmacsha256_init(&hctx, passwd, passwdlen); | ||||
|             crypto_auth_hmacsha256_update(&hctx, U, 32); | ||||
|             crypto_auth_hmacsha256_final(&hctx, U); | ||||
|  | ||||
|             for (k = 0; k < 32; k++) { | ||||
|                 T[k] ^= U[k]; | ||||
|             } | ||||
|         } | ||||
|         /* LCOV_EXCL_STOP */ | ||||
|  | ||||
|         clen = dkLen - i * 32; | ||||
|         if (clen > 32) { | ||||
|             clen = 32; | ||||
|         } | ||||
|         memcpy(&buf[i * 32], T, clen); | ||||
|     } | ||||
|     sodium_memzero((void *) &PShctx, sizeof PShctx); | ||||
| } | ||||
							
								
								
									
										45
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /*- | ||||
|  * 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef pbkdf2_sha256_H | ||||
| #define pbkdf2_sha256_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #include "crypto_auth_hmacsha256.h" | ||||
|  | ||||
| /** | ||||
|  * escrypt_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 escrypt_PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t, | ||||
|                            uint64_t, uint8_t *, size_t); | ||||
|  | ||||
| #endif /* !_SHA256_H_ */ | ||||
							
								
								
									
										300
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <limits.h> | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "crypto_pwhash_scryptsalsa208sha256.h" | ||||
| #include "crypto_scrypt.h" | ||||
| #include "private/common.h" | ||||
| #include "randombytes.h" | ||||
| #include "utils.h" | ||||
|  | ||||
| #define SETTING_SIZE(saltbytes)                                              \ | ||||
|     ((sizeof "$7$" - 1U) + (1U /* N_log2 */) + (5U /* r */) + (5U /* p */) + \ | ||||
|      BYTES2CHARS(saltbytes)) | ||||
|  | ||||
| static int | ||||
| pickparams(unsigned long long opslimit, const size_t memlimit, | ||||
|            uint32_t *const N_log2, uint32_t *const p, uint32_t *const r) | ||||
| { | ||||
|     unsigned long long maxN; | ||||
|     unsigned long long maxrp; | ||||
|  | ||||
|     if (opslimit < 32768) { | ||||
|         opslimit = 32768; | ||||
|     } | ||||
|     *r = 8; | ||||
|     if (opslimit < memlimit / 32) { | ||||
|         *p = 1; | ||||
|         maxN = opslimit / (*r * 4); | ||||
|         for (*N_log2 = 1; *N_log2 < 63; *N_log2 += 1) { | ||||
|             if ((uint64_t)(1) << *N_log2 > maxN / 2) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         maxN = memlimit / ((size_t) *r * 128); | ||||
|         for (*N_log2 = 1; *N_log2 < 63; *N_log2 += 1) { | ||||
|             if ((uint64_t)(1) << *N_log2 > maxN / 2) { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         maxrp = (opslimit / 4) / ((uint64_t)(1) << *N_log2); | ||||
|         /* LCOV_EXCL_START */ | ||||
|         if (maxrp > 0x3fffffff) { | ||||
|             maxrp = 0x3fffffff; | ||||
|         } | ||||
|         /* LCOV_EXCL_STOP */ | ||||
|         *p = (uint32_t)(maxrp) / *r; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static size_t | ||||
| sodium_strnlen(const char *str, size_t maxlen) | ||||
| { | ||||
|     size_t i = 0U; | ||||
|  | ||||
|     while (i < maxlen && str[i] != 0) { | ||||
|         i++; | ||||
|     } | ||||
|     return i; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_bytes_min(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_BYTES_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_bytes_max(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_BYTES_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_passwd_min(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_passwd_max(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_saltbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_SALTBYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_strbytes(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_STRBYTES; | ||||
| } | ||||
|  | ||||
| const char * | ||||
| crypto_pwhash_scryptsalsa208sha256_strprefix(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_STRPREFIX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_opslimit_min(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_opslimit_max(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_memlimit_min(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_memlimit_max(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void) | ||||
| { | ||||
|     return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_scryptsalsa208sha256(unsigned char *const       out, | ||||
|                                    unsigned long long         outlen, | ||||
|                                    const char *const          passwd, | ||||
|                                    unsigned long long         passwdlen, | ||||
|                                    const unsigned char *const salt, | ||||
|                                    unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     uint32_t N_log2; | ||||
|     uint32_t p; | ||||
|     uint32_t r; | ||||
|  | ||||
|     memset(out, 0, outlen); | ||||
|     if (passwdlen > crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX || | ||||
|         outlen > crypto_pwhash_scryptsalsa208sha256_BYTES_MAX) { | ||||
|         errno = EFBIG; /* LCOV_EXCL_LINE */ | ||||
|         return -1;     /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (outlen < crypto_pwhash_scryptsalsa208sha256_BYTES_MIN || | ||||
|         pickparams(opslimit, memlimit, &N_log2, &p, &r) != 0) { | ||||
|         errno = EINVAL; /* LCOV_EXCL_LINE */ | ||||
|         return -1;      /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if ((const void *) out == (const void *) passwd) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     return crypto_pwhash_scryptsalsa208sha256_ll( | ||||
|         (const uint8_t *) passwd, (size_t) passwdlen, (const uint8_t *) salt, | ||||
|         crypto_pwhash_scryptsalsa208sha256_SALTBYTES, (uint64_t)(1) << N_log2, | ||||
|         r, p, out, (size_t) outlen); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_scryptsalsa208sha256_str( | ||||
|     char              out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], | ||||
|     const char *const passwd, unsigned long long passwdlen, | ||||
|     unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     uint8_t salt[crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES]; | ||||
|     char    setting[crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES + 1U]; | ||||
|     escrypt_local_t escrypt_local; | ||||
|     uint32_t        N_log2; | ||||
|     uint32_t        p; | ||||
|     uint32_t        r; | ||||
|  | ||||
|     memset(out, 0, crypto_pwhash_scryptsalsa208sha256_STRBYTES); | ||||
|     if (passwdlen > crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX) { | ||||
|         errno = EFBIG; /* LCOV_EXCL_LINE */ | ||||
|         return -1;     /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (passwdlen < crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN || | ||||
|         pickparams(opslimit, memlimit, &N_log2, &p, &r) != 0) { | ||||
|         errno = EINVAL; /* LCOV_EXCL_LINE */ | ||||
|         return -1;      /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     randombytes_buf(salt, sizeof salt); | ||||
|     if (escrypt_gensalt_r(N_log2, r, p, salt, sizeof salt, (uint8_t *) setting, | ||||
|                           sizeof setting) == NULL) { | ||||
|         errno = EINVAL; /* LCOV_EXCL_LINE */ | ||||
|         return -1;      /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (escrypt_init_local(&escrypt_local) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     if (escrypt_r(&escrypt_local, (const uint8_t *) passwd, (size_t) passwdlen, | ||||
|                   (const uint8_t *) setting, (uint8_t *) out, | ||||
|                   crypto_pwhash_scryptsalsa208sha256_STRBYTES) == NULL) { | ||||
|         /* LCOV_EXCL_START */ | ||||
|         escrypt_free_local(&escrypt_local); | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|         /* LCOV_EXCL_STOP */ | ||||
|     } | ||||
|     escrypt_free_local(&escrypt_local); | ||||
|  | ||||
|     COMPILER_ASSERT( | ||||
|         SETTING_SIZE(crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES) == | ||||
|         crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES); | ||||
|     COMPILER_ASSERT( | ||||
|         crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES + 1U + | ||||
|             crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED + 1U == | ||||
|         crypto_pwhash_scryptsalsa208sha256_STRBYTES); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_scryptsalsa208sha256_str_verify( | ||||
|     const char        str[crypto_pwhash_scryptsalsa208sha256_STRBYTES], | ||||
|     const char *const passwd, unsigned long long passwdlen) | ||||
| { | ||||
|     char            wanted[crypto_pwhash_scryptsalsa208sha256_STRBYTES]; | ||||
|     escrypt_local_t escrypt_local; | ||||
|     int             ret = -1; | ||||
|  | ||||
|     if (sodium_strnlen(str, crypto_pwhash_scryptsalsa208sha256_STRBYTES) != | ||||
|         crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1U) { | ||||
|         return -1; | ||||
|     } | ||||
|     if (escrypt_init_local(&escrypt_local) != 0) { | ||||
|         return -1; /* LCOV_EXCL_LINE */ | ||||
|     } | ||||
|     memset(wanted, 0, sizeof wanted); | ||||
|     if (escrypt_r(&escrypt_local, (const uint8_t *) passwd, (size_t) passwdlen, | ||||
|                   (const uint8_t *) str, (uint8_t *) wanted, | ||||
|                   sizeof wanted) == NULL) { | ||||
|         escrypt_free_local(&escrypt_local); | ||||
|         return -1; | ||||
|     } | ||||
|     escrypt_free_local(&escrypt_local); | ||||
|     ret = sodium_memcmp(wanted, str, sizeof wanted); | ||||
|     sodium_memzero(wanted, sizeof wanted); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_pwhash_scryptsalsa208sha256_str_needs_rehash( | ||||
|     const char str[crypto_pwhash_scryptsalsa208sha256_STRBYTES], | ||||
|     unsigned long long opslimit, size_t memlimit) | ||||
| { | ||||
|     uint32_t N_log2, N_log2_; | ||||
|     uint32_t p, p_; | ||||
|     uint32_t r, r_; | ||||
|  | ||||
|     if (pickparams(opslimit, memlimit, &N_log2, &p, &r) != 0) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (sodium_strnlen(str, crypto_pwhash_scryptsalsa208sha256_STRBYTES) != | ||||
|         crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1U) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (escrypt_parse_setting((const uint8_t *) str, | ||||
|                               &N_log2_, &r_, &p_) == NULL) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (N_log2 != N_log2_ || r != r_ || p != p_) { | ||||
|         return 1; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										112
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								deps/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| /*- | ||||
|  * Copyright 2013 Alexander Peslyak | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_SYS_MMAN_H | ||||
| #include <sys/mman.h> | ||||
| #endif | ||||
| #include <errno.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "crypto_scrypt.h" | ||||
| #include "runtime.h" | ||||
|  | ||||
| #if !defined(MAP_ANON) && defined(MAP_ANONYMOUS) | ||||
| # define MAP_ANON MAP_ANONYMOUS | ||||
| #endif | ||||
| #ifndef MAP_NOCORE | ||||
| # ifdef MAP_CONCEAL | ||||
| #  define MAP_NOCORE MAP_CONCEAL | ||||
| # else | ||||
| #  define MAP_NOCORE 0 | ||||
| # endif | ||||
| #endif | ||||
| #ifndef MAP_POPULATE | ||||
| # define MAP_POPULATE 0 | ||||
| #endif | ||||
|  | ||||
| void * | ||||
| escrypt_alloc_region(escrypt_region_t *region, size_t size) | ||||
| { | ||||
|     uint8_t *base, *aligned; | ||||
| #if defined(MAP_ANON) && defined(HAVE_MMAP) | ||||
|     if ((base = (uint8_t *) mmap(NULL, size, PROT_READ | PROT_WRITE, | ||||
|                                  MAP_ANON | MAP_PRIVATE | MAP_NOCORE | MAP_POPULATE, | ||||
|                                  -1, 0)) == MAP_FAILED) { | ||||
|         base = NULL; /* LCOV_EXCL_LINE */ | ||||
|     }                /* LCOV_EXCL_LINE */ | ||||
|     aligned  = base; | ||||
| #elif defined(HAVE_POSIX_MEMALIGN) | ||||
|     if ((errno = posix_memalign((void **) &base, 64, size)) != 0) { | ||||
|         base = NULL; | ||||
|     } | ||||
|     aligned = base; | ||||
| #else | ||||
|     base = aligned = NULL; | ||||
|     if (size + 63 < size) { | ||||
|         errno = ENOMEM; | ||||
|     } else if ((base = (uint8_t *) malloc(size + 63)) != NULL) { | ||||
|         aligned = base + 63; | ||||
|         aligned -= (uintptr_t) aligned & 63; | ||||
|     } | ||||
| #endif | ||||
|     region->base    = base; | ||||
|     region->aligned = aligned; | ||||
|     region->size    = base ? size : 0; | ||||
|  | ||||
|     return aligned; | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| init_region(escrypt_region_t *region) | ||||
| { | ||||
|     region->base = region->aligned = NULL; | ||||
|     region->size                   = 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| escrypt_free_region(escrypt_region_t *region) | ||||
| { | ||||
|     if (region->base) { | ||||
| #if defined(MAP_ANON) && defined(HAVE_MMAP) | ||||
|         if (munmap(region->base, region->size)) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
| #else | ||||
|         free(region->base); | ||||
| #endif | ||||
|     } | ||||
|     init_region(region); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| escrypt_init_local(escrypt_local_t *local) | ||||
| { | ||||
|     init_region(local); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| escrypt_free_local(escrypt_local_t *local) | ||||
| { | ||||
|     return escrypt_free_region(local); | ||||
| } | ||||
| @@ -0,0 +1,398 @@ | ||||
| /*- | ||||
|  * Copyright 2009 Colin Percival | ||||
|  * Copyright 2012,2013 Alexander Peslyak | ||||
|  * 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 <errno.h> | ||||
| #include <limits.h> | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "private/common.h" | ||||
|  | ||||
| #ifdef HAVE_EMMINTRIN_H | ||||
|  | ||||
| # ifdef __GNUC__ | ||||
| #  pragma GCC target("sse2") | ||||
| # endif | ||||
| # include <emmintrin.h> | ||||
| # if defined(__XOP__) && defined(DISABLED) | ||||
| #  include <x86intrin.h> | ||||
| # endif | ||||
| # include "private/sse2_64_32.h" | ||||
|  | ||||
| # include "../crypto_scrypt.h" | ||||
| # include "../pbkdf2-sha256.h" | ||||
|  | ||||
| # define ARX(out, in1, in2, s)                                     \ | ||||
|     {                                                              \ | ||||
|         __m128i T = _mm_add_epi32(in1, in2);                       \ | ||||
|         out       = _mm_xor_si128(out, _mm_slli_epi32(T, s));      \ | ||||
|         out       = _mm_xor_si128(out, _mm_srli_epi32(T, 32 - s)); \ | ||||
|     } | ||||
|  | ||||
| # define SALSA20_2ROUNDS              \ | ||||
|     /* Operate on "columns". */       \ | ||||
|     ARX(X1, X0, X3, 7)                \ | ||||
|     ARX(X2, X1, X0, 9)                \ | ||||
|     ARX(X3, X2, X1, 13)               \ | ||||
|     ARX(X0, X3, X2, 18)               \ | ||||
|                                       \ | ||||
|     /* Rearrange data. */             \ | ||||
|     X1 = _mm_shuffle_epi32(X1, 0x93); \ | ||||
|     X2 = _mm_shuffle_epi32(X2, 0x4E); \ | ||||
|     X3 = _mm_shuffle_epi32(X3, 0x39); \ | ||||
|                                       \ | ||||
|     /* Operate on "rows". */          \ | ||||
|     ARX(X3, X0, X1, 7)                \ | ||||
|     ARX(X2, X3, X0, 9)                \ | ||||
|     ARX(X1, X2, X3, 13)               \ | ||||
|     ARX(X0, X1, X2, 18)               \ | ||||
|                                       \ | ||||
|     /* Rearrange data. */             \ | ||||
|     X1 = _mm_shuffle_epi32(X1, 0x39); \ | ||||
|     X2 = _mm_shuffle_epi32(X2, 0x4E); \ | ||||
|     X3 = _mm_shuffle_epi32(X3, 0x93); | ||||
|  | ||||
| /* | ||||
|  * Apply the salsa20/8 core to the block provided in (X0 ... X3) ^ (Z0 ... Z3). | ||||
|  */ | ||||
| # define SALSA20_8_XOR(in, out)                               \ | ||||
|     {                                                         \ | ||||
|         __m128i Y0 = X0 = _mm_xor_si128(X0, (in)[0]);         \ | ||||
|         __m128i Y1 = X1 = _mm_xor_si128(X1, (in)[1]);         \ | ||||
|         __m128i Y2 = X2 = _mm_xor_si128(X2, (in)[2]);         \ | ||||
|         __m128i Y3 = X3 = _mm_xor_si128(X3, (in)[3]);         \ | ||||
|         SALSA20_2ROUNDS                                       \ | ||||
|         SALSA20_2ROUNDS                                       \ | ||||
|         SALSA20_2ROUNDS                                       \ | ||||
|         SALSA20_2ROUNDS(out)[0] = X0 = _mm_add_epi32(X0, Y0); \ | ||||
|         (out)[1] = X1 = _mm_add_epi32(X1, Y1);                \ | ||||
|         (out)[2] = X2 = _mm_add_epi32(X2, Y2);                \ | ||||
|         (out)[3] = X3 = _mm_add_epi32(X3, Y3);                \ | ||||
|     } | ||||
|  | ||||
| /* | ||||
|  * blockmix_salsa8(Bin, Bout, 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. | ||||
|  */ | ||||
| static inline void | ||||
| blockmix_salsa8(const __m128i *Bin, __m128i *Bout, size_t r) | ||||
| { | ||||
|     __m128i X0, X1, X2, X3; | ||||
|     size_t  i; | ||||
|  | ||||
|     /* 1: X <-- B_{2r - 1} */ | ||||
|     X0 = Bin[8 * r - 4]; | ||||
|     X1 = Bin[8 * r - 3]; | ||||
|     X2 = Bin[8 * r - 2]; | ||||
|     X3 = Bin[8 * r - 1]; | ||||
|  | ||||
|     /* 3: X <-- H(X \xor B_i) */ | ||||
|     /* 4: Y_i <-- X */ | ||||
|     /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|     SALSA20_8_XOR(Bin, Bout) | ||||
|  | ||||
|     /* 2: for i = 0 to 2r - 1 do */ | ||||
|     r--; | ||||
|     for (i = 0; i < r;) { | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         SALSA20_8_XOR(&Bin[i * 8 + 4], &Bout[(r + i) * 4 + 4]) | ||||
|  | ||||
|         i++; | ||||
|  | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         SALSA20_8_XOR(&Bin[i * 8], &Bout[i * 4]) | ||||
|     } | ||||
|  | ||||
|     /* 3: X <-- H(X \xor B_i) */ | ||||
|     /* 4: Y_i <-- X */ | ||||
|     /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|     SALSA20_8_XOR(&Bin[i * 8 + 4], &Bout[(r + i) * 4 + 4]) | ||||
| } | ||||
|  | ||||
| # define XOR4(in)                    \ | ||||
|     X0 = _mm_xor_si128(X0, (in)[0]); \ | ||||
|     X1 = _mm_xor_si128(X1, (in)[1]); \ | ||||
|     X2 = _mm_xor_si128(X2, (in)[2]); \ | ||||
|     X3 = _mm_xor_si128(X3, (in)[3]); | ||||
|  | ||||
| # define XOR4_2(in1, in2)                   \ | ||||
|     X0 = _mm_xor_si128((in1)[0], (in2)[0]); \ | ||||
|     X1 = _mm_xor_si128((in1)[1], (in2)[1]); \ | ||||
|     X2 = _mm_xor_si128((in1)[2], (in2)[2]); \ | ||||
|     X3 = _mm_xor_si128((in1)[3], (in2)[3]); | ||||
|  | ||||
| static inline uint32_t | ||||
| blockmix_salsa8_xor(const __m128i *Bin1, const __m128i *Bin2, __m128i *Bout, | ||||
|                     size_t r) | ||||
| { | ||||
|     __m128i X0, X1, X2, X3; | ||||
|     size_t  i; | ||||
|  | ||||
|     /* 1: X <-- B_{2r - 1} */ | ||||
|     XOR4_2(&Bin1[8 * r - 4], &Bin2[8 * r - 4]) | ||||
|  | ||||
|     /* 3: X <-- H(X \xor B_i) */ | ||||
|     /* 4: Y_i <-- X */ | ||||
|     /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|     XOR4(Bin1) | ||||
|     SALSA20_8_XOR(Bin2, Bout) | ||||
|  | ||||
|     /* 2: for i = 0 to 2r - 1 do */ | ||||
|     r--; | ||||
|     for (i = 0; i < r;) { | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         XOR4(&Bin1[i * 8 + 4]) | ||||
|         SALSA20_8_XOR(&Bin2[i * 8 + 4], &Bout[(r + i) * 4 + 4]) | ||||
|  | ||||
|         i++; | ||||
|  | ||||
|         /* 3: X <-- H(X \xor B_i) */ | ||||
|         /* 4: Y_i <-- X */ | ||||
|         /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|         XOR4(&Bin1[i * 8]) | ||||
|         SALSA20_8_XOR(&Bin2[i * 8], &Bout[i * 4]) | ||||
|     } | ||||
|  | ||||
|     /* 3: X <-- H(X \xor B_i) */ | ||||
|     /* 4: Y_i <-- X */ | ||||
|     /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ | ||||
|     XOR4(&Bin1[i * 8 + 4]) | ||||
|     SALSA20_8_XOR(&Bin2[i * 8 + 4], &Bout[(r + i) * 4 + 4]) | ||||
|  | ||||
|     return _mm_cvtsi128_si32(X0); | ||||
| } | ||||
|  | ||||
| # undef ARX | ||||
| # undef SALSA20_2ROUNDS | ||||
| # undef SALSA20_8_XOR | ||||
| # undef XOR4 | ||||
| # undef XOR4_2 | ||||
|  | ||||
| /* | ||||
|  * integerify(B, r): | ||||
|  * Return the result of parsing B_{2r-1} as a little-endian integer. | ||||
|  * Note that B's layout is permuted compared to the generic implementation. | ||||
|  */ | ||||
| static inline uint64_t | ||||
| integerify(const void *B, size_t r) | ||||
| { | ||||
|     const uint64_t *X = ((const uint64_t *) B) + (2 * r - 1) * 8; | ||||
|  | ||||
|     return *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 + 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) | ||||
| { | ||||
|     size_t    s   = 128 * r; | ||||
|     __m128i  *X   = (__m128i *) V, *Y; | ||||
|     uint32_t *X32 = (uint32_t *) V; | ||||
|     uint64_t  i, j; | ||||
|     size_t    k; | ||||
|  | ||||
|     /* 1: X <-- B */ | ||||
|     /* 3: V_i <-- X */ | ||||
|     for (k = 0; k < 2 * r; k++) { | ||||
|         for (i = 0; i < 16; i++) { | ||||
|             X32[k * 16 + i] = LOAD32_LE(&B[(k * 16 + (i * 5 % 16)) * 4]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* 2: for i = 0 to N - 1 do */ | ||||
|     for (i = 1; i < N - 1; i += 2) { | ||||
|         /* 4: X <-- H(X) */ | ||||
|         /* 3: V_i <-- X */ | ||||
|         Y = (__m128i *) ((uintptr_t)(V) + i * s); | ||||
|         blockmix_salsa8(X, Y, r); | ||||
|  | ||||
|         /* 4: X <-- H(X) */ | ||||
|         /* 3: V_i <-- X */ | ||||
|         X = (__m128i *) ((uintptr_t)(V) + (i + 1) * s); | ||||
|         blockmix_salsa8(Y, X, r); | ||||
|     } | ||||
|  | ||||
|     /* 4: X <-- H(X) */ | ||||
|     /* 3: V_i <-- X */ | ||||
|     Y = (__m128i *) ((uintptr_t)(V) + i * s); | ||||
|     blockmix_salsa8(X, Y, r); | ||||
|  | ||||
|     /* 4: X <-- H(X) */ | ||||
|     /* 3: V_i <-- X */ | ||||
|     X = (__m128i *) XY; | ||||
|     blockmix_salsa8(Y, X, r); | ||||
|  | ||||
|     X32 = (uint32_t *) XY; | ||||
|     Y   = (__m128i *) ((uintptr_t)(XY) + s); | ||||
|  | ||||
|     /* 7: j <-- Integerify(X) mod N */ | ||||
|     j = integerify(X, r) & (N - 1); | ||||
|  | ||||
|     /* 6: for i = 0 to N - 1 do */ | ||||
|     for (i = 0; i < N; i += 2) { | ||||
|         __m128i *V_j = (__m128i *) ((uintptr_t)(V) + j * s); | ||||
|  | ||||
|         /* 8: X <-- H(X \xor V_j) */ | ||||
|         /* 7: j <-- Integerify(X) mod N */ | ||||
|         j   = blockmix_salsa8_xor(X, V_j, Y, r) & (N - 1); | ||||
|         V_j = (__m128i *) ((uintptr_t)(V) + j * s); | ||||
|  | ||||
|         /* 8: X <-- H(X \xor V_j) */ | ||||
|         /* 7: j <-- Integerify(X) mod N */ | ||||
|         j = blockmix_salsa8_xor(Y, V_j, X, r) & (N - 1); | ||||
|     } | ||||
|  | ||||
|     /* 10: B' <-- X */ | ||||
|     for (k = 0; k < 2 * r; k++) { | ||||
|         for (i = 0; i < 16; i++) { | ||||
|             STORE32_LE(&B[(k * 16 + (i * 5 % 16)) * 4], X32[k * 16 + i]); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * escrypt_kdf(local, 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 | ||||
| escrypt_kdf_sse(escrypt_local_t *local, 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) | ||||
| { | ||||
|     size_t    B_size, V_size, XY_size, need; | ||||
|     uint8_t * B; | ||||
|     uint32_t *V, *XY; | ||||
|     size_t    r = _r, p = _p; | ||||
|     uint32_t  i; | ||||
|  | ||||
| /* Sanity-check parameters. */ | ||||
| # if SIZE_MAX > UINT32_MAX | ||||
| /* LCOV_EXCL_START */ | ||||
|     if (buflen > (((uint64_t)(1) << 32) - 1) * 32) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
| /* LCOV_EXCL_END */ | ||||
| # endif | ||||
|     if ((uint64_t)(r) * (uint64_t)(p) >= ((uint64_t) 1 << 30)) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (N > UINT32_MAX) { | ||||
|         errno = EFBIG; | ||||
|         return -1; | ||||
|     } | ||||
|     if (((N & (N - 1)) != 0) || (N < 2)) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
|     if (r == 0 || p == 0) { | ||||
|         errno = EINVAL; | ||||
|         return -1; | ||||
|     } | ||||
| /* LCOV_EXCL_START */ | ||||
|     if ((r > SIZE_MAX / 128 / p) || | ||||
| # if SIZE_MAX / 256 <= UINT32_MAX | ||||
|         (r > SIZE_MAX / 256) || | ||||
| # endif | ||||
|         (N > SIZE_MAX / 128 / r)) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
| /* LCOV_EXCL_END */ | ||||
|  | ||||
|     /* Allocate memory. */ | ||||
|     B_size = (size_t) 128 * r * p; | ||||
|     V_size = (size_t) 128 * r * N; | ||||
|     need   = B_size + V_size; | ||||
| /* LCOV_EXCL_START */ | ||||
|     if (need < V_size) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
| /* LCOV_EXCL_END */ | ||||
|     XY_size = (size_t) 256 * r + 64; | ||||
|     need += XY_size; | ||||
| /* LCOV_EXCL_START */ | ||||
|     if (need < XY_size) { | ||||
|         errno = ENOMEM; | ||||
|         return -1; | ||||
|     } | ||||
| /* LCOV_EXCL_END */ | ||||
|     if (local->size < need) { | ||||
|         if (escrypt_free_region(local)) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|         if (!escrypt_alloc_region(local, need)) { | ||||
|             return -1; /* LCOV_EXCL_LINE */ | ||||
|         } | ||||
|     } | ||||
|     B  = (uint8_t *) local->aligned; | ||||
|     V  = (uint32_t *) ((uint8_t *) B + B_size); | ||||
|     XY = (uint32_t *) ((uint8_t *) V + V_size); | ||||
|  | ||||
|     /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ | ||||
|     escrypt_PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size); | ||||
|  | ||||
|     /* 2: for i = 0 to p - 1 do */ | ||||
|     for (i = 0; i < p; i++) { | ||||
|         /* 3: B_i <-- MF(B_i, N) */ | ||||
|         smix(&B[(size_t) 128 * i * r], r, N, V, XY); | ||||
|     } | ||||
|  | ||||
|     /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ | ||||
|     escrypt_PBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen); | ||||
|  | ||||
|     /* Success! */ | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										33
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/crypto_scalarmult.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/crypto_scalarmult.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
|  | ||||
| #include "crypto_scalarmult.h" | ||||
|  | ||||
| const char * | ||||
| crypto_scalarmult_primitive(void) | ||||
| { | ||||
|     return crypto_scalarmult_PRIMITIVE; | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_scalarmult_base(unsigned char *q, const unsigned char *n) | ||||
| { | ||||
|     return crypto_scalarmult_curve25519_base(q, n); | ||||
| } | ||||
|  | ||||
| int | ||||
| crypto_scalarmult(unsigned char *q, const unsigned char *n, | ||||
|                   const unsigned char *p) | ||||
| { | ||||
|     return crypto_scalarmult_curve25519(q, n, p); | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_scalarmult_bytes(void) | ||||
| { | ||||
|     return crypto_scalarmult_BYTES; | ||||
| } | ||||
|  | ||||
| size_t | ||||
| crypto_scalarmult_scalarbytes(void) | ||||
| { | ||||
|     return crypto_scalarmult_SCALARBYTES; | ||||
| } | ||||
							
								
								
									
										180
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "../scalarmult_curve25519.h" | ||||
| #include "export.h" | ||||
| #include "private/ed25519_ref10.h" | ||||
| #include "utils.h" | ||||
| #include "x25519_ref10.h" | ||||
|  | ||||
| /* | ||||
|  * Reject small order points early to mitigate the implications of | ||||
|  * unexpected optimizations that would affect the ref10 code. | ||||
|  * See https://eprint.iacr.org/2017/806.pdf for reference. | ||||
|  */ | ||||
| static int | ||||
| has_small_order(const unsigned char s[32]) | ||||
| { | ||||
|     CRYPTO_ALIGN(16) | ||||
|     static const unsigned char blacklist[][32] = { | ||||
|         /* 0 (order 4) */ | ||||
|         { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||||
|         /* 1 (order 1) */ | ||||
|         { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||||
|         /* 325606250916557431795983626356110631294008115727848805560023387167927233504 | ||||
|            (order 8) */ | ||||
|         { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3, | ||||
|           0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, | ||||
|           0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00 }, | ||||
|         /* 39382357235489614581723060781553021112529911719440698176882885853963445705823 | ||||
|            (order 8) */ | ||||
|         { 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24, 0xb1, 0xd0, 0xb1, | ||||
|           0x55, 0x9c, 0x83, 0xef, 0x5b, 0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, | ||||
|           0x8e, 0x86, 0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57 }, | ||||
|         /* p-1 (order 2) */ | ||||
|         { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, | ||||
|         /* p (=0, order 4) */ | ||||
|         { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, | ||||
|         /* p+1 (=1, order 1) */ | ||||
|         { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
|           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f } | ||||
|     }; | ||||
|     unsigned char c[7] = { 0 }; | ||||
|     unsigned int  k; | ||||
|     size_t        i, j; | ||||
|  | ||||
|     COMPILER_ASSERT(7 == sizeof blacklist / sizeof blacklist[0]); | ||||
|     for (j = 0; j < 31; j++) { | ||||
|         for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) { | ||||
|             c[i] |= s[j] ^ blacklist[i][j]; | ||||
|         } | ||||
|     } | ||||
|     for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) { | ||||
|         c[i] |= (s[j] & 0x7f) ^ blacklist[i][j]; | ||||
|     } | ||||
|     k = 0; | ||||
|     for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) { | ||||
|         k |= (c[i] - 1); | ||||
|     } | ||||
|     return (int) ((k >> 8) & 1); | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_scalarmult_curve25519_ref10(unsigned char *q, | ||||
|                                    const unsigned char *n, | ||||
|                                    const unsigned char *p) | ||||
| { | ||||
|     unsigned char *t = q; | ||||
|     unsigned int   i; | ||||
|     fe25519        x1; | ||||
|     fe25519        x2; | ||||
|     fe25519        z2; | ||||
|     fe25519        x3; | ||||
|     fe25519        z3; | ||||
|     fe25519        tmp0; | ||||
|     fe25519        tmp1; | ||||
|     int            pos; | ||||
|     unsigned int   swap; | ||||
|     unsigned int   b; | ||||
|  | ||||
|     if (has_small_order(p)) { | ||||
|         return -1; | ||||
|     } | ||||
|     for (i = 0; i < 32; i++) { | ||||
|         t[i] = n[i]; | ||||
|     } | ||||
|     t[0] &= 248; | ||||
|     t[31] &= 127; | ||||
|     t[31] |= 64; | ||||
|     fe25519_frombytes(x1, p); | ||||
|     fe25519_1(x2); | ||||
|     fe25519_0(z2); | ||||
|     fe25519_copy(x3, x1); | ||||
|     fe25519_1(z3); | ||||
|  | ||||
|     swap = 0; | ||||
|     for (pos = 254; pos >= 0; --pos) { | ||||
|         b = t[pos / 8] >> (pos & 7); | ||||
|         b &= 1; | ||||
|         swap ^= b; | ||||
|         fe25519_cswap(x2, x3, swap); | ||||
|         fe25519_cswap(z2, z3, swap); | ||||
|         swap = b; | ||||
|         fe25519_sub(tmp0, x3, z3); | ||||
|         fe25519_sub(tmp1, x2, z2); | ||||
|         fe25519_add(x2, x2, z2); | ||||
|         fe25519_add(z2, x3, z3); | ||||
|         fe25519_mul(z3, tmp0, x2); | ||||
|         fe25519_mul(z2, z2, tmp1); | ||||
|         fe25519_sq(tmp0, tmp1); | ||||
|         fe25519_sq(tmp1, x2); | ||||
|         fe25519_add(x3, z3, z2); | ||||
|         fe25519_sub(z2, z3, z2); | ||||
|         fe25519_mul(x2, tmp1, tmp0); | ||||
|         fe25519_sub(tmp1, tmp1, tmp0); | ||||
|         fe25519_sq(z2, z2); | ||||
|         fe25519_mul32(z3, tmp1, 121666); | ||||
|         fe25519_sq(x3, x3); | ||||
|         fe25519_add(tmp0, tmp0, z3); | ||||
|         fe25519_mul(z3, x1, z2); | ||||
|         fe25519_mul(z2, tmp1, tmp0); | ||||
|     } | ||||
|     fe25519_cswap(x2, x3, swap); | ||||
|     fe25519_cswap(z2, z3, swap); | ||||
|  | ||||
|     fe25519_invert(z2, z2); | ||||
|     fe25519_mul(x2, x2, z2); | ||||
|     fe25519_tobytes(q, x2); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static void | ||||
| edwards_to_montgomery(fe25519 montgomeryX, const fe25519 edwardsY, const fe25519 edwardsZ) | ||||
| { | ||||
|     fe25519 tempX; | ||||
|     fe25519 tempZ; | ||||
|  | ||||
|     fe25519_add(tempX, edwardsZ, edwardsY); | ||||
|     fe25519_sub(tempZ, edwardsZ, edwardsY); | ||||
|     fe25519_invert(tempZ, tempZ); | ||||
|     fe25519_mul(montgomeryX, tempX, tempZ); | ||||
| } | ||||
|  | ||||
| static int | ||||
| crypto_scalarmult_curve25519_ref10_base(unsigned char *q, | ||||
|                                         const unsigned char *n) | ||||
| { | ||||
|     unsigned char *t = q; | ||||
|     ge25519_p3     A; | ||||
|     fe25519        pk; | ||||
|     unsigned int   i; | ||||
|  | ||||
|     for (i = 0; i < 32; i++) { | ||||
|         t[i] = n[i]; | ||||
|     } | ||||
|     t[0] &= 248; | ||||
|     t[31] &= 127; | ||||
|     t[31] |= 64; | ||||
|     ge25519_scalarmult_base(&A, t); | ||||
|     edwards_to_montgomery(pk, A.Y, A.Z); | ||||
|     fe25519_tobytes(q, pk); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| struct crypto_scalarmult_curve25519_implementation | ||||
|     crypto_scalarmult_curve25519_ref10_implementation = { | ||||
|         SODIUM_C99(.mult =) crypto_scalarmult_curve25519_ref10, | ||||
|         SODIUM_C99(.mult_base =) crypto_scalarmult_curve25519_ref10_base | ||||
|     }; | ||||
							
								
								
									
										10
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #ifndef x25519_ref10_H | ||||
| #define x25519_ref10_H | ||||
|  | ||||
| #include "crypto_scalarmult_curve25519.h" | ||||
| #include "../scalarmult_curve25519.h" | ||||
|  | ||||
| extern struct crypto_scalarmult_curve25519_implementation | ||||
|     crypto_scalarmult_curve25519_ref10_implementation; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										25
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts.S
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts.S
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #ifdef IN_SANDY2X | ||||
|  | ||||
| /* | ||||
|    REDMASK51 is from amd64-51/consts.s. | ||||
| */ | ||||
|  | ||||
| #include "consts_namespace.h" | ||||
| .data | ||||
| .p2align 4 | ||||
| v0_0: .quad 0, 0 | ||||
| v1_0: .quad 1, 0 | ||||
| v2_1: .quad 2, 1 | ||||
| v9_0: .quad 9, 0 | ||||
| v9_9: .quad 9, 9 | ||||
| v19_19: .quad 19, 19 | ||||
| v38_1: .quad 38, 1 | ||||
| v38_38: .quad 38, 38 | ||||
| v121666_121666: .quad 121666, 121666 | ||||
| m25: .quad 33554431, 33554431 | ||||
| m26: .quad 67108863, 67108863 | ||||
| subc0: .quad 0x07FFFFDA, 0x03FFFFFE | ||||
| subc2: .quad 0x07FFFFFE, 0x03FFFFFE | ||||
| REDMASK51:   .quad 0x0007FFFFFFFFFFFF | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										20
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts_namespace.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts_namespace.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #ifndef consts_namespace_H | ||||
| #define consts_namespace_H | ||||
|  | ||||
| #define v0_0 crypto_scalarmult_curve25519_sandy2x_v0_0 | ||||
| #define v1_0 crypto_scalarmult_curve25519_sandy2x_v1_0 | ||||
| #define v2_1 crypto_scalarmult_curve25519_sandy2x_v2_1 | ||||
| #define v9_0 crypto_scalarmult_curve25519_sandy2x_v9_0 | ||||
| #define v9_9 crypto_scalarmult_curve25519_sandy2x_v9_9 | ||||
| #define v19_19 crypto_scalarmult_curve25519_sandy2x_v19_19 | ||||
| #define v38_1 crypto_scalarmult_curve25519_sandy2x_v38_1 | ||||
| #define v38_38 crypto_scalarmult_curve25519_sandy2x_v38_38 | ||||
| #define v121666_121666 crypto_scalarmult_curve25519_sandy2x_v121666_121666 | ||||
| #define m25 crypto_scalarmult_curve25519_sandy2x_m25 | ||||
| #define m26 crypto_scalarmult_curve25519_sandy2x_m26 | ||||
| #define subc0 crypto_scalarmult_curve25519_sandy2x_subc0 | ||||
| #define subc2 crypto_scalarmult_curve25519_sandy2x_subc2 | ||||
| #define REDMASK51 crypto_scalarmult_curve25519_sandy2x_REDMASK51 | ||||
|  | ||||
| #endif /* ifndef consts_namespace_H */ | ||||
|  | ||||
							
								
								
									
										69
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|    This file is adapted from ref10/scalarmult.c: | ||||
|    The code for Mongomery ladder is replace by the ladder assembly function; | ||||
|    Inversion is done in the same way as amd64-51/. | ||||
|    (fe is first converted into fe51 after Mongomery ladder) | ||||
| */ | ||||
|  | ||||
| #include <stddef.h> | ||||
|  | ||||
| #ifdef HAVE_AVX_ASM | ||||
|  | ||||
| #include "utils.h" | ||||
| #include "curve25519_sandy2x.h" | ||||
| #include "../scalarmult_curve25519.h" | ||||
| #include "fe.h" | ||||
| #include "fe51.h" | ||||
| #include "ladder.h" | ||||
|  | ||||
| #define x1 var[0] | ||||
| #define x2 var[1] | ||||
| #define z2 var[2] | ||||
|  | ||||
| static int | ||||
| crypto_scalarmult_curve25519_sandy2x(unsigned char *q, const unsigned char *n, | ||||
|                                      const unsigned char *p) | ||||
| { | ||||
|   unsigned char *t = q; | ||||
|   fe             var[3]; | ||||
|   fe51           x_51; | ||||
|   fe51           z_51; | ||||
|   unsigned int   i; | ||||
|  | ||||
|   for (i = 0; i < 32; i++) { | ||||
|       t[i] = n[i]; | ||||
|   } | ||||
|   t[0] &= 248; | ||||
|   t[31] &= 127; | ||||
|   t[31] |= 64; | ||||
|  | ||||
|   fe_frombytes(x1, p); | ||||
|  | ||||
|   ladder(var, t); | ||||
|  | ||||
|   z_51.v[0] = (z2[1] << 26) + z2[0]; | ||||
|   z_51.v[1] = (z2[3] << 26) + z2[2]; | ||||
|   z_51.v[2] = (z2[5] << 26) + z2[4]; | ||||
|   z_51.v[3] = (z2[7] << 26) + z2[6]; | ||||
|   z_51.v[4] = (z2[9] << 26) + z2[8]; | ||||
|  | ||||
|   x_51.v[0] = (x2[1] << 26) + x2[0]; | ||||
|   x_51.v[1] = (x2[3] << 26) + x2[2]; | ||||
|   x_51.v[2] = (x2[5] << 26) + x2[4]; | ||||
|   x_51.v[3] = (x2[7] << 26) + x2[6]; | ||||
|   x_51.v[4] = (x2[9] << 26) + x2[8]; | ||||
|  | ||||
|   fe51_invert(&z_51, &z_51); | ||||
|   fe51_mul(&x_51, &x_51, &z_51); | ||||
|   fe51_pack(q, &x_51); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| struct crypto_scalarmult_curve25519_implementation | ||||
| crypto_scalarmult_curve25519_sandy2x_implementation = { | ||||
|     SODIUM_C99(.mult = ) crypto_scalarmult_curve25519_sandy2x, | ||||
|     SODIUM_C99(.mult_base = ) NULL | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										9
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| #ifndef curve25519_sandy2x_H | ||||
| #define curve25519_sandy2x_H | ||||
|  | ||||
| #include "crypto_scalarmult_curve25519.h" | ||||
|  | ||||
| extern struct crypto_scalarmult_curve25519_implementation | ||||
|     crypto_scalarmult_curve25519_sandy2x_implementation; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										26
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /* | ||||
|    This file is adapted from ref10/fe.h: | ||||
|    All the redundant functions are removed. | ||||
| */ | ||||
|  | ||||
| #ifndef fe_H | ||||
| #define fe_H | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| typedef uint64_t fe[10]; | ||||
|  | ||||
| /* | ||||
| fe means field element. | ||||
| Here the field is \Z/(2^255-19). | ||||
| An element t, entries t[0]...t[9], represents the integer | ||||
| t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. | ||||
| Bounds on each t[i] vary depending on context. | ||||
| */ | ||||
|  | ||||
| #define fe_frombytes crypto_scalarmult_curve25519_sandy2x_fe_frombytes | ||||
|  | ||||
| extern void fe_frombytes(fe, const unsigned char *); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										35
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								deps/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| /* | ||||
|    This file is adapted from amd64-51/fe25519.h: | ||||
|    'fe25519' is renamed as 'fe51'; | ||||
|    All the redundant functions are removed; | ||||
|    New function fe51_nsquare is introduced. | ||||
| */ | ||||
|  | ||||
| #ifndef fe51_H | ||||
| #define fe51_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "fe51_namespace.h" | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     uint64_t v[5]; | ||||
| } | ||||
| fe51; | ||||
|  | ||||
| extern void fe51_pack(unsigned char *, const fe51 *); | ||||
| extern void fe51_mul(fe51 *, const fe51 *, const fe51 *); | ||||
| extern void fe51_nsquare(fe51 *, const fe51 *, int); | ||||
| extern void fe51_invert(fe51 *, const fe51 *); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user