From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/ext/digest/sha1/Makefile | 297 ++++++++++++++++++++++++++++++++++++ jni/ruby/ext/digest/sha1/depend | 28 ++++ jni/ruby/ext/digest/sha1/extconf.h | 7 + jni/ruby/ext/digest/sha1/extconf.rb | 27 ++++ jni/ruby/ext/digest/sha1/sha1.c | 271 ++++++++++++++++++++++++++++++++ jni/ruby/ext/digest/sha1/sha1.h | 39 +++++ jni/ruby/ext/digest/sha1/sha1init.c | 45 ++++++ jni/ruby/ext/digest/sha1/sha1ossl.c | 10 ++ jni/ruby/ext/digest/sha1/sha1ossl.h | 20 +++ 9 files changed, 744 insertions(+) create mode 100644 jni/ruby/ext/digest/sha1/Makefile create mode 100644 jni/ruby/ext/digest/sha1/depend create mode 100644 jni/ruby/ext/digest/sha1/extconf.h create mode 100644 jni/ruby/ext/digest/sha1/extconf.rb create mode 100644 jni/ruby/ext/digest/sha1/sha1.c create mode 100644 jni/ruby/ext/digest/sha1/sha1.h create mode 100644 jni/ruby/ext/digest/sha1/sha1init.c create mode 100644 jni/ruby/ext/digest/sha1/sha1ossl.c create mode 100644 jni/ruby/ext/digest/sha1/sha1ossl.h (limited to 'jni/ruby/ext/digest/sha1') diff --git a/jni/ruby/ext/digest/sha1/Makefile b/jni/ruby/ext/digest/sha1/Makefile new file mode 100644 index 0000000..cc81aa2 --- /dev/null +++ b/jni/ruby/ext/digest/sha1/Makefile @@ -0,0 +1,297 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@:) +ECHO = $(ECHO1:0=@echo) +NULLCMD = : + +#### Start of system configuration section. #### +top_srcdir = $(topdir)/. +srcdir = $(top_srcdir)/ext/digest/sha1 +topdir = ../../.. +hdrdir = $(top_srcdir)/include +arch_hdrdir = $(extout)/include/$(arch) +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +RUBYLIB = +RUBYOPT = - +prefix = $(DESTDIR)/usr/local +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(sitelibdir)/$(sitearch) +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-R$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-R$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) + +RUBY_EXTCONF_H = extconf.h +cflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wno-packed-bitfield-compat +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir) -I$(srcdir) -I$(srcdir)/.. +DEFS = +CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -fstack-protector -rdynamic -Wl,-export-dynamic +dldflags = +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.2.0 +ruby = $(topdir)/miniruby -I'$(topdir)' -I'$(top_srcdir)/lib' -I'$(extout)/$(arch)' -I'$(extout)/common' +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H) + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = digest + +libpath = . $(topdir) +LIBPATH = -L. -L$(topdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = $(topdir)/.ext +extout_prefix = $(extout)$(target_prefix)/ +target_prefix = /digest +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lcrypto -lssl -lcrypto -lpthread -lgmp -ldl -lcrypt -lm -lc +ORIG_SRCS = sha1ossl.c sha1init.c sha1.c +SRCS = $(ORIG_SRCS) sha1init.c sha1ossl.c +OBJS = sha1init.o sha1ossl.o +HDRS = $(srcdir)/extconf.h $(srcdir)/sha1.h $(srcdir)/sha1ossl.h +TARGET = sha1 +TARGET_NAME = sha1 +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = $(TARGET).a + +TIMESTAMP_DIR = $(extout)/.timestamp +BINDIR = $(extout)/bin +RUBYCOMMONDIR = $(extout)/common +RUBYLIBDIR = $(RUBYCOMMONDIR)$(target_prefix) +RUBYARCHDIR = $(extout)/$(arch)$(target_prefix) +HDRDIR = $(extout)/include/ruby$(target_prefix) +ARCHHDRDIR = $(extout)/include/$(arch)/ruby$(target_prefix) + +TARGET_SO = $(RUBYARCHDIR)/$(DLLIB) +CLEANLIBS = $(RUBYARCHDIR)/$(TARGET).so +CLEANOBJS = *.o *.bak + +all: install +static: all +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(RUBYARCHDIR)/$(DLLIB) +clean-so:: + -$(Q)$(RM) $(RUBYARCHDIR)/$(DLLIB) + -$(Q)$(RMDIRS) $(RUBYARCHDIR) 2> /dev/null || true +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb install-rb-default +install-rb-default: pre-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.RUBYARCHDIR.-.digest.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $< + +$(RUBYARCHDIR)/$(DLLIB): $(OBJS) Makefile $(TIMESTAMP_DIR)/.RUBYARCHDIR.-.digest.time + $(ECHO) linking shared-object digest/$(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + +$(STATIC_LIB): $(OBJS) + -$(Q)$(RM) $(@) + $(ECHO) linking static-library $(@) + $(Q) $(AR) cru $@ $(OBJS) + -$(Q)ranlib $(@) 2> /dev/null || true + +### +$(OBJS): $(RUBY_EXTCONF_H) + +sha1.o: sha1.c sha1.h $(srcdir)/../defs.h + +# AUTOGENERATED DEPENDENCIES START +sha1init.o: $(RUBY_EXTCONF_H) +sha1init.o: $(arch_hdrdir)/ruby/config.h +sha1init.o: $(hdrdir)/ruby/defines.h +sha1init.o: $(hdrdir)/ruby/intern.h +sha1init.o: $(hdrdir)/ruby/missing.h +sha1init.o: $(hdrdir)/ruby/ruby.h +sha1init.o: $(hdrdir)/ruby/st.h +sha1init.o: $(hdrdir)/ruby/subst.h +sha1init.o: $(top_srcdir)/ext/digest/digest.h +sha1init.o: $(top_srcdir)/include/ruby.h +sha1init.o: sha1init.c +sha1init.o: sha1ossl.h +sha1ossl.o: $(RUBY_EXTCONF_H) +sha1ossl.o: $(arch_hdrdir)/ruby/config.h +sha1ossl.o: $(hdrdir)/ruby/defines.h +sha1ossl.o: $(hdrdir)/ruby/intern.h +sha1ossl.o: $(hdrdir)/ruby/missing.h +sha1ossl.o: $(hdrdir)/ruby/ruby.h +sha1ossl.o: $(hdrdir)/ruby/st.h +sha1ossl.o: $(hdrdir)/ruby/subst.h +sha1ossl.o: $(top_srcdir)/ext/digest/defs.h +sha1ossl.o: $(top_srcdir)/include/ruby.h +sha1ossl.o: sha1ossl.c +sha1ossl.o: sha1ossl.h +# AUTOGENERATED DEPENDENCIES END diff --git a/jni/ruby/ext/digest/sha1/depend b/jni/ruby/ext/digest/sha1/depend new file mode 100644 index 0000000..2ce73c4 --- /dev/null +++ b/jni/ruby/ext/digest/sha1/depend @@ -0,0 +1,28 @@ +sha1.o: sha1.c sha1.h $(srcdir)/../defs.h + +# AUTOGENERATED DEPENDENCIES START +sha1init.o: $(RUBY_EXTCONF_H) +sha1init.o: $(arch_hdrdir)/ruby/config.h +sha1init.o: $(hdrdir)/ruby/defines.h +sha1init.o: $(hdrdir)/ruby/intern.h +sha1init.o: $(hdrdir)/ruby/missing.h +sha1init.o: $(hdrdir)/ruby/ruby.h +sha1init.o: $(hdrdir)/ruby/st.h +sha1init.o: $(hdrdir)/ruby/subst.h +sha1init.o: $(top_srcdir)/ext/digest/digest.h +sha1init.o: $(top_srcdir)/include/ruby.h +sha1init.o: sha1init.c +sha1init.o: sha1ossl.h +sha1ossl.o: $(RUBY_EXTCONF_H) +sha1ossl.o: $(arch_hdrdir)/ruby/config.h +sha1ossl.o: $(hdrdir)/ruby/defines.h +sha1ossl.o: $(hdrdir)/ruby/intern.h +sha1ossl.o: $(hdrdir)/ruby/missing.h +sha1ossl.o: $(hdrdir)/ruby/ruby.h +sha1ossl.o: $(hdrdir)/ruby/st.h +sha1ossl.o: $(hdrdir)/ruby/subst.h +sha1ossl.o: $(top_srcdir)/ext/digest/defs.h +sha1ossl.o: $(top_srcdir)/include/ruby.h +sha1ossl.o: sha1ossl.c +sha1ossl.o: sha1ossl.h +# AUTOGENERATED DEPENDENCIES END diff --git a/jni/ruby/ext/digest/sha1/extconf.h b/jni/ruby/ext/digest/sha1/extconf.h new file mode 100644 index 0000000..808ca65 --- /dev/null +++ b/jni/ruby/ext/digest/sha1/extconf.h @@ -0,0 +1,7 @@ +#ifndef EXTCONF_H +#define EXTCONF_H +#define HAVE_CONFIG_H 1 +#define HAVE_SHA1_TRANSFORM 1 +#define HAVE_OPENSSL_SHA_H 1 +#define HAVE_SYS_CDEFS_H 1 +#endif diff --git a/jni/ruby/ext/digest/sha1/extconf.rb b/jni/ruby/ext/digest/sha1/extconf.rb new file mode 100644 index 0000000..13c448b --- /dev/null +++ b/jni/ruby/ext/digest/sha1/extconf.rb @@ -0,0 +1,27 @@ +# -*- coding: us-ascii -*- +# $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $ +# $Id: extconf.rb 47802 2014-10-05 02:03:55Z nobu $ + +require "mkmf" + +$defs << "-DHAVE_CONFIG_H" +$INCFLAGS << " -I$(srcdir)/.." + +$objs = [ "sha1init.#{$OBJEXT}" ] + +if !with_config("bundled-sha1") && + (dir_config("openssl") + pkg_config("openssl") + require File.expand_path('../../../openssl/deprecation', __FILE__) + have_library("crypto")) && + OpenSSL.check_func("SHA1_Transform", "openssl/sha.h") + $objs << "sha1ossl.#{$OBJEXT}" +else + $objs << "sha1.#{$OBJEXT}" +end + +have_header("sys/cdefs.h") + +$preload = %w[digest] + +create_makefile("digest/sha1") diff --git a/jni/ruby/ext/digest/sha1/sha1.c b/jni/ruby/ext/digest/sha1/sha1.c new file mode 100644 index 0000000..e9740ed --- /dev/null +++ b/jni/ruby/ext/digest/sha1/sha1.c @@ -0,0 +1,271 @@ +/* $NetBSD: sha1.c,v 1.2 2001/03/22 09:51:48 agc Exp $ */ +/* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */ +/* $RoughId: sha1.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */ +/* $Id: sha1.c 46827 2014-07-15 14:59:20Z nobu $ */ + +/* + * SHA-1 in C + * By Steve Reid + * 100% Public Domain + * + * Test Vectors (from FIPS PUB 180-1) + * "abc" + * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D + * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 + * A million repetitions of "a" + * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F + */ + +#include "sha1.h" + +#define SHA1HANDSOFF /* Copies data before messing with it. */ + +#if defined(_KERNEL) || defined(_STANDALONE) +#include +#include +#define _DIAGASSERT(x) (void)0 +#else +/* #include "namespace.h" */ +#include +#include +#endif + +#ifndef _DIAGASSERT +#define _DIAGASSERT(cond) assert(cond) +#endif + +/* + * XXX Kludge until there is resolution regarding mem*() functions + * XXX in the kernel. + */ +#if defined(_KERNEL) || defined(_STANDALONE) +#define memcpy(s, d, l) bcopy((d), (s), (l)) +#endif + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* + * blk0() and blk() perform the initial expand. + * I got the idea of expanding during the round function from SSLeay + */ +#ifndef WORDS_BIGENDIAN +# define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#else +# define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* + * (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1 + */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +typedef union { + uint8_t c[64]; + uint32_t l[16]; +} CHAR64LONG16; + +#ifdef __sparc_v9__ +void do_R01(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *); +void do_R2(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *); +void do_R3(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *); +void do_R4(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *); + +#define nR0(v,w,x,y,z,i) R0(*v,*w,*x,*y,*z,i) +#define nR1(v,w,x,y,z,i) R1(*v,*w,*x,*y,*z,i) +#define nR2(v,w,x,y,z,i) R2(*v,*w,*x,*y,*z,i) +#define nR3(v,w,x,y,z,i) R3(*v,*w,*x,*y,*z,i) +#define nR4(v,w,x,y,z,i) R4(*v,*w,*x,*y,*z,i) + +void +do_R01(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block) +{ + nR0(a,b,c,d,e, 0); nR0(e,a,b,c,d, 1); nR0(d,e,a,b,c, 2); nR0(c,d,e,a,b, 3); + nR0(b,c,d,e,a, 4); nR0(a,b,c,d,e, 5); nR0(e,a,b,c,d, 6); nR0(d,e,a,b,c, 7); + nR0(c,d,e,a,b, 8); nR0(b,c,d,e,a, 9); nR0(a,b,c,d,e,10); nR0(e,a,b,c,d,11); + nR0(d,e,a,b,c,12); nR0(c,d,e,a,b,13); nR0(b,c,d,e,a,14); nR0(a,b,c,d,e,15); + nR1(e,a,b,c,d,16); nR1(d,e,a,b,c,17); nR1(c,d,e,a,b,18); nR1(b,c,d,e,a,19); +} + +void +do_R2(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block) +{ + nR2(a,b,c,d,e,20); nR2(e,a,b,c,d,21); nR2(d,e,a,b,c,22); nR2(c,d,e,a,b,23); + nR2(b,c,d,e,a,24); nR2(a,b,c,d,e,25); nR2(e,a,b,c,d,26); nR2(d,e,a,b,c,27); + nR2(c,d,e,a,b,28); nR2(b,c,d,e,a,29); nR2(a,b,c,d,e,30); nR2(e,a,b,c,d,31); + nR2(d,e,a,b,c,32); nR2(c,d,e,a,b,33); nR2(b,c,d,e,a,34); nR2(a,b,c,d,e,35); + nR2(e,a,b,c,d,36); nR2(d,e,a,b,c,37); nR2(c,d,e,a,b,38); nR2(b,c,d,e,a,39); +} + +void +do_R3(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block) +{ + nR3(a,b,c,d,e,40); nR3(e,a,b,c,d,41); nR3(d,e,a,b,c,42); nR3(c,d,e,a,b,43); + nR3(b,c,d,e,a,44); nR3(a,b,c,d,e,45); nR3(e,a,b,c,d,46); nR3(d,e,a,b,c,47); + nR3(c,d,e,a,b,48); nR3(b,c,d,e,a,49); nR3(a,b,c,d,e,50); nR3(e,a,b,c,d,51); + nR3(d,e,a,b,c,52); nR3(c,d,e,a,b,53); nR3(b,c,d,e,a,54); nR3(a,b,c,d,e,55); + nR3(e,a,b,c,d,56); nR3(d,e,a,b,c,57); nR3(c,d,e,a,b,58); nR3(b,c,d,e,a,59); +} + +void +do_R4(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t *e, CHAR64LONG16 *block) +{ + nR4(a,b,c,d,e,60); nR4(e,a,b,c,d,61); nR4(d,e,a,b,c,62); nR4(c,d,e,a,b,63); + nR4(b,c,d,e,a,64); nR4(a,b,c,d,e,65); nR4(e,a,b,c,d,66); nR4(d,e,a,b,c,67); + nR4(c,d,e,a,b,68); nR4(b,c,d,e,a,69); nR4(a,b,c,d,e,70); nR4(e,a,b,c,d,71); + nR4(d,e,a,b,c,72); nR4(c,d,e,a,b,73); nR4(b,c,d,e,a,74); nR4(a,b,c,d,e,75); + nR4(e,a,b,c,d,76); nR4(d,e,a,b,c,77); nR4(c,d,e,a,b,78); nR4(b,c,d,e,a,79); +} +#endif + +/* + * Hash a single 512-bit block. This is the core of the algorithm. + */ +void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]) +{ + uint32_t a, b, c, d, e; + CHAR64LONG16 *block; + +#ifdef SHA1HANDSOFF + CHAR64LONG16 workspace; +#endif + + _DIAGASSERT(buffer != 0); + _DIAGASSERT(state != 0); + +#ifdef SHA1HANDSOFF + block = &workspace; + (void)memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16 *)(void *)buffer; +#endif + + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + +#ifdef __sparc_v9__ + do_R01(&a, &b, &c, &d, &e, block); + do_R2(&a, &b, &c, &d, &e, block); + do_R3(&a, &b, &c, &d, &e, block); + do_R4(&a, &b, &c, &d, &e, block); +#else + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); +#endif + + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* + * SHA1_Init - Initialize new context + */ +int SHA1_Init(SHA1_CTX *context) +{ + + _DIAGASSERT(context != 0); + + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; + return 1; +} + + +/* + * Run your data through this. + */ +void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len) +{ + uint32_t i, j; + + _DIAGASSERT(context != 0); + _DIAGASSERT(data != 0); + + j = context->count[0]; + if ((context->count[0] += len << 3) < j) + context->count[1] += (len>>29)+1; + j = (j >> 3) & 63; + if ((j + len) > 63) { + (void)memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1_Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) + SHA1_Transform(context->state, &data[i]); + j = 0; + } else { + i = 0; + } + (void)memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* + * Add padding and return the message digest. + */ +int SHA1_Finish(SHA1_CTX* context, uint8_t digest[20]) +{ + size_t i; + uint8_t finalcount[8]; + + _DIAGASSERT(digest != 0); + _DIAGASSERT(context != 0); + + for (i = 0; i < 8; i++) { + finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } + SHA1_Update(context, (const uint8_t *)"\200", 1); + while ((context->count[0] & 504) != 448) + SHA1_Update(context, (const uint8_t *)"\0", 1); + SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ + + if (digest) { + for (i = 0; i < 20; i++) + digest[i] = (uint8_t) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + return 1; +} diff --git a/jni/ruby/ext/digest/sha1/sha1.h b/jni/ruby/ext/digest/sha1/sha1.h new file mode 100644 index 0000000..d175eda --- /dev/null +++ b/jni/ruby/ext/digest/sha1/sha1.h @@ -0,0 +1,39 @@ +/* $NetBSD: sha1.h,v 1.2 1998/05/29 22:55:44 thorpej Exp $ */ +/* $RoughId: sha1.h,v 1.3 2002/02/24 08:14:32 knu Exp $ */ +/* $Id: sha1.h 46827 2014-07-15 14:59:20Z nobu $ */ + +/* + * SHA-1 in C + * By Steve Reid + * 100% Public Domain + */ + +#ifndef _SYS_SHA1_H_ +#define _SYS_SHA1_H_ + +#include "defs.h" + +typedef struct { + uint32_t state[5]; + uint32_t count[2]; + uint8_t buffer[64]; +} SHA1_CTX; + +#ifdef RUBY +/* avoid name clash */ +#define SHA1_Transform rb_Digest_SHA1_Transform +#define SHA1_Init rb_Digest_SHA1_Init +#define SHA1_Update rb_Digest_SHA1_Update +#define SHA1_Finish rb_Digest_SHA1_Finish +#endif + +void SHA1_Transform _((uint32_t state[5], const uint8_t buffer[64])); +int SHA1_Init _((SHA1_CTX *context)); +void SHA1_Update _((SHA1_CTX *context, const uint8_t *data, size_t len)); +int SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20])); + +#define SHA1_BLOCK_LENGTH 64 +#define SHA1_DIGEST_LENGTH 20 +#define SHA1_DIGEST_STRING_LENGTH (SHA1_DIGEST_LENGTH * 2 + 1) + +#endif /* _SYS_SHA1_H_ */ diff --git a/jni/ruby/ext/digest/sha1/sha1init.c b/jni/ruby/ext/digest/sha1/sha1init.c new file mode 100644 index 0000000..f3769ce --- /dev/null +++ b/jni/ruby/ext/digest/sha1/sha1init.c @@ -0,0 +1,45 @@ +/* $RoughId: sha1init.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */ +/* $Id: sha1init.c 47745 2014-09-30 08:29:02Z nobu $ */ + +#include "digest.h" +#if defined(HAVE_OPENSSL_SHA_H) +#include "sha1ossl.h" +#else +#include "sha1.h" +#endif + +static const rb_digest_metadata_t sha1 = { + RUBY_DIGEST_API_VERSION, + SHA1_DIGEST_LENGTH, + SHA1_BLOCK_LENGTH, + sizeof(SHA1_CTX), + (rb_digest_hash_init_func_t)SHA1_Init, + (rb_digest_hash_update_func_t)SHA1_Update, + (rb_digest_hash_finish_func_t)SHA1_Finish, +}; + +/* + * A class for calculating message digests using the SHA-1 Secure Hash + * Algorithm by NIST (the US' National Institute of Standards and + * Technology), described in FIPS PUB 180-1. + */ +void +Init_sha1(void) +{ + VALUE mDigest, cDigest_Base, cDigest_SHA1; + + rb_require("digest"); + +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif + mDigest = rb_path2class("Digest"); + cDigest_Base = rb_path2class("Digest::Base"); + + cDigest_SHA1 = rb_define_class_under(mDigest, "SHA1", cDigest_Base); + +#undef RUBY_UNTYPED_DATA_WARNING +#define RUBY_UNTYPED_DATA_WARNING 0 + rb_ivar_set(cDigest_SHA1, rb_intern("metadata"), + Data_Wrap_Struct(0, 0, 0, (void *)&sha1)); +} diff --git a/jni/ruby/ext/digest/sha1/sha1ossl.c b/jni/ruby/ext/digest/sha1/sha1ossl.c new file mode 100644 index 0000000..70391bb --- /dev/null +++ b/jni/ruby/ext/digest/sha1/sha1ossl.c @@ -0,0 +1,10 @@ +/* $Id: sha1ossl.c 25189 2009-10-02 12:04:37Z akr $ */ + +#include "defs.h" +#include "sha1ossl.h" + +void +SHA1_Finish(SHA1_CTX *ctx, char *buf) +{ + SHA1_Final((unsigned char *)buf, ctx); +} diff --git a/jni/ruby/ext/digest/sha1/sha1ossl.h b/jni/ruby/ext/digest/sha1/sha1ossl.h new file mode 100644 index 0000000..5cd1660 --- /dev/null +++ b/jni/ruby/ext/digest/sha1/sha1ossl.h @@ -0,0 +1,20 @@ +/* $Id: sha1ossl.h 25189 2009-10-02 12:04:37Z akr $ */ + +#ifndef SHA1OSSL_H_INCLUDED +#define SHA1OSSL_H_INCLUDED + +#include +#include + +#define SHA1_CTX SHA_CTX + +#ifdef SHA_BLOCK_LENGTH +#define SHA1_BLOCK_LENGTH SHA_BLOCK_LENGTH +#else +#define SHA1_BLOCK_LENGTH SHA_CBLOCK +#endif +#define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH + +void SHA1_Finish(SHA1_CTX *ctx, char *buf); + +#endif -- cgit v1.2.3-70-g09d2