Remove SSLeay history, etc., from docs
[openssl.git] / test / gmdifftest.c
1 /* ====================================================================
2  * Copyright (c) 2001-2015 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    licensing@OpenSSL.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This product includes cryptographic software written by Eric Young
50  * (eay@cryptsoft.com).  This product includes software written by Tim
51  * Hudson (tjh@cryptsoft.com).
52  *
53  */
54
55 #include <openssl/crypto.h>
56 #include <stdio.h>
57
58 #define SECS_PER_DAY (24 * 60 * 60)
59
60 /*
61  * Time checking test code. Check times are identical for a wide range of
62  * offsets. This should be run on a machine with 64 bit time_t or it will
63  * trigger the very errors the routines fix.
64  */
65
66 static int check_time(long offset)
67 {
68     struct tm tm1, tm2, o1;
69     int off_day, off_sec;
70     long toffset;
71     time_t t1, t2;
72     time(&t1);
73
74     t2 = t1 + offset;
75     OPENSSL_gmtime(&t2, &tm2);
76     OPENSSL_gmtime(&t1, &tm1);
77     o1 = tm1;
78     OPENSSL_gmtime_adj(&tm1, 0, offset);
79     if ((tm1.tm_year != tm2.tm_year) ||
80         (tm1.tm_mon != tm2.tm_mon) ||
81         (tm1.tm_mday != tm2.tm_mday) ||
82         (tm1.tm_hour != tm2.tm_hour) ||
83         (tm1.tm_min != tm2.tm_min) || (tm1.tm_sec != tm2.tm_sec)) {
84         fprintf(stderr, "TIME ERROR!!\n");
85         fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n",
86                 tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900,
87                 tm2.tm_hour, tm2.tm_min, tm2.tm_sec);
88         fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n",
89                 tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900,
90                 tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
91         return 0;
92     }
93     if (!OPENSSL_gmtime_diff(&off_day, &off_sec, &o1, &tm1))
94         return 0;
95     toffset = (long)off_day *SECS_PER_DAY + off_sec;
96     if (offset != toffset) {
97         fprintf(stderr, "TIME OFFSET ERROR!!\n");
98         fprintf(stderr, "Expected %ld, Got %ld (%d:%d)\n",
99                 offset, toffset, off_day, off_sec);
100         return 0;
101     }
102     return 1;
103 }
104
105 int main(int argc, char **argv)
106 {
107     long offset;
108     int fails;
109
110     if (sizeof(time_t) < 8) {
111         fprintf(stderr, "Skipping; time_t is less than 64-bits\n");
112         return 0;
113     }
114     for (fails = 0, offset = 0; offset < 1000000; offset++) {
115         if (!check_time(offset))
116             fails++;
117         if (!check_time(-offset))
118             fails++;
119         if (!check_time(offset * 1000))
120             fails++;
121         if (!check_time(-offset * 1000))
122             fails++;
123     }
124
125     return fails ? 1 : 0;
126 }