diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c
index 5b97efa..8ef0d12 100644
--- a/crypto/asn1/a_bitstr.c
+++ b/crypto/asn1/a_bitstr.c
@@ -164,19 +164,17 @@
     goto err;
   }
 
-  /* Unused bits in a BIT STRING must be zero. */
+  // Unused bits in a BIT STRING must be zero.
   uint8_t padding_mask = (1 << padding) - 1;
   if (padding != 0 && (len < 1 || (p[len - 1] & padding_mask) != 0)) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_PADDING);
     goto err;
   }
 
-  /*
-   * We do this to preserve the settings.  If we modify the settings, via
-   * the _set_bit function, we will recalculate on output
-   */
-  ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);   /* clear */
-  ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding); /* set */
+  // We do this to preserve the settings.  If we modify the settings, via
+  // the _set_bit function, we will recalculate on output
+  ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);    // clear
+  ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding);  // set
 
   if (len > 0) {
     s = OPENSSL_memdup(p, len);
@@ -205,9 +203,7 @@
   return (NULL);
 }
 
-/*
- * These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
- */
+// These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
 int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) {
   int w, v, iv;
   unsigned char *c;
@@ -223,11 +219,11 @@
     return 0;
   }
 
-  a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear, set on write */
+  a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);  // clear, set on write
 
   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);
@@ -262,27 +258,23 @@
   return ((a->data[w] & v) != 0);
 }
 
-/*
- * Checks if the given bit string contains only bits specified by
- * the flags vector. Returns 0 if there is at least one bit set in 'a'
- * which is not specified in 'flags', 1 otherwise.
- * 'len' is the length of 'flags'.
- */
+// Checks if the given bit string contains only bits specified by
+// the flags vector. Returns 0 if there is at least one bit set in 'a'
+// which is not specified in 'flags', 1 otherwise.
+// 'len' is the length of 'flags'.
 int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, const unsigned char *flags,
                           int flags_len) {
   int i, ok;
-  /* Check if there is one bit set at all. */
+  // Check if there is one bit set at all.
   if (!a || !a->data) {
     return 1;
   }
 
-  /*
-   * Check each byte of the internal representation of the bit string.
-   */
+  // Check each byte of the internal representation of the bit string.
   ok = 1;
   for (i = 0; i < a->length && ok; ++i) {
     unsigned char mask = i < flags_len ? ~flags[i] : 0xff;
-    /* We are done if there is an unneeded bit set. */
+    // We are done if there is an unneeded bit set.
     ok = (a->data[i] & mask) == 0;
   }
   return ok;
diff --git a/crypto/asn1/a_bool.c b/crypto/asn1/a_bool.c
index daf96fc..e4703c6 100644
--- a/crypto/asn1/a_bool.c
+++ b/crypto/asn1/a_bool.c
@@ -80,10 +80,8 @@
   ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL);
   *p = a ? 0xff : 0x00;
 
-  /*
-   * If a new buffer was allocated, just return it back.
-   * If not, return the incremented buffer pointer.
-   */
+  // If a new buffer was allocated, just return it back.
+  // If not, return the incremented buffer pointer.
   *pp = allocated != NULL ? allocated : p + 1;
   return r;
 }
diff --git a/crypto/asn1/a_dup.c b/crypto/asn1/a_dup.c
index 5434b78..402584c 100644
--- a/crypto/asn1/a_dup.c
+++ b/crypto/asn1/a_dup.c
@@ -59,12 +59,10 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
-/*
- * ASN1_ITEM version of dup: this follows the model above except we don't
- * need to allocate the buffer. At some point this could be rewritten to
- * directly dup the underlying structure instead of doing and encode and
- * decode.
- */
+// ASN1_ITEM version of dup: this follows the model above except we don't
+// need to allocate the buffer. At some point this could be rewritten to
+// directly dup the underlying structure instead of doing and encode and
+// decode.
 void *ASN1_item_dup(const ASN1_ITEM *it, void *x) {
   unsigned char *b = NULL;
   const unsigned char *p;
diff --git a/crypto/asn1/a_int.c b/crypto/asn1/a_int.c
index 1da9889..a13576a 100644
--- a/crypto/asn1/a_int.c
+++ b/crypto/asn1/a_int.c
@@ -72,7 +72,7 @@
 }
 
 int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y) {
-  /* Compare signs. */
+  // Compare signs.
   int neg = x->type & V_ASN1_NEG;
   if (neg != (y->type & V_ASN1_NEG)) {
     return neg ? -1 : 1;
@@ -80,8 +80,8 @@
 
   int ret = ASN1_STRING_cmp(x, y);
   if (neg) {
-    /* This could be |-ret|, but |ASN1_STRING_cmp| is not forbidden from
-     * returning |INT_MIN|. */
+    // This could be |-ret|, but |ASN1_STRING_cmp| is not forbidden from
+    // returning |INT_MIN|.
     if (ret < 0) {
       return 1;
     } else if (ret > 0) {
@@ -94,8 +94,8 @@
   return ret;
 }
 
-/* negate_twos_complement negates |len| bytes from |buf| in-place, interpreted
- * as a signed, big-endian two's complement value. */
+// negate_twos_complement negates |len| bytes from |buf| in-place, interpreted
+// as a signed, big-endian two's complement value.
 static void negate_twos_complement(uint8_t *buf, size_t len) {
   uint8_t borrow = 0;
   for (size_t i = len - 1; i < len; i--) {
@@ -119,9 +119,9 @@
     return 0;
   }
 
-  /* |ASN1_INTEGER|s should be represented minimally, but it is possible to
-   * construct invalid ones. Skip leading zeros so this does not produce an
-   * invalid encoding or break invariants. */
+  // |ASN1_INTEGER|s should be represented minimally, but it is possible to
+  // construct invalid ones. Skip leading zeros so this does not produce an
+  // invalid encoding or break invariants.
   int start = 0;
   while (start < in->length && in->data[start] == 0) {
     start++;
@@ -130,20 +130,20 @@
   int is_negative = (in->type & V_ASN1_NEG) != 0;
   int pad;
   if (start >= in->length) {
-    /* Zero is represented as a single byte. */
+    // Zero is represented as a single byte.
     is_negative = 0;
     pad = 1;
   } else if (is_negative) {
-    /* 0x80...01 through 0xff...ff have a two's complement of 0x7f...ff
-     * through 0x00...01 and need an extra byte to be negative.
-     * 0x01...00 through 0x80...00 have a two's complement of 0xfe...ff
-     * through 0x80...00 and can be negated as-is. */
+    // 0x80...01 through 0xff...ff have a two's complement of 0x7f...ff
+    // through 0x00...01 and need an extra byte to be negative.
+    // 0x01...00 through 0x80...00 have a two's complement of 0xfe...ff
+    // through 0x80...00 and can be negated as-is.
     pad = in->data[start] > 0x80 ||
           (in->data[start] == 0x80 &&
            !is_all_zeros(in->data + start + 1, in->length - start - 1));
   } else {
-    /* If the high bit is set, the signed representation needs an extra
-     * byte to be positive. */
+    // If the high bit is set, the signed representation needs an extra
+    // byte to be positive.
     pad = (in->data[start] & 0x80) != 0;
   }
 
@@ -173,11 +173,9 @@
 
 ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **out, const unsigned char **inp,
                                long len) {
-  /*
-   * This function can handle lengths up to INT_MAX - 1, but the rest of the
-   * legacy ASN.1 code mixes integer types, so avoid exposing it to
-   * ASN1_INTEGERS with larger lengths.
-   */
+  // This function can handle lengths up to INT_MAX - 1, but the rest of the
+  // legacy ASN.1 code mixes integer types, so avoid exposing it to
+  // ASN1_INTEGERS with larger lengths.
   if (len < 0 || len > INT_MAX / 2) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG);
     return NULL;
@@ -201,19 +199,19 @@
     ret = *out;
   }
 
-  /* Convert to |ASN1_INTEGER|'s sign-and-magnitude representation. First,
-   * determine the size needed for a minimal result. */
+  // Convert to |ASN1_INTEGER|'s sign-and-magnitude representation. First,
+  // determine the size needed for a minimal result.
   if (is_negative) {
-    /* 0xff00...01 through 0xff7f..ff have a two's complement of 0x00ff...ff
-     * through 0x000100...001 and need one leading zero removed. 0x8000...00
-     * through 0xff00...00 have a two's complement of 0x8000...00 through
-     * 0x0100...00 and will be minimally-encoded as-is. */
+    // 0xff00...01 through 0xff7f..ff have a two's complement of 0x00ff...ff
+    // through 0x000100...001 and need one leading zero removed. 0x8000...00
+    // through 0xff00...00 have a two's complement of 0x8000...00 through
+    // 0x0100...00 and will be minimally-encoded as-is.
     if (CBS_len(&cbs) > 0 && CBS_data(&cbs)[0] == 0xff &&
         !is_all_zeros(CBS_data(&cbs) + 1, CBS_len(&cbs) - 1)) {
       CBS_skip(&cbs, 1);
     }
   } else {
-    /* Remove the leading zero byte, if any. */
+    // Remove the leading zero byte, if any.
     if (CBS_len(&cbs) > 0 && CBS_data(&cbs)[0] == 0x00) {
       CBS_skip(&cbs, 1);
     }
@@ -230,9 +228,9 @@
     ret->type = V_ASN1_INTEGER;
   }
 
-  /* The value should be minimally-encoded. */
+  // The value should be minimally-encoded.
   assert(ret->length == 0 || ret->data[0] != 0);
-  /* Zero is not negative. */
+  // Zero is not negative.
   assert(!is_negative || ret->length > 0);
 
   *inp += len;
@@ -347,7 +345,7 @@
 
   int64_t i64;
   int fits_in_i64;
-  /* Check |v != 0| to handle manually-constructed negative zeros. */
+  // Check |v != 0| to handle manually-constructed negative zeros.
   if ((a->type & V_ASN1_NEG) && v != 0) {
     i64 = (int64_t)(0u - v);
     fits_in_i64 = i64 < 0;
@@ -362,7 +360,7 @@
   }
 
 err:
-  /* This function's return value does not distinguish overflow from -1. */
+  // This function's return value does not distinguish overflow from -1.
   ERR_clear_error();
   return -1;
 }
diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c
index fd5562c..c53d6d5 100644
--- a/crypto/asn1/a_mbstr.c
+++ b/crypto/asn1/a_mbstr.c
@@ -66,14 +66,12 @@
 #include "../bytestring/internal.h"
 #include "internal.h"
 
-/*
- * These functions take a string in UTF8, ASCII or multibyte form and a mask
- * of permissible ASN1 string types. It then works out the minimal type
- * (using the order Printable < IA5 < T61 < BMP < Universal < UTF8) and
- * creates a string of the correct type with the supplied data. Yes this is
- * horrible: it has to be :-( The 'ncopy' form checks minimum and maximum
- * size limits too.
- */
+// These functions take a string in UTF8, ASCII or multibyte form and a mask
+// of permissible ASN1 string types. It then works out the minimal type
+// (using the order Printable < IA5 < T61 < BMP < Universal < UTF8) and
+// creates a string of the correct type with the supplied data. Yes this is
+// horrible: it has to be :-( The 'ncopy' form checks minimum and maximum
+// size limits too.
 
 int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len,
                        int inform, unsigned long mask) {
@@ -127,7 +125,7 @@
       return -1;
   }
 
-  /* Check |minsize| and |maxsize| and work out the minimal type, if any. */
+  // Check |minsize| and |maxsize| and work out the minimal type, if any.
   CBS cbs;
   CBS_init(&cbs, in, len);
   size_t utf8_len = 0;
@@ -139,17 +137,17 @@
     }
     if (nchar == 0 && (inform == MBSTRING_BMP || inform == MBSTRING_UNIV) &&
         c == 0xfeff) {
-      /* Reject byte-order mark. We could drop it but that would mean
-       * adding ambiguity around whether a BOM was included or not when
-       * matching strings.
-       *
-       * For a little-endian UCS-2 string, the BOM will appear as 0xfffe
-       * and will be rejected as noncharacter, below. */
+      // Reject byte-order mark. We could drop it but that would mean
+      // adding ambiguity around whether a BOM was included or not when
+      // matching strings.
+      //
+      // For a little-endian UCS-2 string, the BOM will appear as 0xfffe
+      // and will be rejected as noncharacter, below.
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_CHARACTERS);
       return -1;
     }
 
-    /* Update which output formats are still possible. */
+    // Update which output formats are still possible.
     if ((mask & B_ASN1_PRINTABLESTRING) && !asn1_is_printable(c)) {
       mask &= ~B_ASN1_PRINTABLESTRING;
     }
@@ -185,7 +183,7 @@
     return -1;
   }
 
-  /* Now work out output format and string type */
+  // Now work out output format and string type
   int (*encode_func)(CBB *, uint32_t) = cbb_add_latin1;
   size_t size_estimate = nchar;
   int outform = MBSTRING_ASC;
@@ -237,7 +235,7 @@
     *out = dest;
   }
 
-  /* If both the same type just copy across */
+  // If both the same type just copy across
   if (inform == outform) {
     if (!ASN1_STRING_set(dest, in, len)) {
       OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
@@ -261,8 +259,8 @@
   }
   uint8_t *data = NULL;
   size_t data_len;
-  if (/* OpenSSL historically NUL-terminated this value with a single byte,
-       * even for |MBSTRING_BMP| and |MBSTRING_UNIV|. */
+  if (// OpenSSL historically NUL-terminated this value with a single byte,
+      // even for |MBSTRING_BMP| and |MBSTRING_UNIV|.
       !CBB_add_u8(&cbb, 0) || !CBB_finish(&cbb, &data, &data_len) ||
       data_len < 1 || data_len > INT_MAX) {
     OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
@@ -285,7 +283,7 @@
   if (value > 0x7f) {
     return 0;
   }
-  /* Note we cannot use |isalnum| because it is locale-dependent. */
+  // Note we cannot use |isalnum| because it is locale-dependent.
   return ('a' <= value && value <= 'z') ||  //
          ('A' <= value && value <= 'Z') ||  //
          ('0' <= value && value <= '9') ||  //
diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c
index e157d90..186ee67 100644
--- a/crypto/asn1/a_object.c
+++ b/crypto/asn1/a_object.c
@@ -96,10 +96,8 @@
   ASN1_put_object(&p, 0, a->length, V_ASN1_OBJECT, V_ASN1_UNIVERSAL);
   OPENSSL_memcpy(p, a->data, a->length);
 
-  /*
-   * If a new buffer was allocated, just return it back.
-   * If not, return the incremented buffer pointer.
-   */
+  // If a new buffer was allocated, just return it back.
+  // If not, return the incremented buffer pointer.
   *pp = allocated != NULL ? allocated : p + a->length;
   return objsize;
 }
@@ -122,7 +120,7 @@
   const char *str = buf;
   int len = i2t_ASN1_OBJECT(buf, sizeof(buf), a);
   if (len > (int)sizeof(buf) - 1) {
-    /* The input was truncated. Allocate a buffer that fits. */
+    // The input was truncated. Allocate a buffer that fits.
     allocated = OPENSSL_malloc(len + 1);
     if (allocated == NULL) {
       return -1;
@@ -173,17 +171,15 @@
   unsigned char *data;
   int i, length;
 
-  /*
-   * Sanity check OID encoding. Need at least one content octet. MSB must
-   * be clear in the last octet. can't have leading 0x80 in subidentifiers,
-   * see: X.690 8.19.2
-   */
+  // Sanity check OID encoding. Need at least one content octet. MSB must
+  // be clear in the last octet. can't have leading 0x80 in subidentifiers,
+  // see: X.690 8.19.2
   if (len <= 0 || len > INT_MAX || pp == NULL || (p = *pp) == NULL ||
       p[len - 1] & 0x80) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING);
     return NULL;
   }
-  /* Now 0 < len <= INT_MAX, so the cast is safe. */
+  // Now 0 < len <= INT_MAX, so the cast is safe.
   length = (int)len;
   for (i = 0; i < length; i++, p++) {
     if (*p == 0x80 && (!i || !(p[-1] & 0x80))) {
@@ -202,10 +198,10 @@
   }
 
   p = *pp;
-  /* detach data from object */
+  // detach data from object
   data = (unsigned char *)ret->data;
   ret->data = NULL;
-  /* once detached we can change it */
+  // once detached we can change it
   if ((data == NULL) || (ret->length < length)) {
     ret->length = 0;
     if (data != NULL) {
@@ -219,13 +215,13 @@
     ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
   }
   OPENSSL_memcpy(data, p, length);
-  /* If there are dynamic strings, free them here, and clear the flag */
+  // If there are dynamic strings, free them here, and clear the flag
   if ((ret->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) != 0) {
     OPENSSL_free((char *)ret->sn);
     OPENSSL_free((char *)ret->ln);
     ret->flags &= ~ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
   }
-  /* reattach data to object, after which it remains const */
+  // reattach data to object, after which it remains const
   ret->data = data;
   ret->length = length;
   ret->sn = NULL;
diff --git a/crypto/asn1/a_print.c b/crypto/asn1/a_print.c
index 3cd150f..a5be164 100644
--- a/crypto/asn1/a_print.c
+++ b/crypto/asn1/a_print.c
@@ -70,7 +70,7 @@
   for (int i = 0; i < len; i++) {
     unsigned char c = s[i];
     if (c & 0x80) {
-      /* No need to continue iterating. */
+      // No need to continue iterating.
       return V_ASN1_T61STRING;
     }
     if (!asn1_is_printable(c)) {
diff --git a/crypto/asn1/a_strex.c b/crypto/asn1/a_strex.c
index d855b04..3906bc9 100644
--- a/crypto/asn1/a_strex.c
+++ b/crypto/asn1/a_strex.c
@@ -72,7 +72,7 @@
    ASN1_STRFLGS_ESC_MSB)
 
 static int maybe_write(BIO *out, const void *buf, int len) {
-  /* If |out| is NULL, ignore the output but report the length. */
+  // If |out| is NULL, ignore the output but report the length.
   return out == NULL || BIO_write(out, buf, len) == len;
 }
 
@@ -80,9 +80,9 @@
 
 static int do_esc_char(uint32_t c, unsigned long flags, char *do_quotes,
                        BIO *out, int is_first, int is_last) {
-  /* |c| is a |uint32_t| because, depending on |ASN1_STRFLGS_UTF8_CONVERT|,
-   * we may be escaping bytes or Unicode codepoints. */
-  char buf[16]; /* Large enough for "\\W01234567". */
+  // |c| is a |uint32_t| because, depending on |ASN1_STRFLGS_UTF8_CONVERT|,
+  // we may be escaping bytes or Unicode codepoints.
+  char buf[16];  // Large enough for "\\W01234567".
   unsigned char u8 = (unsigned char)c;
   if (c > 0xffff) {
     BIO_snprintf(buf, sizeof(buf), "\\W%08" PRIX32, c);
@@ -93,15 +93,15 @@
   } else if ((flags & ASN1_STRFLGS_ESC_CTRL) && is_control_character(c)) {
     BIO_snprintf(buf, sizeof(buf), "\\%02X", c);
   } else if (flags & ASN1_STRFLGS_ESC_2253) {
-    /* See RFC 2253, sections 2.4 and 4. */
+    // See RFC 2253, sections 2.4 and 4.
     if (c == '\\' || c == '"') {
-      /* Quotes and backslashes are always escaped, quoted or not. */
+      // Quotes and backslashes are always escaped, quoted or not.
       BIO_snprintf(buf, sizeof(buf), "\\%c", (int)c);
     } else if (c == ',' || c == '+' || c == '<' || c == '>' || c == ';' ||
                (is_first && (c == ' ' || c == '#')) ||
                (is_last && (c == ' '))) {
       if (flags & ASN1_STRFLGS_ESC_QUOTE) {
-        /* No need to escape, just tell the caller to quote. */
+        // No need to escape, just tell the caller to quote.
         if (do_quotes != NULL) {
           *do_quotes = 1;
         }
@@ -112,7 +112,7 @@
       return maybe_write(out, &u8, 1) ? 1 : -1;
     }
   } else if ((flags & ESC_FLAGS) && c == '\\') {
-    /* If any escape flags are set, also escape backslashes. */
+    // If any escape flags are set, also escape backslashes.
     BIO_snprintf(buf, sizeof(buf), "\\%c", (int)c);
   } else {
     return maybe_write(out, &u8, 1) ? 1 : -1;
@@ -122,16 +122,14 @@
   return maybe_write(out, buf, len) ? len : -1;
 }
 
-/*
- * This function sends each character in a buffer to do_esc_char(). It
- * interprets the content formats and converts to or from UTF8 as
- * appropriate.
- */
+// This function sends each character in a buffer to do_esc_char(). It
+// interprets the content formats and converts to or from UTF8 as
+// appropriate.
 
 static int do_buf(const unsigned char *buf, int buflen, int encoding,
                   int utf8_convert, unsigned long flags, char *quotes,
                   BIO *out) {
-  /* Reject invalid UCS-4 and UCS-2 lengths without parsing. */
+  // Reject invalid UCS-4 and UCS-2 lengths without parsing.
   switch (encoding) {
     case MBSTRING_UNIV:
       if (buflen & 3) {
@@ -152,10 +150,10 @@
   int outlen = 0;
   while (p != q) {
     const int is_first = p == buf;
-    /* TODO(davidben): Replace this with |cbs_get_ucs2_be|, etc., to check
-     * for invalid codepoints. Before doing that, enforce it in the parser,
-     * https://crbug.com/boringssl/427, so these error cases are not
-     * reachable from parsed objects. */
+    // TODO(davidben): Replace this with |cbs_get_ucs2_be|, etc., to check
+    // for invalid codepoints. Before doing that, enforce it in the parser,
+    // https://crbug.com/boringssl/427, so these error cases are not
+    // reachable from parsed objects.
     uint32_t c;
     switch (encoding) {
       case MBSTRING_UNIV:
@@ -177,7 +175,7 @@
       case MBSTRING_UTF8: {
         int consumed = UTF8_getc(p, buflen, &c);
         if (consumed < 0) {
-          return -1; /* Invalid UTF8String */
+          return -1;  // Invalid UTF8String
         }
         buflen -= consumed;
         p += consumed;
@@ -194,12 +192,10 @@
       int utflen;
       utflen = UTF8_putc(utfbuf, sizeof utfbuf, c);
       for (int i = 0; i < utflen; i++) {
-        /*
-         * We don't need to worry about setting orflags correctly
-         * because if utflen==1 its value will be correct anyway
-         * otherwise each character will be > 0x7f and so the
-         * character will never be escaped on first and last.
-         */
+        // We don't need to worry about setting orflags correctly
+        // because if utflen==1 its value will be correct anyway
+        // otherwise each character will be > 0x7f and so the
+        // character will never be escaped on first and last.
         int len = do_esc_char(utfbuf[i], flags, quotes, out, is_first, is_last);
         if (len < 0) {
           return -1;
@@ -217,7 +213,7 @@
   return outlen;
 }
 
-/* This function hex dumps a buffer of characters */
+// This function hex dumps a buffer of characters
 
 static int do_hex_dump(BIO *out, unsigned char *buf, int buflen) {
   static const char hexdig[] = "0123456789ABCDEF";
@@ -238,18 +234,16 @@
   return buflen << 1;
 }
 
-/*
- * "dump" a string. This is done when the type is unknown, or the flags
- * request it. We can either dump the content octets or the entire DER
- * encoding. This uses the RFC 2253 #01234 format.
- */
+// "dump" a string. This is done when the type is unknown, or the flags
+// request it. We can either dump the content octets or the entire DER
+// encoding. This uses the RFC 2253 #01234 format.
 
 static int do_dump(unsigned long flags, BIO *out, const ASN1_STRING *str) {
   if (!maybe_write(out, "#", 1)) {
     return -1;
   }
 
-  /* If we don't dump DER encoding just dump content octets */
+  // If we don't dump DER encoding just dump content octets
   if (!(flags & ASN1_STRFLGS_DUMP_DER)) {
     int outlen = do_hex_dump(out, str->data, str->length);
     if (outlen < 0) {
@@ -258,21 +252,19 @@
     return outlen + 1;
   }
 
-  /*
-   * Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
-   * to readily obtained.
-   */
+  // Placing the ASN1_STRING in a temporary ASN1_TYPE allows the DER encoding
+  // to readily obtained.
   ASN1_TYPE t;
   t.type = str->type;
-  /* Negative INTEGER and ENUMERATED values are the only case where
-   * |ASN1_STRING| and |ASN1_TYPE| types do not match.
-   *
-   * TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
-   * not correspond to |ASN1_STRING|. It is unclear whether those are allowed
-   * in |ASN1_STRING| at all, or what the space of allowed types is.
-   * |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
-   * this is an invalid input. But this corner of the library in general
-   * should be more robust. */
+  // Negative INTEGER and ENUMERATED values are the only case where
+  // |ASN1_STRING| and |ASN1_TYPE| types do not match.
+  //
+  // TODO(davidben): There are also some type fields which, in |ASN1_TYPE|, do
+  // not correspond to |ASN1_STRING|. It is unclear whether those are allowed
+  // in |ASN1_STRING| at all, or what the space of allowed types is.
+  // |ASN1_item_ex_d2i| will never produce such a value so, for now, we say
+  // this is an invalid input. But this corner of the library in general
+  // should be more robust.
   if (t.type == V_ASN1_NEG_INTEGER) {
     t.type = V_ASN1_INTEGER;
   } else if (t.type == V_ASN1_NEG_ENUMERATED) {
@@ -292,12 +284,12 @@
   return outlen + 1;
 }
 
-/* string_type_to_encoding returns the |MBSTRING_*| constant for the encoding
- * used by the |ASN1_STRING| type |type|, or -1 if |tag| is not a string
- * type. */
+// string_type_to_encoding returns the |MBSTRING_*| constant for the encoding
+// used by the |ASN1_STRING| type |type|, or -1 if |tag| is not a string
+// type.
 static int string_type_to_encoding(int type) {
-  /* This function is sometimes passed ASN.1 universal types and sometimes
-   * passed |ASN1_STRING| type values */
+  // This function is sometimes passed ASN.1 universal types and sometimes
+  // passed |ASN1_STRING| type values
   switch (type) {
     case V_ASN1_UTF8STRING:
       return MBSTRING_UTF8;
@@ -308,7 +300,7 @@
     case V_ASN1_UTCTIME:
     case V_ASN1_GENERALIZEDTIME:
     case V_ASN1_ISO64STRING:
-      /* |MBSTRING_ASC| refers to Latin-1, not ASCII. */
+      // |MBSTRING_ASC| refers to Latin-1, not ASCII.
       return MBSTRING_ASC;
     case V_ASN1_UNIVERSALSTRING:
       return MBSTRING_UNIV;
@@ -318,11 +310,9 @@
   return -1;
 }
 
-/*
- * This is the main function, print out an ASN1_STRING taking note of various
- * escape and display options. Returns number of characters written or -1 if
- * an error occurred.
- */
+// This is the main function, print out an ASN1_STRING taking note of various
+// escape and display options. Returns number of characters written or -1 if
+// an error occurred.
 
 int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str,
                          unsigned long flags) {
@@ -337,13 +327,13 @@
     outlen++;
   }
 
-  /* Decide what to do with |str|, either dump the contents or display it. */
+  // Decide what to do with |str|, either dump the contents or display it.
   int encoding;
   if (flags & ASN1_STRFLGS_DUMP_ALL) {
-    /* Dump everything. */
+    // Dump everything.
     encoding = -1;
   } else if (flags & ASN1_STRFLGS_IGNORE_TYPE) {
-    /* Ignore the string type and interpret the contents as Latin-1. */
+    // Ignore the string type and interpret the contents as Latin-1.
     encoding = MBSTRING_ASC;
   } else {
     encoding = string_type_to_encoding(type);
@@ -363,11 +353,11 @@
 
   int utf8_convert = 0;
   if (flags & ASN1_STRFLGS_UTF8_CONVERT) {
-    /* If the string is UTF-8, skip decoding and just interpret it as 1 byte
-     * per character to avoid converting twice.
-     *
-     * TODO(davidben): This is not quite a valid optimization if the input
-     * was invalid UTF-8. */
+    // If the string is UTF-8, skip decoding and just interpret it as 1 byte
+    // per character to avoid converting twice.
+    //
+    // TODO(davidben): This is not quite a valid optimization if the input
+    // was invalid UTF-8.
     if (encoding == MBSTRING_UTF8) {
       encoding = MBSTRING_ASC;
     } else {
@@ -375,7 +365,7 @@
     }
   }
 
-  /* Measure the length. */
+  // Measure the length.
   char quotes = 0;
   int len = do_buf(str->data, str->length, encoding, utf8_convert, flags,
                    &quotes, NULL);
@@ -390,7 +380,7 @@
     return outlen;
   }
 
-  /* Encode the value. */
+  // Encode the value.
   if ((quotes && !maybe_write(out, "\"", 1)) ||
       do_buf(str->data, str->length, encoding, utf8_convert, flags, NULL, out) <
           0 ||
@@ -404,8 +394,8 @@
                             unsigned long flags) {
   BIO *bio = NULL;
   if (fp != NULL) {
-    /* If |fp| is NULL, this function returns the number of bytes without
-     * writing. */
+    // If |fp| is NULL, this function returns the number of bytes without
+    // writing.
     bio = BIO_new_fp(fp, BIO_NOCLOSE);
     if (bio == NULL) {
       return -1;
@@ -518,10 +508,10 @@
   if (tm->length >= 14 && (v[12] >= '0') && (v[12] <= '9') && (v[13] >= '0') &&
       (v[13] <= '9')) {
     s = (v[12] - '0') * 10 + (v[13] - '0');
-    /* Check for fractions of seconds. */
+    // Check for fractions of seconds.
     if (tm->length >= 15 && v[14] == '.') {
       int l = tm->length;
-      f = &v[14]; /* The decimal point. */
+      f = &v[14];  // The decimal point.
       f_len = 1;
       while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9') {
         ++f_len;
diff --git a/crypto/asn1/a_strnid.c b/crypto/asn1/a_strnid.c
index 937b794..3be266e 100644
--- a/crypto/asn1/a_strnid.c
+++ b/crypto/asn1/a_strnid.c
@@ -82,11 +82,9 @@
 
 static const ASN1_STRING_TABLE *asn1_string_table_get(int nid);
 
-/*
- * The following function generates an ASN1_STRING based on limits in a
- * table. Frequently the types and length of an ASN1_STRING are restricted by
- * a corresponding OID. For example certificates and certificate requests.
- */
+// The following function generates an ASN1_STRING based on limits in a
+// table. Frequently the types and length of an ASN1_STRING are restricted by
+// a corresponding OID. For example certificates and certificate requests.
 
 ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in,
                                     int len, int inform, int nid) {
@@ -112,11 +110,9 @@
   return *out;
 }
 
-/*
- * Now the tables and helper functions for the string table:
- */
+// Now the tables and helper functions for the string table:
 
-/* See RFC 5280. */
+// See RFC 5280.
 #define ub_name 32768
 #define ub_common_name 64
 #define ub_locality_name 128
@@ -126,7 +122,7 @@
 #define ub_email_address 128
 #define ub_serial_number 64
 
-/* This table must be kept in NID order */
+// This table must be kept in NID order
 
 static const ASN1_STRING_TABLE tbl_standard[] = {
     {NID_commonName, 1, ub_common_name, DIRSTRING_TYPE, 0},
@@ -185,15 +181,15 @@
     tbl = lh_ASN1_STRING_TABLE_retrieve(string_tables, &key);
   }
   CRYPTO_STATIC_MUTEX_unlock_read(&string_tables_lock);
-  /* Note returning |tbl| without the lock is only safe because
-   * |ASN1_STRING_TABLE_add| cannot modify or delete existing entries. If we
-   * wish to support that, this function must copy the result under a lock. */
+  // Note returning |tbl| without the lock is only safe because
+  // |ASN1_STRING_TABLE_add| cannot modify or delete existing entries. If we
+  // wish to support that, this function must copy the result under a lock.
   return tbl;
 }
 
 int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize,
                           unsigned long mask, unsigned long flags) {
-  /* Existing entries cannot be overwritten. */
+  // Existing entries cannot be overwritten.
   if (asn1_string_table_get(nid) != NULL) {
     OPENSSL_PUT_ERROR(ASN1, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
     return 0;
@@ -208,8 +204,8 @@
       goto err;
     }
   } else {
-    /* Check again for an existing entry. One may have been added while
-     * unlocked. */
+    // Check again for an existing entry. One may have been added while
+    // unlocked.
     ASN1_STRING_TABLE key;
     key.nid = nid;
     if (lh_ASN1_STRING_TABLE_retrieve(string_tables, &key) != NULL) {
diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c
index 5fdbc33..2252118 100644
--- a/crypto/asn1/a_time.c
+++ b/crypto/asn1/a_time.c
@@ -65,11 +65,9 @@
 
 #include "internal.h"
 
-/*
- * This is an implementation of the ASN1 Time structure which is: Time ::=
- * CHOICE { utcTime UTCTime, generalTime GeneralizedTime } written by Steve
- * Henson.
- */
+// This is an implementation of the ASN1 Time structure which is: Time ::=
+// CHOICE { utcTime UTCTime, generalTime GeneralizedTime } written by Steve
+// Henson.
 
 IMPLEMENT_ASN1_MSTRING(ASN1_TIME, B_ASN1_TIME)
 
@@ -109,7 +107,7 @@
   return 0;
 }
 
-/* Convert an ASN1_TIME structure to GeneralizedTime */
+// Convert an ASN1_TIME structure to GeneralizedTime
 ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t,
                                                    ASN1_GENERALIZEDTIME **out) {
   ASN1_GENERALIZEDTIME *ret = NULL;
@@ -128,7 +126,7 @@
     ret = *out;
   }
 
-  /* If already GeneralizedTime just copy across */
+  // If already GeneralizedTime just copy across
   if (t->type == V_ASN1_GENERALIZEDTIME) {
     if (!ASN1_STRING_set(ret, t->data, t->length)) {
       goto err;
@@ -136,14 +134,14 @@
     goto done;
   }
 
-  /* grow the string */
+  // grow the string
   if (!ASN1_STRING_set(ret, NULL, t->length + 2)) {
     goto err;
   }
-  /* ASN1_STRING_set() allocated 'len + 1' bytes. */
+  // ASN1_STRING_set() allocated 'len + 1' bytes.
   newlen = t->length + 2 + 1;
   str = (char *)ret->data;
-  /* Work out the century and prepend */
+  // Work out the century and prepend
   if (t->data[0] >= '5') {
     OPENSSL_strlcpy(str, "19", newlen);
   } else {
diff --git a/crypto/asn1/a_type.c b/crypto/asn1/a_type.c
index 1a53c93..d59fdba 100644
--- a/crypto/asn1/a_type.c
+++ b/crypto/asn1/a_type.c
@@ -115,7 +115,7 @@
   return 1;
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
+// Returns 0 if they are equal, != 0 otherwise.
 int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b) {
   int result = -1;
 
@@ -128,7 +128,7 @@
       result = OBJ_cmp(a->value.object, b->value.object);
       break;
     case V_ASN1_NULL:
-      result = 0; /* They do not have content. */
+      result = 0;  // They do not have content.
       break;
     case V_ASN1_BOOLEAN:
       result = a->value.boolean - b->value.boolean;
diff --git a/crypto/asn1/a_utf8.c b/crypto/asn1/a_utf8.c
index 0f2cba6..58496b2 100644
--- a/crypto/asn1/a_utf8.c
+++ b/crypto/asn1/a_utf8.c
@@ -61,16 +61,14 @@
 
 #include "internal.h"
 
-/* UTF8 utilities */
+// UTF8 utilities
 
-/*
- * This parses a UTF8 string one character at a time. It is passed a pointer
- * to the string and the length of the string. It sets 'value' to the value
- * of the current character. It returns the number of characters read or a
- * negative error code: -1 = string too short -2 = illegal character -3 =
- * subsequent characters not of the form 10xxxxxx -4 = character encoded
- * incorrectly (not minimal length).
- */
+// This parses a UTF8 string one character at a time. It is passed a pointer
+// to the string and the length of the string. It sets 'value' to the value
+// of the current character. It returns the number of characters read or a
+// negative error code: -1 = string too short -2 = illegal character -3 =
+// subsequent characters not of the form 10xxxxxx -4 = character encoded
+// incorrectly (not minimal length).
 
 int UTF8_getc(const unsigned char *str, int len, uint32_t *val) {
   const unsigned char *p;
@@ -81,7 +79,7 @@
   }
   p = str;
 
-  /* Check syntax and work out the encoded value (if correct) */
+  // Check syntax and work out the encoded value (if correct)
   if ((*p & 0x80) == 0) {
     value = *p++ & 0x7f;
     ret = 1;
@@ -171,17 +169,15 @@
   return ret;
 }
 
-/*
- * This takes a character 'value' and writes the UTF8 encoded value in 'str'
- * where 'str' is a buffer containing 'len' characters. Returns the number of
- * characters written or -1 if 'len' is too small. 'str' can be set to NULL
- * in which case it just returns the number of characters. It will need at
- * most 6 characters.
- */
+// This takes a character 'value' and writes the UTF8 encoded value in 'str'
+// where 'str' is a buffer containing 'len' characters. Returns the number of
+// characters written or -1 if 'len' is too small. 'str' can be set to NULL
+// in which case it just returns the number of characters. It will need at
+// most 6 characters.
 
 int UTF8_putc(unsigned char *str, int len, uint32_t value) {
   if (!str) {
-    len = 6; /* Maximum we will need */
+    len = 6;  // Maximum we will need
   } else if (len <= 0) {
     return -1;
   }
diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c
index bc54706..6fbeb56 100644
--- a/crypto/asn1/asn1_lib.c
+++ b/crypto/asn1/asn1_lib.c
@@ -67,19 +67,17 @@
 #include "internal.h"
 
 
-/* Cross-module errors from crypto/x509/i2d_pr.c. */
+// Cross-module errors from crypto/x509/i2d_pr.c.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNSUPPORTED_PUBLIC_KEY_TYPE)
 
-/* Cross-module errors from crypto/x509/algorithm.c. */
+// Cross-module errors from crypto/x509/algorithm.c.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, CONTEXT_NOT_INITIALISED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, DIGEST_AND_KEY_TYPE_NOT_SUPPORTED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNKNOWN_MESSAGE_DIGEST_ALGORITHM)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, UNKNOWN_SIGNATURE_ALGORITHM)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, WRONG_PUBLIC_KEY_TYPE)
-/*
- * Cross-module errors from crypto/x509/asn1_gen.c. TODO(davidben): Remove
- * these once asn1_gen.c is gone.
- */
+// Cross-module errors from crypto/x509/asn1_gen.c. TODO(davidben): Remove
+// these once asn1_gen.c is gone.
 OPENSSL_DECLARE_ERROR_REASON(ASN1, DEPTH_EXCEEDED)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, ILLEGAL_BITSTRING_FORMAT)
 OPENSSL_DECLARE_ERROR_REASON(ASN1, ILLEGAL_BOOLEAN)
@@ -113,12 +111,12 @@
     return 0x80;
   }
 
-  /* TODO(https://crbug.com/boringssl/354): This should use |CBS_get_asn1| to
-   * reject non-minimal lengths, which are only allowed in BER. However,
-   * Android sometimes needs allow a non-minimal length in certificate
-   * signature fields (see b/18228011). Make this only apply to that field,
-   * while requiring DER elsewhere. Better yet, it should be limited to an
-   * preprocessing step in that part of Android. */
+  // TODO(https://crbug.com/boringssl/354): This should use |CBS_get_asn1| to
+  // reject non-minimal lengths, which are only allowed in BER. However,
+  // Android sometimes needs allow a non-minimal length in certificate
+  // signature fields (see b/18228011). Make this only apply to that field,
+  // while requiring DER elsewhere. Better yet, it should be limited to an
+  // preprocessing step in that part of Android.
   unsigned tag;
   size_t header_len;
   int indefinite;
@@ -127,19 +125,19 @@
   if (!CBS_get_any_ber_asn1_element(&cbs, &body, &tag, &header_len,
                                     /*out_ber_found=*/NULL, &indefinite) ||
       indefinite || !CBS_skip(&body, header_len) ||
-      /* Bound the length to comfortably fit in an int. Lengths in this
-       * module often switch between int and long without overflow checks. */
+      // Bound the length to comfortably fit in an int. Lengths in this
+      // module often switch between int and long without overflow checks.
       CBS_len(&body) > INT_MAX / 2) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_HEADER_TOO_LONG);
     return 0x80;
   }
 
-  /* Convert between tag representations. */
+  // Convert between tag representations.
   int tag_class = (tag & CBS_ASN1_CLASS_MASK) >> CBS_ASN1_TAG_SHIFT;
   int constructed = (tag & CBS_ASN1_CONSTRUCTED) >> CBS_ASN1_TAG_SHIFT;
   int tag_number = tag & CBS_ASN1_TAG_NUMBER_MASK;
 
-  /* To avoid ambiguity with V_ASN1_NEG, impose a limit on universal tags. */
+  // To avoid ambiguity with V_ASN1_NEG, impose a limit on universal tags.
   if (tag_class == V_ASN1_UNIVERSAL && tag_number > V_ASN1_MAX_UNIVERSAL) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_HEADER_TOO_LONG);
     return 0x80;
@@ -152,9 +150,7 @@
   return constructed;
 }
 
-/*
- * class 0 is constructed constructed == 2 for indefinite length constructed
- */
+// class 0 is constructed constructed == 2 for indefinite length constructed
 void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
                      int xclass) {
   unsigned char *p = *pp;
@@ -188,8 +184,8 @@
 }
 
 int ASN1_put_eoc(unsigned char **pp) {
-  /* This function is no longer used in the library, but some external code
-   * uses it. */
+  // This function is no longer used in the library, but some external code
+  // uses it.
   unsigned char *p = *pp;
   *p++ = 0;
   *p++ = 0;
@@ -303,7 +299,7 @@
   str->length = len;
   if (data != NULL) {
     OPENSSL_memcpy(str->data, data, len);
-    /* an allowance for strings :-) */
+    // an allowance for strings :-)
     str->data[len] = '\0';
   }
   return (1);
@@ -343,7 +339,7 @@
 }
 
 int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) {
-  /* Capture padding bits and implicit truncation in BIT STRINGs. */
+  // Capture padding bits and implicit truncation in BIT STRINGs.
   int a_length = a->length, b_length = b->length;
   uint8_t a_padding = 0, b_padding = 0;
   if (a->type == V_ASN1_BIT_STRING) {
@@ -359,8 +355,8 @@
   if (a_length > b_length) {
     return 1;
   }
-  /* In a BIT STRING, the number of bits is 8 * length - padding. Invert this
-   * comparison so we compare by lengths. */
+  // In a BIT STRING, the number of bits is 8 * length - padding. Invert this
+  // comparison so we compare by lengths.
   if (a_padding > b_padding) {
     return -1;
   }
@@ -373,7 +369,7 @@
     return ret;
   }
 
-  /* Comparing the type first is more natural, but this matches OpenSSL. */
+  // Comparing the type first is more natural, but this matches OpenSSL.
   if (a->type < b->type) {
     return -1;
   }
diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h
index a6929e3..9c0d73e 100644
--- a/crypto/asn1/internal.h
+++ b/crypto/asn1/internal.h
@@ -69,42 +69,42 @@
 #endif
 
 
-/* Wrapper functions for time functions. */
+// Wrapper functions for time functions.
 
-/* OPENSSL_gmtime wraps |gmtime_r|. See the manual page for that function. */
+// OPENSSL_gmtime wraps |gmtime_r|. See the manual page for that function.
 OPENSSL_EXPORT struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result);
 
-/* OPENSSL_gmtime_adj updates |tm| by adding |offset_day| days and |offset_sec|
- * seconds. */
+// OPENSSL_gmtime_adj updates |tm| by adding |offset_day| days and |offset_sec|
+// seconds.
 int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec);
 
-/* OPENSSL_gmtime_diff calculates the difference between |from| and |to| and
- * outputs the difference as a number of days and seconds in |*out_days| and
- * |*out_secs|. */
+// OPENSSL_gmtime_diff calculates the difference between |from| and |to| and
+// outputs the difference as a number of days and seconds in |*out_days| and
+// |*out_secs|.
 OPENSSL_EXPORT int OPENSSL_gmtime_diff(int *out_days, int *out_secs,
                                        const struct tm *from,
                                        const struct tm *to);
 
-/* Internal ASN1 structures and functions: not for application use */
+// Internal ASN1 structures and functions: not for application use
 
-/* These are used internally in the ASN1_OBJECT to keep track of
- * whether the names and data need to be free()ed */
-#define ASN1_OBJECT_FLAG_DYNAMIC 0x01         /* internal use */
-#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 /* internal use */
-#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08    /* internal use */
+// These are used internally in the ASN1_OBJECT to keep track of
+// whether the names and data need to be free()ed
+#define ASN1_OBJECT_FLAG_DYNAMIC 0x01          // internal use
+#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04  // internal use
+#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08     // internal use
 
-/* An asn1_object_st (aka |ASN1_OBJECT|) represents an ASN.1 OBJECT IDENTIFIER.
- * Note: Mutating an |ASN1_OBJECT| is only permitted when initializing it. The
- * library maintains a table of static |ASN1_OBJECT|s, which may be referenced
- * by non-const |ASN1_OBJECT| pointers. Code which receives an |ASN1_OBJECT|
- * pointer externally must assume it is immutable, even if the pointer is not
- * const. */
+// An asn1_object_st (aka |ASN1_OBJECT|) represents an ASN.1 OBJECT IDENTIFIER.
+// Note: Mutating an |ASN1_OBJECT| is only permitted when initializing it. The
+// library maintains a table of static |ASN1_OBJECT|s, which may be referenced
+// by non-const |ASN1_OBJECT| pointers. Code which receives an |ASN1_OBJECT|
+// pointer externally must assume it is immutable, even if the pointer is not
+// const.
 struct asn1_object_st {
   const char *sn, *ln;
   int nid;
   int length;
-  const unsigned char *data; /* data remains const after init */
-  int flags;                 /* Should we free this one */
+  const unsigned char *data;  // data remains const after init
+  int flags;                  // Should we free this one
 };
 
 ASN1_OBJECT *ASN1_OBJECT_new(void);
@@ -144,31 +144,31 @@
                      const ASN1_ITEM *it, int tag, int aclass, char opt,
                      ASN1_TLC *ctx);
 
-/* ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the
- * i2d output convention. It returns a non-zero length on success and -1 on
- * error. If |tag| is -1. the tag and class come from |it|. Otherwise, the tag
- * number is |tag| and the class is |aclass|. This is used for implicit tagging.
- * This function treats a missing value as an error, not an optional field. */
+// ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the
+// i2d output convention. It returns a non-zero length on success and -1 on
+// error. If |tag| is -1. the tag and class come from |it|. Otherwise, the tag
+// number is |tag| and the class is |aclass|. This is used for implicit tagging.
+// This function treats a missing value as an error, not an optional field.
 int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                      const ASN1_ITEM *it, int tag, int aclass);
 
 void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
-/* asn1_get_choice_selector returns the CHOICE selector value for |*pval|, which
- * must of type |it|. */
+// asn1_get_choice_selector returns the CHOICE selector value for |*pval|, which
+// must of type |it|.
 int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
 int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it);
 
-/* asn1_get_field_ptr returns a pointer to the field in |*pval| corresponding to
- * |tt|. */
+// asn1_get_field_ptr returns a pointer to the field in |*pval| corresponding to
+// |tt|.
 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
 
-/* asn1_do_adb returns the |ASN1_TEMPLATE| for the ANY DEFINED BY field |tt|,
- * based on the selector INTEGER or OID in |*pval|. If |tt| is not an ADB field,
- * it returns |tt|. If the selector does not match any value, it returns NULL.
- * If |nullerr| is non-zero, it will additionally push an error to the error
- * queue when there is no match. */
+// asn1_do_adb returns the |ASN1_TEMPLATE| for the ANY DEFINED BY field |tt|,
+// based on the selector INTEGER or OID in |*pval|. If |tt| is not an ADB field,
+// it returns |tt|. If the selector does not match any value, it returns NULL.
+// If |nullerr| is non-zero, it will additionally push an error to the error
+// queue when there is no match.
 const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,
                                  int nullerr);
 
@@ -178,29 +178,29 @@
 void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
 void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
-/* asn1_enc_restore, if |*pval| has a saved encoding, writes it to |out| under
- * the i2d output convention, sets |*len| to the length, and returns one. If it
- * has no saved encoding, it returns zero. */
+// asn1_enc_restore, if |*pval| has a saved encoding, writes it to |out| under
+// the i2d output convention, sets |*len| to the length, and returns one. If it
+// has no saved encoding, it returns zero.
 int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval,
                      const ASN1_ITEM *it);
 
 int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen,
                   const ASN1_ITEM *it);
 
-/* asn1_type_value_as_pointer returns |a|'s value in pointer form. This is
- * usually the value object but, for BOOLEAN values, is 0 or 0xff cast to
- * a pointer. */
+// asn1_type_value_as_pointer returns |a|'s value in pointer form. This is
+// usually the value object but, for BOOLEAN values, is 0 or 0xff cast to
+// a pointer.
 const void *asn1_type_value_as_pointer(const ASN1_TYPE *a);
 
-/* asn1_is_printable returns one if |value| is a valid Unicode codepoint for an
- * ASN.1 PrintableString, and zero otherwise. */
+// asn1_is_printable returns one if |value| is a valid Unicode codepoint for an
+// ASN.1 PrintableString, and zero otherwise.
 int asn1_is_printable(uint32_t value);
 
-/* asn1_bit_string_length returns the number of bytes in |str| and sets
- * |*out_padding_bits| to the number of padding bits.
- *
- * This function should be used instead of |ASN1_STRING_length| to correctly
- * handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case. */
+// asn1_bit_string_length returns the number of bytes in |str| and sets
+// |*out_padding_bits| to the number of padding bits.
+//
+// This function should be used instead of |ASN1_STRING_length| to correctly
+// handle the non-|ASN1_STRING_FLAG_BITS_LEFT| case.
 int asn1_bit_string_length(const ASN1_BIT_STRING *str,
                            uint8_t *out_padding_bits);
 
@@ -212,14 +212,14 @@
   unsigned long flags;
 } ASN1_STRING_TABLE;
 
-/* asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table
- * of built-in |ASN1_STRING_TABLE| values. It is exported for testing. */
+// asn1_get_string_table_for_testing sets |*out_ptr| and |*out_len| to the table
+// of built-in |ASN1_STRING_TABLE| values. It is exported for testing.
 OPENSSL_EXPORT void asn1_get_string_table_for_testing(
     const ASN1_STRING_TABLE **out_ptr, size_t *out_len);
 
 
 #if defined(__cplusplus)
-} /* extern C */
+}  // extern C
 #endif
 
-#endif /* OPENSSL_HEADER_ASN1_ASN1_LOCL_H */
+#endif  // OPENSSL_HEADER_ASN1_ASN1_LOCL_H
diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c
index f86026e..c855fe5 100644
--- a/crypto/asn1/tasn_dec.c
+++ b/crypto/asn1/tasn_dec.c
@@ -66,12 +66,10 @@
 #include "../internal.h"
 #include "internal.h"
 
-/*
- * Constructed types with a recursive definition (such as can be found in PKCS7)
- * could eventually exceed the stack given malicious input with excessive
- * recursion. Therefore we limit the stack depth. This is the maximum number of
- * recursive invocations of asn1_item_embed_d2i().
- */
+// Constructed types with a recursive definition (such as can be found in PKCS7)
+// could eventually exceed the stack given malicious input with excessive
+// recursion. Therefore we limit the stack depth. This is the maximum number of
+// recursive invocations of asn1_item_embed_d2i().
 #define ASN1_MAX_CONSTRUCTED_NEST 30
 
 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
@@ -93,26 +91,26 @@
                             long len, const ASN1_ITEM *it, int tag, int aclass,
                             char opt, int depth);
 
-/* Table to convert tags to bit values, used for MSTRING type */
+// Table to convert tags to bit values, used for MSTRING type
 static const unsigned long tag2bit[31] = {
-    0, /* (reserved) */
-    0, /* BOOLEAN */
-    0, /* INTEGER */
+    0,  // (reserved)
+    0,  // BOOLEAN
+    0,  // INTEGER
     B_ASN1_BIT_STRING,
     B_ASN1_OCTET_STRING,
-    0,              /* NULL */
-    0,              /* OBJECT IDENTIFIER */
-    B_ASN1_UNKNOWN, /* ObjectDescriptor */
-    B_ASN1_UNKNOWN, /* EXTERNAL */
-    B_ASN1_UNKNOWN, /* REAL */
-    B_ASN1_UNKNOWN, /* ENUMERATED */
-    B_ASN1_UNKNOWN, /* EMBEDDED PDV */
+    0,               // NULL
+    0,               // OBJECT IDENTIFIER
+    B_ASN1_UNKNOWN,  // ObjectDescriptor
+    B_ASN1_UNKNOWN,  // EXTERNAL
+    B_ASN1_UNKNOWN,  // REAL
+    B_ASN1_UNKNOWN,  // ENUMERATED
+    B_ASN1_UNKNOWN,  // EMBEDDED PDV
     B_ASN1_UTF8STRING,
-    B_ASN1_UNKNOWN, /* RELATIVE-OID */
-    B_ASN1_UNKNOWN, /* TIME */
-    B_ASN1_UNKNOWN, /* (reserved) */
+    B_ASN1_UNKNOWN,  // RELATIVE-OID
+    B_ASN1_UNKNOWN,  // TIME
+    B_ASN1_UNKNOWN,  // (reserved)
     B_ASN1_SEQUENCE,
-    0, /* SET */
+    0,  // SET
     B_ASN1_NUMERICSTRING,
     B_ASN1_PRINTABLESTRING,
     B_ASN1_T61STRING,
@@ -124,7 +122,7 @@
     B_ASN1_ISO64STRING,
     B_ASN1_GENERALSTRING,
     B_ASN1_UNIVERSALSTRING,
-    B_ASN1_UNKNOWN, /* CHARACTER STRING */
+    B_ASN1_UNKNOWN,  // CHARACTER STRING
     B_ASN1_BMPSTRING,
 };
 
@@ -135,14 +133,12 @@
   return tag2bit[tag];
 }
 
-/* Macro to initialize and invalidate the cache */
+// Macro to initialize and invalidate the cache
 
-/*
- * Decode an ASN1 item, this currently behaves just like a standard 'd2i'
- * function. 'in' points to a buffer to read the data from, in future we
- * will have more advanced versions that can input data a piece at a time and
- * this will simply be a special case.
- */
+// Decode an ASN1 item, this currently behaves just like a standard 'd2i'
+// function. 'in' points to a buffer to read the data from, in future we
+// will have more advanced versions that can input data a piece at a time and
+// this will simply be a special case.
 
 ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
                           const ASN1_ITEM *it) {
@@ -157,10 +153,8 @@
   return NULL;
 }
 
-/*
- * Decode an item, taking care of IMPLICIT tagging, if any. If 'opt' set and
- * tag mismatch return -1 to handle OPTIONAL
- */
+// Decode an item, taking care of IMPLICIT tagging, if any. If 'opt' set and
+// tag mismatch return -1 to handle OPTIONAL
 
 static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in,
                             long len, const ASN1_ITEM *it, int tag, int aclass,
@@ -180,10 +174,8 @@
     return 0;
   }
 
-  /*
-   * Bound |len| to comfortably fit in an int. Lengths in this module often
-   * switch between int and long without overflow checks.
-   */
+  // Bound |len| to comfortably fit in an int. Lengths in this module often
+  // switch between int and long without overflow checks.
   if (len > INT_MAX / 2) {
     len = INT_MAX / 2;
   }
@@ -196,12 +188,10 @@
   switch (it->itype) {
     case ASN1_ITYPE_PRIMITIVE:
       if (it->templates) {
-        /*
-         * tagging or OPTIONAL is currently illegal on an item template
-         * because the flags can't get passed down. In practice this
-         * isn't a problem: we include the relevant flags from the item
-         * template in the template itself.
-         */
+        // tagging or OPTIONAL is currently illegal on an item template
+        // because the flags can't get passed down. In practice this
+        // isn't a problem: we include the relevant flags from the item
+        // template in the template itself.
         if ((tag != -1) || opt) {
           OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE);
           goto err;
@@ -212,35 +202,33 @@
       break;
 
     case ASN1_ITYPE_MSTRING:
-      /*
-       * It never makes sense for multi-strings to have implicit tagging, so
-       * if tag != -1, then this looks like an error in the template.
-       */
+      // It never makes sense for multi-strings to have implicit tagging, so
+      // if tag != -1, then this looks like an error in the template.
       if (tag != -1) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
         goto err;
       }
 
       p = *in;
-      /* Just read in tag and class */
+      // Just read in tag and class
       ret = asn1_check_tlen(NULL, &otag, &oclass, NULL, &p, len, -1, 0, 1);
       if (!ret) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
         goto err;
       }
 
-      /* Must be UNIVERSAL class */
+      // Must be UNIVERSAL class
       if (oclass != V_ASN1_UNIVERSAL) {
-        /* If OPTIONAL, assume this is OK */
+        // If OPTIONAL, assume this is OK
         if (opt) {
           return -1;
         }
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL);
         goto err;
       }
-      /* Check tag matches bit map */
+      // Check tag matches bit map
       if (!(ASN1_tag2bit(otag) & it->utype)) {
-        /* If OPTIONAL, assume this is OK */
+        // If OPTIONAL, assume this is OK
         if (opt) {
           return -1;
         }
@@ -250,15 +238,13 @@
       return asn1_d2i_ex_primitive(pval, in, len, it, otag, 0, 0);
 
     case ASN1_ITYPE_EXTERN:
-      /* Use new style d2i */
+      // Use new style d2i
       ef = it->funcs;
       return ef->asn1_ex_d2i(pval, in, len, it, tag, aclass, opt, NULL);
 
     case ASN1_ITYPE_CHOICE: {
-      /*
-       * It never makes sense for CHOICE types to have implicit tagging, so if
-       * tag != -1, then this looks like an error in the template.
-       */
+      // It never makes sense for CHOICE types to have implicit tagging, so if
+      // tag != -1, then this looks like an error in the template.
       if (tag != -1) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
         goto err;
@@ -271,7 +257,7 @@
       }
 
       if (*pval) {
-        /* Free up and zero CHOICE value if initialised */
+        // Free up and zero CHOICE value if initialised
         i = asn1_get_choice_selector(pval, it);
         if ((i >= 0) && (i < it->tcount)) {
           tt = it->templates + i;
@@ -283,33 +269,31 @@
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
         goto err;
       }
-      /* CHOICE type, try each possibility in turn */
+      // CHOICE type, try each possibility in turn
       p = *in;
       for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
         pchptr = asn1_get_field_ptr(pval, tt);
-        /*
-         * We mark field as OPTIONAL so its absence can be recognised.
-         */
+        // We mark field as OPTIONAL so its absence can be recognised.
         ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, depth);
-        /* If field not present, try the next one */
+        // If field not present, try the next one
         if (ret == -1) {
           continue;
         }
-        /* If positive return, read OK, break loop */
+        // If positive return, read OK, break loop
         if (ret > 0) {
           break;
         }
-        /* Otherwise must be an ASN1 parsing error */
+        // Otherwise must be an ASN1 parsing error
         errtt = tt;
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
         goto err;
       }
 
-      /* Did we fall off the end without reading anything? */
+      // Did we fall off the end without reading anything?
       if (i == it->tcount) {
-        /* If OPTIONAL, this is OK */
+        // If OPTIONAL, this is OK
         if (opt) {
-          /* Free and zero it */
+          // Free and zero it
           ASN1_item_ex_free(pval, it);
           return -1;
         }
@@ -328,12 +312,12 @@
     case ASN1_ITYPE_SEQUENCE: {
       p = *in;
 
-      /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
+      // If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL
       if (tag == -1) {
         tag = V_ASN1_SEQUENCE;
         aclass = V_ASN1_UNIVERSAL;
       }
-      /* Get SEQUENCE length and update len, p */
+      // Get SEQUENCE length and update len, p
       ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, len, tag, aclass, opt);
       if (!ret) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
@@ -357,7 +341,7 @@
         goto auxerr;
       }
 
-      /* Free up and zero any ADB found */
+      // Free up and zero any ADB found
       for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
         if (tt->flags & ASN1_TFLG_ADB_MASK) {
           const ASN1_TEMPLATE *seqtt;
@@ -371,7 +355,7 @@
         }
       }
 
-      /* Get each field entry */
+      // Get each field entry
       for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {
         const ASN1_TEMPLATE *seqtt;
         ASN1_VALUE **pseqval;
@@ -380,52 +364,44 @@
           goto err;
         }
         pseqval = asn1_get_field_ptr(pval, seqtt);
-        /* Have we ran out of data? */
+        // Have we ran out of data?
         if (!len) {
           break;
         }
         q = p;
-        /*
-         * This determines the OPTIONAL flag value. The field cannot be
-         * omitted if it is the last of a SEQUENCE and there is still
-         * data to be read. This isn't strictly necessary but it
-         * increases efficiency in some cases.
-         */
+        // This determines the OPTIONAL flag value. The field cannot be
+        // omitted if it is the last of a SEQUENCE and there is still
+        // data to be read. This isn't strictly necessary but it
+        // increases efficiency in some cases.
         if (i == (it->tcount - 1)) {
           isopt = 0;
         } else {
           isopt = (char)(seqtt->flags & ASN1_TFLG_OPTIONAL);
         }
-        /*
-         * attempt to read in field, allowing each to be OPTIONAL
-         */
+        // attempt to read in field, allowing each to be OPTIONAL
 
         ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, depth);
         if (!ret) {
           errtt = seqtt;
           goto err;
         } else if (ret == -1) {
-          /*
-           * OPTIONAL component absent. Free and zero the field.
-           */
+          // OPTIONAL component absent. Free and zero the field.
           ASN1_template_free(pseqval, seqtt);
           continue;
         }
-        /* Update length */
+        // Update length
         len -= p - q;
       }
 
-      /* Check all data read */
+      // Check all data read
       if (len) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH);
         goto err;
       }
 
-      /*
-       * If we get here we've got no more data in the SEQUENCE, however we
-       * may not have read all fields so check all remaining are OPTIONAL
-       * and clear any that are.
-       */
+      // If we get here we've got no more data in the SEQUENCE, however we
+      // may not have read all fields so check all remaining are OPTIONAL
+      // and clear any that are.
       for (; i < it->tcount; tt++, i++) {
         const ASN1_TEMPLATE *seqtt;
         seqtt = asn1_do_adb(pval, tt, 1);
@@ -442,7 +418,7 @@
           goto err;
         }
       }
-      /* Save encoding */
+      // Save encoding
       if (!asn1_enc_save(pval, *in, p - *in, it)) {
         goto auxerr;
       }
@@ -476,10 +452,8 @@
   return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, 0);
 }
 
-/*
- * Templates are handled with two separate functions. One handles any
- * EXPLICIT tag and the other handles the rest.
- */
+// Templates are handled with two separate functions. One handles any
+// EXPLICIT tag and the other handles the rest.
 
 static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in,
                                 long inlen, const ASN1_TEMPLATE *tt, char opt,
@@ -496,13 +470,11 @@
 
   p = *in;
 
-  /* Check if EXPLICIT tag expected */
+  // Check if EXPLICIT tag expected
   if (flags & ASN1_TFLG_EXPTAG) {
     char cst;
-    /*
-     * Need to work out amount of data available to the inner content and
-     * where it starts: so read in EXPLICIT header to get the info.
-     */
+    // Need to work out amount of data available to the inner content and
+    // where it starts: so read in EXPLICIT header to get the info.
     ret = asn1_check_tlen(&len, NULL, NULL, &cst, &p, inlen, tt->tag, aclass,
                           opt);
     q = p;
@@ -516,15 +488,15 @@
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED);
       return 0;
     }
-    /* We've found the field so it can't be OPTIONAL now */
+    // We've found the field so it can't be OPTIONAL now
     ret = asn1_template_noexp_d2i(val, &p, len, tt, 0, depth);
     if (!ret) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
       return 0;
     }
-    /* We read the field in OK so update length */
+    // We read the field in OK so update length
     len -= p - q;
-    /* Check for trailing data. */
+    // Check for trailing data.
     if (len) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH);
       goto err;
@@ -556,9 +528,9 @@
   p = *in;
 
   if (flags & ASN1_TFLG_SK_MASK) {
-    /* SET OF, SEQUENCE OF */
+    // SET OF, SEQUENCE OF
     int sktag, skaclass;
-    /* First work out expected inner tag value */
+    // First work out expected inner tag value
     if (flags & ASN1_TFLG_IMPTAG) {
       sktag = tt->tag;
       skaclass = aclass;
@@ -570,7 +542,7 @@
         sktag = V_ASN1_SEQUENCE;
       }
     }
-    /* Get the tag */
+    // Get the tag
     ret =
         asn1_check_tlen(&len, NULL, NULL, NULL, &p, len, sktag, skaclass, opt);
     if (!ret) {
@@ -582,9 +554,7 @@
     if (!*val) {
       *val = (ASN1_VALUE *)sk_ASN1_VALUE_new_null();
     } else {
-      /*
-       * We've got a valid STACK: free up any items present
-       */
+      // We've got a valid STACK: free up any items present
       STACK_OF(ASN1_VALUE) *sktmp = (STACK_OF(ASN1_VALUE) *)*val;
       ASN1_VALUE *vtmp;
       while (sk_ASN1_VALUE_num(sktmp) > 0) {
@@ -598,7 +568,7 @@
       goto err;
     }
 
-    /* Read as many items as we can */
+    // Read as many items as we can
     while (len > 0) {
       ASN1_VALUE *skfield;
       const unsigned char *q = p;
@@ -616,7 +586,7 @@
       }
     }
   } else if (flags & ASN1_TFLG_IMPTAG) {
-    /* IMPLICIT tagging */
+    // IMPLICIT tagging
     ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), tt->tag,
                            aclass, opt, depth);
     if (!ret) {
@@ -626,7 +596,7 @@
       return -1;
     }
   } else {
-    /* Nothing special */
+    // Nothing special
     ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1,
                            tt->flags & ASN1_TFLG_COMBINE, opt, depth);
     if (!ret) {
@@ -656,7 +626,7 @@
   long len;
   if (!pval) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL);
-    return 0; /* Should never happen */
+    return 0;  // Should never happen
   }
 
   if (it->itype == ASN1_ITYPE_MSTRING) {
@@ -667,7 +637,7 @@
   }
 
   if (utype == V_ASN1_ANY) {
-    /* If type is ANY need to figure out type from tag */
+    // If type is ANY need to figure out type from tag
     unsigned char oclass;
     if (tag >= 0) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TAGGED_ANY);
@@ -692,7 +662,7 @@
     aclass = V_ASN1_UNIVERSAL;
   }
   p = *in;
-  /* Check header */
+  // Check header
   ret = asn1_check_tlen(&plen, NULL, NULL, &cst, &p, inlen, tag, aclass, opt);
   if (!ret) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR);
@@ -701,10 +671,10 @@
     return -1;
   }
   ret = 0;
-  /* SEQUENCE, SET and "OTHER" are left in encoded form */
+  // SEQUENCE, SET and "OTHER" are left in encoded form
   if ((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) ||
       (utype == V_ASN1_OTHER)) {
-    /* SEQUENCE and SET must be constructed */
+    // SEQUENCE and SET must be constructed
     if (utype != V_ASN1_OTHER && !cst) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED);
       return 0;
@@ -714,9 +684,9 @@
     len = p - cont + plen;
     p += plen;
   } else if (cst) {
-    /* This parser historically supported BER constructed strings. We no
-     * longer do and will gradually tighten this parser into a DER
-     * parser. BER types should use |CBS_asn1_ber_to_der|. */
+    // This parser historically supported BER constructed strings. We no
+    // longer do and will gradually tighten this parser into a DER
+    // parser. BER types should use |CBS_asn1_ber_to_der|.
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE);
     return 0;
   } else {
@@ -725,7 +695,7 @@
     p += plen;
   }
 
-  /* We now have content length and type: translate into a structure */
+  // We now have content length and type: translate into a structure
   if (!asn1_ex_c2i(pval, cont, len, utype, it)) {
     goto err;
   }
@@ -736,7 +706,7 @@
   return ret;
 }
 
-/* Translate ASN1 content octets into a structure */
+// Translate ASN1 content octets into a structure
 
 static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
                        int utype, const ASN1_ITEM *it) {
@@ -746,11 +716,11 @@
   int ret = 0;
   ASN1_INTEGER **tint;
 
-  /* Historically, |it->funcs| for primitive types contained an
-   * |ASN1_PRIMITIVE_FUNCS| table of callbacks. */
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of callbacks.
   assert(it->funcs == NULL);
 
-  /* If ANY type clear type and set pointer to internal value */
+  // If ANY type clear type and set pointer to internal value
   if (it->utype == V_ASN1_ANY) {
     if (!*pval) {
       typ = ASN1_TYPE_new();
@@ -806,7 +776,7 @@
       if (!c2i_ASN1_INTEGER(tint, &cont, len)) {
         goto err;
       }
-      /* Fixup type to match the expected form */
+      // Fixup type to match the expected form
       (*tint)->type = utype | ((*tint)->type & V_ASN1_NEG);
       break;
 
@@ -853,7 +823,7 @@
           goto err;
         }
       }
-      /* All based on ASN1_STRING and handled the same */
+      // All based on ASN1_STRING and handled the same
       if (!*pval) {
         stmp = ASN1_STRING_type_new(utype);
         if (!stmp) {
@@ -873,7 +843,7 @@
       }
       break;
   }
-  /* If ASN1_ANY and NULL type fix up value */
+  // If ASN1_ANY and NULL type fix up value
   if (typ && (utype == V_ASN1_NULL)) {
     typ->value.ptr = NULL;
   }
@@ -889,10 +859,8 @@
   return ret;
 }
 
-/*
- * Check an ASN1 tag and length: a bit like ASN1_get_object but it
- * checks the expected tag.
- */
+// Check an ASN1 tag and length: a bit like ASN1_get_object but it
+// checks the expected tag.
 
 static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass,
                            char *cst, const unsigned char **in, long len,
@@ -910,9 +878,7 @@
   }
   if (exptag >= 0) {
     if ((exptag != ptag) || (expclass != pclass)) {
-      /*
-       * If type is OPTIONAL, not an error: indicate missing type.
-       */
+      // If type is OPTIONAL, not an error: indicate missing type.
       if (opt) {
         return -1;
       }
diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c
index c46df2d..39a3d52 100644
--- a/crypto/asn1/tasn_enc.c
+++ b/crypto/asn1/tasn_enc.c
@@ -80,9 +80,7 @@
 static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                                 const ASN1_TEMPLATE *tt, int tag, int aclass);
 
-/*
- * Top level i2d equivalents
- */
+// Top level i2d equivalents
 
 int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it) {
   if (out && !*out) {
@@ -109,10 +107,8 @@
   return ASN1_item_ex_i2d(&val, out, it, /*tag=*/-1, /*aclass=*/0);
 }
 
-/*
- * Encode an item, taking care of IMPLICIT tagging (if any). This function
- * performs the normal item handling: it can be used in external types.
- */
+// Encode an item, taking care of IMPLICIT tagging (if any). This function
+// performs the normal item handling: it can be used in external types.
 
 int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                      const ASN1_ITEM *it, int tag, int aclass) {
@@ -121,22 +117,22 @@
   return ret;
 }
 
-/* asn1_item_ex_i2d_opt behaves like |ASN1_item_ex_i2d| but, if |optional| is
- * non-zero and |*pval| is omitted, it returns zero and writes no bytes. */
+// asn1_item_ex_i2d_opt behaves like |ASN1_item_ex_i2d| but, if |optional| is
+// non-zero and |*pval| is omitted, it returns zero and writes no bytes.
 int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out,
                          const ASN1_ITEM *it, int tag, int aclass,
                          int optional) {
   const ASN1_TEMPLATE *tt = NULL;
   int i, seqcontlen, seqlen;
 
-  /* Historically, |aclass| was repurposed to pass additional flags into the
-   * encoding process. */
+  // Historically, |aclass| was repurposed to pass additional flags into the
+  // encoding process.
   assert((aclass & ASN1_TFLG_TAG_CLASS) == aclass);
-  /* If not overridding the tag, |aclass| is ignored and should be zero. */
+  // If not overridding the tag, |aclass| is ignored and should be zero.
   assert(tag != -1 || aclass == 0);
 
-  /* All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s.
-   * Optional primitives are handled later. */
+  // All fields are pointers, except for boolean |ASN1_ITYPE_PRIMITIVE|s.
+  // Optional primitives are handled later.
   if ((it->itype != ASN1_ITYPE_PRIMITIVE) && !*pval) {
     if (optional) {
       return 0;
@@ -157,10 +153,8 @@
       return asn1_i2d_ex_primitive(pval, out, it, tag, aclass, optional);
 
     case ASN1_ITYPE_MSTRING:
-      /*
-       * It never makes sense for multi-strings to have implicit tagging, so
-       * if tag != -1, then this looks like an error in the template.
-       */
+      // It never makes sense for multi-strings to have implicit tagging, so
+      // if tag != -1, then this looks like an error in the template.
       if (tag != -1) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
         return -1;
@@ -168,10 +162,8 @@
       return asn1_i2d_ex_primitive(pval, out, it, -1, 0, optional);
 
     case ASN1_ITYPE_CHOICE: {
-      /*
-       * It never makes sense for CHOICE types to have implicit tagging, so if
-       * tag != -1, then this looks like an error in the template.
-       */
+      // It never makes sense for CHOICE types to have implicit tagging, so if
+      // tag != -1, then this looks like an error in the template.
       if (tag != -1) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
         return -1;
@@ -191,13 +183,13 @@
     }
 
     case ASN1_ITYPE_EXTERN: {
-      /* If new style i2d it does all the work */
+      // If new style i2d it does all the work
       const ASN1_EXTERN_FUNCS *ef = it->funcs;
       int ret = ef->asn1_ex_i2d(pval, out, it, tag, aclass);
       if (ret == 0) {
-        /* |asn1_ex_i2d| should never return zero. We have already checked
-         * for optional values generically, and |ASN1_ITYPE_EXTERN| fields
-         * must be pointers. */
+        // |asn1_ex_i2d| should never return zero. We have already checked
+        // for optional values generically, and |ASN1_ITYPE_EXTERN| fields
+        // must be pointers.
         OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR);
         return -1;
       }
@@ -206,22 +198,22 @@
 
     case ASN1_ITYPE_SEQUENCE: {
       i = asn1_enc_restore(&seqcontlen, out, pval, it);
-      /* An error occurred */
+      // An error occurred
       if (i < 0) {
         return -1;
       }
-      /* We have a valid cached encoding... */
+      // We have a valid cached encoding...
       if (i > 0) {
         return seqcontlen;
       }
-      /* Otherwise carry on */
+      // Otherwise carry on
       seqcontlen = 0;
-      /* If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL */
+      // If no IMPLICIT tagging set to SEQUENCE, UNIVERSAL
       if (tag == -1) {
         tag = V_ASN1_SEQUENCE;
         aclass = V_ASN1_UNIVERSAL;
       }
-      /* First work out sequence content length */
+      // First work out sequence content length
       for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
         const ASN1_TEMPLATE *seqtt;
         ASN1_VALUE **pseqval;
@@ -242,7 +234,7 @@
       if (!out || seqlen == -1) {
         return seqlen;
       }
-      /* Output SEQUENCE header */
+      // Output SEQUENCE header
       ASN1_put_object(out, /*constructed=*/1, seqcontlen, tag, aclass);
       for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
         const ASN1_TEMPLATE *seqtt;
@@ -265,38 +257,36 @@
   }
 }
 
-/* asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an
- * |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an
- * |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of
- * taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag. */
+// asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an
+// |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an
+// |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of
+// taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag.
 static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                                 const ASN1_TEMPLATE *tt, int tag, int iclass) {
   int i, ret, flags, ttag, tclass;
   size_t j;
   flags = tt->flags;
 
-  /* Historically, |iclass| was repurposed to pass additional flags into the
-   * encoding process. */
+  // Historically, |iclass| was repurposed to pass additional flags into the
+  // encoding process.
   assert((iclass & ASN1_TFLG_TAG_CLASS) == iclass);
-  /* If not overridding the tag, |iclass| is ignored and should be zero. */
+  // If not overridding the tag, |iclass| is ignored and should be zero.
   assert(tag != -1 || iclass == 0);
 
-  /*
-   * Work out tag and class to use: tagging may come either from the
-   * template or the arguments, not both because this would create
-   * ambiguity.
-   */
+  // Work out tag and class to use: tagging may come either from the
+  // template or the arguments, not both because this would create
+  // ambiguity.
   if (flags & ASN1_TFLG_TAG_MASK) {
-    /* Error if argument and template tagging */
+    // Error if argument and template tagging
     if (tag != -1) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE);
       return -1;
     }
-    /* Get tagging from template */
+    // Get tagging from template
     ttag = tt->tag;
     tclass = flags & ASN1_TFLG_TAG_CLASS;
   } else if (tag != -1) {
-    /* No template tagging, get from arguments */
+    // No template tagging, get from arguments
     ttag = tag;
     tclass = iclass & ASN1_TFLG_TAG_CLASS;
   } else {
@@ -306,13 +296,11 @@
 
   const int optional = (flags & ASN1_TFLG_OPTIONAL) != 0;
 
-  /*
-   * At this point 'ttag' contains the outer tag to use, and 'tclass' is the
-   * class.
-   */
+  // At this point 'ttag' contains the outer tag to use, and 'tclass' is the
+  // class.
 
   if (flags & ASN1_TFLG_SK_MASK) {
-    /* SET OF, SEQUENCE OF */
+    // SET OF, SEQUENCE OF
     STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
     int isset, sktag, skaclass;
     int skcontlen, sklen;
@@ -328,17 +316,15 @@
 
     if (flags & ASN1_TFLG_SET_OF) {
       isset = 1;
-      /* Historically, types with both bits set were mutated when
-       * serialized to apply the sort. We no longer support this. */
+      // Historically, types with both bits set were mutated when
+      // serialized to apply the sort. We no longer support this.
       assert((flags & ASN1_TFLG_SEQUENCE_OF) == 0);
     } else {
       isset = 0;
     }
 
-    /*
-     * Work out inner tag value: if EXPLICIT or no tagging use underlying
-     * type.
-     */
+    // Work out inner tag value: if EXPLICIT or no tagging use underlying
+    // type.
     if ((ttag != -1) && !(flags & ASN1_TFLG_EXPTAG)) {
       sktag = ttag;
       skaclass = tclass;
@@ -351,7 +337,7 @@
       }
     }
 
-    /* Determine total length of items */
+    // Determine total length of items
     skcontlen = 0;
     for (j = 0; j < sk_ASN1_VALUE_num(sk); j++) {
       int tmplen;
@@ -366,7 +352,7 @@
     if (sklen == -1) {
       return -1;
     }
-    /* If EXPLICIT need length of surrounding tag */
+    // If EXPLICIT need length of surrounding tag
     if (flags & ASN1_TFLG_EXPTAG) {
       ret = ASN1_object_size(/*constructed=*/1, sklen, ttag);
     } else {
@@ -377,14 +363,14 @@
       return ret;
     }
 
-    /* Now encode this lot... */
-    /* EXPLICIT tag */
+    // Now encode this lot...
+    // EXPLICIT tag
     if (flags & ASN1_TFLG_EXPTAG) {
       ASN1_put_object(out, /*constructed=*/1, sklen, ttag, tclass);
     }
-    /* SET or SEQUENCE and IMPLICIT tag */
+    // SET or SEQUENCE and IMPLICIT tag
     ASN1_put_object(out, /*constructed=*/1, skcontlen, sktag, skaclass);
-    /* And the stuff itself */
+    // And the stuff itself
     if (!asn1_set_seq_out(sk, out, skcontlen, ASN1_ITEM_ptr(tt->item), isset)) {
       return -1;
     }
@@ -392,17 +378,17 @@
   }
 
   if (flags & ASN1_TFLG_EXPTAG) {
-    /* EXPLICIT tagging */
-    /* Find length of tagged item */
+    // EXPLICIT tagging
+    // Find length of tagged item
     i = asn1_item_ex_i2d_opt(pval, NULL, ASN1_ITEM_ptr(tt->item), -1, 0,
                              optional);
     if (i <= 0) {
       return i;
     }
-    /* Find length of EXPLICIT tag */
+    // Find length of EXPLICIT tag
     ret = ASN1_object_size(/*constructed=*/1, i, ttag);
     if (out && ret != -1) {
-      /* Output tag and item */
+      // Output tag and item
       ASN1_put_object(out, /*constructed=*/1, i, ttag, tclass);
       if (ASN1_item_ex_i2d(pval, out, ASN1_ITEM_ptr(tt->item), -1, 0) < 0) {
         return -1;
@@ -411,12 +397,12 @@
     return ret;
   }
 
-  /* Either normal or IMPLICIT tagging */
+  // Either normal or IMPLICIT tagging
   return asn1_item_ex_i2d_opt(pval, out, ASN1_ITEM_ptr(tt->item), ttag, tclass,
                               optional);
 }
 
-/* Temporary structure used to hold DER encoding of items for SET OF */
+// Temporary structure used to hold DER encoding of items for SET OF
 
 typedef struct {
   unsigned char *data;
@@ -434,14 +420,14 @@
   return d1->length - d2->length;
 }
 
-/* asn1_set_seq_out writes |sk| to |out| under the i2d output convention,
- * excluding the tag and length. It returns one on success and zero on error.
- * |skcontlen| must be the total encoded size. If |do_sort| is non-zero, the
- * elements are sorted for a SET OF type. Each element of |sk| has type
- * |item|. */
+// asn1_set_seq_out writes |sk| to |out| under the i2d output convention,
+// excluding the tag and length. It returns one on success and zero on error.
+// |skcontlen| must be the total encoded size. If |do_sort| is non-zero, the
+// elements are sorted for a SET OF type. Each element of |sk| has type
+// |item|.
 static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out,
                             int skcontlen, const ASN1_ITEM *item, int do_sort) {
-  /* No need to sort if there are fewer than two items. */
+  // No need to sort if there are fewer than two items.
   if (!do_sort || sk_ASN1_VALUE_num(sk) < 2) {
     for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
       ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
@@ -465,7 +451,7 @@
     goto err;
   }
 
-  /* Encode all the elements into |buf| and populate |encoded|. */
+  // Encode all the elements into |buf| and populate |encoded|.
   unsigned char *p = buf;
   for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
     ASN1_VALUE *skitem = sk_ASN1_VALUE_value(sk, i);
@@ -479,7 +465,7 @@
 
   qsort(encoded, sk_ASN1_VALUE_num(sk), sizeof(*encoded), der_cmp);
 
-  /* Output the elements in sorted order. */
+  // Output the elements in sorted order.
   p = *out;
   for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
     OPENSSL_memcpy(p, encoded[i].data, encoded[i].length);
@@ -495,12 +481,12 @@
   return ret;
 }
 
-/* asn1_i2d_ex_primitive behaves like |ASN1_item_ex_i2d| but |item| must be a
- * a PRIMITIVE or MSTRING type that is not an |ASN1_ITEM_TEMPLATE|. */
+// asn1_i2d_ex_primitive behaves like |ASN1_item_ex_i2d| but |item| must be a
+// a PRIMITIVE or MSTRING type that is not an |ASN1_ITEM_TEMPLATE|.
 static int asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
                                  const ASN1_ITEM *it, int tag, int aclass,
                                  int optional) {
-  /* Get length of content octets and maybe find out the underlying type. */
+  // Get length of content octets and maybe find out the underlying type.
   int omit;
   int utype = it->utype;
   int len = asn1_ex_i2c(pval, NULL, &omit, &utype, it);
@@ -515,20 +501,18 @@
     return -1;
   }
 
-  /*
-   * If SEQUENCE, SET or OTHER then header is included in pseudo content
-   * octets so don't include tag+length. We need to check here because the
-   * call to asn1_ex_i2c() could change utype.
-   */
+  // If SEQUENCE, SET or OTHER then header is included in pseudo content
+  // octets so don't include tag+length. We need to check here because the
+  // call to asn1_ex_i2c() could change utype.
   int usetag =
       utype != V_ASN1_SEQUENCE && utype != V_ASN1_SET && utype != V_ASN1_OTHER;
 
-  /* If not implicitly tagged get tag from underlying type */
+  // If not implicitly tagged get tag from underlying type
   if (tag == -1) {
     tag = utype;
   }
 
-  /* Output tag+length followed by content octets */
+  // Output tag+length followed by content octets
   if (out) {
     if (usetag) {
       ASN1_put_object(out, /*constructed=*/0, len, tag, aclass);
@@ -548,22 +532,22 @@
   return len;
 }
 
-/* asn1_ex_i2c writes the |*pval| to |cout| under the i2d output convention,
- * excluding the tag and length. It returns the number of bytes written,
- * possibly zero, on success or -1 on error. If |*pval| should be omitted, it
- * returns zero and sets |*out_omit| to true.
- *
- * If |it| is an MSTRING or ANY type, it gets the underlying type from |*pval|,
- * which must be an |ASN1_STRING| or |ASN1_TYPE|, respectively. It then updates
- * |*putype| with the tag number of type used, or |V_ASN1_OTHER| if it was not a
- * universal type. If |*putype| is set to |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or
- * |V_ASN1_OTHER|, it additionally outputs the tag and length, so the caller
- * must not do so.
- *
- * Otherwise, |*putype| must contain |it->utype|.
- *
- * WARNING: Unlike most functions in this file, |asn1_ex_i2c| can return zero
- * without omitting the element. ASN.1 values may have empty contents. */
+// asn1_ex_i2c writes the |*pval| to |cout| under the i2d output convention,
+// excluding the tag and length. It returns the number of bytes written,
+// possibly zero, on success or -1 on error. If |*pval| should be omitted, it
+// returns zero and sets |*out_omit| to true.
+//
+// If |it| is an MSTRING or ANY type, it gets the underlying type from |*pval|,
+// which must be an |ASN1_STRING| or |ASN1_TYPE|, respectively. It then updates
+// |*putype| with the tag number of type used, or |V_ASN1_OTHER| if it was not a
+// universal type. If |*putype| is set to |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or
+// |V_ASN1_OTHER|, it additionally outputs the tag and length, so the caller
+// must not do so.
+//
+// Otherwise, |*putype| must contain |it->utype|.
+//
+// WARNING: Unlike most functions in this file, |asn1_ex_i2c| can return zero
+// without omitting the element. ASN.1 values may have empty contents.
 static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit,
                        int *putype, const ASN1_ITEM *it) {
   ASN1_BOOLEAN *tbool = NULL;
@@ -574,13 +558,13 @@
   unsigned char c;
   int len;
 
-  /* Historically, |it->funcs| for primitive types contained an
-   * |ASN1_PRIMITIVE_FUNCS| table of callbacks. */
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of callbacks.
   assert(it->funcs == NULL);
 
   *out_omit = 0;
 
-  /* Should type be omitted? */
+  // Should type be omitted?
   if ((it->itype != ASN1_ITYPE_PRIMITIVE) || (it->utype != V_ASN1_BOOLEAN)) {
     if (!*pval) {
       *out_omit = 1;
@@ -589,23 +573,23 @@
   }
 
   if (it->itype == ASN1_ITYPE_MSTRING) {
-    /* If MSTRING type set the underlying type */
+    // If MSTRING type set the underlying type
     strtmp = (ASN1_STRING *)*pval;
     utype = strtmp->type;
     if (utype < 0 && utype != V_ASN1_OTHER) {
-      /* MSTRINGs can have type -1 when default-constructed. */
+      // MSTRINGs can have type -1 when default-constructed.
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
       return -1;
     }
-    /* Negative INTEGER and ENUMERATED values use |ASN1_STRING| type values
-     * that do not match their corresponding utype values. INTEGERs cannot
-     * participate in MSTRING types, but ENUMERATEDs can.
-     *
-     * TODO(davidben): Is this a bug? Although arguably one of the MSTRING
-     * types should contain more values, rather than less. See
-     * https://crbug.com/boringssl/412. But it is not possible to fit all
-     * possible ANY values into an |ASN1_STRING|, so matching the spec here
-     * is somewhat hopeless. */
+    // Negative INTEGER and ENUMERATED values use |ASN1_STRING| type values
+    // that do not match their corresponding utype values. INTEGERs cannot
+    // participate in MSTRING types, but ENUMERATEDs can.
+    //
+    // TODO(davidben): Is this a bug? Although arguably one of the MSTRING
+    // types should contain more values, rather than less. See
+    // https://crbug.com/boringssl/412. But it is not possible to fit all
+    // possible ANY values into an |ASN1_STRING|, so matching the spec here
+    // is somewhat hopeless.
     if (utype == V_ASN1_NEG_INTEGER) {
       utype = V_ASN1_INTEGER;
     } else if (utype == V_ASN1_NEG_ENUMERATED) {
@@ -613,12 +597,12 @@
     }
     *putype = utype;
   } else if (it->utype == V_ASN1_ANY) {
-    /* If ANY set type and pointer to value */
+    // If ANY set type and pointer to value
     ASN1_TYPE *typ;
     typ = (ASN1_TYPE *)*pval;
     utype = typ->type;
     if (utype < 0 && utype != V_ASN1_OTHER) {
-      /* |ASN1_TYPE|s can have type -1 when default-constructed. */
+      // |ASN1_TYPE|s can have type -1 when default-constructed.
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE);
       return -1;
     }
@@ -634,7 +618,7 @@
       cont = otmp->data;
       len = otmp->length;
       if (len == 0) {
-        /* Some |ASN1_OBJECT|s do not have OIDs and cannot be serialized. */
+        // Some |ASN1_OBJECT|s do not have OIDs and cannot be serialized.
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT);
         return -1;
       }
@@ -652,9 +636,7 @@
         return 0;
       }
       if (it->utype != V_ASN1_ANY) {
-        /*
-         * Default handling if value == size field then omit
-         */
+        // Default handling if value == size field then omit
         if ((*tbool && (it->size > 0)) || (!*tbool && !it->size)) {
           *out_omit = 1;
           return 0;
@@ -668,15 +650,15 @@
     case V_ASN1_BIT_STRING: {
       int ret =
           i2c_ASN1_BIT_STRING((ASN1_BIT_STRING *)*pval, cout ? &cout : NULL);
-      /* |i2c_ASN1_BIT_STRING| returns zero on error instead of -1. */
+      // |i2c_ASN1_BIT_STRING| returns zero on error instead of -1.
       return ret <= 0 ? -1 : ret;
     }
 
     case V_ASN1_INTEGER:
     case V_ASN1_ENUMERATED: {
-      /* |i2c_ASN1_INTEGER| also handles ENUMERATED. */
+      // |i2c_ASN1_INTEGER| also handles ENUMERATED.
       int ret = i2c_ASN1_INTEGER((ASN1_INTEGER *)*pval, cout ? &cout : NULL);
-      /* |i2c_ASN1_INTEGER| returns zero on error instead of -1. */
+      // |i2c_ASN1_INTEGER| returns zero on error instead of -1.
       return ret <= 0 ? -1 : ret;
     }
 
@@ -697,7 +679,7 @@
     case V_ASN1_SEQUENCE:
     case V_ASN1_SET:
     default:
-      /* All based on ASN1_STRING and handled the same */
+      // All based on ASN1_STRING and handled the same
       strtmp = (ASN1_STRING *)*pval;
       cont = strtmp->data;
       len = strtmp->length;
diff --git a/crypto/asn1/tasn_fre.c b/crypto/asn1/tasn_fre.c
index be0d33d..3da1fa6 100644
--- a/crypto/asn1/tasn_fre.c
+++ b/crypto/asn1/tasn_fre.c
@@ -63,7 +63,7 @@
 
 #include "internal.h"
 
-/* Free up an ASN1 structure */
+// Free up an ASN1 structure
 
 void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it) {
   asn1_item_combine_free(&val, it, 0);
@@ -144,11 +144,9 @@
         }
       }
       asn1_enc_free(pval, it);
-      /*
-       * If we free up as normal we will invalidate any ANY DEFINED BY
-       * field and we wont be able to determine the type of the field it
-       * defines. So free up in reverse order.
-       */
+      // If we free up as normal we will invalidate any ANY DEFINED BY
+      // field and we wont be able to determine the type of the field it
+      // defines. So free up in reverse order.
       tt = it->templates + it->tcount - 1;
       for (i = 0; i < it->tcount; tt--, i++) {
         ASN1_VALUE **pseqval;
@@ -190,10 +188,10 @@
 
 void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   int utype;
-  /* Historically, |it->funcs| for primitive types contained an
-   * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
   assert(it == NULL || it->funcs == NULL);
-  /* Special case: if 'it' is NULL free contents of ASN1_TYPE */
+  // Special case: if 'it' is NULL free contents of ASN1_TYPE
   if (!it) {
     ASN1_TYPE *typ = (ASN1_TYPE *)*pval;
     utype = typ->type;
diff --git a/crypto/asn1/tasn_new.c b/crypto/asn1/tasn_new.c
index f6cd96f..97411c5 100644
--- a/crypto/asn1/tasn_new.c
+++ b/crypto/asn1/tasn_new.c
@@ -83,7 +83,7 @@
   return NULL;
 }
 
-/* Allocate an ASN1 structure */
+// Allocate an ASN1 structure
 
 int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   return asn1_item_ex_combine_new(pval, it, 0);
@@ -235,13 +235,13 @@
     asn1_template_clear(pval, tt);
     return 1;
   }
-  /* If ANY DEFINED BY nothing to do */
+  // If ANY DEFINED BY nothing to do
 
   if (tt->flags & ASN1_TFLG_ADB_MASK) {
     *pval = NULL;
     return 1;
   }
-  /* If SET OF or SEQUENCE OF, its a STACK */
+  // If SET OF or SEQUENCE OF, its a STACK
   if (tt->flags & ASN1_TFLG_SK_MASK) {
     STACK_OF(ASN1_VALUE) *skval;
     skval = sk_ASN1_VALUE_new_null();
@@ -254,14 +254,14 @@
     ret = 1;
     goto done;
   }
-  /* Otherwise pass it back to the item routine */
+  // Otherwise pass it back to the item routine
   ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
 done:
   return ret;
 }
 
 static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
-  /* If ADB or STACK just NULL the field */
+  // If ADB or STACK just NULL the field
   if (tt->flags & (ASN1_TFLG_ADB_MASK | ASN1_TFLG_SK_MASK)) {
     *pval = NULL;
   } else {
@@ -269,10 +269,8 @@
   }
 }
 
-/*
- * NB: could probably combine most of the real XXX_new() behaviour and junk
- * all the old functions.
- */
+// NB: could probably combine most of the real XXX_new() behaviour and junk
+// all the old functions.
 
 static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   ASN1_TYPE *typ;
@@ -282,8 +280,8 @@
     return 0;
   }
 
-  /* Historically, |it->funcs| for primitive types contained an
-   * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
   assert(it->funcs == NULL);
 
   if (it->itype == ASN1_ITYPE_MSTRING) {
@@ -326,8 +324,8 @@
 
 static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   int utype;
-  /* Historically, |it->funcs| for primitive types contained an
-   * |ASN1_PRIMITIVE_FUNCS| table of calbacks. */
+  // Historically, |it->funcs| for primitive types contained an
+  // |ASN1_PRIMITIVE_FUNCS| table of calbacks.
   assert(it == NULL || it->funcs == NULL);
   if (!it || (it->itype == ASN1_ITYPE_MSTRING)) {
     utype = -1;
diff --git a/crypto/asn1/tasn_typ.c b/crypto/asn1/tasn_typ.c
index e38154e..756dd71 100644
--- a/crypto/asn1/tasn_typ.c
+++ b/crypto/asn1/tasn_typ.c
@@ -58,7 +58,7 @@
 
 #include <openssl/asn1t.h>
 
-/* Declarations for string types */
+// Declarations for string types
 
 #define IMPLEMENT_ASN1_STRING_FUNCTIONS(sname)                         \
   IMPLEMENT_ASN1_TYPE(sname)                                           \
@@ -88,12 +88,12 @@
 
 IMPLEMENT_ASN1_TYPE(ASN1_ANY)
 
-/* Just swallow an ASN1_SEQUENCE in an ASN1_STRING */
+// Just swallow an ASN1_SEQUENCE in an ASN1_STRING
 IMPLEMENT_ASN1_TYPE(ASN1_SEQUENCE)
 
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE)
 
-/* Multistring types */
+// Multistring types
 
 IMPLEMENT_ASN1_MSTRING(ASN1_PRINTABLE, B_ASN1_PRINTABLE)
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, ASN1_PRINTABLE,
@@ -106,12 +106,12 @@
 IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, DIRECTORYSTRING,
                                      DIRECTORYSTRING)
 
-/* Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE */
+// Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE
 IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, -1)
 IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, 1)
 IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, 0)
 
-/* Special, OCTET STRING with indefinite length constructed support */
+// Special, OCTET STRING with indefinite length constructed support
 
 ASN1_ITEM_TEMPLATE(ASN1_SEQUENCE_ANY) =
     ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, ASN1_SEQUENCE_ANY, ASN1_ANY)
diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c
index 9f52347..a476874 100644
--- a/crypto/asn1/tasn_utl.c
+++ b/crypto/asn1/tasn_utl.c
@@ -69,18 +69,18 @@
 #include "internal.h"
 
 
-/* Utility functions for manipulating fields and offsets */
+// Utility functions for manipulating fields and offsets
 
-/* Add 'offset' to 'addr' */
+// Add 'offset' to 'addr'
 #define offset2ptr(addr, offset) (void *)(((char *)(addr)) + (offset))
 
-/* Given an ASN1_ITEM CHOICE type return the selector value */
+// Given an ASN1_ITEM CHOICE type return the selector value
 int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it) {
   int *sel = offset2ptr(*pval, it->utype);
   return *sel;
 }
 
-/* Given an ASN1_ITEM CHOICE type set the selector value, return old value. */
+// Given an ASN1_ITEM CHOICE type set the selector value, return old value.
 int asn1_set_choice_selector(ASN1_VALUE **pval, int value,
                              const ASN1_ITEM *it) {
   int *sel, ret;
@@ -205,20 +205,20 @@
   return 1;
 }
 
-/* Given an ASN1_TEMPLATE get a pointer to a field */
+// Given an ASN1_TEMPLATE get a pointer to a field
 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) {
   ASN1_VALUE **pvaltmp;
   if (tt->flags & ASN1_TFLG_COMBINE) {
     return pval;
   }
   pvaltmp = offset2ptr(*pval, tt->offset);
-  /* NOTE for BOOLEAN types the field is just a plain int so we can't return
-   * int **, so settle for (int *). */
+  // NOTE for BOOLEAN types the field is just a plain int so we can't return
+  // int **, so settle for (int *).
   return pvaltmp;
 }
 
-/* Handle ANY DEFINED BY template, find the selector, look up the relevant
- * ASN1_TEMPLATE in the table and return it. */
+// Handle ANY DEFINED BY template, find the selector, look up the relevant
+// ASN1_TEMPLATE in the table and return it.
 const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,
                                  int nullerr) {
   const ASN1_ADB *adb;
@@ -229,13 +229,13 @@
     return tt;
   }
 
-  /* Else ANY DEFINED BY ... get the table */
+  // Else ANY DEFINED BY ... get the table
   adb = ASN1_ADB_ptr(tt->item);
 
-  /* Get the selector field */
+  // Get the selector field
   sfld = offset2ptr(*pval, adb->offset);
 
-  /* Check if NULL */
+  // Check if NULL
   if (*sfld == NULL) {
     if (!adb->null_tt) {
       goto err;
@@ -243,16 +243,16 @@
     return adb->null_tt;
   }
 
-  /* Convert type to a NID:
-   * NB: don't check for NID_undef here because it
-   * might be a legitimate value in the table */
+  // Convert type to a NID:
+  // NB: don't check for NID_undef here because it
+  // might be a legitimate value in the table
   assert(tt->flags & ASN1_TFLG_ADB_OID);
   int selector = OBJ_obj2nid((ASN1_OBJECT *)*sfld);
 
-  /* Try to find matching entry in table Maybe should check application types
-   * first to allow application override? Might also be useful to have a flag
-   * which indicates table is sorted and we can do a binary search. For now
-   * stick to a linear search. */
+  // Try to find matching entry in table Maybe should check application types
+  // first to allow application override? Might also be useful to have a flag
+  // which indicates table is sorted and we can do a binary search. For now
+  // stick to a linear search.
 
   for (atbl = adb->tbl, i = 0; i < adb->tblcount; i++, atbl++) {
     if (atbl->value == selector) {
@@ -260,16 +260,16 @@
     }
   }
 
-  /* FIXME: need to search application table too */
+  // FIXME: need to search application table too
 
-  /* No match, return default type */
+  // No match, return default type
   if (!adb->default_tt) {
     goto err;
   }
   return adb->default_tt;
 
 err:
-  /* FIXME: should log the value or OID of unsupported type */
+  // FIXME: should log the value or OID of unsupported type
   if (nullerr) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE);
   }
diff --git a/crypto/asn1/time_support.c b/crypto/asn1/time_support.c
index 5703a54..7929970 100644
--- a/crypto/asn1/time_support.c
+++ b/crypto/asn1/time_support.c
@@ -56,7 +56,7 @@
  * Hudson (tjh@cryptsoft.com). */
 
 #if defined(__linux__) && !defined(_POSIX_C_SOURCE)
-#define _POSIX_C_SOURCE 201410L /* for gmtime_r */
+#define _POSIX_C_SOURCE 201410L  // for gmtime_r
 #endif
 
 #include "internal.h"
@@ -77,7 +77,7 @@
 #endif
 }
 
-/* Convert date to and from julian day Uses Fliegel & Van Flandern algorithm */
+// Convert date to and from julian day Uses Fliegel & Van Flandern algorithm
 static long date_to_julian(int y, int m, int d) {
   return (1461 * (y + 4800 + (m - 14) / 12)) / 4 +
          (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 -
@@ -99,20 +99,20 @@
   *y = 100 * (n - 49) + i + L;
 }
 
-/* Convert tm structure and offset into julian day and seconds */
+// Convert tm structure and offset into julian day and seconds
 static int julian_adj(const struct tm *tm, int off_day, long offset_sec,
                       long *pday, int *psec) {
   int offset_hms, offset_day;
   long time_jd;
   int time_year, time_month, time_day;
-  /* split offset into days and day seconds */
+  // split offset into days and day seconds
   offset_day = offset_sec / SECS_PER_DAY;
-  /* Avoid sign issues with % operator */
+  // Avoid sign issues with % operator
   offset_hms = offset_sec - (offset_day * SECS_PER_DAY);
   offset_day += off_day;
-  /* Add current time seconds to offset */
+  // Add current time seconds to offset
   offset_hms += tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec;
-  /* Adjust day seconds if overflow */
+  // Adjust day seconds if overflow
   if (offset_hms >= SECS_PER_DAY) {
     offset_day++;
     offset_hms -= SECS_PER_DAY;
@@ -121,7 +121,7 @@
     offset_hms += SECS_PER_DAY;
   }
 
-  /* Convert date of time structure into a Julian day number. */
+  // Convert date of time structure into a Julian day number.
 
   time_year = tm->tm_year + 1900;
   time_month = tm->tm_mon + 1;
@@ -129,7 +129,7 @@
 
   time_jd = date_to_julian(time_year, time_month, time_day);
 
-  /* Work out Julian day of new date */
+  // Work out Julian day of new date
   time_jd += offset_day;
 
   if (time_jd < 0) {
@@ -145,12 +145,12 @@
   int time_sec, time_year, time_month, time_day;
   long time_jd;
 
-  /* Convert time and offset into julian day and seconds */
+  // Convert time and offset into julian day and seconds
   if (!julian_adj(tm, off_day, offset_sec, &time_jd, &time_sec)) {
     return 0;
   }
 
-  /* Convert Julian day back to date */
+  // Convert Julian day back to date
 
   julian_to_date(time_jd, &time_year, &time_month, &time_day);
 
@@ -158,7 +158,7 @@
     return 0;
   }
 
-  /* Update tm structure */
+  // Update tm structure
 
   tm->tm_year = time_year - 1900;
   tm->tm_mon = time_month - 1;
@@ -185,7 +185,7 @@
 
   diff_day = to_jd - from_jd;
   diff_sec = to_sec - from_sec;
-  /* Adjust differences so both positive or both negative */
+  // Adjust differences so both positive or both negative
   if (diff_day > 0 && diff_sec < 0) {
     diff_day--;
     diff_sec += SECS_PER_DAY;
diff --git a/crypto/pem/pem_all.c b/crypto/pem/pem_all.c
index e211d5d..cade0a2 100644
--- a/crypto/pem/pem_all.c
+++ b/crypto/pem/pem_all.c
@@ -127,12 +127,10 @@
 IMPLEMENT_PEM_rw(X509_CRL, X509_CRL, PEM_STRING_X509_CRL, X509_CRL)
 IMPLEMENT_PEM_rw(PKCS7, PKCS7, PEM_STRING_PKCS7, PKCS7)
 
-/*
- * We treat RSA or DSA private keys as a special case. For private keys we
- * read in an EVP_PKEY structure with PEM_read_bio_PrivateKey() and extract
- * the relevant private key: this means can handle "traditional" and PKCS#8
- * formats transparently.
- */
+// We treat RSA or DSA private keys as a special case. For private keys we
+// read in an EVP_PKEY structure with PEM_read_bio_PrivateKey() and extract
+// the relevant private key: this means can handle "traditional" and PKCS#8
+// formats transparently.
 static RSA *pkey_get_rsa(EVP_PKEY *key, RSA **rsa) {
   RSA *rtmp;
   if (!key) {
@@ -190,7 +188,7 @@
                                 void *u) {
   EVP_PKEY *pktmp;
   pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
-  return pkey_get_dsa(pktmp, dsa); /* will free pktmp */
+  return pkey_get_dsa(pktmp, dsa);  // will free pktmp
 }
 
 IMPLEMENT_PEM_write_cb_const(DSAPrivateKey, DSA, PEM_STRING_DSA, DSAPrivateKey)
@@ -199,7 +197,7 @@
 DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **dsa, pem_password_cb *cb, void *u) {
   EVP_PKEY *pktmp;
   pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
-  return pkey_get_dsa(pktmp, dsa); /* will free pktmp */
+  return pkey_get_dsa(pktmp, dsa);  // will free pktmp
 }
 
 IMPLEMENT_PEM_rw_const(DSAparams, DSA, PEM_STRING_DSAPARAMS, DSAparams)
@@ -225,7 +223,7 @@
                                   void *u) {
   EVP_PKEY *pktmp;
   pktmp = PEM_read_bio_PrivateKey(bp, NULL, cb, u);
-  return pkey_get_eckey(pktmp, key); /* will free pktmp */
+  return pkey_get_eckey(pktmp, key);  // will free pktmp
 }
 
 IMPLEMENT_PEM_write_cb(ECPrivateKey, EC_KEY, PEM_STRING_ECPRIVATEKEY,
@@ -236,7 +234,7 @@
                               void *u) {
   EVP_PKEY *pktmp;
   pktmp = PEM_read_PrivateKey(fp, NULL, cb, u);
-  return pkey_get_eckey(pktmp, eckey); /* will free pktmp */
+  return pkey_get_eckey(pktmp, eckey);  // will free pktmp
 }
 
 
diff --git a/crypto/pem/pem_info.c b/crypto/pem/pem_info.c
index 40f34ee..e30faa3 100644
--- a/crypto/pem/pem_info.c
+++ b/crypto/pem/pem_info.c
@@ -185,7 +185,7 @@
       key_type = EVP_PKEY_EC;
     }
 
-    /* If a private key has a header, assume it is encrypted. */
+    // If a private key has a header, assume it is encrypted.
     if (key_type != EVP_PKEY_NONE && strlen(header) > 10) {
       if (info->x_pkey != NULL) {
         if (!sk_X509_INFO_push(ret, info)) {
@@ -196,7 +196,7 @@
           goto err;
         }
       }
-      /* Historically, raw entries pushed an empty key. */
+      // Historically, raw entries pushed an empty key.
       info->x_pkey = X509_PKEY_new();
       if (info->x_pkey == NULL ||
           !PEM_get_EVP_CIPHER_INFO(header, &info->enc_cipher)) {
@@ -235,7 +235,7 @@
     data = NULL;
   }
 
-  /* Push the last entry on the stack if not empty. */
+  // Push the last entry on the stack if not empty.
   if (info->x509 != NULL || info->crl != NULL || info->x_pkey != NULL ||
       info->enc_data != NULL) {
     if (!sk_X509_INFO_push(ret, info)) {
@@ -264,7 +264,7 @@
   return ret;
 }
 
-/* A TJH addition */
+// A TJH addition
 int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc,
                             unsigned char *kstr, int klen, pem_password_cb *cb,
                             void *u) {
@@ -284,11 +284,9 @@
     }
   }
 
-  /*
-   * now for the fun part ... if we have a private key then we have to be
-   * able to handle a not-yet-decrypted key being written out correctly ...
-   * if it is decrypted or it is non-encrypted then we use the base code
-   */
+  // now for the fun part ... if we have a private key then we have to be
+  // able to handle a not-yet-decrypted key being written out correctly ...
+  // if it is decrypted or it is non-encrypted then we use the base code
   if (xi->x_pkey != NULL) {
     if ((xi->enc_data != NULL) && (xi->enc_len > 0)) {
       if (enc == NULL) {
@@ -296,36 +294,34 @@
         goto err;
       }
 
-      /* copy from weirdo names into more normal things */
+      // copy from weirdo names into more normal things
       iv = xi->enc_cipher.iv;
       data = (unsigned char *)xi->enc_data;
       i = xi->enc_len;
 
-      /*
-       * we take the encryption data from the internal stuff rather
-       * than what the user has passed us ... as we have to match
-       * exactly for some strange reason
-       */
+      // we take the encryption data from the internal stuff rather
+      // than what the user has passed us ... as we have to match
+      // exactly for some strange reason
       objstr = OBJ_nid2sn(EVP_CIPHER_nid(xi->enc_cipher.cipher));
       if (objstr == NULL) {
         OPENSSL_PUT_ERROR(PEM, PEM_R_UNSUPPORTED_CIPHER);
         goto err;
       }
 
-      /* create the right magic header stuff */
+      // create the right magic header stuff
       assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf);
       buf[0] = '\0';
       PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
       PEM_dek_info(buf, objstr, iv_len, (char *)iv);
 
-      /* use the normal code to write things out */
+      // use the normal code to write things out
       i = PEM_write_bio(bp, PEM_STRING_RSA, buf, data, i);
       if (i <= 0) {
         goto err;
       }
     } else {
-      /* Add DSA/DH */
-      /* normal optionally encrypted stuff */
+      // Add DSA/DH
+      // normal optionally encrypted stuff
       if (PEM_write_bio_RSAPrivateKey(bp, xi->x_pkey->dec_pkey->pkey.rsa, enc,
                                       kstr, klen, cb, u) <= 0) {
         goto err;
@@ -333,16 +329,14 @@
     }
   }
 
-  /* if we have a certificate then write it out now */
+  // if we have a certificate then write it out now
   if ((xi->x509 != NULL) && (PEM_write_bio_X509(bp, xi->x509) <= 0)) {
     goto err;
   }
 
-  /*
-   * we are ignoring anything else that is loaded into the X509_INFO
-   * structure for the moment ... as I don't need it so I'm not coding it
-   * here and Eric can do it when this makes it into the base library --tjh
-   */
+  // we are ignoring anything else that is loaded into the X509_INFO
+  // structure for the moment ... as I don't need it so I'm not coding it
+  // here and Eric can do it when this makes it into the base library --tjh
 
   ret = 1;
 
diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c
index 1f7c05f..f1d0798 100644
--- a/crypto/pem/pem_lib.c
+++ b/crypto/pem/pem_lib.c
@@ -130,12 +130,12 @@
 }
 
 static int check_pem(const char *nm, const char *name) {
-  /* Normal matching nm and name */
+  // Normal matching nm and name
   if (!strcmp(nm, name)) {
     return 1;
   }
 
-  /* Make PEM_STRING_EVP_PKEY match any private key */
+  // Make PEM_STRING_EVP_PKEY match any private key
 
   if (!strcmp(name, PEM_STRING_EVP_PKEY)) {
     return !strcmp(nm, PEM_STRING_PKCS8) || !strcmp(nm, PEM_STRING_PKCS8INF) ||
@@ -143,7 +143,7 @@
            !strcmp(nm, PEM_STRING_DSA);
   }
 
-  /* Permit older strings */
+  // Permit older strings
 
   if (!strcmp(nm, PEM_STRING_X509_OLD) && !strcmp(name, PEM_STRING_X509)) {
     return 1;
@@ -154,7 +154,7 @@
     return 1;
   }
 
-  /* Allow normal certs to be read as trusted certs */
+  // Allow normal certs to be read as trusted certs
   if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_X509_TRUSTED)) {
     return 1;
   }
@@ -164,7 +164,7 @@
     return 1;
   }
 
-  /* Some CAs use PKCS#7 with CERTIFICATE headers */
+  // Some CAs use PKCS#7 with CERTIFICATE headers
   if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_PKCS7)) {
     return 1;
   }
@@ -177,7 +177,7 @@
   if (!strcmp(nm, PEM_STRING_X509) && !strcmp(name, PEM_STRING_CMS)) {
     return 1;
   }
-  /* Allow CMS to be read from PKCS#7 headers */
+  // Allow CMS to be read from PKCS#7 headers
   if (!strcmp(nm, PEM_STRING_PKCS7) && !strcmp(name, PEM_STRING_CMS)) {
     return 1;
   }
@@ -187,9 +187,9 @@
 }
 
 static const EVP_CIPHER *cipher_by_name(const char *name) {
-  /* This is similar to the (deprecated) function |EVP_get_cipherbyname|. Note
-   * the PEM code assumes that ciphers have at least 8 bytes of IV, at most 20
-   * bytes of overhead and generally behave like CBC mode. */
+  // This is similar to the (deprecated) function |EVP_get_cipherbyname|. Note
+  // the PEM code assumes that ciphers have at least 8 bytes of IV, at most 20
+  // bytes of overhead and generally behave like CBC mode.
   if (0 == strcmp(name, SN_des_cbc)) {
     return EVP_des_cbc();
   } else if (0 == strcmp(name, SN_des_ede3_cbc)) {
@@ -295,8 +295,8 @@
     dsize = 0;
     goto err;
   }
-  /* dzise + 8 bytes are needed */
-  /* actually it needs the cipher block size extra... */
+  // dzise + 8 bytes are needed
+  // actually it needs the cipher block size extra...
   data = (unsigned char *)OPENSSL_malloc((unsigned int)dsize + 20);
   if (data == NULL) {
     OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE);
@@ -321,13 +321,11 @@
       kstr = (unsigned char *)buf;
     }
     assert(iv_len <= (int)sizeof(iv));
-    if (!RAND_bytes(iv, iv_len)) { /* Generate a salt */
+    if (!RAND_bytes(iv, iv_len)) {  // Generate a salt
       goto err;
     }
-    /*
-     * The 'iv' is used as the iv and as a salt.  It is NOT taken from
-     * the BytesToKey function
-     */
+    // The 'iv' is used as the iv and as a salt.  It is NOT taken from
+    // the BytesToKey function
     if (!EVP_BytesToKey(enc, EVP_md5(), iv, kstr, klen, 1, key, NULL)) {
       goto err;
     }
@@ -341,7 +339,7 @@
     buf[0] = '\0';
     PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
     PEM_dek_info(buf, objstr, iv_len, (char *)iv);
-    /* k=strlen(buf); */
+    // k=strlen(buf);
 
     EVP_CIPHER_CTX_init(&ctx);
     ret = 1;
diff --git a/crypto/pem/pem_oth.c b/crypto/pem/pem_oth.c
index 7cb4e08..8ea05be 100644
--- a/crypto/pem/pem_oth.c
+++ b/crypto/pem/pem_oth.c
@@ -66,7 +66,7 @@
 #include <openssl/rand.h>
 #include <openssl/x509.h>
 
-/* Handle 'other' PEMs: not private keys */
+// Handle 'other' PEMs: not private keys
 
 void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x,
                         pem_password_cb *cb, void *u) {
diff --git a/crypto/pem/pem_pk8.c b/crypto/pem/pem_pk8.c
index 53b2703..5aef6f1 100644
--- a/crypto/pem/pem_pk8.c
+++ b/crypto/pem/pem_pk8.c
@@ -71,12 +71,10 @@
                          const EVP_CIPHER *enc, char *kstr, int klen,
                          pem_password_cb *cb, void *u);
 
-/*
- * These functions write a private key in PKCS#8 format: it is a "drop in"
- * replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'
- * is NULL then it uses the unencrypted private key form. The 'nid' versions
- * uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.
- */
+// These functions write a private key in PKCS#8 format: it is a "drop in"
+// replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'
+// is NULL then it uses the unencrypted private key form. The 'nid' versions
+// uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.
 
 int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr,
                                       int klen, pem_password_cb *cb, void *u) {
diff --git a/crypto/pem/pem_pkey.c b/crypto/pem/pem_pkey.c
index b612304..c4b2ca6 100644
--- a/crypto/pem/pem_pkey.c
+++ b/crypto/pem/pem_pkey.c
@@ -130,9 +130,9 @@
     }
     PKCS8_PRIV_KEY_INFO_free(p8inf);
   } else if (strcmp(nm, PEM_STRING_RSA) == 0) {
-    /* TODO(davidben): d2i_PrivateKey parses PKCS#8 along with the
-     * standalone format. This and the cases below probably should not
-     * accept PKCS#8. */
+    // TODO(davidben): d2i_PrivateKey parses PKCS#8 along with the
+    // standalone format. This and the cases below probably should not
+    // accept PKCS#8.
     ret = d2i_PrivateKey(EVP_PKEY_RSA, x, &p, len);
   } else if (strcmp(nm, PEM_STRING_EC) == 0) {
     ret = d2i_PrivateKey(EVP_PKEY_EC, x, &p, len);
diff --git a/crypto/x509/a_sign.c b/crypto/x509/a_sign.c
index 815d143..21552ea 100644
--- a/crypto/x509/a_sign.c
+++ b/crypto/x509/a_sign.c
@@ -85,7 +85,7 @@
 
   pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
 
-  /* Write out the requested copies of the AlgorithmIdentifier. */
+  // Write out the requested copies of the AlgorithmIdentifier.
   if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) {
     goto err;
   }
@@ -113,10 +113,8 @@
   signature->data = buf_out;
   buf_out = NULL;
   signature->length = outl;
-  /*
-   * In the interests of compatibility, I'll make sure that the bit string
-   * has a 'not-used bits' value of 0
-   */
+  // In the interests of compatibility, I'll make sure that the bit string
+  // has a 'not-used bits' value of 0
   signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
   signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
 err:
diff --git a/crypto/x509/algorithm.c b/crypto/x509/algorithm.c
index b7915ae..16235ee 100644
--- a/crypto/x509/algorithm.c
+++ b/crypto/x509/algorithm.c
@@ -64,7 +64,7 @@
 
 #include "internal.h"
 
-/* Restrict the digests that are allowed in X509 certificates */
+// Restrict the digests that are allowed in X509 certificates
 static int x509_digest_nid_ok(const int digest_nid) {
   switch (digest_nid) {
     case NID_md4:
@@ -86,7 +86,7 @@
     if (!EVP_PKEY_CTX_get_rsa_padding(ctx->pctx, &pad_mode)) {
       return 0;
     }
-    /* RSA-PSS has special signature algorithm logic. */
+    // RSA-PSS has special signature algorithm logic.
     if (pad_mode == RSA_PKCS1_PSS_PADDING) {
       return x509_rsa_ctx_to_pss(ctx, algor);
     }
@@ -96,8 +96,8 @@
     return X509_ALGOR_set0(algor, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, NULL);
   }
 
-  /* Default behavior: look up the OID for the algorithm/hash pair and encode
-   * that. */
+  // Default behavior: look up the OID for the algorithm/hash pair and encode
+  // that.
   const EVP_MD *digest = EVP_MD_CTX_md(ctx);
   if (digest == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_CONTEXT_NOT_INITIALISED);
@@ -112,8 +112,8 @@
     return 0;
   }
 
-  /* RSA signature algorithms include an explicit NULL parameter. Others omit
-   * it. */
+  // RSA signature algorithms include an explicit NULL parameter. Others omit
+  // it.
   int paramtype =
       (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) ? V_ASN1_NULL : V_ASN1_UNDEF;
   X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, NULL);
@@ -122,7 +122,7 @@
 
 int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                             EVP_PKEY *pkey) {
-  /* Convert the signature OID into digest and public key OIDs. */
+  // Convert the signature OID into digest and public key OIDs.
   int sigalg_nid = OBJ_obj2nid(sigalg->algorithm);
   int digest_nid, pkey_nid;
   if (!OBJ_find_sigid_algs(sigalg_nid, &digest_nid, &pkey_nid)) {
@@ -130,19 +130,19 @@
     return 0;
   }
 
-  /* Check the public key OID matches the public key type. */
+  // Check the public key OID matches the public key type.
   if (pkey_nid != EVP_PKEY_id(pkey)) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE);
     return 0;
   }
 
-  /* Check for permitted digest algorithms */
+  // Check for permitted digest algorithms
   if (!x509_digest_nid_ok(digest_nid)) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED);
     return 0;
   }
 
-  /* NID_undef signals that there are custom parameters to set. */
+  // NID_undef signals that there are custom parameters to set.
   if (digest_nid == NID_undef) {
     if (sigalg_nid == NID_rsassaPss) {
       return x509_rsa_pss_to_ctx(ctx, sigalg, pkey);
@@ -158,17 +158,17 @@
     return 0;
   }
 
-  /* The parameter should be an explicit NULL for RSA and omitted for ECDSA. For
-   * compatibility, we allow either for both algorithms. See b/167375496.
-   *
-   * TODO(davidben): Chromium's verifier allows both forms for RSA, but enforces
-   * ECDSA more strictly. Align with Chromium and add a flag for b/167375496. */
+  // The parameter should be an explicit NULL for RSA and omitted for ECDSA. For
+  // compatibility, we allow either for both algorithms. See b/167375496.
+  //
+  // TODO(davidben): Chromium's verifier allows both forms for RSA, but enforces
+  // ECDSA more strictly. Align with Chromium and add a flag for b/167375496.
   if (sigalg->parameter != NULL && sigalg->parameter->type != V_ASN1_NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PARAMETER);
     return 0;
   }
 
-  /* Otherwise, initialize with the digest from the OID. */
+  // Otherwise, initialize with the digest from the OID.
   const EVP_MD *digest = EVP_get_digestbynid(digest_nid);
   if (digest == NULL) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c
index e56da9a..3890c46 100644
--- a/crypto/x509/asn1_gen.c
+++ b/crypto/x509/asn1_gen.c
@@ -68,10 +68,8 @@
 #include "../x509v3/internal.h"
 #include "internal.h"
 
-/*
- * Although this file is in crypto/x509 for layering purposes, it emits
- * errors from the ASN.1 module for OpenSSL compatibility.
- */
+// Although this file is in crypto/x509 for layering purposes, it emits
+// errors from the ASN.1 module for OpenSSL compatibility.
 
 #define ASN1_GEN_FLAG 0x10000
 #define ASN1_GEN_FLAG_IMP (ASN1_GEN_FLAG | 1)
@@ -87,18 +85,18 @@
   { str, sizeof(str) - 1, val }
 
 #define ASN1_FLAG_EXP_MAX 20
-/* Maximum number of nested sequences */
+// Maximum number of nested sequences
 #define ASN1_GEN_SEQ_MAX_DEPTH 50
 
-/* Input formats */
+// Input formats
 
-/* ASCII: default */
+// ASCII: default
 #define ASN1_GEN_FORMAT_ASCII 1
-/* UTF8 */
+// UTF8
 #define ASN1_GEN_FORMAT_UTF8 2
-/* Hex */
+// Hex
 #define ASN1_GEN_FORMAT_HEX 3
-/* List of bits */
+// List of bits
 #define ASN1_GEN_FORMAT_BITLIST 4
 
 struct tag_name_st {
@@ -190,65 +188,61 @@
     return NULL;
   }
 
-  /* If no tagging return base type */
+  // If no tagging return base type
   if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0)) {
     return ret;
   }
 
-  /* Generate the encoding */
+  // Generate the encoding
   cpy_len = i2d_ASN1_TYPE(ret, &orig_der);
   ASN1_TYPE_free(ret);
   ret = NULL;
-  /* Set point to start copying for modified encoding */
+  // Set point to start copying for modified encoding
   cpy_start = orig_der;
 
-  /* Do we need IMPLICIT tagging? */
+  // Do we need IMPLICIT tagging?
   if (asn1_tags.imp_tag != -1) {
-    /* If IMPLICIT we will replace the underlying tag */
-    /* Skip existing tag+len */
+    // If IMPLICIT we will replace the underlying tag
+    // Skip existing tag+len
     r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class, cpy_len);
     if (r & 0x80) {
       goto err;
     }
-    /* Update copy length */
+    // Update copy length
     cpy_len -= cpy_start - orig_der;
-    /*
-     * For IMPLICIT tagging the length should match the original length
-     * and constructed flag should be consistent.
-     */
+    // For IMPLICIT tagging the length should match the original length
+    // and constructed flag should be consistent.
     hdr_constructed = r & V_ASN1_CONSTRUCTED;
-    /*
-     * Work out new length with IMPLICIT tag: ignore constructed because
-     * it will mess up if indefinite length
-     */
+    // Work out new length with IMPLICIT tag: ignore constructed because
+    // it will mess up if indefinite length
     len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag);
   } else {
     len = cpy_len;
   }
 
-  /* Work out length in any EXPLICIT, starting from end */
+  // Work out length in any EXPLICIT, starting from end
 
   for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1;
        i < asn1_tags.exp_count; i++, etmp--) {
-    /* Content length: number of content octets + any padding */
+    // Content length: number of content octets + any padding
     len += etmp->exp_pad;
     etmp->exp_len = len;
-    /* Total object length: length including new header */
+    // Total object length: length including new header
     len = ASN1_object_size(0, len, etmp->exp_tag);
   }
 
-  /* Allocate buffer for new encoding */
+  // Allocate buffer for new encoding
 
   new_der = OPENSSL_malloc(len);
   if (!new_der) {
     goto err;
   }
 
-  /* Generate tagged encoding */
+  // Generate tagged encoding
 
   p = new_der;
 
-  /* Output explicit tags first */
+  // Output explicit tags first
 
   for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count; i++, etmp++) {
     ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len, etmp->exp_tag,
@@ -258,7 +252,7 @@
     }
   }
 
-  /* If IMPLICIT, output tag */
+  // If IMPLICIT, output tag
 
   if (asn1_tags.imp_tag != -1) {
     if (asn1_tags.imp_class == V_ASN1_UNIVERSAL &&
@@ -270,12 +264,12 @@
                     asn1_tags.imp_class);
   }
 
-  /* Copy across original encoding */
+  // Copy across original encoding
   OPENSSL_memcpy(p, cpy_start, cpy_len);
 
   cp = new_der;
 
-  /* Obtain new ASN1_TYPE structure */
+  // Obtain new ASN1_TYPE structure
   ret = d2i_ASN1_TYPE(NULL, &cp, len);
 
 err:
@@ -303,7 +297,7 @@
   }
 
   for (i = 0, p = elem; i < len; p++, i++) {
-    /* Look for the ':' in name value pairs */
+    // Look for the ':' in name value pairs
     if (*p == ':') {
       vstart = p + 1;
       vlen = len - (vstart - elem);
@@ -320,11 +314,11 @@
     return -1;
   }
 
-  /* If this is not a modifier mark end of string and exit */
+  // If this is not a modifier mark end of string and exit
   if (!(utype & ASN1_GEN_FLAG)) {
     arg->utype = utype;
     arg->str = vstart;
-    /* If no value and not end of string, error */
+    // If no value and not end of string, error
     if (!vstart && elem[len]) {
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE);
       return -1;
@@ -334,7 +328,7 @@
 
   switch (utype) {
     case ASN1_GEN_FLAG_IMP:
-      /* Check for illegal multiple IMPLICIT tagging */
+      // Check for illegal multiple IMPLICIT tagging
       if (arg->imp_tag != -1) {
         OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING);
         return -1;
@@ -409,7 +403,7 @@
     return 0;
   }
   tag_num = strtoul(vstart, &eptr, 10);
-  /* Check we haven't gone past max length: should be impossible */
+  // Check we haven't gone past max length: should be impossible
   if (eptr && *eptr && (eptr > vstart + vlen)) {
     return 0;
   }
@@ -418,7 +412,7 @@
     return 0;
   }
   *ptag = tag_num;
-  /* If we have non numeric characters, parse them */
+  // If we have non numeric characters, parse them
   if (eptr) {
     vlen -= eptr - vstart;
   } else {
@@ -457,7 +451,7 @@
   return 1;
 }
 
-/* Handle multiple types: SET and SEQUENCE */
+// Handle multiple types: SET and SEQUENCE
 
 static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,
                              int depth, int *perr) {
@@ -491,9 +485,7 @@
     }
   }
 
-  /*
-   * Now we has a STACK of the components, convert to the correct form
-   */
+  // Now we has a STACK of the components, convert to the correct form
 
   if (utype == V_ASN1_SET) {
     derlen = i2d_ASN1_SET_ANY(sk, &der);
@@ -539,7 +531,7 @@
 static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,
                       int exp_constructed, int exp_pad, int imp_ok) {
   tag_exp_type *exp_tmp;
-  /* Can only have IMPLICIT if permitted */
+  // Can only have IMPLICIT if permitted
   if ((arg->imp_tag != -1) && !imp_ok) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG);
     return 0;
@@ -552,10 +544,8 @@
 
   exp_tmp = &arg->exp_list[arg->exp_count++];
 
-  /*
-   * If IMPLICIT set tag to implicit value then reset implicit tag since it
-   * has been used.
-   */
+  // If IMPLICIT set tag to implicit value then reset implicit tag since it
+  // has been used.
   if (arg->imp_tag != -1) {
     exp_tmp->exp_tag = arg->imp_tag;
     exp_tmp->exp_class = arg->imp_class;
@@ -612,24 +602,24 @@
           ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING),
           ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING),
 
-          /* Special cases */
+          // Special cases
           ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),
           ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),
           ASN1_GEN_STR("SET", V_ASN1_SET),
-          /* type modifiers */
-          /* Explicit tag */
+          // type modifiers
+          // Explicit tag
           ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),
           ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),
-          /* Implicit tag */
+          // Implicit tag
           ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),
           ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),
-          /* OCTET STRING wrapper */
+          // OCTET STRING wrapper
           ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),
-          /* SEQUENCE wrapper */
+          // SEQUENCE wrapper
           ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),
-          /* SET wrapper */
+          // SET wrapper
           ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),
-          /* BIT STRING wrapper */
+          // BIT STRING wrapper
           ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),
           ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),
           ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),
diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c
index e5e72b3..9af3d00 100644
--- a/crypto/x509/by_dir.c
+++ b/crypto/x509/by_dir.c
@@ -98,15 +98,15 @@
                                X509_OBJECT *ret);
 static X509_LOOKUP_METHOD x509_dir_lookup = {
     "Load certs from files in a directory",
-    new_dir,             /* new */
-    free_dir,            /* free */
-    NULL,                /* init */
-    NULL,                /* shutdown */
-    dir_ctrl,            /* ctrl */
-    get_cert_by_subject, /* get_by_subject */
-    NULL,                /* get_by_issuer_serial */
-    NULL,                /* get_by_fingerprint */
-    NULL,                /* get_by_alias */
+    new_dir,              // new
+    free_dir,             // free
+    NULL,                 // init
+    NULL,                 // shutdown
+    dir_ctrl,             // ctrl
+    get_cert_by_subject,  // get_by_subject
+    NULL,                 // get_by_issuer_serial
+    NULL,                 // get_by_fingerprint
+    NULL,                 // get_by_alias
 };
 
 X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void) { return (&x509_dir_lookup); }
@@ -247,10 +247,8 @@
   return 1;
 }
 
-/*
- * g_ent_hashes_lock protects the |hashes| member of all |BY_DIR_ENTRY|
- * objects.
- */
+// g_ent_hashes_lock protects the |hashes| member of all |BY_DIR_ENTRY|
+// objects.
 static struct CRYPTO_STATIC_MUTEX g_ent_hashes_lock = CRYPTO_STATIC_MUTEX_INIT;
 
 static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
@@ -337,23 +335,19 @@
 #ifdef OPENSSL_SYS_VMS
         c = ent->dir[strlen(ent->dir) - 1];
         if (c != ':' && c != '>' && c != ']') {
-          /*
-           * If no separator is present, we assume the directory
-           * specifier is a logical name, and add a colon.  We
-           * really should use better VMS routines for merging
-           * things like this, but this will do for now... --
-           * Richard Levitte
-           */
+          // If no separator is present, we assume the directory
+          // specifier is a logical name, and add a colon.  We
+          // really should use better VMS routines for merging
+          // things like this, but this will do for now... --
+          // Richard Levitte
           c = ':';
         } else {
           c = '\0';
         }
 #endif
         if (c == '\0') {
-          /*
-           * This is special.  When c == '\0', no directory
-           * separator should be added.
-           */
+          // This is special.  When c == '\0', no directory
+          // separator should be added.
           BIO_snprintf(b->data, b->max, "%s%08lx.%s%d", ent->dir, h, postfix,
                        k);
         } else {
@@ -371,7 +365,7 @@
           }
         }
 #endif
-        /* found one. */
+        // found one.
         if (type == X509_LU_X509) {
           if ((X509_load_cert_file(xl, b->data, ent->dir_type)) == 0) {
             break;
@@ -381,13 +375,11 @@
             break;
           }
         }
-        /* else case will caught higher up */
+        // else case will caught higher up
         k++;
       }
 
-      /*
-       * we have added it to the cache so now pull it out again
-       */
+      // we have added it to the cache so now pull it out again
       CRYPTO_MUTEX_lock_write(&xl->store_ctx->objs_lock);
       tmp = NULL;
       sk_X509_OBJECT_sort(xl->store_ctx->objs);
@@ -396,16 +388,12 @@
       }
       CRYPTO_MUTEX_unlock_write(&xl->store_ctx->objs_lock);
 
-      /*
-       * If a CRL, update the last file suffix added for this
-       */
+      // If a CRL, update the last file suffix added for this
 
       if (type == X509_LU_CRL) {
         CRYPTO_STATIC_MUTEX_lock_write(&g_ent_hashes_lock);
-        /*
-         * Look for entry again in case another thread added an entry
-         * first.
-         */
+        // Look for entry again in case another thread added an entry
+        // first.
         if (!hent) {
           htmp.hash = h;
           sk_BY_DIR_HASH_sort(ent->hashes);
@@ -441,20 +429,15 @@
         ret->type = tmp->type;
         OPENSSL_memcpy(&ret->data, &tmp->data, sizeof(ret->data));
 
-        /*
-         * Clear any errors that might have been raised processing empty
-         * or malformed files.
-         */
+        // Clear any errors that might have been raised processing empty
+        // or malformed files.
         ERR_clear_error();
 
-        /*
-         * If we were going to up the reference count, we would need
-         * to do it on a perl 'type' basis
-         */
-        /*
-         * CRYPTO_add(&tmp->data.x509->references,1,
-         * CRYPTO_LOCK_X509);
-         */
+        // If we were going to up the reference count, we would need
+        // to do it on a perl 'type' basis
+        //
+        // CRYPTO_add(&tmp->data.x509->references,1,
+        // CRYPTO_LOCK_X509);
         goto finish;
       }
     }
diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c
index d45c96f..fe19dbd 100644
--- a/crypto/x509/by_file.c
+++ b/crypto/x509/by_file.c
@@ -69,15 +69,15 @@
                         char **ret);
 static X509_LOOKUP_METHOD x509_file_lookup = {
     "Load file into cache",
-    NULL,         /* new */
-    NULL,         /* free */
-    NULL,         /* init */
-    NULL,         /* shutdown */
-    by_file_ctrl, /* ctrl */
-    NULL,         /* get_by_subject */
-    NULL,         /* get_by_issuer_serial */
-    NULL,         /* get_by_fingerprint */
-    NULL,         /* get_by_alias */
+    NULL,          // new
+    NULL,          // free
+    NULL,          // init
+    NULL,          // shutdown
+    by_file_ctrl,  // ctrl
+    NULL,          // get_by_subject
+    NULL,          // get_by_issuer_serial
+    NULL,          // get_by_fingerprint
+    NULL,          // get_by_alias
 };
 
 X509_LOOKUP_METHOD *X509_LOOKUP_file(void) { return (&x509_file_lookup); }
@@ -291,4 +291,4 @@
   return count;
 }
 
-#endif /* OPENSSL_NO_STDIO */
+#endif  // OPENSSL_NO_STDIO
diff --git a/crypto/x509/i2d_pr.c b/crypto/x509/i2d_pr.c
index 456ab8b..3c8887f 100644
--- a/crypto/x509/i2d_pr.c
+++ b/crypto/x509/i2d_pr.c
@@ -72,10 +72,8 @@
     case EVP_PKEY_DSA:
       return i2d_DSAPrivateKey(a->pkey.dsa, pp);
     default:
-      /*
-       * Although this file is in crypto/x509 for layering reasons, it emits
-       * an error code from ASN1 for OpenSSL compatibility.
-       */
+      // Although this file is in crypto/x509 for layering reasons, it emits
+      // an error code from ASN1 for OpenSSL compatibility.
       OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);
       return -1;
   }
diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h
index 0f77fa0..6ac8a3f 100644
--- a/crypto/x509/internal.h
+++ b/crypto/x509/internal.h
@@ -70,7 +70,7 @@
 #endif
 
 
-/* Internal structures. */
+// Internal structures.
 
 typedef struct X509_val_st {
   ASN1_TIME *notBefore;
@@ -372,44 +372,44 @@
 int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent);
 
 
-/* RSA-PSS functions. */
+// RSA-PSS functions.
 
-/* x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
- * signature algorithm parameters in |sigalg| (which must have type
- * |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
- * error. */
+// x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
+// signature algorithm parameters in |sigalg| (which must have type
+// |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
+// error.
 int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                         EVP_PKEY *pkey);
 
-/* x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
- * |ctx|, which must have been configured for an RSA-PSS signing operation. It
- * returns one on success and zero on error. */
+// x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
+// |ctx|, which must have been configured for an RSA-PSS signing operation. It
+// returns one on success and zero on error.
 int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor);
 
-/* x509_print_rsa_pss_params prints a human-readable representation of RSA-PSS
- * parameters in |sigalg| to |bp|. It returns one on success and zero on
- * error. */
+// x509_print_rsa_pss_params prints a human-readable representation of RSA-PSS
+// parameters in |sigalg| to |bp|. It returns one on success and zero on
+// error.
 int x509_print_rsa_pss_params(BIO *bp, const X509_ALGOR *sigalg, int indent,
                               ASN1_PCTX *pctx);
 
 
-/* Signature algorithm functions. */
+// Signature algorithm functions.
 
-/* x509_digest_sign_algorithm encodes the signing parameters of |ctx| as an
- * AlgorithmIdentifer and saves the result in |algor|. It returns one on
- * success, or zero on error. */
+// x509_digest_sign_algorithm encodes the signing parameters of |ctx| as an
+// AlgorithmIdentifer and saves the result in |algor|. It returns one on
+// success, or zero on error.
 int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor);
 
-/* x509_digest_verify_init sets up |ctx| for a signature verification operation
- * with public key |pkey| and parameters from |algor|. The |ctx| argument must
- * have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
- * zero on error. */
+// x509_digest_verify_init sets up |ctx| for a signature verification operation
+// with public key |pkey| and parameters from |algor|. The |ctx| argument must
+// have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
+// zero on error.
 int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg,
                             EVP_PKEY *pkey);
 
 
 #if defined(__cplusplus)
-} /* extern C */
+}  // extern C
 #endif
 
-#endif /* OPENSSL_HEADER_X509_INTERNAL_H */
+#endif  // OPENSSL_HEADER_X509_INTERNAL_H
diff --git a/crypto/x509/name_print.c b/crypto/x509/name_print.c
index 9ca3a99..f871df9 100644
--- a/crypto/x509/name_print.c
+++ b/crypto/x509/name_print.c
@@ -65,11 +65,11 @@
 
 
 static int maybe_write(BIO *out, const void *buf, int len) {
-  /* If |out| is NULL, ignore the output but report the length. */
+  // If |out| is NULL, ignore the output but report the length.
   return out == NULL || BIO_write(out, buf, len) == len;
 }
 
-/* do_indent prints |indent| spaces to |out|. */
+// do_indent prints |indent| spaces to |out|.
 static int do_indent(BIO *out, int indent) {
   for (int i = 0; i < indent; i++) {
     if (!maybe_write(out, " ", 1)) {
@@ -179,7 +179,7 @@
       int objlen, fld_len;
       if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
         OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1);
-        fld_len = 0; /* XXX: what should this be? */
+        fld_len = 0;  // XXX: what should this be?
         objbuf = objtmp;
       } else {
         if (fn_opt == XN_FLAG_FN_SN) {
@@ -189,7 +189,7 @@
           fld_len = FN_WIDTH_LN;
           objbuf = OBJ_nid2ln(fn_nid);
         } else {
-          fld_len = 0; /* XXX: what should this be? */
+          fld_len = 0;  // XXX: what should this be?
           objbuf = "";
         }
       }
@@ -208,11 +208,9 @@
       }
       outlen += objlen + sep_eq_len;
     }
-    /*
-     * If the field name is unknown then fix up the DER dump flag. We
-     * might want to limit this further so it will DER dump on anything
-     * other than a few 'standard' fields.
-     */
+    // If the field name is unknown then fix up the DER dump flag. We
+    // might want to limit this further so it will DER dump on anything
+    // other than a few 'standard' fields.
     if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS)) {
       orflags = ASN1_STRFLGS_DUMP_ALL;
     } else {
@@ -240,8 +238,8 @@
                           unsigned long flags) {
   BIO *bio = NULL;
   if (fp != NULL) {
-    /* If |fp| is NULL, this function returns the number of bytes without
-     * writing. */
+    // If |fp| is NULL, this function returns the number of bytes without
+    // writing.
     bio = BIO_new_fp(fp, BIO_NOCLOSE);
     if (bio == NULL) {
       return -1;
diff --git a/crypto/x509/rsa_pss.c b/crypto/x509/rsa_pss.c
index 8c50344..049e6bc 100644
--- a/crypto/x509/rsa_pss.c
+++ b/crypto/x509/rsa_pss.c
@@ -86,7 +86,7 @@
 IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS)
 
 
-/* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
+// Given an MGF1 Algorithm ID decode to an Algorithm Identifier
 static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg) {
   if (alg == NULL || alg->parameter == NULL ||
       OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
@@ -118,7 +118,7 @@
   return pss;
 }
 
-/* allocate and set algorithm ID from EVP_MD, default SHA1 */
+// allocate and set algorithm ID from EVP_MD, default SHA1
 static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md) {
   if (EVP_MD_type(md) == NID_sha1) {
     return 1;
@@ -131,7 +131,7 @@
   return 1;
 }
 
-/* Allocate and set MGF1 algorithm ID from EVP_MD */
+// Allocate and set MGF1 algorithm ID from EVP_MD
 static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md) {
   X509_ALGOR *algtmp = NULL;
   ASN1_STRING *stmp = NULL;
@@ -140,7 +140,7 @@
   if (EVP_MD_type(mgf1md) == NID_sha1) {
     return 1;
   }
-  /* need to embed algorithm ID inside another */
+  // need to embed algorithm ID inside another
   if (!rsa_md_to_algor(&algtmp, mgf1md) ||
       !ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp)) {
     goto err;
@@ -162,7 +162,7 @@
   return 0;
 }
 
-/* convert algorithm ID to EVP_MD, default SHA1 */
+// convert algorithm ID to EVP_MD, default SHA1
 static const EVP_MD *rsa_algor_to_md(X509_ALGOR *alg) {
   const EVP_MD *md;
   if (!alg) {
@@ -175,14 +175,14 @@
   return md;
 }
 
-/* convert MGF1 algorithm ID to EVP_MD, default SHA1 */
+// convert MGF1 algorithm ID to EVP_MD, default SHA1
 static const EVP_MD *rsa_mgf1_to_md(const X509_ALGOR *alg,
                                     X509_ALGOR *maskHash) {
   const EVP_MD *md;
   if (!alg) {
     return EVP_sha1();
   }
-  /* Check mask and lookup mask hash algorithm */
+  // Check mask and lookup mask hash algorithm
   if (OBJ_obj2nid(alg->algorithm) != NID_mgf1 || maskHash == NULL) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     return NULL;
@@ -239,7 +239,7 @@
     goto err;
   }
 
-  /* Finally create string with pss parameter encoding. */
+  // Finally create string with pss parameter encoding.
   if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os)) {
     goto err;
   }
@@ -258,7 +258,7 @@
                         EVP_PKEY *pkey) {
   assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
 
-  /* Decode PSS parameters */
+  // Decode PSS parameters
   int ret = 0;
   X509_ALGOR *maskHash;
   RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg, &maskHash);
@@ -277,16 +277,16 @@
   if (pss->saltLength != NULL) {
     saltlen = ASN1_INTEGER_get(pss->saltLength);
 
-    /* Could perform more salt length sanity checks but the main
-     * RSA routines will trap other invalid values anyway. */
+    // Could perform more salt length sanity checks but the main
+    // RSA routines will trap other invalid values anyway.
     if (saltlen < 0) {
       OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
       goto err;
     }
   }
 
-  /* low-level routines support only trailer field 0xbc (value 1)
-   * and PKCS#1 says we should reject any other value anyway. */
+  // low-level routines support only trailer field 0xbc (value 1)
+  // and PKCS#1 says we should reject any other value anyway.
   if (pss->trailerField != NULL && ASN1_INTEGER_get(pss->trailerField) != 1) {
     OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
     goto err;
diff --git a/crypto/x509/t_x509.c b/crypto/x509/t_x509.c
index 63cb444..fd83cdb 100644
--- a/crypto/x509/t_x509.c
+++ b/crypto/x509/t_x509.c
@@ -139,7 +139,7 @@
         goto err;
       }
     } else {
-      ERR_clear_error(); /* Clear |ASN1_INTEGER_get_uint64|'s error. */
+      ERR_clear_error();  // Clear |ASN1_INTEGER_get_uint64|'s error.
       neg = (serial->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : "";
       if (BIO_printf(bp, "\n%12s%s", "", neg) <= 0) {
         goto err;
@@ -276,9 +276,7 @@
   int i;
   unsigned char SHA1md[SHA_DIGEST_LENGTH];
 
-  /*
-   * display the hash of the subject as it would appear in OCSP requests
-   */
+  // display the hash of the subject as it would appear in OCSP requests
   if (BIO_printf(bp, "        Subject OCSP hash: ") <= 0) {
     goto err;
   }
@@ -299,9 +297,7 @@
   OPENSSL_free(der);
   der = NULL;
 
-  /*
-   * display the hash of the public key as it would appear in OCSP requests
-   */
+  // display the hash of the public key as it would appear in OCSP requests
   if (BIO_printf(bp, "\n        Public key OCSP hash: ") <= 0) {
     goto err;
   }
@@ -335,7 +331,7 @@
     return 0;
   }
 
-  /* RSA-PSS signatures have parameters to print. */
+  // RSA-PSS signatures have parameters to print.
   int sig_nid = OBJ_obj2nid(sigalg->algorithm);
   if (sig_nid == NID_rsassaPss &&
       !x509_print_rsa_pss_params(bp, sigalg, 9, 0)) {
@@ -362,7 +358,7 @@
     OPENSSL_free(b);
     return 1;
   }
-  s = b + 1; /* skip the first slash */
+  s = b + 1;  // skip the first slash
 
   c = s;
   for (;;) {
@@ -374,7 +370,7 @@
       if (BIO_write(bp, c, i) != i) {
         goto err;
       }
-      c = s + 1; /* skip following slash */
+      c = s + 1;  // skip following slash
       if (*s != '\0') {
         if (BIO_write(bp, ", ", 2) != 2) {
           goto err;
diff --git a/crypto/x509/t_x509a.c b/crypto/x509/t_x509a.c
index f8495e3..956b9a0 100644
--- a/crypto/x509/t_x509a.c
+++ b/crypto/x509/t_x509a.c
@@ -63,7 +63,7 @@
 #include "internal.h"
 
 
-/* X509_CERT_AUX and string set routines */
+// X509_CERT_AUX and string set routines
 
 int X509_CERT_AUX_print(BIO *out, X509_CERT_AUX *aux, int indent) {
   char oidstr[80], first;
diff --git a/crypto/x509/x509.c b/crypto/x509/x509.c
index 0ae368e..f6b8fab 100644
--- a/crypto/x509/x509.c
+++ b/crypto/x509/x509.c
@@ -61,8 +61,8 @@
 #include <openssl/mem.h>
 
 
-/* |X509_R_UNSUPPORTED_ALGORITHM| is no longer emitted, but continue to define
- * it to avoid downstream churn. */
+// |X509_R_UNSUPPORTED_ALGORITHM| is no longer emitted, but continue to define
+// it to avoid downstream churn.
 OPENSSL_DECLARE_ERROR_REASON(X509, UNSUPPORTED_ALGORITHM)
 
 int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent) {
diff --git a/crypto/x509/x509_att.c b/crypto/x509/x509_att.c
index 3824a6e..0942196 100644
--- a/crypto/x509/x509_att.c
+++ b/crypto/x509/x509_att.c
@@ -304,11 +304,9 @@
     }
     atype = attrtype;
   }
-  /*
-   * This is a bit naughty because the attribute should really have at
-   * least one value but some types use and zero length SET and require
-   * this.
-   */
+  // This is a bit naughty because the attribute should really have at
+  // least one value but some types use and zero length SET and require
+  // this.
   if (attrtype == 0) {
     ASN1_STRING_free(stmp);
     return 1;
diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c
index 788a073..208ce37 100644
--- a/crypto/x509/x509_cmp.c
+++ b/crypto/x509/x509_cmp.c
@@ -132,23 +132,21 @@
   return (X509_NAME_hash_old(x->cert_info->subject));
 }
 
-/*
- * Compare two certificates: they must be identical for this to work. NB:
- * Although "cmp" operations are generally prototyped to take "const"
- * arguments (eg. for use in STACKs), the way X509 handling is - these
- * operations may involve ensuring the hashes are up-to-date and ensuring
- * certain cert information is cached. So this is the point where the
- * "depth-first" constification tree has to halt with an evil cast.
- */
+// Compare two certificates: they must be identical for this to work. NB:
+// Although "cmp" operations are generally prototyped to take "const"
+// arguments (eg. for use in STACKs), the way X509 handling is - these
+// operations may involve ensuring the hashes are up-to-date and ensuring
+// certain cert information is cached. So this is the point where the
+// "depth-first" constification tree has to halt with an evil cast.
 int X509_cmp(const X509 *a, const X509 *b) {
-  /* Fill in the |cert_hash| fields.
-   *
-   * TODO(davidben): This may fail, in which case the the hash will be all
-   * zeros. This produces a consistent comparison (failures are sticky), but
-   * not a good one. OpenSSL now returns -2, but this is not a consistent
-   * comparison and may cause misbehaving sorts by transitivity. For now, we
-   * retain the old OpenSSL behavior, which was to ignore the error. See
-   * https://crbug.com/boringssl/355. */
+  // Fill in the |cert_hash| fields.
+  //
+  // TODO(davidben): This may fail, in which case the the hash will be all
+  // zeros. This produces a consistent comparison (failures are sticky), but
+  // not a good one. OpenSSL now returns -2, but this is not a consistent
+  // comparison and may cause misbehaving sorts by transitivity. For now, we
+  // retain the old OpenSSL behavior, which was to ignore the error. See
+  // https://crbug.com/boringssl/355.
   x509v3_cache_extensions((X509 *)a);
   x509v3_cache_extensions((X509 *)b);
 
@@ -158,7 +156,7 @@
 int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b) {
   int ret;
 
-  /* Ensure canonical encoding is present and up to date */
+  // Ensure canonical encoding is present and up to date
 
   if (!a->canon_enc || a->modified) {
     ret = i2d_X509_NAME((X509_NAME *)a, NULL);
@@ -187,7 +185,7 @@
   unsigned long ret = 0;
   unsigned char md[SHA_DIGEST_LENGTH];
 
-  /* Make sure X509_NAME structure contains valid cached encoding */
+  // Make sure X509_NAME structure contains valid cached encoding
   i2d_X509_NAME(x, NULL);
   if (!EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, EVP_sha1(), NULL)) {
     return 0;
@@ -199,20 +197,18 @@
   return (ret);
 }
 
-/*
- * I now DER encode the name and hash it.  Since I cache the DER encoding,
- * this is reasonably efficient.
- */
+// I now DER encode the name and hash it.  Since I cache the DER encoding,
+// this is reasonably efficient.
 
 unsigned long X509_NAME_hash_old(X509_NAME *x) {
   EVP_MD_CTX md_ctx;
   unsigned long ret = 0;
   unsigned char md[16];
 
-  /* Make sure X509_NAME structure contains valid cached encoding */
+  // Make sure X509_NAME structure contains valid cached encoding
   i2d_X509_NAME(x, NULL);
   EVP_MD_CTX_init(&md_ctx);
-  /* EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); */
+  // EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
   if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL) &&
       EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length) &&
       EVP_DigestFinal_ex(&md_ctx, md, NULL)) {
@@ -225,7 +221,7 @@
   return (ret);
 }
 
-/* Search a stack of X509 for a match */
+// Search a stack of X509 for a match
 X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name,
                                      ASN1_INTEGER *serial) {
   size_t i;
@@ -309,11 +305,9 @@
   return 0;
 }
 
-/*
- * Check a suite B algorithm is permitted: pass in a public key and the NID
- * of its signature (or 0 if no signature). The pflags is a pointer to a
- * flags field which must contain the suite B verification flags.
- */
+// Check a suite B algorithm is permitted: pass in a public key and the NID
+// of its signature (or 0 if no signature). The pflags is a pointer to a
+// flags field which must contain the suite B verification flags.
 
 static int check_suite_b(EVP_PKEY *pkey, int sign_nid, unsigned long *pflags) {
   const EC_GROUP *grp = NULL;
@@ -325,20 +319,18 @@
     return X509_V_ERR_SUITE_B_INVALID_ALGORITHM;
   }
   curve_nid = EC_GROUP_get_curve_name(grp);
-  /* Check curve is consistent with LOS */
-  if (curve_nid == NID_secp384r1) { /* P-384 */
-    /*
-     * Check signature algorithm is consistent with curve.
-     */
+  // Check curve is consistent with LOS
+  if (curve_nid == NID_secp384r1) {  // P-384
+    // Check signature algorithm is consistent with curve.
     if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA384) {
       return X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM;
     }
     if (!(*pflags & X509_V_FLAG_SUITEB_192_LOS)) {
       return X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED;
     }
-    /* If we encounter P-384 we cannot use P-256 later */
+    // If we encounter P-384 we cannot use P-256 later
     *pflags &= ~X509_V_FLAG_SUITEB_128_LOS_ONLY;
-  } else if (curve_nid == NID_X9_62_prime256v1) { /* P-256 */
+  } else if (curve_nid == NID_X9_62_prime256v1) {  // P-256
     if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA256) {
       return X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM;
     }
@@ -362,7 +354,7 @@
     return X509_V_OK;
   }
   tflags = flags;
-  /* If no EE certificate passed in must be first in chain */
+  // If no EE certificate passed in must be first in chain
   if (x == NULL) {
     x = sk_X509_value(chain, 0);
     i = 1;
@@ -372,16 +364,16 @@
 
   if (X509_get_version(x) != X509_VERSION_3) {
     rv = X509_V_ERR_SUITE_B_INVALID_VERSION;
-    /* Correct error depth */
+    // Correct error depth
     i = 0;
     goto end;
   }
 
   pk = X509_get_pubkey(x);
-  /* Check EE key only */
+  // Check EE key only
   rv = check_suite_b(pk, -1, &tflags);
   if (rv != X509_V_OK) {
-    /* Correct error depth */
+    // Correct error depth
     i = 0;
     goto end;
   }
@@ -400,23 +392,21 @@
     }
   }
 
-  /* Final check: root CA signature */
+  // Final check: root CA signature
   rv = check_suite_b(pk, X509_get_signature_nid(x), &tflags);
 end:
   if (pk) {
     EVP_PKEY_free(pk);
   }
   if (rv != X509_V_OK) {
-    /* Invalid signature or LOS errors are for previous cert */
+    // Invalid signature or LOS errors are for previous cert
     if ((rv == X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM ||
          rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED) &&
         i) {
       i--;
     }
-    /*
-     * If we have LOS error and flags changed then we are signing P-384
-     * with P-256. Use more meaninggul error.
-     */
+    // If we have LOS error and flags changed then we are signing P-384
+    // with P-256. Use more meaninggul error.
     if (rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED && flags != tflags) {
       rv = X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256;
     }
@@ -436,11 +426,9 @@
   return check_suite_b(pk, sign_nid, &flags);
 }
 
-/*
- * Not strictly speaking an "up_ref" as a STACK doesn't have a reference
- * count but it has the same effect by duping the STACK and upping the ref of
- * each X509 structure.
- */
+// Not strictly speaking an "up_ref" as a STACK doesn't have a reference
+// count but it has the same effect by duping the STACK and upping the ref of
+// each X509 structure.
 STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain) {
   STACK_OF(X509) *ret;
   size_t i;
diff --git a/crypto/x509/x509_d2.c b/crypto/x509/x509_d2.c
index 7043123..3168330 100644
--- a/crypto/x509/x509_d2.c
+++ b/crypto/x509/x509_d2.c
@@ -74,7 +74,7 @@
   }
   X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
 
-  /* clear any errors */
+  // clear any errors
   ERR_clear_error();
 
   return (1);
diff --git a/crypto/x509/x509_def.c b/crypto/x509/x509_def.c
index 71d2331..ada9af4 100644
--- a/crypto/x509/x509_def.c
+++ b/crypto/x509/x509_def.c
@@ -57,7 +57,7 @@
 
 #include <openssl/x509.h>
 
-/* TODO(fork): cleanup */
+// TODO(fork): cleanup
 
 #if defined(OPENSSL_FUCHSIA)
 #define OPENSSLDIR "/config/ssl"
diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c
index 09661fc..8165d24 100644
--- a/crypto/x509/x509_lu.c
+++ b/crypto/x509/x509_lu.c
@@ -180,7 +180,7 @@
       ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl);
       break;
     default:
-      /* abort(); */
+      // abort();
       return 0;
   }
   return ret;
@@ -241,7 +241,7 @@
   } else if (a->type == X509_LU_CRL) {
     X509_CRL_free(a->data.crl);
   } else {
-    /* abort(); */
+    // abort();
   }
 
   OPENSSL_free(a);
@@ -289,7 +289,7 @@
       return lu;
     }
   }
-  /* a new one */
+  // a new one
   lu = X509_LOOKUP_new(m);
   if (lu == NULL) {
     return NULL;
@@ -328,9 +328,7 @@
     }
   }
 
-  /*
-   * if (ret->data.ptr != NULL) X509_OBJECT_free_contents(ret);
-   */
+  // if (ret->data.ptr != NULL) X509_OBJECT_free_contents(ret);
 
   ret->type = tmp->type;
   ret->data.ptr = tmp->data.ptr;
@@ -364,7 +362,7 @@
 
   int ret = 1;
   int added = 0;
-  /* Duplicates are silently ignored */
+  // Duplicates are silently ignored
   if (!X509_OBJECT_retrieve_match(ctx->objs, obj)) {
     ret = added = (sk_X509_OBJECT_push(ctx->objs, obj) != 0);
   }
@@ -440,7 +438,7 @@
       crl_info_s.issuer = name;
       break;
     default:
-      /* abort(); */
+      // abort();
       return -1;
   }
 
@@ -498,10 +496,8 @@
   CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
   idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
   if (idx < 0) {
-    /*
-     * Nothing found in cache: do lookup to possibly add new objects to
-     * cache
-     */
+    // Nothing found in cache: do lookup to possibly add new objects to
+    // cache
     X509_OBJECT xobj;
     CRYPTO_MUTEX_unlock_write(&ctx->ctx->objs_lock);
     if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) {
@@ -541,7 +537,7 @@
     return NULL;
   }
 
-  /* Always do lookup to possibly add new CRLs to cache. */
+  // Always do lookup to possibly add new CRLs to cache.
   if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) {
     sk_X509_CRL_free(sk);
     return NULL;
@@ -602,13 +598,11 @@
   return NULL;
 }
 
-/*
- * Try to get issuer certificate from store. Due to limitations of the API
- * this can only retrieve a single certificate matching a given subject name.
- * However it will fill the cache with all matching certificates, so we can
- * examine the cache for all matches. Return values are: 1 lookup
- * successful.  0 certificate not found. -1 some other error.
- */
+// Try to get issuer certificate from store. Due to limitations of the API
+// this can only retrieve a single certificate matching a given subject name.
+// However it will fill the cache with all matching certificates, so we can
+// examine the cache for all matches. Return values are: 1 lookup
+// successful.  0 certificate not found. -1 some other error.
 int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) {
   X509_NAME *xn;
   X509_OBJECT obj, *pobj;
@@ -618,23 +612,23 @@
   if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, xn, &obj)) {
     return 0;
   }
-  /* If certificate matches all OK */
+  // If certificate matches all OK
   if (ctx->check_issued(ctx, x, obj.data.x509)) {
     *issuer = obj.data.x509;
     return 1;
   }
   X509_OBJECT_free_contents(&obj);
 
-  /* Else find index of first cert accepted by 'check_issued' */
+  // Else find index of first cert accepted by 'check_issued'
   ret = 0;
   CRYPTO_MUTEX_lock_write(&ctx->ctx->objs_lock);
   idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn);
-  if (idx != -1) { /* should be true as we've had at least one
-                    * match */
-    /* Look through all matching certs for suitable issuer */
+  if (idx != -1) {  // should be true as we've had at least one
+                    // match
+    // Look through all matching certs for suitable issuer
     for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) {
       pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i);
-      /* See if we've run past the matches */
+      // See if we've run past the matches
       if (pobj->type != X509_LU_X509) {
         break;
       }
diff --git a/crypto/x509/x509_obj.c b/crypto/x509/x509_obj.c
index 65463fa..ab8e2d6 100644
--- a/crypto/x509/x509_obj.c
+++ b/crypto/x509/x509_obj.c
@@ -67,10 +67,8 @@
 #include "internal.h"
 
 
-/*
- * Limit to ensure we don't overflow: much greater than
- * anything enountered in practice.
- */
+// Limit to ensure we don't overflow: much greater than
+// anything enountered in practice.
 
 #define NAME_ONELINE_MAX (1024 * 1024)
 
@@ -107,7 +105,7 @@
     return buf;
   }
 
-  len--; /* space for '\0' */
+  len--;  // space for '\0'
   l = 0;
   for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
     ne = sk_X509_NAME_ENTRY_value(a->entries, i);
diff --git a/crypto/x509/x509_req.c b/crypto/x509/x509_req.c
index 778d573..bc8e08d 100644
--- a/crypto/x509/x509_req.c
+++ b/crypto/x509/x509_req.c
@@ -104,7 +104,7 @@
         break;
       }
       if (k->type == EVP_PKEY_DH) {
-        /* No idea */
+        // No idea
         OPENSSL_PUT_ERROR(X509, X509_R_CANT_CHECK_DH_KEY);
         break;
       }
@@ -142,14 +142,12 @@
       NULL, &p, ext->value.sequence->length, ASN1_ITEM_rptr(X509_EXTENSIONS));
 }
 
-/*
- * Add a STACK_OF extensions to a certificate request: allow alternative OIDs
- * in case we want to create a non standard one.
- */
+// Add a STACK_OF extensions to a certificate request: allow alternative OIDs
+// in case we want to create a non standard one.
 
 int X509_REQ_add_extensions_nid(X509_REQ *req,
                                 const STACK_OF(X509_EXTENSION) *exts, int nid) {
-  /* Generate encoding of extensions */
+  // Generate encoding of extensions
   unsigned char *ext = NULL;
   int ext_len =
       ASN1_item_i2d((ASN1_VALUE *)exts, &ext, ASN1_ITEM_rptr(X509_EXTENSIONS));
@@ -161,13 +159,13 @@
   return ret;
 }
 
-/* This is the normal usage: use the "official" OID */
+// This is the normal usage: use the "official" OID
 int X509_REQ_add_extensions(X509_REQ *req,
                             const STACK_OF(X509_EXTENSION) *exts) {
   return X509_REQ_add_extensions_nid(req, exts, NID_ext_req);
 }
 
-/* Request attribute functions */
+// Request attribute functions
 
 int X509_REQ_get_attr_count(const X509_REQ *req) {
   return X509at_get_attr_count(req->req_info->attributes);
diff --git a/crypto/x509/x509_set.c b/crypto/x509/x509_set.c
index 99fbdc3..adc6c32 100644
--- a/crypto/x509/x509_set.c
+++ b/crypto/x509/x509_set.c
@@ -81,7 +81,7 @@
     return 0;
   }
 
-  /* v1(0) is default and is represented by omitting the version. */
+  // v1(0) is default and is represented by omitting the version.
   if (version == X509_VERSION_1) {
     ASN1_INTEGER_free(x->cert_info->version);
     x->cert_info->version = NULL;
diff --git a/crypto/x509/x509_trs.c b/crypto/x509/x509_trs.c
index 9436b2f..49c66c1 100644
--- a/crypto/x509/x509_trs.c
+++ b/crypto/x509/x509_trs.c
@@ -72,11 +72,9 @@
 
 static int obj_trust(int id, X509 *x, int flags);
 
-/*
- * WARNING: the following table should be kept in order of trust and without
- * any gaps so we can just subtract the minimum trust value to get an index
- * into the table
- */
+// WARNING: the following table should be kept in order of trust and without
+// any gaps so we can just subtract the minimum trust value to get an index
+// into the table
 
 static X509_TRUST trstandard[] = {
     {X509_TRUST_COMPAT, 0, trust_compat, (char *)"compatible", 0, NULL},
@@ -109,7 +107,7 @@
   if (id == -1) {
     return 1;
   }
-  /* We get this as a default value */
+  // We get this as a default value
   if (id == 0) {
     int rv;
     rv = obj_trust(NID_anyExtendedKeyUsage, x, 0);
@@ -176,15 +174,13 @@
   X509_TRUST *trtmp;
   char *name_dup;
 
-  /*
-   * This is set according to what we change: application can't set it
-   */
+  // This is set according to what we change: application can't set it
   flags &= ~X509_TRUST_DYNAMIC;
-  /* This will always be set for application modified trust entries */
+  // This will always be set for application modified trust entries
   flags |= X509_TRUST_DYNAMIC_NAME;
-  /* Get existing entry if any */
+  // Get existing entry if any
   idx = X509_TRUST_get_by_id(id);
-  /* Need a new entry */
+  // Need a new entry
   if (idx == -1) {
     if (!(trtmp = OPENSSL_malloc(sizeof(X509_TRUST)))) {
       OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
@@ -195,7 +191,7 @@
     trtmp = X509_TRUST_get0(idx);
   }
 
-  /* Duplicate the supplied name. */
+  // Duplicate the supplied name.
   name_dup = OPENSSL_strdup(name);
   if (name_dup == NULL) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
@@ -205,14 +201,14 @@
     return 0;
   }
 
-  /* OPENSSL_free existing name if dynamic */
+  // OPENSSL_free existing name if dynamic
   if (trtmp->flags & X509_TRUST_DYNAMIC_NAME) {
     OPENSSL_free(trtmp->name);
   }
   trtmp->name = name_dup;
-  /* Keep the dynamic flag of existing entry */
+  // Keep the dynamic flag of existing entry
   trtmp->flags &= X509_TRUST_DYNAMIC;
-  /* Set all other flags */
+  // Set all other flags
   trtmp->flags |= flags;
 
   trtmp->trust = id;
@@ -220,7 +216,7 @@
   trtmp->arg1 = arg1;
   trtmp->arg2 = arg2;
 
-  /* If its a new entry manage the dynamic table */
+  // If its a new entry manage the dynamic table
   if (idx == -1) {
     if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) {
       OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
@@ -267,10 +263,8 @@
   if (x->aux && (x->aux->trust || x->aux->reject)) {
     return obj_trust(trust->arg1, x, flags);
   }
-  /*
-   * we don't have any trust settings: for compatibility we return trusted
-   * if it is self signed
-   */
+  // we don't have any trust settings: for compatibility we return trusted
+  // if it is self signed
   return trust_compat(trust, x, flags);
 }
 
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
index bbbecc6..8569d2a 100644
--- a/crypto/x509/x509_vfy.c
+++ b/crypto/x509/x509_vfy.c
@@ -74,42 +74,42 @@
 static CRYPTO_EX_DATA_CLASS g_ex_data_class =
     CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA;
 
-/* CRL score values */
+// CRL score values
 
-/* No unhandled critical extensions */
+// No unhandled critical extensions
 
 #define CRL_SCORE_NOCRITICAL 0x100
 
-/* certificate is within CRL scope */
+// certificate is within CRL scope
 
 #define CRL_SCORE_SCOPE 0x080
 
-/* CRL times valid */
+// CRL times valid
 
 #define CRL_SCORE_TIME 0x040
 
-/* Issuer name matches certificate */
+// Issuer name matches certificate
 
 #define CRL_SCORE_ISSUER_NAME 0x020
 
-/* If this score or above CRL is probably valid */
+// If this score or above CRL is probably valid
 
 #define CRL_SCORE_VALID \
   (CRL_SCORE_NOCRITICAL | CRL_SCORE_TIME | CRL_SCORE_SCOPE)
 
-/* CRL issuer is certificate issuer */
+// CRL issuer is certificate issuer
 
 #define CRL_SCORE_ISSUER_CERT 0x018
 
-/* CRL issuer is on certificate path */
+// CRL issuer is on certificate path
 
 #define CRL_SCORE_SAME_PATH 0x008
 
-/* CRL issuer matches CRL AKID */
+// CRL issuer matches CRL AKID
 
 #define CRL_SCORE_AKID 0x004
 
-/* Have a delta CRL with valid times */
+// Have a delta CRL with valid times
 
 #define CRL_SCORE_TIME_DELTA 0x002
 
@@ -142,9 +142,9 @@
 
 static int null_callback(int ok, X509_STORE_CTX *e) { return ok; }
 
-/* cert_self_signed checks if |x| is self-signed. If |x| is valid, it returns
- * one and sets |*out_is_self_signed| to the result. If |x| is invalid, it
- * returns zero. */
+// cert_self_signed checks if |x| is self-signed. If |x| is valid, it returns
+// one and sets |*out_is_self_signed| to the result. If |x| is invalid, it
+// returns zero.
 static int cert_self_signed(X509 *x, int *out_is_self_signed) {
   if (!x509v3_cache_extensions(x)) {
     return 0;
@@ -153,18 +153,18 @@
   return 1;
 }
 
-/* Given a certificate try and find an exact match in the store */
+// Given a certificate try and find an exact match in the store
 
 static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x) {
   STACK_OF(X509) *certs;
   X509 *xtmp = NULL;
   size_t i;
-  /* Lookup all certs with matching subject name */
+  // Lookup all certs with matching subject name
   certs = ctx->lookup_certs(ctx, X509_get_subject_name(x));
   if (certs == NULL) {
     return NULL;
   }
-  /* Look for exact match */
+  // Look for exact match
   for (i = 0; i < sk_X509_num(certs); i++) {
     xtmp = sk_X509_value(certs, i);
     if (!X509_cmp(xtmp, x)) {
@@ -194,19 +194,15 @@
     return -1;
   }
   if (ctx->chain != NULL) {
-    /*
-     * This X509_STORE_CTX has already been used to verify a cert. We
-     * cannot do another one.
-     */
+    // This X509_STORE_CTX has already been used to verify a cert. We
+    // cannot do another one.
     OPENSSL_PUT_ERROR(X509, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
     ctx->error = X509_V_ERR_INVALID_CALL;
     return -1;
   }
 
-  /*
-   * first we make sure the chain we are going to build is present and that
-   * the first entry is in place
-   */
+  // first we make sure the chain we are going to build is present and that
+  // the first entry is in place
   ctx->chain = sk_X509_new_null();
   if (ctx->chain == NULL || !sk_X509_push(ctx->chain, ctx->cert)) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
@@ -216,7 +212,7 @@
   X509_up_ref(ctx->cert);
   ctx->last_untrusted = 1;
 
-  /* We use a temporary STACK so we can chop and hack at it. */
+  // We use a temporary STACK so we can chop and hack at it.
   if (ctx->untrusted != NULL && (sktmp = sk_X509_dup(ctx->untrusted)) == NULL) {
     OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
     ctx->error = X509_V_ERR_OUT_OF_MEM;
@@ -228,12 +224,12 @@
   depth = param->depth;
 
   for (;;) {
-    /* If we have enough, we break */
+    // If we have enough, we break
     if (depth < num) {
-      break; /* FIXME: If this happens, we should take
-              * note of it and, if appropriate, use the
-              * X509_V_ERR_CERT_CHAIN_TOO_LONG error code
-              * later. */
+      break;  // FIXME: If this happens, we should take
+              // note of it and, if appropriate, use the
+              // X509_V_ERR_CERT_CHAIN_TOO_LONG error code
+              // later.
     }
 
     int is_self_signed;
@@ -242,30 +238,26 @@
       goto end;
     }
 
-    /* If we are self signed, we break */
+    // If we are self signed, we break
     if (is_self_signed) {
       break;
     }
-    /*
-     * If asked see if we can find issuer in trusted store first
-     */
+    // If asked see if we can find issuer in trusted store first
     if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) {
       ok = ctx->get_issuer(&xtmp, ctx, x);
       if (ok < 0) {
         ctx->error = X509_V_ERR_STORE_LOOKUP;
         goto end;
       }
-      /*
-       * If successful for now free up cert so it will be picked up
-       * again later.
-       */
+      // If successful for now free up cert so it will be picked up
+      // again later.
       if (ok > 0) {
         X509_free(xtmp);
         break;
       }
     }
 
-    /* If we were passed a cert chain, use it first */
+    // If we were passed a cert chain, use it first
     if (sktmp != NULL) {
       xtmp = find_issuer(ctx, sktmp, x);
       if (xtmp != NULL) {
@@ -280,27 +272,21 @@
         ctx->last_untrusted++;
         x = xtmp;
         num++;
-        /*
-         * reparse the full chain for the next one
-         */
+        // reparse the full chain for the next one
         continue;
       }
     }
     break;
   }
 
-  /* Remember how many untrusted certs we have */
+  // Remember how many untrusted certs we have
   j = num;
-  /*
-   * at this point, chain should contain a list of untrusted certificates.
-   * We now need to add at least one trusted one, if possible, otherwise we
-   * complain.
-   */
+  // at this point, chain should contain a list of untrusted certificates.
+  // We now need to add at least one trusted one, if possible, otherwise we
+  // complain.
 
   do {
-    /*
-     * Examine last certificate in chain and see if it is self signed.
-     */
+    // Examine last certificate in chain and see if it is self signed.
     i = sk_X509_num(ctx->chain);
     x = sk_X509_value(ctx->chain, i - 1);
 
@@ -311,13 +297,11 @@
     }
 
     if (is_self_signed) {
-      /* we have a self signed certificate */
+      // we have a self signed certificate
       if (sk_X509_num(ctx->chain) == 1) {
-        /*
-         * We have a single self signed certificate: see if we can
-         * find it in the store. We must have an exact match to avoid
-         * possible impersonation.
-         */
+        // We have a single self signed certificate: see if we can
+        // find it in the store. We must have an exact match to avoid
+        // possible impersonation.
         ok = ctx->get_issuer(&xtmp, ctx, x);
         if ((ok <= 0) || X509_cmp(x, xtmp)) {
           ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
@@ -332,19 +316,15 @@
             goto end;
           }
         } else {
-          /*
-           * We have a match: replace certificate with store
-           * version so we get any trust settings.
-           */
+          // We have a match: replace certificate with store
+          // version so we get any trust settings.
           X509_free(x);
           x = xtmp;
           (void)sk_X509_set(ctx->chain, i - 1, x);
           ctx->last_untrusted = 0;
         }
       } else {
-        /*
-         * extract and save self signed certificate for later use
-         */
+        // extract and save self signed certificate for later use
         chain_ss = sk_X509_pop(ctx->chain);
         ctx->last_untrusted--;
         num--;
@@ -352,9 +332,9 @@
         x = sk_X509_value(ctx->chain, num - 1);
       }
     }
-    /* We now lookup certs from the certificate store */
+    // We now lookup certs from the certificate store
     for (;;) {
-      /* If we have enough, we break */
+      // If we have enough, we break
       if (depth < num) {
         break;
       }
@@ -362,7 +342,7 @@
         ctx->error = X509_V_ERR_INVALID_EXTENSION;
         goto end;
       }
-      /* If we are self signed, we break */
+      // If we are self signed, we break
       if (is_self_signed) {
         break;
       }
@@ -386,20 +366,18 @@
       num++;
     }
 
-    /* we now have our chain, lets check it... */
+    // we now have our chain, lets check it...
     trust = check_trust(ctx);
 
-    /* If explicitly rejected error */
+    // If explicitly rejected error
     if (trust == X509_TRUST_REJECTED) {
       ok = 0;
       goto end;
     }
-    /*
-     * If it's not explicitly trusted then check if there is an alternative
-     * chain that could be used. We only do this if we haven't already
-     * checked via TRUSTED_FIRST and the user hasn't switched off alternate
-     * chain checking
-     */
+    // If it's not explicitly trusted then check if there is an alternative
+    // chain that could be used. We only do this if we haven't already
+    // checked via TRUSTED_FIRST and the user hasn't switched off alternate
+    // chain checking
     retry = 0;
     if (trust != X509_TRUST_TRUSTED &&
         !(ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) &&
@@ -410,17 +388,13 @@
         if (ok < 0) {
           goto end;
         }
-        /* Check if we found an alternate chain */
+        // Check if we found an alternate chain
         if (ok > 0) {
-          /*
-           * Free up the found cert we'll add it again later
-           */
+          // Free up the found cert we'll add it again later
           X509_free(xtmp);
 
-          /*
-           * Dump all the certs above this point - we've found an
-           * alternate chain
-           */
+          // Dump all the certs above this point - we've found an
+          // alternate chain
           while (num > j) {
             xtmp = sk_X509_pop(ctx->chain);
             X509_free(xtmp);
@@ -434,11 +408,9 @@
     }
   } while (retry);
 
-  /*
-   * If not explicitly trusted then indicate error unless it's a single
-   * self signed certificate in which case we've indicated an error already
-   * and set bad_chain == 1
-   */
+  // If not explicitly trusted then indicate error unless it's a single
+  // self signed certificate in which case we've indicated an error already
+  // and set bad_chain == 1
   if (trust != X509_TRUST_TRUSTED && !bad_chain) {
     if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss)) {
       if (ctx->last_untrusted >= num) {
@@ -464,7 +436,7 @@
     }
   }
 
-  /* We have the chain complete: now we need to check its purpose */
+  // We have the chain complete: now we need to check its purpose
   ok = check_chain_extensions(ctx);
 
   if (!ok) {
@@ -477,10 +449,8 @@
     goto end;
   }
 
-  /*
-   * Check revocation status: we do this after copying parameters because
-   * they may be needed for CRL signature verification.
-   */
+  // Check revocation status: we do this after copying parameters because
+  // they may be needed for CRL signature verification.
 
   ok = ctx->check_revocation(ctx);
   if (!ok) {
@@ -498,7 +468,7 @@
     }
   }
 
-  /* At this point, we have a chain and need to verify it */
+  // At this point, we have a chain and need to verify it
   if (ctx->verify != NULL) {
     ok = ctx->verify(ctx);
   } else {
@@ -508,14 +478,14 @@
     goto end;
   }
 
-  /* Check name constraints */
+  // Check name constraints
 
   ok = check_name_constraints(ctx);
   if (!ok) {
     goto end;
   }
 
-  /* If we get this far evaluate policies */
+  // If we get this far evaluate policies
   if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK)) {
     ok = ctx->check_policy(ctx);
   }
@@ -528,16 +498,14 @@
     X509_free(chain_ss);
   }
 
-  /* Safety net, error returns must set ctx->error */
+  // Safety net, error returns must set ctx->error
   if (ok <= 0 && ctx->error == X509_V_OK) {
     ctx->error = X509_V_ERR_UNSPECIFIED;
   }
   return ok;
 }
 
-/*
- * Given a STACK_OF(X509) find the issuer of cert (if any)
- */
+// Given a STACK_OF(X509) find the issuer of cert (if any)
 
 static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x) {
   size_t i;
@@ -551,7 +519,7 @@
   return NULL;
 }
 
-/* Given a possible certificate and issuer check them */
+// Given a possible certificate and issuer check them
 
 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer) {
   int ret;
@@ -559,7 +527,7 @@
   if (ret == X509_V_OK) {
     return 1;
   }
-  /* If we haven't asked for issuer errors don't set ctx */
+  // If we haven't asked for issuer errors don't set ctx
   if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK)) {
     return 0;
   }
@@ -570,7 +538,7 @@
   return ctx->verify_cb(0, ctx);
 }
 
-/* Alternative lookup method: look from a STACK stored in other_ctx */
+// Alternative lookup method: look from a STACK stored in other_ctx
 
 static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) {
   *issuer = find_issuer(ctx, ctx->other_ctx, x);
@@ -582,10 +550,8 @@
   }
 }
 
-/*
- * Check a certificate chains extensions for consistency with the supplied
- * purpose
- */
+// Check a certificate chains extensions for consistency with the supplied
+// purpose
 
 static int check_chain_extensions(X509_STORE_CTX *ctx) {
   int i, ok = 0, plen = 0;
@@ -602,7 +568,7 @@
     must_not_be_ca,
   } ca_requirement;
 
-  /* CRL path validation */
+  // CRL path validation
   if (ctx->parent) {
     allow_proxy_certs = 0;
     purpose = X509_PURPOSE_CRL_SIGN;
@@ -613,7 +579,7 @@
 
   ca_requirement = ca_or_leaf;
 
-  /* Check all untrusted certificates */
+  // Check all untrusted certificates
   for (i = 0; i < ctx->last_untrusted; i++) {
     int ret;
     x = sk_X509_value(ctx->chain, i);
@@ -683,7 +649,7 @@
         }
       }
     }
-    /* Check pathlen if not self issued */
+    // Check pathlen if not self issued
     if ((i > 1) && !(x->ex_flags & EXFLAG_SI) && (x->ex_pathlen != -1) &&
         (plen > (x->ex_pathlen + proxy_path_length + 1))) {
       ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
@@ -694,15 +660,13 @@
         goto end;
       }
     }
-    /* Increment path length if not self issued */
+    // Increment path length if not self issued
     if (!(x->ex_flags & EXFLAG_SI)) {
       plen++;
     }
-    /*
-     * If this certificate is a proxy certificate, the next certificate
-     * must be another proxy certificate or a EE certificate.  If not,
-     * the next certificate must be a CA certificate.
-     */
+    // If this certificate is a proxy certificate, the next certificate
+    // must be another proxy certificate or a EE certificate.  If not,
+    // the next certificate must be a CA certificate.
     if (x->ex_flags & EXFLAG_PROXY) {
       if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) {
         ctx->error = X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
@@ -740,8 +704,8 @@
     if (idlen < 0) {
       return X509_V_ERR_OUT_OF_MEM;
     }
-    /* Only process attributes that look like host names. Note it is
-     * important that this check be mirrored in |X509_check_host|. */
+    // Only process attributes that look like host names. Note it is
+    // important that this check be mirrored in |X509_check_host|.
     int looks_like_dns = x509v3_looks_like_dns_name(idval, (size_t)idlen);
     OPENSSL_free(idval);
     if (looks_like_dns) {
@@ -753,19 +717,17 @@
 static int check_name_constraints(X509_STORE_CTX *ctx) {
   int i, j, rv;
   int has_name_constraints = 0;
-  /* Check name constraints for all certificates */
+  // Check name constraints for all certificates
   for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--) {
     X509 *x = sk_X509_value(ctx->chain, i);
-    /* Ignore self issued certs unless last in chain */
+    // Ignore self issued certs unless last in chain
     if (i && (x->ex_flags & EXFLAG_SI)) {
       continue;
     }
-    /*
-     * Check against constraints for all certificates higher in chain
-     * including trust anchor. Trust anchor not strictly speaking needed
-     * but if it includes constraints it is to be assumed it expects them
-     * to be obeyed.
-     */
+    // Check against constraints for all certificates higher in chain
+    // including trust anchor. Trust anchor not strictly speaking needed
+    // but if it includes constraints it is to be assumed it expects them
+    // to be obeyed.
     for (j = sk_X509_num(ctx->chain) - 1; j > i; j--) {
       NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc;
       if (nc) {
@@ -790,16 +752,16 @@
     }
   }
 
-  /* Name constraints do not match against the common name, but
-   * |X509_check_host| still implements the legacy behavior where, on
-   * certificates lacking a SAN list, DNS-like names in the common name are
-   * checked instead.
-   *
-   * While we could apply the name constraints to the common name, name
-   * constraints are rare enough that can hold such certificates to a higher
-   * standard. Note this does not make "DNS-like" heuristic failures any
-   * worse. A decorative common-name misidentified as a DNS name would fail
-   * the name constraint anyway. */
+  // Name constraints do not match against the common name, but
+  // |X509_check_host| still implements the legacy behavior where, on
+  // certificates lacking a SAN list, DNS-like names in the common name are
+  // checked instead.
+  //
+  // While we could apply the name constraints to the common name, name
+  // constraints are rare enough that can hold such certificates to a higher
+  // standard. Note this does not make "DNS-like" heuristic failures any
+  // worse. A decorative common-name misidentified as a DNS name would fail
+  // the name constraint anyway.
   X509 *leaf = sk_X509_value(ctx->chain, 0);
   if (has_name_constraints && leaf->altname == NULL) {
     rv = reject_dns_name_in_common_name(leaf);
@@ -879,18 +841,16 @@
   size_t i;
   int ok;
   X509 *x = NULL;
-  /* Check all trusted certificates in chain */
+  // Check all trusted certificates in chain
   for (i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++) {
     x = sk_X509_value(ctx->chain, i);
     ok = X509_check_trust(x, ctx->param->trust, 0);
-    /* If explicitly trusted return trusted */
+    // If explicitly trusted return trusted
     if (ok == X509_TRUST_TRUSTED) {
       return X509_TRUST_TRUSTED;
     }
-    /*
-     * If explicitly rejected notify callback and reject if not
-     * overridden.
-     */
+    // If explicitly rejected notify callback and reject if not
+    // overridden.
     if (ok == X509_TRUST_REJECTED) {
       ctx->error_depth = i;
       ctx->current_cert = x;
@@ -901,10 +861,8 @@
       }
     }
   }
-  /*
-   * If we accept partial chains and have at least one trusted certificate
-   * return success.
-   */
+  // If we accept partial chains and have at least one trusted certificate
+  // return success.
   if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
     X509 *mx;
     if (ctx->last_untrusted < (int)sk_X509_num(ctx->chain)) {
@@ -920,10 +878,8 @@
     }
   }
 
-  /*
-   * If no trusted certs in chain at all return untrusted and allow
-   * standard (no issuer cert) etc errors to be indicated.
-   */
+  // If no trusted certs in chain at all return untrusted and allow
+  // standard (no issuer cert) etc errors to be indicated.
   return X509_TRUST_UNTRUSTED;
 }
 
@@ -935,7 +891,7 @@
   if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL) {
     last = sk_X509_num(ctx->chain) - 1;
   } else {
-    /* If checking CRL paths this isn't the EE certificate */
+    // If checking CRL paths this isn't the EE certificate
     if (ctx->parent) {
       return 1;
     }
@@ -964,15 +920,13 @@
   ctx->current_reasons = 0;
   while (ctx->current_reasons != CRLDP_ALL_REASONS) {
     last_reasons = ctx->current_reasons;
-    /* Try to retrieve relevant CRL */
+    // Try to retrieve relevant CRL
     if (ctx->get_crl) {
       ok = ctx->get_crl(ctx, &crl, x);
     } else {
       ok = get_crl_delta(ctx, &crl, &dcrl, x);
     }
-    /*
-     * If error looking up CRL, nothing we can do except notify callback
-     */
+    // If error looking up CRL, nothing we can do except notify callback
     if (!ok) {
       ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
       ok = ctx->verify_cb(0, ctx);
@@ -997,7 +951,7 @@
       ok = 1;
     }
 
-    /* Don't look in full CRL if delta reason is removefromCRL */
+    // Don't look in full CRL if delta reason is removefromCRL
     if (ok != 2) {
       ok = ctx->cert_crl(ctx, crl, x);
       if (!ok) {
@@ -1009,10 +963,8 @@
     X509_CRL_free(dcrl);
     crl = NULL;
     dcrl = NULL;
-    /*
-     * If reasons not updated we wont get anywhere by another iteration,
-     * so exit loop.
-     */
+    // If reasons not updated we wont get anywhere by another iteration,
+    // so exit loop.
     if (last_reasons == ctx->current_reasons) {
       ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
       ok = ctx->verify_cb(0, ctx);
@@ -1027,7 +979,7 @@
   return ok;
 }
 
-/* Check CRL times against values in X509_STORE_CTX */
+// Check CRL times against values in X509_STORE_CTX
 
 static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) {
   time_t *ptime;
@@ -1074,7 +1026,7 @@
         return 0;
       }
     }
-    /* Ignore expiry of base CRL is delta is valid */
+    // Ignore expiry of base CRL is delta is valid
     if ((i < 0) && !(ctx->current_crl_score & CRL_SCORE_TIME_DELTA)) {
       if (!notify) {
         return 0;
@@ -1110,17 +1062,15 @@
     if (crl_score < best_score || crl_score == 0) {
       continue;
     }
-    /* If current CRL is equivalent use it if it is newer */
+    // If current CRL is equivalent use it if it is newer
     if (crl_score == best_score && best_crl != NULL) {
       int day, sec;
       if (ASN1_TIME_diff(&day, &sec, X509_CRL_get0_lastUpdate(best_crl),
                          X509_CRL_get0_lastUpdate(crl)) == 0) {
         continue;
       }
-      /*
-       * ASN1_TIME_diff never returns inconsistent signs for |day|
-       * and |sec|.
-       */
+      // ASN1_TIME_diff never returns inconsistent signs for |day|
+      // and |sec|.
       if (day <= 0 && sec <= 0) {
         continue;
       }
@@ -1154,17 +1104,15 @@
   return 0;
 }
 
-/*
- * Compare two CRL extensions for delta checking purposes. They should be
- * both present or both absent. If both present all fields must be identical.
- */
+// Compare two CRL extensions for delta checking purposes. They should be
+// both present or both absent. If both present all fields must be identical.
 
 static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid) {
   ASN1_OCTET_STRING *exta, *extb;
   int i;
   i = X509_CRL_get_ext_by_NID(a, nid, -1);
   if (i >= 0) {
-    /* Can't have multiple occurrences */
+    // Can't have multiple occurrences
     if (X509_CRL_get_ext_by_NID(a, nid, i) != -1) {
       return 0;
     }
@@ -1199,43 +1147,41 @@
   return 1;
 }
 
-/* See if a base and delta are compatible */
+// See if a base and delta are compatible
 
 static int check_delta_base(X509_CRL *delta, X509_CRL *base) {
-  /* Delta CRL must be a delta */
+  // Delta CRL must be a delta
   if (!delta->base_crl_number) {
     return 0;
   }
-  /* Base must have a CRL number */
+  // Base must have a CRL number
   if (!base->crl_number) {
     return 0;
   }
-  /* Issuer names must match */
+  // Issuer names must match
   if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(delta))) {
     return 0;
   }
-  /* AKID and IDP must match */
+  // AKID and IDP must match
   if (!crl_extension_match(delta, base, NID_authority_key_identifier)) {
     return 0;
   }
   if (!crl_extension_match(delta, base, NID_issuing_distribution_point)) {
     return 0;
   }
-  /* Delta CRL base number must not exceed Full CRL number. */
+  // Delta CRL base number must not exceed Full CRL number.
   if (ASN1_INTEGER_cmp(delta->base_crl_number, base->crl_number) > 0) {
     return 0;
   }
-  /* Delta CRL number must exceed full CRL number */
+  // Delta CRL number must exceed full CRL number
   if (ASN1_INTEGER_cmp(delta->crl_number, base->crl_number) > 0) {
     return 1;
   }
   return 0;
 }
 
-/*
- * For a given base CRL find a delta... maybe extend to delta scoring or
- * retrieve a chain of deltas...
- */
+// For a given base CRL find a delta... maybe extend to delta scoring or
+// retrieve a chain of deltas...
 
 static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pscore,
                          X509_CRL *base, STACK_OF(X509_CRL) *crls) {
@@ -1261,41 +1207,39 @@
   *dcrl = NULL;
 }
 
-/*
- * For a given CRL return how suitable it is for the supplied certificate
- * 'x'. The return value is a mask of several criteria. If the issuer is not
- * the certificate issuer this is returned in *pissuer. The reasons mask is
- * also used to determine if the CRL is suitable: if no new reasons the CRL
- * is rejected, otherwise reasons is updated.
- */
+// For a given CRL return how suitable it is for the supplied certificate
+// 'x'. The return value is a mask of several criteria. If the issuer is not
+// the certificate issuer this is returned in *pissuer. The reasons mask is
+// also used to determine if the CRL is suitable: if no new reasons the CRL
+// is rejected, otherwise reasons is updated.
 
 static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
                          unsigned int *preasons, X509_CRL *crl, X509 *x) {
   int crl_score = 0;
   unsigned int tmp_reasons = *preasons, crl_reasons;
 
-  /* First see if we can reject CRL straight away */
+  // First see if we can reject CRL straight away
 
-  /* Invalid IDP cannot be processed */
+  // Invalid IDP cannot be processed
   if (crl->idp_flags & IDP_INVALID) {
     return 0;
   }
-  /* Reason codes or indirect CRLs need extended CRL support */
+  // Reason codes or indirect CRLs need extended CRL support
   if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) {
     if (crl->idp_flags & (IDP_INDIRECT | IDP_REASONS)) {
       return 0;
     }
   } else if (crl->idp_flags & IDP_REASONS) {
-    /* If no new reasons reject */
+    // If no new reasons reject
     if (!(crl->idp_reasons & ~tmp_reasons)) {
       return 0;
     }
   }
-  /* Don't process deltas at this stage */
+  // Don't process deltas at this stage
   else if (crl->base_crl_number) {
     return 0;
   }
-  /* If issuer name doesn't match certificate need indirect CRL */
+  // If issuer name doesn't match certificate need indirect CRL
   if (X509_NAME_cmp(X509_get_issuer_name(x), X509_CRL_get_issuer(crl))) {
     if (!(crl->idp_flags & IDP_INDIRECT)) {
       return 0;
@@ -1308,24 +1252,24 @@
     crl_score |= CRL_SCORE_NOCRITICAL;
   }
 
-  /* Check expiry */
+  // Check expiry
   if (check_crl_time(ctx, crl, 0)) {
     crl_score |= CRL_SCORE_TIME;
   }
 
-  /* Check authority key ID and locate certificate issuer */
+  // Check authority key ID and locate certificate issuer
   crl_akid_check(ctx, crl, pissuer, &crl_score);
 
-  /* If we can't locate certificate issuer at this point forget it */
+  // If we can't locate certificate issuer at this point forget it
 
   if (!(crl_score & CRL_SCORE_AKID)) {
     return 0;
   }
 
-  /* Check cert for matching CRL distribution points */
+  // Check cert for matching CRL distribution points
 
   if (crl_crldp_check(x, crl, crl_score, &crl_reasons)) {
-    /* If no new reasons reject */
+    // If no new reasons reject
     if (!(crl_reasons & ~tmp_reasons)) {
       return 0;
     }
@@ -1371,16 +1315,14 @@
     }
   }
 
-  /* Anything else needs extended CRL support */
+  // Anything else needs extended CRL support
 
   if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) {
     return;
   }
 
-  /*
-   * Otherwise the CRL issuer is not on the path. Look for it in the set of
-   * untrusted certificates.
-   */
+  // Otherwise the CRL issuer is not on the path. Look for it in the set of
+  // untrusted certificates.
   for (i = 0; i < sk_X509_num(ctx->untrusted); i++) {
     crl_issuer = sk_X509_value(ctx->untrusted, i);
     if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm)) {
@@ -1394,17 +1336,15 @@
   }
 }
 
-/*
- * Check the path of a CRL issuer certificate. This creates a new
- * X509_STORE_CTX and populates it with most of the parameters from the
- * parent. This could be optimised somewhat since a lot of path checking will
- * be duplicated by the parent, but this will rarely be used in practice.
- */
+// Check the path of a CRL issuer certificate. This creates a new
+// X509_STORE_CTX and populates it with most of the parameters from the
+// parent. This could be optimised somewhat since a lot of path checking will
+// be duplicated by the parent, but this will rarely be used in practice.
 
 static int check_crl_path(X509_STORE_CTX *ctx, X509 *x) {
   X509_STORE_CTX crl_ctx;
   int ret;
-  /* Don't allow recursive CRL path validation */
+  // Don't allow recursive CRL path validation
   if (ctx->parent) {
     return 0;
   }
@@ -1413,20 +1353,20 @@
   }
 
   crl_ctx.crls = ctx->crls;
-  /* Copy verify params across */
+  // Copy verify params across
   X509_STORE_CTX_set0_param(&crl_ctx, ctx->param);
 
   crl_ctx.parent = ctx;
   crl_ctx.verify_cb = ctx->verify_cb;
 
-  /* Verify CRL issuer */
+  // Verify CRL issuer
   ret = X509_verify_cert(&crl_ctx);
 
   if (ret <= 0) {
     goto err;
   }
 
-  /* Check chain is acceptable */
+  // Check chain is acceptable
 
   ret = check_crl_chain(ctx, ctx->chain, crl_ctx.chain);
 err:
@@ -1434,14 +1374,12 @@
   return ret;
 }
 
-/*
- * RFC 3280 says nothing about the relationship between CRL path and
- * certificate path, which could lead to situations where a certificate could
- * be revoked or validated by a CA not authorised to do so. RFC 5280 is more
- * strict and states that the two paths must end in the same trust anchor,
- * though some discussions remain... until this is resolved we use the
- * RFC 5280 version
- */
+// RFC 3280 says nothing about the relationship between CRL path and
+// certificate path, which could lead to situations where a certificate could
+// be revoked or validated by a CA not authorised to do so. RFC 5280 is more
+// strict and states that the two paths must end in the same trust anchor,
+// though some discussions remain... until this is resolved we use the
+// RFC 5280 version
 
 static int check_crl_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *cert_path,
                            STACK_OF(X509) *crl_path) {
@@ -1454,12 +1392,10 @@
   return 0;
 }
 
-/*
- * Check for match between two dist point names: three separate cases. 1.
- * Both are relative names and compare X509_NAME types. 2. One full, one
- * relative. Compare X509_NAME to GENERAL_NAMES. 3. Both are full names and
- * compare two GENERAL_NAMES. 4. One is NULL: automatic match.
- */
+// Check for match between two dist point names: three separate cases. 1.
+// Both are relative names and compare X509_NAME types. 2. One full, one
+// relative. Compare X509_NAME to GENERAL_NAMES. 3. Both are full names and
+// compare two GENERAL_NAMES. 4. One is NULL: automatic match.
 
 static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b) {
   X509_NAME *nm = NULL;
@@ -1473,7 +1409,7 @@
     if (!a->dpname) {
       return 0;
     }
-    /* Case 1: two X509_NAME */
+    // Case 1: two X509_NAME
     if (b->type == 1) {
       if (!b->dpname) {
         return 0;
@@ -1484,19 +1420,19 @@
         return 0;
       }
     }
-    /* Case 2: set name and GENERAL_NAMES appropriately */
+    // Case 2: set name and GENERAL_NAMES appropriately
     nm = a->dpname;
     gens = b->name.fullname;
   } else if (b->type == 1) {
     if (!b->dpname) {
       return 0;
     }
-    /* Case 2: set name and GENERAL_NAMES appropriately */
+    // Case 2: set name and GENERAL_NAMES appropriately
     gens = a->name.fullname;
     nm = b->dpname;
   }
 
-  /* Handle case 2 with one GENERAL_NAMES and one X509_NAME */
+  // Handle case 2 with one GENERAL_NAMES and one X509_NAME
   if (nm) {
     for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
       gena = sk_GENERAL_NAME_value(gens, i);
@@ -1510,7 +1446,7 @@
     return 0;
   }
 
-  /* Else case 3: two GENERAL_NAMES */
+  // Else case 3: two GENERAL_NAMES
 
   for (i = 0; i < sk_GENERAL_NAME_num(a->name.fullname); i++) {
     gena = sk_GENERAL_NAME_value(a->name.fullname, i);
@@ -1528,7 +1464,7 @@
 static int crldp_check_crlissuer(DIST_POINT *dp, X509_CRL *crl, int crl_score) {
   size_t i;
   X509_NAME *nm = X509_CRL_get_issuer(crl);
-  /* If no CRLissuer return is successful iff don't need a match */
+  // If no CRLissuer return is successful iff don't need a match
   if (!dp->CRLissuer) {
     return !!(crl_score & CRL_SCORE_ISSUER_NAME);
   }
@@ -1544,7 +1480,7 @@
   return 0;
 }
 
-/* Check CRLDP and IDP */
+// Check CRLDP and IDP
 
 static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score,
                            unsigned int *preasons) {
@@ -1578,10 +1514,8 @@
   return 0;
 }
 
-/*
- * Retrieve CRL corresponding to current certificate. If deltas enabled try
- * to find a delta CRL too
- */
+// Retrieve CRL corresponding to current certificate. If deltas enabled try
+// to find a delta CRL too
 
 static int get_crl_delta(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl,
                          X509 *x) {
@@ -1599,11 +1533,11 @@
     goto done;
   }
 
-  /* Lookup CRLs from store */
+  // Lookup CRLs from store
 
   skcrl = ctx->lookup_crls(ctx, nm);
 
-  /* If no CRLs found and a near match from get_crl_sk use that */
+  // If no CRLs found and a near match from get_crl_sk use that
   if (!skcrl && crl) {
     goto done;
   }
@@ -1614,7 +1548,7 @@
 
 done:
 
-  /* If we got any kind of CRL use it and return success */
+  // If we got any kind of CRL use it and return success
   if (crl) {
     ctx->current_issuer = issuer;
     ctx->current_crl_score = crl_score;
@@ -1627,27 +1561,25 @@
   return 0;
 }
 
-/* Check CRL validity */
+// Check CRL validity
 static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl) {
   X509 *issuer = NULL;
   EVP_PKEY *ikey = NULL;
   int ok = 0, chnum, cnum;
   cnum = ctx->error_depth;
   chnum = sk_X509_num(ctx->chain) - 1;
-  /* if we have an alternative CRL issuer cert use that */
+  // if we have an alternative CRL issuer cert use that
   if (ctx->current_issuer) {
     issuer = ctx->current_issuer;
   }
 
-  /*
-   * Else find CRL issuer: if not last certificate then issuer is next
-   * certificate in chain.
-   */
+  // Else find CRL issuer: if not last certificate then issuer is next
+  // certificate in chain.
   else if (cnum < chnum) {
     issuer = sk_X509_value(ctx->chain, cnum + 1);
   } else {
     issuer = sk_X509_value(ctx->chain, chnum);
-    /* If not self signed, can't check signature */
+    // If not self signed, can't check signature
     if (!ctx->check_issued(ctx, issuer, issuer)) {
       ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
       ok = ctx->verify_cb(0, ctx);
@@ -1658,11 +1590,9 @@
   }
 
   if (issuer) {
-    /*
-     * Skip most tests for deltas because they have already been done
-     */
+    // Skip most tests for deltas because they have already been done
     if (!crl->base_crl_number) {
-      /* Check for cRLSign bit if keyUsage present */
+      // Check for cRLSign bit if keyUsage present
       if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
           !(issuer->ex_kusage & KU_CRL_SIGN)) {
         ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
@@ -1706,7 +1636,7 @@
       }
     }
 
-    /* Attempt to get issuer certificate public key */
+    // Attempt to get issuer certificate public key
     ikey = X509_get_pubkey(issuer);
 
     if (!ikey) {
@@ -1725,7 +1655,7 @@
           goto err;
         }
       }
-      /* Verify CRL signature */
+      // Verify CRL signature
       if (X509_CRL_verify(crl, ikey) <= 0) {
         ctx->error = X509_V_ERR_CRL_SIGNATURE_FAILURE;
         ok = ctx->verify_cb(0, ctx);
@@ -1743,16 +1673,14 @@
   return ok;
 }
 
-/* Check certificate against CRL */
+// Check certificate against CRL
 static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) {
   int ok;
   X509_REVOKED *rev;
-  /*
-   * The rules changed for this... previously if a CRL contained unhandled
-   * critical extensions it could still be used to indicate a certificate
-   * was revoked. This has since been changed since critical extension can
-   * change the meaning of CRL entries.
-   */
+  // The rules changed for this... previously if a CRL contained unhandled
+  // critical extensions it could still be used to indicate a certificate
+  // was revoked. This has since been changed since critical extension can
+  // change the meaning of CRL entries.
   if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) &&
       (crl->flags & EXFLAG_CRITICAL)) {
     ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
@@ -1761,10 +1689,8 @@
       return 0;
     }
   }
-  /*
-   * Look for serial number of certificate in CRL If found make sure reason
-   * is not removeFromCRL.
-   */
+  // Look for serial number of certificate in CRL If found make sure reason
+  // is not removeFromCRL.
   if (X509_CRL_get0_by_cert(crl, &rev, x)) {
     if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) {
       return 2;
@@ -1791,11 +1717,9 @@
     ctx->error = X509_V_ERR_OUT_OF_MEM;
     return 0;
   }
-  /* Invalid or inconsistent extensions */
+  // Invalid or inconsistent extensions
   if (ret == -1) {
-    /*
-     * Locate certificates with bad extensions and notify callback.
-     */
+    // Locate certificates with bad extensions and notify callback.
     X509 *x;
     size_t i;
     for (i = 1; i < sk_X509_num(ctx->chain); i++) {
@@ -1819,12 +1743,10 @@
 
   if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY) {
     ctx->current_cert = NULL;
-    /*
-     * Verification errors need to be "sticky", a callback may have allowed
-     * an SSL handshake to continue despite an error, and we must then
-     * remain in an error state.  Therefore, we MUST NOT clear earlier
-     * verification errors by setting the error to X509_V_OK.
-     */
+    // Verification errors need to be "sticky", a callback may have allowed
+    // an SSL handshake to continue despite an error, and we must then
+    // remain in an error state.  Therefore, we MUST NOT clear earlier
+    // verification errors by setting the error to X509_V_OK.
     if (!ctx->verify_cb(2, ctx)) {
       return 0;
     }
@@ -1909,15 +1831,13 @@
     }
   }
 
-  /*      ctx->error=0;  not needed */
+  //      ctx->error=0;  not needed
   while (n >= 0) {
     ctx->error_depth = n;
 
-    /*
-     * Skip signature check for self signed certificates unless
-     * explicitly asked for. It doesn't add any security and just wastes
-     * time.
-     */
+    // Skip signature check for self signed certificates unless
+    // explicitly asked for. It doesn't add any security and just wastes
+    // time.
     if (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)) {
       if ((pkey = X509_get_pubkey(xi)) == NULL) {
         ctx->error = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
@@ -1945,7 +1865,7 @@
       goto end;
     }
 
-    /* The last error (if any) is still in the error value */
+    // The last error (if any) is still in the error value
     ctx->current_issuer = xi;
     ctx->current_cert = xs;
     ok = ctx->verify_cb(1, ctx);
@@ -1974,17 +1894,15 @@
   ASN1_TIME *asn1_cmp_time = NULL;
   int i, day, sec, ret = 0;
 
-  /*
-   * Note that ASN.1 allows much more slack in the time format than RFC 5280.
-   * In RFC 5280, the representation is fixed:
-   * UTCTime: YYMMDDHHMMSSZ
-   * GeneralizedTime: YYYYMMDDHHMMSSZ
-   *
-   * We do NOT currently enforce the following RFC 5280 requirement:
-   * "CAs conforming to this profile MUST always encode certificate
-   *  validity dates through the year 2049 as UTCTime; certificate validity
-   *  dates in 2050 or later MUST be encoded as GeneralizedTime."
-   */
+  // Note that ASN.1 allows much more slack in the time format than RFC 5280.
+  // In RFC 5280, the representation is fixed:
+  // UTCTime: YYMMDDHHMMSSZ
+  // GeneralizedTime: YYYYMMDDHHMMSSZ
+  //
+  // We do NOT currently enforce the following RFC 5280 requirement:
+  // "CAs conforming to this profile MUST always encode certificate
+  //  validity dates through the year 2049 as UTCTime; certificate validity
+  //  dates in 2050 or later MUST be encoded as GeneralizedTime."
   switch (ctm->type) {
     case V_ASN1_UTCTIME:
       if (ctm->length != (int)(utctime_length)) {
@@ -2000,11 +1918,10 @@
       return 0;
   }
 
-  /**
-   * Verify the format: the ASN.1 functions we use below allow a more
-   * flexible format than what's mandated by RFC 5280.
-   * Digit and date ranges will be verified in the conversion methods.
-   */
+  //*
+  // Verify the format: the ASN.1 functions we use below allow a more
+  // flexible format than what's mandated by RFC 5280.
+  // Digit and date ranges will be verified in the conversion methods.
   for (i = 0; i < ctm->length - 1; i++) {
     if (!isdigit(ctm->data[i])) {
       return 0;
@@ -2014,11 +1931,9 @@
     return 0;
   }
 
-  /*
-   * There is ASN1_UTCTIME_cmp_time_t but no
-   * ASN1_GENERALIZEDTIME_cmp_time_t or ASN1_TIME_cmp_time_t,
-   * so we go through ASN.1
-   */
+  // There is ASN1_UTCTIME_cmp_time_t but no
+  // ASN1_GENERALIZEDTIME_cmp_time_t or ASN1_TIME_cmp_time_t,
+  // so we go through ASN.1
   asn1_cmp_time = X509_time_adj(NULL, 0, cmp_time);
   if (asn1_cmp_time == NULL) {
     goto err;
@@ -2027,10 +1942,8 @@
     goto err;
   }
 
-  /*
-   * X509_cmp_time comparison is <=.
-   * The return value 0 is reserved for errors.
-   */
+  // X509_cmp_time comparison is <=.
+  // The return value 0 is reserved for errors.
   ret = (day >= 0 && sec >= 0) ? -1 : 1;
 
 err:
@@ -2059,7 +1972,7 @@
   return ASN1_TIME_adj(s, t, offset_day, offset_sec);
 }
 
-/* Make a delta CRL as the diff between two full CRLs */
+// Make a delta CRL as the diff between two full CRLs
 
 X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, EVP_PKEY *skey,
                         const EVP_MD *md, unsigned int flags) {
@@ -2067,22 +1980,22 @@
   int i;
   size_t j;
   STACK_OF(X509_REVOKED) *revs = NULL;
-  /* CRLs can't be delta already */
+  // CRLs can't be delta already
   if (base->base_crl_number || newer->base_crl_number) {
     OPENSSL_PUT_ERROR(X509, X509_R_CRL_ALREADY_DELTA);
     return NULL;
   }
-  /* Base and new CRL must have a CRL number */
+  // Base and new CRL must have a CRL number
   if (!base->crl_number || !newer->crl_number) {
     OPENSSL_PUT_ERROR(X509, X509_R_NO_CRL_NUMBER);
     return NULL;
   }
-  /* Issuer names must match */
+  // Issuer names must match
   if (X509_NAME_cmp(X509_CRL_get_issuer(base), X509_CRL_get_issuer(newer))) {
     OPENSSL_PUT_ERROR(X509, X509_R_ISSUER_MISMATCH);
     return NULL;
   }
-  /* AKID and IDP must match */
+  // AKID and IDP must match
   if (!crl_extension_match(base, newer, NID_authority_key_identifier)) {
     OPENSSL_PUT_ERROR(X509, X509_R_AKID_MISMATCH);
     return NULL;
@@ -2091,23 +2004,23 @@
     OPENSSL_PUT_ERROR(X509, X509_R_IDP_MISMATCH);
     return NULL;
   }
-  /* Newer CRL number must exceed full CRL number */
+  // Newer CRL number must exceed full CRL number
   if (ASN1_INTEGER_cmp(newer->crl_number, base->crl_number) <= 0) {
     OPENSSL_PUT_ERROR(X509, X509_R_NEWER_CRL_NOT_NEWER);
     return NULL;
   }
-  /* CRLs must verify */
+  // CRLs must verify
   if (skey &&
       (X509_CRL_verify(base, skey) <= 0 || X509_CRL_verify(newer, skey) <= 0)) {
     OPENSSL_PUT_ERROR(X509, X509_R_CRL_VERIFY_FAILURE);
     return NULL;
   }
-  /* Create new CRL */
+  // Create new CRL
   crl = X509_CRL_new();
   if (!crl || !X509_CRL_set_version(crl, X509_CRL_VERSION_2)) {
     goto memerr;
   }
-  /* Set issuer name */
+  // Set issuer name
   if (!X509_CRL_set_issuer_name(crl, X509_CRL_get_issuer(newer))) {
     goto memerr;
   }
@@ -2119,16 +2032,14 @@
     goto memerr;
   }
 
-  /* Set base CRL number: must be critical */
+  // Set base CRL number: must be critical
 
   if (!X509_CRL_add1_ext_i2d(crl, NID_delta_crl, base->crl_number, 1, 0)) {
     goto memerr;
   }
 
-  /*
-   * Copy extensions across from newest CRL to delta: this will set CRL
-   * number to correct value too.
-   */
+  // Copy extensions across from newest CRL to delta: this will set CRL
+  // number to correct value too.
 
   for (i = 0; i < X509_CRL_get_ext_count(newer); i++) {
     X509_EXTENSION *ext;
@@ -2138,17 +2049,15 @@
     }
   }
 
-  /* Go through revoked entries, copying as needed */
+  // Go through revoked entries, copying as needed
 
   revs = X509_CRL_get_REVOKED(newer);
 
   for (j = 0; j < sk_X509_REVOKED_num(revs); j++) {
     X509_REVOKED *rvn, *rvtmp;
     rvn = sk_X509_REVOKED_value(revs, j);
-    /*
-     * Add only if not also in base. TODO: need something cleverer here
-     * for some more complex CRLs covering multiple CAs.
-     */
+    // Add only if not also in base. TODO: need something cleverer here
+    // for some more complex CRLs covering multiple CAs.
     if (!X509_CRL_get0_by_serial(base, &rvtmp, rvn->serialNumber)) {
       rvtmp = X509_REVOKED_dup(rvn);
       if (!rvtmp) {
@@ -2160,7 +2069,7 @@
       }
     }
   }
-  /* TODO: optionally prune deleted entries */
+  // TODO: optionally prune deleted entries
 
   if (skey && md && !X509_CRL_sign(crl, skey, md)) {
     goto memerr;
@@ -2180,10 +2089,8 @@
                                     CRYPTO_EX_unused *unused,
                                     CRYPTO_EX_dup *dup_unused,
                                     CRYPTO_EX_free *free_func) {
-  /*
-   * This function is (usually) called only once, by
-   * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c).
-   */
+  // This function is (usually) called only once, by
+  // SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c).
   int index;
   if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
                                free_func)) {
@@ -2263,25 +2170,23 @@
   return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
 }
 
-/*
- * This function is used to set the X509_STORE_CTX purpose and trust values.
- * This is intended to be used when another structure has its own trust and
- * purpose values which (if set) will be inherited by the ctx. If they aren't
- * set then we will usually have a default purpose in mind which should then
- * be used to set the trust value. An example of this is SSL use: an SSL
- * structure will have its own purpose and trust settings which the
- * application can set: if they aren't set then we use the default of SSL
- * client/server.
- */
+// This function is used to set the X509_STORE_CTX purpose and trust values.
+// This is intended to be used when another structure has its own trust and
+// purpose values which (if set) will be inherited by the ctx. If they aren't
+// set then we will usually have a default purpose in mind which should then
+// be used to set the trust value. An example of this is SSL use: an SSL
+// structure will have its own purpose and trust settings which the
+// application can set: if they aren't set then we use the default of SSL
+// client/server.
 
 int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
                                    int purpose, int trust) {
   int idx;
-  /* If purpose not set use default */
+  // If purpose not set use default
   if (!purpose) {
     purpose = def_purpose;
   }
-  /* If we have a purpose then check it is valid */
+  // If we have a purpose then check it is valid
   if (purpose) {
     X509_PURPOSE *ptmp;
     idx = X509_PURPOSE_get_by_id(purpose);
@@ -2298,7 +2203,7 @@
       }
       ptmp = X509_PURPOSE_get0(idx);
     }
-    /* If trust not set then get from purpose default */
+    // If trust not set then get from purpose default
     if (!trust) {
       trust = ptmp->trust;
     }
@@ -2362,9 +2267,7 @@
     goto err;
   }
 
-  /*
-   * Inherit callbacks and flags from X509_STORE.
-   */
+  // Inherit callbacks and flags from X509_STORE.
 
   ctx->verify_cb = store->verify_cb;
   ctx->cleanup = store->cleanup;
@@ -2450,10 +2353,8 @@
   return 0;
 }
 
-/*
- * Set alternative lookup method: just a STACK of trusted certificates. This
- * avoids X509_STORE nastiness where it isn't needed.
- */
+// Set alternative lookup method: just a STACK of trusted certificates. This
+// avoids X509_STORE nastiness where it isn't needed.
 
 void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) {
   ctx->other_ctx = sk;
@@ -2461,8 +2362,8 @@
 }
 
 void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx) {
-  /* We need to be idempotent because, unfortunately, |X509_STORE_CTX_free|
-   * also calls this function. */
+  // We need to be idempotent because, unfortunately, |X509_STORE_CTX_free|
+  // also calls this function.
   if (ctx->cleanup != NULL) {
     ctx->cleanup(ctx);
     ctx->cleanup = NULL;
diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c
index 9555c56..e594033 100644
--- a/crypto/x509/x509_vpm.c
+++ b/crypto/x509/x509_vpm.c
@@ -67,7 +67,7 @@
 #include "internal.h"
 
 
-/* X509_VERIFY_PARAM functions */
+// X509_VERIFY_PARAM functions
 
 #define SET_HOST 0
 #define ADD_HOST 1
@@ -87,10 +87,8 @@
     return 0;
   }
 
-  /*
-   * Refuse names with embedded NUL bytes.
-   * XXX: Do we need to push an error onto the error stack?
-   */
+  // Refuse names with embedded NUL bytes.
+  // XXX: Do we need to push an error onto the error stack?
   if (name && OPENSSL_memchr(name, '\0', namelen)) {
     return 0;
   }
@@ -130,9 +128,7 @@
   param->name = NULL;
   param->purpose = 0;
   param->trust = 0;
-  /*
-   * param->inh_flags = X509_VP_FLAG_DEFAULT;
-   */
+  // param->inh_flags = X509_VP_FLAG_DEFAULT;
   param->inh_flags = 0;
   param->flags = 0;
   param->depth = -1;
@@ -180,45 +176,44 @@
   OPENSSL_free(param);
 }
 
-/*-
- * This function determines how parameters are "inherited" from one structure
- * to another. There are several different ways this can happen.
- *
- * 1. If a child structure needs to have its values initialized from a parent
- *    they are simply copied across. For example SSL_CTX copied to SSL.
- * 2. If the structure should take on values only if they are currently unset.
- *    For example the values in an SSL structure will take appropriate value
- *    for SSL servers or clients but only if the application has not set new
- *    ones.
- *
- * The "inh_flags" field determines how this function behaves.
- *
- * Normally any values which are set in the default are not copied from the
- * destination and verify flags are ORed together.
- *
- * If X509_VP_FLAG_DEFAULT is set then anything set in the source is copied
- * to the destination. Effectively the values in "to" become default values
- * which will be used only if nothing new is set in "from".
- *
- * If X509_VP_FLAG_OVERWRITE is set then all value are copied across whether
- * they are set or not. Flags is still Ored though.
- *
- * If X509_VP_FLAG_RESET_FLAGS is set then the flags value is copied instead
- * of ORed.
- *
- * If X509_VP_FLAG_LOCKED is set then no values are copied.
- *
- * If X509_VP_FLAG_ONCE is set then the current inh_flags setting is zeroed
- * after the next call.
- */
+//-
+// This function determines how parameters are "inherited" from one structure
+// to another. There are several different ways this can happen.
+//
+// 1. If a child structure needs to have its values initialized from a parent
+//    they are simply copied across. For example SSL_CTX copied to SSL.
+// 2. If the structure should take on values only if they are currently unset.
+//    For example the values in an SSL structure will take appropriate value
+//    for SSL servers or clients but only if the application has not set new
+//    ones.
+//
+// The "inh_flags" field determines how this function behaves.
+//
+// Normally any values which are set in the default are not copied from the
+// destination and verify flags are ORed together.
+//
+// If X509_VP_FLAG_DEFAULT is set then anything set in the source is copied
+// to the destination. Effectively the values in "to" become default values
+// which will be used only if nothing new is set in "from".
+//
+// If X509_VP_FLAG_OVERWRITE is set then all value are copied across whether
+// they are set or not. Flags is still Ored though.
+//
+// If X509_VP_FLAG_RESET_FLAGS is set then the flags value is copied instead
+// of ORed.
+//
+// If X509_VP_FLAG_LOCKED is set then no values are copied.
+//
+// If X509_VP_FLAG_ONCE is set then the current inh_flags setting is zeroed
+// after the next call.
 
-/* Macro to test if a field should be copied from src to dest */
+// Macro to test if a field should be copied from src to dest
 
 #define test_x509_verify_param_copy(field, def) \
   (to_overwrite ||                              \
    ((src->field != (def)) && (to_default || (dest->field == (def)))))
 
-/* Macro to test and copy a field if necessary */
+// Macro to test and copy a field if necessary
 
 #define x509_verify_param_copy(field, def)     \
   if (test_x509_verify_param_copy(field, def)) \
@@ -257,12 +252,12 @@
   x509_verify_param_copy(trust, 0);
   x509_verify_param_copy(depth, -1);
 
-  /* If overwrite or check time not set, copy across */
+  // If overwrite or check time not set, copy across
 
   if (to_overwrite || !(dest->flags & X509_V_FLAG_USE_CHECK_TIME)) {
     dest->check_time = src->check_time;
     dest->flags &= ~X509_V_FLAG_USE_CHECK_TIME;
-    /* Don't need to copy flag: that is done below */
+    // Don't need to copy flag: that is done below
   }
 
   if (inh_flags & X509_VP_FLAG_RESET_FLAGS) {
@@ -277,7 +272,7 @@
     }
   }
 
-  /* Copy the host flags if and only if we're copying the host list */
+  // Copy the host flags if and only if we're copying the host list
   if (test_x509_verify_param_copy(hosts, NULL)) {
     if (dest->hosts) {
       string_stack_free(dest->hosts);
@@ -510,57 +505,55 @@
 
 #define vpm_empty_id NULL, 0U, NULL, NULL, 0, NULL, 0, 0
 
-/*
- * Default verify parameters: these are used for various applications and can
- * be overridden by the user specified table. NB: the 'name' field *must* be
- * in alphabetical order because it will be searched using OBJ_search.
- */
+// Default verify parameters: these are used for various applications and can
+// be overridden by the user specified table. NB: the 'name' field *must* be
+// in alphabetical order because it will be searched using OBJ_search.
 
 static const X509_VERIFY_PARAM default_table[] = {
-    {(char *)"default",         /* X509 default parameters */
-     0,                         /* Check time */
-     0,                         /* internal flags */
-     X509_V_FLAG_TRUSTED_FIRST, /* flags */
-     0,                         /* purpose */
-     0,                         /* trust */
-     100,                       /* depth */
-     NULL,                      /* policies */
+    {(char *)"default",          // X509 default parameters
+     0,                          // Check time
+     0,                          // internal flags
+     X509_V_FLAG_TRUSTED_FIRST,  // flags
+     0,                          // purpose
+     0,                          // trust
+     100,                        // depth
+     NULL,                       // policies
      vpm_empty_id},
-    {(char *)"pkcs7",         /* S/MIME sign parameters */
-     0,                       /* Check time */
-     0,                       /* internal flags */
-     0,                       /* flags */
-     X509_PURPOSE_SMIME_SIGN, /* purpose */
-     X509_TRUST_EMAIL,        /* trust */
-     -1,                      /* depth */
-     NULL,                    /* policies */
+    {(char *)"pkcs7",          // S/MIME sign parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SMIME_SIGN,  // purpose
+     X509_TRUST_EMAIL,         // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {(char *)"smime_sign",    /* S/MIME sign parameters */
-     0,                       /* Check time */
-     0,                       /* internal flags */
-     0,                       /* flags */
-     X509_PURPOSE_SMIME_SIGN, /* purpose */
-     X509_TRUST_EMAIL,        /* trust */
-     -1,                      /* depth */
-     NULL,                    /* policies */
+    {(char *)"smime_sign",     // S/MIME sign parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SMIME_SIGN,  // purpose
+     X509_TRUST_EMAIL,         // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {(char *)"ssl_client",    /* SSL/TLS client parameters */
-     0,                       /* Check time */
-     0,                       /* internal flags */
-     0,                       /* flags */
-     X509_PURPOSE_SSL_CLIENT, /* purpose */
-     X509_TRUST_SSL_CLIENT,   /* trust */
-     -1,                      /* depth */
-     NULL,                    /* policies */
+    {(char *)"ssl_client",     // SSL/TLS client parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SSL_CLIENT,  // purpose
+     X509_TRUST_SSL_CLIENT,    // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id},
-    {(char *)"ssl_server",    /* SSL/TLS server parameters */
-     0,                       /* Check time */
-     0,                       /* internal flags */
-     0,                       /* flags */
-     X509_PURPOSE_SSL_SERVER, /* purpose */
-     X509_TRUST_SSL_SERVER,   /* trust */
-     -1,                      /* depth */
-     NULL,                    /* policies */
+    {(char *)"ssl_server",     // SSL/TLS server parameters
+     0,                        // Check time
+     0,                        // internal flags
+     0,                        // flags
+     X509_PURPOSE_SSL_SERVER,  // purpose
+     X509_TRUST_SSL_SERVER,    // trust
+     -1,                       // depth
+     NULL,                     // policies
      vpm_empty_id}};
 
 static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL;
diff --git a/crypto/x509/x509cset.c b/crypto/x509/x509cset.c
index 27c7140..3ff1018 100644
--- a/crypto/x509/x509cset.c
+++ b/crypto/x509/x509cset.c
@@ -72,7 +72,7 @@
     return 0;
   }
 
-  /* v1(0) is default and is represented by omitting the version. */
+  // v1(0) is default and is represented by omitting the version.
   if (version == X509_CRL_VERSION_1) {
     ASN1_INTEGER_free(x->crl->version);
     x->crl->version = NULL;
@@ -130,7 +130,7 @@
 }
 
 int X509_CRL_sort(X509_CRL *c) {
-  /* Sort the data so it will be written in serial number order. */
+  // Sort the data so it will be written in serial number order.
   sk_X509_REVOKED_sort(c->crl->revoked);
   c->crl->enc.modified = 1;
   return 1;
@@ -245,9 +245,9 @@
 }
 
 int X509_CRL_set1_signature_algo(X509_CRL *crl, const X509_ALGOR *algo) {
-  /* TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
-   * should be const. Alternatively, when we can embed required fields
-   * directly in structs, import |X509_ALGOR_copy| from upstream. */
+  // TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
+  // should be const. Alternatively, when we can embed required fields
+  // directly in structs, import |X509_ALGOR_copy| from upstream.
   X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
   X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
   if (copy1 == NULL || copy2 == NULL) {
diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c
index d3aa6de..4087218 100644
--- a/crypto/x509/x509name.c
+++ b/crypto/x509/x509name.c
@@ -114,7 +114,7 @@
   return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
 }
 
-/* NOTE: you should be passsing -1, not 0 as lastpos */
+// NOTE: you should be passsing -1, not 0 as lastpos
 int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
                                int lastpos) {
   int n;
@@ -164,7 +164,7 @@
     return (ret);
   }
 
-  /* else we need to fixup the set field */
+  // else we need to fixup the set field
   if (loc != 0) {
     set_prev = (sk_X509_NAME_ENTRY_value(sk, loc - 1))->set;
   } else {
@@ -172,11 +172,9 @@
   }
   set_next = sk_X509_NAME_ENTRY_value(sk, loc)->set;
 
-  /*
-   * set_prev is the previous set set is the current set set_next is the
-   * following prev 1 1 1 1 1 1 1 1 set 1 1 2 2 next 1 1 2 2 2 2 3 2 so
-   * basically only if prev and next differ by 2, then re-number down by 1
-   */
+  // set_prev is the previous set set is the current set set_next is the
+  // following prev 1 1 1 1 1 1 1 1 set 1 1 2 2 next 1 1 2 2 2 2 3 2 so
+  // basically only if prev and next differ by 2, then re-number down by 1
   if (set_prev + 1 < set_next) {
     for (i = loc; i < n; i++) {
       sk_X509_NAME_ENTRY_value(sk, i)->set--;
@@ -227,10 +225,8 @@
   return ret;
 }
 
-/*
- * if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
- * guy we are about to stomp on.
- */
+// if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
+// guy we are about to stomp on.
 int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
                         int set) {
   X509_NAME_ENTRY *new_name = NULL;
@@ -258,7 +254,7 @@
     } else {
       set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
     }
-  } else { /* if (set >= 0) */
+  } else {  // if (set >= 0)
 
     if (loc >= n) {
       if (loc != 0) {
diff --git a/crypto/x509/x509rset.c b/crypto/x509/x509rset.c
index 1d5457f..7e4e083 100644
--- a/crypto/x509/x509rset.c
+++ b/crypto/x509/x509rset.c
@@ -88,9 +88,9 @@
 }
 
 int X509_REQ_set1_signature_algo(X509_REQ *req, const X509_ALGOR *algo) {
-  /* TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
-   * should be const. Alternatively, when we can embed required fields
-   * directly in structs, import |X509_ALGOR_copy| from upstream. */
+  // TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
+  // should be const. Alternatively, when we can embed required fields
+  // directly in structs, import |X509_ALGOR_copy| from upstream.
   X509_ALGOR *copy = X509_ALGOR_dup((X509_ALGOR *)algo);
   if (copy == NULL) {
     return 0;
diff --git a/crypto/x509/x509spki.c b/crypto/x509/x509spki.c
index 88ab9cd..d819a5c 100644
--- a/crypto/x509/x509spki.c
+++ b/crypto/x509/x509spki.c
@@ -75,7 +75,7 @@
   return (X509_PUBKEY_get(x->spkac->pubkey));
 }
 
-/* Load a Netscape SPKI from a base64 encoded string */
+// Load a Netscape SPKI from a base64 encoded string
 
 NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len) {
   unsigned char *spki_der;
@@ -105,7 +105,7 @@
   return spki;
 }
 
-/* Generate a base64 encoded string from an SPKI */
+// Generate a base64 encoded string from an SPKI
 
 char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) {
   unsigned char *der_spki, *p;
diff --git a/crypto/x509/x_algor.c b/crypto/x509/x_algor.c
index 8285fb3..09a2221 100644
--- a/crypto/x509/x_algor.c
+++ b/crypto/x509/x_algor.c
@@ -127,7 +127,7 @@
   }
 }
 
-/* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
+// Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD
 
 void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) {
   int param_type;
@@ -141,9 +141,7 @@
   X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL);
 }
 
-/*
- * X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise.
- */
+// X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise.
 int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) {
   int rv;
   rv = OBJ_cmp(a->algorithm, b->algorithm);
diff --git a/crypto/x509/x_crl.c b/crypto/x509/x_crl.c
index 7b23797..f65afba 100644
--- a/crypto/x509/x_crl.c
+++ b/crypto/x509/x_crl.c
@@ -80,11 +80,9 @@
 static int crl_lookup(X509_CRL *crl, X509_REVOKED **ret, ASN1_INTEGER *serial,
                       X509_NAME *issuer);
 
-/*
- * The X509_CRL_INFO structure needs a bit of customisation. Since we cache
- * the original encoding the signature wont be affected by reordering of the
- * revoked field.
- */
+// The X509_CRL_INFO structure needs a bit of customisation. Since we cache
+// the original encoding the signature wont be affected by reordering of the
+// revoked field.
 static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
                       void *exarg) {
   X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
@@ -93,10 +91,8 @@
     return 1;
   }
   switch (operation) {
-      /*
-       * Just set cmp function here. We don't sort because that would
-       * affect the output of X509_CRL_print().
-       */
+      // Just set cmp function here. We don't sort because that would
+      // affect the output of X509_CRL_print().
     case ASN1_OP_D2I_POST:
       (void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
       break;
@@ -115,10 +111,8 @@
     ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0),
 } ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO)
 
-/*
- * Set CRL entry issuer according to CRL certificate issuer extension. Check
- * for unhandled critical CRL entry extensions.
- */
+// Set CRL entry issuer according to CRL certificate issuer extension. Check
+// for unhandled critical CRL entry extensions.
 
 static int crl_set_issuers(X509_CRL *crl) {
   size_t i, k;
@@ -167,7 +161,7 @@
       rev->reason = CRL_REASON_NONE;
     }
 
-    /* Check for critical CRL entry extensions */
+    // Check for critical CRL entry extensions
 
     exts = rev->extensions;
 
@@ -187,10 +181,8 @@
   return 1;
 }
 
-/*
- * The X509_CRL structure needs a bit of customisation. Cache some extensions
- * and hash of the whole CRL.
- */
+// The X509_CRL structure needs a bit of customisation. Cache some extensions
+// and hash of the whole CRL.
 static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
                   void *exarg) {
   X509_CRL *crl = (X509_CRL *)*pval;
@@ -212,20 +204,20 @@
       break;
 
     case ASN1_OP_D2I_POST: {
-      /* The version must be one of v1(0) or v2(1). */
+      // The version must be one of v1(0) or v2(1).
       long version = X509_CRL_VERSION_1;
       if (crl->crl->version != NULL) {
         version = ASN1_INTEGER_get(crl->crl->version);
-        /* TODO(https://crbug.com/boringssl/364): |X509_CRL_VERSION_1|
-         * should also be rejected. This means an explicitly-encoded X.509v1
-         * version. v1 is DEFAULT, so DER requires it be omitted. */
+        // TODO(https://crbug.com/boringssl/364): |X509_CRL_VERSION_1|
+        // should also be rejected. This means an explicitly-encoded X.509v1
+        // version. v1 is DEFAULT, so DER requires it be omitted.
         if (version < X509_CRL_VERSION_1 || version > X509_CRL_VERSION_2) {
           OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
           return 0;
         }
       }
 
-      /* Per RFC 5280, section 5.1.2.1, extensions require v2. */
+      // Per RFC 5280, section 5.1.2.1, extensions require v2.
       if (version != X509_CRL_VERSION_2 && crl->crl->extensions != NULL) {
         OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
         return 0;
@@ -260,18 +252,16 @@
       if (crl->base_crl_number == NULL && i != -1) {
         return 0;
       }
-      /* Delta CRLs must have CRL number */
+      // Delta CRLs must have CRL number
       if (crl->base_crl_number && !crl->crl_number) {
         OPENSSL_PUT_ERROR(X509, X509_R_DELTA_CRL_WITHOUT_CRL_NUMBER);
         return 0;
       }
 
-      /*
-       * See if we have any unhandled critical CRL extensions and indicate
-       * this in a flag. We only currently handle IDP so anything else
-       * critical sets the flag. This code accesses the X509_CRL structure
-       * directly: applications shouldn't do this.
-       */
+      // See if we have any unhandled critical CRL extensions and indicate
+      // this in a flag. We only currently handle IDP so anything else
+      // critical sets the flag. This code accesses the X509_CRL structure
+      // directly: applications shouldn't do this.
 
       exts = crl->crl->extensions;
 
@@ -283,7 +273,7 @@
           crl->flags |= EXFLAG_FRESHEST;
         }
         if (X509_EXTENSION_get_critical(ext)) {
-          /* We handle IDP and deltas */
+          // We handle IDP and deltas
           if ((nid == NID_issuing_distribution_point) ||
               (nid == NID_authority_key_identifier) || (nid == NID_delta_crl)) {
             continue;
@@ -311,11 +301,11 @@
   return 1;
 }
 
-/* Convert IDP into a more convenient form */
+// Convert IDP into a more convenient form
 
 static int setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp) {
   int idp_only = 0;
-  /* Set various flags according to IDP */
+  // Set various flags according to IDP
   crl->idp_flags |= IDP_PRESENT;
   if (idp->onlyuser > 0) {
     idp_only++;
@@ -441,10 +431,8 @@
   X509_REVOKED rtmp, *rev;
   size_t idx;
   rtmp.serialNumber = serial;
-  /*
-   * Sort revoked into serial number order if not already sorted. Do this
-   * under a lock to avoid race condition.
-   */
+  // Sort revoked into serial number order if not already sorted. Do this
+  // under a lock to avoid race condition.
 
   CRYPTO_STATIC_MUTEX_lock_read(&g_crl_sort_lock);
   const int is_sorted = sk_X509_REVOKED_is_sorted(crl->crl->revoked);
@@ -461,7 +449,7 @@
   if (!sk_X509_REVOKED_find(crl->crl->revoked, &idx, &rtmp)) {
     return 0;
   }
-  /* Need to look for matching name */
+  // Need to look for matching name
   for (; idx < sk_X509_REVOKED_num(crl->crl->revoked); idx++) {
     rev = sk_X509_REVOKED_value(crl->crl->revoked, idx);
     if (ASN1_INTEGER_cmp(rev->serialNumber, serial)) {
diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c
index 58c1083..f54cbe8 100644
--- a/crypto/x509/x_name.c
+++ b/crypto/x509/x_name.c
@@ -74,10 +74,8 @@
 typedef STACK_OF(X509_NAME_ENTRY) STACK_OF_X509_NAME_ENTRY;
 DEFINE_STACK_OF(STACK_OF_X509_NAME_ENTRY)
 
-/*
- * Maximum length of X509_NAME: much larger than anything we should
- * ever see in practice.
- */
+// Maximum length of X509_NAME: much larger than anything we should
+// ever see in practice.
 
 #define X509_NAME_MAX (1024 * 1024)
 
@@ -104,10 +102,8 @@
 IMPLEMENT_ASN1_FUNCTIONS(X509_NAME_ENTRY)
 IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME_ENTRY)
 
-/*
- * For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
- * declare two template wrappers for this
- */
+// For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
+// declare two template wrappers for this
 
 ASN1_ITEM_TEMPLATE(X509_NAME_ENTRIES) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF,
                                                               0, RDNS,
@@ -118,18 +114,16 @@
     ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Name, X509_NAME_ENTRIES)
 ASN1_ITEM_TEMPLATE_END(X509_NAME_INTERNAL)
 
-/*
- * Normally that's where it would end: we'd have two nested STACK structures
- * representing the ASN1. Unfortunately X509_NAME uses a completely different
- * form and caches encodings so we have to process the internal form and
- * convert to the external form.
- */
+// Normally that's where it would end: we'd have two nested STACK structures
+// representing the ASN1. Unfortunately X509_NAME uses a completely different
+// form and caches encodings so we have to process the internal form and
+// convert to the external form.
 
 static const ASN1_EXTERN_FUNCS x509_name_ff = {
     NULL,
     x509_name_ex_new,
     x509_name_ex_free,
-    0, /* Default clear behaviour is OK */
+    0,  // Default clear behaviour is OK
     x509_name_ex_d2i,
     x509_name_ex_i2d,
     NULL,
@@ -204,13 +198,13 @@
   int ret;
   STACK_OF(X509_NAME_ENTRY) *entries;
   X509_NAME_ENTRY *entry;
-  /* Bound the size of an X509_NAME we are willing to parse. */
+  // Bound the size of an X509_NAME we are willing to parse.
   if (len > X509_NAME_MAX) {
     len = X509_NAME_MAX;
   }
   q = p;
 
-  /* Get internal representation of Name */
+  // Get internal representation of Name
   ASN1_VALUE *intname_val = NULL;
   ret = ASN1_item_ex_d2i(&intname_val, &p, len,
                          ASN1_ITEM_rptr(X509_NAME_INTERNAL), tag, aclass, opt,
@@ -228,13 +222,13 @@
     goto err;
   }
   nm = (X509_NAME *)nm_val;
-  /* We've decoded it: now cache encoding */
+  // We've decoded it: now cache encoding
   if (!BUF_MEM_grow(nm->bytes, p - q)) {
     goto err;
   }
   OPENSSL_memcpy(nm->bytes->data, q, p - q);
 
-  /* Convert internal representation to X509_NAME structure */
+  // Convert internal representation to X509_NAME structure
   for (i = 0; i < sk_STACK_OF_X509_NAME_ENTRY_num(intname); i++) {
     entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname, i);
     for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) {
@@ -330,16 +324,14 @@
   return 0;
 }
 
-/*
- * This function generates the canonical encoding of the Name structure. In
- * it all strings are converted to UTF8, leading, trailing and multiple
- * spaces collapsed, converted to lower case and the leading SEQUENCE header
- * removed. In future we could also normalize the UTF8 too. By doing this
- * comparison of Name structures can be rapidly perfomed by just using
- * OPENSSL_memcmp() of the canonical encoding. By omitting the leading SEQUENCE
- * name constraints of type dirName can also be checked with a simple
- * OPENSSL_memcmp().
- */
+// This function generates the canonical encoding of the Name structure. In
+// it all strings are converted to UTF8, leading, trailing and multiple
+// spaces collapsed, converted to lower case and the leading SEQUENCE header
+// removed. In future we could also normalize the UTF8 too. By doing this
+// comparison of Name structures can be rapidly perfomed by just using
+// OPENSSL_memcmp() of the canonical encoding. By omitting the leading SEQUENCE
+// name constraints of type dirName can also be checked with a simple
+// OPENSSL_memcmp().
 
 static int x509_name_canon(X509_NAME *a) {
   unsigned char *p;
@@ -353,7 +345,7 @@
     OPENSSL_free(a->canon_enc);
     a->canon_enc = NULL;
   }
-  /* Special case: empty X509_NAME => null encoding */
+  // Special case: empty X509_NAME => null encoding
   if (sk_X509_NAME_ENTRY_num(a->entries) == 0) {
     a->canon_enclen = 0;
     return 1;
@@ -389,7 +381,7 @@
     tmpentry = NULL;
   }
 
-  /* Finally generate encoding */
+  // Finally generate encoding
 
   len = i2d_name_canon(intname, NULL);
   if (len < 0) {
@@ -421,7 +413,7 @@
   return ret;
 }
 
-/* Bitmap of all the types of string that will be canonicalized. */
+// Bitmap of all the types of string that will be canonicalized.
 
 #define ASN1_MASK_CANON                                            \
   (B_ASN1_UTF8STRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING | \
@@ -432,7 +424,7 @@
   unsigned char *to, *from;
   int len, i;
 
-  /* If type not in bitmask just copy string across */
+  // If type not in bitmask just copy string across
   if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) {
     if (!ASN1_STRING_copy(out, in)) {
       return 0;
@@ -451,13 +443,11 @@
 
   len = out->length;
 
-  /*
-   * Convert string in place to canonical form. Ultimately we may need to
-   * handle a wider range of characters but for now ignore anything with
-   * MSB set and rely on the isspace() and tolower() functions.
-   */
+  // Convert string in place to canonical form. Ultimately we may need to
+  // handle a wider range of characters but for now ignore anything with
+  // MSB set and rely on the isspace() and tolower() functions.
 
-  /* Ignore leading spaces */
+  // Ignore leading spaces
   while ((len > 0) && !(*from & 0x80) && isspace(*from)) {
     from++;
     len--;
@@ -465,7 +455,7 @@
 
   to = from + len;
 
-  /* Ignore trailing spaces */
+  // Ignore trailing spaces
   while ((len > 0) && !(to[-1] & 0x80) && isspace(to[-1])) {
     to--;
     len--;
@@ -475,20 +465,18 @@
 
   i = 0;
   while (i < len) {
-    /* If MSB set just copy across */
+    // If MSB set just copy across
     if (*from & 0x80) {
       *to++ = *from++;
       i++;
     }
-    /* Collapse multiple spaces */
+    // Collapse multiple spaces
     else if (isspace(*from)) {
-      /* Copy one space across */
+      // Copy one space across
       *to++ = ' ';
-      /*
-       * Ignore subsequent spaces. Note: don't need to check len here
-       * because we know the last character is a non-space so we can't
-       * overflow.
-       */
+      // Ignore subsequent spaces. Note: don't need to check len here
+      // because we know the last character is a non-space so we can't
+      // overflow.
       do {
         from++;
         i++;
@@ -538,7 +526,7 @@
 
 int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder,
                        size_t *pderlen) {
-  /* Make sure encoding is valid */
+  // Make sure encoding is valid
   if (i2d_X509_NAME(nm, NULL) <= 0) {
     return 0;
   }
diff --git a/crypto/x509/x_pubkey.c b/crypto/x509/x_pubkey.c
index 12e7d68..3a19135 100644
--- a/crypto/x509/x_pubkey.c
+++ b/crypto/x509/x_pubkey.c
@@ -70,7 +70,7 @@
 #include "../internal.h"
 #include "internal.h"
 
-/* Minor tweak to operation: free up EVP_PKEY */
+// Minor tweak to operation: free up EVP_PKEY
 static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
                      void *exarg) {
   if (operation == ASN1_OP_FREE_POST) {
@@ -122,10 +122,10 @@
   return 0;
 }
 
-/* g_pubkey_lock is used to protect the initialisation of the |pkey| member of
- * |X509_PUBKEY| objects. Really |X509_PUBKEY| should have a |CRYPTO_once_t|
- * inside it for this, but |CRYPTO_once_t| is private and |X509_PUBKEY| is
- * not. */
+// g_pubkey_lock is used to protect the initialisation of the |pkey| member of
+// |X509_PUBKEY| objects. Really |X509_PUBKEY| should have a |CRYPTO_once_t|
+// inside it for this, but |CRYPTO_once_t| is private and |X509_PUBKEY| is
+// not.
 static struct CRYPTO_STATIC_MUTEX g_pubkey_lock = CRYPTO_STATIC_MUTEX_INIT;
 
 EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) {
@@ -144,7 +144,7 @@
   }
   CRYPTO_STATIC_MUTEX_unlock_read(&g_pubkey_lock);
 
-  /* Re-encode the |X509_PUBKEY| to DER and parse it. */
+  // Re-encode the |X509_PUBKEY| to DER and parse it.
   int spki_len = i2d_X509_PUBKEY(key, &spki);
   if (spki_len < 0) {
     goto error;
@@ -157,7 +157,7 @@
     goto error;
   }
 
-  /* Check to see if another thread set key->pkey first */
+  // Check to see if another thread set key->pkey first
   CRYPTO_STATIC_MUTEX_lock_write(&g_pubkey_lock);
   if (key->pkey) {
     CRYPTO_STATIC_MUTEX_unlock_write(&g_pubkey_lock);
@@ -185,7 +185,7 @@
   }
 
   ASN1_STRING_set0(pub->public_key, key, key_len);
-  /* Set the number of unused bits to zero. */
+  // Set the number of unused bits to zero.
   pub->public_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
   pub->public_key->flags |= ASN1_STRING_FLAG_BITS_LEFT;
   return 1;
diff --git a/crypto/x509/x_req.c b/crypto/x509/x_req.c
index 42e9496..4ddeaea 100644
--- a/crypto/x509/x_req.c
+++ b/crypto/x509/x_req.c
@@ -63,14 +63,12 @@
 #include "internal.h"
 
 
-/*
- * X509_REQ_INFO is handled in an unusual way to get round invalid encodings.
- * Some broken certificate requests don't encode the attributes field if it
- * is empty. This is in violation of PKCS#10 but we need to tolerate it. We
- * do this by making the attributes field OPTIONAL then using the callback to
- * initialise it to an empty STACK. This means that the field will be
- * correctly encoded unless we NULL out the field.
- */
+// X509_REQ_INFO is handled in an unusual way to get round invalid encodings.
+// Some broken certificate requests don't encode the attributes field if it
+// is empty. This is in violation of PKCS#10 but we need to tolerate it. We
+// do this by making the attributes field OPTIONAL then using the callback to
+// initialise it to an empty STACK. This means that the field will be
+// correctly encoded unless we NULL out the field.
 
 static int rinf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
                    void *exarg) {
@@ -97,7 +95,7 @@
     ASN1_SIMPLE(X509_REQ_INFO, version, ASN1_INTEGER),
     ASN1_SIMPLE(X509_REQ_INFO, subject, X509_NAME),
     ASN1_SIMPLE(X509_REQ_INFO, pubkey, X509_PUBKEY),
-    /* This isn't really OPTIONAL but it gets around invalid encodings. */
+    // This isn't really OPTIONAL but it gets around invalid encodings.
     ASN1_IMP_SET_OF_OPT(X509_REQ_INFO, attributes, X509_ATTRIBUTE, 0),
 } ASN1_SEQUENCE_END_enc(X509_REQ_INFO, X509_REQ_INFO)
 
diff --git a/crypto/x509/x_spki.c b/crypto/x509/x_spki.c
index 5e582f5..435ff85 100644
--- a/crypto/x509/x_spki.c
+++ b/crypto/x509/x_spki.c
@@ -55,10 +55,8 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
-/*
- * This module was send to me my Pat Richards <patr@x509.com> who wrote it.
- * It is under my Copyright with his permission.
- */
+// This module was send to me my Pat Richards <patr@x509.com> who wrote it.
+// It is under my Copyright with his permission.
 
 #include <openssl/asn1t.h>
 #include <openssl/x509.h>
diff --git a/crypto/x509/x_x509.c b/crypto/x509/x_x509.c
index 743fd80..ee558a4 100644
--- a/crypto/x509/x_x509.c
+++ b/crypto/x509/x_x509.c
@@ -87,7 +87,7 @@
 } ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF)
 
 IMPLEMENT_ASN1_FUNCTIONS(X509_CINF)
-/* X509 top level structure needs a bit of customisation */
+// X509 top level structure needs a bit of customisation
 
 extern void policy_cache_free(X509_POLICY_CACHE *cache);
 
@@ -114,27 +114,27 @@
       break;
 
     case ASN1_OP_D2I_POST: {
-      /* The version must be one of v1(0), v2(1), or v3(2). */
+      // The version must be one of v1(0), v2(1), or v3(2).
       long version = X509_VERSION_1;
       if (ret->cert_info->version != NULL) {
         version = ASN1_INTEGER_get(ret->cert_info->version);
-        /* TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should
-         * also be rejected here. This means an explicitly-encoded X.509v1
-         * version. v1 is DEFAULT, so DER requires it be omitted. */
+        // TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should
+        // also be rejected here. This means an explicitly-encoded X.509v1
+        // version. v1 is DEFAULT, so DER requires it be omitted.
         if (version < X509_VERSION_1 || version > X509_VERSION_3) {
           OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION);
           return 0;
         }
       }
 
-      /* Per RFC 5280, section 4.1.2.8, these fields require v2 or v3. */
+      // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3.
       if (version == X509_VERSION_1 && (ret->cert_info->issuerUID != NULL ||
                                         ret->cert_info->subjectUID != NULL)) {
         OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
         return 0;
       }
 
-      /* Per RFC 5280, section 4.1.2.9, extensions require v3. */
+      // Per RFC 5280, section 4.1.2.9, extensions require v3.
       if (version != X509_VERSION_3 && ret->cert_info->extensions != NULL) {
         OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION);
         return 0;
@@ -224,12 +224,10 @@
   return (CRYPTO_get_ex_data(&r->ex_data, idx));
 }
 
-/*
- * X509_AUX ASN1 routines. X509_AUX is the name given to a certificate with
- * extra info tagged on the end. Since these functions set how a certificate
- * is trusted they should only be used when the certificate comes from a
- * reliable source such as local storage.
- */
+// X509_AUX ASN1 routines. X509_AUX is the name given to a certificate with
+// extra info tagged on the end. Since these functions set how a certificate
+// is trusted they should only be used when the certificate comes from a
+// reliable source such as local storage.
 
 X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length) {
   const unsigned char *q = *pp;
@@ -240,13 +238,13 @@
     freeret = 1;
   }
   ret = d2i_X509(a, &q, length);
-  /* If certificate unreadable then forget it */
+  // If certificate unreadable then forget it
   if (!ret) {
     return NULL;
   }
-  /* update length */
+  // update length
   length -= q - *pp;
-  /* Parse auxiliary information if there is any. */
+  // Parse auxiliary information if there is any.
   if (length > 0 && !d2i_X509_CERT_AUX(&ret->aux, &q, length)) {
     goto err;
   }
@@ -262,23 +260,19 @@
   return NULL;
 }
 
-/*
- * Serialize trusted certificate to *pp or just return the required buffer
- * length if pp == NULL.  We ultimately want to avoid modifying *pp in the
- * error path, but that depends on similar hygiene in lower-level functions.
- * Here we avoid compounding the problem.
- */
+// Serialize trusted certificate to *pp or just return the required buffer
+// length if pp == NULL.  We ultimately want to avoid modifying *pp in the
+// error path, but that depends on similar hygiene in lower-level functions.
+// Here we avoid compounding the problem.
 static int i2d_x509_aux_internal(X509 *a, unsigned char **pp) {
   int length, tmplen;
   unsigned char *start = pp != NULL ? *pp : NULL;
 
   assert(pp == NULL || *pp != NULL);
 
-  /*
-   * This might perturb *pp on error, but fixing that belongs in i2d_X509()
-   * not here.  It should be that if a == NULL length is zero, but we check
-   * both just in case.
-   */
+  // This might perturb *pp on error, but fixing that belongs in i2d_X509()
+  // not here.  It should be that if a == NULL length is zero, but we check
+  // both just in case.
   length = i2d_X509(a, pp);
   if (length <= 0 || a == NULL) {
     return length;
@@ -298,36 +292,34 @@
   return length;
 }
 
-/*
- * Serialize trusted certificate to *pp, or just return the required buffer
- * length if pp == NULL.
- *
- * When pp is not NULL, but *pp == NULL, we allocate the buffer, but since
- * we're writing two ASN.1 objects back to back, we can't have i2d_X509() do
- * the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the
- * allocated buffer.
- */
+// Serialize trusted certificate to *pp, or just return the required buffer
+// length if pp == NULL.
+//
+// When pp is not NULL, but *pp == NULL, we allocate the buffer, but since
+// we're writing two ASN.1 objects back to back, we can't have i2d_X509() do
+// the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the
+// allocated buffer.
 int i2d_X509_AUX(X509 *a, unsigned char **pp) {
   int length;
   unsigned char *tmp;
 
-  /* Buffer provided by caller */
+  // Buffer provided by caller
   if (pp == NULL || *pp != NULL) {
     return i2d_x509_aux_internal(a, pp);
   }
 
-  /* Obtain the combined length */
+  // Obtain the combined length
   if ((length = i2d_x509_aux_internal(a, NULL)) <= 0) {
     return length;
   }
 
-  /* Allocate requisite combined storage */
+  // Allocate requisite combined storage
   *pp = tmp = OPENSSL_malloc(length);
   if (tmp == NULL) {
-    return -1; /* Push error onto error stack? */
+    return -1;  // Push error onto error stack?
   }
 
-  /* Encode, but keep *pp at the originally malloced pointer */
+  // Encode, but keep *pp at the originally malloced pointer
   length = i2d_x509_aux_internal(a, &tmp);
   if (length <= 0) {
     OPENSSL_free(*pp);
@@ -346,9 +338,9 @@
 }
 
 int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo) {
-  /* TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
-   * should be const. Alternatively, when we can embed required fields
-   * directly in structs, import |X509_ALGOR_copy| from upstream. */
+  // TODO(https://crbug.com/boringssl/407): Generated ASN.1 dup functions
+  // should be const. Alternatively, when we can embed required fields
+  // directly in structs, import |X509_ALGOR_copy| from upstream.
   X509_ALGOR *copy1 = X509_ALGOR_dup((X509_ALGOR *)algo);
   X509_ALGOR *copy2 = X509_ALGOR_dup((X509_ALGOR *)algo);
   if (copy1 == NULL || copy2 == NULL) {
diff --git a/crypto/x509/x_x509a.c b/crypto/x509/x_x509a.c
index 96161f5..d372537 100644
--- a/crypto/x509/x_x509a.c
+++ b/crypto/x509/x_x509a.c
@@ -64,12 +64,10 @@
 #include "internal.h"
 
 
-/*
- * X509_CERT_AUX routines. These are used to encode additional user
- * modifiable data about a certificate. This data is appended to the X509
- * encoding when the *_X509_AUX routines are used. This means that the
- * "traditional" X509 routines will simply ignore the extra data.
- */
+// X509_CERT_AUX routines. These are used to encode additional user
+// modifiable data about a certificate. This data is appended to the X509
+// encoding when the *_X509_AUX routines are used. This means that the
+// "traditional" X509 routines will simply ignore the extra data.
 
 static X509_CERT_AUX *aux_get(X509 *x);
 
@@ -94,9 +92,9 @@
 
 int X509_alias_set1(X509 *x, const unsigned char *name, int len) {
   X509_CERT_AUX *aux;
-  /* TODO(davidben): Empty aliases are not meaningful in PKCS#12, and the
-   * getters cannot quite represent them. Also erase the object if |len| is
-   * zero. */
+  // TODO(davidben): Empty aliases are not meaningful in PKCS#12, and the
+  // getters cannot quite represent them. Also erase the object if |len| is
+  // zero.
   if (!name) {
     if (!x || !x->aux || !x->aux->alias) {
       return 1;
@@ -116,9 +114,9 @@
 
 int X509_keyid_set1(X509 *x, const unsigned char *id, int len) {
   X509_CERT_AUX *aux;
-  /* TODO(davidben): Empty key IDs are not meaningful in PKCS#12, and the
-   * getters cannot quite represent them. Also erase the object if |len| is
-   * zero. */
+  // TODO(davidben): Empty key IDs are not meaningful in PKCS#12, and the
+  // getters cannot quite represent them. Also erase the object if |len| is
+  // zero.
   if (!id) {
     if (!x || !x->aux || !x->aux->keyid) {
       return 1;
diff --git a/crypto/x509v3/ext_dat.h b/crypto/x509v3/ext_dat.h
index 0773608..2491431 100644
--- a/crypto/x509v3/ext_dat.h
+++ b/crypto/x509v3/ext_dat.h
@@ -54,7 +54,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* This file contains a table of "standard" extensions */
+// This file contains a table of "standard" extensions
 
 #if defined(__cplusplus)
 extern "C" {
@@ -74,12 +74,10 @@
 extern const X509V3_EXT_METHOD v3_name_constraints, v3_inhibit_anyp, v3_idp;
 extern const X509V3_EXT_METHOD v3_addr, v3_asid;
 
-/*
- * This table will be searched using OBJ_bsearch so it *must* kept in order
- * of the ext_nid values.
- */
+// This table will be searched using OBJ_bsearch so it *must* kept in order
+// of the ext_nid values.
 
-/* TODO(fork): OCSP support */
+// TODO(fork): OCSP support
 #define OPENSSL_NO_OCSP
 
 static const X509V3_EXT_METHOD *const standard_exts[] = {
@@ -127,11 +125,11 @@
     &v3_freshest_crl,
 };
 
-/* Number of standard extensions */
+// Number of standard extensions
 
 #define STANDARD_EXTENSION_COUNT \
   (sizeof(standard_exts) / sizeof(X509V3_EXT_METHOD *))
 
 #if defined(__cplusplus)
-} /* extern C */
+}  // extern C
 #endif
diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h
index b26b313..abace33 100644
--- a/crypto/x509v3/internal.h
+++ b/crypto/x509v3/internal.h
@@ -126,129 +126,114 @@
 
 DEFINE_STACK_OF(X509_POLICY_DATA)
 
-/* Internal structures */
+// Internal structures
 
-/*
- * This structure and the field names correspond to the Policy 'node' of
- * RFC 3280. NB this structure contains no pointers to parent or child data:
- * X509_POLICY_NODE contains that. This means that the main policy data can
- * be kept static and cached with the certificate.
- */
+// This structure and the field names correspond to the Policy 'node' of
+// RFC 3280. NB this structure contains no pointers to parent or child data:
+// X509_POLICY_NODE contains that. This means that the main policy data can
+// be kept static and cached with the certificate.
 
 struct X509_POLICY_DATA_st {
   unsigned int flags;
-  /* Policy OID and qualifiers for this data */
+  // Policy OID and qualifiers for this data
   ASN1_OBJECT *valid_policy;
   STACK_OF(POLICYQUALINFO) *qualifier_set;
   STACK_OF(ASN1_OBJECT) *expected_policy_set;
 };
 
-/* X509_POLICY_DATA flags values */
+// X509_POLICY_DATA flags values
 
-/*
- * This flag indicates the structure has been mapped using a policy mapping
- * extension. If policy mapping is not active its references get deleted.
- */
+// This flag indicates the structure has been mapped using a policy mapping
+// extension. If policy mapping is not active its references get deleted.
 
 #define POLICY_DATA_FLAG_MAPPED 0x1
 
-/*
- * This flag indicates the data doesn't correspond to a policy in Certificate
- * Policies: it has been mapped to any policy.
- */
+// This flag indicates the data doesn't correspond to a policy in Certificate
+// Policies: it has been mapped to any policy.
 
 #define POLICY_DATA_FLAG_MAPPED_ANY 0x2
 
-/* AND with flags to see if any mapping has occurred */
+// AND with flags to see if any mapping has occurred
 
 #define POLICY_DATA_FLAG_MAP_MASK 0x3
 
-/* qualifiers are shared and shouldn't be freed */
+// qualifiers are shared and shouldn't be freed
 
 #define POLICY_DATA_FLAG_SHARED_QUALIFIERS 0x4
 
-/* Parent node is an extra node and should be freed */
+// Parent node is an extra node and should be freed
 
 #define POLICY_DATA_FLAG_EXTRA_NODE 0x8
 
-/* Corresponding CertificatePolicies is critical */
+// Corresponding CertificatePolicies is critical
 
 #define POLICY_DATA_FLAG_CRITICAL 0x10
 
-/* This structure is cached with a certificate */
+// This structure is cached with a certificate
 
 struct X509_POLICY_CACHE_st {
-  /* anyPolicy data or NULL if no anyPolicy */
+  // anyPolicy data or NULL if no anyPolicy
   X509_POLICY_DATA *anyPolicy;
-  /* other policy data */
+  // other policy data
   STACK_OF(X509_POLICY_DATA) *data;
-  /* If InhibitAnyPolicy present this is its value or -1 if absent. */
+  // If InhibitAnyPolicy present this is its value or -1 if absent.
   long any_skip;
-  /*
-   * If policyConstraints and requireExplicitPolicy present this is its
-   * value or -1 if absent.
-   */
+  // If policyConstraints and requireExplicitPolicy present this is its
+  // value or -1 if absent.
   long explicit_skip;
-  /*
-   * If policyConstraints and policyMapping present this is its value or -1
-   * if absent.
-   */
+  // If policyConstraints and policyMapping present this is its value or -1
+  // if absent.
   long map_skip;
 };
 
-/*
- * #define POLICY_CACHE_FLAG_CRITICAL POLICY_DATA_FLAG_CRITICAL
- */
+// #define POLICY_CACHE_FLAG_CRITICAL POLICY_DATA_FLAG_CRITICAL
 
-/* This structure represents the relationship between nodes */
+// This structure represents the relationship between nodes
 
 struct X509_POLICY_NODE_st {
-  /* node data this refers to */
+  // node data this refers to
   const X509_POLICY_DATA *data;
-  /* Parent node */
+  // Parent node
   X509_POLICY_NODE *parent;
-  /* Number of child nodes */
+  // Number of child nodes
   int nchild;
 };
 
 struct X509_POLICY_LEVEL_st {
-  /* Cert for this level */
+  // Cert for this level
   X509 *cert;
-  /* nodes at this level */
+  // nodes at this level
   STACK_OF(X509_POLICY_NODE) *nodes;
-  /* anyPolicy node */
+  // anyPolicy node
   X509_POLICY_NODE *anyPolicy;
-  /* Extra data */
-  /*
-   * STACK_OF(X509_POLICY_DATA) *extra_data;
-   */
+  // Extra data
+  //
+  // STACK_OF(X509_POLICY_DATA) *extra_data;
   unsigned int flags;
 };
 
 struct X509_POLICY_TREE_st {
-  /* This is the tree 'level' data */
+  // This is the tree 'level' data
   X509_POLICY_LEVEL *levels;
   int nlevel;
-  /*
-   * Extra policy data when additional nodes (not from the certificate) are
-   * required.
-   */
+  // Extra policy data when additional nodes (not from the certificate) are
+  // required.
   STACK_OF(X509_POLICY_DATA) *extra_data;
-  /* This is the authority constained policy set */
+  // This is the authority constained policy set
   STACK_OF(X509_POLICY_NODE) *auth_policies;
   STACK_OF(X509_POLICY_NODE) *user_policies;
   unsigned int flags;
 };
 
-/* Set if anyPolicy present in user policies */
+// Set if anyPolicy present in user policies
 #define POLICY_FLAG_ANY_POLICY 0x2
 
-/* Useful macros */
+// Useful macros
 
 #define node_data_critical(data) ((data)->flags & POLICY_DATA_FLAG_CRITICAL)
 #define node_critical(node) node_data_critical((node)->data)
 
-/* Internal functions */
+// Internal functions
 
 X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *id,
                                   int crit);
@@ -283,7 +268,7 @@
 
 
 #if defined(__cplusplus)
-} /* extern C */
+}  // extern C
 #endif
 
-#endif /* OPENSSL_HEADER_X509V3_INTERNAL_H */
+#endif  // OPENSSL_HEADER_X509V3_INTERNAL_H
diff --git a/crypto/x509v3/pcy_cache.c b/crypto/x509v3/pcy_cache.c
index f4de366..74f95f9 100644
--- a/crypto/x509v3/pcy_cache.c
+++ b/crypto/x509v3/pcy_cache.c
@@ -68,10 +68,8 @@
                            const X509_POLICY_DATA **b);
 static int policy_cache_set_int(long *out, ASN1_INTEGER *value);
 
-/*
- * Set cache entry according to CertificatePolicies extension. Note: this
- * destroys the passed CERTIFICATEPOLICIES structure.
- */
+// Set cache entry according to CertificatePolicies extension. Note: this
+// destroys the passed CERTIFICATEPOLICIES structure.
 
 static int policy_cache_create(X509 *x, CERTIFICATEPOLICIES *policies,
                                int crit) {
@@ -93,9 +91,7 @@
     if (!data) {
       goto bad_policy;
     }
-    /*
-     * Duplicate policy OIDs are illegal: reject if matches found.
-     */
+    // Duplicate policy OIDs are illegal: reject if matches found.
     sk_X509_POLICY_DATA_sort(cache->data);
     if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
       if (cache->anyPolicy) {
@@ -146,10 +142,8 @@
 
   x->policy_cache = cache;
 
-  /*
-   * Handle requireExplicitPolicy *first*. Need to process this even if we
-   * don't have any policies.
-   */
+  // Handle requireExplicitPolicy *first*. Need to process this even if we
+  // don't have any policies.
   ext_pcons = X509_get_ext_d2i(x, NID_policy_constraints, &i, NULL);
 
   if (!ext_pcons) {
@@ -170,15 +164,13 @@
     }
   }
 
-  /* Process CertificatePolicies */
+  // Process CertificatePolicies
 
   ext_cpols = X509_get_ext_d2i(x, NID_certificate_policies, &i, NULL);
-  /*
-   * If no CertificatePolicies extension or problem decoding then there is
-   * no point continuing because the valid policies will be NULL.
-   */
+  // If no CertificatePolicies extension or problem decoding then there is
+  // no point continuing because the valid policies will be NULL.
   if (!ext_cpols) {
-    /* If not absent some problem with extension */
+    // If not absent some problem with extension
     if (i != -1) {
       goto bad_cache;
     }
@@ -187,7 +179,7 @@
 
   i = policy_cache_create(x, ext_cpols, i);
 
-  /* NB: ext_cpols freed by policy_cache_set_policies */
+  // NB: ext_cpols freed by policy_cache_set_policies
 
   if (i <= 0) {
     return i;
@@ -196,7 +188,7 @@
   ext_pmaps = X509_get_ext_d2i(x, NID_policy_mappings, &i, NULL);
 
   if (!ext_pmaps) {
-    /* If not absent some problem with extension */
+    // If not absent some problem with extension
     if (i != -1) {
       goto bad_cache;
     }
@@ -246,11 +238,9 @@
   OPENSSL_free(cache);
 }
 
-/*
- * g_x509_policy_cache_lock is used to protect against concurrent calls to
- * |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in
- * the |X509| structure, but |CRYPTO_once_t| isn't public.
- */
+// g_x509_policy_cache_lock is used to protect against concurrent calls to
+// |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in
+// the |X509| structure, but |CRYPTO_once_t| isn't public.
 static struct CRYPTO_STATIC_MUTEX g_x509_policy_cache_lock =
     CRYPTO_STATIC_MUTEX_INIT;
 
diff --git a/crypto/x509v3/pcy_data.c b/crypto/x509v3/pcy_data.c
index e2df5b2..28a572f 100644
--- a/crypto/x509v3/pcy_data.c
+++ b/crypto/x509v3/pcy_data.c
@@ -64,11 +64,11 @@
 
 #include "internal.h"
 
-/* Policy Node routines */
+// Policy Node routines
 
 void policy_data_free(X509_POLICY_DATA *data) {
   ASN1_OBJECT_free(data->valid_policy);
-  /* Don't free qualifiers if shared */
+  // Don't free qualifiers if shared
   if (!(data->flags & POLICY_DATA_FLAG_SHARED_QUALIFIERS)) {
     sk_POLICYQUALINFO_pop_free(data->qualifier_set, POLICYQUALINFO_free);
   }
@@ -76,13 +76,11 @@
   OPENSSL_free(data);
 }
 
-/*
- * Create a data based on an existing policy. If 'id' is NULL use the oid in
- * the policy, otherwise use 'id'. This behaviour covers the two types of
- * data in RFC 3280: data with from a CertificatePolcies extension and
- * additional data with just the qualifiers of anyPolicy and ID from another
- * source.
- */
+// Create a data based on an existing policy. If 'id' is NULL use the oid in
+// the policy, otherwise use 'id'. This behaviour covers the two types of
+// data in RFC 3280: data with from a CertificatePolcies extension and
+// additional data with just the qualifiers of anyPolicy and ID from another
+// source.
 
 X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *cid,
                                   int crit) {
diff --git a/crypto/x509v3/pcy_lib.c b/crypto/x509v3/pcy_lib.c
index 3775d35..9a629a3 100644
--- a/crypto/x509v3/pcy_lib.c
+++ b/crypto/x509v3/pcy_lib.c
@@ -60,9 +60,9 @@
 
 #include "internal.h"
 
-/* accessor functions */
+// accessor functions
 
-/* X509_POLICY_TREE stuff */
+// X509_POLICY_TREE stuff
 
 int X509_policy_tree_level_count(const X509_POLICY_TREE *tree) {
   if (!tree) {
@@ -99,7 +99,7 @@
   }
 }
 
-/* X509_POLICY_LEVEL stuff */
+// X509_POLICY_LEVEL stuff
 
 int X509_policy_level_node_count(X509_POLICY_LEVEL *level) {
   int n;
@@ -130,7 +130,7 @@
   return sk_X509_POLICY_NODE_value(level->nodes, i);
 }
 
-/* X509_POLICY_NODE stuff */
+// X509_POLICY_NODE stuff
 
 const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node) {
   if (!node) {
diff --git a/crypto/x509v3/pcy_map.c b/crypto/x509v3/pcy_map.c
index efc3ecd..e4fa9a1 100644
--- a/crypto/x509v3/pcy_map.c
+++ b/crypto/x509v3/pcy_map.c
@@ -64,10 +64,8 @@
 #include "../x509/internal.h"
 #include "internal.h"
 
-/*
- * Set policy mapping entries in cache. Note: this modifies the passed
- * POLICY_MAPPINGS structure
- */
+// Set policy mapping entries in cache. Note: this modifies the passed
+// POLICY_MAPPINGS structure
 
 int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) {
   POLICY_MAPPING *map;
@@ -81,21 +79,21 @@
   }
   for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) {
     map = sk_POLICY_MAPPING_value(maps, i);
-    /* Reject if map to or from anyPolicy */
+    // Reject if map to or from anyPolicy
     if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy) ||
         (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) {
       ret = -1;
       goto bad_mapping;
     }
 
-    /* Attempt to find matching policy data */
+    // Attempt to find matching policy data
     data = policy_cache_find_data(cache, map->issuerDomainPolicy);
-    /* If we don't have anyPolicy can't map */
+    // If we don't have anyPolicy can't map
     if (!data && !cache->anyPolicy) {
       continue;
     }
 
-    /* Create a NODE from anyPolicy */
+    // Create a NODE from anyPolicy
     if (!data) {
       data =
           policy_data_new(NULL, map->issuerDomainPolicy,
@@ -104,9 +102,7 @@
         goto bad_mapping;
       }
       data->qualifier_set = cache->anyPolicy->qualifier_set;
-      /*
-       * map->issuerDomainPolicy = NULL;
-       */
+      // map->issuerDomainPolicy = NULL;
       data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
       data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
       if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
diff --git a/crypto/x509v3/pcy_node.c b/crypto/x509v3/pcy_node.c
index 330194f..71847f3 100644
--- a/crypto/x509v3/pcy_node.c
+++ b/crypto/x509v3/pcy_node.c
@@ -160,10 +160,8 @@
 
 void policy_node_free(X509_POLICY_NODE *node) { OPENSSL_free(node); }
 
-/*
- * See if a policy node matches a policy OID. If mapping enabled look through
- * expected policy set otherwise just valid policy.
- */
+// See if a policy node matches a policy OID. If mapping enabled look through
+// expected policy set otherwise just valid policy.
 
 int policy_node_match(const X509_POLICY_LEVEL *lvl,
                       const X509_POLICY_NODE *node, const ASN1_OBJECT *oid) {
diff --git a/crypto/x509v3/pcy_tree.c b/crypto/x509v3/pcy_tree.c
index db7704e..10dad05 100644
--- a/crypto/x509v3/pcy_tree.c
+++ b/crypto/x509v3/pcy_tree.c
@@ -69,14 +69,10 @@
 #include "../x509/internal.h"
 #include "internal.h"
 
-/*
- * Enable this to print out the complete policy tree at various point during
- * evaluation.
- */
+// Enable this to print out the complete policy tree at various point during
+// evaluation.
 
-/*
- * #define OPENSSL_POLICY_DEBUG
- */
+// #define OPENSSL_POLICY_DEBUG
 
 #ifdef OPENSSL_POLICY_DEBUG
 
@@ -133,19 +129,18 @@
 }
 #else
 
-#define tree_print(a, b, c) /* */
+#define tree_print(a, b, c)  //
 
 #endif
 
-/*-
- * Initialize policy tree. Return values:
- *  0 Some internal error occurred.
- * -1 Inconsistent or invalid extensions in certificates.
- *  1 Tree initialized OK.
- *  2 Policy tree is empty.
- *  5 Tree OK and requireExplicitPolicy true.
- *  6 Tree empty and requireExplicitPolicy true.
- */
+//-
+// Initialize policy tree. Return values:
+//  0 Some internal error occurred.
+// -1 Inconsistent or invalid extensions in certificates.
+//  1 Tree initialized OK.
+//  2 Policy tree is empty.
+//  5 Tree OK and requireExplicitPolicy true.
+//  6 Tree empty and requireExplicitPolicy true.
 
 static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
                      unsigned int flags) {
@@ -163,7 +158,7 @@
   n = sk_X509_num(certs);
 
 #if 0
-    /* Disable policy mapping for now... */
+    // Disable policy mapping for now...
     flags |= X509_V_FLAG_INHIBIT_MAP;
 #endif
 
@@ -185,33 +180,27 @@
     map_skip = n + 1;
   }
 
-  /* Can't do anything with just a trust anchor */
+  // Can't do anything with just a trust anchor
   if (n == 1) {
     return 1;
   }
-  /*
-   * First setup policy cache in all certificates apart from the trust
-   * anchor. Note any bad cache results on the way. Also can calculate
-   * explicit_policy value at this point.
-   */
+  // First setup policy cache in all certificates apart from the trust
+  // anchor. Note any bad cache results on the way. Also can calculate
+  // explicit_policy value at this point.
   for (i = n - 2; i >= 0; i--) {
     x = sk_X509_value(certs, i);
     X509_check_purpose(x, -1, -1);
     cache = policy_cache_set(x);
-    /* If cache NULL something bad happened: return immediately */
+    // If cache NULL something bad happened: return immediately
     if (cache == NULL) {
       return 0;
     }
-    /*
-     * If inconsistent extensions keep a note of it but continue
-     */
+    // If inconsistent extensions keep a note of it but continue
     if (x->ex_flags & EXFLAG_INVALID_POLICY) {
       ret = -1;
     }
-    /*
-     * Otherwise if we have no data (hence no CertificatePolicies) and
-     * haven't already set an inconsistent code note it.
-     */
+    // Otherwise if we have no data (hence no CertificatePolicies) and
+    // haven't already set an inconsistent code note it.
     else if ((ret == 1) && !cache->data) {
       ret = 2;
     }
@@ -233,7 +222,7 @@
     return ret;
   }
 
-  /* If we get this far initialize the tree */
+  // If we get this far initialize the tree
 
   tree = OPENSSL_malloc(sizeof(X509_POLICY_TREE));
 
@@ -259,7 +248,7 @@
 
   level = tree->levels;
 
-  /* Root data: initialize to anyPolicy */
+  // Root data: initialize to anyPolicy
 
   data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0);
 
@@ -278,12 +267,10 @@
       level->flags |= X509_V_FLAG_INHIBIT_ANY;
     }
 
-    /* Determine inhibit any and inhibit map flags */
+    // Determine inhibit any and inhibit map flags
     if (any_skip == 0) {
-      /*
-       * Any matching allowed if certificate is self issued and not the
-       * last in the chain.
-       */
+      // Any matching allowed if certificate is self issued and not the
+      // last in the chain.
       if (!(x->ex_flags & EXFLAG_SI) || (i == 0)) {
         level->flags |= X509_V_FLAG_INHIBIT_ANY;
       }
@@ -329,7 +316,7 @@
   X509_POLICY_NODE *node;
   int matched = 0;
   size_t i;
-  /* Iterate through all in nodes linking matches */
+  // Iterate through all in nodes linking matches
   for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) {
     node = sk_X509_POLICY_NODE_value(last->nodes, i);
     if (policy_node_match(last, node, data->valid_policy)) {
@@ -347,10 +334,8 @@
   return 1;
 }
 
-/*
- * This corresponds to RFC 3280 6.1.3(d)(1): link any data from
- * CertificatePolicies onto matching parent or anyPolicy if no match.
- */
+// This corresponds to RFC 3280 6.1.3(d)(1): link any data from
+// CertificatePolicies onto matching parent or anyPolicy if no match.
 
 static int tree_link_nodes(X509_POLICY_LEVEL *curr,
                            const X509_POLICY_CACHE *cache) {
@@ -359,20 +344,18 @@
 
   for (i = 0; i < sk_X509_POLICY_DATA_num(cache->data); i++) {
     data = sk_X509_POLICY_DATA_value(cache->data, i);
-    /*
-     * If a node is mapped any it doesn't have a corresponding
-     * CertificatePolicies entry. However such an identical node would
-     * be created if anyPolicy matching is enabled because there would be
-     * no match with the parent valid_policy_set. So we create link
-     * because then it will have the mapping flags right and we can prune
-     * it later.
-     */
+    // If a node is mapped any it doesn't have a corresponding
+    // CertificatePolicies entry. However such an identical node would
+    // be created if anyPolicy matching is enabled because there would be
+    // no match with the parent valid_policy_set. So we create link
+    // because then it will have the mapping flags right and we can prune
+    // it later.
 #if 0
         if ((data->flags & POLICY_DATA_FLAG_MAPPED_ANY)
             && !(curr->flags & X509_V_FLAG_INHIBIT_ANY))
             continue;
 #endif
-    /* Look for matching nodes in previous level */
+    // Look for matching nodes in previous level
     if (!tree_link_matching_nodes(curr, data)) {
       return 0;
     }
@@ -380,10 +363,8 @@
   return 1;
 }
 
-/*
- * This corresponds to RFC 3280 6.1.3(d)(2): Create new data for any unmatched
- * policies in the parent and link to anyPolicy.
- */
+// This corresponds to RFC 3280 6.1.3(d)(2): Create new data for any unmatched
+// policies in the parent and link to anyPolicy.
 
 static int tree_add_unmatched(X509_POLICY_LEVEL *curr,
                               const X509_POLICY_CACHE *cache,
@@ -393,16 +374,14 @@
   if (id == NULL) {
     id = node->data->valid_policy;
   }
-  /*
-   * Create a new node with qualifiers from anyPolicy and id from unmatched
-   * node.
-   */
+  // Create a new node with qualifiers from anyPolicy and id from unmatched
+  // node.
   data = policy_data_new(NULL, id, node_critical(node));
 
   if (data == NULL) {
     return 0;
   }
-  /* Curr may not have anyPolicy */
+  // Curr may not have anyPolicy
   data->qualifier_set = cache->anyPolicy->qualifier_set;
   data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
   if (!level_add_node(curr, data, node, tree)) {
@@ -421,21 +400,21 @@
 
   if ((last->flags & X509_V_FLAG_INHIBIT_MAP) ||
       !(node->data->flags & POLICY_DATA_FLAG_MAPPED)) {
-    /* If no policy mapping: matched if one child present */
+    // If no policy mapping: matched if one child present
     if (node->nchild) {
       return 1;
     }
     if (!tree_add_unmatched(curr, cache, NULL, node, tree)) {
       return 0;
     }
-    /* Add it */
+    // Add it
   } else {
-    /* If mapping: matched if one child per expected policy set */
+    // If mapping: matched if one child per expected policy set
     STACK_OF(ASN1_OBJECT) *expset = node->data->expected_policy_set;
     if ((size_t)node->nchild == sk_ASN1_OBJECT_num(expset)) {
       return 1;
     }
-    /* Locate unmatched nodes */
+    // Locate unmatched nodes
     for (i = 0; i < sk_ASN1_OBJECT_num(expset); i++) {
       ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(expset, i);
       if (level_find_node(curr, node, oid)) {
@@ -454,9 +433,7 @@
                          const X509_POLICY_CACHE *cache,
                          X509_POLICY_TREE *tree) {
   size_t i;
-  /*
-   * X509_POLICY_DATA *data;
-   */
+  // X509_POLICY_DATA *data;
   X509_POLICY_NODE *node;
   X509_POLICY_LEVEL *last = curr - 1;
 
@@ -469,24 +446,20 @@
 
 #if 0
 
-        /*
-         * Skip any node with any children: we only want unmathced nodes.
-         * Note: need something better for policy mapping because each node
-         * may have multiple children
-         */
+        // Skip any node with any children: we only want unmathced nodes.
+        // Note: need something better for policy mapping because each node
+        // may have multiple children
         if (node->nchild)
             continue;
 
-        /*
-         * Create a new node with qualifiers from anyPolicy and id from
-         * unmatched node.
-         */
+        // Create a new node with qualifiers from anyPolicy and id from
+        // unmatched node.
         data = policy_data_new(NULL, node->data->valid_policy,
                                node_critical(node));
 
         if (data == NULL)
             return 0;
-        /* Curr may not have anyPolicy */
+        // Curr may not have anyPolicy
         data->qualifier_set = cache->anyPolicy->qualifier_set;
         data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
         if (!level_add_node(curr, data, node, tree)) {
@@ -495,7 +468,7 @@
         }
 #endif
   }
-  /* Finally add link to anyPolicy */
+  // Finally add link to anyPolicy
   if (last->anyPolicy) {
     if (!level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL)) {
       return 0;
@@ -504,11 +477,9 @@
   return 1;
 }
 
-/*
- * Prune the tree: delete any child mapped child data on the current level
- * then proceed up the tree deleting any data with no children. If we ever
- * have no data on a level we can halt because the tree will be empty.
- */
+// Prune the tree: delete any child mapped child data on the current level
+// then proceed up the tree deleting any data with no children. If we ever
+// have no data on a level we can halt because the tree will be empty.
 
 static int tree_prune(X509_POLICY_TREE *tree, X509_POLICY_LEVEL *curr) {
   STACK_OF(X509_POLICY_NODE) *nodes;
@@ -518,7 +489,7 @@
   if (curr->flags & X509_V_FLAG_INHIBIT_MAP) {
     for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) {
       node = sk_X509_POLICY_NODE_value(nodes, i);
-      /* Delete any mapped data: see RFC 3280 XXXX */
+      // Delete any mapped data: see RFC 3280 XXXX
       if (node->data->flags & POLICY_DATA_FLAG_MAP_MASK) {
         node->parent->nchild--;
         OPENSSL_free(node);
@@ -546,7 +517,7 @@
       curr->anyPolicy = NULL;
     }
     if (curr == tree->levels) {
-      /* If we zapped anyPolicy at top then tree is empty */
+      // If we zapped anyPolicy at top then tree is empty
       if (!curr->anyPolicy) {
         return 2;
       }
@@ -575,14 +546,12 @@
   return 1;
 }
 
-/*
- * Calculate the authority set based on policy tree. The 'pnodes' parameter
- * is used as a store for the set of policy nodes used to calculate the user
- * set. If the authority set is not anyPolicy then pnodes will just point to
- * the authority set. If however the authority set is anyPolicy then the set
- * of valid policies (other than anyPolicy) is store in pnodes. The return
- * value of '2' is used in this case to indicate that pnodes should be freed.
- */
+// Calculate the authority set based on policy tree. The 'pnodes' parameter
+// is used as a store for the set of policy nodes used to calculate the user
+// set. If the authority set is not anyPolicy then pnodes will just point to
+// the authority set. If however the authority set is anyPolicy then the set
+// of valid policies (other than anyPolicy) is store in pnodes. The return
+// value of '2' is used in this case to indicate that pnodes should be freed.
 
 static int tree_calculate_authority_set(X509_POLICY_TREE *tree,
                                         STACK_OF(X509_POLICY_NODE) **pnodes) {
@@ -593,23 +562,21 @@
   size_t j;
   curr = tree->levels + tree->nlevel - 1;
 
-  /* If last level contains anyPolicy set is anyPolicy */
+  // If last level contains anyPolicy set is anyPolicy
   if (curr->anyPolicy) {
     if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy)) {
       return 0;
     }
     addnodes = pnodes;
   } else {
-    /* Add policies to authority set */
+    // Add policies to authority set
     addnodes = &tree->auth_policies;
   }
 
   curr = tree->levels;
   for (i = 1; i < tree->nlevel; i++) {
-    /*
-     * If no anyPolicy node on this this level it can't appear on lower
-     * levels so end search.
-     */
+    // If no anyPolicy node on this this level it can't appear on lower
+    // levels so end search.
     if (!(anyptr = curr->anyPolicy)) {
       break;
     }
@@ -641,10 +608,8 @@
   X509_POLICY_NODE *anyPolicy;
   X509_POLICY_DATA *extra;
 
-  /*
-   * Check if anyPolicy present in authority constrained policy set: this
-   * will happen if it is a leaf node.
-   */
+  // Check if anyPolicy present in authority constrained policy set: this
+  // will happen if it is a leaf node.
 
   if (sk_ASN1_OBJECT_num(policy_oids) <= 0) {
     return 1;
@@ -667,10 +632,8 @@
       if (!anyPolicy) {
         continue;
       }
-      /*
-       * Create a new node with policy ID from user set and qualifiers
-       * from anyPolicy.
-       */
+      // Create a new node with policy ID from user set and qualifiers
+      // from anyPolicy.
       extra = policy_data_new(NULL, oid, node_critical(anyPolicy));
       if (!extra) {
         return 0;
@@ -755,14 +718,13 @@
   OPENSSL_free(tree);
 }
 
-/*-
- * Application policy checking function.
- * Return codes:
- *  0   Internal Error.
- *  1   Successful.
- * -1   One or more certificates contain invalid or inconsistent extensions
- * -2   User constrained policy set empty and requireExplicit true.
- */
+//-
+// Application policy checking function.
+// Return codes:
+//  0   Internal Error.
+//  1   Successful.
+// -1   One or more certificates contain invalid or inconsistent extensions
+// -2   User constrained policy set empty and requireExplicit true.
 
 int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
                       STACK_OF(X509) *certs, STACK_OF(ASN1_OBJECT) *policy_oids,
@@ -777,41 +739,39 @@
   ret = tree_init(&tree, certs, flags);
 
   switch (ret) {
-      /* Tree empty requireExplicit False: OK */
+      // Tree empty requireExplicit False: OK
     case 2:
       return 1;
 
-      /* Some internal error */
+      // Some internal error
     case -1:
       return -1;
 
-      /* Some internal error */
+      // Some internal error
     case 0:
       return 0;
 
-      /* Tree empty requireExplicit True: Error */
+      // Tree empty requireExplicit True: Error
 
     case 6:
       *pexplicit_policy = 1;
       return -2;
 
-      /* Tree OK requireExplicit True: OK and continue */
+      // Tree OK requireExplicit True: OK and continue
     case 5:
       *pexplicit_policy = 1;
       break;
 
-      /* Tree OK: continue */
+      // Tree OK: continue
 
     case 1:
       if (!tree) {
-        /*
-         * tree_init() returns success and a null tree
-         * if it's just looking at a trust anchor.
-         * I'm not sure that returning success here is
-         * correct, but I'm sure that reporting this
-         * as an internal error which our caller
-         * interprets as a malloc failure is wrong.
-         */
+        // tree_init() returns success and a null tree
+        // if it's just looking at a trust anchor.
+        // I'm not sure that returning success here is
+        // correct, but I'm sure that reporting this
+        // as an internal error which our caller
+        // interprets as a malloc failure is wrong.
         return 1;
       }
       break;
@@ -828,7 +788,7 @@
     goto error;
   }
 
-  /* Return value 2 means tree empty */
+  // Return value 2 means tree empty
   if (ret == 2) {
     X509_policy_tree_free(tree);
     if (*pexplicit_policy) {
@@ -838,7 +798,7 @@
     }
   }
 
-  /* Tree is not empty: continue */
+  // Tree is not empty: continue
 
   calc_ret = tree_calculate_authority_set(tree, &auth_nodes);
 
diff --git a/crypto/x509v3/v3_akey.c b/crypto/x509v3/v3_akey.c
index e893561..343940b 100644
--- a/crypto/x509v3/v3_akey.c
+++ b/crypto/x509v3/v3_akey.c
@@ -125,13 +125,11 @@
   return NULL;
 }
 
-/*
- * Currently two options: keyid: use the issuers subject keyid, the value
- * 'always' means its is an error if the issuer certificate doesn't have a
- * key id. issuer: use the issuers cert issuer and serial number. The default
- * is to only use this if keyid is not present. With the option 'always' this
- * is always included.
- */
+// Currently two options: keyid: use the issuers subject keyid, the value
+// 'always' means its is an error if the issuer certificate doesn't have a
+// key id. issuer: use the issuers cert issuer and serial number. The default
+// is to only use this if keyid is not present. With the option 'always' this
+// is always included.
 
 static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method,
                                  X509V3_CTX *ctx,
diff --git a/crypto/x509v3/v3_alt.c b/crypto/x509v3/v3_alt.c
index 3f47901..1f83d88 100644
--- a/crypto/x509v3/v3_alt.c
+++ b/crypto/x509v3/v3_alt.c
@@ -117,9 +117,9 @@
 STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method,
                                        GENERAL_NAME *gen,
                                        STACK_OF(CONF_VALUE) *ret) {
-  /* Note the error-handling for this function relies on there being at most
-   * one |X509V3_add_value| call. If there were two and the second failed, we
-   * would need to sometimes free the first call's result. */
+  // Note the error-handling for this function relies on there being at most
+  // one |X509V3_add_value| call. If there were two and the second failed, we
+  // would need to sometimes free the first call's result.
   unsigned char *p;
   char oline[256], htmp[5];
   int i;
@@ -217,7 +217,7 @@
       break;
 
     case GEN_EDIPARTY:
-      /* Maybe fix this: it is supported now */
+      // Maybe fix this: it is supported now
       BIO_printf(out, "EdiPartyName:<unsupported>");
       break;
 
@@ -297,7 +297,7 @@
   return NULL;
 }
 
-/* Append subject altname of issuer to issuer alt name of subject */
+// Append subject altname of issuer to issuer alt name of subject
 
 static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) {
   if (ctx && (ctx->flags == CTX_TEST)) {
@@ -327,7 +327,7 @@
       OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
       goto err;
     }
-    /* Ownership of |gen| has moved from |ialt| to |gens|. */
+    // Ownership of |gen| has moved from |ialt| to |gens|.
     sk_GENERAL_NAME_set(ialt, j, NULL);
   }
 
@@ -373,9 +373,7 @@
   return NULL;
 }
 
-/*
- * Copy any email addresses in a certificate or request to GENERAL_NAMES
- */
+// Copy any email addresses in a certificate or request to GENERAL_NAMES
 
 static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) {
   X509_NAME *nm;
@@ -390,14 +388,14 @@
     OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_SUBJECT_DETAILS);
     goto err;
   }
-  /* Find the subject name */
+  // Find the subject name
   if (ctx->subject_cert) {
     nm = X509_get_subject_name(ctx->subject_cert);
   } else {
     nm = X509_REQ_get_subject_name(ctx->subject_req);
   }
 
-  /* Now add any email address(es) to STACK */
+  // Now add any email address(es) to STACK
   i = -1;
   while ((i = X509_NAME_get_index_by_NID(nm, NID_pkcs9_emailAddress, i)) >= 0) {
     ne = X509_NAME_get_entry(nm, i);
@@ -593,10 +591,8 @@
   if (!(gen->d.otherName = OTHERNAME_new())) {
     return 0;
   }
-  /*
-   * Free this up because we will overwrite it. no need to free type_id
-   * because it is static
-   */
+  // Free this up because we will overwrite it. no need to free type_id
+  // because it is static
   ASN1_TYPE_free(gen->d.otherName->value);
   if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx))) {
     return 0;
@@ -628,7 +624,7 @@
     ERR_add_error_data(2, "section=", value);
     goto err;
   }
-  /* FIXME: should allow other character types... */
+  // FIXME: should allow other character types...
   if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC)) {
     goto err;
   }
diff --git a/crypto/x509v3/v3_conf.c b/crypto/x509v3/v3_conf.c
index 1c10158..7140edd 100644
--- a/crypto/x509v3/v3_conf.c
+++ b/crypto/x509v3/v3_conf.c
@@ -55,7 +55,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* extension creation utilities */
+// extension creation utilities
 
 #include <ctype.h>
 #include <stdio.h>
@@ -83,9 +83,9 @@
                                   int crit, void *ext_struc);
 static unsigned char *generic_asn1(const char *value, X509V3_CTX *ctx,
                                    long *ext_len);
-/* CONF *conf:  Config file    */
-/* char *name:  Name    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *name:  Name
+// char *value:  Value
 X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name,
                                  const char *value) {
   int crit;
@@ -103,8 +103,8 @@
   return ret;
 }
 
-/* CONF *conf:  Config file    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *value:  Value
 X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid,
                                      const char *value) {
   int crit;
@@ -117,8 +117,8 @@
   return do_ext_nconf(conf, ctx, ext_nid, crit, value);
 }
 
-/* CONF *conf:  Config file    */
-/* char *value:  Value    */
+// CONF *conf:  Config file
+// char *value:  Value
 static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid,
                                     int crit, const char *value) {
   const X509V3_EXT_METHOD *method;
@@ -133,7 +133,7 @@
     OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION);
     return NULL;
   }
-  /* Now get internal extension representation based on type */
+  // Now get internal extension representation based on type
   if (method->v2i) {
     if (*value == '@') {
       nval = NCONF_get_section(conf, value + 1);
@@ -188,7 +188,7 @@
   int ext_len;
   ASN1_OCTET_STRING *ext_oct;
   X509_EXTENSION *ext;
-  /* Convert internal representation to DER */
+  // Convert internal representation to DER
   if (method->it) {
     ext_der = NULL;
     ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
@@ -223,7 +223,7 @@
   return NULL;
 }
 
-/* Given an internal structure, nid and critical flag create an extension */
+// Given an internal structure, nid and critical flag create an extension
 
 X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc) {
   const X509V3_EXT_METHOD *method;
@@ -234,7 +234,7 @@
   return do_ext_i2d(method, ext_nid, crit, ext_struc);
 }
 
-/* Check the extension string for critical flag */
+// Check the extension string for critical flag
 static int v3_check_critical(const char **value) {
   const char *p = *value;
   if ((strlen(p) < 9) || strncmp(p, "critical,", 9)) {
@@ -248,7 +248,7 @@
   return 1;
 }
 
-/* Check extension string for generic extension and return the type */
+// Check extension string for generic extension and return the type
 static int v3_check_generic(const char **value) {
   int gen_type = 0;
   const char *p = *value;
@@ -269,7 +269,7 @@
   return gen_type;
 }
 
-/* Create a generic extension: for now just handle DER type */
+// Create a generic extension: for now just handle DER type
 static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value,
                                             int crit, int gen_type,
                                             X509V3_CTX *ctx) {
@@ -329,10 +329,8 @@
   return ext_der;
 }
 
-/*
- * This is the main function: add a bunch of extensions based on a config
- * file section to an extension STACK.
- */
+// This is the main function: add a bunch of extensions based on a config
+// file section to an extension STACK.
 
 int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section,
                             STACK_OF(X509_EXTENSION) **sk) {
@@ -356,9 +354,7 @@
   return 1;
 }
 
-/*
- * Convenience functions to add extensions to a certificate, CRL and request
- */
+// Convenience functions to add extensions to a certificate, CRL and request
 
 int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                          X509 *cert) {
@@ -369,7 +365,7 @@
   return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
 }
 
-/* Same as above but for a CRL */
+// Same as above but for a CRL
 
 int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                              X509_CRL *crl) {
@@ -380,7 +376,7 @@
   return X509V3_EXT_add_nconf_sk(conf, ctx, section, sk);
 }
 
-/* Add extensions to certificate request */
+// Add extensions to certificate request
 
 int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                              X509_REQ *req) {
@@ -398,7 +394,7 @@
   return i;
 }
 
-/* Config database functions */
+// Config database functions
 
 char *X509V3_get_string(X509V3_CTX *ctx, const char *name,
                         const char *section) {
@@ -443,11 +439,11 @@
 
 static char *nconf_get_string(void *db, const char *section,
                               const char *value) {
-  /* TODO(fork): This returns a non-const pointer because |X509V3_CONF_METHOD|
-   * allows |get_string| to return caller-owned pointers, provided they're
-   * freed by |free_string|. |nconf_method| leaves |free_string| NULL, and
-   * there are no other implementations of |X509V3_CONF_METHOD|, so this can
-   * be simplified if we make it private. */
+  // TODO(fork): This returns a non-const pointer because |X509V3_CONF_METHOD|
+  // allows |get_string| to return caller-owned pointers, provided they're
+  // freed by |free_string|. |nconf_method| leaves |free_string| NULL, and
+  // there are no other implementations of |X509V3_CONF_METHOD|, so this can
+  // be simplified if we make it private.
   return (char *)NCONF_get_string(db, section, value);
 }
 
diff --git a/crypto/x509v3/v3_cpols.c b/crypto/x509v3/v3_cpols.c
index d2a6747..5b6841e 100644
--- a/crypto/x509v3/v3_cpols.c
+++ b/crypto/x509v3/v3_cpols.c
@@ -71,7 +71,7 @@
 
 #include "internal.h"
 
-/* Certificate policies extension support: this one is a bit complex... */
+// Certificate policies extension support: this one is a bit complex...
 
 static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
                        int indent);
@@ -432,7 +432,7 @@
 static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
                        int indent) {
   const STACK_OF(POLICYINFO) *pol = ext;
-  /* First print out the policy OIDs */
+  // First print out the policy OIDs
   for (size_t i = 0; i < sk_POLICYINFO_num(pol); i++) {
     const POLICYINFO *pinfo = sk_POLICYINFO_value(pol, i);
     BIO_printf(out, "%*sPolicy: ", indent, "");
diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c
index a7b9ff3..f1cab70 100644
--- a/crypto/x509v3/v3_crld.c
+++ b/crypto/x509v3/v3_crld.c
@@ -161,9 +161,7 @@
     if (!ret || sk_X509_NAME_ENTRY_num(rnm) <= 0) {
       goto err;
     }
-    /*
-     * Since its a name fragment can't have more than one RDNSequence
-     */
+    // Since its a name fragment can't have more than one RDNSequence
     if (sk_X509_NAME_ENTRY_value(rnm, sk_X509_NAME_ENTRY_num(rnm) - 1)->set) {
       OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_MULTIPLE_RDNS);
       goto err;
@@ -609,7 +607,7 @@
       return 0;
     }
   }
-  /* generate cached encoding of name */
+  // generate cached encoding of name
   if (i2d_X509_NAME(dpn->dpname, NULL) < 0) {
     X509_NAME_free(dpn->dpname);
     dpn->dpname = NULL;
diff --git a/crypto/x509v3/v3_extku.c b/crypto/x509v3/v3_extku.c
index 9d43b0f..7eb7cc8 100644
--- a/crypto/x509v3/v3_extku.c
+++ b/crypto/x509v3/v3_extku.c
@@ -86,7 +86,7 @@
     NULL,
 };
 
-/* NB OCSP acceptable responses also is a SEQUENCE OF OBJECT */
+// NB OCSP acceptable responses also is a SEQUENCE OF OBJECT
 const X509V3_EXT_METHOD v3_ocsp_accresp = {
     NID_id_pkix_OCSP_acceptableResponses,
     0,
diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c
index 4b37fc9..bd1aac1 100644
--- a/crypto/x509v3/v3_genn.c
+++ b/crypto/x509v3/v3_genn.c
@@ -65,14 +65,14 @@
 
 ASN1_SEQUENCE(OTHERNAME) = {
     ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT),
-    /* Maybe have a true ANY DEFINED BY later */
+    // Maybe have a true ANY DEFINED BY later
     ASN1_EXP(OTHERNAME, value, ASN1_ANY, 0),
 } ASN1_SEQUENCE_END(OTHERNAME)
 
 IMPLEMENT_ASN1_FUNCTIONS(OTHERNAME)
 
 ASN1_SEQUENCE(EDIPARTYNAME) = {
-    /* DirectoryString is a CHOICE type, so use explicit tagging. */
+    // DirectoryString is a CHOICE type, so use explicit tagging.
     ASN1_EXP_OPT(EDIPARTYNAME, nameAssigner, DIRECTORYSTRING, 0),
     ASN1_EXP(EDIPARTYNAME, partyName, DIRECTORYSTRING, 1),
 } ASN1_SEQUENCE_END(EDIPARTYNAME)
@@ -83,9 +83,9 @@
     ASN1_IMP(GENERAL_NAME, d.otherName, OTHERNAME, GEN_OTHERNAME),
     ASN1_IMP(GENERAL_NAME, d.rfc822Name, ASN1_IA5STRING, GEN_EMAIL),
     ASN1_IMP(GENERAL_NAME, d.dNSName, ASN1_IA5STRING, GEN_DNS),
-    /* Don't decode this */
+    // Don't decode this
     ASN1_IMP(GENERAL_NAME, d.x400Address, ASN1_SEQUENCE, GEN_X400),
-    /* X509_NAME is a CHOICE type so use EXPLICIT */
+    // X509_NAME is a CHOICE type so use EXPLICIT
     ASN1_EXP(GENERAL_NAME, d.directoryName, X509_NAME, GEN_DIRNAME),
     ASN1_IMP(GENERAL_NAME, d.ediPartyName, EDIPARTYNAME, GEN_EDIPARTY),
     ASN1_IMP(GENERAL_NAME, d.uniformResourceIdentifier, ASN1_IA5STRING,
@@ -106,7 +106,7 @@
 IMPLEMENT_ASN1_DUP_FUNCTION(GENERAL_NAME)
 
 static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) {
-  /* nameAssigner is optional and may be NULL. */
+  // nameAssigner is optional and may be NULL.
   if (a->nameAssigner == NULL) {
     if (b->nameAssigner != NULL) {
       return -1;
@@ -118,11 +118,11 @@
     }
   }
 
-  /* partyName may not be NULL. */
+  // partyName may not be NULL.
   return ASN1_STRING_cmp(a->partyName, b->partyName);
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
+// Returns 0 if they are equal, != 0 otherwise.
 int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) {
   if (!a || !b || a->type != b->type) {
     return -1;
@@ -156,18 +156,18 @@
   return -1;
 }
 
-/* Returns 0 if they are equal, != 0 otherwise. */
+// Returns 0 if they are equal, != 0 otherwise.
 int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b) {
   int result = -1;
 
   if (!a || !b) {
     return -1;
   }
-  /* Check their type first. */
+  // Check their type first.
   if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) {
     return result;
   }
-  /* Check the value. */
+  // Check the value.
   result = ASN1_TYPE_cmp(a->value, b->value);
   return result;
 }
diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c
index 9434d37..4400b8e 100644
--- a/crypto/x509v3/v3_lib.c
+++ b/crypto/x509v3/v3_lib.c
@@ -189,14 +189,12 @@
   }
 }
 
-/*
- * Legacy function: we don't need to add standard extensions any more because
- * they are now kept in ext_dat.h.
- */
+// Legacy function: we don't need to add standard extensions any more because
+// they are now kept in ext_dat.h.
 
 int X509V3_add_standard_extensions(void) { return 1; }
 
-/* Return an extension internal structure */
+// Return an extension internal structure
 
 void *X509V3_EXT_d2i(const X509_EXTENSION *ext) {
   const X509V3_EXT_METHOD *method;
@@ -216,7 +214,7 @@
   if (ret == NULL) {
     return NULL;
   }
-  /* Check for trailing data. */
+  // Check for trailing data.
   if (p != ext->value->data + ext->value->length) {
     if (method->it) {
       ASN1_item_free(ret, ASN1_ITEM_ptr(method->it));
@@ -255,13 +253,13 @@
     ex = sk_X509_EXTENSION_value(extensions, i);
     if (OBJ_obj2nid(ex->object) == nid) {
       if (out_idx) {
-        /* TODO(https://crbug.com/boringssl/379): Consistently reject
-         * duplicate extensions. */
+        // TODO(https://crbug.com/boringssl/379): Consistently reject
+        // duplicate extensions.
         *out_idx = i;
         found_ex = ex;
         break;
       } else if (found_ex) {
-        /* Found more than one */
+        // Found more than one
         if (out_critical) {
           *out_critical = -2;
         }
@@ -271,14 +269,14 @@
     }
   }
   if (found_ex) {
-    /* Found it */
+    // Found it
     if (out_critical) {
       *out_critical = X509_EXTENSION_get_critical(found_ex);
     }
     return X509V3_EXT_d2i(found_ex);
   }
 
-  /* Extension not found */
+  // Extension not found
   if (out_idx) {
     *out_idx = -1;
   }
@@ -288,11 +286,9 @@
   return NULL;
 }
 
-/*
- * This function is a general extension append, replace and delete utility.
- * The precise operation is governed by the 'flags' value. The 'crit' and
- * 'value' arguments (if relevant) are the extensions internal structure.
- */
+// This function is a general extension append, replace and delete utility.
+// The precise operation is governed by the 'flags' value. The 'crit' and
+// 'value' arguments (if relevant) are the extensions internal structure.
 
 int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value,
                     int crit, unsigned long flags) {
@@ -301,26 +297,24 @@
   STACK_OF(X509_EXTENSION) *ret = NULL;
   unsigned long ext_op = flags & X509V3_ADD_OP_MASK;
 
-  /*
-   * If appending we don't care if it exists, otherwise look for existing
-   * extension.
-   */
+  // If appending we don't care if it exists, otherwise look for existing
+  // extension.
   if (ext_op != X509V3_ADD_APPEND) {
     extidx = X509v3_get_ext_by_NID(*x, nid, -1);
   }
 
-  /* See if extension exists */
+  // See if extension exists
   if (extidx >= 0) {
-    /* If keep existing, nothing to do */
+    // If keep existing, nothing to do
     if (ext_op == X509V3_ADD_KEEP_EXISTING) {
       return 1;
     }
-    /* If default then its an error */
+    // If default then its an error
     if (ext_op == X509V3_ADD_DEFAULT) {
       errcode = X509V3_R_EXTENSION_EXISTS;
       goto err;
     }
-    /* If delete, just delete it */
+    // If delete, just delete it
     if (ext_op == X509V3_ADD_DELETE) {
       if (!sk_X509_EXTENSION_delete(*x, extidx)) {
         return -1;
@@ -328,9 +322,7 @@
       return 1;
     }
   } else {
-    /*
-     * If replace existing or delete, error since extension must exist
-     */
+    // If replace existing or delete, error since extension must exist
     if ((ext_op == X509V3_ADD_REPLACE_EXISTING) ||
         (ext_op == X509V3_ADD_DELETE)) {
       errcode = X509V3_R_EXTENSION_NOT_FOUND;
@@ -338,10 +330,8 @@
     }
   }
 
-  /*
-   * If we get this far then we have to create an extension: could have
-   * some flags for alternative encoding schemes...
-   */
+  // If we get this far then we have to create an extension: could have
+  // some flags for alternative encoding schemes...
 
   ext = X509V3_EXT_i2d(nid, crit, value);
 
@@ -350,7 +340,7 @@
     return 0;
   }
 
-  /* If extension exists replace it.. */
+  // If extension exists replace it..
   if (extidx >= 0) {
     extmp = sk_X509_EXTENSION_value(*x, extidx);
     X509_EXTENSION_free(extmp);
diff --git a/crypto/x509v3/v3_ncons.c b/crypto/x509v3/v3_ncons.c
index ce1c82e..55f4eed 100644
--- a/crypto/x509v3/v3_ncons.c
+++ b/crypto/x509v3/v3_ncons.c
@@ -227,19 +227,18 @@
   return 1;
 }
 
-/*-
- * Check a certificate conforms to a specified set of constraints.
- * Return values:
- *   X509_V_OK: All constraints obeyed.
- *   X509_V_ERR_PERMITTED_VIOLATION: Permitted subtree violation.
- *   X509_V_ERR_EXCLUDED_VIOLATION: Excluded subtree violation.
- *   X509_V_ERR_SUBTREE_MINMAX: Min or max values present and matching type.
- *   X509_V_ERR_UNSPECIFIED: Unspecified error.
- *   X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type.
- *   X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: Bad or unsupported constraint
- *     syntax.
- *   X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name.
- */
+//-
+// Check a certificate conforms to a specified set of constraints.
+// Return values:
+//   X509_V_OK: All constraints obeyed.
+//   X509_V_ERR_PERMITTED_VIOLATION: Permitted subtree violation.
+//   X509_V_ERR_EXCLUDED_VIOLATION: Excluded subtree violation.
+//   X509_V_ERR_SUBTREE_MINMAX: Min or max values present and matching type.
+//   X509_V_ERR_UNSPECIFIED: Unspecified error.
+//   X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type.
+//   X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: Bad or unsupported constraint
+//     syntax.
+//   X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: Bad or unsupported syntax of name.
 
 int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) {
   int r, i;
@@ -248,9 +247,9 @@
 
   nm = X509_get_subject_name(x);
 
-  /* Guard against certificates with an excessive number of names or
-   * constraints causing a computationally expensive name constraints
-   * check. */
+  // Guard against certificates with an excessive number of names or
+  // constraints causing a computationally expensive name constraints
+  // check.
   size_t name_count =
       X509_NAME_entry_count(nm) + sk_GENERAL_NAME_num(x->altname);
   size_t constraint_count = sk_GENERAL_SUBTREE_num(nc->permittedSubtrees) +
@@ -276,7 +275,7 @@
 
     gntmp.type = GEN_EMAIL;
 
-    /* Process any email address attributes in subject name */
+    // Process any email address attributes in subject name
 
     for (i = -1;;) {
       X509_NAME_ENTRY *ne;
@@ -314,10 +313,8 @@
   int r, match = 0;
   size_t i;
 
-  /*
-   * Permitted subtrees: if any subtrees exist of matching the type at
-   * least one subtree must match.
-   */
+  // Permitted subtrees: if any subtrees exist of matching the type at
+  // least one subtree must match.
 
   for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) {
     sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i);
@@ -327,7 +324,7 @@
     if (sub->minimum || sub->maximum) {
       return X509_V_ERR_SUBTREE_MINMAX;
     }
-    /* If we already have a match don't bother trying any more */
+    // If we already have a match don't bother trying any more
     if (match == 2) {
       continue;
     }
@@ -346,7 +343,7 @@
     return X509_V_ERR_PERMITTED_VIOLATION;
   }
 
-  /* Excluded subtrees: must not match any of these */
+  // Excluded subtrees: must not match any of these
 
   for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) {
     sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i);
@@ -388,14 +385,12 @@
   }
 }
 
-/*
- * directoryName name constraint matching. The canonical encoding of
- * X509_NAME makes this comparison easy. It is matched if the subtree is a
- * subset of the name.
- */
+// directoryName name constraint matching. The canonical encoding of
+// X509_NAME makes this comparison easy. It is matched if the subtree is a
+// subset of the name.
 
 static int nc_dn(X509_NAME *nm, X509_NAME *base) {
-  /* Ensure canonical encodings are up to date.  */
+  // Ensure canonical encodings are up to date.
   if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) {
     return X509_V_ERR_OUT_OF_MEM;
   }
@@ -419,8 +414,8 @@
   if (CBS_len(a) != CBS_len(b)) {
     return 0;
   }
-  /* Note we cannot use |OPENSSL_strncasecmp| because that would stop
-   * iterating at NUL. */
+  // Note we cannot use |OPENSSL_strncasecmp| because that would stop
+  // iterating at NUL.
   const uint8_t *a_data = CBS_data(a), *b_data = CBS_data(b);
   for (size_t i = 0; i < CBS_len(a); i++) {
     if (OPENSSL_tolower(a_data[i]) != OPENSSL_tolower(b_data[i])) {
@@ -444,13 +439,13 @@
   CBS_init(&dns_cbs, dns->data, dns->length);
   CBS_init(&base_cbs, base->data, base->length);
 
-  /* Empty matches everything */
+  // Empty matches everything
   if (CBS_len(&base_cbs) == 0) {
     return X509_V_OK;
   }
 
-  /* If |base_cbs| begins with a '.', do a simple suffix comparison. This is
-   * not part of RFC5280, but is part of OpenSSL's original behavior. */
+  // If |base_cbs| begins with a '.', do a simple suffix comparison. This is
+  // not part of RFC5280, but is part of OpenSSL's original behavior.
   if (starts_with(&base_cbs, '.')) {
     if (has_suffix_case(&dns_cbs, &base_cbs)) {
       return X509_V_OK;
@@ -458,10 +453,8 @@
     return X509_V_ERR_PERMITTED_VIOLATION;
   }
 
-  /*
-   * Otherwise can add zero or more components on the left so compare RHS
-   * and if dns is longer and expect '.' as preceding character.
-   */
+  // Otherwise can add zero or more components on the left so compare RHS
+  // and if dns is longer and expect '.' as preceding character.
   if (CBS_len(&dns_cbs) > CBS_len(&base_cbs)) {
     uint8_t dot;
     if (!CBS_skip(&dns_cbs, CBS_len(&dns_cbs) - CBS_len(&base_cbs) - 1) ||
@@ -482,16 +475,16 @@
   CBS_init(&eml_cbs, eml->data, eml->length);
   CBS_init(&base_cbs, base->data, base->length);
 
-  /* TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
-   * last one. Match them here, or perhaps do an actual parse. Looks like
-   * multiple '@'s may be allowed in quoted strings. */
+  // TODO(davidben): In OpenSSL 1.1.1, this switched from the first '@' to the
+  // last one. Match them here, or perhaps do an actual parse. Looks like
+  // multiple '@'s may be allowed in quoted strings.
   CBS eml_local, base_local;
   if (!CBS_get_until_first(&eml_cbs, &eml_local, '@')) {
     return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
   }
   int base_has_at = CBS_get_until_first(&base_cbs, &base_local, '@');
 
-  /* Special case: inital '.' is RHS match */
+  // Special case: inital '.' is RHS match
   if (!base_has_at && starts_with(&base_cbs, '.')) {
     if (has_suffix_case(&eml_cbs, &base_cbs)) {
       return X509_V_OK;
@@ -499,23 +492,23 @@
     return X509_V_ERR_PERMITTED_VIOLATION;
   }
 
-  /* If we have anything before '@' match local part */
+  // If we have anything before '@' match local part
   if (base_has_at) {
-    /* TODO(davidben): This interprets a constraint of "@example.com" as
-     * "example.com", which is not part of RFC5280. */
+    // TODO(davidben): This interprets a constraint of "@example.com" as
+    // "example.com", which is not part of RFC5280.
     if (CBS_len(&base_local) > 0) {
-      /* Case sensitive match of local part */
+      // Case sensitive match of local part
       if (!CBS_mem_equal(&base_local, CBS_data(&eml_local),
                          CBS_len(&eml_local))) {
         return X509_V_ERR_PERMITTED_VIOLATION;
       }
     }
-    /* Position base after '@' */
+    // Position base after '@'
     assert(starts_with(&base_cbs, '@'));
     CBS_skip(&base_cbs, 1);
   }
 
-  /* Just have hostname left to match: case insensitive */
+  // Just have hostname left to match: case insensitive
   assert(starts_with(&eml_cbs, '@'));
   CBS_skip(&eml_cbs, 1);
   if (!equal_case(&base_cbs, &eml_cbs)) {
@@ -530,7 +523,7 @@
   CBS_init(&uri_cbs, uri->data, uri->length);
   CBS_init(&base_cbs, base->data, base->length);
 
-  /* Check for foo:// and skip past it */
+  // Check for foo:// and skip past it
   CBS scheme;
   uint8_t byte;
   if (!CBS_get_until_first(&uri_cbs, &scheme, ':') ||
@@ -540,10 +533,10 @@
     return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
   }
 
-  /* Look for a port indicator as end of hostname first. Otherwise look for
-   * trailing slash, or the end of the string.
-   * TODO(davidben): This is not a correct URI parser and mishandles IPv6
-   * literals. */
+  // Look for a port indicator as end of hostname first. Otherwise look for
+  // trailing slash, or the end of the string.
+  // TODO(davidben): This is not a correct URI parser and mishandles IPv6
+  // literals.
   CBS host;
   if (!CBS_get_until_first(&uri_cbs, &host, ':') &&
       !CBS_get_until_first(&uri_cbs, &host, '/')) {
@@ -554,7 +547,7 @@
     return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX;
   }
 
-  /* Special case: inital '.' is RHS match */
+  // Special case: inital '.' is RHS match
   if (starts_with(&base_cbs, '.')) {
     if (has_suffix_case(&host, &base_cbs)) {
       return X509_V_OK;
diff --git a/crypto/x509v3/v3_ocsp.c b/crypto/x509v3/v3_ocsp.c
index 9d648f6..b490a11 100644
--- a/crypto/x509v3/v3_ocsp.c
+++ b/crypto/x509v3/v3_ocsp.c
@@ -13,9 +13,7 @@
 #include <openssl/bio.h>
 #include <openssl/nid.h>
 
-/*
- * OCSP extensions and a couple of CRL entry extensions
- */
+// OCSP extensions and a couple of CRL entry extensions
 
 static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce,
                             BIO *out, int indent);
@@ -70,7 +68,7 @@
   return 1;
 }
 
-/* Nocheck is just a single NULL. Don't print anything and always set it */
+// Nocheck is just a single NULL. Don't print anything and always set it
 
 static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck,
                             BIO *out, int indent) {
diff --git a/crypto/x509v3/v3_pci.c b/crypto/x509v3/v3_pci.c
index 95fda03..cafb40c 100644
--- a/crypto/x509v3/v3_pci.c
+++ b/crypto/x509v3/v3_pci.c
@@ -147,10 +147,8 @@
         (*policy)->data[(*policy)->length] = '\0';
       } else {
         OPENSSL_free(tmp_data2);
-        /*
-         * realloc failure implies the original data space is b0rked
-         * too!
-         */
+        // realloc failure implies the original data space is b0rked
+        // too!
         (*policy)->data = NULL;
         (*policy)->length = 0;
         OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -169,10 +167,8 @@
         (*policy)->length += val_len;
         (*policy)->data[(*policy)->length] = '\0';
       } else {
-        /*
-         * realloc failure implies the original data space is b0rked
-         * too!
-         */
+        // realloc failure implies the original data space is b0rked
+        // too!
         (*policy)->data = NULL;
         (*policy)->length = 0;
         OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -243,7 +239,7 @@
     }
   }
 
-  /* Language is mandatory */
+  // Language is mandatory
   if (!language) {
     OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED);
     goto err;
diff --git a/crypto/x509v3/v3_prn.c b/crypto/x509v3/v3_prn.c
index ba56c87..129c4fa 100644
--- a/crypto/x509v3/v3_prn.c
+++ b/crypto/x509v3/v3_prn.c
@@ -55,7 +55,7 @@
  * (eay@cryptsoft.com).  This product includes software written by Tim
  * Hudson (tjh@cryptsoft.com). */
 
-/* X509 v3 extension utilities */
+// X509 v3 extension utilities
 
 #include <stdio.h>
 
@@ -64,12 +64,12 @@
 #include <openssl/mem.h>
 #include <openssl/x509v3.h>
 
-/* Extension printing routines */
+// Extension printing routines
 
 static int unknown_ext_print(BIO *out, X509_EXTENSION *ext, unsigned long flag,
                              int indent, int supported);
 
-/* Print out a name+value stack */
+// Print out a name+value stack
 
 void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent,
                         int ml) {
@@ -104,7 +104,7 @@
   }
 }
 
-/* Main routine: print out a general extension */
+// Main routine: print out a general extension
 
 int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag,
                      int indent) {
diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c
index 0b51a07..9a925b2 100644
--- a/crypto/x509v3/v3_purp.c
+++ b/crypto/x509v3/v3_purp.c
@@ -131,11 +131,9 @@
   return (*a)->purpose - (*b)->purpose;
 }
 
-/*
- * As much as I'd like to make X509_check_purpose use a "const" X509* I
- * really can't because it does recalculate hashes and do other non-const
- * things.
- */
+// As much as I'd like to make X509_check_purpose use a "const" X509* I
+// really can't because it does recalculate hashes and do other non-const
+// things.
 int X509_check_purpose(X509 *x, int id, int ca) {
   int idx;
   const X509_PURPOSE *pt;
@@ -218,15 +216,13 @@
   X509_PURPOSE *ptmp;
   char *name_dup, *sname_dup;
 
-  /*
-   * This is set according to what we change: application can't set it
-   */
+  // This is set according to what we change: application can't set it
   flags &= ~X509_PURPOSE_DYNAMIC;
-  /* This will always be set for application modified trust entries */
+  // This will always be set for application modified trust entries
   flags |= X509_PURPOSE_DYNAMIC_NAME;
-  /* Get existing entry if any */
+  // Get existing entry if any
   idx = X509_PURPOSE_get_by_id(id);
-  /* Need a new entry */
+  // Need a new entry
   if (idx == -1) {
     if (!(ptmp = OPENSSL_malloc(sizeof(X509_PURPOSE)))) {
       OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -237,7 +233,7 @@
     ptmp = X509_PURPOSE_get0(idx);
   }
 
-  /* Duplicate the supplied names. */
+  // Duplicate the supplied names.
   name_dup = OPENSSL_strdup(name);
   sname_dup = OPENSSL_strdup(sname);
   if (name_dup == NULL || sname_dup == NULL) {
@@ -254,17 +250,17 @@
     return 0;
   }
 
-  /* OPENSSL_free existing name if dynamic */
+  // OPENSSL_free existing name if dynamic
   if (ptmp->flags & X509_PURPOSE_DYNAMIC_NAME) {
     OPENSSL_free(ptmp->name);
     OPENSSL_free(ptmp->sname);
   }
-  /* dup supplied name */
+  // dup supplied name
   ptmp->name = name_dup;
   ptmp->sname = sname_dup;
-  /* Keep the dynamic flag of existing entry */
+  // Keep the dynamic flag of existing entry
   ptmp->flags &= X509_PURPOSE_DYNAMIC;
-  /* Set all other flags */
+  // Set all other flags
   ptmp->flags |= flags;
 
   ptmp->purpose = id;
@@ -272,7 +268,7 @@
   ptmp->check_purpose = ck;
   ptmp->usr_data = arg;
 
-  /* If its a new entry manage the dynamic table */
+  // If its a new entry manage the dynamic table
   if (idx == -1) {
     if (!xptable && !(xptable = sk_X509_PURPOSE_new(xp_cmp))) {
       OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -325,26 +321,24 @@
 }
 
 int X509_supported_extension(X509_EXTENSION *ex) {
-  /*
-   * This table is a list of the NIDs of supported extensions: that is
-   * those which are used by the verify process. If an extension is
-   * critical and doesn't appear in this list then the verify process will
-   * normally reject the certificate. The list must be kept in numerical
-   * order because it will be searched using bsearch.
-   */
+  // This table is a list of the NIDs of supported extensions: that is
+  // those which are used by the verify process. If an extension is
+  // critical and doesn't appear in this list then the verify process will
+  // normally reject the certificate. The list must be kept in numerical
+  // order because it will be searched using bsearch.
 
   static const int supported_nids[] = {
-      NID_netscape_cert_type,   /* 71 */
-      NID_key_usage,            /* 83 */
-      NID_subject_alt_name,     /* 85 */
-      NID_basic_constraints,    /* 87 */
-      NID_certificate_policies, /* 89 */
-      NID_ext_key_usage,        /* 126 */
-      NID_policy_constraints,   /* 401 */
-      NID_proxyCertInfo,        /* 663 */
-      NID_name_constraints,     /* 666 */
-      NID_policy_mappings,      /* 747 */
-      NID_inhibit_any_policy    /* 748 */
+      NID_netscape_cert_type,    // 71
+      NID_key_usage,             // 83
+      NID_subject_alt_name,      // 85
+      NID_basic_constraints,     // 87
+      NID_certificate_policies,  // 89
+      NID_ext_key_usage,         // 126
+      NID_policy_constraints,    // 401
+      NID_proxyCertInfo,         // 663
+      NID_name_constraints,      // 666
+      NID_policy_mappings,       // 747
+      NID_inhibit_any_policy     // 748
   };
 
   int ex_nid = OBJ_obj2nid(X509_EXTENSION_get_object(ex));
@@ -432,11 +426,11 @@
   if (!X509_digest(x, EVP_sha256(), x->cert_hash, NULL)) {
     x->ex_flags |= EXFLAG_INVALID;
   }
-  /* V1 should mean no extensions ... */
+  // V1 should mean no extensions ...
   if (X509_get_version(x) == X509_VERSION_1) {
     x->ex_flags |= EXFLAG_V1;
   }
-  /* Handle basic constraints */
+  // Handle basic constraints
   if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, &j, NULL))) {
     if (bs->ca) {
       x->ex_flags |= EXFLAG_CA;
@@ -446,11 +440,11 @@
         x->ex_flags |= EXFLAG_INVALID;
         x->ex_pathlen = 0;
       } else {
-        /* TODO(davidben): |ASN1_INTEGER_get| returns -1 on overflow,
-         * which currently acts as if the constraint isn't present. This
-         * works (an overflowing path length constraint may as well be
-         * infinity), but Chromium's verifier simply treats values above
-         * 255 as an error. */
+        // TODO(davidben): |ASN1_INTEGER_get| returns -1 on overflow,
+        // which currently acts as if the constraint isn't present. This
+        // works (an overflowing path length constraint may as well be
+        // infinity), but Chromium's verifier simply treats values above
+        // 255 as an error.
         x->ex_pathlen = ASN1_INTEGER_get(bs->pathlen);
       }
     } else {
@@ -461,7 +455,7 @@
   } else if (j != -1) {
     x->ex_flags |= EXFLAG_INVALID;
   }
-  /* Handle proxy certificates */
+  // Handle proxy certificates
   if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, &j, NULL))) {
     if (x->ex_flags & EXFLAG_CA ||
         X509_get_ext_by_NID(x, NID_subject_alt_name, -1) >= 0 ||
@@ -478,7 +472,7 @@
   } else if (j != -1) {
     x->ex_flags |= EXFLAG_INVALID;
   }
-  /* Handle key usage */
+  // Handle key usage
   if ((usage = X509_get_ext_d2i(x, NID_key_usage, &j, NULL))) {
     if (usage->length > 0) {
       x->ex_kusage = usage->data[0];
@@ -560,10 +554,10 @@
   if (x->akid == NULL && j != -1) {
     x->ex_flags |= EXFLAG_INVALID;
   }
-  /* Does subject name match issuer ? */
+  // Does subject name match issuer ?
   if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
     x->ex_flags |= EXFLAG_SI;
-    /* If SKID matches AKID also indicate self signed */
+    // If SKID matches AKID also indicate self signed
     if (X509_check_akid(x, x->akid) == X509_V_OK &&
         !ku_reject(x, KU_KEY_CERT_SIGN)) {
       x->ex_flags |= EXFLAG_SS;
@@ -600,18 +594,18 @@
   return (x->ex_flags & EXFLAG_INVALID) == 0;
 }
 
-/* check_ca returns one if |x| should be considered a CA certificate and zero
- * otherwise. */
+// check_ca returns one if |x| should be considered a CA certificate and zero
+// otherwise.
 static int check_ca(const X509 *x) {
-  /* keyUsage if present should allow cert signing */
+  // keyUsage if present should allow cert signing
   if (ku_reject(x, KU_KEY_CERT_SIGN)) {
     return 0;
   }
-  /* Version 1 certificates are considered CAs and don't have extensions. */
+  // Version 1 certificates are considered CAs and don't have extensions.
   if ((x->ex_flags & V1_ROOT) == V1_ROOT) {
     return 1;
   }
-  /* Otherwise, it's only a CA if basicConstraints says so. */
+  // Otherwise, it's only a CA if basicConstraints says so.
   return ((x->ex_flags & EXFLAG_BCONS) && (x->ex_flags & EXFLAG_CA));
 }
 
@@ -630,22 +624,20 @@
   if (ca) {
     return check_ca(x);
   }
-  /* We need to do digital signatures or key agreement */
+  // We need to do digital signatures or key agreement
   if (ku_reject(x, KU_DIGITAL_SIGNATURE | KU_KEY_AGREEMENT)) {
     return 0;
   }
-  /* nsCertType if present should allow SSL client use */
+  // nsCertType if present should allow SSL client use
   if (ns_reject(x, NS_SSL_CLIENT)) {
     return 0;
   }
   return 1;
 }
 
-/*
- * Key usage needed for TLS/SSL server: digital signature, encipherment or
- * key agreement. The ssl code can check this more thoroughly for individual
- * key types.
- */
+// Key usage needed for TLS/SSL server: digital signature, encipherment or
+// key agreement. The ssl code can check this more thoroughly for individual
+// key types.
 #define KU_TLS (KU_DIGITAL_SIGNATURE | KU_KEY_ENCIPHERMENT | KU_KEY_AGREEMENT)
 
 static int check_purpose_ssl_server(const X509_PURPOSE *xp, const X509 *x,
@@ -674,21 +666,21 @@
   if (!ret || ca) {
     return ret;
   }
-  /* We need to encipher or Netscape complains */
+  // We need to encipher or Netscape complains
   if (ku_reject(x, KU_KEY_ENCIPHERMENT)) {
     return 0;
   }
   return ret;
 }
 
-/* purpose_smime returns one if |x| is a valid S/MIME leaf (|ca| is zero) or CA
- * (|ca| is one) certificate, and zero otherwise. */
+// purpose_smime returns one if |x| is a valid S/MIME leaf (|ca| is zero) or CA
+// (|ca| is one) certificate, and zero otherwise.
 static int purpose_smime(const X509 *x, int ca) {
   if (xku_reject(x, XKU_SMIME)) {
     return 0;
   }
   if (ca) {
-    /* check nsCertType if present */
+    // check nsCertType if present
     if ((x->ex_flags & EXFLAG_NSCERT) && (x->ex_nscert & NS_SMIME_CA) == 0) {
       return 0;
     }
@@ -738,16 +730,14 @@
   return 1;
 }
 
-/*
- * OCSP helper: this is *not* a full OCSP check. It just checks that each CA
- * is valid. Additional checks must be made on the chain.
- */
+// OCSP helper: this is *not* a full OCSP check. It just checks that each CA
+// is valid. Additional checks must be made on the chain.
 
 static int ocsp_helper(const X509_PURPOSE *xp, const X509 *x, int ca) {
   if (ca) {
     return check_ca(x);
   }
-  /* leaf certificate is checked in OCSP_verify() */
+  // leaf certificate is checked in OCSP_verify()
   return 1;
 }
 
@@ -755,29 +745,27 @@
                                         int ca) {
   int i_ext;
 
-  /* If ca is true we must return if this is a valid CA certificate. */
+  // If ca is true we must return if this is a valid CA certificate.
   if (ca) {
     return check_ca(x);
   }
 
-  /*
-   * Check the optional key usage field:
-   * if Key Usage is present, it must be one of digitalSignature
-   * and/or nonRepudiation (other values are not consistent and shall
-   * be rejected).
-   */
+  // Check the optional key usage field:
+  // if Key Usage is present, it must be one of digitalSignature
+  // and/or nonRepudiation (other values are not consistent and shall
+  // be rejected).
   if ((x->ex_flags & EXFLAG_KUSAGE) &&
       ((x->ex_kusage & ~(KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE)) ||
        !(x->ex_kusage & (KU_NON_REPUDIATION | KU_DIGITAL_SIGNATURE)))) {
     return 0;
   }
 
-  /* Only time stamp key usage is permitted and it's required. */
+  // Only time stamp key usage is permitted and it's required.
   if (!(x->ex_flags & EXFLAG_XKUSAGE) || x->ex_xkusage != XKU_TIMESTAMP) {
     return 0;
   }
 
-  /* Extended Key Usage MUST be critical */
+  // Extended Key Usage MUST be critical
   i_ext = X509_get_ext_by_NID((X509 *)x, NID_ext_key_usage, -1);
   if (i_ext >= 0) {
     X509_EXTENSION *ext = X509_get_ext((X509 *)x, i_ext);
@@ -791,15 +779,13 @@
 
 static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca) { return 1; }
 
-/*
- * Various checks to see if one certificate issued the second. This can be
- * used to prune a set of possible issuer certificates which have been looked
- * up using some simple method such as by subject name. These are: 1. Check
- * issuer_name(subject) == subject_name(issuer) 2. If akid(subject) exists
- * check it matches issuer 3. If key_usage(issuer) exists check it supports
- * certificate signing returns 0 for OK, positive for reason for mismatch,
- * reasons match codes for X509_verify_cert()
- */
+// Various checks to see if one certificate issued the second. This can be
+// used to prune a set of possible issuer certificates which have been looked
+// up using some simple method such as by subject name. These are: 1. Check
+// issuer_name(subject) == subject_name(issuer) 2. If akid(subject) exists
+// check it matches issuer 3. If key_usage(issuer) exists check it supports
+// certificate signing returns 0 for OK, positive for reason for mismatch,
+// reasons match codes for X509_verify_cert()
 
 int X509_check_issued(X509 *issuer, X509 *subject) {
   if (X509_NAME_cmp(X509_get_subject_name(issuer),
@@ -832,23 +818,21 @@
     return X509_V_OK;
   }
 
-  /* Check key ids (if present) */
+  // Check key ids (if present)
   if (akid->keyid && issuer->skid &&
       ASN1_OCTET_STRING_cmp(akid->keyid, issuer->skid)) {
     return X509_V_ERR_AKID_SKID_MISMATCH;
   }
-  /* Check serial number */
+  // Check serial number
   if (akid->serial &&
       ASN1_INTEGER_cmp(X509_get_serialNumber(issuer), akid->serial)) {
     return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;
   }
-  /* Check issuer name */
+  // Check issuer name
   if (akid->issuer) {
-    /*
-     * Ugh, for some peculiar reason AKID includes SEQUENCE OF
-     * GeneralName. So look for a DirName. There may be more than one but
-     * we only take any notice of the first.
-     */
+    // Ugh, for some peculiar reason AKID includes SEQUENCE OF
+    // GeneralName. So look for a DirName. There may be more than one but
+    // we only take any notice of the first.
     GENERAL_NAMES *gens;
     GENERAL_NAME *gen;
     X509_NAME *nm = NULL;
@@ -869,8 +853,8 @@
 }
 
 uint32_t X509_get_extension_flags(X509 *x) {
-  /* Ignore the return value. On failure, |x->ex_flags| will include
-   * |EXFLAG_INVALID|. */
+  // Ignore the return value. On failure, |x->ex_flags| will include
+  // |EXFLAG_INVALID|.
   x509v3_cache_extensions(x);
   return x->ex_flags;
 }
diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c
index bd443c3..16e0e07 100644
--- a/crypto/x509v3/v3_utl.c
+++ b/crypto/x509v3/v3_utl.c
@@ -87,7 +87,7 @@
 static int ipv6_cb(const char *elem, int len, void *usr);
 static int ipv6_hex(unsigned char *out, const char *in, int inlen);
 
-/* Add a CONF_VALUE name value pair to stack */
+// Add a CONF_VALUE name value pair to stack
 
 static int x509V3_add_len_value(const char *name, const char *value,
                                 size_t value_len, int omit_value,
@@ -99,7 +99,7 @@
     goto malloc_err;
   }
   if (!omit_value) {
-    /* |CONF_VALUE| cannot represent strings with NULs. */
+    // |CONF_VALUE| cannot represent strings with NULs.
     if (OPENSSL_memchr(value, 0, value_len)) {
       OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_VALUE);
       goto err;
@@ -152,7 +152,7 @@
                               /*omit_value=*/0, extlist);
 }
 
-/* Free function for STACK_OF(CONF_VALUE) */
+// Free function for STACK_OF(CONF_VALUE)
 
 void X509V3_conf_free(CONF_VALUE *conf) {
   if (!conf) {
@@ -190,11 +190,9 @@
   char *tmp, *ret;
   size_t len;
 
-  /*
-   * Display large numbers in hex and small numbers in decimal. Converting to
-   * decimal takes quadratic time and is no more useful than hex for large
-   * numbers.
-   */
+  // Display large numbers in hex and small numbers in decimal. Converting to
+  // decimal takes quadratic time and is no more useful than hex for large
+  // numbers.
   if (BN_num_bits(bn) < 32) {
     return BN_bn2dec(bn);
   }
@@ -212,7 +210,7 @@
     return NULL;
   }
 
-  /* Prepend "0x", but place it after the "-" if negative. */
+  // Prepend "0x", but place it after the "-" if negative.
   if (tmp[0] == '-') {
     OPENSSL_strlcpy(ret, "-0x", len);
     OPENSSL_strlcat(ret, tmp + 1, len);
@@ -355,9 +353,7 @@
 #define HDR_NAME 1
 #define HDR_VALUE 2
 
-/*
- * #define DEBUG
- */
+// #define DEBUG
 
 STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) {
   char *p, *q, c;
@@ -365,7 +361,7 @@
   STACK_OF(CONF_VALUE) *values = NULL;
   char *linebuf;
   int state;
-  /* We are going to modify the line so copy it first */
+  // We are going to modify the line so copy it first
   linebuf = OPENSSL_strdup(line);
   if (linebuf == NULL) {
     OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
@@ -373,7 +369,7 @@
   }
   state = HDR_NAME;
   ntmp = NULL;
-  /* Go through all characters */
+  // Go through all characters
   for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n'); p++) {
     switch (state) {
       case HDR_NAME:
@@ -450,10 +446,10 @@
   return NULL;
 }
 
-/* Delete leading and trailing spaces from a string */
+// Delete leading and trailing spaces from a string
 static char *strip_spaces(char *name) {
   char *p, *q;
-  /* Skip over leading spaces */
+  // Skip over leading spaces
   p = name;
   while (*p && isspace((unsigned char)*p)) {
     p++;
@@ -474,7 +470,7 @@
   return p;
 }
 
-/* hex string utilities */
+// hex string utilities
 
 char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) {
   CBB cbb;
@@ -637,9 +633,9 @@
   GENERAL_NAME *gen;
   int i;
   size_t j;
-  /* Now add any email address(es) to STACK */
+  // Now add any email address(es) to STACK
   i = -1;
-  /* First supplied X509_NAME */
+  // First supplied X509_NAME
   while ((i = X509_NAME_get_index_by_NID(name, NID_pkcs9_emailAddress, i)) >=
          0) {
     ne = X509_NAME_get_entry(name, i);
@@ -663,15 +659,15 @@
 static void str_free(OPENSSL_STRING str) { OPENSSL_free(str); }
 
 static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email) {
-  /* First some sanity checks */
+  // First some sanity checks
   if (email->type != V_ASN1_IA5STRING) {
     return 1;
   }
   if (email->data == NULL || email->length == 0) {
     return 1;
   }
-  /* |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not
-   * report them as outputs. */
+  // |OPENSSL_STRING| cannot represent strings with embedded NULs. Do not
+  // report them as outputs.
   if (OPENSSL_memchr(email->data, 0, email->length) != NULL) {
     return 1;
   }
@@ -689,7 +685,7 @@
     goto err;
   }
 
-  /* Don't add duplicates */
+  // Don't add duplicates
   sk_OPENSSL_STRING_sort(*sk);
   if (sk_OPENSSL_STRING_find(*sk, NULL, emtmp)) {
     OPENSSL_free(emtmp);
@@ -701,8 +697,8 @@
   return 1;
 
 err:
-  /* TODO(davidben): Fix the error-handling in this file. It currently relies
-   * on |append_ia5| leaving |*sk| at NULL on error. */
+  // TODO(davidben): Fix the error-handling in this file. It currently relies
+  // on |append_ia5| leaving |*sk| at NULL on error.
   OPENSSL_free(emtmp);
   X509_email_free(*sk);
   *sk = NULL;
@@ -717,7 +713,7 @@
                         const unsigned char *subject, size_t subject_len,
                         unsigned int flags);
 
-/* Compare while ASCII ignoring case. */
+// Compare while ASCII ignoring case.
 static int equal_nocase(const unsigned char *pattern, size_t pattern_len,
                         const unsigned char *subject, size_t subject_len,
                         unsigned int flags) {
@@ -727,7 +723,7 @@
   while (pattern_len) {
     unsigned char l = *pattern;
     unsigned char r = *subject;
-    /* The pattern must not contain NUL characters. */
+    // The pattern must not contain NUL characters.
     if (l == 0) {
       return 0;
     }
@@ -749,7 +745,7 @@
   return 1;
 }
 
-/* Compare using OPENSSL_memcmp. */
+// Compare using OPENSSL_memcmp.
 static int equal_case(const unsigned char *pattern, size_t pattern_len,
                       const unsigned char *subject, size_t subject_len,
                       unsigned int flags) {
@@ -759,10 +755,8 @@
   return !OPENSSL_memcmp(pattern, subject, pattern_len);
 }
 
-/*
- * RFC 5280, section 7.5, requires that only the domain is compared in a
- * case-insensitive manner.
- */
+// RFC 5280, section 7.5, requires that only the domain is compared in a
+// case-insensitive manner.
 static int equal_email(const unsigned char *a, size_t a_len,
                        const unsigned char *b, size_t b_len,
                        unsigned int unused_flags) {
@@ -770,11 +764,9 @@
   if (a_len != b_len) {
     return 0;
   }
-  /*
-   * We search backwards for the '@' character, so that we do not have to
-   * deal with quoted local-parts.  The domain part is compared in a
-   * case-insensitive manner.
-   */
+  // We search backwards for the '@' character, so that we do not have to
+  // deal with quoted local-parts.  The domain part is compared in a
+  // case-insensitive manner.
   while (i > 0) {
     --i;
     if (a[i] == '@' || b[i] == '@') {
@@ -790,10 +782,8 @@
   return equal_case(a, i, b, i, 0);
 }
 
-/*
- * Compare the prefix and suffix with the subject, and check that the
- * characters in-between are valid.
- */
+// Compare the prefix and suffix with the subject, and check that the
+// characters in-between are valid.
 static int wildcard_match(const unsigned char *prefix, size_t prefix_len,
                           const unsigned char *suffix, size_t suffix_len,
                           const unsigned char *subject, size_t subject_len,
@@ -814,29 +804,25 @@
   if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags)) {
     return 0;
   }
-  /*
-   * If the wildcard makes up the entire first label, it must match at
-   * least one character.
-   */
+  // If the wildcard makes up the entire first label, it must match at
+  // least one character.
   if (prefix_len == 0 && *suffix == '.') {
     if (wildcard_start == wildcard_end) {
       return 0;
     }
     allow_idna = 1;
   }
-  /* IDNA labels cannot match partial wildcards */
+  // IDNA labels cannot match partial wildcards
   if (!allow_idna && subject_len >= 4 &&
       OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0) {
     return 0;
   }
-  /* The wildcard may match a literal '*' */
+  // The wildcard may match a literal '*'
   if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*') {
     return 1;
   }
-  /*
-   * Check that the part matched by the wildcard contains only
-   * permitted characters and only matches a single label.
-   */
+  // Check that the part matched by the wildcard contains only
+  // permitted characters and only matches a single label.
   for (p = wildcard_start; p != wildcard_end; ++p) {
     if (!(('0' <= *p && *p <= '9') || ('A' <= *p && *p <= 'Z') ||
           ('a' <= *p && *p <= 'z') || *p == '-')) {
@@ -858,22 +844,18 @@
   int state = LABEL_START;
   int dots = 0;
   for (i = 0; i < len; ++i) {
-    /*
-     * Locate first and only legal wildcard, either at the start
-     * or end of a non-IDNA first and not final label.
-     */
+    // Locate first and only legal wildcard, either at the start
+    // or end of a non-IDNA first and not final label.
     if (p[i] == '*') {
       int atstart = (state & LABEL_START);
       int atend = (i == len - 1 || p[i + 1] == '.');
-      /*
-       * At most one wildcard per pattern.
-       * No wildcards in IDNA labels.
-       * No wildcards after the first label.
-       */
+      // At most one wildcard per pattern.
+      // No wildcards in IDNA labels.
+      // No wildcards after the first label.
       if (star != NULL || (state & LABEL_IDNA) != 0 || dots) {
         return NULL;
       }
-      /* Only full-label '*.example.com' wildcards. */
+      // Only full-label '*.example.com' wildcards.
       if (!atstart || !atend) {
         return NULL;
       }
@@ -893,7 +875,7 @@
       state = LABEL_START;
       ++dots;
     } else if (p[i] == '-') {
-      /* no domain/subdomain starts with '-' */
+      // no domain/subdomain starts with '-'
       if ((state & LABEL_START) != 0) {
         return NULL;
       }
@@ -903,26 +885,22 @@
     }
   }
 
-  /*
-   * The final label must not end in a hyphen or ".", and
-   * there must be at least two dots after the star.
-   */
+  // The final label must not end in a hyphen or ".", and
+  // there must be at least two dots after the star.
   if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2) {
     return NULL;
   }
   return star;
 }
 
-/* Compare using wildcards. */
+// Compare using wildcards.
 static int equal_wildcard(const unsigned char *pattern, size_t pattern_len,
                           const unsigned char *subject, size_t subject_len,
                           unsigned int flags) {
   const unsigned char *star = NULL;
 
-  /*
-   * Subject names starting with '.' can only match a wildcard pattern
-   * via a subject sub-domain pattern suffix match.
-   */
+  // Subject names starting with '.' can only match a wildcard pattern
+  // via a subject sub-domain pattern suffix match.
   if (!(subject_len > 1 && subject[0] == '.')) {
     star = valid_star(pattern, pattern_len, flags);
   }
@@ -935,17 +913,17 @@
 }
 
 int x509v3_looks_like_dns_name(const unsigned char *in, size_t len) {
-  /* This function is used as a heuristic for whether a common name is a
-   * hostname to be matched, or merely a decorative name to describe the
-   * subject. This heuristic must be applied to both name constraints and the
-   * common name fallback, so it must be loose enough to accept hostname
-   * common names, and tight enough to reject decorative common names. */
+  // This function is used as a heuristic for whether a common name is a
+  // hostname to be matched, or merely a decorative name to describe the
+  // subject. This heuristic must be applied to both name constraints and the
+  // common name fallback, so it must be loose enough to accept hostname
+  // common names, and tight enough to reject decorative common names.
 
   if (len > 0 && in[len - 1] == '.') {
     len--;
   }
 
-  /* Wildcards are allowed in front. */
+  // Wildcards are allowed in front.
   if (len >= 2 && in[0] == '*' && in[1] == '.') {
     in += 2;
     len -= 2;
@@ -960,13 +938,13 @@
     unsigned char c = in[i];
     if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
         (c >= 'A' && c <= 'Z') || (c == '-' && i > label_start) ||
-        /* These are not valid characters in hostnames, but commonly found
-         * in deployments outside the Web PKI. */
+        // These are not valid characters in hostnames, but commonly found
+        // in deployments outside the Web PKI.
         c == '_' || c == ':') {
       continue;
     }
 
-    /* Labels must not be empty. */
+    // Labels must not be empty.
     if (c == '.' && i > label_start && i < len - 1) {
       label_start = i + 1;
       continue;
@@ -978,11 +956,9 @@
   return 1;
 }
 
-/*
- * Compare an ASN1_STRING to a supplied string. If they match return 1. If
- * cmp_type > 0 only compare if string matches the type, otherwise convert it
- * to UTF8.
- */
+// Compare an ASN1_STRING to a supplied string. If they match return 1. If
+// cmp_type > 0 only compare if string matches the type, otherwise convert it
+// to UTF8.
 
 static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal,
                            unsigned int flags, int check_type, const char *b,
@@ -1011,11 +987,9 @@
     if (astrlen < 0) {
       return -1;
     }
-    /*
-     * We check the common name against DNS name constraints if it passes
-     * |x509v3_looks_like_dns_name|. Thus we must not consider common names
-     * for DNS fallbacks if they fail this check.
-     */
+    // We check the common name against DNS name constraints if it passes
+    // |x509v3_looks_like_dns_name|. Thus we must not consider common names
+    // for DNS fallbacks if they fail this check.
     if (check_type == GEN_DNS && !x509v3_looks_like_dns_name(astr, astrlen)) {
       rv = 0;
     } else {
@@ -1073,7 +1047,7 @@
       } else {
         cstr = gen->d.iPAddress;
       }
-      /* Positive on success, negative on error! */
+      // Positive on success, negative on error!
       if ((rv = do_check_string(cstr, alt_type, equal, flags, check_type, chk,
                                 chklen, peername)) != 0) {
         break;
@@ -1083,7 +1057,7 @@
     return rv;
   }
 
-  /* We're done if CN-ID is not pertinent */
+  // We're done if CN-ID is not pertinent
   if (cnid == NID_undef || (flags & X509_CHECK_FLAG_NEVER_CHECK_SUBJECT)) {
     return 0;
   }
@@ -1095,7 +1069,7 @@
     ASN1_STRING *str;
     ne = X509_NAME_get_entry(name, j);
     str = X509_NAME_ENTRY_get_data(ne);
-    /* Positive on success, negative on error! */
+    // Positive on success, negative on error!
     if ((rv = do_check_string(str, -1, equal, flags, check_type, chk, chklen,
                               peername)) != 0) {
       return rv;
@@ -1148,10 +1122,8 @@
   return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
 }
 
-/*
- * Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
- * with RFC 3280.
- */
+// Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
+// with RFC 3280.
 
 ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc) {
   unsigned char ipout[16];
@@ -1226,7 +1198,7 @@
 }
 
 int x509v3_a2i_ipadd(unsigned char ipout[16], const char *ipasc) {
-  /* If string contains a ':' assume IPv6 */
+  // If string contains a ':' assume IPv6
 
   if (strchr(ipasc, ':')) {
     if (!ipv6_from_asc(ipout, ipasc)) {
@@ -1258,13 +1230,13 @@
 }
 
 typedef struct {
-  /* Temporary store for IPV6 output */
+  // Temporary store for IPV6 output
   unsigned char tmp[16];
-  /* Total number of bytes in tmp */
+  // Total number of bytes in tmp
   int total;
-  /* The position of a zero (corresponding to '::') */
+  // The position of a zero (corresponding to '::')
   int zero_pos;
-  /* Number of zeroes */
+  // Number of zeroes
   int zero_cnt;
 } IPV6_STAT;
 
@@ -1273,44 +1245,42 @@
   v6stat.total = 0;
   v6stat.zero_pos = -1;
   v6stat.zero_cnt = 0;
-  /*
-   * Treat the IPv6 representation as a list of values separated by ':'.
-   * The presence of a '::' will parse as one, two or three zero length
-   * elements.
-   */
+  // Treat the IPv6 representation as a list of values separated by ':'.
+  // The presence of a '::' will parse as one, two or three zero length
+  // elements.
   if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat)) {
     return 0;
   }
 
-  /* Now for some sanity checks */
+  // Now for some sanity checks
 
   if (v6stat.zero_pos == -1) {
-    /* If no '::' must have exactly 16 bytes */
+    // If no '::' must have exactly 16 bytes
     if (v6stat.total != 16) {
       return 0;
     }
   } else {
-    /* If '::' must have less than 16 bytes */
+    // If '::' must have less than 16 bytes
     if (v6stat.total == 16) {
       return 0;
     }
-    /* More than three zeroes is an error */
+    // More than three zeroes is an error
     if (v6stat.zero_cnt > 3) {
       return 0;
     }
-    /* Can only have three zeroes if nothing else present */
+    // Can only have three zeroes if nothing else present
     else if (v6stat.zero_cnt == 3) {
       if (v6stat.total > 0) {
         return 0;
       }
     }
-    /* Can only have two zeroes if at start or end */
+    // Can only have two zeroes if at start or end
     else if (v6stat.zero_cnt == 2) {
       if ((v6stat.zero_pos != 0) && (v6stat.zero_pos != v6stat.total)) {
         return 0;
       }
     } else
-    /* Can only have one zero if *not* start or end */
+    // Can only have one zero if *not* start or end
     {
       if ((v6stat.zero_pos == 0) || (v6stat.zero_pos == v6stat.total)) {
         return 0;
@@ -1318,14 +1288,14 @@
     }
   }
 
-  /* Format result */
+  // Format result
 
   if (v6stat.zero_pos >= 0) {
-    /* Copy initial part */
+    // Copy initial part
     OPENSSL_memcpy(v6, v6stat.tmp, v6stat.zero_pos);
-    /* Zero middle */
+    // Zero middle
     OPENSSL_memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
-    /* Copy final part */
+    // Copy final part
     if (v6stat.total != v6stat.zero_pos) {
       OPENSSL_memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
                      v6stat.tmp + v6stat.zero_pos,
@@ -1340,28 +1310,28 @@
 
 static int ipv6_cb(const char *elem, int len, void *usr) {
   IPV6_STAT *s = usr;
-  /* Error if 16 bytes written */
+  // Error if 16 bytes written
   if (s->total == 16) {
     return 0;
   }
   if (len == 0) {
-    /* Zero length element, corresponds to '::' */
+    // Zero length element, corresponds to '::'
     if (s->zero_pos == -1) {
       s->zero_pos = s->total;
     }
-    /* If we've already got a :: its an error */
+    // If we've already got a :: its an error
     else if (s->zero_pos != s->total) {
       return 0;
     }
     s->zero_cnt++;
   } else {
-    /* If more than 4 characters could be final a.b.c.d form */
+    // If more than 4 characters could be final a.b.c.d form
     if (len > 4) {
-      /* Need at least 4 bytes left */
+      // Need at least 4 bytes left
       if (s->total > 12) {
         return 0;
       }
-      /* Must be end of string */
+      // Must be end of string
       if (elem[len]) {
         return 0;
       }
@@ -1379,9 +1349,7 @@
   return 1;
 }
 
-/*
- * Convert a string of up to 4 hex digits into the corresponding IPv6 form.
- */
+// Convert a string of up to 4 hex digits into the corresponding IPv6 form.
 
 static int ipv6_hex(unsigned char *out, const char *in, int inlen) {
   unsigned char c;
@@ -1420,9 +1388,7 @@
   for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) {
     v = sk_CONF_VALUE_value(dn_sk, i);
     type = v->name;
-    /*
-     * Skip past any leading X. X: X, etc to allow for multiple instances
-     */
+    // Skip past any leading X. X: X, etc to allow for multiple instances
     for (p = type; *p; p++) {
       if ((*p == ':') || (*p == ',') || (*p == '.')) {
         p++;
