add X509ReqType.{set,get}_version
diff --git a/ChangeLog b/ChangeLog
index d1b046e..5a68f4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-28  Jean-Paul Calderone  <exarkun@twistedmatrix.com>
+
+	* test/test_crypto.py, src/crypto/x509req.c: Added get_version and
+	  set_version_methods to X509ReqType based on patch from Wouter van
+	  Bommel.  Resolves LP#274418.
+
 2008-09-22  Jean-Paul Calderone  <exarkun@twistedmatrix.com>
 
 	* Release 0.8
diff --git a/doc/pyOpenSSL.tex b/doc/pyOpenSSL.tex
index 4252cac..a1b303f 100644
--- a/doc/pyOpenSSL.tex
+++ b/doc/pyOpenSSL.tex
@@ -454,6 +454,15 @@
 Verify a certificate request using the public key \var{pkey}.
 \end{methoddesc}
 
+\begin{methoddesc}[X509Req]{set_version}{version}
+Set the version (RFC 2459, 4.1.2.1) of the certificate request to
+\var{version}.
+\end{methoddesc}
+
+\begin{methoddesc}[X509Req]{get_version}{}
+Get the version (RFC 2459, 4.1.2.1) of the certificate request.
+\end{methoddesc}
+
 \subsubsection{X509Store objects \label{openssl-x509store}}
 
 The X509Store object has currently just one method:
diff --git a/src/crypto/x509req.c b/src/crypto/x509req.c
index f367360..bb6385f 100644
--- a/src/crypto/x509req.c
+++ b/src/crypto/x509req.c
@@ -239,6 +239,56 @@
     return Py_None;
 }
 
+static char crypto_X509Req_set_version_doc[] = "\n\
+Set the version subfield (RFC 2459, section 4.1.2.1) of the certificate\n\
+request.\n\
+\n\
+Arguments: self - X509Req object\n\
+           args - The Python argument tuple, should be:\n\
+             version - The version number\n\
+Returns:   None\n\
+";
+
+static PyObject *
+crypto_X509Req_set_version(crypto_X509ReqObj *self, PyObject *args)
+{
+    long version;
+
+    if (!PyArg_ParseTuple(args, "l:set_version", &version)) {
+        return NULL;
+    }
+
+    if (!X509_REQ_set_version(self->x509_req, version)) {
+        return NULL;
+    }
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static char crypto_X509Req_get_version_doc[] = "\n\
+Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate\n\
+request.\n\
+\n\
+Arguments: self - X509Req object\n\
+           args - The Python argument tuple, should be empty.\n\
+Returns:   an integer giving the value of the version subfield\n\
+";
+
+static PyObject *
+crypto_X509Req_get_version(crypto_X509ReqObj *self, PyObject *args)
+{
+    long version;
+
+    if (!PyArg_ParseTuple(args, ":get_version")) {
+        return NULL;
+    }
+
+    version = X509_REQ_get_version(self->x509_req);
+
+    return PyLong_FromLong(version);
+}
+
 /*
  * ADD_METHOD(name) expands to a correct PyMethodDef declaration
  *   {  'name', (PyCFunction)crypto_X509Req_name, METH_VARARGS }
@@ -254,6 +304,8 @@
     ADD_METHOD(sign),
     ADD_METHOD(verify),
     ADD_METHOD(add_extensions),
+    ADD_METHOD(set_version),
+    ADD_METHOD(get_version),
     { NULL, NULL }
 };
 #undef ADD_METHOD
diff --git a/test/test_crypto.py b/test/test_crypto.py
index 31ceb2d..ffc4f35 100644
--- a/test/test_crypto.py
+++ b/test/test_crypto.py
@@ -419,6 +419,20 @@
             "%r is of type %r, should be %r" % (request, type(request), X509ReqType))
 
 
+    def test_version(self):
+        """
+        L{X509ReqType.set_version} sets the X.509 version of the certificate
+        request.  L{X509ReqType.get_version} returns the X.509 version of
+        the certificate request.  The initial value of the version is 0.
+        """
+        request = X509Req()
+        self.assertEqual(request.get_version(), 0)
+        request.set_version(1)
+        self.assertEqual(request.get_version(), 1)
+        request.set_version(3)
+        self.assertEqual(request.get_version(), 3)
+
+
     def test_get_subject(self):
         """
         L{X509ReqType.get_subject} returns an L{X509Name} for the subject of