From f0f23b419939f0914a25fcc178cb9852ec351d4f Mon Sep 17 00:00:00 2001 From: Max Lv Date: Wed, 23 Sep 2015 21:25:48 +0800 Subject: [PATCH] replace poly1305 with hmac-sha1 --- src/Makefile.am | 4 + src/Makefile.in | 97 +++++++++++-- src/encrypt.c | 39 +++-- src/encrypt.h | 8 +- src/hmac-sha1.c | 375 ++++++++++++++++++++++++++++++++++++++++++++++++ src/hmac-sha1.h | 157 ++++++++++++++++++++ 6 files changed, 644 insertions(+), 36 deletions(-) create mode 100644 src/hmac-sha1.c create mode 100644 src/hmac-sha1.h diff --git a/src/Makefile.am b/src/Makefile.am index 49489926..968f9516 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,6 +27,7 @@ ss_local_SOURCES = utils.c \ cache.c \ acl.c \ netutils.c \ + hmac-sha1.c \ local.c ss_tunnel_SOURCES = utils.c \ @@ -36,6 +37,7 @@ ss_tunnel_SOURCES = utils.c \ udprelay.c \ cache.c \ netutils.c \ + hmac-sha1.c \ tunnel.c ss_server_SOURCES = utils.c \ @@ -47,6 +49,7 @@ ss_server_SOURCES = utils.c \ cache.c \ acl.c \ resolv.c \ + hmac-sha1.c \ server.c ss_manager_SOURCES = utils.c \ @@ -80,6 +83,7 @@ ss_redir_SOURCES = utils.c \ netutils.c \ cache.c \ udprelay.c \ + hmac-sha1.c \ redir.c ss_redir_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REDIR -DUDPRELAY_LOCAL ss_redir_LDADD = $(SS_COMMON_LIBS) diff --git a/src/Makefile.in b/src/Makefile.in index 8344e0b4..a39892da 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -117,13 +117,15 @@ am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) \ $(top_builddir)/libudns/libudns.la libshadowsocks_la_DEPENDENCIES = $(am__DEPENDENCIES_3) am__libshadowsocks_la_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \ - udprelay.c cache.c acl.c netutils.c local.c win32.c + udprelay.c cache.c acl.c netutils.c hmac-sha1.c local.c \ + win32.c @BUILD_WINCOMPAT_TRUE@am__objects_1 = libshadowsocks_la-win32.lo am__objects_2 = libshadowsocks_la-utils.lo libshadowsocks_la-jconf.lo \ libshadowsocks_la-json.lo libshadowsocks_la-encrypt.lo \ libshadowsocks_la-udprelay.lo libshadowsocks_la-cache.lo \ libshadowsocks_la-acl.lo libshadowsocks_la-netutils.lo \ - libshadowsocks_la-local.lo $(am__objects_1) + libshadowsocks_la-hmac-sha1.lo libshadowsocks_la-local.lo \ + $(am__objects_1) am_libshadowsocks_la_OBJECTS = $(am__objects_2) libshadowsocks_la_OBJECTS = $(am_libshadowsocks_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) @@ -138,14 +140,15 @@ libshadowsocks_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ @BUILD_REDIRECTOR_TRUE@am__EXEEXT_2 = ss-redir$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am__ss_local_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \ - udprelay.c cache.c acl.c netutils.c local.c win32.c + udprelay.c cache.c acl.c netutils.c hmac-sha1.c local.c \ + win32.c @BUILD_WINCOMPAT_TRUE@am__objects_3 = ss_local-win32.$(OBJEXT) am_ss_local_OBJECTS = ss_local-utils.$(OBJEXT) \ ss_local-jconf.$(OBJEXT) ss_local-json.$(OBJEXT) \ ss_local-encrypt.$(OBJEXT) ss_local-udprelay.$(OBJEXT) \ ss_local-cache.$(OBJEXT) ss_local-acl.$(OBJEXT) \ - ss_local-netutils.$(OBJEXT) ss_local-local.$(OBJEXT) \ - $(am__objects_3) + ss_local-netutils.$(OBJEXT) ss_local-hmac-sha1.$(OBJEXT) \ + ss_local-local.$(OBJEXT) $(am__objects_3) ss_local_OBJECTS = $(am_ss_local_OBJECTS) ss_local_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/libudns/libudns.la @@ -157,7 +160,7 @@ am_ss_manager_OBJECTS = utils.$(OBJEXT) jconf.$(OBJEXT) json.$(OBJEXT) \ ss_manager_OBJECTS = $(am_ss_manager_OBJECTS) ss_manager_DEPENDENCIES = $(am__DEPENDENCIES_2) am__ss_redir_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \ - netutils.c cache.c udprelay.c redir.c + netutils.c cache.c udprelay.c hmac-sha1.c redir.c @BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = ss_redir-utils.$(OBJEXT) \ @BUILD_REDIRECTOR_TRUE@ ss_redir-jconf.$(OBJEXT) \ @BUILD_REDIRECTOR_TRUE@ ss_redir-json.$(OBJEXT) \ @@ -165,6 +168,7 @@ am__ss_redir_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \ @BUILD_REDIRECTOR_TRUE@ ss_redir-netutils.$(OBJEXT) \ @BUILD_REDIRECTOR_TRUE@ ss_redir-cache.$(OBJEXT) \ @BUILD_REDIRECTOR_TRUE@ ss_redir-udprelay.$(OBJEXT) \ +@BUILD_REDIRECTOR_TRUE@ ss_redir-hmac-sha1.$(OBJEXT) \ @BUILD_REDIRECTOR_TRUE@ ss_redir-redir.$(OBJEXT) ss_redir_OBJECTS = $(am_ss_redir_OBJECTS) @BUILD_REDIRECTOR_TRUE@ss_redir_DEPENDENCIES = $(am__DEPENDENCIES_2) \ @@ -177,7 +181,7 @@ am_ss_server_OBJECTS = ss_server-utils.$(OBJEXT) \ ss_server-json.$(OBJEXT) ss_server-encrypt.$(OBJEXT) \ ss_server-udprelay.$(OBJEXT) ss_server-cache.$(OBJEXT) \ ss_server-acl.$(OBJEXT) ss_server-resolv.$(OBJEXT) \ - ss_server-server.$(OBJEXT) + ss_server-hmac-sha1.$(OBJEXT) ss_server-server.$(OBJEXT) ss_server_OBJECTS = $(am_ss_server_OBJECTS) ss_server_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/libudns/libudns.la @@ -185,13 +189,14 @@ ss_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_server_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__ss_tunnel_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \ - udprelay.c cache.c netutils.c tunnel.c win32.c + udprelay.c cache.c netutils.c hmac-sha1.c tunnel.c win32.c @BUILD_WINCOMPAT_TRUE@am__objects_4 = ss_tunnel-win32.$(OBJEXT) am_ss_tunnel_OBJECTS = ss_tunnel-utils.$(OBJEXT) \ ss_tunnel-jconf.$(OBJEXT) ss_tunnel-json.$(OBJEXT) \ ss_tunnel-encrypt.$(OBJEXT) ss_tunnel-udprelay.$(OBJEXT) \ ss_tunnel-cache.$(OBJEXT) ss_tunnel-netutils.$(OBJEXT) \ - ss_tunnel-tunnel.$(OBJEXT) $(am__objects_4) + ss_tunnel-hmac-sha1.$(OBJEXT) ss_tunnel-tunnel.$(OBJEXT) \ + $(am__objects_4) ss_tunnel_OBJECTS = $(am_ss_tunnel_OBJECTS) ss_tunnel_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/libudns/libudns.la @@ -375,9 +380,9 @@ SS_COMMON_LIBS = $(top_builddir)/libev/libev.la \ $(INET_NTOP_LIB) ss_local_SOURCES = utils.c jconf.c json.c encrypt.c udprelay.c cache.c \ - acl.c netutils.c local.c $(am__append_2) + acl.c netutils.c hmac-sha1.c local.c $(am__append_2) ss_tunnel_SOURCES = utils.c jconf.c json.c encrypt.c udprelay.c \ - cache.c netutils.c tunnel.c $(am__append_3) + cache.c netutils.c hmac-sha1.c tunnel.c $(am__append_3) ss_server_SOURCES = utils.c \ netutils.c \ jconf.c \ @@ -387,6 +392,7 @@ ss_server_SOURCES = utils.c \ cache.c \ acl.c \ resolv.c \ + hmac-sha1.c \ server.c ss_manager_SOURCES = utils.c \ @@ -408,6 +414,7 @@ ss_server_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REMOTE @BUILD_REDIRECTOR_TRUE@ netutils.c \ @BUILD_REDIRECTOR_TRUE@ cache.c \ @BUILD_REDIRECTOR_TRUE@ udprelay.c \ +@BUILD_REDIRECTOR_TRUE@ hmac-sha1.c \ @BUILD_REDIRECTOR_TRUE@ redir.c @BUILD_REDIRECTOR_TRUE@ss_redir_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REDIR -DUDPRELAY_LOCAL @@ -560,6 +567,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-acl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-encrypt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-hmac-sha1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-jconf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-json.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-local.Plo@am__quote@ @@ -571,6 +579,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-acl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-hmac-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-jconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-local.Po@am__quote@ @@ -580,6 +589,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-win32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-hmac-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-jconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-netutils.Po@am__quote@ @@ -589,6 +599,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-acl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-hmac-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-jconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-netutils.Po@am__quote@ @@ -598,6 +609,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-encrypt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-hmac-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-jconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-netutils.Po@am__quote@ @@ -687,6 +699,13 @@ libshadowsocks_la-netutils.lo: netutils.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_la-netutils.lo `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c +libshadowsocks_la-hmac-sha1.lo: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_la-hmac-sha1.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_la-hmac-sha1.Tpo -c -o libshadowsocks_la-hmac-sha1.lo `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_la-hmac-sha1.Tpo $(DEPDIR)/libshadowsocks_la-hmac-sha1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='libshadowsocks_la-hmac-sha1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_la-hmac-sha1.lo `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c + libshadowsocks_la-local.lo: local.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_la-local.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_la-local.Tpo -c -o libshadowsocks_la-local.lo `test -f 'local.c' || echo '$(srcdir)/'`local.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_la-local.Tpo $(DEPDIR)/libshadowsocks_la-local.Plo @@ -813,6 +832,20 @@ ss_local-netutils.obj: netutils.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi` +ss_local-hmac-sha1.o: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-hmac-sha1.o -MD -MP -MF $(DEPDIR)/ss_local-hmac-sha1.Tpo -c -o ss_local-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-hmac-sha1.Tpo $(DEPDIR)/ss_local-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_local-hmac-sha1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c + +ss_local-hmac-sha1.obj: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-hmac-sha1.obj -MD -MP -MF $(DEPDIR)/ss_local-hmac-sha1.Tpo -c -o ss_local-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-hmac-sha1.Tpo $(DEPDIR)/ss_local-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_local-hmac-sha1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` + ss_local-local.o: local.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-local.o -MD -MP -MF $(DEPDIR)/ss_local-local.Tpo -c -o ss_local-local.o `test -f 'local.c' || echo '$(srcdir)/'`local.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-local.Tpo $(DEPDIR)/ss_local-local.Po @@ -939,6 +972,20 @@ ss_redir-udprelay.obj: udprelay.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi` +ss_redir-hmac-sha1.o: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-hmac-sha1.o -MD -MP -MF $(DEPDIR)/ss_redir-hmac-sha1.Tpo -c -o ss_redir-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-hmac-sha1.Tpo $(DEPDIR)/ss_redir-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_redir-hmac-sha1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c + +ss_redir-hmac-sha1.obj: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-hmac-sha1.obj -MD -MP -MF $(DEPDIR)/ss_redir-hmac-sha1.Tpo -c -o ss_redir-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-hmac-sha1.Tpo $(DEPDIR)/ss_redir-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_redir-hmac-sha1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` + ss_redir-redir.o: redir.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-redir.o -MD -MP -MF $(DEPDIR)/ss_redir-redir.Tpo -c -o ss_redir-redir.o `test -f 'redir.c' || echo '$(srcdir)/'`redir.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-redir.Tpo $(DEPDIR)/ss_redir-redir.Po @@ -1079,6 +1126,20 @@ ss_server-resolv.obj: resolv.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-resolv.obj `if test -f 'resolv.c'; then $(CYGPATH_W) 'resolv.c'; else $(CYGPATH_W) '$(srcdir)/resolv.c'; fi` +ss_server-hmac-sha1.o: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-hmac-sha1.o -MD -MP -MF $(DEPDIR)/ss_server-hmac-sha1.Tpo -c -o ss_server-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-hmac-sha1.Tpo $(DEPDIR)/ss_server-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_server-hmac-sha1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c + +ss_server-hmac-sha1.obj: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-hmac-sha1.obj -MD -MP -MF $(DEPDIR)/ss_server-hmac-sha1.Tpo -c -o ss_server-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-hmac-sha1.Tpo $(DEPDIR)/ss_server-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_server-hmac-sha1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` + ss_server-server.o: server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-server.o -MD -MP -MF $(DEPDIR)/ss_server-server.Tpo -c -o ss_server-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-server.Tpo $(DEPDIR)/ss_server-server.Po @@ -1191,6 +1252,20 @@ ss_tunnel-netutils.obj: netutils.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -c -o ss_tunnel-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi` +ss_tunnel-hmac-sha1.o: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -MT ss_tunnel-hmac-sha1.o -MD -MP -MF $(DEPDIR)/ss_tunnel-hmac-sha1.Tpo -c -o ss_tunnel-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_tunnel-hmac-sha1.Tpo $(DEPDIR)/ss_tunnel-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_tunnel-hmac-sha1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -c -o ss_tunnel-hmac-sha1.o `test -f 'hmac-sha1.c' || echo '$(srcdir)/'`hmac-sha1.c + +ss_tunnel-hmac-sha1.obj: hmac-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -MT ss_tunnel-hmac-sha1.obj -MD -MP -MF $(DEPDIR)/ss_tunnel-hmac-sha1.Tpo -c -o ss_tunnel-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_tunnel-hmac-sha1.Tpo $(DEPDIR)/ss_tunnel-hmac-sha1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha1.c' object='ss_tunnel-hmac-sha1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -c -o ss_tunnel-hmac-sha1.obj `if test -f 'hmac-sha1.c'; then $(CYGPATH_W) 'hmac-sha1.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha1.c'; fi` + ss_tunnel-tunnel.o: tunnel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -MT ss_tunnel-tunnel.o -MD -MP -MF $(DEPDIR)/ss_tunnel-tunnel.Tpo -c -o ss_tunnel-tunnel.o `test -f 'tunnel.c' || echo '$(srcdir)/'`tunnel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_tunnel-tunnel.Tpo $(DEPDIR)/ss_tunnel-tunnel.Po diff --git a/src/encrypt.c b/src/encrypt.c index f9d692f2..81e7c7ef 100644 --- a/src/encrypt.c +++ b/src/encrypt.c @@ -71,6 +71,7 @@ #include #endif +#include "hmac-sha1.h" #include "cache.h" #include "encrypt.h" #include "utils.h" @@ -1030,24 +1031,22 @@ static int cipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *ole int ss_onetimeauth(char *auth, char *msg, int msg_len, struct enc_ctx *ctx) { - uint8_t auth_key[ONETIMEAUTH_KEYBYTES]; - uint8_t auth_bytes[MAX_IV_LENGTH + MAX_KEY_LENGTH]; - memcpy(auth_bytes, ctx->evp.iv, enc_iv_len); - memcpy(auth_bytes + enc_iv_len, enc_key, enc_key_len); - crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, enc_iv_len + enc_key_len, NULL, 0); - - return crypto_onetimeauth((uint8_t *)auth, (uint8_t *)msg, msg_len, auth_key); + uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; + memcpy(auth_key, ctx->evp.iv, enc_iv_len); + memcpy(auth_key + enc_iv_len, enc_key, enc_key_len); + sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)auth); + return 0; } int ss_onetimeauth_verify(char *auth, char *msg, int msg_len, struct enc_ctx *ctx) { - uint8_t auth_key[ONETIMEAUTH_KEYBYTES]; - uint8_t auth_bytes[MAX_IV_LENGTH + MAX_KEY_LENGTH]; - memcpy(auth_bytes, ctx->evp.iv, enc_iv_len); - memcpy(auth_bytes + enc_iv_len, enc_key, enc_key_len); - crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, enc_iv_len + enc_key_len, NULL, 0); + uint8_t hash[ONETIMEAUTH_BYTES]; + uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; + memcpy(auth_key, ctx->evp.iv, enc_iv_len); + memcpy(auth_key + enc_iv_len, enc_key, enc_key_len); + sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, hash); - return crypto_onetimeauth_verify((uint8_t *)auth, (uint8_t *)msg, msg_len, auth_key); + return memcmp(auth, hash, ONETIMEAUTH_BYTES); } char * ss_encrypt_all(int buf_size, char *plaintext, ssize_t *len, int method) @@ -1510,16 +1509,16 @@ int ss_check_hash(char **buf_ptr, ssize_t *buf_len, struct chunk *chunk, struct if (cidx == chunk->len + AUTH_BYTES) { // Compare hash - uint8_t hash[HASH_BYTES]; + uint8_t hash[ONETIMEAUTH_BYTES]; uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)]; uint32_t c = htonl(chunk->counter); memcpy(key, ctx->evp.iv, enc_iv_len); memcpy(key + enc_iv_len, &c, sizeof(uint32_t)); - crypto_generichash(hash, HASH_BYTES, (uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, - key, enc_iv_len + sizeof(uint32_t)); + sha1_hmac(key, enc_iv_len + sizeof(uint32_t), + (uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, hash); - if (memcmp(hash, chunk->buf + CLEN_BYTES, HASH_BYTES) != 0) { + if (memcmp(hash, chunk->buf + CLEN_BYTES, ONETIMEAUTH_BYTES) != 0) { *buf_ptr = buf; return 0; } @@ -1552,16 +1551,16 @@ char *ss_gen_hash(char *buf, ssize_t *buf_len, uint32_t *counter, struct enc_ctx } uint16_t chunk_len = htons((uint16_t)blen); - uint8_t hash[HASH_BYTES]; + uint8_t hash[ONETIMEAUTH_BYTES]; uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)]; uint32_t c = htonl(*counter); memcpy(key, ctx->evp.iv, enc_iv_len); memcpy(key + enc_iv_len, &c, sizeof(uint32_t)); - crypto_generichash(hash, HASH_BYTES, (uint8_t *)buf, blen, key, enc_iv_len + sizeof(uint32_t)); + sha1_hmac(key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf, blen, hash); memmove(buf + AUTH_BYTES, buf, blen); - memcpy(buf + CLEN_BYTES, hash, HASH_BYTES); + memcpy(buf + CLEN_BYTES, hash, ONETIMEAUTH_BYTES); memcpy(buf, &chunk_len, CLEN_BYTES); *counter = *counter + 1; diff --git a/src/encrypt.h b/src/encrypt.h index 13a724ab..6f697850 100644 --- a/src/encrypt.h +++ b/src/encrypt.h @@ -140,15 +140,13 @@ typedef struct { #define SALSA20 15 #define CHACHA20 16 -#define ONETIMEAUTH_BYTES 16U -#define ONETIMEAUTH_KEYBYTES 32U #define ONETIMEAUTH_FLAG 0x10 #define ADDRTYPE_MASK 0xF -#define HASH_BYTES 4 -#define CLEN_BYTES 2 -#define AUTH_BYTES (HASH_BYTES + CLEN_BYTES) +#define ONETIMEAUTH_BYTES 20U +#define CLEN_BYTES 2U +#define AUTH_BYTES (ONETIMEAUTH_BYTES + CLEN_BYTES) #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b)) diff --git a/src/hmac-sha1.c b/src/hmac-sha1.c new file mode 100644 index 00000000..f5a876fd --- /dev/null +++ b/src/hmac-sha1.c @@ -0,0 +1,375 @@ + +/** + * \file sha1.c + * + * \brief SHA-1 cryptographic hash function + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include "hmac-sha1.h" + + + + +/* + * SHA-1 context setup + */ +void sha1_starts( sha1_context *ctx ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + ctx->state[4] = 0xC3D2E1F0; +} + +void sha1_process( sha1_context *ctx, const unsigned char data[64] ) +{ + uint32_t temp, W[16], A, B, C, D, E; + + GET_UINT32_BE( W[ 0], data, 0 ); + GET_UINT32_BE( W[ 1], data, 4 ); + GET_UINT32_BE( W[ 2], data, 8 ); + GET_UINT32_BE( W[ 3], data, 12 ); + GET_UINT32_BE( W[ 4], data, 16 ); + GET_UINT32_BE( W[ 5], data, 20 ); + GET_UINT32_BE( W[ 6], data, 24 ); + GET_UINT32_BE( W[ 7], data, 28 ); + GET_UINT32_BE( W[ 8], data, 32 ); + GET_UINT32_BE( W[ 9], data, 36 ); + GET_UINT32_BE( W[10], data, 40 ); + GET_UINT32_BE( W[11], data, 44 ); + GET_UINT32_BE( W[12], data, 48 ); + GET_UINT32_BE( W[13], data, 52 ); + GET_UINT32_BE( W[14], data, 56 ); + GET_UINT32_BE( W[15], data, 60 ); + +#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) + +#define R(t) \ +( \ + temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \ + W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \ + ( W[t & 0x0F] = S(temp,1) ) \ +) + +#define P(a,b,c,d,e,x) \ +{ \ + e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ +} + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + +#define F(x,y,z) (z ^ (x & (y ^ z))) +#define K 0x5A827999 + + P( A, B, C, D, E, W[0] ); + P( E, A, B, C, D, W[1] ); + P( D, E, A, B, C, W[2] ); + P( C, D, E, A, B, W[3] ); + P( B, C, D, E, A, W[4] ); + P( A, B, C, D, E, W[5] ); + P( E, A, B, C, D, W[6] ); + P( D, E, A, B, C, W[7] ); + P( C, D, E, A, B, W[8] ); + P( B, C, D, E, A, W[9] ); + P( A, B, C, D, E, W[10] ); + P( E, A, B, C, D, W[11] ); + P( D, E, A, B, C, W[12] ); + P( C, D, E, A, B, W[13] ); + P( B, C, D, E, A, W[14] ); + P( A, B, C, D, E, W[15] ); + P( E, A, B, C, D, R(16) ); + P( D, E, A, B, C, R(17) ); + P( C, D, E, A, B, R(18) ); + P( B, C, D, E, A, R(19) ); + +#undef K +#undef F + +#define F(x,y,z) (x ^ y ^ z) +#define K 0x6ED9EBA1 + + P( A, B, C, D, E, R(20) ); + P( E, A, B, C, D, R(21) ); + P( D, E, A, B, C, R(22) ); + P( C, D, E, A, B, R(23) ); + P( B, C, D, E, A, R(24) ); + P( A, B, C, D, E, R(25) ); + P( E, A, B, C, D, R(26) ); + P( D, E, A, B, C, R(27) ); + P( C, D, E, A, B, R(28) ); + P( B, C, D, E, A, R(29) ); + P( A, B, C, D, E, R(30) ); + P( E, A, B, C, D, R(31) ); + P( D, E, A, B, C, R(32) ); + P( C, D, E, A, B, R(33) ); + P( B, C, D, E, A, R(34) ); + P( A, B, C, D, E, R(35) ); + P( E, A, B, C, D, R(36) ); + P( D, E, A, B, C, R(37) ); + P( C, D, E, A, B, R(38) ); + P( B, C, D, E, A, R(39) ); + +#undef K +#undef F + +#define F(x,y,z) ((x & y) | (z & (x | y))) +#define K 0x8F1BBCDC + + P( A, B, C, D, E, R(40) ); + P( E, A, B, C, D, R(41) ); + P( D, E, A, B, C, R(42) ); + P( C, D, E, A, B, R(43) ); + P( B, C, D, E, A, R(44) ); + P( A, B, C, D, E, R(45) ); + P( E, A, B, C, D, R(46) ); + P( D, E, A, B, C, R(47) ); + P( C, D, E, A, B, R(48) ); + P( B, C, D, E, A, R(49) ); + P( A, B, C, D, E, R(50) ); + P( E, A, B, C, D, R(51) ); + P( D, E, A, B, C, R(52) ); + P( C, D, E, A, B, R(53) ); + P( B, C, D, E, A, R(54) ); + P( A, B, C, D, E, R(55) ); + P( E, A, B, C, D, R(56) ); + P( D, E, A, B, C, R(57) ); + P( C, D, E, A, B, R(58) ); + P( B, C, D, E, A, R(59) ); + +#undef K +#undef F + +#define F(x,y,z) (x ^ y ^ z) +#define K 0xCA62C1D6 + + P( A, B, C, D, E, R(60) ); + P( E, A, B, C, D, R(61) ); + P( D, E, A, B, C, R(62) ); + P( C, D, E, A, B, R(63) ); + P( B, C, D, E, A, R(64) ); + P( A, B, C, D, E, R(65) ); + P( E, A, B, C, D, R(66) ); + P( D, E, A, B, C, R(67) ); + P( C, D, E, A, B, R(68) ); + P( B, C, D, E, A, R(69) ); + P( A, B, C, D, E, R(70) ); + P( E, A, B, C, D, R(71) ); + P( D, E, A, B, C, R(72) ); + P( C, D, E, A, B, R(73) ); + P( B, C, D, E, A, R(74) ); + P( A, B, C, D, E, R(75) ); + P( E, A, B, C, D, R(76) ); + P( D, E, A, B, C, R(77) ); + P( C, D, E, A, B, R(78) ); + P( B, C, D, E, A, R(79) ); + +#undef K +#undef F + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; +} + +/* + * SHA-1 process buffer + */ +void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) +{ + size_t fill; + uint32_t left; + + if( ilen <= 0 ) + return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if( ctx->total[0] < (uint32_t) ilen ) + ctx->total[1]++; + + if( left && ilen >= fill ) + { + memcpy( (void *) (ctx->buffer + left), input, fill ); + sha1_process( ctx, ctx->buffer ); + input += fill; + ilen -= fill; + left = 0; + } + + while( ilen >= 64 ) + { + sha1_process( ctx, input ); + input += 64; + ilen -= 64; + } + + if( ilen > 0 ) + memcpy( (void *) (ctx->buffer + left), input, ilen ); +} + +static const unsigned char sha1_padding[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 +}; + +/* + * SHA-1 final digest + */ +void sha1_finish( sha1_context *ctx, unsigned char output[20] ) +{ + uint32_t last, padn; + uint32_t high, low; + unsigned char msglen[8]; + + high = ( ctx->total[0] >> 29 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT32_BE( high, msglen, 0 ); + PUT_UINT32_BE( low, msglen, 4 ); + + last = ctx->total[0] & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + sha1_update( ctx, sha1_padding, padn ); + sha1_update( ctx, msglen, 8 ); + + PUT_UINT32_BE( ctx->state[0], output, 0 ); + PUT_UINT32_BE( ctx->state[1], output, 4 ); + PUT_UINT32_BE( ctx->state[2], output, 8 ); + PUT_UINT32_BE( ctx->state[3], output, 12 ); + PUT_UINT32_BE( ctx->state[4], output, 16 ); +} +/* + * output = SHA-1( input buffer ) + */ +void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ) +{ + sha1_context ctx; + + sha1_starts( &ctx ); + sha1_update( &ctx, input, ilen ); + sha1_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha1_context ) ); +} + +/* + * SHA-1 HMAC context setup + */ +void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ) +{ + size_t i; + unsigned char sum[20]; + + if( keylen > 64 ) + { + sha1( key, keylen, sum ); + keylen = 20; + key = sum; + } + + memset( ctx->ipad, 0x36, 64 ); + memset( ctx->opad, 0x5C, 64 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + sha1_starts( ctx ); + sha1_update( ctx, ctx->ipad, 64 ); + + memset( sum, 0, sizeof( sum ) ); +} + +/* + * SHA-1 HMAC process buffer + */ +void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) +{ + sha1_update( ctx, input, ilen ); +} + +/* + * SHA-1 HMAC final digest + */ +void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ) +{ + unsigned char tmpbuf[20]; + + sha1_finish( ctx, tmpbuf ); + sha1_starts( ctx ); + sha1_update( ctx, ctx->opad, 64 ); + sha1_update( ctx, tmpbuf, 20 ); + sha1_finish( ctx, output ); + + memset( tmpbuf, 0, sizeof( tmpbuf ) ); +} + +/* + * SHA1 HMAC context reset + */ +void sha1_hmac_reset( sha1_context *ctx ) +{ + sha1_starts( ctx ); + sha1_update( ctx, ctx->ipad, 64 ); +} + +/* + * output = HMAC-SHA-1( hmac key, input buffer ) + */ +void sha1_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[20] ) +{ + sha1_context ctx; + + sha1_hmac_starts( &ctx, key, keylen ); + sha1_hmac_update( &ctx, input, ilen ); + sha1_hmac_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha1_context ) ); +} + + diff --git a/src/hmac-sha1.h b/src/hmac-sha1.h new file mode 100644 index 00000000..d25e99fc --- /dev/null +++ b/src/hmac-sha1.h @@ -0,0 +1,157 @@ +/** + * \file sha1.h + * + * \brief SHA-1 cryptographic hash function + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef HMAC_SHA1_H_ +#define HMAC_SHA1_H_ + +#include +#include + + +/* + * 32-bit integer manipulation macros (big endian) + */ + +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} + +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} + + + +/** + * \brief SHA-1 context structure + */ +typedef struct +{ + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[5]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ + + unsigned char ipad[64]; /*!< HMAC: inner padding */ + unsigned char opad[64]; /*!< HMAC: outer padding */ +} +sha1_context; + +/** + * \brief SHA-1 context setup + * + * \param ctx context to be initialized + */ +void sha1_starts( sha1_context *ctx ); + +/** + * \brief SHA-1 process buffer + * + * \param ctx SHA-1 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-1 final digest + * + * \param ctx SHA-1 context + * \param output SHA-1 checksum result + */ +void sha1_finish( sha1_context *ctx, unsigned char output[20] ); + +/* Internal use */ +void sha1_process( sha1_context *ctx, const unsigned char data[64] ); + + +/** + * \brief Output = SHA-1( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output SHA-1 checksum result + */ +void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); + + +/** + * \brief SHA-1 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param key HMAC secret key + * \param keylen length of the HMAC key + */ +void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ); + +/** + * \brief SHA-1 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-1 HMAC final digest + * + * \param ctx HMAC context + * \param output SHA-1 HMAC checksum result + */ +void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ); + +/** + * \brief SHA-1 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void sha1_hmac_reset( sha1_context *ctx ); + +/** + * \brief Output = HMAC-SHA-1( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-SHA-1 result + */ +void sha1_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[20] ); + + + +#endif /* HMAC_SHA1_H_ */