Updates for NumericString support
authorMatt Caswell <matt@openssl.org>
Wed, 26 Aug 2015 12:49:49 +0000 (13:49 +0100)
committerMatt Caswell <matt@openssl.org>
Mon, 7 Sep 2015 09:34:44 +0000 (10:34 +0100)
Ensure that EBCDIC support works and update a comment.

Reviewed-by: Tim Hudson <tjh@openssl.org>
crypto/asn1/a_mbstr.c

index 823839ffbab8f6f331feee18559a2ab76032d082..46100c32cbd7098a81413e556f45caaaac39d0e3 100644 (file)
@@ -78,8 +78,8 @@ static int is_printable(unsigned long value);
 /*
  * 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
+ * (using the order Numeric < 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.
  */
@@ -425,11 +425,21 @@ static int is_printable(unsigned long value)
     return 0;
 }
 
+/* Return 1 if the character is a digit or space */
 static int is_numeric(unsigned long value)
 {
-    if (value > '9')
+    int ch;
+    if (value > 0x7f)
+        return 0;
+    ch = (int)value;
+#ifndef CHARSET_EBCDIC
+    if (!isdigit(ch) && ch != ' ')
+        return 0;
+#else
+    if (ch > os_toascii['9'])
         return 0;
-    if (value < '0' && value != 32)
+    if (ch < os_toascii['0'] && ch != os_toascii[' '])
         return 0;
+#endif
     return 1;
 }