@@ -103,7 +103,8 @@ VALUE ossl_digest_update(VALUE, VALUE);
103103 * Digest.new(string [, data]) -> Digest
104104 *
105105 * Creates a Digest instance based on _string_, which is either the ln
106- * (long name) or sn (short name) of a supported digest algorithm.
106+ * (long name) or sn (short name) of a supported digest algorithm. A list of
107+ * supported algorithms can be obtained by calling OpenSSL::Digest.digests.
107108 *
108109 * If _data_ (a String) is given, it is used as the initial input to the
109110 * Digest instance, i.e.
@@ -162,6 +163,32 @@ ossl_digest_copy(VALUE self, VALUE other)
162163 return self ;
163164}
164165
166+ static void
167+ add_digest_name_to_ary (const OBJ_NAME * name , void * arg )
168+ {
169+ VALUE ary = (VALUE )arg ;
170+ rb_ary_push (ary , rb_str_new2 (name -> name ));
171+ }
172+
173+ /*
174+ * call-seq:
175+ * OpenSSL::Digest.digests -> array[string...]
176+ *
177+ * Returns the names of all available digests in an array.
178+ */
179+ static VALUE
180+ ossl_s_digests (VALUE self )
181+ {
182+ VALUE ary ;
183+
184+ ary = rb_ary_new ();
185+ OBJ_NAME_do_all_sorted (OBJ_NAME_TYPE_MD_METH ,
186+ add_digest_name_to_ary ,
187+ (void * )ary );
188+
189+ return ary ;
190+ }
191+
165192/*
166193 * call-seq:
167194 * digest.reset -> self
@@ -245,7 +272,8 @@ ossl_digest_finish(int argc, VALUE *argv, VALUE self)
245272 * call-seq:
246273 * digest.name -> string
247274 *
248- * Returns the sn of this Digest algorithm.
275+ * Returns the short name of this Digest algorithm which may differ slightly
276+ * from the original name provided.
249277 *
250278 * === Example
251279 * digest = OpenSSL::Digest.new('SHA512')
@@ -412,6 +440,7 @@ Init_ossl_digest(void)
412440
413441 rb_define_alloc_func (cDigest , ossl_digest_alloc );
414442
443+ rb_define_module_function (cDigest , "digests" , ossl_s_digests , 0 );
415444 rb_define_method (cDigest , "initialize" , ossl_digest_initialize , -1 );
416445 rb_define_method (cDigest , "initialize_copy" , ossl_digest_copy , 1 );
417446 rb_define_method (cDigest , "reset" , ossl_digest_reset , 0 );
0 commit comments