diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c
index 8ef0d12..9c50857 100644
--- a/crypto/asn1/a_bitstr.c
+++ b/crypto/asn1/a_bitstr.c
@@ -128,7 +128,7 @@
   }
   p += len;
   *pp = p;
-  return (ret);
+  return ret;
 }
 
 ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
@@ -150,7 +150,7 @@
 
   if ((a == NULL) || ((*a) == NULL)) {
     if ((ret = ASN1_BIT_STRING_new()) == NULL) {
-      return (NULL);
+      return NULL;
     }
   } else {
     ret = (*a);
@@ -195,12 +195,12 @@
     (*a) = ret;
   }
   *pp = p;
-  return (ret);
+  return ret;
 err:
   if ((ret != NULL) && ((a == NULL) || (*a != ret))) {
     ASN1_BIT_STRING_free(ret);
   }
-  return (NULL);
+  return NULL;
 }
 
 // These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
@@ -223,7 +223,7 @@
 
   if ((a->length < (w + 1)) || (a->data == NULL)) {
     if (!value) {
-      return (1);  // Don't need to set
+      return 1;  // Don't need to set
     }
     if (a->data == NULL) {
       c = (unsigned char *)OPENSSL_malloc(w + 1);
@@ -244,7 +244,7 @@
   while ((a->length > 0) && (a->data[a->length - 1] == 0)) {
     a->length--;
   }
-  return (1);
+  return 1;
 }
 
 int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n) {
@@ -253,7 +253,7 @@
   w = n / 8;
   v = 1 << (7 - (n & 0x07));
   if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL)) {
-    return (0);
+    return 0;
   }
   return ((a->data[w] & v) != 0);
 }
diff --git a/crypto/asn1/a_bool.c b/crypto/asn1/a_bool.c
index e4703c6..2a4448c 100644
--- a/crypto/asn1/a_bool.c
+++ b/crypto/asn1/a_bool.c
@@ -65,7 +65,7 @@
 
   r = ASN1_object_size(0, 1, V_ASN1_BOOLEAN);
   if (pp == NULL) {
-    return (r);
+    return r;
   }
 
   if (*pp == NULL) {
diff --git a/crypto/asn1/a_dup.c b/crypto/asn1/a_dup.c
index 402584c..8ee0c7e 100644
--- a/crypto/asn1/a_dup.c
+++ b/crypto/asn1/a_dup.c
@@ -70,16 +70,16 @@
   void *ret;
 
   if (x == NULL) {
-    return (NULL);
+    return NULL;
   }
 
   i = ASN1_item_i2d(x, &b, it);
   if (b == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-    return (NULL);
+    return NULL;
   }
   p = b;
   ret = ASN1_item_d2i(NULL, &p, i, it);
   OPENSSL_free(b);
-  return (ret);
+  return ret;
 }
diff --git a/crypto/asn1/a_gentm.c b/crypto/asn1/a_gentm.c
index 00a1282..e31ac1d 100644
--- a/crypto/asn1/a_gentm.c
+++ b/crypto/asn1/a_gentm.c
@@ -93,9 +93,9 @@
       }
       s->type = V_ASN1_GENERALIZEDTIME;
     }
-    return (1);
+    return 1;
   } else {
-    return (0);
+    return 0;
   }
 }
 
diff --git a/crypto/asn1/a_int.c b/crypto/asn1/a_int.c
index a13576a..316210e 100644
--- a/crypto/asn1/a_int.c
+++ b/crypto/asn1/a_int.c
@@ -426,7 +426,7 @@
   } else if (ai->type & V_ASN1_NEG) {
     BN_set_negative(ret, 1);
   }
-  return (ret);
+  return ret;
 }
 
 BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn) {
diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c
index 186ee67..17783ba 100644
--- a/crypto/asn1/a_object.c
+++ b/crypto/asn1/a_object.c
@@ -191,7 +191,7 @@
   if ((a == NULL) || ((*a) == NULL) ||
       !((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) {
     if ((ret = ASN1_OBJECT_new()) == NULL) {
-      return (NULL);
+      return NULL;
     }
   } else {
     ret = (*a);
@@ -232,13 +232,13 @@
     (*a) = ret;
   }
   *pp = p;
-  return (ret);
+  return ret;
 err:
   OPENSSL_PUT_ERROR(ASN1, i);
   if ((ret != NULL) && ((a == NULL) || (*a != ret))) {
     ASN1_OBJECT_free(ret);
   }
-  return (NULL);
+  return NULL;
 }
 
 ASN1_OBJECT *ASN1_OBJECT_new(void) {
@@ -247,7 +247,7 @@
   ret = (ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT));
   if (ret == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-    return (NULL);
+    return NULL;
   }
   ret->length = 0;
   ret->data = NULL;
@@ -255,7 +255,7 @@
   ret->sn = NULL;
   ret->ln = NULL;
   ret->flags = ASN1_OBJECT_FLAG_DYNAMIC;
-  return (ret);
+  return ret;
 }
 
 void ASN1_OBJECT_free(ASN1_OBJECT *a) {
diff --git a/crypto/asn1/a_strex.c b/crypto/asn1/a_strex.c
index 3906bc9..1bb574b 100644
--- a/crypto/asn1/a_strex.c
+++ b/crypto/asn1/a_strex.c
@@ -434,7 +434,7 @@
   const char *p;
 
   if (v == NULL) {
-    return (0);
+    return 0;
   }
   n = 0;
   p = (const char *)v->data;
@@ -447,17 +447,17 @@
     n++;
     if (n >= 80) {
       if (BIO_write(bp, buf, n) <= 0) {
-        return (0);
+        return 0;
       }
       n = 0;
     }
   }
   if (n > 0) {
     if (BIO_write(bp, buf, n) <= 0) {
-      return (0);
+      return 0;
     }
   }
-  return (1);
+  return 1;
 }
 
 int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm) {
@@ -468,7 +468,7 @@
     return ASN1_GENERALIZEDTIME_print(bp, tm);
   }
   BIO_write(bp, "Bad time value", 14);
-  return (0);
+  return 0;
 }
 
 static const char *const mon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
@@ -521,13 +521,13 @@
 
   if (BIO_printf(bp, "%s %2d %02d:%02d:%02d%.*s %d%s", mon[M - 1], d, h, m, s,
                  f_len, f, y, (gmt) ? " GMT" : "") <= 0) {
-    return (0);
+    return 0;
   } else {
-    return (1);
+    return 1;
   }
 err:
   BIO_write(bp, "Bad time value", 14);
-  return (0);
+  return 0;
 }
 
 // consume_two_digits is a helper function for ASN1_UTCTIME_print. If |*v|,
diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c
index c0cc2f9..159a0ea 100644
--- a/crypto/asn1/a_utctm.c
+++ b/crypto/asn1/a_utctm.c
@@ -93,9 +93,9 @@
       }
       s->type = V_ASN1_UTCTIME;
     }
-    return (1);
+    return 1;
   } else {
-    return (0);
+    return 0;
   }
 }
 
@@ -152,7 +152,7 @@
                ts->tm_sec);
   s->length = strlen(p);
   s->type = V_ASN1_UTCTIME;
-  return (s);
+  return s;
 err:
   if (free_s && s) {
     ASN1_UTCTIME_free(s);
diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c
index 6fbeb56..98061db 100644
--- a/crypto/asn1/asn1_lib.c
+++ b/crypto/asn1/asn1_lib.c
@@ -277,7 +277,7 @@
 
   if (len < 0) {
     if (data == NULL) {
-      return (0);
+      return 0;
     } else {
       len = strlen(data);
     }
@@ -293,7 +293,7 @@
     if (str->data == NULL) {
       OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
       str->data = c;
-      return (0);
+      return 0;
     }
   }
   str->length = len;
@@ -302,7 +302,7 @@
     // an allowance for strings :-)
     str->data[len] = '\0';
   }
-  return (1);
+  return 1;
 }
 
 void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len) {
@@ -321,13 +321,13 @@
   ret = (ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING));
   if (ret == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-    return (NULL);
+    return NULL;
   }
   ret->length = 0;
   ret->type = type;
   ret->data = NULL;
   ret->flags = 0;
-  return (ret);
+  return ret;
 }
 
 void ASN1_STRING_free(ASN1_STRING *str) {
diff --git a/crypto/asn1/f_int.c b/crypto/asn1/f_int.c
index 84bf667..047fcac 100644
--- a/crypto/asn1/f_int.c
+++ b/crypto/asn1/f_int.c
@@ -64,7 +64,7 @@
   char buf[2];
 
   if (a == NULL) {
-    return (0);
+    return 0;
   }
 
   if (a->type & V_ASN1_NEG) {
@@ -95,9 +95,9 @@
       n += 2;
     }
   }
-  return (n);
+  return n;
 err:
-  return (-1);
+  return -1;
 }
 
 int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a) {
diff --git a/crypto/asn1/f_string.c b/crypto/asn1/f_string.c
index d0fca61..4bc8110 100644
--- a/crypto/asn1/f_string.c
+++ b/crypto/asn1/f_string.c
@@ -64,7 +64,7 @@
   char buf[2];
 
   if (a == NULL) {
-    return (0);
+    return 0;
   }
 
   if (a->length == 0) {
@@ -88,7 +88,7 @@
       n += 2;
     }
   }
-  return (n);
+  return n;
 err:
-  return (-1);
+  return -1;
 }
diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c
index f1d0798..76622ab 100644
--- a/crypto/pem/pem_lib.c
+++ b/crypto/pem/pem_lib.c
@@ -368,7 +368,7 @@
   OPENSSL_cleanse((char *)&ctx, sizeof(ctx));
   OPENSSL_cleanse(buf, PEM_BUFSIZE);
   OPENSSL_free(data);
-  return (ret);
+  return ret;
 }
 
 int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,
@@ -382,7 +382,7 @@
   len = *plen;
 
   if (cipher->cipher == NULL) {
-    return (1);
+    return 1;
   }
 
   klen = 0;
@@ -392,7 +392,7 @@
   klen = callback(buf, PEM_BUFSIZE, 0, u);
   if (klen <= 0) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_PASSWORD_READ);
-    return (0);
+    return 0;
   }
 
   if (!EVP_BytesToKey(cipher->cipher, EVP_md5(), &(cipher->iv[0]),
@@ -414,11 +414,11 @@
   OPENSSL_cleanse((char *)key, sizeof(key));
   if (!o) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_DECRYPT);
-    return (0);
+    return 0;
   }
   j += i;
   *plen = j;
-  return (1);
+  return 1;
 }
 
 int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) {
@@ -429,36 +429,36 @@
   cipher->cipher = NULL;
   OPENSSL_memset(cipher->iv, 0, sizeof(cipher->iv));
   if ((header == NULL) || (*header == '\0') || (*header == '\n')) {
-    return (1);
+    return 1;
   }
   if (strncmp(header, "Proc-Type: ", 11) != 0) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_PROC_TYPE);
-    return (0);
+    return 0;
   }
   header += 11;
   if (*header != '4') {
-    return (0);
+    return 0;
   }
   header++;
   if (*header != ',') {
-    return (0);
+    return 0;
   }
   header++;
   if (strncmp(header, "ENCRYPTED", 9) != 0) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_ENCRYPTED);
-    return (0);
+    return 0;
   }
   for (; (*header != '\n') && (*header != '\0'); header++) {
     ;
   }
   if (*header == '\0') {
     OPENSSL_PUT_ERROR(PEM, PEM_R_SHORT_HEADER);
-    return (0);
+    return 0;
   }
   header++;
   if (strncmp(header, "DEK-Info: ", 10) != 0) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_NOT_DEK_INFO);
-    return (0);
+    return 0;
   }
   header += 10;
 
@@ -478,7 +478,7 @@
 
   if (enc == NULL) {
     OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_ENCRYPTION);
-    return (0);
+    return 0;
   }
   // The IV parameter must be at least 8 bytes long to be used as the salt in
   // the KDF. (This should not happen given |cipher_by_name|.)
@@ -488,10 +488,10 @@
     return 0;
   }
   if (!load_iv(header_pp, &(cipher->iv[0]), EVP_CIPHER_iv_length(enc))) {
-    return (0);
+    return 0;
   }
 
-  return (1);
+  return 1;
 }
 
 static int load_iv(char **fromp, unsigned char *to, int num) {
@@ -512,14 +512,14 @@
       v = *from - 'a' + 10;
     } else {
       OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_IV_CHARS);
-      return (0);
+      return 0;
     }
     from++;
     to[i / 2] |= v << (long)((!(i & 1)) * 4);
   }
 
   *fromp = from;
-  return (1);
+  return 1;
 }
 
 int PEM_write(FILE *fp, const char *name, const char *header,
@@ -531,7 +531,7 @@
   }
   int ret = PEM_write_bio(b, name, header, data, len);
   BIO_free(b);
-  return (ret);
+  return ret;
 }
 
 int PEM_write_bio(BIO *bp, const char *name, const char *header,
@@ -585,13 +585,13 @@
       (BIO_write(bp, "-----\n", 6) != 6)) {
     goto err;
   }
-  return (i + outl);
+  return i + outl;
 err:
   if (buf) {
     OPENSSL_free(buf);
   }
   OPENSSL_PUT_ERROR(PEM, reason);
-  return (0);
+  return 0;
 }
 
 int PEM_read(FILE *fp, char **name, char **header, unsigned char **data,
@@ -603,7 +603,7 @@
   }
   int ret = PEM_read_bio(b, name, header, data, len);
   BIO_free(b);
-  return (ret);
+  return ret;
 }
 
 int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data,
@@ -623,7 +623,7 @@
     BUF_MEM_free(headerB);
     BUF_MEM_free(dataB);
     OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
-    return (0);
+    return 0;
   }
 
   buf[254] = '\0';
@@ -779,12 +779,12 @@
   OPENSSL_free(nameB);
   OPENSSL_free(headerB);
   OPENSSL_free(dataB);
-  return (1);
+  return 1;
 err:
   BUF_MEM_free(nameB);
   BUF_MEM_free(headerB);
   BUF_MEM_free(dataB);
-  return (0);
+  return 0;
 }
 
 int PEM_def_callback(char *buf, int size, int rwflag, void *userdata) {
diff --git a/crypto/pem/pem_pk8.c b/crypto/pem/pem_pk8.c
index 5aef6f1..85196fa 100644
--- a/crypto/pem/pem_pk8.c
+++ b/crypto/pem/pem_pk8.c
@@ -218,7 +218,7 @@
   int ret;
   if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
     OPENSSL_PUT_ERROR(PEM, ERR_R_BUF_LIB);
-    return (0);
+    return 0;
   }
   ret = do_pk8pkey(bp, x, isder, nid, enc, kstr, klen, cb, u);
   BIO_free(bp);
diff --git a/crypto/pem/pem_pkey.c b/crypto/pem/pem_pkey.c
index c4b2ca6..2d28d6c 100644
--- a/crypto/pem/pem_pkey.c
+++ b/crypto/pem/pem_pkey.c
@@ -147,7 +147,7 @@
 err:
   OPENSSL_free(nm);
   OPENSSL_free(data);
-  return (ret);
+  return ret;
 }
 
 int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
diff --git a/crypto/x509/a_digest.c b/crypto/x509/a_digest.c
index adc6313..d7dcecc 100644
--- a/crypto/x509/a_digest.c
+++ b/crypto/x509/a_digest.c
@@ -69,7 +69,7 @@
   i = i2d(data, NULL);
   if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    return (0);
+    return 0;
   }
   p = str;
   i2d(data, &p);
@@ -86,7 +86,7 @@
 
   i = ASN1_item_i2d(asn, &str, it);
   if (!str) {
-    return (0);
+    return 0;
   }
 
   ret = EVP_Digest(str, i, md, len, type, NULL);
diff --git a/crypto/x509/a_sign.c b/crypto/x509/a_sign.c
index 21552ea..010f660 100644
--- a/crypto/x509/a_sign.c
+++ b/crypto/x509/a_sign.c
@@ -121,5 +121,5 @@
   EVP_MD_CTX_cleanup(ctx);
   OPENSSL_free(buf_in);
   OPENSSL_free(buf_out);
-  return (outl);
+  return outl;
 }
diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c
index 91d16d0..395e82d 100644
--- a/crypto/x509/by_dir.c
+++ b/crypto/x509/by_dir.c
@@ -109,7 +109,7 @@
     NULL,                 // get_by_alias
 };
 
-X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { return (&x509_dir_lookup); }
+X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { return &x509_dir_lookup; }
 
 static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
                     char **retp) {
@@ -137,22 +137,22 @@
       }
       break;
   }
-  return (ret);
+  return ret;
 }
 
 static int new_dir(X509_LOOKUP *lu) {
   BY_DIR *a;
 
   if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL) {
-    return (0);
+    return 0;
   }
   if ((a->buffer = BUF_MEM_new()) == NULL) {
     OPENSSL_free(a);
-    return (0);
+    return 0;
   }
   a->dirs = NULL;
   lu->method_data = (char *)a;
-  return (1);
+  return 1;
 }
 
 static void by_dir_hash_free(BY_DIR_HASH *hash) { OPENSSL_free(hash); }
@@ -275,7 +275,7 @@
   const char *postfix = "";
 
   if (name == NULL) {
-    return (0);
+    return 0;
   }
 
   stmp.type = type;
@@ -443,7 +443,7 @@
   if (b != NULL) {
     BUF_MEM_free(b);
   }
-  return (ok);
+  return ok;
 }
 
 #endif  // OPENSSL_TRUSTY
diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c
index fe19dbd..65c2b8b 100644
--- a/crypto/x509/by_file.c
+++ b/crypto/x509/by_file.c
@@ -80,7 +80,7 @@
     NULL,          // get_by_alias
 };
 
-X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return (&x509_file_lookup); }
+X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return &x509_file_lookup; }
 
 static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
                         char **ret) {
@@ -112,7 +112,7 @@
       }
       break;
   }
-  return (ok);
+  return ok;
 }
 
 int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) {
@@ -177,7 +177,7 @@
   if (in != NULL) {
     BIO_free(in);
   }
-  return (ret);
+  return ret;
 }
 
 int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) {
@@ -242,7 +242,7 @@
   if (in != NULL) {
     BIO_free(in);
   }
-  return (ret);
+  return ret;
 }
 
 int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type) {
diff --git a/crypto/x509/t_x509.c b/crypto/x509/t_x509.c
index fd83cdb..4db682d 100644
--- a/crypto/x509/t_x509.c
+++ b/crypto/x509/t_x509.c
@@ -266,7 +266,7 @@
   if (m != NULL) {
     OPENSSL_free(m);
   }
-  return (ret);
+  return ret;
 }
 
 int X509_ocspid_print(BIO *bp, X509 *x) {
@@ -314,12 +314,12 @@
   }
   BIO_printf(bp, "\n");
 
-  return (1);
+  return 1;
 err:
   if (der != NULL) {
     OPENSSL_free(der);
   }
-  return (0);
+  return 0;
 }
 
 int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg,
@@ -389,5 +389,5 @@
     OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
   }
   OPENSSL_free(b);
-  return (ret);
+  return ret;
 }
diff --git a/crypto/x509/x509_att.c b/crypto/x509/x509_att.c
index 0942196..d1c8f56 100644
--- a/crypto/x509/x509_att.c
+++ b/crypto/x509/x509_att.c
@@ -85,7 +85,7 @@
   X509_ATTRIBUTE *ex;
 
   if (sk == NULL) {
-    return (-1);
+    return -1;
   }
   lastpos++;
   if (lastpos < 0) {
@@ -95,10 +95,10 @@
   for (; lastpos < n; lastpos++) {
     ex = sk_X509_ATTRIBUTE_value(sk, lastpos);
     if (OBJ_cmp(ex->object, obj) == 0) {
-      return (lastpos);
+      return lastpos;
     }
   }
-  return (-1);
+  return -1;
 }
 
 X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc) {
@@ -113,10 +113,10 @@
   X509_ATTRIBUTE *ret;
 
   if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc) {
-    return (NULL);
+    return NULL;
   }
   ret = sk_X509_ATTRIBUTE_delete(x, loc);
-  return (ret);
+  return ret;
 }
 
 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
@@ -146,7 +146,7 @@
   if (*x == NULL) {
     *x = sk;
   }
-  return (sk);
+  return sk;
 err:
   OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
 err2:
@@ -156,7 +156,7 @@
   if (sk != NULL) {
     sk_X509_ATTRIBUTE_free(sk);
   }
-  return (NULL);
+  return NULL;
 }
 
 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
@@ -214,7 +214,7 @@
   obj = OBJ_nid2obj(nid);
   if (obj == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
-    return (NULL);
+    return NULL;
   }
   return X509_ATTRIBUTE_create_by_OBJ(attr, obj, attrtype, data, len);
 }
@@ -228,7 +228,7 @@
   if ((attr == NULL) || (*attr == NULL)) {
     if ((ret = X509_ATTRIBUTE_new()) == NULL) {
       OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-      return (NULL);
+      return NULL;
     }
   } else {
     ret = *attr;
@@ -244,12 +244,12 @@
   if ((attr != NULL) && (*attr == NULL)) {
     *attr = ret;
   }
-  return (ret);
+  return ret;
 err:
   if ((attr == NULL) || (ret != *attr)) {
     X509_ATTRIBUTE_free(ret);
   }
-  return (NULL);
+  return NULL;
 }
 
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
@@ -263,7 +263,7 @@
   if (obj == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
     ERR_add_error_data(2, "name=", attrname);
-    return (NULL);
+    return NULL;
   }
   nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len);
   ASN1_OBJECT_free(obj);
@@ -272,7 +272,7 @@
 
 int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj) {
   if ((attr == NULL) || (obj == NULL)) {
-    return (0);
+    return 0;
   }
   ASN1_OBJECT_free(attr->object);
   attr->object = OBJ_dup(obj);
@@ -339,9 +339,9 @@
 
 ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) {
   if (attr == NULL) {
-    return (NULL);
+    return NULL;
   }
-  return (attr->object);
+  return attr->object;
 }
 
 void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int attrtype,
diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c
index 208ce37..b98190d 100644
--- a/crypto/x509/x509_cmp.c
+++ b/crypto/x509/x509_cmp.c
@@ -79,7 +79,7 @@
   bi = b->cert_info;
   i = ASN1_INTEGER_cmp(ai->serialNumber, bi->serialNumber);
   if (i) {
-    return (i);
+    return i;
   }
   return (X509_NAME_cmp(ai->issuer, bi->issuer));
 }
@@ -101,7 +101,7 @@
 }
 
 X509_NAME *X509_get_issuer_name(const X509 *a) {
-  return (a->cert_info->issuer);
+  return a->cert_info->issuer;
 }
 
 unsigned long X509_issuer_name_hash(X509 *x) {
@@ -113,11 +113,11 @@
 }
 
 X509_NAME *X509_get_subject_name(const X509 *a) {
-  return (a->cert_info->subject);
+  return a->cert_info->subject;
 }
 
 ASN1_INTEGER *X509_get_serialNumber(X509 *a) {
-  return (a->cert_info->serialNumber);
+  return a->cert_info->serialNumber;
 }
 
 const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509) {
@@ -194,7 +194,7 @@
   ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
          ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)) &
         0xffffffffL;
-  return (ret);
+  return ret;
 }
 
 // I now DER encode the name and hash it.  Since I cache the DER encoding,
@@ -218,7 +218,7 @@
   }
   EVP_MD_CTX_cleanup(&md_ctx);
 
-  return (ret);
+  return ret;
 }
 
 // Search a stack of X509 for a match
@@ -239,10 +239,10 @@
   for (i = 0; i < sk_X509_num(sk); i++) {
     x509 = sk_X509_value(sk, i);
     if (X509_issuer_and_serial_cmp(x509, &x) == 0) {
-      return (x509);
+      return x509;
     }
   }
-  return (NULL);
+  return NULL;
 }
 
 X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name) {
@@ -252,15 +252,15 @@
   for (i = 0; i < sk_X509_num(sk); i++) {
     x509 = sk_X509_value(sk, i);
     if (X509_NAME_cmp(X509_get_subject_name(x509), name) == 0) {
-      return (x509);
+      return x509;
     }
   }
-  return (NULL);
+  return NULL;
 }
 
 EVP_PKEY *X509_get_pubkey(X509 *x) {
   if ((x == NULL) || (x->cert_info == NULL)) {
-    return (NULL);
+    return NULL;
   }
   return (X509_PUBKEY_get(x->cert_info->key));
 }
diff --git a/crypto/x509/x509_d2.c b/crypto/x509/x509_d2.c
index 3168330..da08f24 100644
--- a/crypto/x509/x509_d2.c
+++ b/crypto/x509/x509_d2.c
@@ -64,20 +64,20 @@
 
   lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
   if (lookup == NULL) {
-    return (0);
+    return 0;
   }
   X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
 
   lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
   if (lookup == NULL) {
-    return (0);
+    return 0;
   }
   X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
 
   // clear any errors
   ERR_clear_error();
 
-  return (1);
+  return 1;
 }
 
 int X509_STORE_load_locations(X509_STORE *ctx, const char *file,
@@ -87,25 +87,25 @@
   if (file != NULL) {
     lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
     if (lookup == NULL) {
-      return (0);
+      return 0;
     }
     if (X509_LOOKUP_load_file(lookup, file, X509_FILETYPE_PEM) != 1) {
-      return (0);
+      return 0;
     }
   }
   if (path != NULL) {
     lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
     if (lookup == NULL) {
-      return (0);
+      return 0;
     }
     if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1) {
-      return (0);
+      return 0;
     }
   }
   if ((path == NULL) && (file == NULL)) {
-    return (0);
+    return 0;
   }
-  return (1);
+  return 1;
 }
 
 #endif
diff --git a/crypto/x509/x509_def.c b/crypto/x509/x509_def.c
index ada9af4..a6489c6 100644
--- a/crypto/x509/x509_def.c
+++ b/crypto/x509/x509_def.c
@@ -72,16 +72,16 @@
 #define X509_CERT_DIR_EVP "SSL_CERT_DIR"
 #define X509_CERT_FILE_EVP "SSL_CERT_FILE"
 
-const char *X509_get_default_private_dir(void) { return (X509_PRIVATE_DIR); }
+const char *X509_get_default_private_dir(void) { return X509_PRIVATE_DIR; }
 
-const char *X509_get_default_cert_area(void) { return (X509_CERT_AREA); }
+const char *X509_get_default_cert_area(void) { return X509_CERT_AREA; }
 
-const char *X509_get_default_cert_dir(void) { return (X509_CERT_DIR); }
+const char *X509_get_default_cert_dir(void) { return X509_CERT_DIR; }
 
-const char *X509_get_default_cert_file(void) { return (X509_CERT_FILE); }
+const char *X509_get_default_cert_file(void) { return X509_CERT_FILE; }
 
-const char *X509_get_default_cert_dir_env(void) { return (X509_CERT_DIR_EVP); }
+const char *X509_get_default_cert_dir_env(void) { return X509_CERT_DIR_EVP; }
 
 const char *X509_get_default_cert_file_env(void) {
-  return (X509_CERT_FILE_EVP);
+  return X509_CERT_FILE_EVP;
 }
diff --git a/crypto/x509/x509_obj.c b/crypto/x509/x509_obj.c
index ab8e2d6..d247314 100644
--- a/crypto/x509/x509_obj.c
+++ b/crypto/x509/x509_obj.c
@@ -200,10 +200,10 @@
   if (i == 0) {
     *p = '\0';
   }
-  return (p);
+  return p;
 err:
   OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
 end:
   BUF_MEM_free(b);
-  return (NULL);
+  return NULL;
 }
diff --git a/crypto/x509/x509_req.c b/crypto/x509/x509_req.c
index bc8e08d..6cd250d 100644
--- a/crypto/x509/x509_req.c
+++ b/crypto/x509/x509_req.c
@@ -78,7 +78,7 @@
 
 EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req) {
   if ((req == NULL) || (req->req_info == NULL)) {
-    return (NULL);
+    return NULL;
   }
   return (X509_PUBKEY_get(req->req_info->pubkey));
 }
@@ -112,7 +112,7 @@
   }
 
   EVP_PKEY_free(xk);
-  return (ok);
+  return ok;
 }
 
 int X509_REQ_extension_nid(int req_nid) {
diff --git a/crypto/x509/x509_set.c b/crypto/x509/x509_set.c
index adc6c32..0f0c5d0 100644
--- a/crypto/x509/x509_set.c
+++ b/crypto/x509/x509_set.c
@@ -101,7 +101,7 @@
   ASN1_INTEGER *in;
 
   if (x == NULL) {
-    return (0);
+    return 0;
   }
   in = x->cert_info->serialNumber;
   if (in != serial) {
@@ -111,19 +111,19 @@
       x->cert_info->serialNumber = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 int X509_set_issuer_name(X509 *x, X509_NAME *name) {
   if ((x == NULL) || (x->cert_info == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_NAME_set(&x->cert_info->issuer, name));
 }
 
 int X509_set_subject_name(X509 *x, X509_NAME *name) {
   if ((x == NULL) || (x->cert_info == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_NAME_set(&x->cert_info->subject, name));
 }
@@ -132,7 +132,7 @@
   ASN1_TIME *in;
 
   if ((x == NULL) || (x->cert_info->validity == NULL)) {
-    return (0);
+    return 0;
   }
   in = x->cert_info->validity->notBefore;
   if (in != tm) {
@@ -142,7 +142,7 @@
       x->cert_info->validity->notBefore = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 int X509_set_notBefore(X509 *x, const ASN1_TIME *tm) {
@@ -171,7 +171,7 @@
   ASN1_TIME *in;
 
   if ((x == NULL) || (x->cert_info->validity == NULL)) {
-    return (0);
+    return 0;
   }
   in = x->cert_info->validity->notAfter;
   if (in != tm) {
@@ -181,7 +181,7 @@
       x->cert_info->validity->notAfter = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 int X509_set_notAfter(X509 *x, const ASN1_TIME *tm) {
@@ -218,7 +218,7 @@
 
 int X509_set_pubkey(X509 *x, EVP_PKEY *pkey) {
   if ((x == NULL) || (x->cert_info == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_PUBKEY_set(&(x->cert_info->key), pkey));
 }
diff --git a/crypto/x509/x509_v3.c b/crypto/x509/x509_v3.c
index e26d1ab..9209233 100644
--- a/crypto/x509/x509_v3.c
+++ b/crypto/x509/x509_v3.c
@@ -67,7 +67,7 @@
 
 int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x) {
   if (x == NULL) {
-    return (0);
+    return 0;
   }
   return (sk_X509_EXTENSION_num(x));
 }
@@ -87,7 +87,7 @@
   X509_EXTENSION *ex;
 
   if (sk == NULL) {
-    return (-1);
+    return -1;
   }
   lastpos++;
   if (lastpos < 0) {
@@ -97,10 +97,10 @@
   for (; lastpos < n; lastpos++) {
     ex = sk_X509_EXTENSION_value(sk, lastpos);
     if (OBJ_cmp(ex->object, obj) == 0) {
-      return (lastpos);
+      return lastpos;
     }
   }
-  return (-1);
+  return -1;
 }
 
 int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit,
@@ -137,10 +137,10 @@
   X509_EXTENSION *ret;
 
   if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc) {
-    return (NULL);
+    return NULL;
   }
   ret = sk_X509_EXTENSION_delete(x, loc);
-  return (ret);
+  return ret;
 }
 
 STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
@@ -178,7 +178,7 @@
   if (*x == NULL) {
     *x = sk;
   }
-  return (sk);
+  return sk;
 err:
   OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
 err2:
@@ -196,10 +196,10 @@
   obj = OBJ_nid2obj(nid);
   if (obj == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID);
-    return (NULL);
+    return NULL;
   }
   ret = X509_EXTENSION_create_by_OBJ(ex, obj, crit, data);
-  return (ret);
+  return ret;
 }
 
 X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
@@ -210,7 +210,7 @@
   if ((ex == NULL) || (*ex == NULL)) {
     if ((ret = X509_EXTENSION_new()) == NULL) {
       OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-      return (NULL);
+      return NULL;
     }
   } else {
     ret = *ex;
@@ -229,17 +229,17 @@
   if ((ex != NULL) && (*ex == NULL)) {
     *ex = ret;
   }
-  return (ret);
+  return ret;
 err:
   if ((ex == NULL) || (ret != *ex)) {
     X509_EXTENSION_free(ret);
   }
-  return (NULL);
+  return NULL;
 }
 
 int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj) {
   if ((ex == NULL) || (obj == NULL)) {
-    return (0);
+    return 0;
   }
   ASN1_OBJECT_free(ex->object);
   ex->object = OBJ_dup(obj);
@@ -248,42 +248,42 @@
 
 int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit) {
   if (ex == NULL) {
-    return (0);
+    return 0;
   }
   ex->critical = (crit) ? 0xFF : -1;
-  return (1);
+  return 1;
 }
 
 int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data) {
   int i;
 
   if (ex == NULL) {
-    return (0);
+    return 0;
   }
   i = ASN1_OCTET_STRING_set(ex->value, data->data, data->length);
   if (!i) {
-    return (0);
+    return 0;
   }
-  return (1);
+  return 1;
 }
 
 ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex) {
   if (ex == NULL) {
-    return (NULL);
+    return NULL;
   }
-  return (ex->object);
+  return ex->object;
 }
 
 ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ex) {
   if (ex == NULL) {
-    return (NULL);
+    return NULL;
   }
-  return (ex->value);
+  return ex->value;
 }
 
 int X509_EXTENSION_get_critical(const X509_EXTENSION *ex) {
   if (ex == NULL) {
-    return (0);
+    return 0;
   }
   if (ex->critical > 0) {
     return 1;
diff --git a/crypto/x509/x509cset.c b/crypto/x509/x509cset.c
index 3ff1018..6e81248 100644
--- a/crypto/x509/x509cset.c
+++ b/crypto/x509/x509cset.c
@@ -90,7 +90,7 @@
 
 int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) {
   if ((x == NULL) || (x->crl == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_NAME_set(&x->crl->issuer, name));
 }
@@ -99,7 +99,7 @@
   ASN1_TIME *in;
 
   if (x == NULL) {
-    return (0);
+    return 0;
   }
   in = x->crl->lastUpdate;
   if (in != tm) {
@@ -109,14 +109,14 @@
       x->crl->lastUpdate = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) {
   ASN1_TIME *in;
 
   if (x == NULL) {
-    return (0);
+    return 0;
   }
   in = x->crl->nextUpdate;
   if (in != tm) {
@@ -126,7 +126,7 @@
       x->crl->nextUpdate = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 int X509_CRL_sort(X509_CRL *c) {
@@ -194,7 +194,7 @@
   ASN1_TIME *in;
 
   if (revoked == NULL) {
-    return (0);
+    return 0;
   }
   in = revoked->revocationDate;
   if (in != tm) {
@@ -204,7 +204,7 @@
       revoked->revocationDate = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(
@@ -217,7 +217,7 @@
   ASN1_INTEGER *in;
 
   if (revoked == NULL) {
-    return (0);
+    return 0;
   }
   in = revoked->serialNumber;
   if (in != serial) {
@@ -227,7 +227,7 @@
       revoked->serialNumber = in;
     }
   }
-  return (in != NULL);
+  return in != NULL;
 }
 
 const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(
diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c
index 4087218..6771b68 100644
--- a/crypto/x509/x509name.c
+++ b/crypto/x509/x509name.c
@@ -73,7 +73,7 @@
 
   obj = OBJ_nid2obj(nid);
   if (obj == NULL) {
-    return (-1);
+    return -1;
   }
   return (X509_NAME_get_text_by_OBJ(name, obj, buf, len));
 }
@@ -85,21 +85,21 @@
 
   i = X509_NAME_get_index_by_OBJ(name, obj, -1);
   if (i < 0) {
-    return (-1);
+    return -1;
   }
   data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
   i = (data->length > (len - 1)) ? (len - 1) : data->length;
   if (buf == NULL) {
-    return (data->length);
+    return data->length;
   }
   OPENSSL_memcpy(buf, data->data, i);
   buf[i] = '\0';
-  return (i);
+  return i;
 }
 
 int X509_NAME_entry_count(const X509_NAME *name) {
   if (name == NULL) {
-    return (0);
+    return 0;
   }
   return (sk_X509_NAME_ENTRY_num(name->entries));
 }
@@ -109,7 +109,7 @@
 
   obj = OBJ_nid2obj(nid);
   if (obj == NULL) {
-    return (-2);
+    return -2;
   }
   return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
 }
@@ -122,7 +122,7 @@
   STACK_OF(X509_NAME_ENTRY) *sk;
 
   if (name == NULL) {
-    return (-1);
+    return -1;
   }
   if (lastpos < 0) {
     lastpos = -1;
@@ -132,16 +132,16 @@
   for (lastpos++; lastpos < n; lastpos++) {
     ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
     if (OBJ_cmp(ne->object, obj) == 0) {
-      return (lastpos);
+      return lastpos;
     }
   }
-  return (-1);
+  return -1;
 }
 
 X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc) {
   if (name == NULL || loc < 0 ||
       sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) {
-    return (NULL);
+    return NULL;
   } else {
     return (sk_X509_NAME_ENTRY_value(name->entries, loc));
   }
@@ -154,14 +154,14 @@
 
   if (name == NULL || loc < 0 ||
       sk_X509_NAME_ENTRY_num(name->entries) <= (size_t)loc) {
-    return (NULL);
+    return NULL;
   }
   sk = name->entries;
   ret = sk_X509_NAME_ENTRY_delete(sk, loc);
   n = sk_X509_NAME_ENTRY_num(sk);
   name->modified = 1;
   if (loc == n) {
-    return (ret);
+    return ret;
   }
 
   // else we need to fixup the set field
@@ -180,7 +180,7 @@
       sk_X509_NAME_ENTRY_value(sk, i)->set--;
     }
   }
-  return (ret);
+  return ret;
 }
 
 int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
@@ -234,7 +234,7 @@
   STACK_OF(X509_NAME_ENTRY) *sk;
 
   if (name == NULL) {
-    return (0);
+    return 0;
   }
   sk = name->entries;
   n = sk_X509_NAME_ENTRY_num(sk);
@@ -281,12 +281,12 @@
       sk_X509_NAME_ENTRY_value(sk, i)->set += 1;
     }
   }
-  return (1);
+  return 1;
 err:
   if (new_name != NULL) {
     X509_NAME_ENTRY_free(new_name);
   }
-  return (0);
+  return 0;
 }
 
 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
@@ -300,7 +300,7 @@
   if (obj == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_NAME);
     ERR_add_error_data(2, "name=", field);
-    return (NULL);
+    return NULL;
   }
   nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
   ASN1_OBJECT_free(obj);
@@ -327,7 +327,7 @@
 
   if ((ne == NULL) || (*ne == NULL)) {
     if ((ret = X509_NAME_ENTRY_new()) == NULL) {
-      return (NULL);
+      return NULL;
     }
   } else {
     ret = *ne;
@@ -343,18 +343,18 @@
   if ((ne != NULL) && (*ne == NULL)) {
     *ne = ret;
   }
-  return (ret);
+  return ret;
 err:
   if ((ne == NULL) || (ret != *ne)) {
     X509_NAME_ENTRY_free(ret);
   }
-  return (NULL);
+  return NULL;
 }
 
 int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj) {
   if ((ne == NULL) || (obj == NULL)) {
     OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
-    return (0);
+    return 0;
   }
   ASN1_OBJECT_free(ne->object);
   ne->object = OBJ_dup(obj);
@@ -366,7 +366,7 @@
   int i;
 
   if ((ne == NULL) || ((bytes == NULL) && (len != 0))) {
-    return (0);
+    return 0;
   }
   if ((type > 0) && (type & MBSTRING_FLAG)) {
     return ASN1_STRING_set_by_NID(&ne->value, bytes, len, type,
@@ -379,24 +379,24 @@
   }
   i = ASN1_STRING_set(ne->value, bytes, len);
   if (!i) {
-    return (0);
+    return 0;
   }
   if (type != V_ASN1_UNDEF) {
     ne->value->type = type;
   }
-  return (1);
+  return 1;
 }
 
 ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne) {
   if (ne == NULL) {
-    return (NULL);
+    return NULL;
   }
-  return (ne->object);
+  return ne->object;
 }
 
 ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne) {
   if (ne == NULL) {
-    return (NULL);
+    return NULL;
   }
-  return (ne->value);
+  return ne->value;
 }
diff --git a/crypto/x509/x509rset.c b/crypto/x509/x509rset.c
index 7e4e083..4c6181e 100644
--- a/crypto/x509/x509rset.c
+++ b/crypto/x509/x509rset.c
@@ -75,14 +75,14 @@
 
 int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name) {
   if ((x == NULL) || (x->req_info == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_NAME_set(&x->req_info->subject, name));
 }
 
 int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey) {
   if ((x == NULL) || (x->req_info == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_PUBKEY_set(&x->req_info->pubkey, pkey));
 }
diff --git a/crypto/x509/x509spki.c b/crypto/x509/x509spki.c
index d819a5c..8251534 100644
--- a/crypto/x509/x509spki.c
+++ b/crypto/x509/x509spki.c
@@ -63,14 +63,14 @@
 
 int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey) {
   if ((x == NULL) || (x->spkac == NULL)) {
-    return (0);
+    return 0;
   }
   return (X509_PUBKEY_set(&(x->spkac->pubkey), pkey));
 }
 
 EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x) {
   if ((x == NULL) || (x->spkac == NULL)) {
-    return (NULL);
+    return NULL;
   }
   return (X509_PUBKEY_get(x->spkac->pubkey));
 }
diff --git a/crypto/x509/x_info.c b/crypto/x509/x_info.c
index 420bc19..e6f9be2 100644
--- a/crypto/x509/x_info.c
+++ b/crypto/x509/x_info.c
@@ -67,7 +67,7 @@
   ret = (X509_INFO *)OPENSSL_malloc(sizeof(X509_INFO));
   if (ret == NULL) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
-    return (NULL);
+    return NULL;
   }
 
   ret->enc_cipher.cipher = NULL;
@@ -77,7 +77,7 @@
   ret->x509 = NULL;
   ret->crl = NULL;
   ret->x_pkey = NULL;
-  return (ret);
+  return ret;
 }
 
 void X509_INFO_free(X509_INFO *x) {
diff --git a/crypto/x509/x_pubkey.c b/crypto/x509/x_pubkey.c
index d56e6fe..6a1dece 100644
--- a/crypto/x509/x_pubkey.c
+++ b/crypto/x509/x_pubkey.c
@@ -93,7 +93,7 @@
   size_t spki_len;
 
   if (x == NULL) {
-    return (0);
+    return 0;
   }
 
   CBB cbb;
