Home | History | Annotate | Line # | Download | only in crypto
      1 /*
      2  * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (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
      8  */
      9 
     10 #include <errno.h>
     11 #include <openssl/err.h>
     12 #include "internal/time.h"
     13 #include "internal/e_os.h"
     14 
     15 OSSL_TIME ossl_time_now(void)
     16 {
     17     OSSL_TIME r;
     18 
     19 #if defined(_WIN32) && !defined(OPENSSL_SYS_UEFI)
     20     SYSTEMTIME st;
     21     union {
     22         unsigned __int64 ul;
     23         FILETIME ft;
     24     } now;
     25 
     26     GetSystemTime(&st);
     27     SystemTimeToFileTime(&st, &now.ft);
     28     /* re-bias to 1/1/1970 */
     29 #ifdef __MINGW32__
     30     now.ul -= 116444736000000000ULL;
     31 #else
     32     now.ul -= 116444736000000000UI64;
     33 #endif
     34     r.t = ((uint64_t)now.ul) * (OSSL_TIME_SECOND / 10000000);
     35 #else /* defined(_WIN32) */
     36     struct timeval t;
     37 
     38     if (gettimeofday(&t, NULL) < 0) {
     39         ERR_raise_data(ERR_LIB_SYS, get_last_sys_error(),
     40             "calling gettimeofday()");
     41         return ossl_time_zero();
     42     }
     43     if (t.tv_sec <= 0)
     44         r.t = t.tv_usec <= 0 ? 0 : t.tv_usec * OSSL_TIME_US;
     45     else
     46         r.t = ((uint64_t)t.tv_sec * 1000000 + t.tv_usec) * OSSL_TIME_US;
     47 #endif /* defined(_WIN32) */
     48     return r;
     49 }
     50