1/*
2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10#include <stdio.h>
11#include "crypto/ctype.h"
12#include "internal/cryptlib.h"
13#include <openssl/asn1.h>
14
15int ASN1_PRINTABLE_type(const unsigned char *s, int len)
16{
17 int c;
18 int ia5 = 0;
19 int t61 = 0;
20
21 if (len <= 0)
22 len = -1;
23 if (s == NULL)
24 return V_ASN1_PRINTABLESTRING;
25
26 while ((*s) && (len-- != 0)) {
27 c = *(s++);
28 if (!ossl_isasn1print(c))
29 ia5 = 1;
30 if (!ossl_isascii(c))
31 t61 = 1;
32 }
33 if (t61)
34 return V_ASN1_T61STRING;
35 if (ia5)
36 return V_ASN1_IA5STRING;
37 return V_ASN1_PRINTABLESTRING;
38}
39
40int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s)
41{
42 int i;
43 unsigned char *p;
44
45 if (s->type != V_ASN1_UNIVERSALSTRING)
46 return 0;
47 if ((s->length % 4) != 0)
48 return 0;
49 p = s->data;
50 for (i = 0; i < s->length; i += 4) {
51 if ((p[0] != '\0') || (p[1] != '\0') || (p[2] != '\0'))
52 break;
53 else
54 p += 4;
55 }
56 if (i < s->length)
57 return 0;
58 p = s->data;
59 for (i = 3; i < s->length; i += 4) {
60 *(p++) = s->data[i];
61 }
62 *(p) = '\0';
63 s->length /= 4;
64 s->type = ASN1_PRINTABLE_type(s->data, s->length);
65 return 1;
66}
67
68int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
69{
70 int i, n;
71 char buf[80];
72 const char *p;
73
74 if (v == NULL)
75 return 0;
76 n = 0;
77 p = (const char *)v->data;
78 for (i = 0; i < v->length; i++) {
79 if ((p[i] > '~') || ((p[i] < ' ') &&
80 (p[i] != '\n') && (p[i] != '\r')))
81 buf[n] = '.';
82 else
83 buf[n] = p[i];
84 n++;
85 if (n >= 80) {
86 if (BIO_write(bp, buf, n) <= 0)
87 return 0;
88 n = 0;
89 }
90 }
91 if (n > 0)
92 if (BIO_write(bp, buf, n) <= 0)
93 return 0;
94 return 1;
95}
96