2001-07-14 00:06:14 +04:00
|
|
|
/************************************************
|
|
|
|
|
|
|
|
digest.c -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
created at: Fri May 25 08:57:27 JST 2001
|
|
|
|
|
|
|
|
Copyright (C) 1995-2001 Yukihiro Matsumoto
|
2006-10-05 23:13:00 +04:00
|
|
|
Copyright (C) 2001-2006 Akinori MUSHA
|
2001-07-14 00:06:14 +04:00
|
|
|
|
|
|
|
$RoughId: digest.c,v 1.16 2001/07/13 15:38:27 knu Exp $
|
|
|
|
$Id$
|
|
|
|
|
|
|
|
************************************************/
|
|
|
|
|
|
|
|
#include "digest.h"
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
static VALUE rb_mDigest;
|
|
|
|
static VALUE rb_mDigest_Instance;
|
|
|
|
static VALUE rb_cDigest_Class;
|
|
|
|
static VALUE rb_cDigest_Base;
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
static ID id_reset, id_update, id_finish, id_digest, id_hexdigest, id_digest_length;
|
|
|
|
static ID id_metadata;
|
|
|
|
|
|
|
|
RUBY_EXTERN void Init_digest_base(void);
|
2006-10-13 15:52:18 +04:00
|
|
|
|
|
|
|
/*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Document-module: Digest
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This module provides a framework for message digest libraries.
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
2013-09-26 17:04:27 +04:00
|
|
|
* You may want to look at OpenSSL::Digest as it supports more algorithms.
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
2013-11-13 14:09:28 +04:00
|
|
|
* 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
|
2011-08-12 21:23:11 +04:00
|
|
|
* 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.
|
|
|
|
*
|
2013-11-13 14:09:28 +04:00
|
|
|
* == Examples
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
|
|
|
* require 'digest'
|
|
|
|
*
|
|
|
|
* # Compute a complete digest
|
2013-11-13 14:09:28 +04:00
|
|
|
* Digest::SHA256.digest 'message' #=> "\xABS\n\x13\xE4Y..."
|
|
|
|
*
|
2011-08-12 21:23:11 +04:00
|
|
|
* sha256 = Digest::SHA256.new
|
2013-11-13 14:09:28 +04:00
|
|
|
* sha256.digest 'message' #=> "\xABS\n\x13\xE4Y..."
|
|
|
|
*
|
|
|
|
* # Other encoding formats
|
|
|
|
* Digest::SHA256.hexdigest 'message' #=> "ab530a13e459..."
|
|
|
|
* Digest::SHA256.base64digest 'message' #=> "q1MKE+RZFJgr..."
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
|
|
|
* # Compute digest by chunks
|
2013-11-13 14:09:28 +04:00
|
|
|
* 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
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
2013-11-13 14:09:28 +04:00
|
|
|
* 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.
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
|
|
|
* == Digest algorithms
|
|
|
|
*
|
2013-11-13 14:09:28 +04:00
|
|
|
* Different digest algorithms (or hash functions) are available:
|
2011-08-12 21:23:11 +04:00
|
|
|
*
|
2016-10-20 10:57:30 +03:00
|
|
|
* MD5::
|
|
|
|
* See RFC 1321 The MD5 Message-Digest Algorithm
|
2011-08-12 21:23:11 +04:00
|
|
|
* RIPEMD-160::
|
2013-11-13 14:09:28 +04:00
|
|
|
* As Digest::RMD160.
|
|
|
|
* See http://homes.esat.kuleuven.be/~bosselae/ripemd160.html.
|
2011-08-12 21:23:11 +04:00
|
|
|
* SHA1::
|
2013-11-13 14:09:28 +04:00
|
|
|
* See FIPS 180 Secure Hash Standard.
|
2011-08-12 21:23:11 +04:00
|
|
|
* 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:
|
2013-11-13 14:09:28 +04:00
|
|
|
* http://csrc.nist.gov/publications/PubsFIPS.html.
|
2001-07-14 00:06:14 +04:00
|
|
|
*/
|
|
|
|
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
hexencode_str_new(VALUE str_digest)
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
{
|
2006-10-10 11:49:00 +04:00
|
|
|
char *digest;
|
|
|
|
size_t digest_len;
|
2009-10-16 08:36:31 +04:00
|
|
|
size_t i;
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
VALUE str;
|
|
|
|
char *p;
|
2006-10-05 21:07:59 +04:00
|
|
|
static const char hex[] = {
|
|
|
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
|
|
'a', 'b', 'c', 'd', 'e', 'f'
|
|
|
|
};
|
|
|
|
|
2006-10-10 11:49:00 +04:00
|
|
|
StringValue(str_digest);
|
|
|
|
digest = RSTRING_PTR(str_digest);
|
|
|
|
digest_len = RSTRING_LEN(str_digest);
|
|
|
|
|
2006-10-05 21:07:59 +04:00
|
|
|
if (LONG_MAX / 2 < digest_len) {
|
|
|
|
rb_raise(rb_eRuntimeError, "digest string too long");
|
|
|
|
}
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
|
2012-08-01 17:30:51 +04:00
|
|
|
str = rb_usascii_str_new(0, digest_len * 2);
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
|
|
|
|
for (i = 0, p = RSTRING_PTR(str); i < digest_len; i++) {
|
|
|
|
unsigned char byte = digest[i];
|
|
|
|
|
|
|
|
p[i + i] = hex[byte >> 4];
|
|
|
|
p[i + i + 1] = hex[byte & 0x0f];
|
|
|
|
}
|
|
|
|
|
2015-05-21 08:03:55 +03:00
|
|
|
RB_GC_GUARD(str_digest);
|
|
|
|
|
* ext/digest/digest.[ch]: Since the argument order of
hash_final_func_t was inconsistent with others, change it and
rename to hash_finish_func_t to avoid confusion.
* ext/digest/digest.[ch]: Remove and eliminate the use of
hash_end_func_t. Implement hexdigest conversion in the base
class.
* ext/digest/md5/md5.c, ext/digest/md5/md5.h,
ext/digest/md5/md5init.c, ext/digest/md5/md5ossl.c,
ext/digest/md5/md5ossl.h: Remove MD5_End() and change
MD5_Final() to MD5_Finish().
* ext/digest/rmd160/depend, ext/digest/rmd160/extconf.rb,
ext/digest/rmd160/rmd160.c, ext/digest/rmd160/rmd160.h,
ext/digest/rmd160/rmd160hl.c, ext/digest/rmd160/rmd160init.c,
ext/digest/rmd160/rmd160ossl.c, ext/digest/rmd160/rmd160ossl.h:
Remove unused functions RMD160_End(), RMD160_File(),
RMD160_Data() and change RMD160_Final() to RMD160_Finish().
* ext/digest/sha1/extconf.rb, ext/digest/sha1/sha1.c,
ext/digest/sha1/sha1.h, ext/digest/sha1/sha1hl.c,
ext/digest/sha1/sha1init.c, ext/digest/sha1/sha1ossl.c,
ext/digest/sha1/sha1ossl.h: Likewise.
* ext/digest/sha2/extconf.rb, ext/digest/sha2/sha2.c,
ext/digest/sha2/sha2.h, ext/digest/sha2/sha2hl.c,
ext/digest/sha2/sha2init.c: Likewise.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-05 15:09:42 +04:00
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* Digest.hexencode(string) -> hexencoded_string
|
|
|
|
*
|
|
|
|
* Generates a hex-encoded version of a given _string_.
|
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_s_hexencode(VALUE klass, VALUE str)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
return hexencode_str_new(str);
|
|
|
|
}
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2009-12-31 18:49:07 +03:00
|
|
|
NORETURN(static void rb_digest_instance_method_unimpl(VALUE self, const char *method));
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* Document-module: Digest::Instance
|
|
|
|
*
|
|
|
|
* This module provides instance methods for a digest implementation
|
|
|
|
* object to calculate message digest values.
|
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2009-11-25 13:31:58 +03:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.update(string) -> digest_obj
|
|
|
|
* digest_obj << string -> digest_obj
|
|
|
|
*
|
|
|
|
* Updates the digest using a given _string_ and returns self.
|
|
|
|
*
|
|
|
|
* The update() method and the left-shift operator are overridden by
|
|
|
|
* each implementation subclass. (One should be an alias for the
|
|
|
|
* other)
|
|
|
|
*/
|
|
|
|
static VALUE
|
|
|
|
rb_digest_instance_update(VALUE self, VALUE str)
|
|
|
|
{
|
2009-11-25 13:31:58 +03:00
|
|
|
rb_digest_instance_method_unimpl(self, "update");
|
2012-04-14 03:45:37 +04:00
|
|
|
|
|
|
|
UNREACHABLE;
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.instance_eval { finish } -> digest_obj
|
|
|
|
*
|
|
|
|
* Finishes the digest and returns the resulting hash value.
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This method is overridden by each implementation subclass and often
|
|
|
|
* made private, because some of those subclasses may leave internal
|
|
|
|
* data uninitialized. Do not call this method from outside. Use
|
|
|
|
* #digest!() instead, which ensures that internal data be reset for
|
|
|
|
* security reasons.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_finish(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2009-11-25 13:31:58 +03:00
|
|
|
rb_digest_instance_method_unimpl(self, "finish");
|
2012-04-14 03:45:37 +04:00
|
|
|
|
|
|
|
UNREACHABLE;
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.reset -> digest_obj
|
|
|
|
*
|
|
|
|
* Resets the digest to the initial state and returns self.
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This method is overridden by each implementation subclass.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_reset(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2009-11-25 13:31:58 +03:00
|
|
|
rb_digest_instance_method_unimpl(self, "reset");
|
2012-04-14 03:45:37 +04:00
|
|
|
|
|
|
|
UNREACHABLE;
|
2006-10-05 23:13:00 +04:00
|
|
|
}
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.new -> another_digest_obj
|
|
|
|
*
|
|
|
|
* Returns a new, initialized copy of the digest object. Equivalent
|
|
|
|
* to digest_obj.clone().reset().
|
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_new(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE clone = rb_obj_clone(self);
|
|
|
|
rb_funcall(clone, id_reset, 0);
|
|
|
|
return clone;
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.digest -> string
|
|
|
|
* digest_obj.digest(string) -> string
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* If none is given, returns the resulting hash value of the digest,
|
|
|
|
* keeping the digest's state.
|
2006-10-14 00:55:33 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* If a _string_ is given, returns the hash value for the given
|
|
|
|
* _string_, resetting the digest to the initial state before and
|
|
|
|
* after the process.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2006-10-11 09:15:15 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_digest(int argc, VALUE *argv, VALUE self)
|
2006-10-11 09:15:15 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE str, value;
|
2006-10-11 09:15:15 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
if (rb_scan_args(argc, argv, "01", &str) > 0) {
|
|
|
|
rb_funcall(self, id_reset, 0);
|
|
|
|
rb_funcall(self, id_update, 1, str);
|
|
|
|
value = rb_funcall(self, id_finish, 0);
|
|
|
|
rb_funcall(self, id_reset, 0);
|
|
|
|
} else {
|
2010-01-17 16:57:17 +03:00
|
|
|
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
|
2006-10-11 09:15:15 +04:00
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return value;
|
2006-10-11 09:15:15 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.digest! -> string
|
2006-10-14 00:55:33 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Returns the resulting hash value and resets the digest to the
|
|
|
|
* initial state.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_digest_bang(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE value = rb_funcall(self, id_finish, 0);
|
|
|
|
rb_funcall(self, id_reset, 0);
|
2006-10-05 21:39:51 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return value;
|
2006-10-05 21:39:51 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.hexdigest -> string
|
|
|
|
* digest_obj.hexdigest(string) -> string
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* If none is given, returns the resulting hash value of the digest in
|
|
|
|
* a hex-encoded form, keeping the digest's state.
|
2006-10-14 00:55:33 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* If a _string_ is given, returns the hash value for the given
|
|
|
|
* _string_ in a hex-encoded form, resetting the digest to the initial
|
|
|
|
* state before and after the process.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2006-10-05 21:39:51 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
|
2006-10-05 21:39:51 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE str, value;
|
2006-10-05 21:39:51 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
if (rb_scan_args(argc, argv, "01", &str) > 0) {
|
|
|
|
rb_funcall(self, id_reset, 0);
|
2006-10-05 21:39:51 +04:00
|
|
|
rb_funcall(self, id_update, 1, str);
|
2006-10-20 16:48:35 +04:00
|
|
|
value = rb_funcall(self, id_finish, 0);
|
|
|
|
rb_funcall(self, id_reset, 0);
|
|
|
|
} else {
|
2010-01-17 16:57:17 +03:00
|
|
|
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
|
2006-10-05 21:39:51 +04:00
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return hexencode_str_new(value);
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.hexdigest! -> string
|
2006-10-14 00:55:33 +04:00
|
|
|
*
|
2010-01-17 22:12:10 +03:00
|
|
|
* Returns the resulting hash value in a hex-encoded form and resets
|
|
|
|
* the digest to the initial state.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_hexdigest_bang(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE value = rb_funcall(self, id_finish, 0);
|
|
|
|
rb_funcall(self, id_reset, 0);
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return hexencode_str_new(value);
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.to_s -> string
|
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Returns digest_obj.hexdigest().
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_to_s(VALUE self)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
return rb_funcall(self, id_hexdigest, 0);
|
2006-10-05 23:13:00 +04:00
|
|
|
}
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.inspect -> string
|
|
|
|
*
|
|
|
|
* Creates a printable version of the digest object.
|
|
|
|
*/
|
2006-09-14 03:32:12 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_inspect(VALUE self)
|
2006-09-14 03:32:12 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE str;
|
|
|
|
size_t digest_len = 32; /* about this size at least */
|
2008-07-01 14:36:22 +04:00
|
|
|
const char *cname;
|
2006-09-14 03:32:12 +04:00
|
|
|
|
|
|
|
cname = rb_obj_classname(self);
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* #<Digest::ClassName: xxxxx...xxxx> */
|
2006-10-05 21:39:51 +04:00
|
|
|
str = rb_str_buf_new(2 + strlen(cname) + 2 + digest_len * 2 + 1);
|
2006-09-14 03:32:12 +04:00
|
|
|
rb_str_buf_cat2(str, "#<");
|
|
|
|
rb_str_buf_cat2(str, cname);
|
|
|
|
rb_str_buf_cat2(str, ": ");
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_str_buf_append(str, rb_digest_instance_hexdigest(0, 0, self));
|
2006-09-14 03:32:12 +04:00
|
|
|
rb_str_buf_cat2(str, ">");
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2006-10-13 15:52:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj == another_digest_obj -> boolean
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj == string -> boolean
|
2006-10-13 15:52:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* If a string is given, checks whether it is equal to the hex-encoded
|
2006-11-01 08:01:43 +03:00
|
|
|
* hash value of the digest object. If another digest instance is
|
|
|
|
* given, checks whether they have the same hash value. Otherwise
|
|
|
|
* returns false.
|
2006-10-13 15:52:18 +04:00
|
|
|
*/
|
2001-07-14 00:06:14 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_equal(VALUE self, VALUE other)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
|
|
|
VALUE str1, str2;
|
|
|
|
|
2006-11-01 08:01:43 +03:00
|
|
|
if (rb_obj_is_kind_of(other, rb_mDigest_Instance) == Qtrue) {
|
2006-10-20 16:48:35 +04:00
|
|
|
str1 = rb_digest_instance_digest(0, 0, self);
|
|
|
|
str2 = rb_digest_instance_digest(0, 0, other);
|
2014-06-07 01:05:48 +04:00
|
|
|
} else {
|
2014-06-07 07:29:00 +04:00
|
|
|
str1 = rb_digest_instance_to_s(self);
|
|
|
|
str2 = rb_check_string_type(other);
|
|
|
|
if (NIL_P(str2)) return Qfalse;
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* never blindly assume that subclass methods return strings */
|
|
|
|
StringValue(str1);
|
|
|
|
StringValue(str2);
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
if (RSTRING_LEN(str1) == RSTRING_LEN(str2) &&
|
|
|
|
rb_str_cmp(str1, str2) == 0) {
|
|
|
|
return Qtrue;
|
|
|
|
}
|
2001-07-14 00:06:14 +04:00
|
|
|
return Qfalse;
|
|
|
|
}
|
|
|
|
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* digest_obj.digest_length -> integer
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Returns the length of the hash value of the digest.
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This method should be overridden by each implementation subclass.
|
|
|
|
* If not, digest_obj.digest().length() is returned.
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*/
|
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_digest_length(VALUE self)
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
/* subclasses really should redefine this method */
|
|
|
|
VALUE digest = rb_digest_instance_digest(0, 0, self);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* never blindly assume that #digest() returns a string */
|
|
|
|
StringValue(digest);
|
2020-04-08 10:06:30 +03:00
|
|
|
return LONG2NUM(RSTRING_LEN(digest));
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.length -> integer
|
|
|
|
* digest_obj.size -> integer
|
|
|
|
*
|
|
|
|
* Returns digest_obj.digest_length().
|
|
|
|
*/
|
|
|
|
static VALUE
|
|
|
|
rb_digest_instance_length(VALUE self)
|
|
|
|
{
|
|
|
|
return rb_funcall(self, id_digest_length, 0);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* digest_obj.block_length -> integer
|
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Returns the block length of the digest.
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This method is overridden by each implementation subclass.
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*/
|
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_instance_block_length(VALUE self)
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
{
|
2009-11-25 13:31:58 +03:00
|
|
|
rb_digest_instance_method_unimpl(self, "block_length");
|
2012-04-14 03:45:37 +04:00
|
|
|
|
|
|
|
UNREACHABLE;
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* Document-class: Digest::Class
|
|
|
|
*
|
|
|
|
* This module stands as a base class for digest implementation
|
|
|
|
* classes.
|
|
|
|
*/
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* Digest::Class.digest(string, *parameters) -> hash_string
|
|
|
|
*
|
|
|
|
* Returns the hash value of a given _string_. This is equivalent to
|
|
|
|
* Digest::Class.new(*parameters).digest(string), where extra
|
|
|
|
* _parameters_, if any, are passed through to the constructor and the
|
|
|
|
* _string_ is passed to #digest().
|
|
|
|
*/
|
|
|
|
static VALUE
|
|
|
|
rb_digest_class_s_digest(int argc, VALUE *argv, VALUE klass)
|
|
|
|
{
|
|
|
|
VALUE str;
|
|
|
|
volatile VALUE obj;
|
|
|
|
|
|
|
|
if (argc < 1) {
|
|
|
|
rb_raise(rb_eArgError, "no data given");
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
str = *argv++;
|
|
|
|
argc--;
|
|
|
|
|
|
|
|
StringValue(str);
|
|
|
|
|
|
|
|
obj = rb_obj_alloc(klass);
|
|
|
|
rb_obj_call_init(obj, argc, argv);
|
|
|
|
|
|
|
|
return rb_funcall(obj, id_digest, 1, str);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq:
|
2006-10-20 16:48:35 +04:00
|
|
|
* Digest::Class.hexdigest(string[, ...]) -> hash_string
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* Returns the hex-encoded hash value of a given _string_. This is
|
|
|
|
* almost equivalent to
|
|
|
|
* Digest.hexencode(Digest::Class.new(*parameters).digest(string)).
|
|
|
|
*/
|
|
|
|
static VALUE
|
|
|
|
rb_digest_class_s_hexdigest(int argc, VALUE *argv, VALUE klass)
|
|
|
|
{
|
2016-07-29 14:57:14 +03:00
|
|
|
return hexencode_str_new(rb_funcallv(klass, id_digest, argc, argv));
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
|
|
|
|
2010-10-18 08:26:06 +04:00
|
|
|
/* :nodoc: */
|
|
|
|
static VALUE
|
|
|
|
rb_digest_class_init(VALUE self)
|
|
|
|
{
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* Document-class: Digest::Base
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*
|
2006-10-20 16:48:35 +04:00
|
|
|
* This abstract class provides a common interface to message digest
|
|
|
|
* implementation classes written in C.
|
2016-10-20 10:57:30 +03:00
|
|
|
*
|
|
|
|
* ==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 *);
|
2016-10-20 10:57:31 +03:00
|
|
|
*
|
2016-10-20 10:57:30 +03:00
|
|
|
* 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"),
|
|
|
|
* Data_Wrap_Struct(0, 0, 0, (void *)&sha1));
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
*/
|
2006-10-20 16:48:35 +04:00
|
|
|
|
|
|
|
static rb_digest_metadata_t *
|
|
|
|
get_digest_base_metadata(VALUE klass)
|
|
|
|
{
|
2007-02-28 21:24:25 +03:00
|
|
|
VALUE p;
|
2006-10-20 16:48:35 +04:00
|
|
|
VALUE obj;
|
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
|
2011-05-18 17:41:54 +04:00
|
|
|
for (p = klass; !NIL_P(p); p = rb_class_superclass(p)) {
|
2007-02-28 21:24:25 +03:00
|
|
|
if (rb_ivar_defined(p, id_metadata)) {
|
|
|
|
obj = rb_ivar_get(p, id_metadata);
|
|
|
|
break;
|
|
|
|
}
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
|
|
|
|
2011-05-18 17:41:54 +04:00
|
|
|
if (NIL_P(p))
|
2007-02-28 21:27:50 +03:00
|
|
|
rb_raise(rb_eRuntimeError, "Digest::Base cannot be directly inherited in Ruby");
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2019-08-23 07:00:17 +03:00
|
|
|
if (!RB_TYPE_P(obj, T_DATA) || RTYPEDDATA_P(obj)) {
|
|
|
|
wrong:
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2014-09-29 16:17:47 +04:00
|
|
|
#undef RUBY_UNTYPED_DATA_WARNING
|
|
|
|
#define RUBY_UNTYPED_DATA_WARNING 0
|
2006-10-20 16:48:35 +04:00
|
|
|
Data_Get_Struct(obj, rb_digest_metadata_t, algo);
|
|
|
|
|
2019-08-23 07:00:17 +03:00
|
|
|
if (!algo) goto wrong;
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
switch (algo->api_version) {
|
2014-07-15 18:58:53 +04:00
|
|
|
case 3:
|
2006-10-20 16:48:35 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* put conversion here if possible when API is updated
|
|
|
|
*/
|
|
|
|
|
|
|
|
default:
|
|
|
|
rb_raise(rb_eRuntimeError, "Incompatible digest API version");
|
|
|
|
}
|
|
|
|
|
|
|
|
return algo;
|
|
|
|
}
|
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
static rb_digest_metadata_t *
|
|
|
|
get_digest_obj_metadata(VALUE obj)
|
|
|
|
{
|
|
|
|
return get_digest_base_metadata(rb_obj_class(obj));
|
|
|
|
}
|
|
|
|
|
2014-09-27 05:30:16 +04:00
|
|
|
static const rb_data_type_t digest_type = {
|
|
|
|
"digest",
|
|
|
|
{0, RUBY_TYPED_DEFAULT_FREE, 0,},
|
2014-12-01 09:38:04 +03:00
|
|
|
0, 0,
|
2014-09-27 05:30:16 +04:00
|
|
|
(RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED),
|
|
|
|
};
|
|
|
|
|
2014-07-15 18:58:53 +04:00
|
|
|
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.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_base_alloc(VALUE klass)
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
VALUE obj;
|
|
|
|
void *pctx;
|
|
|
|
|
|
|
|
if (klass == rb_cDigest_Base) {
|
|
|
|
rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
|
|
|
|
}
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
|
|
|
algo = get_digest_base_metadata(klass);
|
|
|
|
|
2015-05-16 15:56:48 +03:00
|
|
|
obj = rb_data_typed_object_zalloc(klass, algo->ctx_size, &digest_type);
|
|
|
|
pctx = RTYPEDDATA_DATA(obj);
|
2014-07-15 18:58:53 +04:00
|
|
|
algo_init(algo, pctx);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return obj;
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
}
|
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* :nodoc: */
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
static VALUE
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_base_copy(VALUE copy, VALUE obj)
|
|
|
|
{
|
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
void *pctx1, *pctx2;
|
|
|
|
|
|
|
|
if (copy == obj) return copy;
|
|
|
|
|
|
|
|
rb_check_frozen(copy);
|
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(copy);
|
|
|
|
if (algo != get_digest_obj_metadata(obj))
|
2014-09-27 05:30:16 +04:00
|
|
|
rb_raise(rb_eTypeError, "different algorithms");
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2014-09-27 05:30:16 +04:00
|
|
|
TypedData_Get_Struct(obj, void, &digest_type, pctx1);
|
|
|
|
TypedData_Get_Struct(copy, void, &digest_type, pctx2);
|
2006-10-20 16:48:35 +04:00
|
|
|
memcpy(pctx2, pctx1, algo->ctx_size);
|
|
|
|
|
|
|
|
return copy;
|
|
|
|
}
|
|
|
|
|
2016-10-20 10:57:30 +03:00
|
|
|
/*
|
|
|
|
* call-seq: digest_base.reset -> digest_base
|
|
|
|
*
|
|
|
|
* Reset the digest to its initial state and return +self+.
|
|
|
|
*/
|
2006-10-20 16:48:35 +04:00
|
|
|
static VALUE
|
|
|
|
rb_digest_base_reset(VALUE self)
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
void *pctx;
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(self);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2014-09-27 05:30:16 +04:00
|
|
|
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2014-07-15 18:58:53 +04:00
|
|
|
algo_init(algo, pctx);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
|
|
|
return self;
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
}
|
|
|
|
|
2016-10-20 10:57:30 +03:00
|
|
|
/*
|
2016-10-20 10:57:31 +03:00
|
|
|
* call-seq:
|
2016-10-20 10:57:30 +03:00
|
|
|
* digest_base.update(string) -> digest_base
|
|
|
|
* digest_base << string -> digest_base
|
|
|
|
*
|
|
|
|
* Update the digest using given _string_ and return +self+.
|
|
|
|
*/
|
2006-10-20 16:48:35 +04:00
|
|
|
static VALUE
|
|
|
|
rb_digest_base_update(VALUE self, VALUE str)
|
2001-07-14 00:06:14 +04:00
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
void *pctx;
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(self);
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2014-09-27 05:30:16 +04:00
|
|
|
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
StringValue(str);
|
2007-02-27 13:08:39 +03:00
|
|
|
algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
|
2015-05-21 08:03:55 +03:00
|
|
|
RB_GC_GUARD(str);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
return self;
|
|
|
|
}
|
2001-07-14 00:06:14 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* :nodoc: */
|
|
|
|
static VALUE
|
|
|
|
rb_digest_base_finish(VALUE self)
|
|
|
|
{
|
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
void *pctx;
|
|
|
|
VALUE str;
|
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(self);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2014-09-27 05:30:16 +04:00
|
|
|
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
|
|
|
str = rb_str_new(0, algo->digest_len);
|
2007-02-27 13:08:39 +03:00
|
|
|
algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str));
|
2006-10-20 16:48:35 +04:00
|
|
|
|
|
|
|
/* avoid potential coredump caused by use of a finished context */
|
2014-07-15 18:58:53 +04:00
|
|
|
algo_init(algo, pctx);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2016-10-20 10:57:30 +03:00
|
|
|
/*
|
|
|
|
* call-seq: digest_base.digest_length -> Integer
|
|
|
|
*
|
|
|
|
* Return the length of the hash value in bytes.
|
|
|
|
*/
|
2006-10-20 16:48:35 +04:00
|
|
|
static VALUE
|
|
|
|
rb_digest_base_digest_length(VALUE self)
|
|
|
|
{
|
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(self);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2020-04-08 10:06:30 +03:00
|
|
|
return SIZET2NUM(algo->digest_len);
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
|
|
|
|
2016-10-20 10:57:30 +03:00
|
|
|
/*
|
|
|
|
* call-seq: digest_base.block_length -> Integer
|
|
|
|
*
|
|
|
|
* Return the block length of the digest in bytes.
|
|
|
|
*/
|
2006-10-20 16:48:35 +04:00
|
|
|
static VALUE
|
|
|
|
rb_digest_base_block_length(VALUE self)
|
|
|
|
{
|
|
|
|
rb_digest_metadata_t *algo;
|
|
|
|
|
2019-08-22 14:14:59 +03:00
|
|
|
algo = get_digest_obj_metadata(self);
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2020-04-08 10:06:30 +03:00
|
|
|
return SIZET2NUM(algo->block_len);
|
2006-10-20 16:48:35 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Init_digest(void)
|
|
|
|
{
|
2018-02-16 11:39:48 +03:00
|
|
|
#undef rb_intern
|
2006-10-20 16:48:35 +04:00
|
|
|
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");
|
2019-08-21 10:41:06 +03:00
|
|
|
id_metadata = rb_id_metadata();
|
2019-08-21 10:20:31 +03:00
|
|
|
InitVM(digest);
|
|
|
|
}
|
2006-10-20 16:48:35 +04:00
|
|
|
|
2019-08-21 10:20:31 +03:00
|
|
|
void
|
|
|
|
InitVM_digest(void)
|
|
|
|
{
|
2006-10-20 16:48:35 +04:00
|
|
|
/*
|
|
|
|
* module Digest
|
|
|
|
*/
|
|
|
|
rb_mDigest = rb_define_module("Digest");
|
|
|
|
|
|
|
|
/* module functions */
|
|
|
|
rb_define_module_function(rb_mDigest, "hexencode", rb_digest_s_hexencode, 1);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* module Digest::Instance
|
|
|
|
*/
|
|
|
|
rb_mDigest_Instance = rb_define_module_under(rb_mDigest, "Instance");
|
|
|
|
|
|
|
|
/* instance methods that should be overridden */
|
|
|
|
rb_define_method(rb_mDigest_Instance, "update", rb_digest_instance_update, 1);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "<<", rb_digest_instance_update, 1);
|
|
|
|
rb_define_private_method(rb_mDigest_Instance, "finish", rb_digest_instance_finish, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "reset", rb_digest_instance_reset, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "digest_length", rb_digest_instance_digest_length, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "block_length", rb_digest_instance_block_length, 0);
|
|
|
|
|
|
|
|
/* instance methods that may be overridden */
|
|
|
|
rb_define_method(rb_mDigest_Instance, "==", rb_digest_instance_equal, 1);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "inspect", rb_digest_instance_inspect, 0);
|
|
|
|
|
|
|
|
/* instance methods that need not usually be overridden */
|
|
|
|
rb_define_method(rb_mDigest_Instance, "new", rb_digest_instance_new, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "digest", rb_digest_instance_digest, -1);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "digest!", rb_digest_instance_digest_bang, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "hexdigest", rb_digest_instance_hexdigest, -1);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "hexdigest!", rb_digest_instance_hexdigest_bang, 0);
|
2006-10-26 10:15:57 +04:00
|
|
|
rb_define_method(rb_mDigest_Instance, "to_s", rb_digest_instance_to_s, 0);
|
2006-10-20 16:48:35 +04:00
|
|
|
rb_define_method(rb_mDigest_Instance, "length", rb_digest_instance_length, 0);
|
|
|
|
rb_define_method(rb_mDigest_Instance, "size", rb_digest_instance_length, 0);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* class Digest::Class
|
|
|
|
*/
|
|
|
|
rb_cDigest_Class = rb_define_class_under(rb_mDigest, "Class", rb_cObject);
|
2010-10-18 08:26:06 +04:00
|
|
|
rb_define_method(rb_cDigest_Class, "initialize", rb_digest_class_init, 0);
|
2006-10-20 16:48:35 +04:00
|
|
|
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);
|
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c:
Introduce API versioning.
* ext/digest/digest.c, ext/digest/digest.h,
ext/digest/md5/md5init.c, ext/digest/rmd160/rmd160init.c,
ext/digest/sha1/sha1init.c, ext/digest/sha2/sha2init.c: Remove
the constants DIGEST_LENGTH and BLOCK_LENGTH and turn them into
instance methods digest_length() and block_length(). Class
methods with the same names are also provided, which take extra
parameters for a digest method.
* ext/digest/lib/digest/hmac.rb: Completely redesign the API which
is similar to Perl's, now that Digest classes can take hashing
parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-10-14 03:23:18 +04:00
|
|
|
|
2006-10-20 16:48:35 +04:00
|
|
|
/* class Digest::Base < Digest::Class */
|
|
|
|
rb_cDigest_Base = rb_define_class_under(rb_mDigest, "Base", rb_cDigest_Class);
|
|
|
|
|
|
|
|
rb_define_alloc_func(rb_cDigest_Base, rb_digest_base_alloc);
|
|
|
|
|
|
|
|
rb_define_method(rb_cDigest_Base, "initialize_copy", rb_digest_base_copy, 1);
|
|
|
|
rb_define_method(rb_cDigest_Base, "reset", rb_digest_base_reset, 0);
|
|
|
|
rb_define_method(rb_cDigest_Base, "update", rb_digest_base_update, 1);
|
|
|
|
rb_define_method(rb_cDigest_Base, "<<", rb_digest_base_update, 1);
|
|
|
|
rb_define_private_method(rb_cDigest_Base, "finish", rb_digest_base_finish, 0);
|
|
|
|
rb_define_method(rb_cDigest_Base, "digest_length", rb_digest_base_digest_length, 0);
|
|
|
|
rb_define_method(rb_cDigest_Base, "block_length", rb_digest_base_block_length, 0);
|
2001-07-14 00:06:14 +04:00
|
|
|
}
|