summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_strex.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_strex.c')
-rw-r--r--src/lib/libcrypto/asn1/a_strex.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/lib/libcrypto/asn1/a_strex.c b/src/lib/libcrypto/asn1/a_strex.c
index a07122ba47..c2dbb6f9a5 100644
--- a/src/lib/libcrypto/asn1/a_strex.c
+++ b/src/lib/libcrypto/asn1/a_strex.c
@@ -3,7 +3,7 @@
3 * project 2000. 3 * project 2000.
4 */ 4 */
5/* ==================================================================== 5/* ====================================================================
6 * Copyright (c) 2000-2004 The OpenSSL Project. All rights reserved. 6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
@@ -58,12 +58,12 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include <string.h> 60#include <string.h>
61#include "cryptlib.h"
61#include <openssl/crypto.h> 62#include <openssl/crypto.h>
62#include <openssl/x509.h> 63#include <openssl/x509.h>
63#include <openssl/asn1.h> 64#include <openssl/asn1.h>
64 65
65#include "charmap.h" 66#include "charmap.h"
66#include "cryptlib.h"
67 67
68/* ASN1_STRING_print_ex() and X509_NAME_print_ex(). 68/* ASN1_STRING_print_ex() and X509_NAME_print_ex().
69 * Enhanced string and name printing routines handling 69 * Enhanced string and name printing routines handling
@@ -170,7 +170,7 @@ static int do_buf(unsigned char *buf, int buflen,
170 q = buf + buflen; 170 q = buf + buflen;
171 outlen = 0; 171 outlen = 0;
172 while(p != q) { 172 while(p != q) {
173 if(p == buf) orflags = CHARTYPE_FIRST_ESC_2253; 173 if(p == buf && flags & ASN1_STRFLGS_ESC_2253) orflags = CHARTYPE_FIRST_ESC_2253;
174 else orflags = 0; 174 else orflags = 0;
175 switch(type & BUF_TYPE_WIDTH_MASK) { 175 switch(type & BUF_TYPE_WIDTH_MASK) {
176 case 4: 176 case 4:
@@ -194,8 +194,10 @@ static int do_buf(unsigned char *buf, int buflen,
194 if(i < 0) return -1; /* Invalid UTF8String */ 194 if(i < 0) return -1; /* Invalid UTF8String */
195 p += i; 195 p += i;
196 break; 196 break;
197 default:
198 return -1; /* invalid width */
197 } 199 }
198 if (p == q) orflags = CHARTYPE_LAST_ESC_2253; 200 if (p == q && flags & ASN1_STRFLGS_ESC_2253) orflags = CHARTYPE_LAST_ESC_2253;
199 if(type & BUF_TYPE_CONVUTF8) { 201 if(type & BUF_TYPE_CONVUTF8) {
200 unsigned char utfbuf[6]; 202 unsigned char utfbuf[6];
201 int utflen; 203 int utflen;
@@ -223,7 +225,7 @@ static int do_buf(unsigned char *buf, int buflen,
223 225
224static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf, int buflen) 226static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf, int buflen)
225{ 227{
226 const static char hexdig[] = "0123456789ABCDEF"; 228 static const char hexdig[] = "0123456789ABCDEF";
227 unsigned char *p, *q; 229 unsigned char *p, *q;
228 char hextmp[2]; 230 char hextmp[2];
229 if(arg) { 231 if(arg) {
@@ -279,7 +281,7 @@ static int do_dump(unsigned long lflags, char_io *io_ch, void *arg, ASN1_STRING
279 * otherwise it is the number of bytes per character 281 * otherwise it is the number of bytes per character
280 */ 282 */
281 283
282const static signed char tag2nbyte[] = { 284static const signed char tag2nbyte[] = {
283 -1, -1, -1, -1, -1, /* 0-4 */ 285 -1, -1, -1, -1, -1, /* 0-4 */
284 -1, -1, -1, -1, -1, /* 5-9 */ 286 -1, -1, -1, -1, -1, /* 5-9 */
285 -1, -1, 0, -1, /* 10-13 */ 287 -1, -1, 0, -1, /* 10-13 */
@@ -356,12 +358,13 @@ static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags, ASN1_STR
356 } 358 }
357 359
358 len = do_buf(str->data, str->length, type, flags, &quotes, io_ch, NULL); 360 len = do_buf(str->data, str->length, type, flags, &quotes, io_ch, NULL);
359 if(outlen < 0) return -1; 361 if(len < 0) return -1;
360 outlen += len; 362 outlen += len;
361 if(quotes) outlen += 2; 363 if(quotes) outlen += 2;
362 if(!arg) return outlen; 364 if(!arg) return outlen;
363 if(quotes && !io_ch(arg, "\"", 1)) return -1; 365 if(quotes && !io_ch(arg, "\"", 1)) return -1;
364 do_buf(str->data, str->length, type, flags, NULL, io_ch, arg); 366 if(do_buf(str->data, str->length, type, flags, NULL, io_ch, arg) < 0)
367 return -1;
365 if(quotes && !io_ch(arg, "\"", 1)) return -1; 368 if(quotes && !io_ch(arg, "\"", 1)) return -1;
366 return outlen; 369 return outlen;
367} 370}
@@ -513,7 +516,7 @@ int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, unsigned long flags)
513 return do_name_ex(send_bio_chars, out, nm, indent, flags); 516 return do_name_ex(send_bio_chars, out, nm, indent, flags);
514} 517}
515 518
516 519#ifndef OPENSSL_NO_FP_API
517int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags) 520int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags)
518{ 521{
519 if(flags == XN_FLAG_COMPAT) 522 if(flags == XN_FLAG_COMPAT)
@@ -528,17 +531,19 @@ int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long fla
528 } 531 }
529 return do_name_ex(send_fp_chars, fp, nm, indent, flags); 532 return do_name_ex(send_fp_chars, fp, nm, indent, flags);
530} 533}
534#endif
531 535
532int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags) 536int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags)
533{ 537{
534 return do_print_ex(send_bio_chars, out, flags, str); 538 return do_print_ex(send_bio_chars, out, flags, str);
535} 539}
536 540
537 541#ifndef OPENSSL_NO_FP_API
538int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags) 542int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags)
539{ 543{
540 return do_print_ex(send_fp_chars, fp, flags, str); 544 return do_print_ex(send_fp_chars, fp, flags, str);
541} 545}
546#endif
542 547
543/* Utility function: convert any string type to UTF8, returns number of bytes 548/* Utility function: convert any string type to UTF8, returns number of bytes
544 * in output string or a negative error code 549 * in output string or a negative error code
@@ -553,12 +558,7 @@ int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in)
553 if((type < 0) || (type > 30)) return -1; 558 if((type < 0) || (type > 30)) return -1;
554 mbflag = tag2nbyte[type]; 559 mbflag = tag2nbyte[type];
555 if(mbflag == -1) return -1; 560 if(mbflag == -1) return -1;
556 if (mbflag == 0) 561 mbflag |= MBSTRING_FLAG;
557 mbflag = MBSTRING_UTF8;
558 else if (mbflag == 4)
559 mbflag = MBSTRING_UNIV;
560 else
561 mbflag |= MBSTRING_FLAG;
562 stmp.data = NULL; 562 stmp.data = NULL;
563 ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag, B_ASN1_UTF8STRING); 563 ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag, B_ASN1_UTF8STRING);
564 if(ret < 0) return ret; 564 if(ret < 0) return ret;