Feature #4805 ยป X509-Name-hash_old.diff
| ChangeLog (working copy) | ||
|---|---|---|
| Tue May 31 21:07:53 2011 Hiroshi Nakamura <nahi@ruby-lang.org> | ||
| * ext/openssl/ossl_x509name.c: added X509::Name#hash_old as a wrapper | ||
| for X509_NAME_hash_old in OpenSSL 1.0.0. | ||
| * test/openssl/test_x509name.rb (test_hash): make test pass with | ||
| OpenSSL 1.0.0. | ||
| Tue May 31 17:03:24 2011 Hiroshi Nakamura <nahi@ruby-lang.org> | ||
| * lib/net/http.rb, lib/net/protocol.rb: Allow to configure to wait | ||
| ext/openssl/ossl_x509name.c (working copy) | ||
|---|---|---|
| return ULONG2NUM(hash); | ||
| } | ||
| #ifdef HAVE_X509_NAME_HASH_OLD | ||
| /* | ||
| * call-seq: | ||
| * name.hash_old => integer | ||
| * | ||
| * hash_old returns MD5 based hash used in OpenSSL 0.9.X. | ||
| */ | ||
| static VALUE | ||
| ossl_x509name_hash_old(VALUE self) | ||
| { | ||
| X509_NAME *name; | ||
| unsigned long hash; | ||
| GetX509Name(self, name); | ||
| hash = X509_NAME_hash_old(name); | ||
| return ULONG2NUM(hash); | ||
| } | ||
| #endif | ||
| /* | ||
| * call-seq: | ||
| * name.to_der => string | ||
| */ | ||
| static VALUE | ||
| ... | ... | |
| rb_define_alias(cX509Name, "<=>", "cmp"); | ||
| rb_define_method(cX509Name, "eql?", ossl_x509name_eql, 1); | ||
| rb_define_method(cX509Name, "hash", ossl_x509name_hash, 0); | ||
| #ifdef HAVE_X509_NAME_HASH_OLD | ||
| rb_define_method(cX509Name, "hash_old", ossl_x509name_hash_old, 0); | ||
| #endif | ||
| rb_define_method(cX509Name, "to_der", ossl_x509name_to_der, 0); | ||
| utf8str = INT2NUM(V_ASN1_UTF8STRING); | ||
| ext/openssl/extconf.rb (working copy) | ||
|---|---|---|
| have_func("X509_CRL_set_issuer_name") | ||
| have_func("X509_CRL_set_version") | ||
| have_func("X509_CRL_sort") | ||
| have_func("X509_NAME_hash_old") | ||
| have_func("X509_STORE_get_ex_data") | ||
| have_func("X509_STORE_set_ex_data") | ||
| have_func("OBJ_NAME_do_all_sorted") | ||
| test/openssl/test_x509name.rb (working copy) | ||
|---|---|---|
| assert_equal -1, n1 <=> n2 | ||
| end | ||
| def name_hash(name) | ||
| # OpenSSL 1.0.0 uses SHA1 for canonical encoding (not just a der) of | ||
| # X509Name for X509_NAME_hash. | ||
| name.respond_to?(:hash_old) ? name.hash_old : name.hash | ||
| end | ||
| def test_hash | ||
| dn = "/DC=org/DC=ruby-lang/CN=www.ruby-lang.org" | ||
| name = OpenSSL::X509::Name.parse(dn) | ||
| d = Digest::MD5.digest(name.to_der) | ||
| expected = (d[0].ord & 0xff) | (d[1].ord & 0xff) << 8 | (d[2].ord & 0xff) << 16 | (d[3].ord & 0xff) << 24 | ||
| assert_equal(expected, name_hash(name)) | ||
| # | ||
| dn = "/DC=org/DC=ruby-lang/CN=baz.ruby-lang.org" | ||
| name = OpenSSL::X509::Name.parse(dn) | ||
| d = Digest::MD5.digest(name.to_der) | ||
| expected = (d[0].ord & 0xff) | (d[1].ord & 0xff) << 8 | (d[2].ord & 0xff) << 16 | (d[3].ord & 0xff) << 24 | ||
| assert_equal(expected, name_hash(name)) | ||
| end | ||
| end | ||
| end | ||