diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c
index ea984c5..3a314f1 100644
--- a/crypto/asn1/a_utctm.c
+++ b/crypto/asn1/a_utctm.c
@@ -64,121 +64,114 @@
 
 #include "internal.h"
 
-int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d)
-{
-    if (d->type != V_ASN1_UTCTIME) {
-        return 0;
-    }
-    CBS cbs;
-    CBS_init(&cbs, d->data, (size_t)d->length);
-    if (!CBS_parse_utc_time(&cbs, tm, /*allow_timezone_offset=*/1)) {
-        return 0;
-    }
-    return 1;
-}
-
-int ASN1_UTCTIME_check(const ASN1_UTCTIME *d)
-{
-    return asn1_utctime_to_tm(NULL, d);
-}
-
-int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str)
-{
-    ASN1_UTCTIME t;
-
-    t.type = V_ASN1_UTCTIME;
-    t.length = strlen(str);
-    t.data = (unsigned char *)str;
-    if (ASN1_UTCTIME_check(&t)) {
-        if (s != NULL) {
-            if (!ASN1_STRING_set((ASN1_STRING *)s,
-                                 (unsigned char *)str, t.length))
-                return 0;
-            s->type = V_ASN1_UTCTIME;
-        }
-        return (1);
-    } else
-        return (0);
-}
-
-ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
-{
-    return ASN1_UTCTIME_adj(s, t, 0, 0);
-}
-
-ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
-                               int offset_day, long offset_sec)
-{
-    char *p;
-    struct tm *ts;
-    struct tm data;
-    size_t len = 20;
-    int free_s = 0;
-
-    if (s == NULL) {
-        free_s = 1;
-        s = ASN1_UTCTIME_new();
-    }
-    if (s == NULL)
-        goto err;
-
-    ts = OPENSSL_gmtime(&t, &data);
-    if (ts == NULL)
-        goto err;
-
-    if (offset_day || offset_sec) {
-        if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
-            goto err;
-    }
-
-    if ((ts->tm_year < 50) || (ts->tm_year >= 150))
-        goto err;
-
-    p = (char *)s->data;
-    if ((p == NULL) || ((size_t)s->length < len)) {
-        p = OPENSSL_malloc(len);
-        if (p == NULL) {
-            OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
-            goto err;
-        }
-        if (s->data != NULL)
-            OPENSSL_free(s->data);
-        s->data = (unsigned char *)p;
-    }
-
-    BIO_snprintf(p, len, "%02d%02d%02d%02d%02d%02dZ", ts->tm_year % 100,
-                 ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
-                 ts->tm_sec);
-    s->length = strlen(p);
-    s->type = V_ASN1_UTCTIME;
-    return (s);
- err:
-    if (free_s && s)
-        ASN1_UTCTIME_free(s);
-    return NULL;
-}
-
-int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
-{
-    struct tm stm, ttm;
-    int day, sec;
-
-    if (!asn1_utctime_to_tm(&stm, s))
-        return -2;
-
-    if (!OPENSSL_gmtime(&t, &ttm))
-        return -2;
-
-    if (!OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm))
-        return -2;
-
-    if (day > 0)
-        return 1;
-    if (day < 0)
-        return -1;
-    if (sec > 0)
-        return 1;
-    if (sec < 0)
-        return -1;
+int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d) {
+  if (d->type != V_ASN1_UTCTIME) {
     return 0;
+  }
+  CBS cbs;
+  CBS_init(&cbs, d->data, (size_t)d->length);
+  if (!CBS_parse_utc_time(&cbs, tm, /*allow_timezone_offset=*/1)) {
+    return 0;
+  }
+  return 1;
+}
+
+int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) {
+  return asn1_utctime_to_tm(NULL, d);
+}
+
+int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) {
+  ASN1_UTCTIME t;
+
+  t.type = V_ASN1_UTCTIME;
+  t.length = strlen(str);
+  t.data = (unsigned char *)str;
+  if (ASN1_UTCTIME_check(&t)) {
+    if (s != NULL) {
+      if (!ASN1_STRING_set((ASN1_STRING *)s, (unsigned char *)str, t.length))
+        return 0;
+      s->type = V_ASN1_UTCTIME;
+    }
+    return (1);
+  } else
+    return (0);
+}
+
+ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t) {
+  return ASN1_UTCTIME_adj(s, t, 0, 0);
+}
+
+ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day,
+                               long offset_sec) {
+  char *p;
+  struct tm *ts;
+  struct tm data;
+  size_t len = 20;
+  int free_s = 0;
+
+  if (s == NULL) {
+    free_s = 1;
+    s = ASN1_UTCTIME_new();
+  }
+  if (s == NULL)
+    goto err;
+
+  ts = OPENSSL_gmtime(&t, &data);
+  if (ts == NULL)
+    goto err;
+
+  if (offset_day || offset_sec) {
+    if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
+      goto err;
+  }
+
+  if ((ts->tm_year < 50) || (ts->tm_year >= 150))
+    goto err;
+
+  p = (char *)s->data;
+  if ((p == NULL) || ((size_t)s->length < len)) {
+    p = OPENSSL_malloc(len);
+    if (p == NULL) {
+      OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
+      goto err;
+    }
+    if (s->data != NULL)
+      OPENSSL_free(s->data);
+    s->data = (unsigned char *)p;
+  }
+
+  BIO_snprintf(p, len, "%02d%02d%02d%02d%02d%02dZ", ts->tm_year % 100,
+               ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
+               ts->tm_sec);
+  s->length = strlen(p);
+  s->type = V_ASN1_UTCTIME;
+  return (s);
+err:
+  if (free_s && s)
+    ASN1_UTCTIME_free(s);
+  return NULL;
+}
+
+int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) {
+  struct tm stm, ttm;
+  int day, sec;
+
+  if (!asn1_utctime_to_tm(&stm, s))
+    return -2;
+
+  if (!OPENSSL_gmtime(&t, &ttm))
+    return -2;
+
+  if (!OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm))
+    return -2;
+
+  if (day > 0)
+    return 1;
+  if (day < 0)
+    return -1;
+  if (sec > 0)
+    return 1;
+  if (sec < 0)
+    return -1;
+  return 0;
 }
