From c4fb182e7e66bbd20045cc1bdd92baa74ddd3b50 Mon Sep 17 00:00:00 2001 From: Adam Daniels Date: Mon, 4 Mar 2024 16:30:59 -0500 Subject: [PATCH 1/3] Document preferred use of Digest() and threadsafety of const_missing --- ext/digest/digest.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 68837a6..0928628 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -37,6 +37,13 @@ RUBY_EXTERN void Init_digest_base(void); * 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. * + * Prefer using the thread-safe Digest() method to dynamically look up + * an algorithm. + * + * If you are accessing an algorithm directly via its constant, ensure you + * explicitly require the algorithm under the digest/ path (ex. digest/sha2). + * Relying on the constant lookup via +const_missing+ is not thread-safe. + * * == Examples * * require 'digest' From 4f8ab62f25a510add9aba8d7062d72bd31464179 Mon Sep 17 00:00:00 2001 From: Adam Daniels Date: Mon, 4 Mar 2024 16:35:38 -0500 Subject: [PATCH 2/3] Update most documentation to use Digest() method --- README.md | 12 ++++++------ ext/digest/digest.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8228f8e..6d1faf0 100644 --- a/README.md +++ b/README.md @@ -30,24 +30,24 @@ Or install it yourself as: require 'digest' # Compute a complete digest -Digest::SHA256.digest 'message' #=> "\xABS\n\x13\xE4Y..." +Digest(:SHA256).digest 'message' #=> "\xABS\n\x13\xE4Y..." -sha256 = Digest::SHA256.new +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..." +Digest(:SHA256).hexdigest 'message' #=> "ab530a13e459..." +Digest(:SHA256).base64digest 'message' #=> "q1MKE+RZFJgr..." # Compute digest by chunks -md5 = Digest::MD5.new +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 = Digest(:SHA256).file 'testfile' sha256.hexdigest ``` diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 0928628..f316620 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -49,24 +49,24 @@ RUBY_EXTERN void Init_digest_base(void); * require 'digest' * * # Compute a complete digest - * Digest::SHA256.digest 'message' #=> "\xABS\n\x13\xE4Y..." + * Digest(:SHA256).digest 'message' #=> "\xABS\n\x13\xE4Y..." * - * sha256 = Digest::SHA256.new + * 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..." + * Digest(:SHA256).hexdigest 'message' #=> "ab530a13e459..." + * Digest(:SHA256).base64digest 'message' #=> "q1MKE+RZFJgr..." * * # Compute digest by chunks - * md5 = Digest::MD5.new + * 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 = Digest(:SHA256).file 'testfile' * sha256.hexdigest * * Additionally digests can be encoded in "bubble babble" format as a sequence From ddb73a1ff5d3a49463f7d992325edf75baf4076f Mon Sep 17 00:00:00 2001 From: Adam Daniels Date: Mon, 4 Mar 2024 16:36:00 -0500 Subject: [PATCH 3/3] Update algorithm documentation to use explicit require --- ext/digest/md5/md5init.c | 2 +- ext/digest/rmd160/rmd160init.c | 2 +- ext/digest/sha1/sha1init.c | 2 +- lib/digest/sha2.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/digest/md5/md5init.c b/ext/digest/md5/md5init.c index b81fd94..a986420 100644 --- a/ext/digest/md5/md5init.c +++ b/ext/digest/md5/md5init.c @@ -28,7 +28,7 @@ static const rb_digest_metadata_t md5 = { * MD5 calculates a digest of 128 bits (16 bytes). * * == Examples - * require 'digest' + * require 'digest/md5' * * # Compute a complete digest * Digest::MD5.hexdigest 'abc' #=> "90015098..." diff --git a/ext/digest/rmd160/rmd160init.c b/ext/digest/rmd160/rmd160init.c index e4b707e..89eb38c 100644 --- a/ext/digest/rmd160/rmd160init.c +++ b/ext/digest/rmd160/rmd160init.c @@ -24,7 +24,7 @@ static const rb_digest_metadata_t rmd160 = { * RMD160 calculates a digest of 160 bits (20 bytes). * * == Examples - * require 'digest' + * require 'digest/rmd160' * * # Compute a complete digest * Digest::RMD160.hexdigest 'abc' #=> "8eb208f7..." diff --git a/ext/digest/sha1/sha1init.c b/ext/digest/sha1/sha1init.c index c39959f..686209a 100644 --- a/ext/digest/sha1/sha1init.c +++ b/ext/digest/sha1/sha1init.c @@ -30,7 +30,7 @@ static const rb_digest_metadata_t sha1 = { * SHA-1 calculates a digest of 160 bits (20 bytes). * * == Examples - * require 'digest' + * require 'digest/sha1' * * # Compute a complete digest * Digest::SHA1.hexdigest 'abc' #=> "a9993e36..." diff --git a/lib/digest/sha2.rb b/lib/digest/sha2.rb index f17593a..4b0e8d6 100644 --- a/lib/digest/sha2.rb +++ b/lib/digest/sha2.rb @@ -27,7 +27,7 @@ module Digest # digest (SHA512). # # ==Examples - # require 'digest' + # require 'digest/sha2' # # # Compute a complete digest # Digest::SHA2.hexdigest 'abc' # => "ba7816bf8..."