ruby-changes:20165
From: nahi <ko1@a...>
Date: Thu, 23 Jun 2011 22:52:06 +0900 (JST)
Subject: [ruby-changes:20165] nahi:r32213 (trunk): * ext/openssl/ossl_x509name.c: Add X509::Name#hash_old as a wrapper
nahi 2011-06-23 22:51:55 +0900 (Thu, 23 Jun 2011) New Revision: 32213 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32213 Log: * ext/openssl/ossl_x509name.c: Add X509::Name#hash_old as a wrapper for X509_NAME_hash_old in OpenSSL 1.0.0. See #4805 * test/openssl/test_x509name.rb (test_hash): Make test pass with OpenSSL 1.0.0. * NEWS: Add it. Modified files: trunk/ChangeLog trunk/NEWS trunk/ext/openssl/extconf.rb trunk/ext/openssl/ossl_x509name.c trunk/test/openssl/test_x509name.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 32212) +++ ChangeLog (revision 32213) @@ -1,3 +1,13 @@ +Thu Jun 23 22:46:57 2011 Hiroshi Nakamura <nahi@r...> + + * ext/openssl/ossl_x509name.c: Add X509::Name#hash_old as a wrapper + for X509_NAME_hash_old in OpenSSL 1.0.0. See #4805 + + * test/openssl/test_x509name.rb (test_hash): Make test pass with + OpenSSL 1.0.0. + + * NEWS: Add it. + Thu Jun 23 19:30:53 2011 Hiroshi Nakamura <nahi@r...> * ext/openssl/ossl_ssl_session.c (ossl_ssl_session_set_time): Check Index: ext/openssl/ossl_x509name.c =================================================================== --- ext/openssl/ossl_x509name.c (revision 32212) +++ ext/openssl/ossl_x509name.c (revision 32213) @@ -317,8 +317,29 @@ 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 @@ -364,6 +385,9 @@ 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); Index: ext/openssl/extconf.rb =================================================================== --- ext/openssl/extconf.rb (revision 32212) +++ ext/openssl/extconf.rb (revision 32213) @@ -94,6 +94,7 @@ 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") Index: NEWS =================================================================== --- NEWS (revision 32212) +++ NEWS (revision 32213) @@ -177,6 +177,9 @@ * OpenSSL::PKey.read( file | string [, pwd] ) allows to read arbitrary public/private keys in DER-/PEM-encoded form with an optional password for encrypted PEM encodings. + * Add new method OpenSSL::X509::Name#hash_old as a wrapper of + X509_NAME_hash_old() defined from OpenSSL 1.0.0. It returns OpenSSL 0.9.8 + compatible hash value. * optparse * support for bash/zsh completion. Index: test/openssl/test_x509name.rb =================================================================== --- test/openssl/test_x509name.rb (revision 32212) +++ test/openssl/test_x509name.rb (revision 32213) @@ -271,6 +271,26 @@ 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/