diff options
Diffstat (limited to 'ext/digest')
30 files changed, 347 insertions, 175 deletions
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/bubblebabble.c b/ext/digest/bubblebabble/bubblebabble.c index 6557e43c9d..dac603c0d7 100644 --- a/ext/digest/bubblebabble/bubblebabble.c +++ b/ext/digest/bubblebabble/bubblebabble.c @@ -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); @@ -129,15 +129,14 @@ Init_bubblebabble(void) rb_require("digest"); - rb_mDigest = rb_path2class("Digest"); - rb_mDigest_Instance = rb_path2class("Digest::Instance"); - rb_cDigest_Class = rb_path2class("Digest::Class"); - #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); diff --git a/ext/digest/bubblebabble/depend b/ext/digest/bubblebabble/depend index b995438236..02d88e960c 100644 --- a/ext/digest/bubblebabble/depend +++ b/ext/digest/bubblebabble/depend @@ -2,6 +2,19 @@ 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 @@ -39,6 +52,7 @@ 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 @@ -98,7 +112,6 @@ 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/gc.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 @@ -115,6 +128,7 @@ 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 @@ -129,31 +143,18 @@ 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/rgengc.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/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/gcc_version_since.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/missing.h bubblebabble.o: $(hdrdir)/ruby/ruby.h bubblebabble.o: $(hdrdir)/ruby/st.h diff --git a/ext/digest/defs.h b/ext/digest/defs.h index 77a134f364..9b11f4eca9 100644 --- a/ext/digest/defs.h +++ b/ext/digest/defs.h @@ -16,4 +16,26 @@ # define __END_DECLS #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 856f9caa68..3eabb1d1d6 100644 --- a/ext/digest/depend +++ b/ext/digest/depend @@ -2,6 +2,19 @@ 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 @@ -39,6 +52,7 @@ 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 @@ -98,7 +112,6 @@ 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/gc.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 @@ -115,6 +128,7 @@ 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 @@ -129,31 +143,18 @@ 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/rgengc.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/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/gcc_version_since.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/missing.h digest.o: $(hdrdir)/ruby/ruby.h digest.o: $(hdrdir)/ruby/st.h diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 83f4ee42fc..28f6022754 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -154,7 +154,7 @@ 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); + rb_obj_classname(self), method); } /* @@ -383,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; } @@ -534,14 +534,44 @@ rb_digest_class_init(VALUE self) * * * rb_ivar_set(cDigest_SHA1, rb_intern("metadata"), - * Data_Wrap_Struct(0, 0, 0, (void *)&sha1)); + * 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; !NIL_P(p); p = rb_class_superclass(p)) { @@ -554,8 +584,8 @@ get_digest_base_metadata(VALUE klass) if (NIL_P(p)) rb_raise(rb_eRuntimeError, "Digest::Base cannot be directly inherited in Ruby"); - if (!RB_TYPE_P(obj, T_DATA) || RTYPEDDATA_P(obj)) { - wrong: + algo = get_metadata_ptr(obj); + if (!algo) { if (p == klass) rb_raise(rb_eTypeError, "%"PRIsVALUE"::metadata is not initialized properly", klass); @@ -564,12 +594,6 @@ get_digest_base_metadata(VALUE klass) klass, p); } -#undef RUBY_UNTYPED_DATA_WARNING -#define RUBY_UNTYPED_DATA_WARNING 0 - Data_Get_Struct(obj, rb_digest_metadata_t, algo); - - if (!algo) goto wrong; - switch (algo->api_version) { case 3: break; @@ -602,7 +626,7 @@ 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."); + rb_raise(rb_eRuntimeError, "Digest initialization failed."); } } @@ -614,7 +638,7 @@ 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); @@ -639,7 +663,7 @@ rb_digest_base_copy(VALUE copy, VALUE obj) algo = get_digest_obj_metadata(copy); if (algo != get_digest_obj_metadata(obj)) - rb_raise(rb_eTypeError, "different algorithms"); + rb_raise(rb_eTypeError, "different algorithms"); TypedData_Get_Struct(obj, void, &digest_type, pctx1); TypedData_Get_Struct(copy, void, &digest_type, pctx2); diff --git a/ext/digest/digest.gemspec b/ext/digest/digest.gemspec index 6f3bf8b05f..4a01c5fde1 100644 --- a/ext/digest/digest.gemspec +++ b/ext/digest/digest.gemspec @@ -2,8 +2,13 @@ # 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 = "3.0.0" + spec.version = version_module::Digest::VERSION spec.authors = ["Akinori MUSHA"] spec.email = ["knu@idaemons.org"] @@ -12,36 +17,28 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/ruby/digest" spec.licenses = ["Ruby", "BSD-2-Clause"] - spec.files = [ - "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin/console", "bin/setup", "digest.gemspec", - "ext/digest/bubblebabble/bubblebabble.c", "ext/digest/bubblebabble/extconf.rb", "ext/digest/defs.h", - "ext/digest/digest.c", "ext/digest/digest.h", "ext/digest/digest_conf.rb", "ext/digest/extconf.rb", - "ext/digest/md5/extconf.rb", "ext/digest/md5/md5.c", "ext/digest/md5/md5.h", "ext/digest/md5/md5cc.h", - "ext/digest/md5/md5init.c", "ext/digest/rmd160/extconf.rb", "ext/digest/rmd160/rmd160.c", - "ext/digest/rmd160/rmd160.h", "ext/digest/rmd160/rmd160init.c", "ext/digest/sha1/extconf.rb", - "ext/digest/sha1/sha1.c", "ext/digest/sha1/sha1.h", "ext/digest/sha1/sha1cc.h", - "ext/digest/sha1/sha1init.c", "ext/digest/sha2/extconf.rb", "ext/digest/sha2/lib/sha2.rb", - "ext/digest/sha2/sha2.c", "ext/digest/sha2/sha2.h", "ext/digest/sha2/sha2cc.h", - "ext/digest/sha2/sha2init.c", "ext/digest/test.sh", "ext/openssl/deprecation.rb", - "lib/digest.rb" + spec.files = [ + "LICENSE.txt", + "README.md", + *Dir["lib/digest{.rb,/**/*.rb}"], ] - spec.required_ruby_version = ">= 2.3.0" + spec.required_ruby_version = ">= 2.5.0" spec.bindir = "exe" - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] - spec.extensions = %w[ - ext/digest/extconf.rb - ext/digest/bubblebabble/extconf.rb - ext/digest/md5/extconf.rb - ext/digest/rmd160/extconf.rb - ext/digest/sha1/extconf.rb - ext/digest/sha2/extconf.rb - ] - spec.metadata["msys2_mingw_dependencies"] = "openssl" + spec.executables = [] + + if Gem::Platform === spec.platform and spec.platform =~ 'java' or RUBY_ENGINE == 'jruby' + spec.platform = 'java' - spec.add_development_dependency "bundler" - spec.add_development_dependency "rake" - spec.add_development_dependency "rake-compiler" + 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 0d4f0e7cc2..c5c37583a6 100644 --- a/ext/digest/digest.h +++ b/ext/digest/digest.h @@ -38,9 +38,10 @@ 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); \ + name##_Update(ctx, ptr, stride); \ } \ - if (size > 0) name##_Update(ctx, ptr, size); \ + /* 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) \ @@ -63,10 +64,43 @@ 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) { -#undef RUBY_UNTYPED_DATA_WARNING -#define RUBY_UNTYPED_DATA_WARNING 0 +#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 index 1b929d8732..099d20fcbe 100644 --- a/ext/digest/digest_conf.rb +++ b/ext/digest/digest_conf.rb @@ -2,14 +2,16 @@ def digest_conf(name) unless with_config("bundled-#{name}") - cc = with_config("common-digest") - if cc == true or /\b#{name}\b/ =~ cc - if 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 + 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}" diff --git a/ext/digest/extconf.rb b/ext/digest/extconf.rb index a8c68850a2..0e5f08d794 100644 --- a/ext/digest/extconf.rb +++ b/ext/digest/extconf.rb @@ -6,6 +6,6 @@ require "mkmf" $INSTALLFILES = { "digest.h" => "$(HDRDIR)" -} +} if $extmk create_makefile("digest") diff --git a/ext/digest/lib/digest.rb b/ext/digest/lib/digest.rb index ba0637af32..e995adb450 100644 --- a/ext/digest/lib/digest.rb +++ b/ext/digest/lib/digest.rb @@ -1,5 +1,19 @@ # frozen_string_literal: false -require 'digest.so' + +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 # A mutex for Digest(). @@ -8,7 +22,7 @@ module Digest 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 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/md5/depend b/ext/digest/md5/depend index 258ec88e54..d1c25c28c8 100644 --- a/ext/digest/md5/depend +++ b/ext/digest/md5/depend @@ -10,7 +10,6 @@ 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/gcc_version_since.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 @@ -18,6 +17,7 @@ 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 @@ -55,6 +55,7 @@ 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 @@ -114,7 +115,6 @@ 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/gc.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 @@ -131,6 +131,7 @@ 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 @@ -145,12 +146,12 @@ 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/rgengc.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 @@ -172,7 +173,6 @@ 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/gcc_version_since.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 @@ -180,6 +180,7 @@ 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 @@ -217,6 +218,7 @@ 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 @@ -276,7 +278,6 @@ 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/gc.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 @@ -293,6 +294,7 @@ 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 @@ -307,12 +309,12 @@ 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/rgengc.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 @@ -326,5 +328,6 @@ 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/md5.c b/ext/digest/md5/md5.c index 19fe54a693..3a7fe2cdad 100644 --- a/ext/digest/md5/md5.c +++ b/ext/digest/md5/md5.c @@ -225,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 { diff --git a/ext/digest/md5/md5cc.h b/ext/digest/md5/md5cc.h index e34d7d5c11..a002c17604 100644 --- a/ext/digest/md5/md5cc.h +++ b/ext/digest/md5/md5cc.h @@ -1,8 +1,8 @@ #define COMMON_DIGEST_FOR_OPENSSL 1 #include <CommonCrypto/CommonDigest.h> -#ifdef __clang__ -# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#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. */ @@ -17,3 +17,11 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(MD5) #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 52cba78bf1..c919060587 100644 --- a/ext/digest/md5/md5init.c +++ b/ext/digest/md5/md5init.c @@ -3,6 +3,7 @@ #include <ruby/ruby.h> #include "../digest.h" +#include "../defs.h" #if defined(MD5_USE_COMMONDIGEST) #include "md5cc.h" #else @@ -53,9 +54,8 @@ Init_md5(void) mDigest = rb_define_module("Digest"); /* let rdoc know */ #endif mDigest = rb_digest_namespace(); - cDigest_Base = rb_path2class("Digest::Base"); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); cDigest_MD5 = rb_define_class_under(mDigest, "MD5", cDigest_Base); - rb_iv_set(cDigest_MD5, "metadata", rb_digest_make_metadata(&md5)); } diff --git a/ext/digest/rmd160/depend b/ext/digest/rmd160/depend index 8a7f555754..aec484f7b3 100644 --- a/ext/digest/rmd160/depend +++ b/ext/digest/rmd160/depend @@ -10,7 +10,6 @@ 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/gcc_version_since.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 @@ -18,6 +17,7 @@ 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 @@ -55,6 +55,7 @@ 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 @@ -114,7 +115,6 @@ 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/gc.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 @@ -131,6 +131,7 @@ 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 @@ -145,12 +146,12 @@ 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/rgengc.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 @@ -172,7 +173,6 @@ 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/gcc_version_since.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 @@ -180,6 +180,7 @@ 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 @@ -217,6 +218,7 @@ 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 @@ -276,7 +278,6 @@ 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/gc.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 @@ -293,6 +294,7 @@ 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 @@ -307,12 +309,12 @@ 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/rgengc.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 diff --git a/ext/digest/rmd160/rmd160init.c b/ext/digest/rmd160/rmd160init.c index 2ae81ec4d6..e4b707ed9e 100644 --- a/ext/digest/rmd160/rmd160init.c +++ b/ext/digest/rmd160/rmd160init.c @@ -49,9 +49,8 @@ Init_rmd160(void) mDigest = rb_define_module("Digest"); /* let rdoc know */ #endif mDigest = rb_digest_namespace(); - cDigest_Base = rb_path2class("Digest::Base"); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); cDigest_RMD160 = rb_define_class_under(mDigest, "RMD160", cDigest_Base); - rb_iv_set(cDigest_RMD160, "metadata", rb_digest_make_metadata(&rmd160)); } diff --git a/ext/digest/sha1/depend b/ext/digest/sha1/depend index 055e1fbaa0..e6bd9d8f73 100644 --- a/ext/digest/sha1/depend +++ b/ext/digest/sha1/depend @@ -10,7 +10,6 @@ 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/gcc_version_since.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 @@ -18,6 +17,7 @@ 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 @@ -55,6 +55,7 @@ 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 @@ -114,7 +115,6 @@ 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/gc.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 @@ -131,6 +131,7 @@ 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 @@ -145,12 +146,12 @@ 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/rgengc.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 @@ -172,7 +173,6 @@ 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/gcc_version_since.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 @@ -180,6 +180,7 @@ 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 @@ -217,6 +218,7 @@ 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 @@ -276,7 +278,6 @@ 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/gc.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 @@ -293,6 +294,7 @@ 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 @@ -307,12 +309,12 @@ 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/rgengc.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 @@ -326,5 +328,6 @@ 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/sha1.c b/ext/digest/sha1/sha1.c index 5311227549..003c87d224 100644 --- a/ext/digest/sha1/sha1.c +++ b/ext/digest/sha1/sha1.c @@ -220,20 +220,28 @@ int 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; diff --git a/ext/digest/sha1/sha1cc.h b/ext/digest/sha1/sha1cc.h index 2ed8d646ab..f39ecc6234 100644 --- a/ext/digest/sha1/sha1cc.h +++ b/ext/digest/sha1/sha1cc.h @@ -12,3 +12,11 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA1) #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 f7047bc6d3..c39959f428 100644 --- a/ext/digest/sha1/sha1init.c +++ b/ext/digest/sha1/sha1init.c @@ -55,9 +55,8 @@ Init_sha1(void) mDigest = rb_define_module("Digest"); /* let rdoc know */ #endif mDigest = rb_digest_namespace(); - cDigest_Base = rb_path2class("Digest::Base"); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("Base")); 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/sha2/depend b/ext/digest/sha2/depend index c3399e76f5..2b74776b3e 100644 --- a/ext/digest/sha2/depend +++ b/ext/digest/sha2/depend @@ -10,7 +10,6 @@ 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/gcc_version_since.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 @@ -18,6 +17,7 @@ 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 @@ -55,6 +55,7 @@ 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 @@ -114,7 +115,6 @@ 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/gc.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 @@ -131,6 +131,7 @@ 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 @@ -145,12 +146,12 @@ 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/rgengc.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 @@ -172,7 +173,6 @@ 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/gcc_version_since.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 @@ -180,6 +180,7 @@ 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 @@ -217,6 +218,7 @@ 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 @@ -276,7 +278,6 @@ 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/gc.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 @@ -293,6 +294,7 @@ 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 @@ -307,12 +309,12 @@ 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/rgengc.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 @@ -325,5 +327,6 @@ 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/lib/sha2.rb b/ext/digest/sha2/lib/sha2.rb index 61a0734850..f17593a206 100644 --- a/ext/digest/sha2/lib/sha2.rb +++ b/ext/digest/sha2/lib/sha2.rb @@ -11,7 +11,7 @@ # $Id$ require 'digest' -require 'digest/sha2.so' +require 'digest/sha2/loader' module Digest # 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 e7d7b15c5b..21d5acbe96 100644 --- a/ext/digest/sha2/sha2.c +++ b/ext/digest/sha2/sha2.c @@ -128,7 +128,7 @@ typedef u_int64_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(_HPUX_SOURCE) || defined(__IBMC__) +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__GNUC__) || defined(__IBMC__) #define ULL(number) number##ULL #else #define ULL(number) (uint64_t)(number) diff --git a/ext/digest/sha2/sha2cc.h b/ext/digest/sha2/sha2cc.h index 3f99604465..1245a2e2c7 100644 --- a/ext/digest/sha2/sha2cc.h +++ b/ext/digest/sha2/sha2cc.h @@ -1,6 +1,33 @@ #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 @@ -29,3 +56,15 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA512) #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 6ed275eb71..3923e3724c 100644 --- a/ext/digest/sha2/sha2init.c +++ b/ext/digest/sha2/sha2init.c @@ -25,29 +25,50 @@ static const 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(void) { - VALUE mDigest, cDigest_Base; + VALUE mDigest, cDigest_Base, cDigest_SHA2; ID id_metadata = rb_id_metadata(); -#define DECLARE_ALGO_CLASS(bitlen) \ - VALUE cDigest_SHA##bitlen; - - FOREACH_BITLEN(DECLARE_ALGO_CLASS) - +#if 0 + mDigest = rb_define_module("Digest"); /* let rdoc know */ +#endif mDigest = rb_digest_namespace(); - cDigest_Base = rb_path2class("Digest::Base"); + cDigest_Base = rb_const_get(mDigest, rb_intern_const("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, \ - rb_digest_make_metadata(&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 |
