OLD | NEW |
| (Empty) |
1 /* crypto/asn1/a_time.c */ | |
2 /* ==================================================================== | |
3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions | |
7 * are met: | |
8 * | |
9 * 1. Redistributions of source code must retain the above copyright | |
10 * notice, this list of conditions and the following disclaimer. | |
11 * | |
12 * 2. Redistributions in binary form must reproduce the above copyright | |
13 * notice, this list of conditions and the following disclaimer in | |
14 * the documentation and/or other materials provided with the | |
15 * distribution. | |
16 * | |
17 * 3. All advertising materials mentioning features or use of this | |
18 * software must display the following acknowledgment: | |
19 * "This product includes software developed by the OpenSSL Project | |
20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | |
21 * | |
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | |
23 * endorse or promote products derived from this software without | |
24 * prior written permission. For written permission, please contact | |
25 * licensing@OpenSSL.org. | |
26 * | |
27 * 5. Products derived from this software may not be called "OpenSSL" | |
28 * nor may "OpenSSL" appear in their names without prior written | |
29 * permission of the OpenSSL Project. | |
30 * | |
31 * 6. Redistributions of any form whatsoever must retain the following | |
32 * acknowledgment: | |
33 * "This product includes software developed by the OpenSSL Project | |
34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | |
35 * | |
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | |
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | |
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |
47 * OF THE POSSIBILITY OF SUCH DAMAGE. | |
48 * ==================================================================== | |
49 * | |
50 * This product includes cryptographic software written by Eric Young | |
51 * (eay@cryptsoft.com). This product includes software written by Tim | |
52 * Hudson (tjh@cryptsoft.com). | |
53 * | |
54 */ | |
55 | |
56 | |
57 /* This is an implementation of the ASN1 Time structure which is: | |
58 * Time ::= CHOICE { | |
59 * utcTime UTCTime, | |
60 * generalTime GeneralizedTime } | |
61 * written by Steve Henson. | |
62 */ | |
63 | |
64 #include <stdio.h> | |
65 #include <time.h> | |
66 #include "cryptlib.h" | |
67 #include "o_time.h" | |
68 #include <openssl/asn1t.h> | |
69 | |
70 IMPLEMENT_ASN1_MSTRING(ASN1_TIME, B_ASN1_TIME) | |
71 | |
72 IMPLEMENT_ASN1_FUNCTIONS(ASN1_TIME) | |
73 | |
74 #if 0 | |
75 int i2d_ASN1_TIME(ASN1_TIME *a, unsigned char **pp) | |
76 { | |
77 #ifdef CHARSET_EBCDIC | |
78 /* KLUDGE! We convert to ascii before writing DER */ | |
79 char tmp[24]; | |
80 ASN1_STRING tmpstr; | |
81 | |
82 if(a->type == V_ASN1_UTCTIME || a->type == V_ASN1_GENERALIZEDTIME) { | |
83 int len; | |
84 | |
85 tmpstr = *(ASN1_STRING *)a; | |
86 len = tmpstr.length; | |
87 ebcdic2ascii(tmp, tmpstr.data, (len >= sizeof tmp) ? sizeof tmp : le
n); | |
88 tmpstr.data = tmp; | |
89 a = (ASN1_GENERALIZEDTIME *) &tmpstr; | |
90 } | |
91 #endif | |
92 if(a->type == V_ASN1_UTCTIME || a->type == V_ASN1_GENERALIZEDTIME) | |
93 return(i2d_ASN1_bytes((ASN1_STRING *)a,pp, | |
94 a->type ,V_ASN1_UNIVERSAL)); | |
95 ASN1err(ASN1_F_I2D_ASN1_TIME,ASN1_R_EXPECTING_A_TIME); | |
96 return -1; | |
97 } | |
98 #endif | |
99 | |
100 | |
101 ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t) | |
102 { | |
103 return ASN1_TIME_adj(s, t, 0, 0); | |
104 } | |
105 | |
106 ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, | |
107 int offset_day, long offset_sec) | |
108 { | |
109 struct tm *ts; | |
110 struct tm data; | |
111 | |
112 ts=OPENSSL_gmtime(&t,&data); | |
113 if (ts == NULL) | |
114 { | |
115 ASN1err(ASN1_F_ASN1_TIME_ADJ, ASN1_R_ERROR_GETTING_TIME); | |
116 return NULL; | |
117 } | |
118 if (offset_day || offset_sec) | |
119 { | |
120 if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec)) | |
121 return NULL; | |
122 } | |
123 if((ts->tm_year >= 50) && (ts->tm_year < 150)) | |
124 return ASN1_UTCTIME_adj(s, t, offset_day, offset_sec); | |
125 return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec); | |
126 } | |
127 | |
128 int ASN1_TIME_check(ASN1_TIME *t) | |
129 { | |
130 if (t->type == V_ASN1_GENERALIZEDTIME) | |
131 return ASN1_GENERALIZEDTIME_check(t); | |
132 else if (t->type == V_ASN1_UTCTIME) | |
133 return ASN1_UTCTIME_check(t); | |
134 return 0; | |
135 } | |
136 | |
137 /* Convert an ASN1_TIME structure to GeneralizedTime */ | |
138 ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZE
DTIME **out) | |
139 { | |
140 ASN1_GENERALIZEDTIME *ret; | |
141 char *str; | |
142 int newlen; | |
143 | |
144 if (!ASN1_TIME_check(t)) return NULL; | |
145 | |
146 if (!out || !*out) | |
147 { | |
148 if (!(ret = ASN1_GENERALIZEDTIME_new ())) | |
149 return NULL; | |
150 if (out) *out = ret; | |
151 } | |
152 else ret = *out; | |
153 | |
154 /* If already GeneralizedTime just copy across */ | |
155 if (t->type == V_ASN1_GENERALIZEDTIME) | |
156 { | |
157 if(!ASN1_STRING_set(ret, t->data, t->length)) | |
158 return NULL; | |
159 return ret; | |
160 } | |
161 | |
162 /* grow the string */ | |
163 if (!ASN1_STRING_set(ret, NULL, t->length + 2)) | |
164 return NULL; | |
165 /* ASN1_STRING_set() allocated 'len + 1' bytes. */ | |
166 newlen = t->length + 2 + 1; | |
167 str = (char *)ret->data; | |
168 /* Work out the century and prepend */ | |
169 if (t->data[0] >= '5') BUF_strlcpy(str, "19", newlen); | |
170 else BUF_strlcpy(str, "20", newlen); | |
171 | |
172 BUF_strlcat(str, (char *)t->data, newlen); | |
173 | |
174 return ret; | |
175 } | |
176 | |
177 int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) | |
178 { | |
179 ASN1_TIME t; | |
180 | |
181 t.length = strlen(str); | |
182 t.data = (unsigned char *)str; | |
183 t.flags = 0; | |
184 | |
185 t.type = V_ASN1_UTCTIME; | |
186 | |
187 if (!ASN1_TIME_check(&t)) | |
188 { | |
189 t.type = V_ASN1_GENERALIZEDTIME; | |
190 if (!ASN1_TIME_check(&t)) | |
191 return 0; | |
192 } | |
193 | |
194 if (s && !ASN1_STRING_copy((ASN1_STRING *)s, (ASN1_STRING *)&t)) | |
195 return 0; | |
196 | |
197 return 1; | |
198 } | |
OLD | NEW |