diff --git a/crypto/conf/conf.c b/crypto/conf/conf.c
index d76ab89..1faba5f 100644
--- a/crypto/conf/conf.c
+++ b/crypto/conf/conf.c
@@ -56,6 +56,7 @@
 
 #include <openssl/conf.h>
 
+#include <assert.h>
 #include <string.h>
 #include <ctype.h>
 
@@ -65,7 +66,6 @@
 #include <openssl/lhash.h>
 #include <openssl/mem.h>
 
-#include "conf_def.h"
 #include "internal.h"
 #include "../internal.h"
 
@@ -183,6 +183,26 @@
   return NULL;
 }
 
+static int is_comment(char c) { return c == '#'; }
+
+static int is_quote(char c) { return c == '"' || c == '\'' || c == '`'; }
+
+static int is_esc(char c) { return c == '\\'; }
+
+static int is_conf_ws(char c) {
+  // This differs from |OPENSSL_isspace| in that CONF does not accept '\v' and
+  // '\f' as whitespace.
+  return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+}
+
+static int is_name_char(char c) {
+  // Alphanumeric characters, and a handful of symbols, may appear in value and
+  // section names without escaping.
+  return OPENSSL_isalnum(c) || c == '_' || c == '!' || c == '.' || c == '%' ||
+         c == '&' || c == '*' || c == '+' || c == ',' || c == '/' || c == ';' ||
+         c == '?' || c == '@' || c == '^' || c == '~' || c == '|' || c == '-';
+}
+
 static int str_copy(CONF *conf, char *section, char **pto, char *from) {
   int q, to = 0, len = 0;
   char v;
@@ -199,13 +219,13 @@
   }
 
   for (;;) {
-    if (IS_QUOTE(conf, *from)) {
+    if (is_quote(*from)) {
       q = *from;
       from++;
-      while (!IS_EOF(conf, *from) && (*from != q)) {
-        if (IS_ESC(conf, *from)) {
+      while (*from != '\0' && *from != q) {
+        if (is_esc(*from)) {
           from++;
-          if (IS_EOF(conf, *from)) {
+          if (*from == '\0') {
             break;
           }
         }
@@ -214,10 +234,10 @@
       if (*from == q) {
         from++;
       }
-    } else if (IS_ESC(conf, *from)) {
+    } else if (is_esc(*from)) {
       from++;
       v = *(from++);
-      if (IS_EOF(conf, v)) {
+      if (v == '\0') {
         break;
       } else if (v == 'r') {
         v = '\r';
@@ -229,7 +249,7 @@
         v = '\t';
       }
       buf->data[to++] = v;
-    } else if (IS_EOF(conf, *from)) {
+    } else if (*from == '\0') {
       break;
     } else if (*from == '$') {
       // Historically, $foo would expand to a previously-parsed value. This
@@ -314,36 +334,39 @@
   return 1;
 }
 
-static char *eat_ws(CONF *conf, char *p) {
-  while (IS_WS(conf, *p) && !IS_EOF(conf, *p)) {
+static char *eat_ws(char *p) {
+  while (*p != '\0' && is_conf_ws(*p)) {
     p++;
   }
   return p;
 }
 
-#define scan_esc(conf, p) (((IS_EOF((conf), (p)[1])) ? ((p) + 1) : ((p) + 2)))
+static char *scan_esc(char *p) {
+  assert(p[0] == '\\');
+  return p[1] == '\0' ? p + 1 : p + 2;
+}
 
-static char *eat_alpha_numeric(CONF *conf, char *p) {
+static char *eat_name(char *p) {
   for (;;) {
-    if (IS_ESC(conf, *p)) {
-      p = scan_esc(conf, p);
+    if (is_esc(*p)) {
+      p = scan_esc(p);
       continue;
     }
-    if (!IS_ALPHA_NUMERIC_PUNCT(conf, *p)) {
+    if (!is_name_char(*p)) {
       return p;
     }
     p++;
   }
 }
 
-static char *scan_quote(CONF *conf, char *p) {
+static char *scan_quote(char *p) {
   int q = *p;
 
   p++;
-  while (!IS_EOF(conf, *p) && *p != q) {
-    if (IS_ESC(conf, *p)) {
+  while (*p != '\0' && *p != q) {
+    if (is_esc(*p)) {
       p++;
-      if (IS_EOF(conf, *p)) {
+      if (*p == '\0') {
         return p;
       }
     }
@@ -355,28 +378,28 @@
   return p;
 }
 
-static void clear_comments(CONF *conf, char *p) {
+static void clear_comments(char *p) {
   for (;;) {
-    if (!IS_WS(conf, *p)) {
+    if (!is_conf_ws(*p)) {
       break;
     }
     p++;
   }
 
   for (;;) {
-    if (IS_COMMENT(conf, *p)) {
+    if (is_comment(*p)) {
       *p = '\0';
       return;
     }
-    if (IS_QUOTE(conf, *p)) {
-      p = scan_quote(conf, p);
+    if (is_quote(*p)) {
+      p = scan_quote(p);
       continue;
     }
-    if (IS_ESC(conf, *p)) {
-      p = scan_esc(conf, p);
+    if (is_esc(*p)) {
+      p = scan_esc(p);
       continue;
     }
-    if (IS_EOF(conf, *p)) {
+    if (*p == '\0') {
       return;
     } else {
       p++;
@@ -456,7 +479,7 @@
       // If we have bytes and the last char '\\' and
       // second last char is not '\\'
       p = &(buff->data[bufnum - 1]);
-      if (IS_ESC(conf, p[0]) && ((bufnum <= 1) || !IS_ESC(conf, p[-1]))) {
+      if (is_esc(p[0]) && ((bufnum <= 1) || !is_esc(p[-1]))) {
         bufnum--;
         again = 1;
       }
@@ -467,20 +490,20 @@
     bufnum = 0;
     buf = buff->data;
 
-    clear_comments(conf, buf);
-    s = eat_ws(conf, buf);
-    if (IS_EOF(conf, *s)) {
+    clear_comments(buf);
+    s = eat_ws(buf);
+    if (*s == '\0') {
       continue;  // blank line
     }
     if (*s == '[') {
       char *ss;
 
       s++;
-      start = eat_ws(conf, s);
+      start = eat_ws(s);
       ss = start;
     again:
-      end = eat_alpha_numeric(conf, ss);
-      p = eat_ws(conf, end);
+      end = eat_name(ss);
+      p = eat_ws(end);
       if (*p != ']') {
         if (*p != '\0' && ss != p) {
           ss = p;
@@ -504,27 +527,27 @@
     } else {
       pname = s;
       psection = NULL;
-      end = eat_alpha_numeric(conf, s);
+      end = eat_name(s);
       if ((end[0] == ':') && (end[1] == ':')) {
         *end = '\0';
         end += 2;
         psection = pname;
         pname = end;
-        end = eat_alpha_numeric(conf, end);
+        end = eat_name(end);
       }
-      p = eat_ws(conf, end);
+      p = eat_ws(end);
       if (*p != '=') {
         OPENSSL_PUT_ERROR(CONF, CONF_R_MISSING_EQUAL_SIGN);
         goto err;
       }
       *end = '\0';
       p++;
-      start = eat_ws(conf, p);
-      while (!IS_EOF(conf, *p)) {
+      start = eat_ws(p);
+      while (*p != '\0') {
         p++;
       }
       p--;
-      while ((p != start) && (IS_WS(conf, *p))) {
+      while (p != start && is_conf_ws(*p)) {
         p--;
       }
       p++;
diff --git a/crypto/conf/conf_def.h b/crypto/conf/conf_def.h
deleted file mode 100644
index d2c285a..0000000
--- a/crypto/conf/conf_def.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-// This file was historically generated by keysets.pl in OpenSSL.
-//
-// TODO(davidben): Replace it with something more readable.
-
-#define CONF_NUMBER		1
-#define CONF_UPPER		2
-#define CONF_LOWER		4
-#define CONF_UNDER		256
-#define CONF_PUNCTUATION	512
-#define CONF_WS			16
-#define CONF_ESC		32
-#define CONF_QUOTE		64
-#define CONF_COMMENT		128
-#define CONF_EOF		8
-#define CONF_HIGHBIT		4096
-#define CONF_ALPHA		(CONF_UPPER|CONF_LOWER)
-#define CONF_ALPHA_NUMERIC	(CONF_ALPHA|CONF_NUMBER|CONF_UNDER)
-#define CONF_ALPHA_NUMERIC_PUNCT (CONF_ALPHA|CONF_NUMBER|CONF_UNDER| \
-					CONF_PUNCTUATION)
-
-#define KEYTYPES(c)		CONF_type_default
-#define IS_COMMENT(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_COMMENT)
-#define IS_EOF(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_EOF)
-#define IS_ESC(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_ESC)
-#define IS_NUMBER(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_NUMBER)
-#define IS_WS(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_WS)
-#define IS_ALPHA_NUMERIC(c,a)	(KEYTYPES(c)[(a)&0xff]&CONF_ALPHA_NUMERIC)
-#define IS_ALPHA_NUMERIC_PUNCT(c,a) \
-				(KEYTYPES(c)[(a)&0xff]&CONF_ALPHA_NUMERIC_PUNCT)
-#define IS_QUOTE(c,a)		(KEYTYPES(c)[(a)&0xff]&CONF_QUOTE)
-
-static const unsigned short CONF_type_default[256]={
-	0x0008,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
-	0x0000,0x0010,0x0010,0x0000,0x0000,0x0010,0x0000,0x0000,
-	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
-	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
-	0x0010,0x0200,0x0040,0x0080,0x0000,0x0200,0x0200,0x0040,
-	0x0000,0x0000,0x0200,0x0200,0x0200,0x0200,0x0200,0x0200,
-	0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,
-	0x0001,0x0001,0x0000,0x0200,0x0000,0x0000,0x0000,0x0200,
-	0x0200,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,
-	0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,
-	0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,
-	0x0002,0x0002,0x0002,0x0000,0x0020,0x0000,0x0200,0x0100,
-	0x0040,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,
-	0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,
-	0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,
-	0x0004,0x0004,0x0004,0x0000,0x0200,0x0000,0x0200,0x0000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,
-	};
