Skip to content

Commit 19c457a

Browse files
Add OpenSSL::Digest.digests to get a list of available digests
1 parent 1e8e246 commit 19c457a

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

ext/openssl/ossl_digest.c

+27
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,32 @@ ossl_digest_copy(VALUE self, VALUE other)
162162
return self;
163163
}
164164

165+
static void
166+
add_digest_name_to_ary(const OBJ_NAME *name, void *arg)
167+
{
168+
VALUE ary = (VALUE)arg;
169+
rb_ary_push(ary, rb_str_new2(name->name));
170+
}
171+
172+
/*
173+
* call-seq:
174+
* OpenSSL::Digest.digests -> array[string...]
175+
*
176+
* Returns the names of all available digests in an array.
177+
*/
178+
static VALUE
179+
ossl_s_digests(VALUE self)
180+
{
181+
VALUE ary;
182+
183+
ary = rb_ary_new();
184+
OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH,
185+
add_digest_name_to_ary,
186+
(void*)ary);
187+
188+
return ary;
189+
}
190+
165191
/*
166192
* call-seq:
167193
* digest.reset -> self
@@ -414,6 +440,7 @@ Init_ossl_digest(void)
414440

415441
rb_define_method(cDigest, "initialize", ossl_digest_initialize, -1);
416442
rb_define_method(cDigest, "initialize_copy", ossl_digest_copy, 1);
443+
rb_define_module_function(cDigest, "digests", ossl_s_digests, 0);
417444
rb_define_method(cDigest, "reset", ossl_digest_reset, 0);
418445
rb_define_method(cDigest, "update", ossl_digest_update, 1);
419446
rb_define_alias(cDigest, "<<", "update");

test/openssl/test_digest.rb

+13-7
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_sha2
8888
end
8989

9090
def test_sha512_truncate
91-
pend "SHA512_224 is not implemented" unless digest_available?('SHA512-224')
91+
pend "SHA512_224 is not implemented" unless digest_available?('sha512-224')
9292
sha512_224_a = "d5cdb9ccc769a5121d4175f2bfdd13d6310e0d3d361ea75d82108327"
9393
sha512_256_a = "455e518824bc0601f9fb858ff5c37d417d67c2f8e0df2babe4808858aea830f8"
9494

@@ -100,7 +100,7 @@ def test_sha512_truncate
100100
end
101101

102102
def test_sha3
103-
pend "SHA3 is not implemented" unless digest_available?('SHA3-224')
103+
pend "SHA3 is not implemented" unless digest_available?('sha3-224')
104104
s224 = '6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7'
105105
s256 = 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a'
106106
s384 = '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004'
@@ -126,6 +126,15 @@ def test_openssl_digest
126126
end
127127
end
128128

129+
def test_digests
130+
digests = OpenSSL::Digest.digests
131+
assert_kind_of Array, digests
132+
assert_include digests, "md5"
133+
assert_include digests, "sha1"
134+
assert_include digests, "sha256"
135+
assert_include digests, "sha512"
136+
end
137+
129138
private
130139

131140
def check_digest(oid)
@@ -138,11 +147,8 @@ def check_digest(oid)
138147
end
139148

140149
def digest_available?(name)
141-
begin
142-
OpenSSL::Digest.new(name)
143-
rescue RuntimeError
144-
false
145-
end
150+
@digests ||= OpenSSL::Digest.digests
151+
@digests.include?(name)
146152
end
147153
end
148154

0 commit comments

Comments
 (0)