Let set_reason accept bytes or None
diff --git a/OpenSSL/crypto/revoked.c b/OpenSSL/crypto/revoked.c
index 5a9e713..c876373 100644
--- a/OpenSSL/crypto/revoked.c
+++ b/OpenSSL/crypto/revoked.c
@@ -122,6 +122,20 @@
     return reason_code;
 }
 
+
+static int
+crypto_byte_converter(PyObject *input, void* output) {
+    char **message = output;
+    if (input == Py_None) {
+        *message = NULL;
+    } else if (PyBytes_CheckExact(input)) {
+        *message = PyBytes_AsString(input);
+    } else {
+        return 0;
+    }
+    return 1;
+}
+
 static char crypto_Revoked_set_reason_doc[] = "\n\
 Set the reason of a Revoked object.\n\
 \n\
@@ -136,8 +150,9 @@
     int reason_code;
     ASN1_ENUMERATED *rtmp = NULL;
 
-    if (!PyArg_ParseTupleAndKeywords(args, keywds, "z:set_reason",
-                                     kwlist, &reason_str)) {
+    if (!PyArg_ParseTupleAndKeywords(
+            args, keywds, "O&:set_reason", kwlist,
+            crypto_byte_converter, &reason_str)) {
         return NULL;
     }
 
diff --git a/OpenSSL/test/test_crypto.py b/OpenSSL/test/test_crypto.py
index a86bfac..5660b5a 100644
--- a/OpenSSL/test/test_crypto.py
+++ b/OpenSSL/test/test_crypto.py
@@ -2152,7 +2152,7 @@
         """
         revoked = Revoked()
         self.assertRaises(TypeError, revoked.set_reason, 100)
-        self.assertRaises(ValueError, revoked.set_reason, 'blue')
+        self.assertRaises(ValueError, revoked.set_reason, b('blue'))
 
 
     def test_get_reason_wrong_arguments(self):