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.6354.1668918627434923857 for ; Sat, 19 Nov 2022 20:30:27 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=OCN/1kD9; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: yi1.li@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668918627; x=1700454627; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=KbggIwh2q99Z6tVNNHGFOEbOuW+sMkpKh/tFoleZwrM=; b=OCN/1kD9yr1jiLgW8roJ2YPwzHRloMh+QPVI7fp3QWLfe2obdxZ7sH6b cvfXyFvm8XXzXEbl2fWKGWvsy9rjUKjRnpMzL9wleueyboNSqP2x+8c4F asHYcEltswckuVxIvORezxnWb6xlg2P6WwQDJWV3164eIqVQON8/YSV0j cABmNgB8JQZsIX6fjumJBwDdYbCAwtECtwEWl0kjh3woWW27B6XE8Uy+l 1Cdf20pmLnrTKZXHpPt1YXo2PL7lPLRG6azsIbgzWBP4LiDdkdvHaK+f9 2edTeCmAWseEBxKlbkoiR6silqDZKGDA3BhJuatxTdc33DUv8Os5dPbxm g==; X-IronPort-AV: E=McAfee;i="6500,9779,10536"; a="296727490" X-IronPort-AV: E=Sophos;i="5.96,178,1665471600"; d="scan'208";a="296727490" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2022 20:30:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10536"; a="709449600" X-IronPort-AV: E=Sophos;i="5.96,178,1665471600"; d="scan'208";a="709449600" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by fmsmga004.fm.intel.com with ESMTP; 19 Nov 2022 20:30:26 -0800 Received: from orsmsx601.amr.corp.intel.com (10.22.229.14) by ORSMSX601.amr.corp.intel.com (10.22.229.14) 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 20:30:25 -0800 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx601.amr.corp.intel.com (10.22.229.14) 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 20:30:25 -0800 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (104.47.73.170) by edgegateway.intel.com (134.134.137.100) 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 20:30:25 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PebgFiKCjs9Wqz+ryFXNK1WP1jyVBET/BGNTotHGufZ3FtsZ2WIIaWm1EAXQz4BeteZDoZ4QSTw8t6q8N9pAQ1k/CKR6hf5JT1Q4zMLMOBmyzo5gx0q6CzMGVfDXbIswAr6ZfTFoIFPQbJmW3TZAN09DoI6Mr7XtFHk/0kKKSZwyLfyXrApmrTgrXAl8fMBpfInr4RqfBjHr71GEG3sNAjdjPzP4qj990mnDWayLaf7d0zd2IXxU8dz5ydi3Rq6tA1ClJACzYL/b1D5W/wl97vhdDQqODoSt4lN/gXv4Lwj9JlfJ4u3uE8057HToSE6jTOmBfLkYItACdKTN7tk4TA== 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=S39/nt20VCN3t4ov0L790aAbIM1R90UNUL5wul+wK8k=; b=WB2VMG4ZcV+qZMNhV8RFVRfX2FgeOwSEbHsxMEZXtjERNWPiN9PU4oO4GMP23M4g0P85iU7AFBEEstLr4lBDr64edA1Mcw3Gs1f9C+x1LlKwlAtpTCHR4wh5RjimIRB2qKHU1PWIDknWq+vULkVDBEPKnqS6k4l5QY3NxIcU58ZYrf3PpZwiAvmaYcmI0Ja82q6kQ371ZBDA4zmoDZWOVczhy6OlbrhYSxPHcDTl6psmZZrNu+Zv8grA1/oS7RBfhysW7Ems7Iy4H5PyW+VnusC2oLCsrDvCZj3BMsEhI3bJSzCoKWKq2qjH326EkYr4LWnPRqw6ad7Uj7LnoTJxUA== 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 SJ1PR11MB6227.namprd11.prod.outlook.com (2603:10b6:a03:45a::10) by PH8PR11MB7070.namprd11.prod.outlook.com (2603:10b6:510:216::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5834.9; Sun, 20 Nov 2022 04:30:24 +0000 Received: from SJ1PR11MB6227.namprd11.prod.outlook.com ([fe80::221e:24cf:a864:9986]) by SJ1PR11MB6227.namprd11.prod.outlook.com ([fe80::221e:24cf:a864:9986%4]) with mapi id 15.20.5813.016; Sun, 20 Nov 2022 04:30:23 +0000 From: "Li, Yi" To: "Yao, Jiewen" , "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/DPvyfZXN0Z4HE68Bs4Ea/6LG65Gb6RQgACkvgCAACOtUA== Date: Sun, 20 Nov 2022 04:30:23 +0000 Message-ID: References: <20221119162754.1034-1-yi1.li@intel.com> In-Reply-To: Accept-Language: zh-CN, 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: SJ1PR11MB6227:EE_|PH8PR11MB7070:EE_ x-ms-office365-filtering-correlation-id: e86d4820-3de4-47dd-c974-08dacaaff0eb x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Z42kkLUOA15gFTeRBZ0LwG3a1HadDCdw16T3dDhzR7gZqYZWg8ULrRF8nQFIRt8p3jenbcV4s9Y5mo6sRoqwt2mOpyMk1nb5sGBMzI483HiMBTWlOziNMq4UZoXs/AcpHbYhMNg5b9gAo65goxROllztsXaameuE2UnVWs2jiWWK+HIsWd8khf+fmlD79EcBgyFcltUaLJJizfr+d6vGDaPP0hBLa2bB2KpA889tVc8TadnNNPKlfDPuab5H4lsTlfKAjbmbt8wekBR3ae+/s6Frsq/jo5lrqy64hmfsI/ETZzFUJ8ftEPu/AZV+DQTvx7bHq8tX6vwSU48nETHD63jkiCBC3q3gf3hu8aspGezQR4/u0WXcgFZHmC2esEUs7RkkiJiDEGv8lfa6Q0j0VupRetm7F4I5wuUh0Mv5JlMftOQL9bw3LyLzpowZpQ4McLcdni1ACluG3aOFNPL0g73RbyCOlk6oJ5IFSf7+DV5dv+lPV0MyOclhdQ5eQYDARLRH7mmsJUwBZTVBMlr1UujaskDM5ji3jRQTHGT+M3RAYPeoH3816zhbZEKY0WiqSs+xegV4n1JwfTtZn6wYBfZiYSw72xAEup8zu3MV18lW6vx+KNgTXoTQOEK8iiuz5R0WHdcy07h9gRTbZUGTGc2G+Z/ff+gQ30pwc3VkPZ8giMASMMyA/efKp/+MHt76uFcoJ1FL2G4BscxMWdVXVyjPYJn94jBlc/AkSuQkzBS1ZyXEIOl57jJhuqAWy7sAGa6al4J+S62g/jZzFqmVRsg526A7/QfYBYWnvWsUAbU= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ1PR11MB6227.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(136003)(396003)(346002)(376002)(39860400002)(366004)(451199015)(122000001)(55016003)(38100700002)(33656002)(38070700005)(82960400001)(86362001)(9686003)(76116006)(71200400001)(110136005)(26005)(54906003)(53546011)(7696005)(6506007)(107886003)(316002)(5660300002)(30864003)(83380400001)(2906002)(966005)(66556008)(52536014)(66446008)(186003)(64756008)(66946007)(41300700001)(66476007)(8936002)(478600001)(4326008)(8676002)(21314003)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?B1//abDMj6ARgmn+49lB5eOs4JoEMs09mxblHlg4z8N7FVbkLmEGTVrIPm+K?= =?us-ascii?Q?V0I16+X04WiORyDI4FLT0lHquuMdTg7DeWOwdkTcCAWy4vAuiFg8e6ov4i2h?= =?us-ascii?Q?dL3EevCe79h0twBADljO2wgmb/Utx7T4ycYSspEPqxjunJrd9zZ5IoewqQKj?= =?us-ascii?Q?w4OY2HHQke9qlq1wPNQbyYselBDsj0+REIp/qvfWSSL5BR4quK1Ry677A/rp?= =?us-ascii?Q?7OUb/mhwIVXKWmpFic2ZRe/hmmd1rF+C2bvS7tEtVhyr1nqu4vLzvk/xXGmd?= =?us-ascii?Q?Wl2QfqPDHl/W8R7UgLSg7rClIf8MzQRHVivtSo6fEp7kSgPSIjEKHHqrFATg?= =?us-ascii?Q?bMS3POlRdXsO73NIXD5y6Ogl6cV1YJSyzD7QGuRGPQDJ60PD2Kh0MAJ7Xcog?= =?us-ascii?Q?Ig1hsnsRIUwuf2YTIc5aXAWRwe7hFEtSBkOi4EfAvApBhGeo52BpARswJcPq?= =?us-ascii?Q?V3PgdxBlKDgK1Od+EQqum3fpuxjdnjFtn4jze+6lb8Y2g73Hlf5SwkENTFIy?= =?us-ascii?Q?3VSplGLz8s1ewzKBYWCNc/v9S1fk8zMEPe9KflBLK8Dlxq7Gklu3Nb4m2OIt?= =?us-ascii?Q?G/vIiCUTSTXwrS8V9TxmSbGDaLNCPpvR7kjhnH+3rVIJfTyXJcF+mEertHqt?= =?us-ascii?Q?CqDCxaDJVw239g2Rklj937OBsGootuZ5w2/0BZV88irpCjZBGprd+H6+xeGa?= =?us-ascii?Q?iNhYIXUuJv+uR4RStMXwLaaeh91o0YWPeT4+1miUXXwWjieYTf+/+cF1id76?= =?us-ascii?Q?kVB85A8FSZfTKXa1KHR6bL5Yv1rXWKA0WgxMHDFNfLQo0klw1bCsYXQzIH6F?= =?us-ascii?Q?qL8x8A03aEH6GwSIsfiUa6G6iRUPhT5vFLAwcGPOqHDxVkAAp5iF61QTr+a5?= =?us-ascii?Q?9tVFmYUyR/oAlYdOM4GXx3QwT7/+iHdvso0iLIsmvi3+L3WwI3VFVCQiEMgU?= =?us-ascii?Q?u0fAN3IpiPrAnNR9QyFjkdStLzp5KGt2l9KmyFrFr0Fgl8dTp9S1tE6WxA2p?= =?us-ascii?Q?fxVHYEFiP4D7lQomc+L/ATsAwxTOKVg2OuV2VxE04lzbW53qfBYxmImXZWDr?= =?us-ascii?Q?mCpD3u2CRoIx6CAPVC4jhhRv7peO260bfptx0J9X4QDVqwoCijGXjFIkK4JM?= =?us-ascii?Q?1U0LB6u89GoDdTvCzGHtMoP2JiuYFZb15bZs9ATE+/0IwF0H7Q1j38GPDC6N?= =?us-ascii?Q?1rAiqQTTwpuMz3QtJosxfp8xdAe5CNYqpBq7Njp7pyO1weyGaLf9mc033AvX?= =?us-ascii?Q?L333M+ZT4gh8phtkRfHuct4Lee4rWGfHlXOLGYbYeOGpfwUxxgNQtnS/LS+p?= =?us-ascii?Q?baGO44NckHxMkR2NiDZQjxWYKjXR4h6PXrHHeDaW9ApUs7tgoIzxjl5m3dji?= =?us-ascii?Q?R5X9daLsGptPQrqrO2Qci5Rwx63HqJzT96kzCMi9iWJiWtFDecRbpsAOSXnY?= =?us-ascii?Q?fVdwQj4uVWFZr7oeh6cAZK8b5rqx9fBPYE6wo2rcUV6Y5OKZ+poXOf/TIHkB?= =?us-ascii?Q?n7DVlHeRselNJqaYcR+JyvwmcMi7l5tkqN0EHpTaBAvx725Rqzv+1AOmRopx?= =?us-ascii?Q?L5n00ehUnXMtzksmTAM=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SJ1PR11MB6227.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e86d4820-3de4-47dd-c974-08dacaaff0eb X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Nov 2022 04:30:23.6262 (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: mff+ew8NHZ4YE4alh/Amcasck2tQQg1dILLqPRsCRtzbrsYZXdOpNe8keOw6mW3CK2Mt9LB7X7jWQQnHRevlMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR11MB7070 Return-Path: yi1.li@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Jiewen, Oh, I didn't realize we had this macro, maybe we could use it to eliminate = floating point actions and upstream to openssl. If it can be upstreamed, then we don't need these workarounds, I will try t= o do these things, thank you. -----Original Message----- From: Yao, Jiewen =20 Sent: Sunday, November 20, 2022 10:19 AM 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 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=20 > ; Lu, Xiaoyu1 ; Jiang,=20 > Guomin > Subject: RE: [PATCH] CryptoPkg: Add b_print.c which removed floating-=20 > 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=20 > 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,=20 > 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,=20 > + &uremainder); > 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=20 > 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=20 > 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,=20 > which 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 ;=20 > Wang, Jian J ; Lu, Xiaoyu1=20 > ; Jiang, Guomin > Subject: [PATCH] CryptoPkg: Add b_print.c which removed floating-point=20 > 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=20 > time_t to ASN1_time. > Currently edk2 code just give it a NULL implement in CrtWrapper.c, so=20 > 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=20 > 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=20 > 100644 CryptoPkg/Library/OpensslLib/b_print.c >=20 > diff --git a/CryptoPkg/CryptoPkg.ci.yaml b/CryptoPkg/CryptoPkg.ci.yaml=20 > 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=20 > returns > -1 as error. > - // Otherwise, the consumer may think that the buf is valid and=20 > parse the 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=20 > 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=20 > 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=20 > +use > + * this file except in compliance with the License. You can obtain a=20 > +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=20 > + > + * It may be used for any purpose as long as this notice remains=20 > +intact > + * on all source code distributions. > + */ > + > +static int fmtstr(char **, char **, size_t *, size_t *, > + const char *, int, int, int); static int=20 > +fmtint(char **, char **, size_t *, size_t *, > + int64_t, int, int, int, int); static int=20 > +doapr_outch(char **, char **, size_t *, size_t *, int); static int=20 > +_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=20 > +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=20 > + filled > 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=20 > +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=20 > +it's > + * closely related to BIO_printf, and we need *some* name prefix ... > +(XXX the > + * function should be renamed, but to what?) */ int=20 > +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