aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2015-08-26 13:49:49 +0100
committerMatt Caswell <matt@openssl.org>2015-09-07 10:34:44 +0100
commit0e2d091103ed5846c72a5c9e8b10e25ead4bf152 (patch)
treed66f48615c1c8432935dd3124d76ef7388b21fe3 /crypto
parent68572c8af3ebb0a0729acad2196763df463927c1 (diff)
downloadopenssl-0e2d091103ed5846c72a5c9e8b10e25ead4bf152.tar.gz
Updates for NumericString support
Ensure that EBCDIC support works and update a comment. Reviewed-by: Tim Hudson <tjh@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/asn1/a_mbstr.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c
index 823839ffba..46100c32cb 100644
--- a/crypto/asn1/a_mbstr.c
+++ b/crypto/asn1/a_mbstr.c
@@ -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;
}