From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mx.groups.io with SMTP id smtpd.web10.41720.1669898064019576923 for ; Thu, 01 Dec 2022 04:34:27 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: huawei.com, ip: 45.249.212.187, mailfrom: xiewenyi2@huawei.com) Received: from kwepemm600004.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4NNFlQ5ZJbzqSh9 for ; Thu, 1 Dec 2022 20:30:10 +0800 (CST) Received: from [10.174.253.58] (10.174.253.58) by kwepemm600004.china.huawei.com (7.193.23.242) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 1 Dec 2022 20:34:13 +0800 From: "wenyi,xie" Subject: Re: [edk2-devel] [PATCH EDK2 v1 1/1] CryptoPkg/BaseCryptLib:time overflow To: "Yao, Jiewen" , "devel@edk2.groups.io" , "Wang, Jian J" , "Lu, Xiaoyu1" , "Jiang, Guomin" CC: "songdongkuang@huawei.com" , "yizihong@huawei.com" References: <20221125091148.2405866-1-xiewenyi2@huawei.com> <20221125091148.2405866-2-xiewenyi2@huawei.com> Message-ID: <99aa4b4b-5410-c2cf-4668-e28815ff783d@huawei.com> Date: Thu, 1 Dec 2022 20:34:07 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.0.1 MIME-Version: 1.0 In-Reply-To: X-Originating-IP: [10.174.253.58] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemm600004.china.huawei.com (7.193.23.242) X-CFilter-Loop: Reflected Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit On 2022/12/1 16:34, Yao, Jiewen wrote: > Thank you! > > Would you please share what test you have run for this patch, such as UEFI secure boot? HTTPS boot? > Hi, Jiewen We found this problem when importing certification and verifying the expiration date(the verifying code is customed), so we only using a X64 board to do the test like below: 1. Entering setup page 2. Setting system time to 2038.9.27 19:23 3. Importing a X509 certification, which is valid from 2022.9.27 1:59 to 2023.9.27 1:59 before merging the patch the certification can be imported successfully. after merging the patch importing failed. > > >> -----Original Message----- >> From: devel@edk2.groups.io On Behalf Of >> wenyi,xie via groups.io >> Sent: Friday, November 25, 2022 5:12 PM >> To: devel@edk2.groups.io; Yao, Jiewen ; Wang, Jian >> J ; Lu, Xiaoyu1 ; Jiang, >> Guomin >> Cc: songdongkuang@huawei.com; xiewenyi2@huawei.com; >> yizihong@huawei.com >> Subject: [edk2-devel] [PATCH EDK2 v1 1/1] CryptoPkg/BaseCryptLib:time >> overflow >> >> From: Zihong Yi >> >> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4167 >> >> In CrtLibSupport.h, time_t is defined as INT32, and its maximum value >> is 2147483647. That is, the corresponding maximum timestamp is >> 2038-01-19 11:14:07. Therefore, overflow occurs when the test time >> exceeds 2038-01-19 11:14:07. So change the type of time_t to INT64 and >> also change the type of variables in function gmtime which calculated >> with time_t. >> >> Cc: Jiewen Yao >> Cc: Jian J Wang >> Cc: Xiaoyu Lu >> Cc: Guomin Jiang >> Signed-off-by: Zihong Yi >> --- >> CryptoPkg/Library/Include/CrtLibSupport.h | 2 +- >> CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c | 51 >> ++++++++++++++------ >> 2 files changed, 38 insertions(+), 15 deletions(-) >> >> diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h >> b/CryptoPkg/Library/Include/CrtLibSupport.h >> index 5072c343da57..94b0e6b6014f 100644 >> --- a/CryptoPkg/Library/Include/CrtLibSupport.h >> +++ b/CryptoPkg/Library/Include/CrtLibSupport.h >> @@ -109,7 +109,7 @@ typedef UINTN off_t; >> typedef UINTN u_int; >> typedef INTN ptrdiff_t; >> typedef INTN ssize_t; >> -typedef INT32 time_t; >> +typedef INT64 time_t; >> typedef UINT8 __uint8_t; >> typedef UINT8 sa_family_t; >> typedef UINT8 u_char; >> diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c >> b/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c >> index bf8a5325817f..3ed64375d0ff 100644 >> --- a/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c >> +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c >> @@ -15,7 +15,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent >> // -- Time Management Routines -- >> // >> >> -#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) >> #define SECSPERMIN (60) >> #define SECSPERHOUR (60 * 60) >> #define SECSPERDAY (24 * SECSPERHOUR) >> @@ -60,6 +59,26 @@ UINTN CumulativeDays[2][14] = { >> } >> }; >> >> +/* Check the year is leap or not. */ >> +// BOOLEAN IsLeap( >> +// INTN timer >> +// ) >> +BOOLEAN >> +IsLeap ( >> + time_t timer >> + ) >> +{ >> + INT64 Remainder1; >> + INT64 Remainder2; >> + INT64 Remainder3; >> + >> + DivS64x64Remainder (timer, 4, &Remainder1); >> + DivS64x64Remainder (timer, 100, &Remainder2); >> + DivS64x64Remainder (timer, 400, &Remainder3); >> + >> + return (Remainder1 == 0 && (Remainder2 != 0 || Remainder3 == 0)); >> +} >> + >> /* Get the system time as seconds elapsed since midnight, January 1, 1970. >> */ >> // INTN time( >> // INTN *timer >> @@ -117,12 +136,13 @@ gmtime ( >> ) >> { >> struct tm *GmTime; >> - UINT16 DayNo; >> - UINT32 DayRemainder; >> + UINT64 DayNo; >> + UINT64 DayRemainder; >> time_t Year; >> time_t YearNo; >> - UINT16 TotalDays; >> - UINT16 MonthNo; >> + UINT32 TotalDays; >> + UINT32 MonthNo; >> + INT64 Remainder; >> >> if (timer == NULL) { >> return NULL; >> @@ -135,18 +155,21 @@ gmtime ( >> >> ZeroMem ((VOID *)GmTime, (UINTN)sizeof (struct tm)); >> >> - DayNo = (UINT16)(*timer / SECSPERDAY); >> - DayRemainder = (UINT32)(*timer % SECSPERDAY); >> + DayNo = (UINT64)DivS64x64Remainder (*timer, SECSPERDAY, >> &Remainder); >> + DayRemainder = (UINT64)Remainder; >> >> - GmTime->tm_sec = (int)(DayRemainder % SECSPERMIN); >> - GmTime->tm_min = (int)((DayRemainder % SECSPERHOUR) / >> SECSPERMIN); >> - GmTime->tm_hour = (int)(DayRemainder / SECSPERHOUR); >> - GmTime->tm_wday = (int)((DayNo + 4) % 7); >> + DivS64x64Remainder (DayRemainder, SECSPERMIN, &Remainder); >> + GmTime->tm_sec = (int)Remainder; >> + DivS64x64Remainder (DayRemainder, SECSPERHOUR, &Remainder); >> + GmTime->tm_min = (int)DivS64x64Remainder (Remainder, SECSPERMIN, >> NULL); >> + GmTime->tm_hour = (int)DivS64x64Remainder (DayRemainder, >> SECSPERHOUR, NULL); >> + DivS64x64Remainder ((DayNo + 4), 7, &Remainder); >> + GmTime->tm_wday = (int)Remainder; >> >> for (Year = 1970, YearNo = 0; DayNo > 0; Year++) { >> - TotalDays = (UINT16)(IsLeap (Year) ? 366 : 365); >> + TotalDays = (UINT32)(IsLeap (Year) ? 366 : 365); >> if (DayNo >= TotalDays) { >> - DayNo = (UINT16)(DayNo - TotalDays); >> + DayNo = (UINT64)(DayNo - TotalDays); >> YearNo++; >> } else { >> break; >> @@ -158,7 +181,7 @@ gmtime ( >> >> for (MonthNo = 12; MonthNo > 1; MonthNo--) { >> if (DayNo >= CumulativeDays[IsLeap (Year)][MonthNo]) { >> - DayNo = (UINT16)(DayNo - (UINT16)(CumulativeDays[IsLeap >> (Year)][MonthNo])); >> + DayNo = (UINT64)(DayNo - (UINT32)(CumulativeDays[IsLeap >> (Year)][MonthNo])); >> break; >> } >> } >> -- >> 2.20.1.windows.1 >> >> >> >> >> > > > . >