factor out function to dump crl
diff --git a/ChangeLog b/ChangeLog
index e872eca..6c24c2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-13 Dominic Chen <d.c.ddcc@gmail.com>
+
+	* OpenSSL/crypto.py: Implement the ``dump_crl()`` function to dump a
+	  certificate revocation list out to a string buffer.
+
 2015-09-07 Sam Lee <sam.rr.lee@gmail.com>
 
 	* OpenSSL/SSL.py, OpenSSL/test/test_ssl.py: Implemented
diff --git a/doc/api/crypto.rst b/doc/api/crypto.rst
index e2f2bca..95fb4df 100644
--- a/doc/api/crypto.rst
+++ b/doc/api/crypto.rst
@@ -90,6 +90,8 @@
 Certificate revocation lists
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+.. autofunction:: dump_crl
+
 .. py:function:: load_crl(type, buffer)
 
     Load Certificate Revocation List (CRL) data from a string *buffer*.
diff --git a/src/OpenSSL/crypto.py b/src/OpenSSL/crypto.py
index 132d98d..871bad2 100644
--- a/src/OpenSSL/crypto.py
+++ b/src/OpenSSL/crypto.py
@@ -1998,23 +1998,9 @@
         if not sign_result:
             _raise_current_error()
 
-        if type == FILETYPE_PEM:
-            ret = _lib.PEM_write_bio_X509_CRL(bio, self._crl)
-        elif type == FILETYPE_ASN1:
-            ret = _lib.i2d_X509_CRL_bio(bio, self._crl)
-        elif type == FILETYPE_TEXT:
-            ret = _lib.X509_CRL_print(bio, self._crl)
-        else:
-            raise ValueError(
-                "type argument must be FILETYPE_PEM, FILETYPE_ASN1, or "
-                "FILETYPE_TEXT"
-            )
+        return dump_crl(type, self)
 
-        if not ret:
-            # TODO: This is untested.
-            _raise_current_error()
 
-        return _bio_to_string(bio)
 CRLType = CRL
 
 
@@ -2577,6 +2563,33 @@
         _raise_current_error()
 
 
+def dump_crl(type, crl):
+    """
+    Dump a certificate revocation list to a buffer.
+
+    :param type: The file type (one of ``FILETYPE_PEM``, ``FILETYPE_ASN1``, or
+        ``FILETYPE_TEXT``).
+    :param cert: The CRL to dump.
+    :return: The buffer with the CRL.
+    :rtype: :py:data:`bytes`
+    """
+    bio = _new_mem_buf()
+
+    if type == FILETYPE_PEM:
+        ret = _lib.PEM_write_bio_X509_CRL(bio, crl._crl)
+    elif type == FILETYPE_ASN1:
+        ret = _lib.i2d_X509_CRL_bio(bio, crl._crl)
+    elif type == FILETYPE_TEXT:
+        ret = _lib.X509_CRL_print(bio, crl._crl)
+    else:
+        raise ValueError(
+            "type argument must be FILETYPE_PEM, FILETYPE_ASN1, or "
+            "FILETYPE_TEXT")
+
+    assert ret == 1
+    return _bio_to_string(bio)
+
+
 def load_crl(type, buffer):
     """
     Load a certificate revocation list from a buffer
diff --git a/tests/test_crypto.py b/tests/test_crypto.py
index 196e490..d9a9526 100644
--- a/tests/test_crypto.py
+++ b/tests/test_crypto.py
@@ -31,7 +31,7 @@
 from OpenSSL.crypto import dump_certificate_request, dump_privatekey
 from OpenSSL.crypto import PKCS7Type, load_pkcs7_data
 from OpenSSL.crypto import PKCS12, PKCS12Type, load_pkcs12
-from OpenSSL.crypto import CRL, Revoked, load_crl
+from OpenSSL.crypto import CRL, Revoked, dump_crl, load_crl
 from OpenSSL.crypto import NetscapeSPKI, NetscapeSPKIType
 from OpenSSL.crypto import (
     sign, verify, get_elliptic_curve, get_elliptic_curves)
@@ -3206,6 +3206,14 @@
         """
         self.assertRaises(Error, load_crl, FILETYPE_PEM, b"hello, world")
 
+    def test_dump_crl(self):
+        """
+        The dumped CRL matches the original input.
+        """
+        crl = load_crl(FILETYPE_PEM, crlData)
+        buf = dump_crl(FILETYPE_PEM, crl)
+        assert buf == crlData
+
 
 class X509StoreContextTests(TestCase):
     """