rubysl-digest 2.0.3 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +8 -10
- data/MRI_LICENSE +56 -0
- data/ext/rubysl/digest/bubblebabble/bubblebabble.c +27 -28
- data/ext/rubysl/digest/defs.h +1 -1
- data/ext/rubysl/digest/digest.c +142 -58
- data/ext/rubysl/digest/digest.h +25 -5
- data/ext/rubysl/digest/digest_conf.rb +28 -0
- data/ext/rubysl/digest/extconf.rb +1 -1
- data/ext/rubysl/digest/md5/extconf.rb +3 -13
- data/ext/rubysl/digest/md5/md5.c +9 -7
- data/ext/rubysl/digest/md5/md5.h +3 -3
- data/ext/rubysl/digest/md5/md5cc.h +12 -0
- data/ext/rubysl/digest/md5/md5init.c +12 -5
- data/ext/rubysl/digest/md5/md5ossl.h +4 -2
- data/ext/rubysl/digest/rmd160/extconf.rb +3 -12
- data/ext/rubysl/digest/rmd160/rmd160.c +12 -6
- data/ext/rubysl/digest/rmd160/rmd160.h +3 -3
- data/ext/rubysl/digest/rmd160/rmd160init.c +10 -5
- data/ext/rubysl/digest/rmd160/rmd160ossl.h +3 -2
- data/ext/rubysl/digest/sha1/extconf.rb +3 -12
- data/ext/rubysl/digest/sha1/sha1.c +5 -3
- data/ext/rubysl/digest/sha1/sha1.h +3 -3
- data/ext/rubysl/digest/sha1/sha1cc.h +14 -0
- data/ext/rubysl/digest/sha1/sha1init.c +12 -5
- data/ext/rubysl/digest/sha1/sha1ossl.h +4 -2
- data/ext/rubysl/digest/sha2/extconf.rb +7 -8
- data/ext/rubysl/digest/sha2/sha2.c +235 -73
- data/ext/rubysl/digest/sha2/sha2.h +142 -26
- data/ext/rubysl/digest/sha2/sha2cc.h +31 -0
- data/ext/rubysl/digest/sha2/sha2init.c +12 -4
- data/ext/rubysl/digest/sha2/sha2ossl.h +27 -0
- data/ext/rubysl/openssl/deprecation.rb +21 -0
- data/lib/digest/sha2.rb +42 -9
- data/lib/rubysl/digest/digest.rb +27 -7
- data/lib/rubysl/digest/version.rb +1 -1
- data/spec/fixtures/dir/common.rb +171 -0
- data/spec/md5/file_spec.rb +1 -1
- data/spec/sha1/file_spec.rb +1 -1
- data/spec/sha256/file_spec.rb +1 -1
- data/spec/sha384/file_spec.rb +1 -1
- data/spec/sha512/file_spec.rb +1 -1
- data/spec/shared/file/read.rb +21 -0
- metadata +15 -5
- data/ext/rubysl/digest/bubblebabble/depend +0 -3
- data/ext/rubysl/digest/bubblebabble/extconf.h +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b2b09fcc999edcc21062d1bb6b315a648d2ec69
|
4
|
+
data.tar.gz: b6bb606c58f98c87e6f6aa54ee829df248818f79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3d383f9991ea080439f217e3e56bca326a7cf97afafe750c6ef976029d778c06cc239defaea84376f89d332a2560c2f51f4944294149a2722940130f51a495f
|
7
|
+
data.tar.gz: c38362f21f604d9e5a13279966588c4fc7b360c3ba4fcc8b60a0e2297888b48939f55fd8527bbbb960cb8ad94e82a5bdf7b108ee2b10846f642035171b7dc373
|
data/.travis.yml
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
env:
|
3
|
-
- RUBYLIB=lib
|
4
|
-
- RUBYLIB=
|
3
|
+
- RUBYLIB=lib:.
|
5
4
|
script: mspec spec
|
5
|
+
branches:
|
6
|
+
only:
|
7
|
+
- 1.0
|
8
|
+
- 2.0
|
6
9
|
rvm:
|
7
|
-
- 2.
|
8
|
-
- rbx-2
|
9
|
-
|
10
|
-
exclude:
|
11
|
-
- rvm: 2.0.0
|
12
|
-
env: RUBYLIB=lib
|
13
|
-
- rvm: rbx-2.1.1
|
14
|
-
env: RUBYLIB=
|
10
|
+
- 2.1.0
|
11
|
+
- rbx-2
|
12
|
+
|
data/MRI_LICENSE
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
|
2
|
+
You can redistribute it and/or modify it under either the terms of the
|
3
|
+
2-clause BSDL (see the file BSDL), or the conditions below:
|
4
|
+
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
6
|
+
software without restriction, provided that you duplicate all of the
|
7
|
+
original copyright notices and associated disclaimers.
|
8
|
+
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
10
|
+
you do at least ONE of the following:
|
11
|
+
|
12
|
+
a) place your modifications in the Public Domain or otherwise
|
13
|
+
make them Freely Available, such as by posting said
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
+
the author to include your modifications in the software.
|
16
|
+
|
17
|
+
b) use the modified software only within your corporation or
|
18
|
+
organization.
|
19
|
+
|
20
|
+
c) give non-standard binaries non-standard names, with
|
21
|
+
instructions on where to get the original software distribution.
|
22
|
+
|
23
|
+
d) make other distribution arrangements with the author.
|
24
|
+
|
25
|
+
3. You may distribute the software in object code or binary form,
|
26
|
+
provided that you do at least ONE of the following:
|
27
|
+
|
28
|
+
a) distribute the binaries and library files of the software,
|
29
|
+
together with instructions (in the manual page or equivalent)
|
30
|
+
on where to get the original distribution.
|
31
|
+
|
32
|
+
b) accompany the distribution with the machine-readable source of
|
33
|
+
the software.
|
34
|
+
|
35
|
+
c) give non-standard binaries non-standard names, with
|
36
|
+
instructions on where to get the original software distribution.
|
37
|
+
|
38
|
+
d) make other distribution arrangements with the author.
|
39
|
+
|
40
|
+
4. You may modify and include the part of the software into any other
|
41
|
+
software (possibly commercial). But some files in the distribution
|
42
|
+
are not written by the author, so that they are not under these terms.
|
43
|
+
|
44
|
+
For the list of those files and their copying conditions, see the
|
45
|
+
file LEGAL.
|
46
|
+
|
47
|
+
5. The scripts and library files supplied as input to or produced as
|
48
|
+
output from the software do not automatically fall under the
|
49
|
+
copyright of the software, but belong to whomever generated them,
|
50
|
+
and may be sold commercially, and may be aggregated with this
|
51
|
+
software.
|
52
|
+
|
53
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
54
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
55
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
56
|
+
PURPOSE.
|
@@ -2,16 +2,17 @@
|
|
2
2
|
|
3
3
|
bubblebabble.c - BubbleBabble encoding support
|
4
4
|
|
5
|
-
$Author
|
5
|
+
$Author$
|
6
6
|
created at: Fri Oct 13 18:31:42 JST 2006
|
7
7
|
|
8
8
|
Copyright (C) 2006 Akinori MUSHA
|
9
9
|
|
10
|
-
$Id
|
10
|
+
$Id$
|
11
11
|
|
12
12
|
************************************************/
|
13
13
|
|
14
|
-
#include "
|
14
|
+
#include "ruby.h"
|
15
|
+
#include "digest.h"
|
15
16
|
|
16
17
|
static ID id_digest;
|
17
18
|
|
@@ -22,9 +23,7 @@ bubblebabble_str_new(VALUE str_digest)
|
|
22
23
|
size_t digest_len;
|
23
24
|
VALUE str;
|
24
25
|
char *p;
|
25
|
-
|
26
|
-
int buf_len;
|
27
|
-
int i, j, seed = 1;
|
26
|
+
size_t i, j, seed = 1;
|
28
27
|
static const char vowels[] = {
|
29
28
|
'a', 'e', 'i', 'o', 'u', 'y'
|
30
29
|
};
|
@@ -34,16 +33,15 @@ bubblebabble_str_new(VALUE str_digest)
|
|
34
33
|
};
|
35
34
|
|
36
35
|
StringValue(str_digest);
|
36
|
+
digest = RSTRING_PTR(str_digest);
|
37
37
|
digest_len = RSTRING_LEN(str_digest);
|
38
38
|
|
39
39
|
if ((LONG_MAX - 2) / 3 < (digest_len | 1)) {
|
40
|
-
|
40
|
+
rb_raise(rb_eRuntimeError, "digest string too long");
|
41
41
|
}
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
buf = calloc(buf_len, sizeof(char));
|
46
|
-
p = buf;
|
43
|
+
str = rb_str_new(0, (digest_len | 1) * 3 + 2);
|
44
|
+
p = RSTRING_PTR(str);
|
47
45
|
|
48
46
|
i = j = 0;
|
49
47
|
p[j++] = 'x';
|
@@ -77,13 +75,11 @@ bubblebabble_str_new(VALUE str_digest)
|
|
77
75
|
|
78
76
|
p[j] = 'x';
|
79
77
|
|
80
|
-
str = rb_str_new(buf, buf_len);
|
81
|
-
free(buf);
|
82
|
-
|
83
78
|
return str;
|
84
79
|
}
|
85
80
|
|
86
|
-
/*
|
81
|
+
/* Document-method: Digest::bubblebabble
|
82
|
+
*
|
87
83
|
* call-seq:
|
88
84
|
* Digest.bubblebabble(string) -> bubblebabble_string
|
89
85
|
*
|
@@ -95,7 +91,8 @@ rb_digest_s_bubblebabble(VALUE klass, VALUE str)
|
|
95
91
|
return bubblebabble_str_new(str);
|
96
92
|
}
|
97
93
|
|
98
|
-
/*
|
94
|
+
/* Document-method: Digest::Class::bubblebabble
|
95
|
+
*
|
99
96
|
* call-seq:
|
100
97
|
* Digest::Class.bubblebabble(string, ...) -> hash_string
|
101
98
|
*
|
@@ -107,7 +104,8 @@ rb_digest_class_s_bubblebabble(int argc, VALUE *argv, VALUE klass)
|
|
107
104
|
return bubblebabble_str_new(rb_funcall2(klass, id_digest, argc, argv));
|
108
105
|
}
|
109
106
|
|
110
|
-
/*
|
107
|
+
/* Document-method: Digest::Instance#bubblebabble
|
108
|
+
*
|
111
109
|
* call-seq:
|
112
110
|
* digest_obj.bubblebabble -> hash_string
|
113
111
|
*
|
@@ -126,20 +124,21 @@ rb_digest_instance_bubblebabble(VALUE self)
|
|
126
124
|
void
|
127
125
|
Init_bubblebabble(void)
|
128
126
|
{
|
129
|
-
VALUE
|
130
|
-
|
131
|
-
mDigest = rb_path2class("Digest");
|
132
|
-
mDigest_Instance = rb_path2class("Digest::Instance");
|
133
|
-
cDigest_Class = rb_path2class("Digest::Class");
|
127
|
+
VALUE rb_mDigest, rb_mDigest_Instance, rb_cDigest_Class;
|
134
128
|
|
135
|
-
|
136
|
-
|
129
|
+
rb_mDigest = rb_path2class("Digest");
|
130
|
+
rb_mDigest_Instance = rb_path2class("Digest::Instance");
|
131
|
+
rb_cDigest_Class = rb_path2class("Digest::Class");
|
137
132
|
|
138
|
-
|
139
|
-
|
133
|
+
#if 0
|
134
|
+
rb_mDigest = rb_define_module("Digest");
|
135
|
+
rb_mDigest_Instance = rb_define_module_under(rb_mDigest, "Instance");
|
136
|
+
rb_cDigest_Class = rb_define_class_under(rb_mDigest, "Class", rb_cObject);
|
137
|
+
#endif
|
140
138
|
|
141
|
-
|
142
|
-
|
139
|
+
rb_define_module_function(rb_mDigest, "bubblebabble", rb_digest_s_bubblebabble, 1);
|
140
|
+
rb_define_singleton_method(rb_cDigest_Class, "bubblebabble", rb_digest_class_s_bubblebabble, -1);
|
141
|
+
rb_define_method(rb_mDigest_Instance, "bubblebabble", rb_digest_instance_bubblebabble, 0);
|
143
142
|
|
144
143
|
id_digest = rb_intern("digest");
|
145
144
|
}
|
data/ext/rubysl/digest/defs.h
CHANGED
data/ext/rubysl/digest/digest.c
CHANGED
@@ -2,22 +2,19 @@
|
|
2
2
|
|
3
3
|
digest.c -
|
4
4
|
|
5
|
-
$Author
|
5
|
+
$Author$
|
6
6
|
created at: Fri May 25 08:57:27 JST 2001
|
7
7
|
|
8
8
|
Copyright (C) 1995-2001 Yukihiro Matsumoto
|
9
9
|
Copyright (C) 2001-2006 Akinori MUSHA
|
10
10
|
|
11
11
|
$RoughId: digest.c,v 1.16 2001/07/13 15:38:27 knu Exp $
|
12
|
-
$Id
|
12
|
+
$Id$
|
13
13
|
|
14
14
|
************************************************/
|
15
15
|
|
16
16
|
#include "digest.h"
|
17
17
|
|
18
|
-
#include <string.h>
|
19
|
-
#include <stdlib.h>
|
20
|
-
|
21
18
|
static VALUE rb_mDigest;
|
22
19
|
static VALUE rb_mDigest_Instance;
|
23
20
|
static VALUE rb_cDigest_Class;
|
@@ -32,6 +29,69 @@ RUBY_EXTERN void Init_digest_base(void);
|
|
32
29
|
* Document-module: Digest
|
33
30
|
*
|
34
31
|
* This module provides a framework for message digest libraries.
|
32
|
+
*
|
33
|
+
* You may want to look at OpenSSL::Digest as it supports more algorithms.
|
34
|
+
*
|
35
|
+
* A cryptographic hash function is a procedure that takes data and returns a
|
36
|
+
* fixed bit string: the hash value, also known as _digest_. Hash functions
|
37
|
+
* are also called one-way functions, it is easy to compute a digest from
|
38
|
+
* a message, but it is infeasible to generate a message from a digest.
|
39
|
+
*
|
40
|
+
* == Examples
|
41
|
+
*
|
42
|
+
* require 'digest'
|
43
|
+
*
|
44
|
+
* # Compute a complete digest
|
45
|
+
* Digest::SHA256.digest 'message' #=> "\xABS\n\x13\xE4Y..."
|
46
|
+
*
|
47
|
+
* sha256 = Digest::SHA256.new
|
48
|
+
* sha256.digest 'message' #=> "\xABS\n\x13\xE4Y..."
|
49
|
+
*
|
50
|
+
* # Other encoding formats
|
51
|
+
* Digest::SHA256.hexdigest 'message' #=> "ab530a13e459..."
|
52
|
+
* Digest::SHA256.base64digest 'message' #=> "q1MKE+RZFJgr..."
|
53
|
+
*
|
54
|
+
* # Compute digest by chunks
|
55
|
+
* md5 = Digest::MD5.new
|
56
|
+
* md5.update 'message1'
|
57
|
+
* md5 << 'message2' # << is an alias for update
|
58
|
+
*
|
59
|
+
* md5.hexdigest #=> "94af09c09bb9..."
|
60
|
+
*
|
61
|
+
* # Compute digest for a file
|
62
|
+
* sha256 = Digest::SHA256.file 'testfile'
|
63
|
+
* sha256.hexdigest
|
64
|
+
*
|
65
|
+
* Additionally digests can be encoded in "bubble babble" format as a sequence
|
66
|
+
* of consonants and vowels which is more recognizable and comparable than a
|
67
|
+
* hexadecimal digest.
|
68
|
+
*
|
69
|
+
* require 'digest/bubblebabble'
|
70
|
+
*
|
71
|
+
* Digest::SHA256.bubblebabble 'message' #=> "xopoh-fedac-fenyh-..."
|
72
|
+
*
|
73
|
+
* See the bubble babble specification at
|
74
|
+
* http://web.mit.edu/kenta/www/one/bubblebabble/spec/jrtrjwzi/draft-huima-01.txt.
|
75
|
+
*
|
76
|
+
* == Digest algorithms
|
77
|
+
*
|
78
|
+
* Different digest algorithms (or hash functions) are available:
|
79
|
+
*
|
80
|
+
* HMAC::
|
81
|
+
* See FIPS PUB 198 The Keyed-Hash Message Authentication Code (HMAC).
|
82
|
+
* RIPEMD-160::
|
83
|
+
* As Digest::RMD160.
|
84
|
+
* See http://homes.esat.kuleuven.be/~bosselae/ripemd160.html.
|
85
|
+
* SHA1::
|
86
|
+
* See FIPS 180 Secure Hash Standard.
|
87
|
+
* SHA2 family::
|
88
|
+
* See FIPS 180 Secure Hash Standard which defines the following algorithms:
|
89
|
+
* * SHA512
|
90
|
+
* * SHA384
|
91
|
+
* * SHA256
|
92
|
+
*
|
93
|
+
* The latest versions of the FIPS publications can be found here:
|
94
|
+
* http://csrc.nist.gov/publications/PubsFIPS.html.
|
35
95
|
*/
|
36
96
|
|
37
97
|
static VALUE
|
@@ -39,34 +99,31 @@ hexencode_str_new(VALUE str_digest)
|
|
39
99
|
{
|
40
100
|
char *digest;
|
41
101
|
size_t digest_len;
|
42
|
-
|
102
|
+
size_t i;
|
43
103
|
VALUE str;
|
44
104
|
char *p;
|
45
|
-
char *buf;
|
46
105
|
static const char hex[] = {
|
47
106
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
48
107
|
'a', 'b', 'c', 'd', 'e', 'f'
|
49
108
|
};
|
50
109
|
|
51
110
|
StringValue(str_digest);
|
111
|
+
digest = RSTRING_PTR(str_digest);
|
52
112
|
digest_len = RSTRING_LEN(str_digest);
|
53
113
|
|
54
114
|
if (LONG_MAX / 2 < digest_len) {
|
55
115
|
rb_raise(rb_eRuntimeError, "digest string too long");
|
56
116
|
}
|
57
117
|
|
58
|
-
|
59
|
-
buf = calloc(digest_len * 2, sizeof(char));
|
118
|
+
str = rb_usascii_str_new(0, digest_len * 2);
|
60
119
|
|
61
|
-
for (i = 0, p =
|
120
|
+
for (i = 0, p = RSTRING_PTR(str); i < digest_len; i++) {
|
62
121
|
unsigned char byte = digest[i];
|
63
122
|
|
64
123
|
p[i + i] = hex[byte >> 4];
|
65
124
|
p[i + i + 1] = hex[byte & 0x0f];
|
66
125
|
}
|
67
126
|
|
68
|
-
str = rb_str_new(buf, digest_len * 2);
|
69
|
-
free(buf);
|
70
127
|
return str;
|
71
128
|
}
|
72
129
|
|
@@ -82,6 +139,8 @@ rb_digest_s_hexencode(VALUE klass, VALUE str)
|
|
82
139
|
return hexencode_str_new(str);
|
83
140
|
}
|
84
141
|
|
142
|
+
NORETURN(static void rb_digest_instance_method_unimpl(VALUE self, const char *method));
|
143
|
+
|
85
144
|
/*
|
86
145
|
* Document-module: Digest::Instance
|
87
146
|
*
|
@@ -89,6 +148,13 @@ rb_digest_s_hexencode(VALUE klass, VALUE str)
|
|
89
148
|
* object to calculate message digest values.
|
90
149
|
*/
|
91
150
|
|
151
|
+
static void
|
152
|
+
rb_digest_instance_method_unimpl(VALUE self, const char *method)
|
153
|
+
{
|
154
|
+
rb_raise(rb_eRuntimeError, "%s does not implement %s()",
|
155
|
+
rb_obj_classname(self), method);
|
156
|
+
}
|
157
|
+
|
92
158
|
/*
|
93
159
|
* call-seq:
|
94
160
|
* digest_obj.update(string) -> digest_obj
|
@@ -103,9 +169,9 @@ rb_digest_s_hexencode(VALUE klass, VALUE str)
|
|
103
169
|
static VALUE
|
104
170
|
rb_digest_instance_update(VALUE self, VALUE str)
|
105
171
|
{
|
106
|
-
|
107
|
-
|
108
|
-
|
172
|
+
rb_digest_instance_method_unimpl(self, "update");
|
173
|
+
|
174
|
+
UNREACHABLE;
|
109
175
|
}
|
110
176
|
|
111
177
|
/*
|
@@ -123,9 +189,9 @@ rb_digest_instance_update(VALUE self, VALUE str)
|
|
123
189
|
static VALUE
|
124
190
|
rb_digest_instance_finish(VALUE self)
|
125
191
|
{
|
126
|
-
|
127
|
-
|
128
|
-
|
192
|
+
rb_digest_instance_method_unimpl(self, "finish");
|
193
|
+
|
194
|
+
UNREACHABLE;
|
129
195
|
}
|
130
196
|
|
131
197
|
/*
|
@@ -139,9 +205,9 @@ rb_digest_instance_finish(VALUE self)
|
|
139
205
|
static VALUE
|
140
206
|
rb_digest_instance_reset(VALUE self)
|
141
207
|
{
|
142
|
-
|
143
|
-
|
144
|
-
|
208
|
+
rb_digest_instance_method_unimpl(self, "reset");
|
209
|
+
|
210
|
+
UNREACHABLE;
|
145
211
|
}
|
146
212
|
|
147
213
|
/*
|
@@ -182,10 +248,7 @@ rb_digest_instance_digest(int argc, VALUE *argv, VALUE self)
|
|
182
248
|
value = rb_funcall(self, id_finish, 0);
|
183
249
|
rb_funcall(self, id_reset, 0);
|
184
250
|
} else {
|
185
|
-
|
186
|
-
|
187
|
-
value = rb_funcall(clone, id_finish, 0);
|
188
|
-
rb_funcall(clone, id_reset, 0);
|
251
|
+
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
|
189
252
|
}
|
190
253
|
|
191
254
|
return value;
|
@@ -230,10 +293,7 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
|
|
230
293
|
value = rb_funcall(self, id_finish, 0);
|
231
294
|
rb_funcall(self, id_reset, 0);
|
232
295
|
} else {
|
233
|
-
|
234
|
-
|
235
|
-
value = rb_funcall(clone, id_finish, 0);
|
236
|
-
rb_funcall(clone, id_reset, 0);
|
296
|
+
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
|
237
297
|
}
|
238
298
|
|
239
299
|
return hexencode_str_new(value);
|
@@ -243,8 +303,8 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
|
|
243
303
|
* call-seq:
|
244
304
|
* digest_obj.hexdigest! -> string
|
245
305
|
*
|
246
|
-
* Returns the resulting hash value
|
247
|
-
* initial state.
|
306
|
+
* Returns the resulting hash value in a hex-encoded form and resets
|
307
|
+
* the digest to the initial state.
|
248
308
|
*/
|
249
309
|
static VALUE
|
250
310
|
rb_digest_instance_hexdigest_bang(VALUE self)
|
@@ -312,7 +372,8 @@ rb_digest_instance_equal(VALUE self, VALUE other)
|
|
312
372
|
str2 = rb_digest_instance_digest(0, 0, other);
|
313
373
|
} else {
|
314
374
|
str1 = rb_digest_instance_to_s(self);
|
315
|
-
str2 = other;
|
375
|
+
str2 = rb_check_string_type(other);
|
376
|
+
if (NIL_P(str2)) return Qfalse;
|
316
377
|
}
|
317
378
|
|
318
379
|
/* never blindly assume that subclass methods return strings */
|
@@ -320,8 +381,8 @@ rb_digest_instance_equal(VALUE self, VALUE other)
|
|
320
381
|
StringValue(str2);
|
321
382
|
|
322
383
|
if (RSTRING_LEN(str1) == RSTRING_LEN(str2) &&
|
323
|
-
|
324
|
-
|
384
|
+
rb_str_cmp(str1, str2) == 0) {
|
385
|
+
return Qtrue;
|
325
386
|
}
|
326
387
|
return Qfalse;
|
327
388
|
}
|
@@ -370,9 +431,9 @@ rb_digest_instance_length(VALUE self)
|
|
370
431
|
static VALUE
|
371
432
|
rb_digest_instance_block_length(VALUE self)
|
372
433
|
{
|
373
|
-
|
374
|
-
|
375
|
-
|
434
|
+
rb_digest_instance_method_unimpl(self, "block_length");
|
435
|
+
|
436
|
+
UNREACHABLE;
|
376
437
|
}
|
377
438
|
|
378
439
|
/*
|
@@ -426,6 +487,13 @@ rb_digest_class_s_hexdigest(int argc, VALUE *argv, VALUE klass)
|
|
426
487
|
return hexencode_str_new(rb_funcall2(klass, id_digest, argc, argv));
|
427
488
|
}
|
428
489
|
|
490
|
+
/* :nodoc: */
|
491
|
+
static VALUE
|
492
|
+
rb_digest_class_init(VALUE self)
|
493
|
+
{
|
494
|
+
return self;
|
495
|
+
}
|
496
|
+
|
429
497
|
/*
|
430
498
|
* Document-class: Digest::Base
|
431
499
|
*
|
@@ -437,23 +505,25 @@ static rb_digest_metadata_t *
|
|
437
505
|
get_digest_base_metadata(VALUE klass)
|
438
506
|
{
|
439
507
|
VALUE p;
|
440
|
-
VALUE obj
|
508
|
+
VALUE obj;
|
441
509
|
rb_digest_metadata_t *algo;
|
442
510
|
|
443
|
-
for (p = klass; p; p =
|
511
|
+
for (p = klass; !NIL_P(p); p = rb_class_superclass(p)) {
|
444
512
|
if (rb_ivar_defined(p, id_metadata)) {
|
445
513
|
obj = rb_ivar_get(p, id_metadata);
|
446
514
|
break;
|
447
515
|
}
|
448
516
|
}
|
449
517
|
|
450
|
-
if (
|
518
|
+
if (NIL_P(p))
|
451
519
|
rb_raise(rb_eRuntimeError, "Digest::Base cannot be directly inherited in Ruby");
|
452
520
|
|
521
|
+
#undef RUBY_UNTYPED_DATA_WARNING
|
522
|
+
#define RUBY_UNTYPED_DATA_WARNING 0
|
453
523
|
Data_Get_Struct(obj, rb_digest_metadata_t, algo);
|
454
524
|
|
455
525
|
switch (algo->api_version) {
|
456
|
-
case
|
526
|
+
case 3:
|
457
527
|
break;
|
458
528
|
|
459
529
|
/*
|
@@ -467,6 +537,21 @@ get_digest_base_metadata(VALUE klass)
|
|
467
537
|
return algo;
|
468
538
|
}
|
469
539
|
|
540
|
+
static const rb_data_type_t digest_type = {
|
541
|
+
"digest",
|
542
|
+
{0, RUBY_TYPED_DEFAULT_FREE, 0,},
|
543
|
+
0, 0,
|
544
|
+
(RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED),
|
545
|
+
};
|
546
|
+
|
547
|
+
static inline void
|
548
|
+
algo_init(const rb_digest_metadata_t *algo, void *pctx)
|
549
|
+
{
|
550
|
+
if (algo->init_func(pctx) != 1) {
|
551
|
+
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
|
552
|
+
}
|
553
|
+
}
|
554
|
+
|
470
555
|
static VALUE
|
471
556
|
rb_digest_base_alloc(VALUE klass)
|
472
557
|
{
|
@@ -475,15 +560,15 @@ rb_digest_base_alloc(VALUE klass)
|
|
475
560
|
void *pctx;
|
476
561
|
|
477
562
|
if (klass == rb_cDigest_Base) {
|
478
|
-
|
563
|
+
rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
|
479
564
|
}
|
480
565
|
|
481
566
|
algo = get_digest_base_metadata(klass);
|
482
567
|
|
483
568
|
pctx = xmalloc(algo->ctx_size);
|
484
|
-
algo
|
569
|
+
algo_init(algo, pctx);
|
485
570
|
|
486
|
-
obj =
|
571
|
+
obj = TypedData_Wrap_Struct(klass, &digest_type, pctx);
|
487
572
|
|
488
573
|
return obj;
|
489
574
|
}
|
@@ -500,9 +585,11 @@ rb_digest_base_copy(VALUE copy, VALUE obj)
|
|
500
585
|
rb_check_frozen(copy);
|
501
586
|
|
502
587
|
algo = get_digest_base_metadata(rb_obj_class(copy));
|
588
|
+
if (algo != get_digest_base_metadata(rb_obj_class(obj)))
|
589
|
+
rb_raise(rb_eTypeError, "different algorithms");
|
503
590
|
|
504
|
-
|
505
|
-
|
591
|
+
TypedData_Get_Struct(obj, void, &digest_type, pctx1);
|
592
|
+
TypedData_Get_Struct(copy, void, &digest_type, pctx2);
|
506
593
|
memcpy(pctx2, pctx1, algo->ctx_size);
|
507
594
|
|
508
595
|
return copy;
|
@@ -517,9 +604,9 @@ rb_digest_base_reset(VALUE self)
|
|
517
604
|
|
518
605
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
519
606
|
|
520
|
-
|
607
|
+
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
521
608
|
|
522
|
-
algo
|
609
|
+
algo_init(algo, pctx);
|
523
610
|
|
524
611
|
return self;
|
525
612
|
}
|
@@ -533,10 +620,10 @@ rb_digest_base_update(VALUE self, VALUE str)
|
|
533
620
|
|
534
621
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
535
622
|
|
536
|
-
|
623
|
+
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
537
624
|
|
538
625
|
StringValue(str);
|
539
|
-
algo->update_func(pctx, (unsigned char *)
|
626
|
+
algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
|
540
627
|
|
541
628
|
return self;
|
542
629
|
}
|
@@ -551,17 +638,13 @@ rb_digest_base_finish(VALUE self)
|
|
551
638
|
|
552
639
|
algo = get_digest_base_metadata(rb_obj_class(self));
|
553
640
|
|
554
|
-
|
641
|
+
TypedData_Get_Struct(self, void, &digest_type, pctx);
|
555
642
|
|
556
|
-
|
557
|
-
|
558
|
-
algo->finish_func(pctx, (unsigned char*)buf);
|
643
|
+
str = rb_str_new(0, algo->digest_len);
|
644
|
+
algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str));
|
559
645
|
|
560
646
|
/* avoid potential coredump caused by use of a finished context */
|
561
|
-
algo
|
562
|
-
|
563
|
-
str = rb_str_new(buf, algo->digest_len);
|
564
|
-
free(buf);
|
647
|
+
algo_init(algo, pctx);
|
565
648
|
|
566
649
|
return str;
|
567
650
|
}
|
@@ -637,6 +720,7 @@ Init_digest(void)
|
|
637
720
|
* class Digest::Class
|
638
721
|
*/
|
639
722
|
rb_cDigest_Class = rb_define_class_under(rb_mDigest, "Class", rb_cObject);
|
723
|
+
rb_define_method(rb_cDigest_Class, "initialize", rb_digest_class_init, 0);
|
640
724
|
rb_include_module(rb_cDigest_Class, rb_mDigest_Instance);
|
641
725
|
|
642
726
|
/* class methods */
|