diff options
Diffstat (limited to 'ext/digest')
| -rw-r--r-- | ext/digest/bubblebabble/depend | 2 | ||||
| -rw-r--r-- | ext/digest/defs.h | 22 | ||||
| -rw-r--r-- | ext/digest/depend | 2 | ||||
| -rw-r--r-- | ext/digest/digest.c | 44 | ||||
| -rw-r--r-- | ext/digest/digest.h | 37 | ||||
| -rw-r--r-- | ext/digest/digest_conf.rb | 18 | ||||
| -rw-r--r-- | ext/digest/lib/digest/version.rb | 3 | ||||
| -rw-r--r-- | ext/digest/md5/depend | 4 | ||||
| -rw-r--r-- | ext/digest/md5/md5cc.h | 12 | ||||
| -rw-r--r-- | ext/digest/md5/md5init.c | 1 | ||||
| -rw-r--r-- | ext/digest/rmd160/depend | 4 | ||||
| -rw-r--r-- | ext/digest/sha1/depend | 4 | ||||
| -rw-r--r-- | ext/digest/sha1/sha1.c | 14 | ||||
| -rw-r--r-- | ext/digest/sha1/sha1cc.h | 8 | ||||
| -rw-r--r-- | ext/digest/sha2/depend | 4 | ||||
| -rw-r--r-- | ext/digest/sha2/sha2cc.h | 39 | ||||
| -rw-r--r-- | ext/digest/test.sh | 30 |
17 files changed, 192 insertions, 56 deletions
diff --git a/ext/digest/bubblebabble/depend b/ext/digest/bubblebabble/depend index 6f0003a66d..02d88e960c 100644 --- a/ext/digest/bubblebabble/depend +++ b/ext/digest/bubblebabble/depend @@ -128,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 @@ -147,6 +148,7 @@ 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 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 6df940a679..3eabb1d1d6 100644 --- a/ext/digest/depend +++ b/ext/digest/depend @@ -128,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 @@ -147,6 +148,7 @@ 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 diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 68837a674c..28f6022754 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -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; diff --git a/ext/digest/digest.h b/ext/digest/digest.h index 68a3da5dd2..c5c37583a6 100644 --- a/ext/digest/digest.h +++ b/ext/digest/digest.h @@ -64,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 36a7d75289..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 != false 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/lib/digest/version.rb b/ext/digest/lib/digest/version.rb index 42fd7acf6e..a56e80c54e 100644 --- a/ext/digest/lib/digest/version.rb +++ b/ext/digest/lib/digest/version.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true module Digest - VERSION = "3.1.1" + # The version string + VERSION = "3.2.1" end diff --git a/ext/digest/md5/depend b/ext/digest/md5/depend index da1b345999..d1c25c28c8 100644 --- a/ext/digest/md5/depend +++ b/ext/digest/md5/depend @@ -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 @@ -150,6 +151,7 @@ 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 @@ -292,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 @@ -311,6 +314,7 @@ 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 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 b81fd94864..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 diff --git a/ext/digest/rmd160/depend b/ext/digest/rmd160/depend index abfa08b023..aec484f7b3 100644 --- a/ext/digest/rmd160/depend +++ b/ext/digest/rmd160/depend @@ -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 @@ -150,6 +151,7 @@ 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 @@ -292,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 @@ -311,6 +314,7 @@ 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/sha1/depend b/ext/digest/sha1/depend index d17338e92b..e6bd9d8f73 100644 --- a/ext/digest/sha1/depend +++ b/ext/digest/sha1/depend @@ -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 @@ -150,6 +151,7 @@ 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 @@ -292,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 @@ -311,6 +314,7 @@ 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 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/sha2/depend b/ext/digest/sha2/depend index 7b88b6411f..2b74776b3e 100644 --- a/ext/digest/sha2/depend +++ b/ext/digest/sha2/depend @@ -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 @@ -150,6 +151,7 @@ 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 @@ -292,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 @@ -311,6 +314,7 @@ 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 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/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 |
