1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <cstdint>
17 #include <cinttypes>
18 #include <cstdio>
19 #include <cstring>
20 #include <unistd.h>
21 #include <securec.h>
22 #include "time_common.h"
23 #include "sntp_client.h"
24 #include "ntp_trusted_time.h"
25
26 namespace OHOS {
27 namespace MiscServices {
28 namespace {
29 constexpr int64_t INVALID_MILLIS = -1;
30 constexpr int64_t HALF = 2;
31 constexpr int32_t RETRY_TIMES = 2;
32 }
33
NtpTrustedTime()34 NtpTrustedTime::NtpTrustedTime() {}
~NtpTrustedTime()35 NtpTrustedTime::~NtpTrustedTime() {}
36
ForceRefresh(std::string ntpServer)37 bool NtpTrustedTime::ForceRefresh(std::string ntpServer)
38 {
39 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
40 SNTPClient client;
41 for (int i = 0; i < RETRY_TIMES; i++) {
42 if (client.RequestTime(ntpServer)) {
43 if (mTimeResult != nullptr) {
44 mTimeResult->Clear();
45 }
46 int64_t ntpCertainty = client.getRoundTripTime() / HALF;
47 mTimeResult = std::make_shared<TimeResult>(client.getNtpTIme(), client.getNtpTimeReference(), ntpCertainty);
48 TIME_HILOGD(TIME_MODULE_SERVICE, "Get Ntp time result");
49 TIME_HILOGD(TIME_MODULE_SERVICE, "true end.");
50 return true;
51 }
52 }
53 TIME_HILOGD(TIME_MODULE_SERVICE, "false end.");
54 return false;
55 }
56
CurrentTimeMillis()57 int64_t NtpTrustedTime::CurrentTimeMillis()
58 {
59 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
60 if (mTimeResult == nullptr) {
61 TIME_HILOGD(TIME_MODULE_SERVICE, "Missing authoritative time source");
62 return INVALID_MILLIS;
63 }
64 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
65 return mTimeResult->CurrentTimeMillis();
66 }
67
HasCache()68 bool NtpTrustedTime::HasCache()
69 {
70 return mTimeResult == nullptr;
71 }
72
GetCacheAge()73 int64_t NtpTrustedTime::GetCacheAge()
74 {
75 if (mTimeResult != nullptr) {
76 return std::chrono::duration_cast<std::chrono::milliseconds>
77 (std::chrono::steady_clock::now().time_since_epoch()).count() - mTimeResult->GetElapsedRealtimeMillis();
78 } else {
79 return INT_MAX;
80 }
81 }
82
GetCachedNtpTime()83 int64_t NtpTrustedTime::GetCachedNtpTime()
84 {
85 return mTimeResult == nullptr ? 0 : mTimeResult->GetTimeMillis();
86 }
87
GetCachedNtpTimeReference()88 int64_t NtpTrustedTime::GetCachedNtpTimeReference()
89 {
90 return mTimeResult == nullptr ? 0 : mTimeResult->GetElapsedRealtimeMillis();
91 }
92
GetTimeMillis()93 int64_t NtpTrustedTime::TimeResult::GetTimeMillis()
94 {
95 return mTimeMillis;
96 }
97
GetElapsedRealtimeMillis()98 int64_t NtpTrustedTime::TimeResult::GetElapsedRealtimeMillis()
99 {
100 return mElapsedRealtimeMillis;
101 }
102
GetCertaintyMillis()103 int64_t NtpTrustedTime::TimeResult::GetCertaintyMillis()
104 {
105 return mCertaintyMillis;
106 }
107
CurrentTimeMillis()108 int64_t NtpTrustedTime::TimeResult::CurrentTimeMillis()
109 {
110 return mTimeMillis + GetAgeMillis();
111 }
112
GetAgeMillis()113 int64_t NtpTrustedTime::TimeResult::GetAgeMillis()
114 {
115 return std::chrono::duration_cast<std::chrono::milliseconds>
116 (std::chrono::steady_clock::now().time_since_epoch()).count() - this->mElapsedRealtimeMillis;
117 }
118
TimeResult()119 NtpTrustedTime::TimeResult::TimeResult() {}
~TimeResult()120 NtpTrustedTime::TimeResult::~TimeResult() {}
121
TimeResult(int64_t mTimeMillis,int64_t mElapsedRealtimeMills,int64_t mCertaintyMillis)122 NtpTrustedTime::TimeResult::TimeResult(int64_t mTimeMillis, int64_t mElapsedRealtimeMills, int64_t mCertaintyMillis)
123 {
124 this->mTimeMillis = mTimeMillis;
125 this->mElapsedRealtimeMillis = mElapsedRealtimeMills;
126 this->mCertaintyMillis = mCertaintyMillis;
127 TIME_HILOGD(TIME_MODULE_SERVICE, "mTimeMillis %{public}" PRId64 "", mTimeMillis);
128 TIME_HILOGD(TIME_MODULE_SERVICE, "mElapsedRealtimeMills %{public}" PRId64 "", mElapsedRealtimeMills);
129 TIME_HILOGD(TIME_MODULE_SERVICE, "mCertaintyMillis %{public}" PRId64 "", mCertaintyMillis);
130 }
131
Clear()132 void NtpTrustedTime::TimeResult::Clear()
133 {
134 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
135 mTimeMillis = 0;
136 mElapsedRealtimeMillis = 0;
137 mCertaintyMillis = 0;
138 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
139 }
140 } // MiscServices
141 } // OHOS