]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/asn1/a_utctm.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (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
12 #include "internal/cryptlib.h"
13 #include <openssl/asn1.h>
14 #include "asn1_locl.h"
16 int asn1_utctime_to_tm(struct tm
*tm
, const ASN1_UTCTIME
*d
)
18 static const int min
[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
19 static const int max
[8] = { 99, 12, 31, 23, 59, 59, 12, 59 };
23 if (d
->type
!= V_ASN1_UTCTIME
)
31 for (i
= 0; i
< 6; i
++) {
32 if ((i
== 5) && ((a
[o
] == 'Z') || (a
[o
] == '+') || (a
[o
] == '-'))) {
38 if ((a
[o
] < '0') || (a
[o
] > '9'))
44 if ((a
[o
] < '0') || (a
[o
] > '9'))
46 n
= (n
* 10) + a
[o
] - '0';
50 if ((n
< min
[i
]) || (n
> max
[i
]))
55 tm
->tm_year
= n
< 50 ? n
+ 100 : n
;
77 else if ((a
[o
] == '+') || (a
[o
] == '-')) {
78 int offsign
= a
[o
] == '-' ? -1 : 1, offset
= 0;
82 for (i
= 6; i
< 8; i
++) {
83 if ((a
[o
] < '0') || (a
[o
] > '9'))
87 if ((a
[o
] < '0') || (a
[o
] > '9'))
89 n
= (n
* 10) + a
[o
] - '0';
90 if ((n
< min
[i
]) || (n
> max
[i
]))
100 if (offset
&& !OPENSSL_gmtime_adj(tm
, 0, offset
* offsign
))
108 int ASN1_UTCTIME_check(const ASN1_UTCTIME
*d
)
110 return asn1_utctime_to_tm(NULL
, d
);
113 int ASN1_UTCTIME_set_string(ASN1_UTCTIME
*s
, const char *str
)
117 t
.type
= V_ASN1_UTCTIME
;
118 t
.length
= strlen(str
);
119 t
.data
= (unsigned char *)str
;
120 if (ASN1_UTCTIME_check(&t
)) {
122 if (!ASN1_STRING_set((ASN1_STRING
*)s
,
123 (unsigned char *)str
, t
.length
))
125 s
->type
= V_ASN1_UTCTIME
;
132 ASN1_UTCTIME
*ASN1_UTCTIME_set(ASN1_UTCTIME
*s
, time_t t
)
134 return ASN1_UTCTIME_adj(s
, t
, 0, 0);
137 ASN1_UTCTIME
*ASN1_UTCTIME_adj(ASN1_UTCTIME
*s
, time_t t
,
138 int offset_day
, long offset_sec
)
147 s
= ASN1_UTCTIME_new();
153 ts
= OPENSSL_gmtime(&t
, &data
);
157 if (offset_day
|| offset_sec
) {
158 if (!OPENSSL_gmtime_adj(ts
, offset_day
, offset_sec
))
162 if ((ts
->tm_year
< 50) || (ts
->tm_year
>= 150))
166 if ((p
== NULL
) || ((size_t)s
->length
< len
)) {
167 p
= OPENSSL_malloc(len
);
169 ASN1err(ASN1_F_ASN1_UTCTIME_ADJ
, ERR_R_MALLOC_FAILURE
);
172 OPENSSL_free(s
->data
);
173 s
->data
= (unsigned char *)p
;
176 BIO_snprintf(p
, len
, "%02d%02d%02d%02d%02d%02dZ", ts
->tm_year
% 100,
177 ts
->tm_mon
+ 1, ts
->tm_mday
, ts
->tm_hour
, ts
->tm_min
,
179 s
->length
= strlen(p
);
180 s
->type
= V_ASN1_UTCTIME
;
181 #ifdef CHARSET_EBCDIC_not
182 ebcdic2ascii(s
->data
, s
->data
, s
->length
);
187 ASN1_UTCTIME_free(s
);
191 int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME
*s
, time_t t
)
196 if (!asn1_utctime_to_tm(&stm
, s
))
199 if (!OPENSSL_gmtime(&t
, &ttm
))
202 if (!OPENSSL_gmtime_diff(&day
, &sec
, &ttm
, &stm
))
216 int ASN1_UTCTIME_print(BIO
*bp
, const ASN1_UTCTIME
*tm
)
221 int y
= 0, M
= 0, d
= 0, h
= 0, m
= 0, s
= 0;
224 v
= (const char *)tm
->data
;
230 for (i
= 0; i
< 10; i
++)
231 if ((v
[i
] > '9') || (v
[i
] < '0'))
233 y
= (v
[0] - '0') * 10 + (v
[1] - '0');
236 M
= (v
[2] - '0') * 10 + (v
[3] - '0');
237 if ((M
> 12) || (M
< 1))
239 d
= (v
[4] - '0') * 10 + (v
[5] - '0');
240 h
= (v
[6] - '0') * 10 + (v
[7] - '0');
241 m
= (v
[8] - '0') * 10 + (v
[9] - '0');
242 if (tm
->length
>= 12 &&
243 (v
[10] >= '0') && (v
[10] <= '9') && (v
[11] >= '0') && (v
[11] <= '9'))
244 s
= (v
[10] - '0') * 10 + (v
[11] - '0');
246 if (BIO_printf(bp
, "%s %2d %02d:%02d:%02d %d%s",
247 _asn1_mon
[M
- 1], d
, h
, m
, s
, y
+ 1900,
248 (gmt
) ? " GMT" : "") <= 0)
253 BIO_write(bp
, "Bad time value", 14);