diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 3c7e939..9ab184b 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -182,8 +182,7 @@
             break;
         case SSL_ERROR_WANT_X509_LOOKUP:
             p = PY_SSL_ERROR_WANT_X509_LOOKUP;
-            errstr =
-                "The operation did not complete (X509 lookup)";
+            errstr = "The operation did not complete (X509 lookup)";
             break;
         case SSL_ERROR_WANT_CONNECT:
             p = PY_SSL_ERROR_WANT_CONNECT;
@@ -196,15 +195,14 @@
                 PySocketSockObject *s
                   = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
                 if (ret == 0 || (((PyObject *)s) == Py_None)) {
-                  p = PY_SSL_ERROR_EOF;
-                  errstr =
-                      "EOF occurred in violation of protocol";
+                    p = PY_SSL_ERROR_EOF;
+                    errstr = "EOF occurred in violation of protocol";
                 } else if (ret == -1) {
-                  /* underlying BIO reported an I/O error */
-                  return s->errorhandler();
+                    /* underlying BIO reported an I/O error */
+                    return s->errorhandler();
                 } else { /* possible? */
-                  p = PY_SSL_ERROR_SYSCALL;
-                  errstr = "Some I/O error occurred";
+                    p = PY_SSL_ERROR_SYSCALL;
+                    errstr = "Some I/O error occurred";
                 }
             } else {
                 p = PY_SSL_ERROR_SYSCALL;
@@ -221,8 +219,7 @@
                 /* XXX Protected by global interpreter lock */
                 errstr = ERR_error_string(e, NULL);
             else {              /* possible? */
-                errstr =
-                    "A failure in the SSL library occurred";
+                errstr = "A failure in the SSL library occurred";
             }
             break;
         }
@@ -325,7 +322,7 @@
     if (certreq != PY_SSL_CERT_NONE) {
         if (cacerts_file == NULL) {
             errstr = ERRSTR("No root certificates specified for "
-                      "verification of other-side certificates.");
+                            "verification of other-side certificates.");
             goto fail;
         } else {
             PySSL_BEGIN_ALLOW_THREADS
@@ -490,15 +487,15 @@
         }
         if (sockstate == SOCKET_HAS_TIMED_OUT) {
             PyErr_SetString(PySSLErrorObject,
-                ERRSTR("The handshake operation timed out"));
+                            ERRSTR("The handshake operation timed out"));
             return NULL;
         } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
             PyErr_SetString(PySSLErrorObject,
-                ERRSTR("Underlying socket has been closed."));
+                            ERRSTR("Underlying socket has been closed."));
             return NULL;
         } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
             PyErr_SetString(PySSLErrorObject,
-              ERRSTR("Underlying socket too large for select()."));
+                            ERRSTR("Underlying socket too large for select()."));
             return NULL;
         } else if (sockstate == SOCKET_IS_NONBLOCKING) {
             break;
@@ -544,7 +541,7 @@
         goto fail;
     }
     value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
-                                             buflen, "strict");
+                                     buflen, "strict");
     OPENSSL_free(valuebuf);
     if (value_obj == NULL) {
         Py_DECREF(name_obj);
@@ -1217,11 +1214,9 @@
             goto error;
         }
         if (err == SSL_ERROR_WANT_READ) {
-            sockstate =
-                check_socket_and_wait_for_timeout(sock, 0);
+            sockstate = check_socket_and_wait_for_timeout(sock, 0);
         } else if (err == SSL_ERROR_WANT_WRITE) {
-            sockstate =
-                check_socket_and_wait_for_timeout(sock, 1);
+            sockstate = check_socket_and_wait_for_timeout(sock, 1);
         } else {
             sockstate = SOCKET_OPERATION_OK;
         }
@@ -1334,7 +1329,7 @@
             goto error;
         } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
             PyErr_SetString(PySSLErrorObject,
-                "Underlying socket too large for select().");
+                            "Underlying socket too large for select().");
             goto error;
         } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
             count = 0;
@@ -1350,11 +1345,9 @@
         if (PyErr_CheckSignals())
             goto error;
         if (err == SSL_ERROR_WANT_READ) {
-            sockstate =
-              check_socket_and_wait_for_timeout(sock, 0);
+            sockstate = check_socket_and_wait_for_timeout(sock, 0);
         } else if (err == SSL_ERROR_WANT_WRITE) {
-            sockstate =
-              check_socket_and_wait_for_timeout(sock, 1);
+            sockstate = check_socket_and_wait_for_timeout(sock, 1);
         } else if ((err == SSL_ERROR_ZERO_RETURN) &&
                    (SSL_get_shutdown(self->ssl) ==
                     SSL_RECEIVED_SHUTDOWN))
@@ -1547,7 +1540,7 @@
     double entropy;
 
     if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
-    return NULL;
+        return NULL;
     RAND_add(buf, len, entropy);
     Py_INCREF(Py_None);
     return Py_None;
@@ -1578,15 +1571,15 @@
     int bytes;
 
     if (!PyUnicode_Check(arg))
-    return PyErr_Format(PyExc_TypeError,
-                        "RAND_egd() expected string, found %s",
-                        Py_TYPE(arg)->tp_name);
+        return PyErr_Format(PyExc_TypeError,
+                            "RAND_egd() expected string, found %s",
+                            Py_TYPE(arg)->tp_name);
     bytes = RAND_egd(_PyUnicode_AsString(arg));
     if (bytes == -1) {
-    PyErr_SetString(PySSLErrorObject,
-                    "EGD connection failed or EGD did not return "
-                    "enough data to seed the PRNG");
-    return NULL;
+        PyErr_SetString(PySSLErrorObject,
+                        "EGD connection failed or EGD did not return "
+                        "enough data to seed the PRNG");
+        return NULL;
     }
     return PyLong_FromLong(bytes);
 }
