a_time.c revision 55714
155714Skris/* crypto/asn1/a_time.c */ 255714Skris/* ==================================================================== 355714Skris * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 455714Skris * 555714Skris * Redistribution and use in source and binary forms, with or without 655714Skris * modification, are permitted provided that the following conditions 755714Skris * are met: 855714Skris * 955714Skris * 1. Redistributions of source code must retain the above copyright 1055714Skris * notice, this list of conditions and the following disclaimer. 1155714Skris * 1255714Skris * 2. Redistributions in binary form must reproduce the above copyright 1355714Skris * notice, this list of conditions and the following disclaimer in 1455714Skris * the documentation and/or other materials provided with the 1555714Skris * distribution. 1655714Skris * 1755714Skris * 3. All advertising materials mentioning features or use of this 1855714Skris * software must display the following acknowledgment: 1955714Skris * "This product includes software developed by the OpenSSL Project 2055714Skris * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 2155714Skris * 2255714Skris * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 2355714Skris * endorse or promote products derived from this software without 2455714Skris * prior written permission. For written permission, please contact 2555714Skris * licensing@OpenSSL.org. 2655714Skris * 2755714Skris * 5. Products derived from this software may not be called "OpenSSL" 2855714Skris * nor may "OpenSSL" appear in their names without prior written 2955714Skris * permission of the OpenSSL Project. 3055714Skris * 3155714Skris * 6. Redistributions of any form whatsoever must retain the following 3255714Skris * acknowledgment: 3355714Skris * "This product includes software developed by the OpenSSL Project 3455714Skris * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 3555714Skris * 3655714Skris * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 3755714Skris * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 3855714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 3955714Skris * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 4055714Skris * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4155714Skris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 4255714Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 4355714Skris * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4455714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 4555714Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 4655714Skris * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 4755714Skris * OF THE POSSIBILITY OF SUCH DAMAGE. 4855714Skris * ==================================================================== 4955714Skris * 5055714Skris * This product includes cryptographic software written by Eric Young 5155714Skris * (eay@cryptsoft.com). This product includes software written by Tim 5255714Skris * Hudson (tjh@cryptsoft.com). 5355714Skris * 5455714Skris */ 5555714Skris 5655714Skris 5755714Skris/* This is an implementation of the ASN1 Time structure which is: 5855714Skris * Time ::= CHOICE { 5955714Skris * utcTime UTCTime, 6055714Skris * generalTime GeneralizedTime } 6155714Skris * written by Steve Henson. 6255714Skris */ 6355714Skris 6455714Skris#include <stdio.h> 6555714Skris#include <time.h> 6655714Skris#include "cryptlib.h" 6755714Skris#include <openssl/asn1.h> 6855714Skris 6955714Skrisint i2d_ASN1_TIME(ASN1_TIME *a, unsigned char **pp) 7055714Skris { 7155714Skris#ifdef CHARSET_EBCDIC 7255714Skris /* KLUDGE! We convert to ascii before writing DER */ 7355714Skris char tmp[24]; 7455714Skris ASN1_STRING tmpstr; 7555714Skris 7655714Skris if(a->type == V_ASN1_UTCTIME || a->type == V_ASN1_GENERALIZEDTIME) { 7755714Skris int len; 7855714Skris 7955714Skris tmpstr = *(ASN1_STRING *)a; 8055714Skris len = tmpstr.length; 8155714Skris ebcdic2ascii(tmp, tmpstr.data, (len >= sizeof tmp) ? sizeof tmp : len); 8255714Skris tmpstr.data = tmp; 8355714Skris a = (ASN1_GENERALIZEDTIME *) &tmpstr; 8455714Skris } 8555714Skris#endif 8655714Skris if(a->type == V_ASN1_UTCTIME || a->type == V_ASN1_GENERALIZEDTIME) 8755714Skris return(i2d_ASN1_bytes((ASN1_STRING *)a,pp, 8855714Skris a->type ,V_ASN1_UNIVERSAL)); 8955714Skris ASN1err(ASN1_F_I2D_ASN1_TIME,ASN1_R_EXPECTING_A_TIME); 9055714Skris return -1; 9155714Skris } 9255714Skris 9355714Skris 9455714SkrisASN1_TIME *d2i_ASN1_TIME(ASN1_TIME **a, unsigned char **pp, long length) 9555714Skris { 9655714Skris unsigned char tag; 9755714Skris tag = **pp & ~V_ASN1_CONSTRUCTED; 9855714Skris if(tag == (V_ASN1_UTCTIME|V_ASN1_UNIVERSAL)) 9955714Skris return d2i_ASN1_UTCTIME(a, pp, length); 10055714Skris if(tag == (V_ASN1_GENERALIZEDTIME|V_ASN1_UNIVERSAL)) 10155714Skris return d2i_ASN1_GENERALIZEDTIME(a, pp, length); 10255714Skris ASN1err(ASN1_F_D2I_ASN1_TIME,ASN1_R_EXPECTING_A_TIME); 10355714Skris return(NULL); 10455714Skris } 10555714Skris 10655714Skris 10755714SkrisASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t) 10855714Skris { 10955714Skris struct tm *ts; 11055714Skris#if defined(THREADS) && !defined(WIN32) 11155714Skris struct tm data; 11255714Skris#endif 11355714Skris 11455714Skris#if defined(THREADS) && !defined(WIN32) 11555714Skris gmtime_r(&t,&data); 11655714Skris ts=&data; /* should return &data, but doesn't on some systems, so we don't even look at the return value */ 11755714Skris#else 11855714Skris ts=gmtime(&t); 11955714Skris#endif 12055714Skris if((ts->tm_year >= 50) && (ts->tm_year < 150)) 12155714Skris return ASN1_UTCTIME_set(s, t); 12255714Skris return ASN1_GENERALIZEDTIME_set(s,t); 12355714Skris } 124