aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2017-10-12 14:10:19 +0900
committerKazuki Yamaguchi <k@rhe.jp>2017-10-12 15:53:49 +0900
commit432a9f3455f537a99fe9771e550d0e3a682e99e8 (patch)
treeacd0ad414acae491a8ee07bcc418c64d94d4cc7c
parentb99f1ddc05dbdc69fc9b79fd65d1069d96c83b86 (diff)
downloadruby-openssl-432a9f3455f537a99fe9771e550d0e3a682e99e8.tar.gz
x509cert: implement X509::Certificate#==
-rw-r--r--ext/openssl/ossl_x509cert.c21
-rw-r--r--test/test_x509cert.rb14
2 files changed, 35 insertions, 0 deletions
diff --git a/ext/openssl/ossl_x509cert.c b/ext/openssl/ossl_x509cert.c
index 003a9c19..cf82a53d 100644
--- a/ext/openssl/ossl_x509cert.c
+++ b/ext/openssl/ossl_x509cert.c
@@ -684,6 +684,26 @@ ossl_x509_inspect(VALUE self)
}
/*
+ * call-seq:
+ * cert1 == cert2 -> true | false
+ *
+ * Compares the two certificates. Note that this takes into account all fields,
+ * not just the issuer name and the serial number.
+ */
+static VALUE
+ossl_x509_eq(VALUE self, VALUE other)
+{
+ X509 *a, *b;
+
+ GetX509(self, a);
+ if (!rb_obj_is_kind_of(other, cX509Cert))
+ return Qfalse;
+ GetX509(other, b);
+
+ return !X509_cmp(a, b) ? Qtrue : Qfalse;
+}
+
+/*
* INIT
*/
void
@@ -821,4 +841,5 @@ Init_ossl_x509cert(void)
rb_define_method(cX509Cert, "extensions=", ossl_x509_set_extensions, 1);
rb_define_method(cX509Cert, "add_extension", ossl_x509_add_extension, 1);
rb_define_method(cX509Cert, "inspect", ossl_x509_inspect, 0);
+ rb_define_method(cX509Cert, "==", ossl_x509_eq, 1);
}
diff --git a/test/test_x509cert.rb b/test/test_x509cert.rb
index 289994d1..bde3fbc9 100644
--- a/test/test_x509cert.rb
+++ b/test/test_x509cert.rb
@@ -169,6 +169,20 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
}
end
+ def test_eq
+ cacert = issue_cert(@ca, @rsa1024, 1, [], nil, nil)
+ cert1 = issue_cert(@ee1, @rsa2048, 2, [], cacert, @rsa1024)
+ cert2 = issue_cert(@ee1, @rsa2048, 2, [], cacert, @rsa1024)
+ cert3 = issue_cert(@ee1, @rsa2048, 3, [], cacert, @rsa1024)
+ cert4 = issue_cert(@ee1, @rsa2048, 2, [], cacert, @rsa1024, digest: "sha512")
+
+ assert_equal false, cert1 == 12345
+ assert_equal true, cert1 == cert2
+ assert_equal false, cert1 == cert3
+ assert_equal false, cert1 == cert4
+ assert_equal false, cert3 == cert4
+ end
+
private
def certificate_error_returns_false