|
|
@ -355,196 +355,3 @@ int X509_signature_print(BIO *bp, X509_ALGOR *sigalg, ASN1_STRING *sig) |
|
|
|
return 0; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v) |
|
|
|
{ |
|
|
|
int i, n; |
|
|
|
char buf[80]; |
|
|
|
const char *p; |
|
|
|
|
|
|
|
if (v == NULL) |
|
|
|
return (0); |
|
|
|
n = 0; |
|
|
|
p = (const char *)v->data; |
|
|
|
for (i = 0; i < v->length; i++) { |
|
|
|
if ((p[i] > '~') || ((p[i] < ' ') && |
|
|
|
(p[i] != '\n') && (p[i] != '\r'))) |
|
|
|
buf[n] = '.'; |
|
|
|
else |
|
|
|
buf[n] = p[i]; |
|
|
|
n++; |
|
|
|
if (n >= 80) { |
|
|
|
if (BIO_write(bp, buf, n) <= 0) |
|
|
|
return (0); |
|
|
|
n = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
if (n > 0) |
|
|
|
if (BIO_write(bp, buf, n) <= 0) |
|
|
|
return (0); |
|
|
|
return (1); |
|
|
|
} |
|
|
|
|
|
|
|
int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm) |
|
|
|
{ |
|
|
|
if (tm->type == V_ASN1_UTCTIME) |
|
|
|
return ASN1_UTCTIME_print(bp, tm); |
|
|
|
if (tm->type == V_ASN1_GENERALIZEDTIME) |
|
|
|
return ASN1_GENERALIZEDTIME_print(bp, tm); |
|
|
|
BIO_write(bp, "Bad time value", 14); |
|
|
|
return (0); |
|
|
|
} |
|
|
|
|
|
|
|
static const char *mon[12] = { |
|
|
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun", |
|
|
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" |
|
|
|
}; |
|
|
|
|
|
|
|
int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm) |
|
|
|
{ |
|
|
|
char *v; |
|
|
|
int gmt = 0; |
|
|
|
int i; |
|
|
|
int y = 0, M = 0, d = 0, h = 0, m = 0, s = 0; |
|
|
|
char *f = NULL; |
|
|
|
int f_len = 0; |
|
|
|
|
|
|
|
i = tm->length; |
|
|
|
v = (char *)tm->data; |
|
|
|
|
|
|
|
if (i < 12) |
|
|
|
goto err; |
|
|
|
if (v[i - 1] == 'Z') |
|
|
|
gmt = 1; |
|
|
|
for (i = 0; i < 12; i++) |
|
|
|
if ((v[i] > '9') || (v[i] < '0')) |
|
|
|
goto err; |
|
|
|
y = (v[0] - '0') * 1000 + (v[1] - '0') * 100 |
|
|
|
+ (v[2] - '0') * 10 + (v[3] - '0'); |
|
|
|
M = (v[4] - '0') * 10 + (v[5] - '0'); |
|
|
|
if ((M > 12) || (M < 1)) |
|
|
|
goto err; |
|
|
|
d = (v[6] - '0') * 10 + (v[7] - '0'); |
|
|
|
h = (v[8] - '0') * 10 + (v[9] - '0'); |
|
|
|
m = (v[10] - '0') * 10 + (v[11] - '0'); |
|
|
|
if (tm->length >= 14 && |
|
|
|
(v[12] >= '0') && (v[12] <= '9') && |
|
|
|
(v[13] >= '0') && (v[13] <= '9')) { |
|
|
|
s = (v[12] - '0') * 10 + (v[13] - '0'); |
|
|
|
/* Check for fractions of seconds. */ |
|
|
|
if (tm->length >= 15 && v[14] == '.') { |
|
|
|
int l = tm->length; |
|
|
|
f = &v[14]; /* The decimal point. */ |
|
|
|
f_len = 1; |
|
|
|
while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9') |
|
|
|
++f_len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (BIO_printf(bp, "%s %2d %02d:%02d:%02d%.*s %d%s", |
|
|
|
mon[M - 1], d, h, m, s, f_len, f, y, |
|
|
|
(gmt) ? " GMT" : "") <= 0) |
|
|
|
return (0); |
|
|
|
else |
|
|
|
return (1); |
|
|
|
err: |
|
|
|
BIO_write(bp, "Bad time value", 14); |
|
|
|
return (0); |
|
|
|
} |
|
|
|
|
|
|
|
int ASN1_UTCTIME_print(BIO *bp, const ASN1_UTCTIME *tm) |
|
|
|
{ |
|
|
|
const char *v; |
|
|
|
int gmt = 0; |
|
|
|
int i; |
|
|
|
int y = 0, M = 0, d = 0, h = 0, m = 0, s = 0; |
|
|
|
|
|
|
|
i = tm->length; |
|
|
|
v = (const char *)tm->data; |
|
|
|
|
|
|
|
if (i < 10) |
|
|
|
goto err; |
|
|
|
if (v[i - 1] == 'Z') |
|
|
|
gmt = 1; |
|
|
|
for (i = 0; i < 10; i++) |
|
|
|
if ((v[i] > '9') || (v[i] < '0')) |
|
|
|
goto err; |
|
|
|
y = (v[0] - '0') * 10 + (v[1] - '0'); |
|
|
|
if (y < 50) |
|
|
|
y += 100; |
|
|
|
M = (v[2] - '0') * 10 + (v[3] - '0'); |
|
|
|
if ((M > 12) || (M < 1)) |
|
|
|
goto err; |
|
|
|
d = (v[4] - '0') * 10 + (v[5] - '0'); |
|
|
|
h = (v[6] - '0') * 10 + (v[7] - '0'); |
|
|
|
m = (v[8] - '0') * 10 + (v[9] - '0'); |
|
|
|
if (tm->length >= 12 && |
|
|
|
(v[10] >= '0') && (v[10] <= '9') && (v[11] >= '0') && (v[11] <= '9')) |
|
|
|
s = (v[10] - '0') * 10 + (v[11] - '0'); |
|
|
|
|
|
|
|
if (BIO_printf(bp, "%s %2d %02d:%02d:%02d %d%s", |
|
|
|
mon[M - 1], d, h, m, s, y + 1900, |
|
|
|
(gmt) ? " GMT" : "") <= 0) |
|
|
|
return (0); |
|
|
|
else |
|
|
|
return (1); |
|
|
|
err: |
|
|
|
BIO_write(bp, "Bad time value", 14); |
|
|
|
return (0); |
|
|
|
} |
|
|
|
|
|
|
|
int X509_NAME_print(BIO *bp, X509_NAME *name, int obase) |
|
|
|
{ |
|
|
|
char *s, *c, *b; |
|
|
|
int l, i; |
|
|
|
|
|
|
|
l = 80 - 2 - obase; |
|
|
|
|
|
|
|
b = X509_NAME_oneline(name, NULL, 0); |
|
|
|
if (!b) |
|
|
|
return 0; |
|
|
|
if (!*b) { |
|
|
|
OPENSSL_free(b); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
s = b + 1; /* skip the first slash */ |
|
|
|
|
|
|
|
c = s; |
|
|
|
for (;;) { |
|
|
|
#ifndef CHARSET_EBCDIC |
|
|
|
if (((*s == '/') && |
|
|
|
((s[1] >= 'A') && (s[1] <= 'Z') && ((s[2] == '=') || |
|
|
|
((s[2] >= 'A') |
|
|
|
&& (s[2] <= 'Z') |
|
|
|
&& (s[3] == '=')) |
|
|
|
))) || (*s == '\0')) |
|
|
|
#else |
|
|
|
if (((*s == '/') && |
|
|
|
(isupper(s[1]) && ((s[2] == '=') || |
|
|
|
(isupper(s[2]) && (s[3] == '=')) |
|
|
|
))) || (*s == '\0')) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
i = s - c; |
|
|
|
if (BIO_write(bp, c, i) != i) |
|
|
|
goto err; |
|
|
|
c = s + 1; /* skip following slash */ |
|
|
|
if (*s != '\0') { |
|
|
|
if (BIO_write(bp, ", ", 2) != 2) |
|
|
|
goto err; |
|
|
|
} |
|
|
|
l--; |
|
|
|
} |
|
|
|
if (*s == '\0') |
|
|
|
break; |
|
|
|
s++; |
|
|
|
l--; |
|
|
|
} |
|
|
|
|
|
|
|
OPENSSL_free(b); |
|
|
|
return 1; |
|
|
|
err: |
|
|
|
X509err(X509_F_X509_NAME_PRINT, ERR_R_BUF_LIB); |
|
|
|
OPENSSL_free(b); |
|
|
|
return 0; |
|
|
|
} |