diff options
Diffstat (limited to 'ext/digest')
54 files changed, 2997 insertions, 565 deletions
diff --git a/ext/digest/.cvsignore b/ext/digest/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/.document b/ext/digest/.document new file mode 100644 index 0000000000..beab275b5a --- /dev/null +++ b/ext/digest/.document @@ -0,0 +1,3 @@ +digest.c +bubblebabble/bubblebabble.c +*/*init.c diff --git a/ext/digest/bubblebabble/.cvsignore b/ext/digest/bubblebabble/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/bubblebabble/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/bubblebabble/bubblebabble.c b/ext/digest/bubblebabble/bubblebabble.c index 3a03ceced0..dac603c0d7 100644 --- a/ext/digest/bubblebabble/bubblebabble.c +++ b/ext/digest/bubblebabble/bubblebabble.c @@ -11,8 +11,8 @@ ************************************************/ -#include "ruby.h" -#include "digest.h" +#include <ruby/ruby.h> +#include "../digest.h" static ID id_digest; @@ -23,7 +23,7 @@ bubblebabble_str_new(VALUE str_digest) size_t digest_len; VALUE str; char *p; - int i, j, seed = 1; + size_t i, j, seed = 1; static const char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' }; @@ -37,7 +37,7 @@ bubblebabble_str_new(VALUE str_digest) digest_len = RSTRING_LEN(str_digest); if ((LONG_MAX - 2) / 3 < (digest_len | 1)) { - rb_raise(rb_eRuntimeError, "digest string too long"); + rb_raise(rb_eRuntimeError, "digest string too long"); } str = rb_str_new(0, (digest_len | 1) * 3 + 2); @@ -54,7 +54,7 @@ bubblebabble_str_new(VALUE str_digest) p[j++] = consonants[16]; p[j++] = vowels[seed / 6]; break; - } + } byte1 = digest[i++]; p[j++] = vowels[(((byte1 >> 6) & 3) + seed) % 6]; @@ -78,7 +78,8 @@ bubblebabble_str_new(VALUE str_digest) return str; } -/* +/* Document-method: Digest::bubblebabble + * * call-seq: * Digest.bubblebabble(string) -> bubblebabble_string * @@ -90,7 +91,8 @@ rb_digest_s_bubblebabble(VALUE klass, VALUE str) return bubblebabble_str_new(str); } -/* +/* Document-method: Digest::Class::bubblebabble + * * call-seq: * Digest::Class.bubblebabble(string, ...) -> hash_string * @@ -99,10 +101,11 @@ rb_digest_s_bubblebabble(VALUE klass, VALUE str) static VALUE rb_digest_class_s_bubblebabble(int argc, VALUE *argv, VALUE klass) { - return bubblebabble_str_new(rb_funcall2(klass, id_digest, argc, argv)); + return bubblebabble_str_new(rb_funcallv(klass, id_digest, argc, argv)); } -/* +/* Document-method: Digest::Instance#bubblebabble + * * call-seq: * digest_obj.bubblebabble -> hash_string * @@ -121,22 +124,23 @@ rb_digest_instance_bubblebabble(VALUE self) void Init_bubblebabble(void) { - VALUE mDigest, mDigest_Instance, cDigest_Class; +#undef rb_intern + VALUE rb_mDigest, rb_mDigest_Instance, rb_cDigest_Class; rb_require("digest"); - mDigest = rb_path2class("Digest"); - mDigest_Instance = rb_path2class("Digest::Instance"); - cDigest_Class = rb_path2class("Digest::Class"); - - /* Digest::bubblebabble() */ - rb_define_module_function(mDigest, "bubblebabble", rb_digest_s_bubblebabble, 1); - - /* Digest::Class::bubblebabble() */ - rb_define_singleton_method(cDigest_Class, "bubblebabble", rb_digest_class_s_bubblebabble, -1); - - /* Digest::Instance#bubblebabble() */ - rb_define_method(mDigest_Instance, "bubblebabble", rb_digest_instance_bubblebabble, 0); +#if 0 + rb_mDigest = rb_define_module("Digest"); + rb_mDigest_Instance = rb_define_module_under(rb_mDigest, "Instance"); + rb_cDigest_Class = rb_define_class_under(rb_mDigest, "Class", rb_cObject); +#endif + rb_mDigest = rb_digest_namespace(); + rb_mDigest_Instance = rb_const_get(rb_mDigest, rb_intern_const("Instance")); + rb_cDigest_Class = rb_const_get(rb_mDigest, rb_intern_const("Class")); + + rb_define_module_function(rb_mDigest, "bubblebabble", rb_digest_s_bubblebabble, 1); + rb_define_singleton_method(rb_cDigest_Class, "bubblebabble", rb_digest_class_s_bubblebabble, -1); + rb_define_method(rb_mDigest_Instance, "bubblebabble", rb_digest_instance_bubblebabble, 0); id_digest = rb_intern("digest"); } diff --git a/ext/digest/bubblebabble/depend b/ext/digest/bubblebabble/depend index b20148ded4..02d88e960c 100644 --- a/ext/digest/bubblebabble/depend +++ b/ext/digest/bubblebabble/depend @@ -1,3 +1,164 @@ -bubblebabble.o: bubblebabble.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h \ - $(srcdir)/../defs.h +# AUTOGENERATED DEPENDENCIES START +bubblebabble.o: $(RUBY_EXTCONF_H) +bubblebabble.o: $(arch_hdrdir)/ruby/config.h +bubblebabble.o: $(hdrdir)/ruby.h +bubblebabble.o: $(hdrdir)/ruby/assert.h +bubblebabble.o: $(hdrdir)/ruby/backward.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/assume.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/attributes.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/bool.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/inttypes.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/limits.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/long_long.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/stdalign.h +bubblebabble.o: $(hdrdir)/ruby/backward/2/stdarg.h +bubblebabble.o: $(hdrdir)/ruby/defines.h +bubblebabble.o: $(hdrdir)/ruby/intern.h +bubblebabble.o: $(hdrdir)/ruby/internal/abi.h +bubblebabble.o: $(hdrdir)/ruby/internal/anyargs.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/char.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/double.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/int.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/long.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/short.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +bubblebabble.o: $(hdrdir)/ruby/internal/assume.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/artificial.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/cold.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/const.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/constexpr.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/deprecated.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/error.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/forceinline.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/format.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/noalias.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/noexcept.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/noinline.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/nonnull.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/noreturn.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/pure.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/restrict.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/warning.h +bubblebabble.o: $(hdrdir)/ruby/internal/attr/weakref.h +bubblebabble.o: $(hdrdir)/ruby/internal/cast.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +bubblebabble.o: $(hdrdir)/ruby/internal/compiler_since.h +bubblebabble.o: $(hdrdir)/ruby/internal/config.h +bubblebabble.o: $(hdrdir)/ruby/internal/constant_p.h +bubblebabble.o: $(hdrdir)/ruby/internal/core.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rarray.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rbasic.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rbignum.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rclass.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rdata.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rfile.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rhash.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/robject.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rregexp.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rstring.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rstruct.h +bubblebabble.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +bubblebabble.o: $(hdrdir)/ruby/internal/ctype.h +bubblebabble.o: $(hdrdir)/ruby/internal/dllexport.h +bubblebabble.o: $(hdrdir)/ruby/internal/dosish.h +bubblebabble.o: $(hdrdir)/ruby/internal/error.h +bubblebabble.o: $(hdrdir)/ruby/internal/eval.h +bubblebabble.o: $(hdrdir)/ruby/internal/event.h +bubblebabble.o: $(hdrdir)/ruby/internal/fl_type.h +bubblebabble.o: $(hdrdir)/ruby/internal/gc.h +bubblebabble.o: $(hdrdir)/ruby/internal/glob.h +bubblebabble.o: $(hdrdir)/ruby/internal/globals.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/attribute.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/builtin.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/c_attribute.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/extension.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/feature.h +bubblebabble.o: $(hdrdir)/ruby/internal/has/warning.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/array.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/bignum.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/class.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/compar.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/complex.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/cont.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/dir.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/enum.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/enumerator.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/error.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/eval.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/file.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/hash.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/io.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/load.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/marshal.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/numeric.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/object.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/parse.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/proc.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/process.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/random.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/range.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/rational.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/re.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/ruby.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/select.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/set.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/signal.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/sprintf.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/string.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/struct.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/thread.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/time.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/variable.h +bubblebabble.o: $(hdrdir)/ruby/internal/intern/vm.h +bubblebabble.o: $(hdrdir)/ruby/internal/interpreter.h +bubblebabble.o: $(hdrdir)/ruby/internal/iterator.h +bubblebabble.o: $(hdrdir)/ruby/internal/memory.h +bubblebabble.o: $(hdrdir)/ruby/internal/method.h +bubblebabble.o: $(hdrdir)/ruby/internal/module.h +bubblebabble.o: $(hdrdir)/ruby/internal/newobj.h +bubblebabble.o: $(hdrdir)/ruby/internal/scan_args.h +bubblebabble.o: $(hdrdir)/ruby/internal/special_consts.h +bubblebabble.o: $(hdrdir)/ruby/internal/static_assert.h +bubblebabble.o: $(hdrdir)/ruby/internal/stdalign.h +bubblebabble.o: $(hdrdir)/ruby/internal/stdbool.h +bubblebabble.o: $(hdrdir)/ruby/internal/stdckdint.h +bubblebabble.o: $(hdrdir)/ruby/internal/symbol.h +bubblebabble.o: $(hdrdir)/ruby/internal/value.h +bubblebabble.o: $(hdrdir)/ruby/internal/value_type.h +bubblebabble.o: $(hdrdir)/ruby/internal/variable.h +bubblebabble.o: $(hdrdir)/ruby/internal/warning_push.h +bubblebabble.o: $(hdrdir)/ruby/internal/xmalloc.h +bubblebabble.o: $(hdrdir)/ruby/missing.h +bubblebabble.o: $(hdrdir)/ruby/ruby.h +bubblebabble.o: $(hdrdir)/ruby/st.h +bubblebabble.o: $(hdrdir)/ruby/subst.h +bubblebabble.o: $(srcdir)/../digest.h +bubblebabble.o: bubblebabble.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/bubblebabble/extconf.rb b/ext/digest/bubblebabble/extconf.rb index 53cb83934a..8fb001c61d 100644 --- a/ext/digest/bubblebabble/extconf.rb +++ b/ext/digest/bubblebabble/extconf.rb @@ -1,6 +1,4 @@ +# frozen_string_literal: false require 'mkmf' -$defs << "-DHAVE_CONFIG_H" -$INCFLAGS << " -I$(srcdir)/.." - create_makefile('digest/bubblebabble') diff --git a/ext/digest/defs.h b/ext/digest/defs.h index b9a3470e65..9b11f4eca9 100644 --- a/ext/digest/defs.h +++ b/ext/digest/defs.h @@ -16,18 +16,26 @@ # define __END_DECLS #endif -#if defined(HAVE_INTTYPES_H) -# include <inttypes.h> -#elif !defined __CYGWIN__ || !defined __uint8_t_defined - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; -# if SIZEOF_LONG == 8 - typedef unsigned long uint64_t; -# elif SIZEOF_LONG_LONG == 8 - typedef unsigned LONG_LONG uint64_t; -# else -# define NO_UINT64_T -# endif +#define RB_DIGEST_DIAGNOSTIC(compiler, op, flag) _Pragma(STRINGIZE(compiler diagnostic op flag)) +#ifdef RBIMPL_WARNING_IGNORED +# define RB_DIGEST_WARNING_IGNORED(flag) RBIMPL_WARNING_IGNORED(flag) +# define RB_DIGEST_WARNING_PUSH() RBIMPL_WARNING_PUSH() +# define RB_DIGEST_WARNING_POP() RBIMPL_WARNING_POP() +#elif defined(__clang__) +# define RB_DIGEST_WARNING_IGNORED(flag) RB_DIGEST_DIAGNOSTIC(clang, ignored, #flag) +# define RB_DIGEST_WARNING_PUSH() _Pragma("clang diagnostic push") +# define RB_DIGEST_WARNING_POP() _Pragma("clang diagnostic pop") +#else /* __GNUC__ */ +# define RB_DIGEST_WARNING_IGNORED(flag) RB_DIGEST_DIAGNOSTIC(GCC, ignored, #flag) +# define RB_DIGEST_WARNING_PUSH() _Pragma("GCC diagnostic push") +# define RB_DIGEST_WARNING_POP() _Pragma("GCC diagnostic pop") +#endif +#ifdef RBIMPL_HAS_WARNING +# define RB_DIGEST_HAS_WARNING(_) RBIMPL_HAS_WARNING(_) +#elif defined(__has_warning) +# define RB_DIGEST_HAS_WARNING(_) __has_warning(_) +#else +# define RB_DIGEST_HAS_WARNING(_) 0 #endif #endif /* DEFS_H */ diff --git a/ext/digest/depend b/ext/digest/depend index 43601a208f..3eabb1d1d6 100644 --- a/ext/digest/depend +++ b/ext/digest/depend @@ -1,2 +1,164 @@ -digest.o: digest.c digest.h $(hdrdir)/ruby.h $(topdir)/config.h \ - $(hdrdir)/defines.h $(hdrdir)/intern.h +# AUTOGENERATED DEPENDENCIES START +digest.o: $(RUBY_EXTCONF_H) +digest.o: $(arch_hdrdir)/ruby/config.h +digest.o: $(hdrdir)/ruby.h +digest.o: $(hdrdir)/ruby/assert.h +digest.o: $(hdrdir)/ruby/backward.h +digest.o: $(hdrdir)/ruby/backward/2/assume.h +digest.o: $(hdrdir)/ruby/backward/2/attributes.h +digest.o: $(hdrdir)/ruby/backward/2/bool.h +digest.o: $(hdrdir)/ruby/backward/2/inttypes.h +digest.o: $(hdrdir)/ruby/backward/2/limits.h +digest.o: $(hdrdir)/ruby/backward/2/long_long.h +digest.o: $(hdrdir)/ruby/backward/2/stdalign.h +digest.o: $(hdrdir)/ruby/backward/2/stdarg.h +digest.o: $(hdrdir)/ruby/defines.h +digest.o: $(hdrdir)/ruby/intern.h +digest.o: $(hdrdir)/ruby/internal/abi.h +digest.o: $(hdrdir)/ruby/internal/anyargs.h +digest.o: $(hdrdir)/ruby/internal/arithmetic.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/char.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/double.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/int.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/long.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/short.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +digest.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +digest.o: $(hdrdir)/ruby/internal/assume.h +digest.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +digest.o: $(hdrdir)/ruby/internal/attr/artificial.h +digest.o: $(hdrdir)/ruby/internal/attr/cold.h +digest.o: $(hdrdir)/ruby/internal/attr/const.h +digest.o: $(hdrdir)/ruby/internal/attr/constexpr.h +digest.o: $(hdrdir)/ruby/internal/attr/deprecated.h +digest.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +digest.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +digest.o: $(hdrdir)/ruby/internal/attr/error.h +digest.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +digest.o: $(hdrdir)/ruby/internal/attr/forceinline.h +digest.o: $(hdrdir)/ruby/internal/attr/format.h +digest.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +digest.o: $(hdrdir)/ruby/internal/attr/noalias.h +digest.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +digest.o: $(hdrdir)/ruby/internal/attr/noexcept.h +digest.o: $(hdrdir)/ruby/internal/attr/noinline.h +digest.o: $(hdrdir)/ruby/internal/attr/nonnull.h +digest.o: $(hdrdir)/ruby/internal/attr/noreturn.h +digest.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +digest.o: $(hdrdir)/ruby/internal/attr/pure.h +digest.o: $(hdrdir)/ruby/internal/attr/restrict.h +digest.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +digest.o: $(hdrdir)/ruby/internal/attr/warning.h +digest.o: $(hdrdir)/ruby/internal/attr/weakref.h +digest.o: $(hdrdir)/ruby/internal/cast.h +digest.o: $(hdrdir)/ruby/internal/compiler_is.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +digest.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +digest.o: $(hdrdir)/ruby/internal/compiler_since.h +digest.o: $(hdrdir)/ruby/internal/config.h +digest.o: $(hdrdir)/ruby/internal/constant_p.h +digest.o: $(hdrdir)/ruby/internal/core.h +digest.o: $(hdrdir)/ruby/internal/core/rarray.h +digest.o: $(hdrdir)/ruby/internal/core/rbasic.h +digest.o: $(hdrdir)/ruby/internal/core/rbignum.h +digest.o: $(hdrdir)/ruby/internal/core/rclass.h +digest.o: $(hdrdir)/ruby/internal/core/rdata.h +digest.o: $(hdrdir)/ruby/internal/core/rfile.h +digest.o: $(hdrdir)/ruby/internal/core/rhash.h +digest.o: $(hdrdir)/ruby/internal/core/robject.h +digest.o: $(hdrdir)/ruby/internal/core/rregexp.h +digest.o: $(hdrdir)/ruby/internal/core/rstring.h +digest.o: $(hdrdir)/ruby/internal/core/rstruct.h +digest.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +digest.o: $(hdrdir)/ruby/internal/ctype.h +digest.o: $(hdrdir)/ruby/internal/dllexport.h +digest.o: $(hdrdir)/ruby/internal/dosish.h +digest.o: $(hdrdir)/ruby/internal/error.h +digest.o: $(hdrdir)/ruby/internal/eval.h +digest.o: $(hdrdir)/ruby/internal/event.h +digest.o: $(hdrdir)/ruby/internal/fl_type.h +digest.o: $(hdrdir)/ruby/internal/gc.h +digest.o: $(hdrdir)/ruby/internal/glob.h +digest.o: $(hdrdir)/ruby/internal/globals.h +digest.o: $(hdrdir)/ruby/internal/has/attribute.h +digest.o: $(hdrdir)/ruby/internal/has/builtin.h +digest.o: $(hdrdir)/ruby/internal/has/c_attribute.h +digest.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +digest.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +digest.o: $(hdrdir)/ruby/internal/has/extension.h +digest.o: $(hdrdir)/ruby/internal/has/feature.h +digest.o: $(hdrdir)/ruby/internal/has/warning.h +digest.o: $(hdrdir)/ruby/internal/intern/array.h +digest.o: $(hdrdir)/ruby/internal/intern/bignum.h +digest.o: $(hdrdir)/ruby/internal/intern/class.h +digest.o: $(hdrdir)/ruby/internal/intern/compar.h +digest.o: $(hdrdir)/ruby/internal/intern/complex.h +digest.o: $(hdrdir)/ruby/internal/intern/cont.h +digest.o: $(hdrdir)/ruby/internal/intern/dir.h +digest.o: $(hdrdir)/ruby/internal/intern/enum.h +digest.o: $(hdrdir)/ruby/internal/intern/enumerator.h +digest.o: $(hdrdir)/ruby/internal/intern/error.h +digest.o: $(hdrdir)/ruby/internal/intern/eval.h +digest.o: $(hdrdir)/ruby/internal/intern/file.h +digest.o: $(hdrdir)/ruby/internal/intern/hash.h +digest.o: $(hdrdir)/ruby/internal/intern/io.h +digest.o: $(hdrdir)/ruby/internal/intern/load.h +digest.o: $(hdrdir)/ruby/internal/intern/marshal.h +digest.o: $(hdrdir)/ruby/internal/intern/numeric.h +digest.o: $(hdrdir)/ruby/internal/intern/object.h +digest.o: $(hdrdir)/ruby/internal/intern/parse.h +digest.o: $(hdrdir)/ruby/internal/intern/proc.h +digest.o: $(hdrdir)/ruby/internal/intern/process.h +digest.o: $(hdrdir)/ruby/internal/intern/random.h +digest.o: $(hdrdir)/ruby/internal/intern/range.h +digest.o: $(hdrdir)/ruby/internal/intern/rational.h +digest.o: $(hdrdir)/ruby/internal/intern/re.h +digest.o: $(hdrdir)/ruby/internal/intern/ruby.h +digest.o: $(hdrdir)/ruby/internal/intern/select.h +digest.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +digest.o: $(hdrdir)/ruby/internal/intern/set.h +digest.o: $(hdrdir)/ruby/internal/intern/signal.h +digest.o: $(hdrdir)/ruby/internal/intern/sprintf.h +digest.o: $(hdrdir)/ruby/internal/intern/string.h +digest.o: $(hdrdir)/ruby/internal/intern/struct.h +digest.o: $(hdrdir)/ruby/internal/intern/thread.h +digest.o: $(hdrdir)/ruby/internal/intern/time.h +digest.o: $(hdrdir)/ruby/internal/intern/variable.h +digest.o: $(hdrdir)/ruby/internal/intern/vm.h +digest.o: $(hdrdir)/ruby/internal/interpreter.h +digest.o: $(hdrdir)/ruby/internal/iterator.h +digest.o: $(hdrdir)/ruby/internal/memory.h +digest.o: $(hdrdir)/ruby/internal/method.h +digest.o: $(hdrdir)/ruby/internal/module.h +digest.o: $(hdrdir)/ruby/internal/newobj.h +digest.o: $(hdrdir)/ruby/internal/scan_args.h +digest.o: $(hdrdir)/ruby/internal/special_consts.h +digest.o: $(hdrdir)/ruby/internal/static_assert.h +digest.o: $(hdrdir)/ruby/internal/stdalign.h +digest.o: $(hdrdir)/ruby/internal/stdbool.h +digest.o: $(hdrdir)/ruby/internal/stdckdint.h +digest.o: $(hdrdir)/ruby/internal/symbol.h +digest.o: $(hdrdir)/ruby/internal/value.h +digest.o: $(hdrdir)/ruby/internal/value_type.h +digest.o: $(hdrdir)/ruby/internal/variable.h +digest.o: $(hdrdir)/ruby/internal/warning_push.h +digest.o: $(hdrdir)/ruby/internal/xmalloc.h +digest.o: $(hdrdir)/ruby/missing.h +digest.o: $(hdrdir)/ruby/ruby.h +digest.o: $(hdrdir)/ruby/st.h +digest.o: $(hdrdir)/ruby/subst.h +digest.o: digest.c +digest.o: digest.h +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 0b910e8c47..28f6022754 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -29,6 +29,69 @@ RUBY_EXTERN void Init_digest_base(void); * Document-module: Digest * * This module provides a framework for message digest libraries. + * + * You may want to look at OpenSSL::Digest as it supports more algorithms. + * + * A cryptographic hash function is a procedure that takes data and returns a + * fixed bit string: the hash value, also known as _digest_. Hash functions + * are also called one-way functions, it is easy to compute a digest from + * a message, but it is infeasible to generate a message from a digest. + * + * == Examples + * + * require 'digest' + * + * # Compute a complete digest + * Digest::SHA256.digest 'message' #=> "\xABS\n\x13\xE4Y..." + * + * sha256 = Digest::SHA256.new + * sha256.digest 'message' #=> "\xABS\n\x13\xE4Y..." + * + * # Other encoding formats + * Digest::SHA256.hexdigest 'message' #=> "ab530a13e459..." + * Digest::SHA256.base64digest 'message' #=> "q1MKE+RZFJgr..." + * + * # Compute digest by chunks + * md5 = Digest::MD5.new + * md5.update 'message1' + * md5 << 'message2' # << is an alias for update + * + * md5.hexdigest #=> "94af09c09bb9..." + * + * # Compute digest for a file + * sha256 = Digest::SHA256.file 'testfile' + * sha256.hexdigest + * + * Additionally digests can be encoded in "bubble babble" format as a sequence + * of consonants and vowels which is more recognizable and comparable than a + * hexadecimal digest. + * + * require 'digest/bubblebabble' + * + * Digest::SHA256.bubblebabble 'message' #=> "xopoh-fedac-fenyh-..." + * + * See the bubble babble specification at + * http://web.mit.edu/kenta/www/one/bubblebabble/spec/jrtrjwzi/draft-huima-01.txt. + * + * == Digest algorithms + * + * Different digest algorithms (or hash functions) are available: + * + * MD5:: + * See RFC 1321 The MD5 Message-Digest Algorithm + * RIPEMD-160:: + * As Digest::RMD160. + * See http://homes.esat.kuleuven.be/~bosselae/ripemd160.html. + * SHA1:: + * See FIPS 180 Secure Hash Standard. + * SHA2 family:: + * See FIPS 180 Secure Hash Standard which defines the following algorithms: + * * SHA512 + * * SHA384 + * * SHA256 + * + * The latest versions of the FIPS publications can be found here: + * http://csrc.nist.gov/publications/PubsFIPS.html. */ static VALUE @@ -36,7 +99,7 @@ hexencode_str_new(VALUE str_digest) { char *digest; size_t digest_len; - int i; + size_t i; VALUE str; char *p; static const char hex[] = { @@ -52,7 +115,7 @@ hexencode_str_new(VALUE str_digest) rb_raise(rb_eRuntimeError, "digest string too long"); } - str = rb_str_new(0, digest_len * 2); + str = rb_usascii_str_new(0, digest_len * 2); for (i = 0, p = RSTRING_PTR(str); i < digest_len; i++) { unsigned char byte = digest[i]; @@ -61,6 +124,8 @@ hexencode_str_new(VALUE str_digest) p[i + i + 1] = hex[byte & 0x0f]; } + RB_GC_GUARD(str_digest); + return str; } @@ -76,6 +141,8 @@ rb_digest_s_hexencode(VALUE klass, VALUE str) return hexencode_str_new(str); } +NORETURN(static void rb_digest_instance_method_unimpl(VALUE self, const char *method)); + /* * Document-module: Digest::Instance * @@ -83,6 +150,13 @@ rb_digest_s_hexencode(VALUE klass, VALUE str) * object to calculate message digest values. */ +static void +rb_digest_instance_method_unimpl(VALUE self, const char *method) +{ + rb_raise(rb_eRuntimeError, "%s does not implement %s()", + rb_obj_classname(self), method); +} + /* * call-seq: * digest_obj.update(string) -> digest_obj @@ -97,7 +171,9 @@ rb_digest_s_hexencode(VALUE klass, VALUE str) static VALUE rb_digest_instance_update(VALUE self, VALUE str) { - rb_raise(rb_eRuntimeError, "%s does not implement update()", RSTRING_PTR(rb_inspect(self))); + rb_digest_instance_method_unimpl(self, "update"); + + UNREACHABLE; } /* @@ -115,7 +191,9 @@ rb_digest_instance_update(VALUE self, VALUE str) static VALUE rb_digest_instance_finish(VALUE self) { - rb_raise(rb_eRuntimeError, "%s does not implement finish()", RSTRING_PTR(rb_inspect(self))); + rb_digest_instance_method_unimpl(self, "finish"); + + UNREACHABLE; } /* @@ -129,7 +207,9 @@ rb_digest_instance_finish(VALUE self) static VALUE rb_digest_instance_reset(VALUE self) { - rb_raise(rb_eRuntimeError, "%s does not implement reset()", RSTRING_PTR(rb_inspect(self))); + rb_digest_instance_method_unimpl(self, "reset"); + + UNREACHABLE; } /* @@ -170,10 +250,7 @@ rb_digest_instance_digest(int argc, VALUE *argv, VALUE self) value = rb_funcall(self, id_finish, 0); rb_funcall(self, id_reset, 0); } else { - VALUE clone = rb_obj_clone(self); - - value = rb_funcall(clone, id_finish, 0); - rb_funcall(clone, id_reset, 0); + value = rb_funcall(rb_obj_clone(self), id_finish, 0); } return value; @@ -218,10 +295,7 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self) value = rb_funcall(self, id_finish, 0); rb_funcall(self, id_reset, 0); } else { - VALUE clone = rb_obj_clone(self); - - value = rb_funcall(clone, id_finish, 0); - rb_funcall(clone, id_reset, 0); + value = rb_funcall(rb_obj_clone(self), id_finish, 0); } return hexencode_str_new(value); @@ -231,8 +305,8 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self) * call-seq: * digest_obj.hexdigest! -> string * - * Returns the resulting hash value and resets the digest to the - * initial state. + * Returns the resulting hash value in a hex-encoded form and resets + * the digest to the initial state. */ static VALUE rb_digest_instance_hexdigest_bang(VALUE self) @@ -266,7 +340,7 @@ rb_digest_instance_inspect(VALUE self) { VALUE str; size_t digest_len = 32; /* about this size at least */ - char *cname; + const char *cname; cname = rb_obj_classname(self); @@ -300,7 +374,8 @@ rb_digest_instance_equal(VALUE self, VALUE other) str2 = rb_digest_instance_digest(0, 0, other); } else { str1 = rb_digest_instance_to_s(self); - str2 = other; + str2 = rb_check_string_type(other); + if (NIL_P(str2)) return Qfalse; } /* never blindly assume that subclass methods return strings */ @@ -308,8 +383,8 @@ rb_digest_instance_equal(VALUE self, VALUE other) StringValue(str2); if (RSTRING_LEN(str1) == RSTRING_LEN(str2) && - rb_str_cmp(str1, str2) == 0) { - return Qtrue; + rb_str_cmp(str1, str2) == 0) { + return Qtrue; } return Qfalse; } @@ -331,7 +406,7 @@ rb_digest_instance_digest_length(VALUE self) /* never blindly assume that #digest() returns a string */ StringValue(digest); - return INT2NUM(RSTRING_LEN(digest)); + return LONG2NUM(RSTRING_LEN(digest)); } /* @@ -358,7 +433,9 @@ rb_digest_instance_length(VALUE self) static VALUE rb_digest_instance_block_length(VALUE self) { - rb_raise(rb_eRuntimeError, "%s does not implement block_length()", RSTRING_PTR(rb_inspect(self))); + rb_digest_instance_method_unimpl(self, "block_length"); + + UNREACHABLE; } /* @@ -409,7 +486,14 @@ rb_digest_class_s_digest(int argc, VALUE *argv, VALUE klass) static VALUE rb_digest_class_s_hexdigest(int argc, VALUE *argv, VALUE klass) { - return hexencode_str_new(rb_funcall2(klass, id_digest, argc, argv)); + return hexencode_str_new(rb_funcallv(klass, id_digest, argc, argv)); +} + +/* :nodoc: */ +static VALUE +rb_digest_class_init(VALUE self) +{ + return self; } /* @@ -417,29 +501,101 @@ rb_digest_class_s_hexdigest(int argc, VALUE *argv, VALUE klass) * * This abstract class provides a common interface to message digest * implementation classes written in C. + * + * ==Write a Digest subclass in C + * Digest::Base provides a common interface to message digest + * classes written in C. These classes must provide a struct + * of type rb_digest_metadata_t: + * typedef int (*rb_digest_hash_init_func_t)(void *); + * typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t); + * typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *); + * + * typedef struct { + * int api_version; + * size_t digest_len; + * size_t block_len; + * size_t ctx_size; + * rb_digest_hash_init_func_t init_func; + * rb_digest_hash_update_func_t update_func; + * rb_digest_hash_finish_func_t finish_func; + * } rb_digest_metadata_t; + * + * This structure must be set as an instance variable named +metadata+ + * (without the +@+ in front of the name). By example: + * 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, + * }; + * + * + * rb_ivar_set(cDigest_SHA1, rb_intern("metadata"), + * rb_digest_make_metadata(&sha1)); */ +#ifdef DIGEST_USE_RB_EXT_RESOLVE_SYMBOL +static const rb_data_type_t metadata_type = { + "digest/metadata", + {0}, +}; + +RUBY_FUNC_EXPORTED VALUE +rb_digest_wrap_metadata(const rb_digest_metadata_t *meta) +{ + return rb_obj_freeze(TypedData_Wrap_Struct(0, &metadata_type, (void *)meta)); +} +#endif + +static rb_digest_metadata_t * +get_metadata_ptr(VALUE obj) +{ + rb_digest_metadata_t *algo; + +#ifdef DIGEST_USE_RB_EXT_RESOLVE_SYMBOL + if (!rb_typeddata_is_kind_of(obj, &metadata_type)) return 0; + algo = RTYPEDDATA_DATA(obj); +#else +# undef RUBY_UNTYPED_DATA_WARNING +# define RUBY_UNTYPED_DATA_WARNING 0 + Data_Get_Struct(obj, rb_digest_metadata_t, algo); +#endif + + return algo; +} + static rb_digest_metadata_t * get_digest_base_metadata(VALUE klass) { VALUE p; - VALUE obj; + VALUE obj = Qnil; rb_digest_metadata_t *algo; - for (p = klass; p; p = RCLASS(p)->super) { + for (p = klass; !NIL_P(p); p = rb_class_superclass(p)) { if (rb_ivar_defined(p, id_metadata)) { obj = rb_ivar_get(p, id_metadata); break; } } - if (!p) + if (NIL_P(p)) rb_raise(rb_eRuntimeError, "Digest::Base cannot be directly inherited in Ruby"); - Data_Get_Struct(obj, rb_digest_metadata_t, algo); + algo = get_metadata_ptr(obj); + if (!algo) { + if (p == klass) + rb_raise(rb_eTypeError, "%"PRIsVALUE"::metadata is not initialized properly", + klass); + else + rb_raise(rb_eTypeError, "%"PRIsVALUE"(%"PRIsVALUE")::metadata is not initialized properly", + klass, p); + } switch (algo->api_version) { - case 2: + case 3: break; /* @@ -453,6 +609,27 @@ get_digest_base_metadata(VALUE klass) return algo; } +static rb_digest_metadata_t * +get_digest_obj_metadata(VALUE obj) +{ + return get_digest_base_metadata(rb_obj_class(obj)); +} + +static const rb_data_type_t digest_type = { + "digest", + {0, RUBY_TYPED_DEFAULT_FREE, 0,}, + 0, 0, + (RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED), +}; + +static inline void +algo_init(const rb_digest_metadata_t *algo, void *pctx) +{ + if (algo->init_func(pctx) != 1) { + rb_raise(rb_eRuntimeError, "Digest initialization failed."); + } +} + static VALUE rb_digest_base_alloc(VALUE klass) { @@ -461,15 +638,14 @@ rb_digest_base_alloc(VALUE klass) void *pctx; if (klass == rb_cDigest_Base) { - rb_raise(rb_eNotImpError, "Digest::Base is an abstract class"); + rb_raise(rb_eNotImpError, "Digest::Base is an abstract class"); } algo = get_digest_base_metadata(klass); - pctx = xmalloc(algo->ctx_size); - algo->init_func(pctx); - - obj = Data_Wrap_Struct(klass, 0, free, pctx); + obj = rb_data_typed_object_zalloc(klass, algo->ctx_size, &digest_type); + pctx = RTYPEDDATA_DATA(obj); + algo_init(algo, pctx); return obj; } @@ -485,44 +661,57 @@ rb_digest_base_copy(VALUE copy, VALUE obj) rb_check_frozen(copy); - algo = get_digest_base_metadata(rb_obj_class(copy)); + algo = get_digest_obj_metadata(copy); + if (algo != get_digest_obj_metadata(obj)) + rb_raise(rb_eTypeError, "different algorithms"); - Data_Get_Struct(obj, void, pctx1); - Data_Get_Struct(copy, void, pctx2); + TypedData_Get_Struct(obj, void, &digest_type, pctx1); + TypedData_Get_Struct(copy, void, &digest_type, pctx2); memcpy(pctx2, pctx1, algo->ctx_size); return copy; } -/* :nodoc: */ +/* + * call-seq: digest_base.reset -> digest_base + * + * Reset the digest to its initial state and return +self+. + */ static VALUE rb_digest_base_reset(VALUE self) { rb_digest_metadata_t *algo; void *pctx; - algo = get_digest_base_metadata(rb_obj_class(self)); + algo = get_digest_obj_metadata(self); - Data_Get_Struct(self, void, pctx); + TypedData_Get_Struct(self, void, &digest_type, pctx); - algo->init_func(pctx); + algo_init(algo, pctx); return self; } -/* :nodoc: */ +/* + * call-seq: + * digest_base.update(string) -> digest_base + * digest_base << string -> digest_base + * + * Update the digest using given _string_ and return +self+. + */ static VALUE rb_digest_base_update(VALUE self, VALUE str) { rb_digest_metadata_t *algo; void *pctx; - algo = get_digest_base_metadata(rb_obj_class(self)); + algo = get_digest_obj_metadata(self); - Data_Get_Struct(self, void, pctx); + TypedData_Get_Struct(self, void, &digest_type, pctx); StringValue(str); algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str)); + RB_GC_GUARD(str); return self; } @@ -535,56 +724,75 @@ rb_digest_base_finish(VALUE self) void *pctx; VALUE str; - algo = get_digest_base_metadata(rb_obj_class(self)); + algo = get_digest_obj_metadata(self); - Data_Get_Struct(self, void, pctx); + TypedData_Get_Struct(self, void, &digest_type, pctx); str = rb_str_new(0, algo->digest_len); algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str)); /* avoid potential coredump caused by use of a finished context */ - algo->init_func(pctx); + algo_init(algo, pctx); return str; } -/* :nodoc: */ +/* + * call-seq: digest_base.digest_length -> Integer + * + * Return the length of the hash value in bytes. + */ static VALUE rb_digest_base_digest_length(VALUE self) { rb_digest_metadata_t *algo; - algo = get_digest_base_metadata(rb_obj_class(self)); + algo = get_digest_obj_metadata(self); - return INT2NUM(algo->digest_len); + return SIZET2NUM(algo->digest_len); } -/* :nodoc: */ +/* + * call-seq: digest_base.block_length -> Integer + * + * Return the block length of the digest in bytes. + */ static VALUE rb_digest_base_block_length(VALUE self) { rb_digest_metadata_t *algo; - algo = get_digest_base_metadata(rb_obj_class(self)); + algo = get_digest_obj_metadata(self); - return INT2NUM(algo->block_len); + return SIZET2NUM(algo->block_len); } void Init_digest(void) { +#undef rb_intern id_reset = rb_intern("reset"); id_update = rb_intern("update"); id_finish = rb_intern("finish"); id_digest = rb_intern("digest"); id_hexdigest = rb_intern("hexdigest"); id_digest_length = rb_intern("digest_length"); + id_metadata = rb_id_metadata(); + InitVM(digest); +} +void +InitVM_digest(void) +{ /* * module Digest */ rb_mDigest = rb_define_module("Digest"); +#ifdef HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); +#endif + /* module functions */ rb_define_module_function(rb_mDigest, "hexencode", rb_digest_s_hexencode, 1); @@ -619,14 +827,13 @@ Init_digest(void) * class Digest::Class */ rb_cDigest_Class = rb_define_class_under(rb_mDigest, "Class", rb_cObject); + rb_define_method(rb_cDigest_Class, "initialize", rb_digest_class_init, 0); rb_include_module(rb_cDigest_Class, rb_mDigest_Instance); /* class methods */ rb_define_singleton_method(rb_cDigest_Class, "digest", rb_digest_class_s_digest, -1); rb_define_singleton_method(rb_cDigest_Class, "hexdigest", rb_digest_class_s_hexdigest, -1); - id_metadata = rb_intern("metadata"); - /* class Digest::Base < Digest::Class */ rb_cDigest_Base = rb_define_class_under(rb_mDigest, "Base", rb_cDigest_Class); diff --git a/ext/digest/digest.gemspec b/ext/digest/digest.gemspec new file mode 100644 index 0000000000..4a01c5fde1 --- /dev/null +++ b/ext/digest/digest.gemspec @@ -0,0 +1,44 @@ +# coding: utf-8 +# frozen_string_literal: true + +Gem::Specification.new do |spec| + version_module = Module.new do + version_rb = File.join(__dir__, "lib/digest/version.rb") + module_eval(File.read(version_rb), version_rb) + end + + spec.name = "digest" + spec.version = version_module::Digest::VERSION + spec.authors = ["Akinori MUSHA"] + spec.email = ["knu@idaemons.org"] + + spec.summary = %q{Provides a framework for message digest libraries.} + spec.description = %q{Provides a framework for message digest libraries.} + spec.homepage = "https://github.com/ruby/digest" + spec.licenses = ["Ruby", "BSD-2-Clause"] + + spec.files = [ + "LICENSE.txt", + "README.md", + *Dir["lib/digest{.rb,/**/*.rb}"], + ] + + spec.required_ruby_version = ">= 2.5.0" + + spec.bindir = "exe" + spec.executables = [] + + if Gem::Platform === spec.platform and spec.platform =~ 'java' or RUBY_ENGINE == 'jruby' + spec.platform = 'java' + + spec.files += Dir["ext/java/**/*.{rb,java}", "lib/digest.jar"] + spec.require_paths = %w[lib ext/java/org/jruby/ext/digest/lib] + else + spec.extensions = Dir["ext/digest/**/extconf.rb"] + + spec.files += Dir["ext/digest/**/{*.{rb,c,h,sh},depend}"] + spec.require_paths = %w[lib] + end + + spec.metadata["msys2_mingw_dependencies"] = "openssl" +end diff --git a/ext/digest/digest.h b/ext/digest/digest.h index 6e4906c859..c5c37583a6 100644 --- a/ext/digest/digest.h +++ b/ext/digest/digest.h @@ -15,11 +15,11 @@ #include "ruby.h" -#define RUBY_DIGEST_API_VERSION 2 +#define RUBY_DIGEST_API_VERSION 3 -typedef void (*rb_digest_hash_init_func_t)(void *); +typedef int (*rb_digest_hash_init_func_t)(void *); typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t); -typedef void (*rb_digest_hash_finish_func_t)(void *, unsigned char *); +typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *); typedef struct { int api_version; @@ -30,3 +30,77 @@ typedef struct { rb_digest_hash_update_func_t update_func; rb_digest_hash_finish_func_t finish_func; } rb_digest_metadata_t; + +#define DEFINE_UPDATE_FUNC_FOR_UINT(name) \ +void \ +rb_digest_##name##_update(void *ctx, unsigned char *ptr, size_t size) \ +{ \ + const unsigned int stride = 16384; \ + \ + for (; size > stride; size -= stride, ptr += stride) { \ + name##_Update(ctx, ptr, stride); \ + } \ + /* Since size <= stride, size should fit into an unsigned int */ \ + if (size > 0) name##_Update(ctx, ptr, (unsigned int)size); \ +} + +#define DEFINE_FINISH_FUNC_FROM_FINAL(name) \ +int \ +rb_digest_##name##_finish(void *ctx, unsigned char *ptr) \ +{ \ + return name##_Final(ptr, ctx); \ +} + +static inline VALUE +rb_digest_namespace(void) +{ + rb_require("digest"); + return rb_path2class("Digest"); +} + +static inline ID +rb_id_metadata(void) +{ + return rb_intern_const("metadata"); +} + +#if !defined(HAVE_RB_EXT_RESOLVE_SYMBOL) +#elif !defined(RUBY_UNTYPED_DATA_WARNING) +# error RUBY_UNTYPED_DATA_WARNING is not defined +#elif RUBY_UNTYPED_DATA_WARNING +/* rb_ext_resolve_symbol() has been defined since Ruby 3.3, but digest + * bundled with 3.3 didn't use it. */ +# define DIGEST_USE_RB_EXT_RESOLVE_SYMBOL 1 +#endif + +static inline VALUE +rb_digest_make_metadata(const rb_digest_metadata_t *meta) +{ +#if defined(EXTSTATIC) && EXTSTATIC + /* The extension is built as a static library, so safe to refer to + * rb_digest_wrap_metadata directly. */ + extern VALUE rb_digest_wrap_metadata(const rb_digest_metadata_t *meta); + return rb_digest_wrap_metadata(meta); +#else + /* The extension is built as a shared library, so we can't refer + * to rb_digest_wrap_metadata directly. */ +# ifdef DIGEST_USE_RB_EXT_RESOLVE_SYMBOL + /* If rb_ext_resolve_symbol() is available, use it to get the address of + * rb_digest_wrap_metadata. */ + typedef VALUE (*wrapper_func_type)(const rb_digest_metadata_t *meta); + static wrapper_func_type wrapper; + if (!wrapper) { + wrapper = (wrapper_func_type)(uintptr_t) + rb_ext_resolve_symbol("digest.so", "rb_digest_wrap_metadata"); + if (!wrapper) rb_raise(rb_eLoadError, "rb_digest_wrap_metadata not found"); + } + return wrapper(meta); +# else + /* If rb_ext_resolve_symbol() is not available, keep using untyped + * data. */ +# undef RUBY_UNTYPED_DATA_WARNING +# define RUBY_UNTYPED_DATA_WARNING 0 + return rb_obj_freeze(Data_Wrap_Struct(0, 0, 0, (void *)meta)); +# endif +#endif +} diff --git a/ext/digest/digest_conf.rb b/ext/digest/digest_conf.rb new file mode 100644 index 0000000000..099d20fcbe --- /dev/null +++ b/ext/digest/digest_conf.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: false + +def digest_conf(name) + unless with_config("bundled-#{name}") + case cc = with_config("common-digest", true) + when true, false + else + cc = cc.split(/[\s,]++/).any? {|pat| File.fnmatch?(pat, name)} + end + if cc and File.exist?("#$srcdir/#{name}cc.h") and + have_header("CommonCrypto/CommonDigest.h") + $defs << "-D#{name.upcase}_USE_COMMONDIGEST" + $headers << "#{name}cc.h" + return :commondigest + end + end + $objs << "#{name}.#{$OBJEXT}" + return +end diff --git a/ext/digest/extconf.rb b/ext/digest/extconf.rb index cf9127ecc0..0e5f08d794 100644 --- a/ext/digest/extconf.rb +++ b/ext/digest/extconf.rb @@ -1,10 +1,11 @@ +# frozen_string_literal: false # $RoughId: extconf.rb,v 1.6 2001/07/13 15:38:27 knu Exp $ # $Id$ require "mkmf" $INSTALLFILES = { - "digest.h" => "$(RUBYARCHDIR)" -} + "digest.h" => "$(HDRDIR)" +} if $extmk create_makefile("digest") diff --git a/ext/digest/lib/digest.rb b/ext/digest/lib/digest.rb index 0c4ee3c2cc..e995adb450 100644 --- a/ext/digest/lib/digest.rb +++ b/ext/digest/lib/digest.rb @@ -1,17 +1,35 @@ -require 'digest.so' +# frozen_string_literal: false + +if defined?(Digest) && + /\A(?:2\.|3\.0\.[0-2]\z)/.match?(RUBY_VERSION) && + caller_locations.any? { |l| + %r{/(rubygems/gem_runner|bundler/cli)\.rb}.match?(l.path) + } + # Before Ruby 3.0.3/3.1.0, the gem and bundle commands used to load + # the digest library before loading additionally installed gems, so + # you will get constant redefinition warnings and unexpected + # implementation overwriting if we proceed here. Avoid that. + return +end + +require 'digest/version' +require 'digest/loader' module Digest - def self.const_missing(name) + # A mutex for Digest(). + REQUIRE_MUTEX = Thread::Mutex.new + + def self.const_missing(name) # :nodoc: case name when :SHA256, :SHA384, :SHA512 - lib = 'digest/sha2.so' + lib = 'digest/sha2' else lib = File.join('digest', name.to_s.downcase) end begin require lib - rescue LoadError => e + rescue LoadError raise LoadError, "library not found for class Digest::#{name} -- #{lib}", caller(1) end unless Digest.const_defined?(name) @@ -21,17 +39,26 @@ module Digest end class ::Digest::Class - # creates a digest object and reads a given file, _name_. - # - # p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest - # # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534" - def self.file(name) - new.file(name) + # Creates a digest object and reads a given file, _name_. + # Optional arguments are passed to the constructor of the digest + # class. + # + # p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest + # # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534" + def self.file(name, *args) + new(*args).file(name) + end + + # Returns the base64 encoded hash value of a given _string_. The + # return value is properly padded with '=' and contains no line + # feeds. + def self.base64digest(str, *args) + [digest(str, *args)].pack('m0') end end module Instance - # updates the digest with the contents of a given file _name_ and + # Updates the digest with the contents of a given file _name_ and # returns self. def file(name) File.open(name, "rb") {|f| @@ -42,9 +69,55 @@ module Digest } self end + + # If none is given, returns the resulting hash value of the digest + # in a base64 encoded form, keeping the digest's state. + # + # If a +string+ is given, returns the hash value for the given + # +string+ in a base64 encoded form, resetting the digest to the + # initial state before and after the process. + # + # In either case, the return value is properly padded with '=' and + # contains no line feeds. + def base64digest(str = nil) + [str ? digest(str) : digest].pack('m0') + end + + # Returns the resulting hash value and resets the digest to the + # initial state. + def base64digest! + [digest!].pack('m0') + end end end +# call-seq: +# Digest(name) -> digest_subclass +# +# Returns a Digest subclass by +name+ in a thread-safe manner even +# when on-demand loading is involved. +# +# require 'digest' +# +# Digest("MD5") +# # => Digest::MD5 +# +# Digest(:SHA256) +# # => Digest::SHA256 +# +# Digest(:Foo) +# # => LoadError: library not found for class Digest::Foo -- digest/foo def Digest(name) - Digest.const_get(name) + const = name.to_sym + Digest::REQUIRE_MUTEX.synchronize { + # Ignore autoload's because it is void when we have #const_missing + Digest.const_missing(const) + } +rescue LoadError + # Constants do not necessarily rely on digest/*. + if Digest.const_defined?(const) + Digest.const_get(const) + else + raise + end end diff --git a/ext/digest/lib/digest/loader.rb b/ext/digest/lib/digest/loader.rb new file mode 100644 index 0000000000..6b989e07be --- /dev/null +++ b/ext/digest/lib/digest/loader.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require 'digest.so' diff --git a/ext/digest/lib/digest/version.rb b/ext/digest/lib/digest/version.rb new file mode 100644 index 0000000000..a56e80c54e --- /dev/null +++ b/ext/digest/lib/digest/version.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module Digest + # The version string + VERSION = "3.2.1" +end diff --git a/ext/digest/lib/md5.rb b/ext/digest/lib/md5.rb deleted file mode 100644 index c399f2de1d..0000000000 --- a/ext/digest/lib/md5.rb +++ /dev/null @@ -1,23 +0,0 @@ -# just for compatibility; requiring "md5" is obsoleted -# -# $RoughId: md5.rb,v 1.4 2001/07/13 15:38:27 knu Exp $ -# $Id$ - -require 'digest/md5' - -class MD5 < Digest::MD5 - class << self - alias orig_new new - def new(str = nil) - if str - orig_new.update(str) - else - orig_new - end - end - - def md5(*args) - new(*args) - end - end -end diff --git a/ext/digest/lib/sha1.rb b/ext/digest/lib/sha1.rb deleted file mode 100644 index 4446e12e8d..0000000000 --- a/ext/digest/lib/sha1.rb +++ /dev/null @@ -1,23 +0,0 @@ -# just for compatibility; requiring "sha1" is obsoleted -# -# $RoughId: sha1.rb,v 1.4 2001/07/13 15:38:27 knu Exp $ -# $Id$ - -require 'digest/sha1' - -class SHA1 < Digest::SHA1 - class << self - alias orig_new new - def new(str = nil) - if str - orig_new.update(str) - else - orig_new - end - end - - def sha1(*args) - new(*args) - end - end -end diff --git a/ext/digest/md5/.cvsignore b/ext/digest/md5/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/md5/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/md5/depend b/ext/digest/md5/depend index 8eaec20b4b..d1c25c28c8 100644 --- a/ext/digest/md5/depend +++ b/ext/digest/md5/depend @@ -1,6 +1,333 @@ -md5.o: md5.c md5.h $(srcdir)/../defs.h $(hdrdir)/ruby.h $(topdir)/config.h \ - $(hdrdir)/defines.h $(hdrdir)/intern.h -md5init.o: md5init.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h md5.h \ - $(srcdir)/../defs.h -md5ossl.o: md5ossl.h +md5.o: md5.c md5.h $(srcdir)/../defs.h +md5init.o: $(LOCAL_HDRS) + +# AUTOGENERATED DEPENDENCIES START +md5.o: $(RUBY_EXTCONF_H) +md5.o: $(arch_hdrdir)/ruby/config.h +md5.o: $(hdrdir)/ruby.h +md5.o: $(hdrdir)/ruby/assert.h +md5.o: $(hdrdir)/ruby/backward.h +md5.o: $(hdrdir)/ruby/backward/2/assume.h +md5.o: $(hdrdir)/ruby/backward/2/attributes.h +md5.o: $(hdrdir)/ruby/backward/2/bool.h +md5.o: $(hdrdir)/ruby/backward/2/inttypes.h +md5.o: $(hdrdir)/ruby/backward/2/limits.h +md5.o: $(hdrdir)/ruby/backward/2/long_long.h +md5.o: $(hdrdir)/ruby/backward/2/stdalign.h +md5.o: $(hdrdir)/ruby/backward/2/stdarg.h +md5.o: $(hdrdir)/ruby/defines.h +md5.o: $(hdrdir)/ruby/intern.h +md5.o: $(hdrdir)/ruby/internal/abi.h +md5.o: $(hdrdir)/ruby/internal/anyargs.h +md5.o: $(hdrdir)/ruby/internal/arithmetic.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/char.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/double.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/int.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/long.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/short.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +md5.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +md5.o: $(hdrdir)/ruby/internal/assume.h +md5.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +md5.o: $(hdrdir)/ruby/internal/attr/artificial.h +md5.o: $(hdrdir)/ruby/internal/attr/cold.h +md5.o: $(hdrdir)/ruby/internal/attr/const.h +md5.o: $(hdrdir)/ruby/internal/attr/constexpr.h +md5.o: $(hdrdir)/ruby/internal/attr/deprecated.h +md5.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +md5.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +md5.o: $(hdrdir)/ruby/internal/attr/error.h +md5.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +md5.o: $(hdrdir)/ruby/internal/attr/forceinline.h +md5.o: $(hdrdir)/ruby/internal/attr/format.h +md5.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +md5.o: $(hdrdir)/ruby/internal/attr/noalias.h +md5.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +md5.o: $(hdrdir)/ruby/internal/attr/noexcept.h +md5.o: $(hdrdir)/ruby/internal/attr/noinline.h +md5.o: $(hdrdir)/ruby/internal/attr/nonnull.h +md5.o: $(hdrdir)/ruby/internal/attr/noreturn.h +md5.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +md5.o: $(hdrdir)/ruby/internal/attr/pure.h +md5.o: $(hdrdir)/ruby/internal/attr/restrict.h +md5.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +md5.o: $(hdrdir)/ruby/internal/attr/warning.h +md5.o: $(hdrdir)/ruby/internal/attr/weakref.h +md5.o: $(hdrdir)/ruby/internal/cast.h +md5.o: $(hdrdir)/ruby/internal/compiler_is.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +md5.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +md5.o: $(hdrdir)/ruby/internal/compiler_since.h +md5.o: $(hdrdir)/ruby/internal/config.h +md5.o: $(hdrdir)/ruby/internal/constant_p.h +md5.o: $(hdrdir)/ruby/internal/core.h +md5.o: $(hdrdir)/ruby/internal/core/rarray.h +md5.o: $(hdrdir)/ruby/internal/core/rbasic.h +md5.o: $(hdrdir)/ruby/internal/core/rbignum.h +md5.o: $(hdrdir)/ruby/internal/core/rclass.h +md5.o: $(hdrdir)/ruby/internal/core/rdata.h +md5.o: $(hdrdir)/ruby/internal/core/rfile.h +md5.o: $(hdrdir)/ruby/internal/core/rhash.h +md5.o: $(hdrdir)/ruby/internal/core/robject.h +md5.o: $(hdrdir)/ruby/internal/core/rregexp.h +md5.o: $(hdrdir)/ruby/internal/core/rstring.h +md5.o: $(hdrdir)/ruby/internal/core/rstruct.h +md5.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +md5.o: $(hdrdir)/ruby/internal/ctype.h +md5.o: $(hdrdir)/ruby/internal/dllexport.h +md5.o: $(hdrdir)/ruby/internal/dosish.h +md5.o: $(hdrdir)/ruby/internal/error.h +md5.o: $(hdrdir)/ruby/internal/eval.h +md5.o: $(hdrdir)/ruby/internal/event.h +md5.o: $(hdrdir)/ruby/internal/fl_type.h +md5.o: $(hdrdir)/ruby/internal/gc.h +md5.o: $(hdrdir)/ruby/internal/glob.h +md5.o: $(hdrdir)/ruby/internal/globals.h +md5.o: $(hdrdir)/ruby/internal/has/attribute.h +md5.o: $(hdrdir)/ruby/internal/has/builtin.h +md5.o: $(hdrdir)/ruby/internal/has/c_attribute.h +md5.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +md5.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +md5.o: $(hdrdir)/ruby/internal/has/extension.h +md5.o: $(hdrdir)/ruby/internal/has/feature.h +md5.o: $(hdrdir)/ruby/internal/has/warning.h +md5.o: $(hdrdir)/ruby/internal/intern/array.h +md5.o: $(hdrdir)/ruby/internal/intern/bignum.h +md5.o: $(hdrdir)/ruby/internal/intern/class.h +md5.o: $(hdrdir)/ruby/internal/intern/compar.h +md5.o: $(hdrdir)/ruby/internal/intern/complex.h +md5.o: $(hdrdir)/ruby/internal/intern/cont.h +md5.o: $(hdrdir)/ruby/internal/intern/dir.h +md5.o: $(hdrdir)/ruby/internal/intern/enum.h +md5.o: $(hdrdir)/ruby/internal/intern/enumerator.h +md5.o: $(hdrdir)/ruby/internal/intern/error.h +md5.o: $(hdrdir)/ruby/internal/intern/eval.h +md5.o: $(hdrdir)/ruby/internal/intern/file.h +md5.o: $(hdrdir)/ruby/internal/intern/hash.h +md5.o: $(hdrdir)/ruby/internal/intern/io.h +md5.o: $(hdrdir)/ruby/internal/intern/load.h +md5.o: $(hdrdir)/ruby/internal/intern/marshal.h +md5.o: $(hdrdir)/ruby/internal/intern/numeric.h +md5.o: $(hdrdir)/ruby/internal/intern/object.h +md5.o: $(hdrdir)/ruby/internal/intern/parse.h +md5.o: $(hdrdir)/ruby/internal/intern/proc.h +md5.o: $(hdrdir)/ruby/internal/intern/process.h +md5.o: $(hdrdir)/ruby/internal/intern/random.h +md5.o: $(hdrdir)/ruby/internal/intern/range.h +md5.o: $(hdrdir)/ruby/internal/intern/rational.h +md5.o: $(hdrdir)/ruby/internal/intern/re.h +md5.o: $(hdrdir)/ruby/internal/intern/ruby.h +md5.o: $(hdrdir)/ruby/internal/intern/select.h +md5.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +md5.o: $(hdrdir)/ruby/internal/intern/set.h +md5.o: $(hdrdir)/ruby/internal/intern/signal.h +md5.o: $(hdrdir)/ruby/internal/intern/sprintf.h +md5.o: $(hdrdir)/ruby/internal/intern/string.h +md5.o: $(hdrdir)/ruby/internal/intern/struct.h +md5.o: $(hdrdir)/ruby/internal/intern/thread.h +md5.o: $(hdrdir)/ruby/internal/intern/time.h +md5.o: $(hdrdir)/ruby/internal/intern/variable.h +md5.o: $(hdrdir)/ruby/internal/intern/vm.h +md5.o: $(hdrdir)/ruby/internal/interpreter.h +md5.o: $(hdrdir)/ruby/internal/iterator.h +md5.o: $(hdrdir)/ruby/internal/memory.h +md5.o: $(hdrdir)/ruby/internal/method.h +md5.o: $(hdrdir)/ruby/internal/module.h +md5.o: $(hdrdir)/ruby/internal/newobj.h +md5.o: $(hdrdir)/ruby/internal/scan_args.h +md5.o: $(hdrdir)/ruby/internal/special_consts.h +md5.o: $(hdrdir)/ruby/internal/static_assert.h +md5.o: $(hdrdir)/ruby/internal/stdalign.h +md5.o: $(hdrdir)/ruby/internal/stdbool.h +md5.o: $(hdrdir)/ruby/internal/stdckdint.h +md5.o: $(hdrdir)/ruby/internal/symbol.h +md5.o: $(hdrdir)/ruby/internal/value.h +md5.o: $(hdrdir)/ruby/internal/value_type.h +md5.o: $(hdrdir)/ruby/internal/variable.h +md5.o: $(hdrdir)/ruby/internal/warning_push.h +md5.o: $(hdrdir)/ruby/internal/xmalloc.h +md5.o: $(hdrdir)/ruby/missing.h +md5.o: $(hdrdir)/ruby/ruby.h +md5.o: $(hdrdir)/ruby/st.h +md5.o: $(hdrdir)/ruby/subst.h +md5.o: $(srcdir)/../defs.h +md5.o: md5.c +md5.o: md5.h +md5init.o: $(RUBY_EXTCONF_H) +md5init.o: $(arch_hdrdir)/ruby/config.h +md5init.o: $(hdrdir)/ruby.h +md5init.o: $(hdrdir)/ruby/assert.h +md5init.o: $(hdrdir)/ruby/backward.h +md5init.o: $(hdrdir)/ruby/backward/2/assume.h +md5init.o: $(hdrdir)/ruby/backward/2/attributes.h +md5init.o: $(hdrdir)/ruby/backward/2/bool.h +md5init.o: $(hdrdir)/ruby/backward/2/inttypes.h +md5init.o: $(hdrdir)/ruby/backward/2/limits.h +md5init.o: $(hdrdir)/ruby/backward/2/long_long.h +md5init.o: $(hdrdir)/ruby/backward/2/stdalign.h +md5init.o: $(hdrdir)/ruby/backward/2/stdarg.h +md5init.o: $(hdrdir)/ruby/defines.h +md5init.o: $(hdrdir)/ruby/intern.h +md5init.o: $(hdrdir)/ruby/internal/abi.h +md5init.o: $(hdrdir)/ruby/internal/anyargs.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +md5init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +md5init.o: $(hdrdir)/ruby/internal/assume.h +md5init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +md5init.o: $(hdrdir)/ruby/internal/attr/artificial.h +md5init.o: $(hdrdir)/ruby/internal/attr/cold.h +md5init.o: $(hdrdir)/ruby/internal/attr/const.h +md5init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +md5init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +md5init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +md5init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +md5init.o: $(hdrdir)/ruby/internal/attr/error.h +md5init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +md5init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +md5init.o: $(hdrdir)/ruby/internal/attr/format.h +md5init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +md5init.o: $(hdrdir)/ruby/internal/attr/noalias.h +md5init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +md5init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +md5init.o: $(hdrdir)/ruby/internal/attr/noinline.h +md5init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +md5init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +md5init.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +md5init.o: $(hdrdir)/ruby/internal/attr/pure.h +md5init.o: $(hdrdir)/ruby/internal/attr/restrict.h +md5init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +md5init.o: $(hdrdir)/ruby/internal/attr/warning.h +md5init.o: $(hdrdir)/ruby/internal/attr/weakref.h +md5init.o: $(hdrdir)/ruby/internal/cast.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +md5init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +md5init.o: $(hdrdir)/ruby/internal/compiler_since.h +md5init.o: $(hdrdir)/ruby/internal/config.h +md5init.o: $(hdrdir)/ruby/internal/constant_p.h +md5init.o: $(hdrdir)/ruby/internal/core.h +md5init.o: $(hdrdir)/ruby/internal/core/rarray.h +md5init.o: $(hdrdir)/ruby/internal/core/rbasic.h +md5init.o: $(hdrdir)/ruby/internal/core/rbignum.h +md5init.o: $(hdrdir)/ruby/internal/core/rclass.h +md5init.o: $(hdrdir)/ruby/internal/core/rdata.h +md5init.o: $(hdrdir)/ruby/internal/core/rfile.h +md5init.o: $(hdrdir)/ruby/internal/core/rhash.h +md5init.o: $(hdrdir)/ruby/internal/core/robject.h +md5init.o: $(hdrdir)/ruby/internal/core/rregexp.h +md5init.o: $(hdrdir)/ruby/internal/core/rstring.h +md5init.o: $(hdrdir)/ruby/internal/core/rstruct.h +md5init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +md5init.o: $(hdrdir)/ruby/internal/ctype.h +md5init.o: $(hdrdir)/ruby/internal/dllexport.h +md5init.o: $(hdrdir)/ruby/internal/dosish.h +md5init.o: $(hdrdir)/ruby/internal/error.h +md5init.o: $(hdrdir)/ruby/internal/eval.h +md5init.o: $(hdrdir)/ruby/internal/event.h +md5init.o: $(hdrdir)/ruby/internal/fl_type.h +md5init.o: $(hdrdir)/ruby/internal/gc.h +md5init.o: $(hdrdir)/ruby/internal/glob.h +md5init.o: $(hdrdir)/ruby/internal/globals.h +md5init.o: $(hdrdir)/ruby/internal/has/attribute.h +md5init.o: $(hdrdir)/ruby/internal/has/builtin.h +md5init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +md5init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +md5init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +md5init.o: $(hdrdir)/ruby/internal/has/extension.h +md5init.o: $(hdrdir)/ruby/internal/has/feature.h +md5init.o: $(hdrdir)/ruby/internal/has/warning.h +md5init.o: $(hdrdir)/ruby/internal/intern/array.h +md5init.o: $(hdrdir)/ruby/internal/intern/bignum.h +md5init.o: $(hdrdir)/ruby/internal/intern/class.h +md5init.o: $(hdrdir)/ruby/internal/intern/compar.h +md5init.o: $(hdrdir)/ruby/internal/intern/complex.h +md5init.o: $(hdrdir)/ruby/internal/intern/cont.h +md5init.o: $(hdrdir)/ruby/internal/intern/dir.h +md5init.o: $(hdrdir)/ruby/internal/intern/enum.h +md5init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +md5init.o: $(hdrdir)/ruby/internal/intern/error.h +md5init.o: $(hdrdir)/ruby/internal/intern/eval.h +md5init.o: $(hdrdir)/ruby/internal/intern/file.h +md5init.o: $(hdrdir)/ruby/internal/intern/hash.h +md5init.o: $(hdrdir)/ruby/internal/intern/io.h +md5init.o: $(hdrdir)/ruby/internal/intern/load.h +md5init.o: $(hdrdir)/ruby/internal/intern/marshal.h +md5init.o: $(hdrdir)/ruby/internal/intern/numeric.h +md5init.o: $(hdrdir)/ruby/internal/intern/object.h +md5init.o: $(hdrdir)/ruby/internal/intern/parse.h +md5init.o: $(hdrdir)/ruby/internal/intern/proc.h +md5init.o: $(hdrdir)/ruby/internal/intern/process.h +md5init.o: $(hdrdir)/ruby/internal/intern/random.h +md5init.o: $(hdrdir)/ruby/internal/intern/range.h +md5init.o: $(hdrdir)/ruby/internal/intern/rational.h +md5init.o: $(hdrdir)/ruby/internal/intern/re.h +md5init.o: $(hdrdir)/ruby/internal/intern/ruby.h +md5init.o: $(hdrdir)/ruby/internal/intern/select.h +md5init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +md5init.o: $(hdrdir)/ruby/internal/intern/set.h +md5init.o: $(hdrdir)/ruby/internal/intern/signal.h +md5init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +md5init.o: $(hdrdir)/ruby/internal/intern/string.h +md5init.o: $(hdrdir)/ruby/internal/intern/struct.h +md5init.o: $(hdrdir)/ruby/internal/intern/thread.h +md5init.o: $(hdrdir)/ruby/internal/intern/time.h +md5init.o: $(hdrdir)/ruby/internal/intern/variable.h +md5init.o: $(hdrdir)/ruby/internal/intern/vm.h +md5init.o: $(hdrdir)/ruby/internal/interpreter.h +md5init.o: $(hdrdir)/ruby/internal/iterator.h +md5init.o: $(hdrdir)/ruby/internal/memory.h +md5init.o: $(hdrdir)/ruby/internal/method.h +md5init.o: $(hdrdir)/ruby/internal/module.h +md5init.o: $(hdrdir)/ruby/internal/newobj.h +md5init.o: $(hdrdir)/ruby/internal/scan_args.h +md5init.o: $(hdrdir)/ruby/internal/special_consts.h +md5init.o: $(hdrdir)/ruby/internal/static_assert.h +md5init.o: $(hdrdir)/ruby/internal/stdalign.h +md5init.o: $(hdrdir)/ruby/internal/stdbool.h +md5init.o: $(hdrdir)/ruby/internal/stdckdint.h +md5init.o: $(hdrdir)/ruby/internal/symbol.h +md5init.o: $(hdrdir)/ruby/internal/value.h +md5init.o: $(hdrdir)/ruby/internal/value_type.h +md5init.o: $(hdrdir)/ruby/internal/variable.h +md5init.o: $(hdrdir)/ruby/internal/warning_push.h +md5init.o: $(hdrdir)/ruby/internal/xmalloc.h +md5init.o: $(hdrdir)/ruby/missing.h +md5init.o: $(hdrdir)/ruby/ruby.h +md5init.o: $(hdrdir)/ruby/st.h +md5init.o: $(hdrdir)/ruby/subst.h +md5init.o: $(srcdir)/../defs.h +md5init.o: $(srcdir)/../digest.h +md5init.o: md5.h +md5init.o: md5cc.h +md5init.o: md5init.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/md5/extconf.rb b/ext/digest/md5/extconf.rb index 018f8ccb02..01658e1b60 100644 --- a/ext/digest/md5/extconf.rb +++ b/ext/digest/md5/extconf.rb @@ -1,29 +1,17 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: false # $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $ # $Id$ require "mkmf" - -$defs << "-DHAVE_CONFIG_H" -$INCFLAGS << " -I$(srcdir)/.." +require File.expand_path("../../digest_conf", __FILE__) $objs = [ "md5init.#{$OBJEXT}" ] -dir_config("openssl") - -if !with_config("bundled-md5") && - have_library("crypto") && have_header("openssl/md5.h") - $objs << "md5ossl.#{$OBJEXT}" - -else - $objs << "md5.#{$OBJEXT}" -end +digest_conf("md5") have_header("sys/cdefs.h") -have_header("inttypes.h") - -have_header("unistd.h") - $preload = %w[digest] create_makefile("digest/md5") diff --git a/ext/digest/md5/md5.c b/ext/digest/md5/md5.c index 993bc47a06..3a7fe2cdad 100644 --- a/ext/digest/md5/md5.c +++ b/ext/digest/md5/md5.c @@ -60,7 +60,8 @@ * A.5 of RFC 1321, reproduced below. */ #include <string.h> -main() +int +main(void) { static const char *const test[7*2] = { "", "d41d8cd98f00b204e9800998ecf8427e", @@ -100,7 +101,8 @@ main() */ #ifdef COMPUTE_T_VALUES #include <math.h> -main() +int +main(void) { int i; for (i = 1; i <= 64; ++i) { @@ -223,7 +225,7 @@ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/) uint32_t xbuf[16]; const uint32_t *X; - if (!((data - (const uint8_t *)0) & 3)) { + if (!(((uintptr_t)data) & 3)) { /* data are properly aligned */ X = (const uint32_t *)data; } else { @@ -348,7 +350,7 @@ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/) pms->state[3] += d; } -void +int MD5_Init(MD5_CTX *pms) { pms->count[0] = pms->count[1] = 0; @@ -356,6 +358,7 @@ MD5_Init(MD5_CTX *pms) pms->state[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->state[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->state[3] = 0x10325476; + return 1; } void @@ -366,7 +369,7 @@ MD5_Update(MD5_CTX *pms, const uint8_t *data, size_t nbytes) size_t offset = (pms->count[0] >> 3) & 63; uint32_t nbits = (uint32_t)(nbytes << 3); - if (nbytes <= 0) + if (nbytes == 0) return; /* Update the message length. */ @@ -396,7 +399,7 @@ MD5_Update(MD5_CTX *pms, const uint8_t *data, size_t nbytes) memcpy(pms->buffer, p, left); } -void +int MD5_Finish(MD5_CTX *pms, uint8_t *digest) { static const uint8_t pad[64] = { @@ -417,4 +420,5 @@ MD5_Finish(MD5_CTX *pms, uint8_t *digest) MD5_Update(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (uint8_t)(pms->state[i >> 2] >> ((i & 3) << 3)); + return 1; } diff --git a/ext/digest/md5/md5.h b/ext/digest/md5/md5.h index f4580ef5e7..1b3383c5ee 100644 --- a/ext/digest/md5/md5.h +++ b/ext/digest/md5/md5.h @@ -46,7 +46,7 @@ #ifndef MD5_INCLUDED # define MD5_INCLUDED -#include "defs.h" +#include "../defs.h" /* * This code has some adaptations for the Ghostscript environment, but it @@ -69,9 +69,9 @@ typedef struct md5_state_s { #define MD5_Finish rb_Digest_MD5_Finish #endif -void MD5_Init _((MD5_CTX *pms)); +int MD5_Init _((MD5_CTX *pms)); void MD5_Update _((MD5_CTX *pms, const uint8_t *data, size_t nbytes)); -void MD5_Finish _((MD5_CTX *pms, uint8_t *digest)); +int MD5_Finish _((MD5_CTX *pms, uint8_t *digest)); #define MD5_BLOCK_LENGTH 64 #define MD5_DIGEST_LENGTH 16 diff --git a/ext/digest/md5/md5cc.h b/ext/digest/md5/md5cc.h new file mode 100644 index 0000000000..a002c17604 --- /dev/null +++ b/ext/digest/md5/md5cc.h @@ -0,0 +1,27 @@ +#define COMMON_DIGEST_FOR_OPENSSL 1 +#include <CommonCrypto/CommonDigest.h> + +#ifdef __GNUC__ +RB_DIGEST_WARNING_IGNORED(-Wdeprecated-declarations) +/* Suppress deprecation warnings of MD5 from Xcode 11.1 */ +/* Although we know MD5 is deprecated too, provide just for backward + * compatibility, as well as Apple does. */ +#endif + +#define MD5_BLOCK_LENGTH CC_MD5_BLOCK_BYTES + +static DEFINE_UPDATE_FUNC_FOR_UINT(MD5) +static DEFINE_FINISH_FUNC_FROM_FINAL(MD5) + +#undef MD5_Update +#undef MD5_Finish +#define MD5_Update rb_digest_MD5_update +#define MD5_Finish rb_digest_MD5_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine MD5_Init as well. + * This is a NOP on 10.6+. + */ +#undef MD5_Init +#define MD5_Init CC_MD5_Init diff --git a/ext/digest/md5/md5init.c b/ext/digest/md5/md5init.c index 17658f4fce..c919060587 100644 --- a/ext/digest/md5/md5init.c +++ b/ext/digest/md5/md5init.c @@ -1,14 +1,16 @@ /* $RoughId: md5init.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */ /* $Id$ */ -#include "digest.h" -#if defined(HAVE_OPENSSL_MD5_H) -#include "md5ossl.h" +#include <ruby/ruby.h> +#include "../digest.h" +#include "../defs.h" +#if defined(MD5_USE_COMMONDIGEST) +#include "md5cc.h" #else #include "md5.h" #endif -static rb_digest_metadata_t md5 = { +static const rb_digest_metadata_t md5 = { RUBY_DIGEST_API_VERSION, MD5_DIGEST_LENGTH, MD5_BLOCK_LENGTH, @@ -19,22 +21,41 @@ static rb_digest_metadata_t md5 = { }; /* + * Document-class: Digest::MD5 < Digest::Base * A class for calculating message digests using the MD5 * Message-Digest Algorithm by RSA Data Security, Inc., described in * RFC1321. + * + * MD5 calculates a digest of 128 bits (16 bytes). + * + * == Examples + * require 'digest' + * + * # Compute a complete digest + * Digest::MD5.hexdigest 'abc' #=> "90015098..." + * + * # Compute digest by chunks + * md5 = Digest::MD5.new # =>#<Digest::MD5> + * md5.update "ab" + * md5 << "c" # alias for #update + * md5.hexdigest # => "90015098..." + * + * # Use the same object to compute another digest + * md5.reset + * md5 << "message" + * md5.hexdigest # => "78e73102..." */ void -Init_md5() +Init_md5(void) { VALUE mDigest, cDigest_Base, cDigest_MD5; - rb_require("digest"); - - mDigest = rb_path2class("Digest"); - cDigest_Base = rb_path2class("Digest::Base"); +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif + mDigest = rb_digest_namespace(); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); cDigest_MD5 = rb_define_class_under(mDigest, "MD5", cDigest_Base); - - rb_ivar_set(cDigest_MD5, rb_intern("metadata"), - Data_Wrap_Struct(rb_cObject, 0, 0, &md5)); + rb_iv_set(cDigest_MD5, "metadata", rb_digest_make_metadata(&md5)); } diff --git a/ext/digest/md5/md5ossl.c b/ext/digest/md5/md5ossl.c deleted file mode 100644 index d94ae2cd2f..0000000000 --- a/ext/digest/md5/md5ossl.c +++ /dev/null @@ -1,9 +0,0 @@ -/* $Id$ */ - -#include "md5ossl.h" - -void -MD5_Finish(MD5_CTX *pctx, unsigned char *digest) -{ - MD5_Final(digest, pctx); -} diff --git a/ext/digest/md5/md5ossl.h b/ext/digest/md5/md5ossl.h deleted file mode 100644 index 1680c4f5c9..0000000000 --- a/ext/digest/md5/md5ossl.h +++ /dev/null @@ -1,13 +0,0 @@ -/* $Id$ */ - -#ifndef MD5OSSL_H_INCLUDED -#define MD5OSSL_H_INCLUDED - -#include <stddef.h> -#include <openssl/md5.h> - -#define MD5_BLOCK_LENGTH MD5_CBLOCK - -void MD5_Finish(MD5_CTX *pctx, unsigned char *digest); - -#endif diff --git a/ext/digest/rmd160/.cvsignore b/ext/digest/rmd160/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/rmd160/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/rmd160/depend b/ext/digest/rmd160/depend index a21d7188dc..aec484f7b3 100644 --- a/ext/digest/rmd160/depend +++ b/ext/digest/rmd160/depend @@ -1,6 +1,332 @@ -rmd160.o: rmd160.c rmd160.h $(srcdir)/../defs.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h -rmd160init.o: rmd160init.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h \ - rmd160.h $(srcdir)/../defs.h -rmd160ossl.o: rmd160ossl.h $(srcdir)/../defs.h +rmd160.o: rmd160.c rmd160.h $(srcdir)/../defs.h +rmd160init.o: $(LOCAL_HDRS) + +# AUTOGENERATED DEPENDENCIES START +rmd160.o: $(RUBY_EXTCONF_H) +rmd160.o: $(arch_hdrdir)/ruby/config.h +rmd160.o: $(hdrdir)/ruby.h +rmd160.o: $(hdrdir)/ruby/assert.h +rmd160.o: $(hdrdir)/ruby/backward.h +rmd160.o: $(hdrdir)/ruby/backward/2/assume.h +rmd160.o: $(hdrdir)/ruby/backward/2/attributes.h +rmd160.o: $(hdrdir)/ruby/backward/2/bool.h +rmd160.o: $(hdrdir)/ruby/backward/2/inttypes.h +rmd160.o: $(hdrdir)/ruby/backward/2/limits.h +rmd160.o: $(hdrdir)/ruby/backward/2/long_long.h +rmd160.o: $(hdrdir)/ruby/backward/2/stdalign.h +rmd160.o: $(hdrdir)/ruby/backward/2/stdarg.h +rmd160.o: $(hdrdir)/ruby/defines.h +rmd160.o: $(hdrdir)/ruby/intern.h +rmd160.o: $(hdrdir)/ruby/internal/abi.h +rmd160.o: $(hdrdir)/ruby/internal/anyargs.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/char.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/double.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/int.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/long.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/short.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +rmd160.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +rmd160.o: $(hdrdir)/ruby/internal/assume.h +rmd160.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +rmd160.o: $(hdrdir)/ruby/internal/attr/artificial.h +rmd160.o: $(hdrdir)/ruby/internal/attr/cold.h +rmd160.o: $(hdrdir)/ruby/internal/attr/const.h +rmd160.o: $(hdrdir)/ruby/internal/attr/constexpr.h +rmd160.o: $(hdrdir)/ruby/internal/attr/deprecated.h +rmd160.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +rmd160.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +rmd160.o: $(hdrdir)/ruby/internal/attr/error.h +rmd160.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +rmd160.o: $(hdrdir)/ruby/internal/attr/forceinline.h +rmd160.o: $(hdrdir)/ruby/internal/attr/format.h +rmd160.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +rmd160.o: $(hdrdir)/ruby/internal/attr/noalias.h +rmd160.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +rmd160.o: $(hdrdir)/ruby/internal/attr/noexcept.h +rmd160.o: $(hdrdir)/ruby/internal/attr/noinline.h +rmd160.o: $(hdrdir)/ruby/internal/attr/nonnull.h +rmd160.o: $(hdrdir)/ruby/internal/attr/noreturn.h +rmd160.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +rmd160.o: $(hdrdir)/ruby/internal/attr/pure.h +rmd160.o: $(hdrdir)/ruby/internal/attr/restrict.h +rmd160.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +rmd160.o: $(hdrdir)/ruby/internal/attr/warning.h +rmd160.o: $(hdrdir)/ruby/internal/attr/weakref.h +rmd160.o: $(hdrdir)/ruby/internal/cast.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +rmd160.o: $(hdrdir)/ruby/internal/compiler_since.h +rmd160.o: $(hdrdir)/ruby/internal/config.h +rmd160.o: $(hdrdir)/ruby/internal/constant_p.h +rmd160.o: $(hdrdir)/ruby/internal/core.h +rmd160.o: $(hdrdir)/ruby/internal/core/rarray.h +rmd160.o: $(hdrdir)/ruby/internal/core/rbasic.h +rmd160.o: $(hdrdir)/ruby/internal/core/rbignum.h +rmd160.o: $(hdrdir)/ruby/internal/core/rclass.h +rmd160.o: $(hdrdir)/ruby/internal/core/rdata.h +rmd160.o: $(hdrdir)/ruby/internal/core/rfile.h +rmd160.o: $(hdrdir)/ruby/internal/core/rhash.h +rmd160.o: $(hdrdir)/ruby/internal/core/robject.h +rmd160.o: $(hdrdir)/ruby/internal/core/rregexp.h +rmd160.o: $(hdrdir)/ruby/internal/core/rstring.h +rmd160.o: $(hdrdir)/ruby/internal/core/rstruct.h +rmd160.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +rmd160.o: $(hdrdir)/ruby/internal/ctype.h +rmd160.o: $(hdrdir)/ruby/internal/dllexport.h +rmd160.o: $(hdrdir)/ruby/internal/dosish.h +rmd160.o: $(hdrdir)/ruby/internal/error.h +rmd160.o: $(hdrdir)/ruby/internal/eval.h +rmd160.o: $(hdrdir)/ruby/internal/event.h +rmd160.o: $(hdrdir)/ruby/internal/fl_type.h +rmd160.o: $(hdrdir)/ruby/internal/gc.h +rmd160.o: $(hdrdir)/ruby/internal/glob.h +rmd160.o: $(hdrdir)/ruby/internal/globals.h +rmd160.o: $(hdrdir)/ruby/internal/has/attribute.h +rmd160.o: $(hdrdir)/ruby/internal/has/builtin.h +rmd160.o: $(hdrdir)/ruby/internal/has/c_attribute.h +rmd160.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +rmd160.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +rmd160.o: $(hdrdir)/ruby/internal/has/extension.h +rmd160.o: $(hdrdir)/ruby/internal/has/feature.h +rmd160.o: $(hdrdir)/ruby/internal/has/warning.h +rmd160.o: $(hdrdir)/ruby/internal/intern/array.h +rmd160.o: $(hdrdir)/ruby/internal/intern/bignum.h +rmd160.o: $(hdrdir)/ruby/internal/intern/class.h +rmd160.o: $(hdrdir)/ruby/internal/intern/compar.h +rmd160.o: $(hdrdir)/ruby/internal/intern/complex.h +rmd160.o: $(hdrdir)/ruby/internal/intern/cont.h +rmd160.o: $(hdrdir)/ruby/internal/intern/dir.h +rmd160.o: $(hdrdir)/ruby/internal/intern/enum.h +rmd160.o: $(hdrdir)/ruby/internal/intern/enumerator.h +rmd160.o: $(hdrdir)/ruby/internal/intern/error.h +rmd160.o: $(hdrdir)/ruby/internal/intern/eval.h +rmd160.o: $(hdrdir)/ruby/internal/intern/file.h +rmd160.o: $(hdrdir)/ruby/internal/intern/hash.h +rmd160.o: $(hdrdir)/ruby/internal/intern/io.h +rmd160.o: $(hdrdir)/ruby/internal/intern/load.h +rmd160.o: $(hdrdir)/ruby/internal/intern/marshal.h +rmd160.o: $(hdrdir)/ruby/internal/intern/numeric.h +rmd160.o: $(hdrdir)/ruby/internal/intern/object.h +rmd160.o: $(hdrdir)/ruby/internal/intern/parse.h +rmd160.o: $(hdrdir)/ruby/internal/intern/proc.h +rmd160.o: $(hdrdir)/ruby/internal/intern/process.h +rmd160.o: $(hdrdir)/ruby/internal/intern/random.h +rmd160.o: $(hdrdir)/ruby/internal/intern/range.h +rmd160.o: $(hdrdir)/ruby/internal/intern/rational.h +rmd160.o: $(hdrdir)/ruby/internal/intern/re.h +rmd160.o: $(hdrdir)/ruby/internal/intern/ruby.h +rmd160.o: $(hdrdir)/ruby/internal/intern/select.h +rmd160.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +rmd160.o: $(hdrdir)/ruby/internal/intern/set.h +rmd160.o: $(hdrdir)/ruby/internal/intern/signal.h +rmd160.o: $(hdrdir)/ruby/internal/intern/sprintf.h +rmd160.o: $(hdrdir)/ruby/internal/intern/string.h +rmd160.o: $(hdrdir)/ruby/internal/intern/struct.h +rmd160.o: $(hdrdir)/ruby/internal/intern/thread.h +rmd160.o: $(hdrdir)/ruby/internal/intern/time.h +rmd160.o: $(hdrdir)/ruby/internal/intern/variable.h +rmd160.o: $(hdrdir)/ruby/internal/intern/vm.h +rmd160.o: $(hdrdir)/ruby/internal/interpreter.h +rmd160.o: $(hdrdir)/ruby/internal/iterator.h +rmd160.o: $(hdrdir)/ruby/internal/memory.h +rmd160.o: $(hdrdir)/ruby/internal/method.h +rmd160.o: $(hdrdir)/ruby/internal/module.h +rmd160.o: $(hdrdir)/ruby/internal/newobj.h +rmd160.o: $(hdrdir)/ruby/internal/scan_args.h +rmd160.o: $(hdrdir)/ruby/internal/special_consts.h +rmd160.o: $(hdrdir)/ruby/internal/static_assert.h +rmd160.o: $(hdrdir)/ruby/internal/stdalign.h +rmd160.o: $(hdrdir)/ruby/internal/stdbool.h +rmd160.o: $(hdrdir)/ruby/internal/stdckdint.h +rmd160.o: $(hdrdir)/ruby/internal/symbol.h +rmd160.o: $(hdrdir)/ruby/internal/value.h +rmd160.o: $(hdrdir)/ruby/internal/value_type.h +rmd160.o: $(hdrdir)/ruby/internal/variable.h +rmd160.o: $(hdrdir)/ruby/internal/warning_push.h +rmd160.o: $(hdrdir)/ruby/internal/xmalloc.h +rmd160.o: $(hdrdir)/ruby/missing.h +rmd160.o: $(hdrdir)/ruby/ruby.h +rmd160.o: $(hdrdir)/ruby/st.h +rmd160.o: $(hdrdir)/ruby/subst.h +rmd160.o: $(srcdir)/../defs.h +rmd160.o: rmd160.c +rmd160.o: rmd160.h +rmd160init.o: $(RUBY_EXTCONF_H) +rmd160init.o: $(arch_hdrdir)/ruby/config.h +rmd160init.o: $(hdrdir)/ruby.h +rmd160init.o: $(hdrdir)/ruby/assert.h +rmd160init.o: $(hdrdir)/ruby/backward.h +rmd160init.o: $(hdrdir)/ruby/backward/2/assume.h +rmd160init.o: $(hdrdir)/ruby/backward/2/attributes.h +rmd160init.o: $(hdrdir)/ruby/backward/2/bool.h +rmd160init.o: $(hdrdir)/ruby/backward/2/inttypes.h +rmd160init.o: $(hdrdir)/ruby/backward/2/limits.h +rmd160init.o: $(hdrdir)/ruby/backward/2/long_long.h +rmd160init.o: $(hdrdir)/ruby/backward/2/stdalign.h +rmd160init.o: $(hdrdir)/ruby/backward/2/stdarg.h +rmd160init.o: $(hdrdir)/ruby/defines.h +rmd160init.o: $(hdrdir)/ruby/intern.h +rmd160init.o: $(hdrdir)/ruby/internal/abi.h +rmd160init.o: $(hdrdir)/ruby/internal/anyargs.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +rmd160init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +rmd160init.o: $(hdrdir)/ruby/internal/assume.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/artificial.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/cold.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/const.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/error.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/format.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/noalias.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/noinline.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/pure.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/restrict.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/warning.h +rmd160init.o: $(hdrdir)/ruby/internal/attr/weakref.h +rmd160init.o: $(hdrdir)/ruby/internal/cast.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +rmd160init.o: $(hdrdir)/ruby/internal/compiler_since.h +rmd160init.o: $(hdrdir)/ruby/internal/config.h +rmd160init.o: $(hdrdir)/ruby/internal/constant_p.h +rmd160init.o: $(hdrdir)/ruby/internal/core.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rarray.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rbasic.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rbignum.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rclass.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rdata.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rfile.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rhash.h +rmd160init.o: $(hdrdir)/ruby/internal/core/robject.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rregexp.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rstring.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rstruct.h +rmd160init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +rmd160init.o: $(hdrdir)/ruby/internal/ctype.h +rmd160init.o: $(hdrdir)/ruby/internal/dllexport.h +rmd160init.o: $(hdrdir)/ruby/internal/dosish.h +rmd160init.o: $(hdrdir)/ruby/internal/error.h +rmd160init.o: $(hdrdir)/ruby/internal/eval.h +rmd160init.o: $(hdrdir)/ruby/internal/event.h +rmd160init.o: $(hdrdir)/ruby/internal/fl_type.h +rmd160init.o: $(hdrdir)/ruby/internal/gc.h +rmd160init.o: $(hdrdir)/ruby/internal/glob.h +rmd160init.o: $(hdrdir)/ruby/internal/globals.h +rmd160init.o: $(hdrdir)/ruby/internal/has/attribute.h +rmd160init.o: $(hdrdir)/ruby/internal/has/builtin.h +rmd160init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +rmd160init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +rmd160init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +rmd160init.o: $(hdrdir)/ruby/internal/has/extension.h +rmd160init.o: $(hdrdir)/ruby/internal/has/feature.h +rmd160init.o: $(hdrdir)/ruby/internal/has/warning.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/array.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/bignum.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/class.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/compar.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/complex.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/cont.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/dir.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/enum.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/error.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/eval.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/file.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/hash.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/io.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/load.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/marshal.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/numeric.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/object.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/parse.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/proc.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/process.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/random.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/range.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/rational.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/re.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/ruby.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/select.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/set.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/signal.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/string.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/struct.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/thread.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/time.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/variable.h +rmd160init.o: $(hdrdir)/ruby/internal/intern/vm.h +rmd160init.o: $(hdrdir)/ruby/internal/interpreter.h +rmd160init.o: $(hdrdir)/ruby/internal/iterator.h +rmd160init.o: $(hdrdir)/ruby/internal/memory.h +rmd160init.o: $(hdrdir)/ruby/internal/method.h +rmd160init.o: $(hdrdir)/ruby/internal/module.h +rmd160init.o: $(hdrdir)/ruby/internal/newobj.h +rmd160init.o: $(hdrdir)/ruby/internal/scan_args.h +rmd160init.o: $(hdrdir)/ruby/internal/special_consts.h +rmd160init.o: $(hdrdir)/ruby/internal/static_assert.h +rmd160init.o: $(hdrdir)/ruby/internal/stdalign.h +rmd160init.o: $(hdrdir)/ruby/internal/stdbool.h +rmd160init.o: $(hdrdir)/ruby/internal/stdckdint.h +rmd160init.o: $(hdrdir)/ruby/internal/symbol.h +rmd160init.o: $(hdrdir)/ruby/internal/value.h +rmd160init.o: $(hdrdir)/ruby/internal/value_type.h +rmd160init.o: $(hdrdir)/ruby/internal/variable.h +rmd160init.o: $(hdrdir)/ruby/internal/warning_push.h +rmd160init.o: $(hdrdir)/ruby/internal/xmalloc.h +rmd160init.o: $(hdrdir)/ruby/missing.h +rmd160init.o: $(hdrdir)/ruby/ruby.h +rmd160init.o: $(hdrdir)/ruby/st.h +rmd160init.o: $(hdrdir)/ruby/subst.h +rmd160init.o: $(srcdir)/../defs.h +rmd160init.o: $(srcdir)/../digest.h +rmd160init.o: rmd160.h +rmd160init.o: rmd160init.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/rmd160/extconf.rb b/ext/digest/rmd160/extconf.rb index 09359944f2..8b894da0c8 100644 --- a/ext/digest/rmd160/extconf.rb +++ b/ext/digest/rmd160/extconf.rb @@ -1,28 +1,21 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: false # $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $ # $Id$ require "mkmf" +require File.expand_path("../../digest_conf", __FILE__) -$defs << "-DNDEBUG" << "-DHAVE_CONFIG_H" -$INCFLAGS << " -I$(srcdir)/.." +if try_static_assert("RUBY_API_VERSION_MAJOR < 3", "ruby/version.h") + $defs << "-DNDEBUG" +end $objs = [ "rmd160init.#{$OBJEXT}" ] -dir_config("openssl") - -if !with_config("bundled-rmd160") && - have_library("crypto") && have_header("openssl/ripemd.h") - $objs << "rmd160ossl.#{$OBJEXT}" -else - $objs << "rmd160.#{$OBJEXT}" -end +digest_conf("rmd160") have_header("sys/cdefs.h") -have_header("inttypes.h") - -have_header("unistd.h") - $preload = %w[digest] create_makefile("digest/rmd160") diff --git a/ext/digest/rmd160/rmd160.c b/ext/digest/rmd160/rmd160.c index 88918728cd..058d004f3a 100644 --- a/ext/digest/rmd160/rmd160.c +++ b/ext/digest/rmd160/rmd160.c @@ -124,7 +124,7 @@ /********************************************************************/ -void +int RMD160_Init(RMD160_CTX *context) { @@ -138,6 +138,7 @@ RMD160_Init(RMD160_CTX *context) context->state[4] = 0xc3d2e1f0U; context->length[0] = context->length[1] = 0; context->buflen = 0; + return 1; } /********************************************************************/ @@ -362,16 +363,20 @@ RMD160_Update(RMD160_CTX *context, const uint8_t *data, size_t nbytes) _DIAGASSERT(data != NULL); /* update length[] */ +#if SIZEOF_SIZE_T * CHAR_BIT > 32 + context->length[1] += (uint32_t)((context->length[0] + nbytes) >> 32); +#else if (context->length[0] + nbytes < context->length[0]) context->length[1]++; /* overflow to msb of length */ - context->length[0] += nbytes; +#endif + context->length[0] += (uint32_t)nbytes; (void)memset(X, 0, sizeof(X)); if ( context->buflen + nbytes < 64 ) { (void)memcpy(context->bbuffer + context->buflen, data, nbytes); - context->buflen += nbytes; + context->buflen += (uint32_t)nbytes; } else { @@ -401,14 +406,14 @@ RMD160_Update(RMD160_CTX *context, const uint8_t *data, size_t nbytes) /* * Put last bytes from data into context's buffer */ - context->buflen = nbytes & 63; + context->buflen = (uint32_t)nbytes & 63; memcpy(context->bbuffer, data + (64 * i) + ofs, context->buflen); } } /********************************************************************/ -void +int RMD160_Finish(RMD160_CTX *context, uint8_t digest[20]) { uint32_t i; @@ -452,6 +457,7 @@ RMD160_Finish(RMD160_CTX *context, uint8_t digest[20]) digest[i + 3] = (context->state[i>>2] >> 24); } } + return 1; } /************************ end of file rmd160.c **********************/ diff --git a/ext/digest/rmd160/rmd160.h b/ext/digest/rmd160/rmd160.h index 54d1ca9140..6324709d96 100644 --- a/ext/digest/rmd160/rmd160.h +++ b/ext/digest/rmd160/rmd160.h @@ -7,7 +7,7 @@ * FILE: rmd160.h * * CONTENTS: Header file for a sample C-implementation of the - * RIPEMD-160 hash-function. + * RIPEMD-160 hash-function. * TARGET: any computer with an ANSI C compiler * * AUTHOR: Antoon Bosselaers, ESAT-COSIC @@ -26,7 +26,7 @@ #ifndef _RMD160_H_ #define _RMD160_H_ -#include "defs.h" +#include "../defs.h" typedef struct { uint32_t state[5]; /* state (ABCDE) */ @@ -43,10 +43,10 @@ typedef struct { #endif __BEGIN_DECLS -void RMD160_Init _((RMD160_CTX *)); +int RMD160_Init _((RMD160_CTX *)); void RMD160_Transform _((uint32_t[5], const uint32_t[16])); void RMD160_Update _((RMD160_CTX *, const uint8_t *, size_t)); -void RMD160_Finish _((RMD160_CTX *, uint8_t[20])); +int RMD160_Finish _((RMD160_CTX *, uint8_t[20])); __END_DECLS #define RMD160_BLOCK_LENGTH 64 diff --git a/ext/digest/rmd160/rmd160init.c b/ext/digest/rmd160/rmd160init.c index 763867df86..e4b707ed9e 100644 --- a/ext/digest/rmd160/rmd160init.c +++ b/ext/digest/rmd160/rmd160init.c @@ -1,14 +1,11 @@ /* $RoughId: rmd160init.c,v 1.3 2001/07/13 20:00:43 knu Exp $ */ /* $Id$ */ -#include "digest.h" -#if defined(HAVE_OPENSSL_RIPEMD_H) -#include "rmd160ossl.h" -#else +#include <ruby/ruby.h> +#include "../digest.h" #include "rmd160.h" -#endif -static rb_digest_metadata_t rmd160 = { +static const rb_digest_metadata_t rmd160 = { RUBY_DIGEST_API_VERSION, RMD160_DIGEST_LENGTH, RMD160_BLOCK_LENGTH, @@ -19,22 +16,41 @@ static rb_digest_metadata_t rmd160 = { }; /* + * Document-class: Digest::RMD160 < Digest::Base * A class for calculating message digests using RIPEMD-160 * cryptographic hash function, designed by Hans Dobbertin, Antoon * Bosselaers, and Bart Preneel. + * + * RMD160 calculates a digest of 160 bits (20 bytes). + * + * == Examples + * require 'digest' + * + * # Compute a complete digest + * Digest::RMD160.hexdigest 'abc' #=> "8eb208f7..." + * + * # Compute digest by chunks + * rmd160 = Digest::RMD160.new # =>#<Digest::RMD160> + * rmd160.update "ab" + * rmd160 << "c" # alias for #update + * rmd160.hexdigest # => "8eb208f7..." + * + * # Use the same object to compute another digest + * rmd160.reset + * rmd160 << "message" + * rmd160.hexdigest # => "1dddbe1b..." */ void -Init_rmd160() +Init_rmd160(void) { VALUE mDigest, cDigest_Base, cDigest_RMD160; - rb_require("digest"); - - mDigest = rb_path2class("Digest"); - cDigest_Base = rb_path2class("Digest::Base"); +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif + mDigest = rb_digest_namespace(); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); cDigest_RMD160 = rb_define_class_under(mDigest, "RMD160", cDigest_Base); - - rb_ivar_set(cDigest_RMD160, rb_intern("metadata"), - Data_Wrap_Struct(rb_cObject, 0, 0, &rmd160)); + rb_iv_set(cDigest_RMD160, "metadata", rb_digest_make_metadata(&rmd160)); } diff --git a/ext/digest/rmd160/rmd160ossl.c b/ext/digest/rmd160/rmd160ossl.c deleted file mode 100644 index f24e63e3d8..0000000000 --- a/ext/digest/rmd160/rmd160ossl.c +++ /dev/null @@ -1,8 +0,0 @@ -/* $Id$ */ - -#include "defs.h" -#include "rmd160ossl.h" - -void RMD160_Finish(RMD160_CTX *ctx, char *buf) { - RIPEMD160_Final((unsigned char *)buf, ctx); -} diff --git a/ext/digest/rmd160/rmd160ossl.h b/ext/digest/rmd160/rmd160ossl.h deleted file mode 100644 index 3df38a01c0..0000000000 --- a/ext/digest/rmd160/rmd160ossl.h +++ /dev/null @@ -1,19 +0,0 @@ -/* $Id$ */ - -#ifndef RMD160OSSL_H_INCLUDED -#define RMD160OSSL_H_INCLUDED - -#include <stddef.h> -#include <openssl/ripemd.h> - -#define RMD160_CTX RIPEMD160_CTX - -#define RMD160_Init RIPEMD160_Init -#define RMD160_Update RIPEMD160_Update - -#define RMD160_BLOCK_LENGTH RIPEMD160_CBLOCK -#define RMD160_DIGEST_LENGTH RIPEMD160_DIGEST_LENGTH - -void RMD160_Finish(RMD160_CTX *ctx, char *buf); - -#endif diff --git a/ext/digest/sha1/.cvsignore b/ext/digest/sha1/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/sha1/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/sha1/depend b/ext/digest/sha1/depend index 61607844d0..e6bd9d8f73 100644 --- a/ext/digest/sha1/depend +++ b/ext/digest/sha1/depend @@ -1,6 +1,333 @@ -sha1.o: sha1.c sha1.h $(srcdir)/../defs.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h -sha1init.o: sha1init.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h \ - sha1.h $(srcdir)/../defs.h -sha1ossl.o: sha1ossl.h $(srcdir)/../defs.h +sha1.o: sha1.c sha1.h $(srcdir)/../defs.h +sha1init.o: $(LOCAL_HDRS) + +# AUTOGENERATED DEPENDENCIES START +sha1.o: $(RUBY_EXTCONF_H) +sha1.o: $(arch_hdrdir)/ruby/config.h +sha1.o: $(hdrdir)/ruby.h +sha1.o: $(hdrdir)/ruby/assert.h +sha1.o: $(hdrdir)/ruby/backward.h +sha1.o: $(hdrdir)/ruby/backward/2/assume.h +sha1.o: $(hdrdir)/ruby/backward/2/attributes.h +sha1.o: $(hdrdir)/ruby/backward/2/bool.h +sha1.o: $(hdrdir)/ruby/backward/2/inttypes.h +sha1.o: $(hdrdir)/ruby/backward/2/limits.h +sha1.o: $(hdrdir)/ruby/backward/2/long_long.h +sha1.o: $(hdrdir)/ruby/backward/2/stdalign.h +sha1.o: $(hdrdir)/ruby/backward/2/stdarg.h +sha1.o: $(hdrdir)/ruby/defines.h +sha1.o: $(hdrdir)/ruby/intern.h +sha1.o: $(hdrdir)/ruby/internal/abi.h +sha1.o: $(hdrdir)/ruby/internal/anyargs.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/char.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/double.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/int.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/long.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/short.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +sha1.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +sha1.o: $(hdrdir)/ruby/internal/assume.h +sha1.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +sha1.o: $(hdrdir)/ruby/internal/attr/artificial.h +sha1.o: $(hdrdir)/ruby/internal/attr/cold.h +sha1.o: $(hdrdir)/ruby/internal/attr/const.h +sha1.o: $(hdrdir)/ruby/internal/attr/constexpr.h +sha1.o: $(hdrdir)/ruby/internal/attr/deprecated.h +sha1.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +sha1.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +sha1.o: $(hdrdir)/ruby/internal/attr/error.h +sha1.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +sha1.o: $(hdrdir)/ruby/internal/attr/forceinline.h +sha1.o: $(hdrdir)/ruby/internal/attr/format.h +sha1.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +sha1.o: $(hdrdir)/ruby/internal/attr/noalias.h +sha1.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +sha1.o: $(hdrdir)/ruby/internal/attr/noexcept.h +sha1.o: $(hdrdir)/ruby/internal/attr/noinline.h +sha1.o: $(hdrdir)/ruby/internal/attr/nonnull.h +sha1.o: $(hdrdir)/ruby/internal/attr/noreturn.h +sha1.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +sha1.o: $(hdrdir)/ruby/internal/attr/pure.h +sha1.o: $(hdrdir)/ruby/internal/attr/restrict.h +sha1.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +sha1.o: $(hdrdir)/ruby/internal/attr/warning.h +sha1.o: $(hdrdir)/ruby/internal/attr/weakref.h +sha1.o: $(hdrdir)/ruby/internal/cast.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +sha1.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +sha1.o: $(hdrdir)/ruby/internal/compiler_since.h +sha1.o: $(hdrdir)/ruby/internal/config.h +sha1.o: $(hdrdir)/ruby/internal/constant_p.h +sha1.o: $(hdrdir)/ruby/internal/core.h +sha1.o: $(hdrdir)/ruby/internal/core/rarray.h +sha1.o: $(hdrdir)/ruby/internal/core/rbasic.h +sha1.o: $(hdrdir)/ruby/internal/core/rbignum.h +sha1.o: $(hdrdir)/ruby/internal/core/rclass.h +sha1.o: $(hdrdir)/ruby/internal/core/rdata.h +sha1.o: $(hdrdir)/ruby/internal/core/rfile.h +sha1.o: $(hdrdir)/ruby/internal/core/rhash.h +sha1.o: $(hdrdir)/ruby/internal/core/robject.h +sha1.o: $(hdrdir)/ruby/internal/core/rregexp.h +sha1.o: $(hdrdir)/ruby/internal/core/rstring.h +sha1.o: $(hdrdir)/ruby/internal/core/rstruct.h +sha1.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +sha1.o: $(hdrdir)/ruby/internal/ctype.h +sha1.o: $(hdrdir)/ruby/internal/dllexport.h +sha1.o: $(hdrdir)/ruby/internal/dosish.h +sha1.o: $(hdrdir)/ruby/internal/error.h +sha1.o: $(hdrdir)/ruby/internal/eval.h +sha1.o: $(hdrdir)/ruby/internal/event.h +sha1.o: $(hdrdir)/ruby/internal/fl_type.h +sha1.o: $(hdrdir)/ruby/internal/gc.h +sha1.o: $(hdrdir)/ruby/internal/glob.h +sha1.o: $(hdrdir)/ruby/internal/globals.h +sha1.o: $(hdrdir)/ruby/internal/has/attribute.h +sha1.o: $(hdrdir)/ruby/internal/has/builtin.h +sha1.o: $(hdrdir)/ruby/internal/has/c_attribute.h +sha1.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +sha1.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +sha1.o: $(hdrdir)/ruby/internal/has/extension.h +sha1.o: $(hdrdir)/ruby/internal/has/feature.h +sha1.o: $(hdrdir)/ruby/internal/has/warning.h +sha1.o: $(hdrdir)/ruby/internal/intern/array.h +sha1.o: $(hdrdir)/ruby/internal/intern/bignum.h +sha1.o: $(hdrdir)/ruby/internal/intern/class.h +sha1.o: $(hdrdir)/ruby/internal/intern/compar.h +sha1.o: $(hdrdir)/ruby/internal/intern/complex.h +sha1.o: $(hdrdir)/ruby/internal/intern/cont.h +sha1.o: $(hdrdir)/ruby/internal/intern/dir.h +sha1.o: $(hdrdir)/ruby/internal/intern/enum.h +sha1.o: $(hdrdir)/ruby/internal/intern/enumerator.h +sha1.o: $(hdrdir)/ruby/internal/intern/error.h +sha1.o: $(hdrdir)/ruby/internal/intern/eval.h +sha1.o: $(hdrdir)/ruby/internal/intern/file.h +sha1.o: $(hdrdir)/ruby/internal/intern/hash.h +sha1.o: $(hdrdir)/ruby/internal/intern/io.h +sha1.o: $(hdrdir)/ruby/internal/intern/load.h +sha1.o: $(hdrdir)/ruby/internal/intern/marshal.h +sha1.o: $(hdrdir)/ruby/internal/intern/numeric.h +sha1.o: $(hdrdir)/ruby/internal/intern/object.h +sha1.o: $(hdrdir)/ruby/internal/intern/parse.h +sha1.o: $(hdrdir)/ruby/internal/intern/proc.h +sha1.o: $(hdrdir)/ruby/internal/intern/process.h +sha1.o: $(hdrdir)/ruby/internal/intern/random.h +sha1.o: $(hdrdir)/ruby/internal/intern/range.h +sha1.o: $(hdrdir)/ruby/internal/intern/rational.h +sha1.o: $(hdrdir)/ruby/internal/intern/re.h +sha1.o: $(hdrdir)/ruby/internal/intern/ruby.h +sha1.o: $(hdrdir)/ruby/internal/intern/select.h +sha1.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +sha1.o: $(hdrdir)/ruby/internal/intern/set.h +sha1.o: $(hdrdir)/ruby/internal/intern/signal.h +sha1.o: $(hdrdir)/ruby/internal/intern/sprintf.h +sha1.o: $(hdrdir)/ruby/internal/intern/string.h +sha1.o: $(hdrdir)/ruby/internal/intern/struct.h +sha1.o: $(hdrdir)/ruby/internal/intern/thread.h +sha1.o: $(hdrdir)/ruby/internal/intern/time.h +sha1.o: $(hdrdir)/ruby/internal/intern/variable.h +sha1.o: $(hdrdir)/ruby/internal/intern/vm.h +sha1.o: $(hdrdir)/ruby/internal/interpreter.h +sha1.o: $(hdrdir)/ruby/internal/iterator.h +sha1.o: $(hdrdir)/ruby/internal/memory.h +sha1.o: $(hdrdir)/ruby/internal/method.h +sha1.o: $(hdrdir)/ruby/internal/module.h +sha1.o: $(hdrdir)/ruby/internal/newobj.h +sha1.o: $(hdrdir)/ruby/internal/scan_args.h +sha1.o: $(hdrdir)/ruby/internal/special_consts.h +sha1.o: $(hdrdir)/ruby/internal/static_assert.h +sha1.o: $(hdrdir)/ruby/internal/stdalign.h +sha1.o: $(hdrdir)/ruby/internal/stdbool.h +sha1.o: $(hdrdir)/ruby/internal/stdckdint.h +sha1.o: $(hdrdir)/ruby/internal/symbol.h +sha1.o: $(hdrdir)/ruby/internal/value.h +sha1.o: $(hdrdir)/ruby/internal/value_type.h +sha1.o: $(hdrdir)/ruby/internal/variable.h +sha1.o: $(hdrdir)/ruby/internal/warning_push.h +sha1.o: $(hdrdir)/ruby/internal/xmalloc.h +sha1.o: $(hdrdir)/ruby/missing.h +sha1.o: $(hdrdir)/ruby/ruby.h +sha1.o: $(hdrdir)/ruby/st.h +sha1.o: $(hdrdir)/ruby/subst.h +sha1.o: $(srcdir)/../defs.h +sha1.o: sha1.c +sha1.o: sha1.h +sha1init.o: $(RUBY_EXTCONF_H) +sha1init.o: $(arch_hdrdir)/ruby/config.h +sha1init.o: $(hdrdir)/ruby.h +sha1init.o: $(hdrdir)/ruby/assert.h +sha1init.o: $(hdrdir)/ruby/backward.h +sha1init.o: $(hdrdir)/ruby/backward/2/assume.h +sha1init.o: $(hdrdir)/ruby/backward/2/attributes.h +sha1init.o: $(hdrdir)/ruby/backward/2/bool.h +sha1init.o: $(hdrdir)/ruby/backward/2/inttypes.h +sha1init.o: $(hdrdir)/ruby/backward/2/limits.h +sha1init.o: $(hdrdir)/ruby/backward/2/long_long.h +sha1init.o: $(hdrdir)/ruby/backward/2/stdalign.h +sha1init.o: $(hdrdir)/ruby/backward/2/stdarg.h +sha1init.o: $(hdrdir)/ruby/defines.h +sha1init.o: $(hdrdir)/ruby/intern.h +sha1init.o: $(hdrdir)/ruby/internal/abi.h +sha1init.o: $(hdrdir)/ruby/internal/anyargs.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +sha1init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +sha1init.o: $(hdrdir)/ruby/internal/assume.h +sha1init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +sha1init.o: $(hdrdir)/ruby/internal/attr/artificial.h +sha1init.o: $(hdrdir)/ruby/internal/attr/cold.h +sha1init.o: $(hdrdir)/ruby/internal/attr/const.h +sha1init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +sha1init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +sha1init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +sha1init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +sha1init.o: $(hdrdir)/ruby/internal/attr/error.h +sha1init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +sha1init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +sha1init.o: $(hdrdir)/ruby/internal/attr/format.h +sha1init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +sha1init.o: $(hdrdir)/ruby/internal/attr/noalias.h +sha1init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +sha1init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +sha1init.o: $(hdrdir)/ruby/internal/attr/noinline.h +sha1init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +sha1init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +sha1init.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +sha1init.o: $(hdrdir)/ruby/internal/attr/pure.h +sha1init.o: $(hdrdir)/ruby/internal/attr/restrict.h +sha1init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +sha1init.o: $(hdrdir)/ruby/internal/attr/warning.h +sha1init.o: $(hdrdir)/ruby/internal/attr/weakref.h +sha1init.o: $(hdrdir)/ruby/internal/cast.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +sha1init.o: $(hdrdir)/ruby/internal/compiler_since.h +sha1init.o: $(hdrdir)/ruby/internal/config.h +sha1init.o: $(hdrdir)/ruby/internal/constant_p.h +sha1init.o: $(hdrdir)/ruby/internal/core.h +sha1init.o: $(hdrdir)/ruby/internal/core/rarray.h +sha1init.o: $(hdrdir)/ruby/internal/core/rbasic.h +sha1init.o: $(hdrdir)/ruby/internal/core/rbignum.h +sha1init.o: $(hdrdir)/ruby/internal/core/rclass.h +sha1init.o: $(hdrdir)/ruby/internal/core/rdata.h +sha1init.o: $(hdrdir)/ruby/internal/core/rfile.h +sha1init.o: $(hdrdir)/ruby/internal/core/rhash.h +sha1init.o: $(hdrdir)/ruby/internal/core/robject.h +sha1init.o: $(hdrdir)/ruby/internal/core/rregexp.h +sha1init.o: $(hdrdir)/ruby/internal/core/rstring.h +sha1init.o: $(hdrdir)/ruby/internal/core/rstruct.h +sha1init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +sha1init.o: $(hdrdir)/ruby/internal/ctype.h +sha1init.o: $(hdrdir)/ruby/internal/dllexport.h +sha1init.o: $(hdrdir)/ruby/internal/dosish.h +sha1init.o: $(hdrdir)/ruby/internal/error.h +sha1init.o: $(hdrdir)/ruby/internal/eval.h +sha1init.o: $(hdrdir)/ruby/internal/event.h +sha1init.o: $(hdrdir)/ruby/internal/fl_type.h +sha1init.o: $(hdrdir)/ruby/internal/gc.h +sha1init.o: $(hdrdir)/ruby/internal/glob.h +sha1init.o: $(hdrdir)/ruby/internal/globals.h +sha1init.o: $(hdrdir)/ruby/internal/has/attribute.h +sha1init.o: $(hdrdir)/ruby/internal/has/builtin.h +sha1init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +sha1init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +sha1init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +sha1init.o: $(hdrdir)/ruby/internal/has/extension.h +sha1init.o: $(hdrdir)/ruby/internal/has/feature.h +sha1init.o: $(hdrdir)/ruby/internal/has/warning.h +sha1init.o: $(hdrdir)/ruby/internal/intern/array.h +sha1init.o: $(hdrdir)/ruby/internal/intern/bignum.h +sha1init.o: $(hdrdir)/ruby/internal/intern/class.h +sha1init.o: $(hdrdir)/ruby/internal/intern/compar.h +sha1init.o: $(hdrdir)/ruby/internal/intern/complex.h +sha1init.o: $(hdrdir)/ruby/internal/intern/cont.h +sha1init.o: $(hdrdir)/ruby/internal/intern/dir.h +sha1init.o: $(hdrdir)/ruby/internal/intern/enum.h +sha1init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +sha1init.o: $(hdrdir)/ruby/internal/intern/error.h +sha1init.o: $(hdrdir)/ruby/internal/intern/eval.h +sha1init.o: $(hdrdir)/ruby/internal/intern/file.h +sha1init.o: $(hdrdir)/ruby/internal/intern/hash.h +sha1init.o: $(hdrdir)/ruby/internal/intern/io.h +sha1init.o: $(hdrdir)/ruby/internal/intern/load.h +sha1init.o: $(hdrdir)/ruby/internal/intern/marshal.h +sha1init.o: $(hdrdir)/ruby/internal/intern/numeric.h +sha1init.o: $(hdrdir)/ruby/internal/intern/object.h +sha1init.o: $(hdrdir)/ruby/internal/intern/parse.h +sha1init.o: $(hdrdir)/ruby/internal/intern/proc.h +sha1init.o: $(hdrdir)/ruby/internal/intern/process.h +sha1init.o: $(hdrdir)/ruby/internal/intern/random.h +sha1init.o: $(hdrdir)/ruby/internal/intern/range.h +sha1init.o: $(hdrdir)/ruby/internal/intern/rational.h +sha1init.o: $(hdrdir)/ruby/internal/intern/re.h +sha1init.o: $(hdrdir)/ruby/internal/intern/ruby.h +sha1init.o: $(hdrdir)/ruby/internal/intern/select.h +sha1init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +sha1init.o: $(hdrdir)/ruby/internal/intern/set.h +sha1init.o: $(hdrdir)/ruby/internal/intern/signal.h +sha1init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +sha1init.o: $(hdrdir)/ruby/internal/intern/string.h +sha1init.o: $(hdrdir)/ruby/internal/intern/struct.h +sha1init.o: $(hdrdir)/ruby/internal/intern/thread.h +sha1init.o: $(hdrdir)/ruby/internal/intern/time.h +sha1init.o: $(hdrdir)/ruby/internal/intern/variable.h +sha1init.o: $(hdrdir)/ruby/internal/intern/vm.h +sha1init.o: $(hdrdir)/ruby/internal/interpreter.h +sha1init.o: $(hdrdir)/ruby/internal/iterator.h +sha1init.o: $(hdrdir)/ruby/internal/memory.h +sha1init.o: $(hdrdir)/ruby/internal/method.h +sha1init.o: $(hdrdir)/ruby/internal/module.h +sha1init.o: $(hdrdir)/ruby/internal/newobj.h +sha1init.o: $(hdrdir)/ruby/internal/scan_args.h +sha1init.o: $(hdrdir)/ruby/internal/special_consts.h +sha1init.o: $(hdrdir)/ruby/internal/static_assert.h +sha1init.o: $(hdrdir)/ruby/internal/stdalign.h +sha1init.o: $(hdrdir)/ruby/internal/stdbool.h +sha1init.o: $(hdrdir)/ruby/internal/stdckdint.h +sha1init.o: $(hdrdir)/ruby/internal/symbol.h +sha1init.o: $(hdrdir)/ruby/internal/value.h +sha1init.o: $(hdrdir)/ruby/internal/value_type.h +sha1init.o: $(hdrdir)/ruby/internal/variable.h +sha1init.o: $(hdrdir)/ruby/internal/warning_push.h +sha1init.o: $(hdrdir)/ruby/internal/xmalloc.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: $(srcdir)/../defs.h +sha1init.o: $(srcdir)/../digest.h +sha1init.o: sha1.h +sha1init.o: sha1cc.h +sha1init.o: sha1init.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/sha1/extconf.rb b/ext/digest/sha1/extconf.rb index 87b74c34af..7582cd9ab5 100644 --- a/ext/digest/sha1/extconf.rb +++ b/ext/digest/sha1/extconf.rb @@ -1,28 +1,17 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: false # $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $ # $Id$ require "mkmf" - -$defs << "-DHAVE_CONFIG_H" -$INCFLAGS << " -I$(srcdir)/.." +require File.expand_path("../../digest_conf", __FILE__) $objs = [ "sha1init.#{$OBJEXT}" ] -dir_config("openssl") - -if !with_config("bundled-sha1") && - have_library("crypto") && have_header("openssl/sha.h") - $objs << "sha1ossl.#{$OBJEXT}" -else - $objs << "sha1.#{$OBJEXT}" -end +digest_conf("sha1") have_header("sys/cdefs.h") -have_header("inttypes.h") - -have_header("unistd.h") - $preload = %w[digest] create_makefile("digest/sha1") diff --git a/ext/digest/sha1/sha1.c b/ext/digest/sha1/sha1.c index 6196ca6b82..003c87d224 100644 --- a/ext/digest/sha1/sha1.c +++ b/ext/digest/sha1/sha1.c @@ -199,7 +199,7 @@ void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]) /* * SHA1_Init - Initialize new context */ -void SHA1_Init(SHA1_CTX *context) +int SHA1_Init(SHA1_CTX *context) { _DIAGASSERT(context != 0); @@ -211,6 +211,7 @@ void SHA1_Init(SHA1_CTX *context) context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; + return 1; } @@ -219,20 +220,28 @@ void SHA1_Init(SHA1_CTX *context) */ void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len) { - uint32_t i, j; + size_t i; + uint32_t j; _DIAGASSERT(context != 0); _DIAGASSERT(data != 0); j = context->count[0]; if ((context->count[0] += len << 3) < j) - context->count[1] += (len>>29)+1; + context->count[1]++; + context->count[1] += (uint32_t)(len >> 29); 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) + for ( ; i + 63 < len; i += 64) { + RB_DIGEST_WARNING_PUSH(); +#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 11 + RB_DIGEST_WARNING_IGNORED(-Wstringop-overread); +#endif SHA1_Transform(context->state, &data[i]); + RB_DIGEST_WARNING_POP(); + } j = 0; } else { i = 0; @@ -244,7 +253,7 @@ void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len) /* * Add padding and return the message digest. */ -void SHA1_Finish(SHA1_CTX* context, uint8_t digest[20]) +int SHA1_Finish(SHA1_CTX* context, uint8_t digest[20]) { size_t i; uint8_t finalcount[8]; @@ -266,4 +275,5 @@ void SHA1_Finish(SHA1_CTX* context, uint8_t digest[20]) digest[i] = (uint8_t) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } + return 1; } diff --git a/ext/digest/sha1/sha1.h b/ext/digest/sha1/sha1.h index 60e3b01fe2..2accc46d46 100644 --- a/ext/digest/sha1/sha1.h +++ b/ext/digest/sha1/sha1.h @@ -11,11 +11,11 @@ #ifndef _SYS_SHA1_H_ #define _SYS_SHA1_H_ -#include "defs.h" +#include "../defs.h" typedef struct { uint32_t state[5]; - uint32_t count[2]; + uint32_t count[2]; uint8_t buffer[64]; } SHA1_CTX; @@ -28,12 +28,12 @@ typedef struct { #endif void SHA1_Transform _((uint32_t state[5], const uint8_t buffer[64])); -void SHA1_Init _((SHA1_CTX *context)); +int SHA1_Init _((SHA1_CTX *context)); void SHA1_Update _((SHA1_CTX *context, const uint8_t *data, size_t len)); -void SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20])); +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/ext/digest/sha1/sha1cc.h b/ext/digest/sha1/sha1cc.h new file mode 100644 index 0000000000..f39ecc6234 --- /dev/null +++ b/ext/digest/sha1/sha1cc.h @@ -0,0 +1,22 @@ +#define COMMON_DIGEST_FOR_OPENSSL 1 +#include <CommonCrypto/CommonDigest.h> + +#define SHA1_BLOCK_LENGTH CC_SHA1_BLOCK_BYTES +#define SHA1_DIGEST_LENGTH CC_SHA1_DIGEST_LENGTH +#define SHA1_CTX CC_SHA1_CTX + +static DEFINE_UPDATE_FUNC_FOR_UINT(SHA1) +static DEFINE_FINISH_FUNC_FROM_FINAL(SHA1) + +#undef SHA1_Update +#undef SHA1_Finish +#define SHA1_Update rb_digest_SHA1_update +#define SHA1_Finish rb_digest_SHA1_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine SHA1_Init as well. + * This is a NOP on 10.6+. + */ +#undef SHA1_Init +#define SHA1_Init CC_SHA1_Init diff --git a/ext/digest/sha1/sha1init.c b/ext/digest/sha1/sha1init.c index b2146f05a9..c39959f428 100644 --- a/ext/digest/sha1/sha1init.c +++ b/ext/digest/sha1/sha1init.c @@ -1,14 +1,15 @@ /* $RoughId: sha1init.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */ /* $Id$ */ -#include "digest.h" -#if defined(HAVE_OPENSSL_SHA_H) -#include "sha1ossl.h" +#include <ruby/ruby.h> +#include "../digest.h" +#if defined(SHA1_USE_COMMONDIGEST) +#include "sha1cc.h" #else #include "sha1.h" #endif -static rb_digest_metadata_t sha1 = { +static const rb_digest_metadata_t sha1 = { RUBY_DIGEST_API_VERSION, SHA1_DIGEST_LENGTH, SHA1_BLOCK_LENGTH, @@ -19,22 +20,43 @@ static rb_digest_metadata_t sha1 = { }; /* + * Document-class: Digest::SHA1 < Digest::Base * 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. + * + * See Digest::Instance for digest API. + * + * SHA-1 calculates a digest of 160 bits (20 bytes). + * + * == Examples + * require 'digest' + * + * # Compute a complete digest + * Digest::SHA1.hexdigest 'abc' #=> "a9993e36..." + * + * # Compute digest by chunks + * sha1 = Digest::SHA1.new # =>#<Digest::SHA1> + * sha1.update "ab" + * sha1 << "c" # alias for #update + * sha1.hexdigest # => "a9993e36..." + * + * # Use the same object to compute another digest + * sha1.reset + * sha1 << "message" + * sha1.hexdigest # => "6f9b9af3..." */ void -Init_sha1() +Init_sha1(void) { VALUE mDigest, cDigest_Base, cDigest_SHA1; - - rb_require("digest"); - - mDigest = rb_path2class("Digest"); - cDigest_Base = rb_path2class("Digest::Base"); - cDigest_SHA1 = rb_define_class_under(mDigest, "SHA1", cDigest_Base); +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif + mDigest = rb_digest_namespace(); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); - rb_ivar_set(cDigest_SHA1, rb_intern("metadata"), - Data_Wrap_Struct(rb_cObject, 0, 0, &sha1)); + cDigest_SHA1 = rb_define_class_under(mDigest, "SHA1", cDigest_Base); + rb_iv_set(cDigest_SHA1, "metadata", rb_digest_make_metadata(&sha1)); } diff --git a/ext/digest/sha1/sha1ossl.c b/ext/digest/sha1/sha1ossl.c deleted file mode 100644 index 452cf35084..0000000000 --- a/ext/digest/sha1/sha1ossl.c +++ /dev/null @@ -1,10 +0,0 @@ -/* $Id$ */ - -#include "defs.h" -#include "sha1ossl.h" - -void -SHA1_Finish(SHA1_CTX *ctx, char *buf) -{ - SHA1_Final((unsigned char *)buf, ctx); -} diff --git a/ext/digest/sha1/sha1ossl.h b/ext/digest/sha1/sha1ossl.h deleted file mode 100644 index 8f9984cc64..0000000000 --- a/ext/digest/sha1/sha1ossl.h +++ /dev/null @@ -1,20 +0,0 @@ -/* $Id$ */ - -#ifndef SHA1OSSL_H_INCLUDED -#define SHA1OSSL_H_INCLUDED - -#include <stddef.h> -#include <openssl/sha.h> - -#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 diff --git a/ext/digest/sha2/.cvsignore b/ext/digest/sha2/.cvsignore deleted file mode 100644 index 4088712231..0000000000 --- a/ext/digest/sha2/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -mkmf.log -*.def diff --git a/ext/digest/sha2/depend b/ext/digest/sha2/depend index 225d6ad52b..2b74776b3e 100644 --- a/ext/digest/sha2/depend +++ b/ext/digest/sha2/depend @@ -1,5 +1,332 @@ -sha2.o: sha2.c sha2.h $(srcdir)/../defs.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h -sha2init.o: sha2init.c $(srcdir)/../digest.h $(hdrdir)/ruby.h \ - $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h \ - sha2.h $(srcdir)/../defs.h +sha2.o: sha2.c sha2.h $(srcdir)/../defs.h +sha2init.o: $(LOCAL_HDRS) + +# AUTOGENERATED DEPENDENCIES START +sha2.o: $(RUBY_EXTCONF_H) +sha2.o: $(arch_hdrdir)/ruby/config.h +sha2.o: $(hdrdir)/ruby.h +sha2.o: $(hdrdir)/ruby/assert.h +sha2.o: $(hdrdir)/ruby/backward.h +sha2.o: $(hdrdir)/ruby/backward/2/assume.h +sha2.o: $(hdrdir)/ruby/backward/2/attributes.h +sha2.o: $(hdrdir)/ruby/backward/2/bool.h +sha2.o: $(hdrdir)/ruby/backward/2/inttypes.h +sha2.o: $(hdrdir)/ruby/backward/2/limits.h +sha2.o: $(hdrdir)/ruby/backward/2/long_long.h +sha2.o: $(hdrdir)/ruby/backward/2/stdalign.h +sha2.o: $(hdrdir)/ruby/backward/2/stdarg.h +sha2.o: $(hdrdir)/ruby/defines.h +sha2.o: $(hdrdir)/ruby/intern.h +sha2.o: $(hdrdir)/ruby/internal/abi.h +sha2.o: $(hdrdir)/ruby/internal/anyargs.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/char.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/double.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/int.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/long.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/short.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +sha2.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +sha2.o: $(hdrdir)/ruby/internal/assume.h +sha2.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +sha2.o: $(hdrdir)/ruby/internal/attr/artificial.h +sha2.o: $(hdrdir)/ruby/internal/attr/cold.h +sha2.o: $(hdrdir)/ruby/internal/attr/const.h +sha2.o: $(hdrdir)/ruby/internal/attr/constexpr.h +sha2.o: $(hdrdir)/ruby/internal/attr/deprecated.h +sha2.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +sha2.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +sha2.o: $(hdrdir)/ruby/internal/attr/error.h +sha2.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +sha2.o: $(hdrdir)/ruby/internal/attr/forceinline.h +sha2.o: $(hdrdir)/ruby/internal/attr/format.h +sha2.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +sha2.o: $(hdrdir)/ruby/internal/attr/noalias.h +sha2.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +sha2.o: $(hdrdir)/ruby/internal/attr/noexcept.h +sha2.o: $(hdrdir)/ruby/internal/attr/noinline.h +sha2.o: $(hdrdir)/ruby/internal/attr/nonnull.h +sha2.o: $(hdrdir)/ruby/internal/attr/noreturn.h +sha2.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +sha2.o: $(hdrdir)/ruby/internal/attr/pure.h +sha2.o: $(hdrdir)/ruby/internal/attr/restrict.h +sha2.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +sha2.o: $(hdrdir)/ruby/internal/attr/warning.h +sha2.o: $(hdrdir)/ruby/internal/attr/weakref.h +sha2.o: $(hdrdir)/ruby/internal/cast.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +sha2.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +sha2.o: $(hdrdir)/ruby/internal/compiler_since.h +sha2.o: $(hdrdir)/ruby/internal/config.h +sha2.o: $(hdrdir)/ruby/internal/constant_p.h +sha2.o: $(hdrdir)/ruby/internal/core.h +sha2.o: $(hdrdir)/ruby/internal/core/rarray.h +sha2.o: $(hdrdir)/ruby/internal/core/rbasic.h +sha2.o: $(hdrdir)/ruby/internal/core/rbignum.h +sha2.o: $(hdrdir)/ruby/internal/core/rclass.h +sha2.o: $(hdrdir)/ruby/internal/core/rdata.h +sha2.o: $(hdrdir)/ruby/internal/core/rfile.h +sha2.o: $(hdrdir)/ruby/internal/core/rhash.h +sha2.o: $(hdrdir)/ruby/internal/core/robject.h +sha2.o: $(hdrdir)/ruby/internal/core/rregexp.h +sha2.o: $(hdrdir)/ruby/internal/core/rstring.h +sha2.o: $(hdrdir)/ruby/internal/core/rstruct.h +sha2.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +sha2.o: $(hdrdir)/ruby/internal/ctype.h +sha2.o: $(hdrdir)/ruby/internal/dllexport.h +sha2.o: $(hdrdir)/ruby/internal/dosish.h +sha2.o: $(hdrdir)/ruby/internal/error.h +sha2.o: $(hdrdir)/ruby/internal/eval.h +sha2.o: $(hdrdir)/ruby/internal/event.h +sha2.o: $(hdrdir)/ruby/internal/fl_type.h +sha2.o: $(hdrdir)/ruby/internal/gc.h +sha2.o: $(hdrdir)/ruby/internal/glob.h +sha2.o: $(hdrdir)/ruby/internal/globals.h +sha2.o: $(hdrdir)/ruby/internal/has/attribute.h +sha2.o: $(hdrdir)/ruby/internal/has/builtin.h +sha2.o: $(hdrdir)/ruby/internal/has/c_attribute.h +sha2.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +sha2.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +sha2.o: $(hdrdir)/ruby/internal/has/extension.h +sha2.o: $(hdrdir)/ruby/internal/has/feature.h +sha2.o: $(hdrdir)/ruby/internal/has/warning.h +sha2.o: $(hdrdir)/ruby/internal/intern/array.h +sha2.o: $(hdrdir)/ruby/internal/intern/bignum.h +sha2.o: $(hdrdir)/ruby/internal/intern/class.h +sha2.o: $(hdrdir)/ruby/internal/intern/compar.h +sha2.o: $(hdrdir)/ruby/internal/intern/complex.h +sha2.o: $(hdrdir)/ruby/internal/intern/cont.h +sha2.o: $(hdrdir)/ruby/internal/intern/dir.h +sha2.o: $(hdrdir)/ruby/internal/intern/enum.h +sha2.o: $(hdrdir)/ruby/internal/intern/enumerator.h +sha2.o: $(hdrdir)/ruby/internal/intern/error.h +sha2.o: $(hdrdir)/ruby/internal/intern/eval.h +sha2.o: $(hdrdir)/ruby/internal/intern/file.h +sha2.o: $(hdrdir)/ruby/internal/intern/hash.h +sha2.o: $(hdrdir)/ruby/internal/intern/io.h +sha2.o: $(hdrdir)/ruby/internal/intern/load.h +sha2.o: $(hdrdir)/ruby/internal/intern/marshal.h +sha2.o: $(hdrdir)/ruby/internal/intern/numeric.h +sha2.o: $(hdrdir)/ruby/internal/intern/object.h +sha2.o: $(hdrdir)/ruby/internal/intern/parse.h +sha2.o: $(hdrdir)/ruby/internal/intern/proc.h +sha2.o: $(hdrdir)/ruby/internal/intern/process.h +sha2.o: $(hdrdir)/ruby/internal/intern/random.h +sha2.o: $(hdrdir)/ruby/internal/intern/range.h +sha2.o: $(hdrdir)/ruby/internal/intern/rational.h +sha2.o: $(hdrdir)/ruby/internal/intern/re.h +sha2.o: $(hdrdir)/ruby/internal/intern/ruby.h +sha2.o: $(hdrdir)/ruby/internal/intern/select.h +sha2.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +sha2.o: $(hdrdir)/ruby/internal/intern/set.h +sha2.o: $(hdrdir)/ruby/internal/intern/signal.h +sha2.o: $(hdrdir)/ruby/internal/intern/sprintf.h +sha2.o: $(hdrdir)/ruby/internal/intern/string.h +sha2.o: $(hdrdir)/ruby/internal/intern/struct.h +sha2.o: $(hdrdir)/ruby/internal/intern/thread.h +sha2.o: $(hdrdir)/ruby/internal/intern/time.h +sha2.o: $(hdrdir)/ruby/internal/intern/variable.h +sha2.o: $(hdrdir)/ruby/internal/intern/vm.h +sha2.o: $(hdrdir)/ruby/internal/interpreter.h +sha2.o: $(hdrdir)/ruby/internal/iterator.h +sha2.o: $(hdrdir)/ruby/internal/memory.h +sha2.o: $(hdrdir)/ruby/internal/method.h +sha2.o: $(hdrdir)/ruby/internal/module.h +sha2.o: $(hdrdir)/ruby/internal/newobj.h +sha2.o: $(hdrdir)/ruby/internal/scan_args.h +sha2.o: $(hdrdir)/ruby/internal/special_consts.h +sha2.o: $(hdrdir)/ruby/internal/static_assert.h +sha2.o: $(hdrdir)/ruby/internal/stdalign.h +sha2.o: $(hdrdir)/ruby/internal/stdbool.h +sha2.o: $(hdrdir)/ruby/internal/stdckdint.h +sha2.o: $(hdrdir)/ruby/internal/symbol.h +sha2.o: $(hdrdir)/ruby/internal/value.h +sha2.o: $(hdrdir)/ruby/internal/value_type.h +sha2.o: $(hdrdir)/ruby/internal/variable.h +sha2.o: $(hdrdir)/ruby/internal/warning_push.h +sha2.o: $(hdrdir)/ruby/internal/xmalloc.h +sha2.o: $(hdrdir)/ruby/missing.h +sha2.o: $(hdrdir)/ruby/ruby.h +sha2.o: $(hdrdir)/ruby/st.h +sha2.o: $(hdrdir)/ruby/subst.h +sha2.o: $(srcdir)/../defs.h +sha2.o: sha2.c +sha2.o: sha2.h +sha2init.o: $(RUBY_EXTCONF_H) +sha2init.o: $(arch_hdrdir)/ruby/config.h +sha2init.o: $(hdrdir)/ruby.h +sha2init.o: $(hdrdir)/ruby/assert.h +sha2init.o: $(hdrdir)/ruby/backward.h +sha2init.o: $(hdrdir)/ruby/backward/2/assume.h +sha2init.o: $(hdrdir)/ruby/backward/2/attributes.h +sha2init.o: $(hdrdir)/ruby/backward/2/bool.h +sha2init.o: $(hdrdir)/ruby/backward/2/inttypes.h +sha2init.o: $(hdrdir)/ruby/backward/2/limits.h +sha2init.o: $(hdrdir)/ruby/backward/2/long_long.h +sha2init.o: $(hdrdir)/ruby/backward/2/stdalign.h +sha2init.o: $(hdrdir)/ruby/backward/2/stdarg.h +sha2init.o: $(hdrdir)/ruby/defines.h +sha2init.o: $(hdrdir)/ruby/intern.h +sha2init.o: $(hdrdir)/ruby/internal/abi.h +sha2init.o: $(hdrdir)/ruby/internal/anyargs.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +sha2init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +sha2init.o: $(hdrdir)/ruby/internal/assume.h +sha2init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +sha2init.o: $(hdrdir)/ruby/internal/attr/artificial.h +sha2init.o: $(hdrdir)/ruby/internal/attr/cold.h +sha2init.o: $(hdrdir)/ruby/internal/attr/const.h +sha2init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +sha2init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +sha2init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +sha2init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +sha2init.o: $(hdrdir)/ruby/internal/attr/error.h +sha2init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +sha2init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +sha2init.o: $(hdrdir)/ruby/internal/attr/format.h +sha2init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +sha2init.o: $(hdrdir)/ruby/internal/attr/noalias.h +sha2init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +sha2init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +sha2init.o: $(hdrdir)/ruby/internal/attr/noinline.h +sha2init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +sha2init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +sha2init.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +sha2init.o: $(hdrdir)/ruby/internal/attr/pure.h +sha2init.o: $(hdrdir)/ruby/internal/attr/restrict.h +sha2init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +sha2init.o: $(hdrdir)/ruby/internal/attr/warning.h +sha2init.o: $(hdrdir)/ruby/internal/attr/weakref.h +sha2init.o: $(hdrdir)/ruby/internal/cast.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +sha2init.o: $(hdrdir)/ruby/internal/compiler_since.h +sha2init.o: $(hdrdir)/ruby/internal/config.h +sha2init.o: $(hdrdir)/ruby/internal/constant_p.h +sha2init.o: $(hdrdir)/ruby/internal/core.h +sha2init.o: $(hdrdir)/ruby/internal/core/rarray.h +sha2init.o: $(hdrdir)/ruby/internal/core/rbasic.h +sha2init.o: $(hdrdir)/ruby/internal/core/rbignum.h +sha2init.o: $(hdrdir)/ruby/internal/core/rclass.h +sha2init.o: $(hdrdir)/ruby/internal/core/rdata.h +sha2init.o: $(hdrdir)/ruby/internal/core/rfile.h +sha2init.o: $(hdrdir)/ruby/internal/core/rhash.h +sha2init.o: $(hdrdir)/ruby/internal/core/robject.h +sha2init.o: $(hdrdir)/ruby/internal/core/rregexp.h +sha2init.o: $(hdrdir)/ruby/internal/core/rstring.h +sha2init.o: $(hdrdir)/ruby/internal/core/rstruct.h +sha2init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +sha2init.o: $(hdrdir)/ruby/internal/ctype.h +sha2init.o: $(hdrdir)/ruby/internal/dllexport.h +sha2init.o: $(hdrdir)/ruby/internal/dosish.h +sha2init.o: $(hdrdir)/ruby/internal/error.h +sha2init.o: $(hdrdir)/ruby/internal/eval.h +sha2init.o: $(hdrdir)/ruby/internal/event.h +sha2init.o: $(hdrdir)/ruby/internal/fl_type.h +sha2init.o: $(hdrdir)/ruby/internal/gc.h +sha2init.o: $(hdrdir)/ruby/internal/glob.h +sha2init.o: $(hdrdir)/ruby/internal/globals.h +sha2init.o: $(hdrdir)/ruby/internal/has/attribute.h +sha2init.o: $(hdrdir)/ruby/internal/has/builtin.h +sha2init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +sha2init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +sha2init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +sha2init.o: $(hdrdir)/ruby/internal/has/extension.h +sha2init.o: $(hdrdir)/ruby/internal/has/feature.h +sha2init.o: $(hdrdir)/ruby/internal/has/warning.h +sha2init.o: $(hdrdir)/ruby/internal/intern/array.h +sha2init.o: $(hdrdir)/ruby/internal/intern/bignum.h +sha2init.o: $(hdrdir)/ruby/internal/intern/class.h +sha2init.o: $(hdrdir)/ruby/internal/intern/compar.h +sha2init.o: $(hdrdir)/ruby/internal/intern/complex.h +sha2init.o: $(hdrdir)/ruby/internal/intern/cont.h +sha2init.o: $(hdrdir)/ruby/internal/intern/dir.h +sha2init.o: $(hdrdir)/ruby/internal/intern/enum.h +sha2init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +sha2init.o: $(hdrdir)/ruby/internal/intern/error.h +sha2init.o: $(hdrdir)/ruby/internal/intern/eval.h +sha2init.o: $(hdrdir)/ruby/internal/intern/file.h +sha2init.o: $(hdrdir)/ruby/internal/intern/hash.h +sha2init.o: $(hdrdir)/ruby/internal/intern/io.h +sha2init.o: $(hdrdir)/ruby/internal/intern/load.h +sha2init.o: $(hdrdir)/ruby/internal/intern/marshal.h +sha2init.o: $(hdrdir)/ruby/internal/intern/numeric.h +sha2init.o: $(hdrdir)/ruby/internal/intern/object.h +sha2init.o: $(hdrdir)/ruby/internal/intern/parse.h +sha2init.o: $(hdrdir)/ruby/internal/intern/proc.h +sha2init.o: $(hdrdir)/ruby/internal/intern/process.h +sha2init.o: $(hdrdir)/ruby/internal/intern/random.h +sha2init.o: $(hdrdir)/ruby/internal/intern/range.h +sha2init.o: $(hdrdir)/ruby/internal/intern/rational.h +sha2init.o: $(hdrdir)/ruby/internal/intern/re.h +sha2init.o: $(hdrdir)/ruby/internal/intern/ruby.h +sha2init.o: $(hdrdir)/ruby/internal/intern/select.h +sha2init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +sha2init.o: $(hdrdir)/ruby/internal/intern/set.h +sha2init.o: $(hdrdir)/ruby/internal/intern/signal.h +sha2init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +sha2init.o: $(hdrdir)/ruby/internal/intern/string.h +sha2init.o: $(hdrdir)/ruby/internal/intern/struct.h +sha2init.o: $(hdrdir)/ruby/internal/intern/thread.h +sha2init.o: $(hdrdir)/ruby/internal/intern/time.h +sha2init.o: $(hdrdir)/ruby/internal/intern/variable.h +sha2init.o: $(hdrdir)/ruby/internal/intern/vm.h +sha2init.o: $(hdrdir)/ruby/internal/interpreter.h +sha2init.o: $(hdrdir)/ruby/internal/iterator.h +sha2init.o: $(hdrdir)/ruby/internal/memory.h +sha2init.o: $(hdrdir)/ruby/internal/method.h +sha2init.o: $(hdrdir)/ruby/internal/module.h +sha2init.o: $(hdrdir)/ruby/internal/newobj.h +sha2init.o: $(hdrdir)/ruby/internal/scan_args.h +sha2init.o: $(hdrdir)/ruby/internal/special_consts.h +sha2init.o: $(hdrdir)/ruby/internal/static_assert.h +sha2init.o: $(hdrdir)/ruby/internal/stdalign.h +sha2init.o: $(hdrdir)/ruby/internal/stdbool.h +sha2init.o: $(hdrdir)/ruby/internal/stdckdint.h +sha2init.o: $(hdrdir)/ruby/internal/symbol.h +sha2init.o: $(hdrdir)/ruby/internal/value.h +sha2init.o: $(hdrdir)/ruby/internal/value_type.h +sha2init.o: $(hdrdir)/ruby/internal/variable.h +sha2init.o: $(hdrdir)/ruby/internal/warning_push.h +sha2init.o: $(hdrdir)/ruby/internal/xmalloc.h +sha2init.o: $(hdrdir)/ruby/missing.h +sha2init.o: $(hdrdir)/ruby/ruby.h +sha2init.o: $(hdrdir)/ruby/st.h +sha2init.o: $(hdrdir)/ruby/subst.h +sha2init.o: $(srcdir)/../digest.h +sha2init.o: sha2.h +sha2init.o: sha2cc.h +sha2init.o: sha2init.c +# AUTOGENERATED DEPENDENCIES END diff --git a/ext/digest/sha2/extconf.rb b/ext/digest/sha2/extconf.rb index c084a51a64..3b772675e1 100644 --- a/ext/digest/sha2/extconf.rb +++ b/ext/digest/sha2/extconf.rb @@ -1,24 +1,19 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: false # $RoughId: extconf.rb,v 1.4 2001/08/14 19:54:51 knu Exp $ # $Id$ require "mkmf" +require File.expand_path("../../digest_conf", __FILE__) -$defs << "-DHAVE_CONFIG_H" -$INCFLAGS << " -I$(srcdir)/.." +$objs = [ "sha2init.#{$OBJEXT}" ] -$objs = [ - "sha2.#{$OBJEXT}", - "sha2init.#{$OBJEXT}", -] +unless digest_conf("sha2") + have_type("u_int8_t") +end have_header("sys/cdefs.h") -have_header("inttypes.h") - -have_header("unistd.h") - $preload = %w[digest] -if have_type("uint64_t", "defs.h", $defs.join(' ')) - create_makefile("digest/sha2") -end +create_makefile("digest/sha2") diff --git a/ext/digest/sha2/lib/sha2.rb b/ext/digest/sha2/lib/sha2.rb index 52dd639f9b..f17593a206 100644 --- a/ext/digest/sha2/lib/sha2.rb +++ b/ext/digest/sha2/lib/sha2.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: false #-- # sha2.rb - defines Digest::SHA2 class which wraps up the SHA256, # SHA384, and SHA512 classes. @@ -10,16 +11,53 @@ # $Id$ require 'digest' +require 'digest/sha2/loader' module Digest # # A meta digest provider class for SHA256, SHA384 and SHA512. # + # FIPS 180-2 describes SHA2 family of digest algorithms. It defines + # three algorithms: + # * one which works on chunks of 512 bits and returns a 256-bit + # digest (SHA256), + # * one which works on chunks of 1024 bits and returns a 384-bit + # digest (SHA384), + # * and one which works on chunks of 1024 bits and returns a 512-bit + # digest (SHA512). + # + # ==Examples + # require 'digest' + # + # # Compute a complete digest + # Digest::SHA2.hexdigest 'abc' # => "ba7816bf8..." + # Digest::SHA2.new(256).hexdigest 'abc' # => "ba7816bf8..." + # Digest::SHA256.hexdigest 'abc' # => "ba7816bf8..." + # + # Digest::SHA2.new(384).hexdigest 'abc' # => "cb00753f4..." + # Digest::SHA384.hexdigest 'abc' # => "cb00753f4..." + # + # Digest::SHA2.new(512).hexdigest 'abc' # => "ddaf35a19..." + # Digest::SHA512.hexdigest 'abc' # => "ddaf35a19..." + # + # # Compute digest by chunks + # sha2 = Digest::SHA2.new # =>#<Digest::SHA2:256> + # sha2.update "ab" + # sha2 << "c" # alias for #update + # sha2.hexdigest # => "ba7816bf8..." + # + # # Use the same object to compute another digest + # sha2.reset + # sha2 << "message" + # sha2.hexdigest # => "ab530a13e..." + # class SHA2 < Digest::Class # call-seq: - # Digest::SHA2.new(bitlen = 256) -> digest_obj + # Digest::SHA2.new(bitlen = 256) -> digest_obj + # + # Create a new SHA2 hash object with a given bit length. # - # Creates a new SHA2 hash object with a given bit length. + # Valid bit lengths are 256, 384 and 512. def initialize(bitlen = 256) case bitlen when 256 @@ -34,39 +72,70 @@ module Digest @bitlen = bitlen end - # :nodoc: + # call-seq: + # digest_obj.reset -> digest_obj + # + # Reset the digest to the initial state and return self. def reset @sha2.reset self end - # :nodoc: + # call-seq: + # digest_obj.update(string) -> digest_obj + # digest_obj << string -> digest_obj + # + # Update the digest using a given _string_ and return self. def update(str) @sha2.update(str) self end alias << update - def finish + def finish # :nodoc: @sha2.digest! end private :finish + + # call-seq: + # digest_obj.block_length -> Integer + # + # Return the block length of the digest in bytes. + # + # Digest::SHA256.new.block_length * 8 + # # => 512 + # Digest::SHA384.new.block_length * 8 + # # => 1024 + # Digest::SHA512.new.block_length * 8 + # # => 1024 def block_length @sha2.block_length end + # call-seq: + # digest_obj.digest_length -> Integer + # + # Return the length of the hash value (the digest) in bytes. + # + # Digest::SHA256.new.digest_length * 8 + # # => 256 + # Digest::SHA384.new.digest_length * 8 + # # => 384 + # Digest::SHA512.new.digest_length * 8 + # # => 512 + # + # For example, digests produced by Digest::SHA256 will always be 32 bytes + # (256 bits) in size. def digest_length @sha2.digest_length end - # :nodoc: - def initialize_copy(other) + def initialize_copy(other) # :nodoc: @sha2 = other.instance_eval { @sha2.clone } end - # :nodoc: - def inspect + def inspect # :nodoc: "#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest] end end diff --git a/ext/digest/sha2/lib/sha2/loader.rb b/ext/digest/sha2/lib/sha2/loader.rb new file mode 100644 index 0000000000..7d6d04a59c --- /dev/null +++ b/ext/digest/sha2/lib/sha2/loader.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require 'digest/sha2.so' diff --git a/ext/digest/sha2/sha2.c b/ext/digest/sha2/sha2.c index aca9ee926f..21d5acbe96 100644 --- a/ext/digest/sha2/sha2.c +++ b/ext/digest/sha2/sha2.c @@ -1,11 +1,9 @@ /* - * sha2.c + * FILE: sha2.c + * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ * - * Version 1.0.0beta1 - * - * Written by Aaron D. Gifford <me@aarongifford.com> - * - * Copyright 2000 Aaron D. Gifford. All rights reserved. + * Copyright (c) 2000-2001, Aaron D. Gifford + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -18,11 +16,11 @@ * 3. Neither the name of the copyright holder nor the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) 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) @@ -31,15 +29,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * $OrigId: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $ + * $RoughId: sha2.c,v 1.3 2002/02/26 22:03:36 knu Exp $ + * $Id$ */ -/* $RoughId: sha2.c,v 1.3 2002/02/26 22:03:36 knu Exp $ */ -/* $Id$ */ - -#include "sha2.h" -#include <stdio.h> +#include "../defs.h" #include <string.h> /* memcpy()/memset() or bcopy()/bzero() */ #include <assert.h> /* assert() */ +#include "sha2.h" /* * ASSERT NOTE: @@ -63,15 +61,64 @@ /*** SHA-256/384/512 Machine Architecture Definitions *****************/ +/* + * BYTE_ORDER NOTE: + * + * Please make sure that your system defines BYTE_ORDER. If your + * architecture is little-endian, make sure it also defines + * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are + * equivalent. + * + * If your system does not define the above, then you can do so by + * hand like this: + * + * #define LITTLE_ENDIAN 1234 + * #define BIG_ENDIAN 4321 + * + * And for little-endian machines, add: + * + * #define BYTE_ORDER LITTLE_ENDIAN + * + * Or for big-endian machines: + * + * #define BYTE_ORDER BIG_ENDIAN + * + * The FreeBSD machine this was written on defines BYTE_ORDER + * appropriately by including <sys/types.h> (which in turn includes + * <machine/endian.h> where the appropriate definitions are actually + * made). + */ +#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) +#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN +#endif + +/* + * Define the followingsha2_* types to types of the correct length on + * the native architecture. Most BSD systems and Linux define u_intXX_t + * types. Machines with very recent ANSI C headers, can use the + * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H + * during compile or in the sha.h header file. + * + * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t + * will need to define these three typedefs below (and the appropriate + * ones in sha.h too) by hand according to their system architecture. + * + * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t + * types and pointing out recent ANSI C support for uintXX_t in inttypes.h. + */ +#ifdef SHA2_USE_INTTYPES_H + typedef uint8_t sha2_byte; /* Exactly 1 byte */ typedef uint32_t sha2_word32; /* Exactly 4 bytes */ typedef uint64_t sha2_word64; /* Exactly 8 bytes */ -#if defined(__GNUC__) || defined(_HPUX_SOURCE) || defined(__IBMC__) -#define ULL(number) number##ULL -#else -#define ULL(number) (uint64_t)(number) -#endif +#else /* SHA2_USE_INTTYPES_H */ + +typedef u_int8_t sha2_byte; /* Exactly 1 byte */ +typedef u_int32_t sha2_word32; /* Exactly 4 bytes */ +typedef u_int64_t sha2_word64; /* Exactly 8 bytes */ + +#endif /* SHA2_USE_INTTYPES_H */ /*** SHA-256/384/512 Various Length Definitions ***********************/ @@ -81,12 +128,17 @@ typedef uint64_t sha2_word64; /* Exactly 8 bytes */ #define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16) +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__GNUC__) || defined(__IBMC__) +#define ULL(number) number##ULL +#else +#define ULL(number) (uint64_t)(number) +#endif /*** ENDIAN REVERSAL MACROS *******************************************/ -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN #define REVERSE32(w,x) { \ sha2_word32 tmp = (w); \ tmp = (tmp >> 16) | (tmp << 16); \ - (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \ + (x) = ((tmp & (sha2_word32)0xff00ff00UL) >> 8) | ((tmp & (sha2_word32)0x00ff00ffUL) << 8); \ } #define REVERSE64(w,x) { \ sha2_word64 tmp = (w); \ @@ -96,7 +148,7 @@ typedef uint64_t sha2_word64; /* Exactly 8 bytes */ (x) = ((tmp & ULL(0xffff0000ffff0000)) >> 16) | \ ((tmp & ULL(0x0000ffff0000ffff)) << 16); \ } -#endif +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ /* * Macro for incrementally adding the unsigned 64-bit integer n to the @@ -182,7 +234,7 @@ void SHA512_Transform(SHA512_CTX*, const sha2_word64*); /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/ /* Hash constant words K for SHA-256: */ -const static sha2_word32 K256[64] = { +static const sha2_word32 K256[64] = { 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, @@ -202,7 +254,7 @@ const static sha2_word32 K256[64] = { }; /* Initial hash value H for SHA-256: */ -const static sha2_word32 sha256_initial_hash_value[8] = { +static const sha2_word32 sha256_initial_hash_value[8] = { 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, @@ -214,7 +266,7 @@ const static sha2_word32 sha256_initial_hash_value[8] = { }; /* Hash constant words K for SHA-384 and SHA-512: */ -const static sha2_word64 K512[80] = { +static const sha2_word64 K512[80] = { ULL(0x428a2f98d728ae22), ULL(0x7137449123ef65cd), ULL(0xb5c0fbcfec4d3b2f), ULL(0xe9b5dba58189dbbc), ULL(0x3956c25bf348b538), ULL(0x59f111f1b605d019), @@ -258,7 +310,7 @@ const static sha2_word64 K512[80] = { }; /* Initial hash value H for SHA-384 */ -const static sha2_word64 sha384_initial_hash_value[8] = { +static const sha2_word64 sha384_initial_hash_value[8] = { ULL(0xcbbb9d5dc1059ed8), ULL(0x629a292a367cd507), ULL(0x9159015a3070dd17), @@ -270,7 +322,7 @@ const static sha2_word64 sha384_initial_hash_value[8] = { }; /* Initial hash value H for SHA-512 */ -const static sha2_word64 sha512_initial_hash_value[8] = { +static const sha2_word64 sha512_initial_hash_value[8] = { ULL(0x6a09e667f3bcc908), ULL(0xbb67ae8584caa73b), ULL(0x3c6ef372fe94f82b), @@ -281,22 +333,29 @@ const static sha2_word64 sha512_initial_hash_value[8] = { ULL(0x5be0cd19137e2179) }; +/* + * Constant used by SHA256/384/512_End() functions for converting the + * digest to a readable hexadecimal character string: + */ +static const char *sha2_hex_digits = "0123456789abcdef"; + /*** SHA-256: *********************************************************/ -void SHA256_Init(SHA256_CTX* context) { +int SHA256_Init(SHA256_CTX* context) { if (context == (SHA256_CTX*)0) { - return; + return 0; } MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA256_BLOCK_LENGTH); context->bitcount = 0; + return 1; } #ifdef SHA2_UNROLL_TRANSFORM /* Unrolled SHA-256 round macros: */ -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ REVERSE32(*data++, W256[j]); \ @@ -307,7 +366,7 @@ void SHA256_Init(SHA256_CTX* context) { j++ -#else +#else /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \ @@ -316,7 +375,7 @@ void SHA256_Init(SHA256_CTX* context) { (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ j++ -#endif +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND256(a,b,c,d,e,f,g,h) \ s0 = W256[(j+1)&0x0f]; \ @@ -406,15 +465,15 @@ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { j = 0; do { -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN /* Copy data while converting to host byte order */ REVERSE32(*data++,W256[j]); /* Apply the SHA-256 compression function to update a..h */ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j]; -#else +#else /* BYTE_ORDER == LITTLE_ENDIAN */ /* Apply the SHA-256 compression function to update a..h with copy */ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++); -#endif +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ T2 = Sigma0_256(a) + Maj(a, b, c); h = g; g = f; @@ -432,11 +491,11 @@ void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) { /* Part of the message block expansion: */ s0 = W256[(j+1)&0x0f]; s0 = sigma0_256(s0); - s1 = W256[(j+14)&0x0f]; + s1 = W256[(j+14)&0x0f]; s1 = sigma1_256(s1); /* Apply the SHA-256 compression function to update a..h */ - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + + T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); T2 = Sigma0_256(a) + Maj(a, b, c); h = g; @@ -476,9 +535,9 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != NULL && data != NULL); + assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); - usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; + usedspace = (unsigned int)((context->bitcount >> 3) % SHA256_BLOCK_LENGTH); if (usedspace > 0) { /* Calculate how much free space is available in the buffer */ freespace = SHA256_BLOCK_LENGTH - usedspace; @@ -501,7 +560,8 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA256_Transform(context, (const sha2_word32*)data); + MEMCPY_BCOPY(context->buffer, data, SHA256_BLOCK_LENGTH); + SHA256_Transform(context, (sha2_word32*)context->buffer); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -515,17 +575,17 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { usedspace = freespace = 0; } -void SHA256_Finish(SHA256_CTX* context, sha2_byte digest[]) { +int SHA256_Final(sha2_byte digest[SHA256_DIGEST_LENGTH], SHA256_CTX* context) { sha2_word32 *d = (sha2_word32*)digest; unsigned int usedspace; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA256_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { - usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; -#ifndef WORDS_BIGENDIAN + usedspace = (unsigned int)((context->bitcount >> 3) % SHA256_BLOCK_LENGTH); +#if BYTE_ORDER == LITTLE_ENDIAN /* Convert FROM host byte order */ REVERSE64(context->bitcount,context->bitcount); #endif @@ -554,12 +614,13 @@ void SHA256_Finish(SHA256_CTX* context, sha2_byte digest[]) { *context->buffer = 0x80; } /* Set the bit count: */ - *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount; + MEMCPY_BCOPY(&context->buffer[SHA256_SHORT_BLOCK_LENGTH], &context->bitcount, + sizeof(sha2_word64)); /* Final transform: */ SHA256_Transform(context, (sha2_word32*)context->buffer); -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; @@ -574,24 +635,57 @@ void SHA256_Finish(SHA256_CTX* context, sha2_byte digest[]) { } /* Clean up state data: */ - MEMSET_BZERO(context, sizeof(SHA256_CTX)); + MEMSET_BZERO(context, sizeof(*context)); usedspace = 0; + return 1; } +char *SHA256_End(SHA256_CTX* context, char buffer[SHA256_DIGEST_STRING_LENGTH]) { + sha2_byte digest[SHA256_DIGEST_LENGTH], *d = digest; + int i; + + /* Sanity check: */ + assert(context != (SHA256_CTX*)0); + + if (buffer != (char*)0) { + SHA256_Final(digest, context); + for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { + *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha2_hex_digits[*d & 0x0f]; + d++; + } + *buffer = (char)0; + } else { + MEMSET_BZERO(context, sizeof(*context)); + } + MEMSET_BZERO(digest, SHA256_DIGEST_LENGTH); + return buffer; +} + +char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) { + SHA256_CTX context; + + SHA256_Init(&context); + SHA256_Update(&context, data, len); + return SHA256_End(&context, digest); +} + + /*** SHA-512: *********************************************************/ -void SHA512_Init(SHA512_CTX* context) { +int SHA512_Init(SHA512_CTX* context) { if (context == (SHA512_CTX*)0) { - return; + return 0; } MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH); context->bitcount[0] = context->bitcount[1] = 0; + return 1; } #ifdef SHA2_UNROLL_TRANSFORM /* Unrolled SHA-512 round macros: */ -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ REVERSE64(*data++, W512[j]); \ @@ -602,7 +696,7 @@ void SHA512_Init(SHA512_CTX* context) { j++ -#else +#else /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \ @@ -611,7 +705,7 @@ void SHA512_Init(SHA512_CTX* context) { (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ j++ -#endif +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND512(a,b,c,d,e,f,g,h) \ s0 = W512[(j+1)&0x0f]; \ @@ -696,15 +790,15 @@ void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { j = 0; do { -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN /* Convert TO host byte order */ REVERSE64(*data++, W512[j]); /* Apply the SHA-512 compression function to update a..h */ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j]; -#else +#else /* BYTE_ORDER == LITTLE_ENDIAN */ /* Apply the SHA-512 compression function to update a..h with copy */ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++); -#endif +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ T2 = Sigma0_512(a) + Maj(a, b, c); h = g; g = f; @@ -766,9 +860,9 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != NULL && data != NULL); + assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0); - usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; + usedspace = (unsigned int)((context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH); if (usedspace > 0) { /* Calculate how much free space is available in the buffer */ freespace = SHA512_BLOCK_LENGTH - usedspace; @@ -779,7 +873,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { ADDINC128(context->bitcount, freespace << 3); len -= freespace; data += freespace; - SHA512_Transform(context, (const sha2_word64*)context->buffer); + SHA512_Transform(context, (sha2_word64*)context->buffer); } else { /* The buffer is not yet full */ MEMCPY_BCOPY(&context->buffer[usedspace], data, len); @@ -791,7 +885,8 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA512_Transform(context, (const sha2_word64*)data); + MEMCPY_BCOPY(context->buffer, data, SHA512_BLOCK_LENGTH); + SHA512_Transform(context, (sha2_word64*)context->buffer); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -808,8 +903,8 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { void SHA512_Last(SHA512_CTX* context) { unsigned int usedspace; - usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; -#ifndef WORDS_BIGENDIAN + usedspace = (unsigned int)((context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH); +#if BYTE_ORDER == LITTLE_ENDIAN /* Convert FROM host byte order */ REVERSE64(context->bitcount[0],context->bitcount[0]); REVERSE64(context->bitcount[1],context->bitcount[1]); @@ -826,7 +921,7 @@ void SHA512_Last(SHA512_CTX* context) { MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace); } /* Do second-to-last transform: */ - SHA512_Transform(context, (const sha2_word64*)context->buffer); + SHA512_Transform(context, (sha2_word64*)context->buffer); /* And set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2); @@ -839,25 +934,27 @@ void SHA512_Last(SHA512_CTX* context) { *context->buffer = 0x80; } /* Store the length of input data (in bits): */ - *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1]; - *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0]; + MEMCPY_BCOPY(&context->buffer[SHA512_SHORT_BLOCK_LENGTH], &context->bitcount[1], + sizeof(sha2_word64)); + MEMCPY_BCOPY(&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8], &context->bitcount[0], + sizeof(sha2_word64)); /* Final transform: */ - SHA512_Transform(context, (const sha2_word64*)context->buffer); + SHA512_Transform(context, (sha2_word64*)context->buffer); } -void SHA512_Finish(SHA512_CTX* context, sha2_byte digest[]) { +int SHA512_Final(sha2_byte digest[SHA512_DIGEST_LENGTH], SHA512_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA512_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { SHA512_Last(context); /* Save the hash data for output: */ -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; @@ -872,35 +969,68 @@ void SHA512_Finish(SHA512_CTX* context, sha2_byte digest[]) { } /* Zero out state data */ - MEMSET_BZERO(context, sizeof(SHA512_CTX)); + MEMSET_BZERO(context, sizeof(*context)); + return 1; } +char *SHA512_End(SHA512_CTX* context, char buffer[SHA512_DIGEST_STRING_LENGTH]) { + sha2_byte digest[SHA512_DIGEST_LENGTH], *d = digest; + int i; + + /* Sanity check: */ + assert(context != (SHA512_CTX*)0); + + if (buffer != (char*)0) { + SHA512_Final(digest, context); + for (i = 0; i < SHA512_DIGEST_LENGTH; i++) { + *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha2_hex_digits[*d & 0x0f]; + d++; + } + *buffer = (char)0; + } else { + MEMSET_BZERO(context, sizeof(*context)); + } + MEMSET_BZERO(digest, SHA512_DIGEST_LENGTH); + return buffer; +} + +char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) { + SHA512_CTX context; + + SHA512_Init(&context); + SHA512_Update(&context, data, len); + return SHA512_End(&context, digest); +} + + /*** SHA-384: *********************************************************/ -void SHA384_Init(SHA384_CTX* context) { +int SHA384_Init(SHA384_CTX* context) { if (context == (SHA384_CTX*)0) { - return; + return 0; } MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA384_BLOCK_LENGTH); context->bitcount[0] = context->bitcount[1] = 0; + return 1; } void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) { SHA512_Update((SHA512_CTX*)context, data, len); } -void SHA384_Finish(SHA384_CTX* context, sha2_byte digest[]) { +int SHA384_Final(sha2_byte digest[SHA384_DIGEST_LENGTH], SHA384_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA384_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */ -#ifndef WORDS_BIGENDIAN +#if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; @@ -915,5 +1045,37 @@ void SHA384_Finish(SHA384_CTX* context, sha2_byte digest[]) { } /* Zero out state data */ - MEMSET_BZERO(context, sizeof(SHA384_CTX)); + MEMSET_BZERO(context, sizeof(*context)); + return 1; +} + +char *SHA384_End(SHA384_CTX* context, char buffer[SHA384_DIGEST_STRING_LENGTH]) { + sha2_byte digest[SHA384_DIGEST_LENGTH], *d = digest; + int i; + + /* Sanity check: */ + assert(context != (SHA384_CTX*)0); + + if (buffer != (char*)0) { + SHA384_Final(digest, context); + for (i = 0; i < SHA384_DIGEST_LENGTH; i++) { + *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha2_hex_digits[*d & 0x0f]; + d++; + } + *buffer = (char)0; + } else { + MEMSET_BZERO(context, sizeof(*context)); + } + MEMSET_BZERO(digest, SHA384_DIGEST_LENGTH); + return buffer; } + +char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) { + SHA384_CTX context; + + SHA384_Init(&context); + SHA384_Update(&context, data, len); + return SHA384_End(&context, digest); +} + diff --git a/ext/digest/sha2/sha2.h b/ext/digest/sha2/sha2.h index 917d415b73..e58f15ae12 100644 --- a/ext/digest/sha2/sha2.h +++ b/ext/digest/sha2/sha2.h @@ -1,11 +1,9 @@ /* - * sha2.h + * FILE: sha2.h + * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ * - * Version 1.0.0beta1 - * - * Written by Aaron D. Gifford <me@aarongifford.com> - * - * Copyright 2000 Aaron D. Gifford. All rights reserved. + * Copyright (c) 2000-2001, Aaron D. Gifford + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -18,11 +16,11 @@ * 3. Neither the name of the copyright holder nor the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) 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) @@ -31,11 +29,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * $OrigId: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ + * $RoughId: sha2.h,v 1.3 2002/02/24 08:14:32 knu Exp $ + * $Id$ */ -/* $RoughId: sha2.h,v 1.3 2002/02/24 08:14:32 knu Exp $ */ -/* $Id$ */ - #ifndef __SHA2_H__ #define __SHA2_H__ @@ -43,7 +41,37 @@ extern "C" { #endif -#include "defs.h" + +/* + * Import u_intXX_t size_t type definitions from system headers. You + * may need to change this, or define these things yourself in this + * file. + */ +#include <sys/types.h> + +#ifdef RUBY +# ifdef HAVE_PROTOTYPES +# undef NOPROTO +# else +# define NOPROTO +# endif /* HAVE_PROTOTYPES */ +# ifndef BYTE_ORDER +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# ifdef WORDS_BIGENDIAN +# define BYTE_ORDER BIG_ENDIAN +# else +# define BYTE_ORDER LITTLE_ENDIAN +# endif +# endif /* BYTE_ORDER */ +# define SHA2_USE_INTTYPES_H +#else /* RUBY */ +#ifdef SHA2_USE_INTTYPES_H + +#include <inttypes.h> + +#endif /* SHA2_USE_INTTYPES_H */ +#endif /* RUBY */ /*** SHA-256/384/512 Various Length Definitions ***********************/ @@ -59,7 +87,38 @@ extern "C" { /*** SHA-256/384/512 Context Structures *******************************/ +/* NOTE: If your architecture does not define either u_intXX_t types or + * uintXX_t (from inttypes.h), you may need to define things by hand + * for your system: + */ +#ifndef SHA2_USE_INTTYPES_H +# ifdef HAVE_U_INT8_T +typedef u_int8_t uint8_t; /* 1-byte (8-bits) */ +typedef u_int32_t uint32_t; /* 4-bytes (32-bits) */ +typedef u_int64_t uint64_t; /* 8-bytes (64-bits) */ +# else +typedef unsigned char uint8_t; /* 1-byte (8-bits) */ +typedef unsigned int uint32_t; /* 4-bytes (32-bits) */ +typedef unsigned long long uint64_t; /* 8-bytes (64-bits) */ +# endif +#endif +/* + * Most BSD systems already define u_intXX_t types, as does Linux. + * Some systems, however, like Compaq's Tru64 Unix instead can use + * uintXX_t types defined by very recent ANSI C standards and included + * in the file: + * + * #include <inttypes.h> + * + * If you choose to use <inttypes.h> then please define: + * + * #define SHA2_USE_INTTYPES_H + * + * Or on the command line during compile: + * + * cc -DSHA2_USE_INTTYPES_H ... + */ typedef struct _SHA256_CTX { uint32_t state[8]; uint64_t bitcount; @@ -74,32 +133,89 @@ typedef struct _SHA512_CTX { typedef SHA512_CTX SHA384_CTX; +/*** SHA-256/384/512 Function Prototypes ******************************/ #ifdef RUBY #define SHA256_Init rb_Digest_SHA256_Init #define SHA256_Update rb_Digest_SHA256_Update #define SHA256_Finish rb_Digest_SHA256_Finish +#define SHA256_Data rb_Digest_SHA256_Data +#define SHA256_End rb_Digest_SHA256_End +#define SHA256_Last rb_Digest_SHA256_Last +#define SHA256_Transform rb_Digest_SHA256_Transform +#define SHA256_Final(d, c) SHA256_Finish(c, d) #define SHA384_Init rb_Digest_SHA384_Init #define SHA384_Update rb_Digest_SHA384_Update #define SHA384_Finish rb_Digest_SHA384_Finish +#define SHA384_Data rb_Digest_SHA384_Data +#define SHA384_End rb_Digest_SHA384_End +#define SHA384_Last rb_Digest_SHA384_Last +#define SHA384_Transform rb_Digest_SHA384_Transform +#define SHA384_Final(d, c) SHA384_Finish(c, d) #define SHA512_Init rb_Digest_SHA512_Init #define SHA512_Update rb_Digest_SHA512_Update #define SHA512_Finish rb_Digest_SHA512_Finish -#endif - -/*** SHA-256/384/512 Function Prototypes ******************************/ -void SHA256_Init _((SHA256_CTX *)); -void SHA256_Update _((SHA256_CTX*, const uint8_t*, size_t)); -void SHA256_Finish _((SHA256_CTX*, uint8_t[SHA256_DIGEST_LENGTH])); - -void SHA384_Init _((SHA384_CTX*)); -void SHA384_Update _((SHA384_CTX*, const uint8_t*, size_t)); -void SHA384_Finish _((SHA384_CTX*, uint8_t[SHA384_DIGEST_LENGTH])); - -void SHA512_Init _((SHA512_CTX*)); -void SHA512_Update _((SHA512_CTX*, const uint8_t*, size_t)); -void SHA512_Finish _((SHA512_CTX*, uint8_t[SHA512_DIGEST_LENGTH])); +#define SHA512_Data rb_Digest_SHA512_Data +#define SHA512_End rb_Digest_SHA512_End +#define SHA512_Last rb_Digest_SHA512_Last +#define SHA512_Transform rb_Digest_SHA512_Transform +#define SHA512_Final(d, c) SHA512_Finish(c, d) +#endif /* RUBY */ + +#ifndef NOPROTO + +int SHA256_Init(SHA256_CTX *); +void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t); +int SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); +char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); +char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); + +int SHA384_Init(SHA384_CTX*); +void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t); +int SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); +char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); +char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); + +int SHA512_Init(SHA512_CTX*); +void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t); +int SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); +char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); +char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); + +#else /* NOPROTO */ + +int SHA256_Init(); +void SHA256_Update(); +#ifdef RUBY +int SHA256_Finish(); +#else +int SHA256_Final(); +#endif /* RUBY */ +char* SHA256_End(); +char* SHA256_Data(); + +int SHA384_Init(); +void SHA384_Update(); +#ifdef RUBY +int SHA384_Finish(); +#else +int SHA384_Final(); +#endif /* RUBY */ +char* SHA384_End(); +char* SHA384_Data(); + +int SHA512_Init(); +void SHA512_Update(); +#ifdef RUBY +int SHA512_Finish(); +#else +int SHA512_Final(); +#endif /* RUBY */ +char* SHA512_End(); +char* SHA512_Data(); + +#endif /* NOPROTO */ #ifdef __cplusplus } diff --git a/ext/digest/sha2/sha2cc.h b/ext/digest/sha2/sha2cc.h new file mode 100644 index 0000000000..1245a2e2c7 --- /dev/null +++ b/ext/digest/sha2/sha2cc.h @@ -0,0 +1,70 @@ +#define COMMON_DIGEST_FOR_OPENSSL 1 +#include <CommonCrypto/CommonDigest.h> + +/* + * Prior to 10.5, OpenSSL-compatible definitions are missing for + * SHA2 macros, though the CC_ versions are present. + * Add the missing definitions we actually use here if needed. + * Note that the definitions are the argless 10.6+-style. + * The weird CTX mismatch is copied from the 10.6 header. + */ +#ifndef SHA256_DIGEST_LENGTH +#define SHA256_DIGEST_LENGTH CC_SHA256_DIGEST_LENGTH +#define SHA256_CTX CC_SHA256_CTX +#define SHA256_Update CC_SHA256_Update +#define SHA256_Final CC_SHA256_Final +#endif /* !defined SHA256_DIGEST_LENGTH */ + +#ifndef SHA384_DIGEST_LENGTH +#define SHA384_DIGEST_LENGTH CC_SHA384_DIGEST_LENGTH +#define SHA512_CTX CC_SHA512_CTX +#define SHA384_Update CC_SHA384_Update +#define SHA384_Final CC_SHA384_Final +#endif /* !defined SHA384_DIGEST_LENGTH */ + +#ifndef SHA512_DIGEST_LENGTH +#define SHA512_DIGEST_LENGTH CC_SHA512_DIGEST_LENGTH +#define SHA512_Update CC_SHA512_Update +#define SHA512_Final CC_SHA512_Final +#endif /* !defined SHA512_DIGEST_LENGTH */ + +#define SHA256_BLOCK_LENGTH CC_SHA256_BLOCK_BYTES +#define SHA384_BLOCK_LENGTH CC_SHA384_BLOCK_BYTES +#define SHA512_BLOCK_LENGTH CC_SHA512_BLOCK_BYTES + +#define SHA384_CTX CC_SHA512_CTX + +static DEFINE_UPDATE_FUNC_FOR_UINT(SHA256) +static DEFINE_FINISH_FUNC_FROM_FINAL(SHA256) +static DEFINE_UPDATE_FUNC_FOR_UINT(SHA384) +static DEFINE_FINISH_FUNC_FROM_FINAL(SHA384) +static DEFINE_UPDATE_FUNC_FOR_UINT(SHA512) +static DEFINE_FINISH_FUNC_FROM_FINAL(SHA512) + + +#undef SHA256_Update +#undef SHA256_Finish +#define SHA256_Update rb_digest_SHA256_update +#define SHA256_Finish rb_digest_SHA256_finish + +#undef SHA384_Update +#undef SHA384_Finish +#define SHA384_Update rb_digest_SHA384_update +#define SHA384_Finish rb_digest_SHA384_finish + +#undef SHA512_Update +#undef SHA512_Finish +#define SHA512_Update rb_digest_SHA512_update +#define SHA512_Finish rb_digest_SHA512_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine SHA*_Init as well. + * This is a NOP on 10.6+. + */ +#undef SHA256_Init +#define SHA256_Init CC_SHA256_Init +#undef SHA384_Init +#define SHA384_Init CC_SHA384_Init +#undef SHA512_Init +#define SHA512_Init CC_SHA512_Init diff --git a/ext/digest/sha2/sha2init.c b/ext/digest/sha2/sha2init.c index c83a29316a..3923e3724c 100644 --- a/ext/digest/sha2/sha2init.c +++ b/ext/digest/sha2/sha2init.c @@ -1,13 +1,18 @@ /* $RoughId: sha2init.c,v 1.3 2001/07/13 20:00:43 knu Exp $ */ /* $Id$ */ -#include "digest.h" +#include <ruby/ruby.h> +#include "../digest.h" +#if defined(SHA2_USE_COMMONDIGEST) +#include "sha2cc.h" +#else #include "sha2.h" +#endif #define FOREACH_BITLEN(func) func(256) func(384) func(512) #define DEFINE_ALGO_METADATA(bitlen) \ -static rb_digest_metadata_t sha##bitlen = { \ +static const rb_digest_metadata_t sha##bitlen = { \ RUBY_DIGEST_API_VERSION, \ SHA##bitlen##_DIGEST_LENGTH, \ SHA##bitlen##_BLOCK_LENGTH, \ @@ -20,33 +25,50 @@ static rb_digest_metadata_t sha##bitlen = { \ FOREACH_BITLEN(DEFINE_ALGO_METADATA) /* + * Document-class: Digest::SHA256 < Digest::Base + * * Classes for calculating message digests using the SHA-256/384/512 * Secure Hash Algorithm(s) by NIST (the US' National Institute of * Standards and Technology), described in FIPS PUB 180-2. + * + * See SHA2. + */ +/* + * Document-class: Digest::SHA384 < Digest::Base + * + * Classes for calculating message digests using the SHA-256/384/512 + * Secure Hash Algorithm(s) by NIST (the US' National Institute of + * Standards and Technology), described in FIPS PUB 180-2. + * + * See SHA2. + */ +/* + * Document-class: Digest::SHA512 < Digest::Base + * + * Classes for calculating message digests using the SHA-256/384/512 + * Secure Hash Algorithm(s) by NIST (the US' National Institute of + * Standards and Technology), described in FIPS PUB 180-2. + * + * See SHA2. */ void -Init_sha2() +Init_sha2(void) { - VALUE mDigest, cDigest_Base; - ID id_metadata; - -#define DECLARE_ALGO_CLASS(bitlen) \ - VALUE cDigest_SHA##bitlen; - - FOREACH_BITLEN(DECLARE_ALGO_CLASS) - - rb_require("digest"); + VALUE mDigest, cDigest_Base, cDigest_SHA2; + ID id_metadata = rb_id_metadata(); - id_metadata = rb_intern("metadata"); +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif + mDigest = rb_digest_namespace(); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); - mDigest = rb_path2class("Digest"); - cDigest_Base = rb_path2class("Digest::Base"); + cDigest_SHA2 = rb_define_class_under(mDigest, "SHA256", cDigest_Base); + rb_ivar_set(cDigest_SHA2, id_metadata, rb_digest_make_metadata(&sha256)); -#define DEFINE_ALGO_CLASS(bitlen) \ - cDigest_SHA##bitlen = rb_define_class_under(mDigest, "SHA" #bitlen, cDigest_Base); \ -\ - rb_ivar_set(cDigest_SHA##bitlen, id_metadata, \ - Data_Wrap_Struct(rb_cObject, 0, 0, &sha##bitlen)); + cDigest_SHA2 = rb_define_class_under(mDigest, "SHA384", cDigest_Base); + rb_ivar_set(cDigest_SHA2, id_metadata, rb_digest_make_metadata(&sha384)); - FOREACH_BITLEN(DEFINE_ALGO_CLASS) + cDigest_SHA2 = rb_define_class_under(mDigest, "SHA512", cDigest_Base); + rb_ivar_set(cDigest_SHA2, id_metadata, rb_digest_make_metadata(&sha512)); } diff --git a/ext/digest/test.sh b/ext/digest/test.sh deleted file mode 100644 index 328c7575e6..0000000000 --- a/ext/digest/test.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh -# -# $RoughId: test.sh,v 1.5 2001/07/13 15:38:27 knu Exp $ -# $Id$ - -RUBY=${RUBY:=ruby} -MAKE=${MAKE:=make} -CFLAGS=${CFLAGS:=-Wall} - -${RUBY} extconf.rb --with-cflags="${CFLAGS}" -${MAKE} clean -${MAKE} - -for algo in md5 rmd160 sha1 sha2; do - args=--with-cflags="${CFLAGS}" - - if [ $WITH_BUNDLED_ENGINES ]; then - args="$args --with-bundled-$algo" - fi - - (cd $algo && - ${RUBY} extconf.rb $args; - ${MAKE} clean; - ${MAKE}) - ln -sf ../../$algo/$algo.so lib/digest/ -done - -${RUBY} -I. -I./lib ../../test/digest/test_digest.rb - -rm lib/digest/*.so |
