[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]