From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by mx.groups.io with SMTP id smtpd.web10.4681.1668910720632455273 for ; Sat, 19 Nov 2022 18:18:40 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=P/p02LeN; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: jiewen.yao@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668910720; x=1700446720; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=lrBzxF0xkHkro4q16H5RVcb6odsDN++9+haBkpdeXMg=; b=P/p02LeNmu9PwkQSHXMTHENnc4xVZxVeNj34O8ulbTxy1fIwbWWazLGg djhoqBwesJF010KQUB3TIdt31CTHeWhWyyEtDURHxofvb5epQCs8QxKI6 I2w+dF76uhb4s8JtW6gYLhxjdXU9c6tToAhNYYtZb29FfRlrFe0eJ10YH yxSwO/vCnZMh//KCUo0OPmKf4Bj4BrKC4f7Q0EqX1B+3/JuzITI7Z9SlL 6TGROF9o0nbeFQpEKsXkQr6ee4pqE8vbGGK+l+Uokd/aOPQys186Mjwaa 1k1sp8VR5IsvKul8DCKzR4JCnHQHRxumQ1i9TgwDO4epK3KTXD3OwkNNN Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10536"; a="296722156" X-IronPort-AV: E=Sophos;i="5.96,178,1665471600"; d="scan'208";a="296722156" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2022 18:18:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10536"; a="618435586" X-IronPort-AV: E=Sophos;i="5.96,178,1665471600"; d="scan'208";a="618435586" Received: from orsmsx602.amr.corp.intel.com ([10.22.229.15]) by orsmga006.jf.intel.com with ESMTP; 19 Nov 2022 18:18:39 -0800 Received: from orsmsx612.amr.corp.intel.com (10.22.229.25) by ORSMSX602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Sat, 19 Nov 2022 18:18:38 -0800 Received: from orsmsx612.amr.corp.intel.com (10.22.229.25) by ORSMSX612.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Sat, 19 Nov 2022 18:18:38 -0800 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) by orsmsx612.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31 via Frontend Transport; Sat, 19 Nov 2022 18:18:38 -0800 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (104.47.56.49) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.31; Sat, 19 Nov 2022 18:18:38 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dahrJ23W7csbt96Xi0YbpDwQrVCIkX6PHG0XLiAIVfl76A36DQJDglRJIita3A8b2YQtXu/UW4jCEpov6gL1ST65MZcXWgrVKCOeHHPER2FFZzDYj+vJDmLVUC4Z9wNGJ9KUaoswb/jhdInAoVGWMRlqrP/r5c2RThCGgjYpPcumUNNJICuyACH4142kvP6wWEGQMmD1gp5f0BYTS0ezV/nvS159SCgTWoB1UrTY/bjylaLJs5wWGdKCLIEXkqStE/qyaZRfRMOMfOkEebOFtoknS47ZS5MYGLQ6MqbC0nX6n9Hffb32vTfBUtaNcdW+B7ls/X5y0Zt2rb/ufEfccg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1O4ydv04zmj2Fi0ROpVeFgTFlpNLyjAaGwt3my3Yp1I=; b=BshACWGvzijxDVEmkDcC+DsAtUp2ZgeijojFO99dx6XUTjjRukcedJEhNFZaKiUcz0Dw9UStbg03dXthsGGo8mCZtwASA43kYVawypzA/W6QulUqscjWwibN5Fmc8Yeh7L54x/ncdG2PQX7Q9yz9P5bNun93Sa5XlI/7qwGCCmYn3iZC966GG8ri+qRNwjd/vToQ+uHW1frFQ4zJjsA96F4NRo0gIce/Bo5l5VuIGD3dKnNtSovLOAz6toMXyUx0Awh24kF7mv4HjuvVXfuQVUVjnBbHHw31SZFFS4tDSyfIwkh5lpdXeGlZIXo7oZWe7wGpfmKzts2ac2/nW2R4ZA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from PH0PR11MB5879.namprd11.prod.outlook.com (2603:10b6:510:142::5) by PH0PR11MB5205.namprd11.prod.outlook.com (2603:10b6:510:3d::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5834.11; Sun, 20 Nov 2022 02:18:36 +0000 Received: from PH0PR11MB5879.namprd11.prod.outlook.com ([fe80::dfc:656b:a06b:72f]) by PH0PR11MB5879.namprd11.prod.outlook.com ([fe80::dfc:656b:a06b:72f%3]) with mapi id 15.20.5834.009; Sun, 20 Nov 2022 02:18:36 +0000 From: "Yao, Jiewen" To: "Li, Yi1" , "devel@edk2.groups.io" CC: "Wang, Jian J" , "Lu, Xiaoyu1" , "Jiang, Guomin" Subject: Re: [PATCH] CryptoPkg: Add b_print.c which removed floating-point to OpensslLib Thread-Topic: [PATCH] CryptoPkg: Add b_print.c which removed floating-point to OpensslLib Thread-Index: AQHY/DPvj5LMskpYNEGKZ9DxyGWK765GcK6AgACiKqA= Date: Sun, 20 Nov 2022 02:18:36 +0000 Message-ID: References: <20221119162754.1034-1-yi1.li@intel.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PH0PR11MB5879:EE_|PH0PR11MB5205:EE_ x-ms-office365-filtering-correlation-id: 92fe60b7-7717-48a3-65f8-08daca9d87ac x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 6p52jKDXau9XFEPRfmum89wPe1/k/0I1dTx5HUmMa2q3KmOQT9zbQQdTIjcQk7QVuhRkBnUR1m87TnetoTQW63yB5YV77jUE5yQ2tDsMH1g5TveIeuUC3DUyFHEGKwtnvyHx7IfAD7666iZvtS5Kr8nWlJaqNrd8c7eO1j5JS3IZ1VrAFbWEcNOtvjOExGhsv2yVL3rptDKhzfqBse6UVchaO45tRIMroDbx2wwxBZOysQMP1Pq5Ln3N1feEj+HMneSX4/52OMXG3RCK0E/ZLXKrCGwRTkqjwF9baMnrzfVAup/OqNVHNnWaXJmsz1D2zskVUyqYKvuKASVdkDoAK6YQjSLcu3BSrA7L56pQcPDBnSvNkhwMWkv9VRA+TUMDBppwqy691Y1Lf0ij9kdq5Qz8UHAIBpfhvTMwM97OPvPY16spB2AB4IFe3NHbaeHVV/W9KRGv7YMAgLjA8KAr1USTjJV4sjF/3oGXRYbnQdVpl0lTuijg1IQTu71snogB9nwDzJ/1HaH6WTQkY1odqDtqGZMAoBQvWGpYOwwhD9ioPO4qy7QTFOnhMw3CFvEJRViSmACtHL8iB/7/2qNqotbhVaC0wZF49HGCwtHmkDRxfXeh0mA6t2Q7u9aOrT/h3eKN4FW6wDX1wGZFULBHy1CoonZWPQyqA8m8qP8XPxyhMEDOZXZcN8jOQN0uOvS9W78656HXksySDfGDAkiDJKt7uL98U3z7Tm6a8/SQe/4SlEWpf+ytyxRAUWNEWtcqP0vXbGnUfJwmjZxzOIqG3qZjFh11Y/7Fe5KGqdzVtws= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH0PR11MB5879.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(39860400002)(346002)(376002)(396003)(366004)(136003)(451199015)(41300700001)(8936002)(54906003)(4326008)(5660300002)(316002)(66946007)(66556008)(66446008)(66476007)(64756008)(76116006)(8676002)(52536014)(30864003)(478600001)(2906002)(71200400001)(966005)(122000001)(107886003)(6506007)(186003)(110136005)(53546011)(9686003)(7696005)(26005)(38070700005)(38100700002)(33656002)(86362001)(83380400001)(55016003)(82960400001)(21314003)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?Q4NDcUroKWgoRh81LOx3vJCo7oG/gSlUUCcMU5irjIrEHyRufRNcEVPZrAdy?= =?us-ascii?Q?t/p+HuGDhy1vIhqYi/yPh03CudFEjDxDEGoHTATsmwgiFG5y4ncUa3l2otCD?= =?us-ascii?Q?qusWmisnzarpv51HOyk6hFarwrCSwBKlqSleH+LBm5BJV7xt7CZQr5mejAV2?= =?us-ascii?Q?r3QSuBFrlAhQgh64ZJpACkV67TXjHJzP5K3md+1zQz+nl2ru4ZmVRYyErt2E?= =?us-ascii?Q?bWm33TX91IHpd+cxKbMjFYGuKsFTYPkI52UcTsgpuWBV5Y2ddsUcLOZf4Muz?= =?us-ascii?Q?EB07+2E0AfCaz4Aje1Wr9mMvYSpEalfjEYnmniv1oQyihgxtnwua31mCatjS?= =?us-ascii?Q?pfOB4hk7nHf+4oQ6bPop1/kKTLK0Vj8BFnbBfRmsrFjkz8VSCHkM4Wid7AU0?= =?us-ascii?Q?0cpkdsi0wO3OqoWXKSJz/MR1KLdOEeS9ookoZj7bIYhTpS3MVg0l5W7k4Yo+?= =?us-ascii?Q?b57YAsUM4t65jnbfIeGYaczTBYAEcHs8HfhHwlZYfputSI6VQotzeGVaJTqi?= =?us-ascii?Q?eeaPy+9nqXG2hi+DrpEj9nUjPj2JBc7obYvBlRIIvnh9Lr8hi91k9IAQAQmE?= =?us-ascii?Q?NWRMB+ddLhiyVZJl82iicovlHzU5oRTWB9rYpAIa9PxifMXaKt9IT1G3bp7b?= =?us-ascii?Q?bdro59QLD0qGIO9iz/LMx31cweqN1iudvhaw4oOjbO3a5NkWPaPEPrYJ1rEo?= =?us-ascii?Q?nEPlEvUGJqmxcMzXEX0eh/bJb7Zdlx6HzyB+evm7qrtGL+zG2bw/EAHfwyl2?= =?us-ascii?Q?A7wHRNqZCnwg1fFLeg148DJWqihiXpBkpR1l1qE19PPh552yZkC48VAIwMgq?= =?us-ascii?Q?IWe6JIBRPYhiKuFrjrcPbjVPB/6rU8X2ar6/8dYIZ6/e7m62R6U4xNZ1F13V?= =?us-ascii?Q?B6c0rOD5zo3craD4IIBsFL7+DkZKI3LmoFmA2p/f8cJIAh2mFX5rb+wZPXOr?= =?us-ascii?Q?11ZapEea9CNgR/BEvi3/k2DNFqrzxJZe48HY0Xys3fLeSruA0GDdJw/ahrgO?= =?us-ascii?Q?nEtEIVEN4h6hpX66MGgaigcbXHAZZrITwD2+jqgL7zUV7JyxYrxgB+LJg9di?= =?us-ascii?Q?MVAY/7IbDQP/bZkODDH4WSfbc5nYx94c7O7KXJ0AxdqxjbvXniY/QbGKMoT4?= =?us-ascii?Q?u5EabwoODXsc1VqEXB+L/ZDXzqqyXfXaes4o9uol0YFseWCdlNK1W3MxOJyu?= =?us-ascii?Q?E15bT2JMq3dgAqg/GzR7mv92yzOtV3oBUzklgRSg7OoeCrqz9gr/b8CNWNNC?= =?us-ascii?Q?+1RaemVMLIvX34306o0fCixqt6RKTsqr3SrT6CcELEA7rymSUS6aTYHu7KMe?= =?us-ascii?Q?LTO1avoXyGoH3Ftlo3gIUFWH8v/1Pg2tibrrtLaC6Zj1nMQYJ6+WeAiz68ny?= =?us-ascii?Q?CGWpEYA8Dpo4qN1TRJMdAurv6ascalaeVXtOZCuwKKFIvyti+nXr0bAZBWUF?= =?us-ascii?Q?2Sq3+rm3R3xPLFvoTkmTqJ0dzDSZa26xNp8eLpfIuLRS+7NnBvc7qRytZfx/?= =?us-ascii?Q?Vxk8KpJZrtNVRDTYmDsvNUHbifWm3J0reyrM92Pw4dy4msYWh/tgU09Pa5Oh?= =?us-ascii?Q?nRDklm7InnpNaYEdH+tCJLI4RxfWRObcKrKz2QeF?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PH0PR11MB5879.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 92fe60b7-7717-48a3-65f8-08daca9d87ac X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Nov 2022 02:18:36.0620 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: hZnjHpEZ3aTFFmsP7wIL62NxmVnwxbqClcPqnIzusxaL5rjoWB+kYojsgGKVY0waN3FSc++X1msaSNYkVaBi8A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB5205 Return-Path: jiewen.yao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable HI Yi I have question for 1 - The original file uses code related to floating-poi= nt and ulldrvm. a) Openssl supports OPENSSL_SYS_UEFI macro (https://github.com/tianocore/ed= k2/blob/master/CryptoPkg/Library/Include/openssl/opensslconf.h#L28), why no= t use OPENSSL_SYS_UEFI macro to eliminate float point action? b) For ulldrvm, why not implement it in https://github.com/tianocore/edk2/t= ree/master/CryptoPkg/Library/IntrinsicLib, as we already did. Thank you Yao, Jiewen > -----Original Message----- > From: Li, Yi1 > Sent: Sunday, November 20, 2022 12:33 AM > To: devel@edk2.groups.io > Cc: Yao, Jiewen ; Wang, Jian J > ; Lu, Xiaoyu1 ; Jiang, > Guomin > Subject: RE: [PATCH] CryptoPkg: Add b_print.c which removed floating- > point to OpensslLib >=20 > Hi all, >=20 > This patch is the pre-work for enabling the X509 certificate time check. > I know it looks weird to add a new b_print.c, so I wanted to explain the > background of this patch. >=20 > 1. Why not directly use the b_print.c file in openssl? > The original file uses code related to floating-point and ulldrvm, which = will > cause compilation errors like: > unresolved external symbol __aulldvrm > error: SSE register return with SSE disabled > ref: https://github.com/tianocore/edk2/pull/3508 >=20 > So I removed all float code and replaced ulldrvm with > DivU64x32Remainder(): > 1). > case 'f': > case 'E': > case 'e': > case 'G': > case 'g': > return -1; > 2). > + uvalue =3D DivU64x32Remainder(uvalue, (unsigned)base, &uremainde= r); > convert[place++] =3D (caps ? "0123456789ABCDEF" : > "0123456789abcdef") > - [uvalue % (unsigned)base]; > - uvalue =3D (uvalue / (unsigned)base); > + [uremainder]; >=20 >=20 > 2. Why not use the similar print function AsciiVSPrint in EDK2? > EDK2 functions are all ms_abi but openssl functions not, so they use > different va_list definitions, the relevant codes are as follows: > GCC:*_*_X64_CC_FLAGS =3D ...... -DNO_MSABI_VA_FUNCS > https://github.com/tianocore/edk2/blob/fff6d81270b57ee786ea18ad74f4 > 3149b9f03494/CryptoPkg/Library/OpensslLib/OpensslLib.inf#LL636C2- > L636C3 >=20 > Therefore, segmentation fault will occur when calling the edk2 VA > parameter function in the openssl function. >=20 > 3. Why not remove NO_MSABI_VA_FUNCS? > Similarly, ms va_list cannot be used in the sysv function in openssl, whi= ch > will also cause segmentation fault. >=20 > I am not expert of compilation, let me know if there is other better idea= . >=20 > Thanks, > Yi >=20 > -----Original Message----- > From: Li, Yi1 > Sent: Sunday, November 20, 2022 12:28 AM > To: devel@edk2.groups.io > Cc: Li, Yi1 ; Yao, Jiewen ; Wang, > Jian J ; Lu, Xiaoyu1 ; Jiang= , > Guomin > Subject: [PATCH] CryptoPkg: Add b_print.c which removed floating-point to > OpensslLib >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4110 >=20 > Openssl will use BIO_snprintf() to print time string when converting time= _t > to ASN1_time. > Currently edk2 code just give it a NULL implement in CrtWrapper.c, so > getting current time in X509 time check will be fail. >=20 > This patch add a copy of OpensslLib\openssl\crypto\bio\b_print.c to > OpensslLib, with below changes: >=20 > 1. All floating point related code removed. > 2. Replace ull divide and remainder with DivU64x32Remainder(). >=20 > Cc: Jiewen Yao > Cc: Jian J Wang > Cc: Xiaoyu Lu > Cc: Guomin Jiang > Signed-off-by: Yi Li > --- > CryptoPkg/CryptoPkg.ci.yaml | 4 +- > .../Library/BaseCryptLib/SysCall/CrtWrapper.c | 27 - > .../SysCall/UnitTestHostCrtWrapper.c | 25 - > CryptoPkg/Library/OpensslLib/OpensslLib.inf | 1 + > .../Library/OpensslLib/OpensslLibAccel.inf | 1 + > .../Library/OpensslLib/OpensslLibCrypto.inf | 1 + > .../Library/OpensslLib/OpensslLibFull.inf | 1 + > .../OpensslLib/OpensslLibFullAccel.inf | 1 + > CryptoPkg/Library/OpensslLib/b_print.c | 613 ++++++++++++++++++ > 9 files changed, 621 insertions(+), 53 deletions(-) create mode 100644 > CryptoPkg/Library/OpensslLib/b_print.c >=20 > diff --git a/CryptoPkg/CryptoPkg.ci.yaml b/CryptoPkg/CryptoPkg.ci.yaml > index 47f2975967..8c25f581fb 100644 > --- a/CryptoPkg/CryptoPkg.ci.yaml > +++ b/CryptoPkg/CryptoPkg.ci.yaml > @@ -13,7 +13,9 @@ > "Library/OpensslLib/IA32Gcc", > "Library/OpensslLib/X64", > "Library/OpensslLib/X64Gcc", > - "Library/Include/openssl" > + "Library/Include/openssl", > + # b_print.c is a copy from OpenSSl. > + "Library/OpensslLib/b_print.c" > ] > }, > "EccCheck": { > diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c > b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c > index b65d29485b..6d7ac3efdc 100644 > --- a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c > +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c > @@ -472,33 +472,6 @@ fwrite ( > return 0; > } >=20 > -// > -// -- Dummy OpenSSL Support Routines -- -// > - > -int > -BIO_printf ( > - void *bio, > - const char *format, > - ... > - ) > -{ > - return 0; > -} > - > -int > -BIO_snprintf ( > - char *buf, > - size_t n, > - const char *format, > - ... > - ) > -{ > - // Because the function does not actually print anything to buf, it re= turns > -1 as error. > - // Otherwise, the consumer may think that the buf is valid and parse t= he > buffer. > - return -1; > -} > - > #ifdef __GNUC__ >=20 > typedef > diff --git > a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c > b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c > index 066d53e4fa..244e57437e 100644 > --- a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c > +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c > @@ -72,31 +72,6 @@ sscanf ( > return 0; > } >=20 > -// > -// -- Dummy OpenSSL Support Routines -- -// > - > -int > -BIO_printf ( > - void *bio, > - const char *format, > - ... > - ) > -{ > - return 0; > -} > - > -int > -BIO_snprintf ( > - char *buf, > - size_t n, > - const char *format, > - ... > - ) > -{ > - return 0; > -} > - > uid_t > getuid ( > void > diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf > b/CryptoPkg/Library/OpensslLib/OpensslLib.inf > index 60c6c24b0a..f8ddfadc51 100644 > --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf > +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf > @@ -580,6 +580,7 @@ > rand_pool.c > # SslNull.c > EcSm2Null.c > + b_print.c >=20 > [Packages] > MdePkg/MdePkg.dec > diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf > b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf > index 103ef7bda2..6ee7bfd329 100644 > --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf > +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf > @@ -580,6 +580,7 @@ > rand_pool.c > # SslNull.c > EcSm2Null.c > + b_print.c >=20 > [Sources.IA32] > # Autogenerated IA32 files list starts here diff --git > a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf > b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf > index c4eaea888c..3e43cf146b 100644 > --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf > +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf > @@ -530,6 +530,7 @@ > rand_pool.c > SslNull.c > EcSm2Null.c > + b_print.c >=20 > [Packages] > MdePkg/MdePkg.dec > diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf > b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf > index 309e43055c..440d3e7e1d 100644 > --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf > +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf > @@ -635,6 +635,7 @@ > rand_pool.c > # SslNull.c > # EcSm2Null.c > + b_print.c >=20 > [Packages] > MdePkg/MdePkg.dec > diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf > b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf > index 4eeeeb79bd..413f70f733 100644 > --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf > +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf > @@ -635,6 +635,7 @@ > rand_pool.c > # SslNull.c > # EcSm2Null.c > + b_print.c >=20 > [Sources.IA32] > # Autogenerated IA32 files list starts here diff --git > a/CryptoPkg/Library/OpensslLib/b_print.c > b/CryptoPkg/Library/OpensslLib/b_print.c > new file mode 100644 > index 0000000000..885c3b9264 > --- /dev/null > +++ b/CryptoPkg/Library/OpensslLib/b_print.c > @@ -0,0 +1,613 @@ > +/* > + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. > + * > + * Licensed under the OpenSSL license (the "License"). You may not use > + * this file except in compliance with the License. You can obtain a > +copy > + * in the file LICENSE in the source distribution or at > + * https://www.openssl.org/source/license.html > + * > + * Please notes: > + * This file is a copy of OpensslLib\openssl\crypto\bio\b_print.c > + * with all floating point related code removed (Not supported in UEFI). > + * This means that '%f' '%g' '%e' and related combined formats are no > longer supported. > + * > + */ > + > +#include > +#include > +#include "internal/cryptlib.h" > +#include "crypto/ctype.h" > +#include "internal/numbers.h" > +#include > + > +/* > + * Copyright Patrick Powell 1995 > + * This code is based on code written by Patrick Powell > + > + * It may be used for any purpose as long as this notice remains intact > + * on all source code distributions. > + */ > + > +static int fmtstr(char **, char **, size_t *, size_t *, > + const char *, int, int, int); static int fmtint(char > +**, char **, size_t *, size_t *, > + int64_t, int, int, int, int); static int > +doapr_outch(char **, char **, size_t *, size_t *, int); static int > +_dopr(char **sbuffer, char **buffer, > + size_t *maxlen, size_t *retlen, int *truncated, > + const char *format, va_list args); > + > +/* format read states */ > +#define DP_S_DEFAULT 0 > +#define DP_S_FLAGS 1 > +#define DP_S_MIN 2 > +#define DP_S_DOT 3 > +#define DP_S_MAX 4 > +#define DP_S_MOD 5 > +#define DP_S_CONV 6 > +#define DP_S_DONE 7 > + > +/* format flags - Bits */ > +/* left-aligned padding */ > +#define DP_F_MINUS (1 << 0) > +/* print an explicit '+' for a value with positive sign */ > +#define DP_F_PLUS (1 << 1) > +/* print an explicit ' ' for a value with positive sign */ > +#define DP_F_SPACE (1 << 2) > +/* print 0/0x prefix for octal/hex and decimal point for floating point = */ > +#define DP_F_NUM (1 << 3) > +/* print leading zeroes */ > +#define DP_F_ZERO (1 << 4) > +/* print HEX in UPPPERcase */ > +#define DP_F_UP (1 << 5) > +/* treat value as unsigned */ > +#define DP_F_UNSIGNED (1 << 6) > + > +/* conversion flags */ > +#define DP_C_SHORT 1 > +#define DP_C_LONG 2 > +// #define DP_C_LDOUBLE 3 > +#define DP_C_LLONG 4 > +#define DP_C_SIZE 5 > + > +/* Floating point formats */ > +// #define F_FORMAT 0 > +// #define E_FORMAT 1 > +// #define G_FORMAT 2 > + > +/* some handy macros */ > +#define char_to_int(p) (p - '0') > +#define OSSL_MAX(p,q) ((p >=3D q) ? p : q) > + > +static int > +_dopr(char **sbuffer, > + char **buffer, > + size_t *maxlen, > + size_t *retlen, int *truncated, const char *format, va_list args) > +{ > + char ch; > + int64_t value; > + char *strvalue; > + int min; > + int max; > + int state; > + int flags; > + int cflags; > + size_t currlen; > + > + state =3D DP_S_DEFAULT; > + flags =3D currlen =3D cflags =3D min =3D 0; > + max =3D -1; > + ch =3D *format++; > + > + while (state !=3D DP_S_DONE) { > + if (ch =3D=3D '\0' || (buffer =3D=3D NULL && currlen >=3D *maxle= n)) > + state =3D DP_S_DONE; > + > + switch (state) { > + case DP_S_DEFAULT: > + if (ch =3D=3D '%') > + state =3D DP_S_FLAGS; > + else > + if (!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch)) > + return 0; > + ch =3D *format++; > + break; > + case DP_S_FLAGS: > + switch (ch) { > + case '-': > + flags |=3D DP_F_MINUS; > + ch =3D *format++; > + break; > + case '+': > + flags |=3D DP_F_PLUS; > + ch =3D *format++; > + break; > + case ' ': > + flags |=3D DP_F_SPACE; > + ch =3D *format++; > + break; > + case '#': > + flags |=3D DP_F_NUM; > + ch =3D *format++; > + break; > + case '0': > + flags |=3D DP_F_ZERO; > + ch =3D *format++; > + break; > + default: > + state =3D DP_S_MIN; > + break; > + } > + break; > + case DP_S_MIN: > + if (ossl_isdigit(ch)) { > + min =3D 10 * min + char_to_int(ch); > + ch =3D *format++; > + } else if (ch =3D=3D '*') { > + min =3D va_arg(args, int); > + ch =3D *format++; > + state =3D DP_S_DOT; > + } else > + state =3D DP_S_DOT; > + break; > + case DP_S_DOT: > + if (ch =3D=3D '.') { > + state =3D DP_S_MAX; > + ch =3D *format++; > + } else > + state =3D DP_S_MOD; > + break; > + case DP_S_MAX: > + if (ossl_isdigit(ch)) { > + if (max < 0) > + max =3D 0; > + max =3D 10 * max + char_to_int(ch); > + ch =3D *format++; > + } else if (ch =3D=3D '*') { > + max =3D va_arg(args, int); > + ch =3D *format++; > + state =3D DP_S_MOD; > + } else > + state =3D DP_S_MOD; > + break; > + case DP_S_MOD: > + switch (ch) { > + case 'h': > + cflags =3D DP_C_SHORT; > + ch =3D *format++; > + break; > + case 'l': > + if (*format =3D=3D 'l') { > + cflags =3D DP_C_LLONG; > + format++; > + } else > + cflags =3D DP_C_LONG; > + ch =3D *format++; > + break; > + case 'q': > + case 'j': > + cflags =3D DP_C_LLONG; > + ch =3D *format++; > + break; > + case 'L': > + //Unsupported fmt in UEFI > + return -1; > + case 'z': > + cflags =3D DP_C_SIZE; > + ch =3D *format++; > + break; > + default: > + break; > + } > + state =3D DP_S_CONV; > + break; > + case DP_S_CONV: > + switch (ch) { > + case 'd': > + case 'i': > + switch (cflags) { > + case DP_C_SHORT: > + value =3D (short int)va_arg(args, int); > + break; > + case DP_C_LONG: > + value =3D va_arg(args, long int); > + break; > + case DP_C_LLONG: > + value =3D va_arg(args, int64_t); > + break; > + case DP_C_SIZE: > + value =3D va_arg(args, ossl_ssize_t); > + break; > + default: > + value =3D va_arg(args, int); > + break; > + } > + if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10= , min, > + max, flags)) > + return 0; > + break; > + case 'X': > + flags |=3D DP_F_UP; > + /* FALLTHROUGH */ > + case 'x': > + case 'o': > + case 'u': > + flags |=3D DP_F_UNSIGNED; > + switch (cflags) { > + case DP_C_SHORT: > + value =3D (unsigned short int)va_arg(args, unsigned = int); > + break; > + case DP_C_LONG: > + value =3D va_arg(args, unsigned long int); > + break; > + case DP_C_LLONG: > + value =3D va_arg(args, uint64_t); > + break; > + case DP_C_SIZE: > + value =3D va_arg(args, size_t); > + break; > + default: > + value =3D va_arg(args, unsigned int); > + break; > + } > + if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, > + ch =3D=3D 'o' ? 8 : (ch =3D=3D 'u' ? 10 : 16= ), > + min, max, flags)) > + return 0; > + break; > + case 'f': > + case 'E': > + case 'e': > + case 'G': > + case 'g': > + return -1; > + case 'c': > + if (!doapr_outch(sbuffer, buffer, &currlen, maxlen, > + va_arg(args, int))) > + return 0; > + break; > + case 's': > + strvalue =3D va_arg(args, char *); > + if (max < 0) { > + if (buffer) > + max =3D INT_MAX; > + else > + max =3D *maxlen; > + } > + if (!fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, > + flags, min, max)) > + return 0; > + break; > + case 'p': > + value =3D (size_t)va_arg(args, void *); > + if (!fmtint(sbuffer, buffer, &currlen, maxlen, > + value, 16, min, max, flags | DP_F_NUM)) > + return 0; > + break; > + case 'n': > + { > + int *num; > + num =3D va_arg(args, int *); > + *num =3D currlen; > + } > + break; > + case '%': > + if (!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch)) > + return 0; > + break; > + case 'w': > + /* not supported yet, treat as next char */ > + ch =3D *format++; > + break; > + default: > + /* unknown, skip */ > + break; > + } > + ch =3D *format++; > + state =3D DP_S_DEFAULT; > + flags =3D cflags =3D min =3D 0; > + max =3D -1; > + break; > + case DP_S_DONE: > + break; > + default: > + break; > + } > + } > + /* > + * We have to truncate if there is no dynamic buffer and we have fil= led > the > + * static buffer. > + */ > + if (buffer =3D=3D NULL) { > + *truncated =3D (currlen > *maxlen - 1); > + if (*truncated) > + currlen =3D *maxlen - 1; > + } > + if (!doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0')) > + return 0; > + *retlen =3D currlen - 1; > + return 1; > +} > + > +static int > +fmtstr(char **sbuffer, > + char **buffer, > + size_t *currlen, > + size_t *maxlen, const char *value, int flags, int min, int max) > +{ > + int padlen; > + size_t strln; > + int cnt =3D 0; > + > + if (value =3D=3D 0) > + value =3D ""; > + > + strln =3D OPENSSL_strnlen(value, max < 0 ? SIZE_MAX : (size_t)max); > + > + padlen =3D min - strln; > + if (min < 0 || padlen < 0) > + padlen =3D 0; > + if (max >=3D 0) { > + /* > + * Calculate the maximum output including padding. > + * Make sure max doesn't overflow into negativity > + */ > + if (max < INT_MAX - padlen) > + max +=3D padlen; > + else > + max =3D INT_MAX; > + } > + if (flags & DP_F_MINUS) > + padlen =3D -padlen; > + > + while ((padlen > 0) && (max < 0 || cnt < max)) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) > + return 0; > + --padlen; > + ++cnt; > + } > + while (strln > 0 && (max < 0 || cnt < max)) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, *value++)) > + return 0; > + --strln; > + ++cnt; > + } > + while ((padlen < 0) && (max < 0 || cnt < max)) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) > + return 0; > + ++padlen; > + ++cnt; > + } > + return 1; > +} > + > +static int > +fmtint(char **sbuffer, > + char **buffer, > + size_t *currlen, > + size_t *maxlen, int64_t value, int base, int min, int max, int > +flags) { > + int signvalue =3D 0; > + const char *prefix =3D ""; > + uint64_t uvalue; > + char convert[DECIMAL_SIZE(value) + 3]; > + int place =3D 0; > + int spadlen =3D 0; > + int zpadlen =3D 0; > + int caps =3D 0; > + uint32_t uremainder =3D 0; > + > + if (max < 0) > + max =3D 0; > + uvalue =3D value; > + if (!(flags & DP_F_UNSIGNED)) { > + if (value < 0) { > + signvalue =3D '-'; > + uvalue =3D 0 - (uint64_t)value; > + } else if (flags & DP_F_PLUS) > + signvalue =3D '+'; > + else if (flags & DP_F_SPACE) > + signvalue =3D ' '; > + } > + if (flags & DP_F_NUM) { > + if (base =3D=3D 8) > + prefix =3D "0"; > + if (base =3D=3D 16) > + prefix =3D "0x"; > + } > + if (flags & DP_F_UP) > + caps =3D 1; > + do { > + uvalue =3D DivU64x32Remainder(uvalue, (unsigned)base, &uremainde= r); > + convert[place++] =3D (caps ? "0123456789ABCDEF" : > "0123456789abcdef") > + [uremainder]; > + } while (uvalue && (place < (int)sizeof(convert))); > + if (place =3D=3D sizeof(convert)) > + place--; > + convert[place] =3D 0; > + > + zpadlen =3D max - place; > + spadlen =3D > + min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix= ); > + if (zpadlen < 0) > + zpadlen =3D 0; > + if (spadlen < 0) > + spadlen =3D 0; > + if (flags & DP_F_ZERO) { > + zpadlen =3D OSSL_MAX(zpadlen, spadlen); > + spadlen =3D 0; > + } > + if (flags & DP_F_MINUS) > + spadlen =3D -spadlen; > + > + /* spaces */ > + while (spadlen > 0) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) > + return 0; > + --spadlen; > + } > + > + /* sign */ > + if (signvalue) > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue)) > + return 0; > + > + /* prefix */ > + while (*prefix) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix)) > + return 0; > + prefix++; > + } > + > + /* zeros */ > + if (zpadlen > 0) { > + while (zpadlen > 0) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '0')) > + return 0; > + --zpadlen; > + } > + } > + /* digits */ > + while (place > 0) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--pla= ce])) > + return 0; > + } > + > + /* left justified spaces */ > + while (spadlen < 0) { > + if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) > + return 0; > + ++spadlen; > + } > + return 1; > +} > + > +#define BUFFER_INC 1024 > + > +static int > +doapr_outch(char **sbuffer, > + char **buffer, size_t *currlen, size_t *maxlen, int c) { > + /* If we haven't at least one buffer, someone has done a big booboo = */ > + if (!ossl_assert(*sbuffer !=3D NULL || buffer !=3D NULL)) > + return 0; > + > + /* |currlen| must always be <=3D |*maxlen| */ > + if (!ossl_assert(*currlen <=3D *maxlen)) > + return 0; > + > + if (buffer && *currlen =3D=3D *maxlen) { > + if (*maxlen > INT_MAX - BUFFER_INC) > + return 0; > + > + *maxlen +=3D BUFFER_INC; > + if (*buffer =3D=3D NULL) { > + if ((*buffer =3D OPENSSL_malloc(*maxlen)) =3D=3D NULL) { > + BIOerr(BIO_F_DOAPR_OUTCH, ERR_R_MALLOC_FAILURE); > + return 0; > + } > + if (*currlen > 0) { > + if (!ossl_assert(*sbuffer !=3D NULL)) > + return 0; > + memcpy(*buffer, *sbuffer, *currlen); > + } > + *sbuffer =3D NULL; > + } else { > + char *tmpbuf; > + tmpbuf =3D OPENSSL_realloc(*buffer, *maxlen); > + if (tmpbuf =3D=3D NULL) > + return 0; > + *buffer =3D tmpbuf; > + } > + } > + > + if (*currlen < *maxlen) { > + if (*sbuffer) > + (*sbuffer)[(*currlen)++] =3D (char)c; > + else > + (*buffer)[(*currlen)++] =3D (char)c; > + } > + > + return 1; > +} > + > +/********************************************************* > ************* > +*****/ > + > +int BIO_printf(BIO *bio, const char *format, ...) { > + va_list args; > + int ret; > + > + va_start(args, format); > + > + ret =3D BIO_vprintf(bio, format, args); > + > + va_end(args); > + return ret; > +} > + > +int BIO_vprintf(BIO *bio, const char *format, va_list args) { > + int ret; > + size_t retlen; > + char hugebuf[1024 * 2]; /* Was previously 10k, which is > unreasonable > + * in small-stack environments, like thr= eads > + * or DOS programs. */ > + char *hugebufp =3D hugebuf; > + size_t hugebufsize =3D sizeof(hugebuf); > + char *dynbuf =3D NULL; > + int ignored; > + > + dynbuf =3D NULL; > + if (!_dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, > format, > + args)) { > + OPENSSL_free(dynbuf); > + return -1; > + } > + if (dynbuf) { > + ret =3D BIO_write(bio, dynbuf, (int)retlen); > + OPENSSL_free(dynbuf); > + } else { > + ret =3D BIO_write(bio, hugebuf, (int)retlen); > + } > + return ret; > +} > + > +/* > + * As snprintf is not available everywhere, we provide our own > + * implementation. This function has nothing to do with BIOs, but it's > + * closely related to BIO_printf, and we need *some* name prefix ... > +(XXX the > + * function should be renamed, but to what?) */ int BIO_snprintf(char > +*buf, size_t n, const char *format, ...) { > + va_list args; > + int ret; > + > + va_start(args, format); > + > + ret =3D BIO_vsnprintf(buf, n, format, args); > + > + va_end(args); > + return ret; > +} > + > +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list > +args) { > + size_t retlen; > + int truncated; > + > + if (!_dopr(&buf, NULL, &n, &retlen, &truncated, format, args)) > + return -1; > + > + if (truncated) > + /* > + * In case of truncation, return -1 like traditional snprintf. > + * (Current drafts for ISO/IEC 9899 say snprintf should return t= he > + * number of characters that would have been written, had the bu= ffer > + * been large enough.) > + */ > + return -1; > + else > + return (retlen <=3D INT_MAX) ? (int)retlen : -1; } > -- > 2.31.1.windows.1