From nobody Wed Apr 24 09:49:18 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1487041597157473.8878420874928; Mon, 13 Feb 2017 19:06:37 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id B808D81FBC; Mon, 13 Feb 2017 19:06:35 -0800 (PST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 6750C81EB8 for ; Mon, 13 Feb 2017 19:06:34 -0800 (PST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga105.fm.intel.com with ESMTP; 13 Feb 2017 19:06:34 -0800 Received: from shwdeopenpsi116.ccr.corp.intel.com ([10.239.9.7]) by FMSMGA003.fm.intel.com with ESMTP; 13 Feb 2017 19:06:32 -0800 X-Original-To: edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,159,1484035200"; d="scan'208";a="820581576" From: Zhang Lubo To: edk2-devel@lists.01.org Date: Tue, 14 Feb 2017 11:06:21 +0800 Message-Id: <1487041581-44044-1-git-send-email-lubo.zhang@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.1 Subject: [edk2] [PATCH V2] SecurityPkg: enhance secure boot Config Dxe & Time Based AuthVariable. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yao Jiewen , Chao Zhang , Long Qin MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" V2: Update commit log. prohibit Image SHA-1 hash option in SecureBootConfigDxe. Timebased Auth Variable driver should ensure AuthAlgorithm is SHA256 before further verification Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo Cc: Chao Zhang Cc: Long Qin Cc: Yao Jiewen --- SecurityPkg/Library/AuthVariableLib/AuthService.c | 27 ++++++++++++++++++= +++- .../Library/AuthVariableLib/AuthServiceInternal.h | 5 +++- .../SecureBootConfigDxe/SecureBootConfigImpl.c | 14 ++++------- .../SecureBootConfigDxe/SecureBootConfigImpl.h | 8 ++----- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c b/SecurityPk= g/Library/AuthVariableLib/AuthService.c index b013d42..75d2290 100644 --- a/SecurityPkg/Library/AuthVariableLib/AuthService.c +++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c @@ -16,11 +16,11 @@ =20 VerifyTimeBasedPayloadAndUpdate() and VerifyCounterBasedPayload() are su= b function to do verification. They will do basic validation for authentication data structure, then ca= ll crypto library to verify the signature. =20 -Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD = License which accompanies this distribution. The full text of the license may be = found at http://opensource.org/licenses/bsd-license.php =20 @@ -34,10 +34,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. // // Public Exponent of RSA Key. // CONST UINT8 mRsaE[] =3D { 0x01, 0x00, 0x01 }; =20 +CONST UINT8 mHash256OidValue[] =3D { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0= x04, 0x02, 0x01 }; + // // Requirement for different signature type which have been defined in UEF= I spec. // These data are used to perform SignatureList format check while setting= PK/KEK variable. // EFI_SIGNATURE_ITEM mSupportSigItem[] =3D { @@ -2243,10 +2245,33 @@ VerifyTimeBasedPayload ( // SigData =3D CertData->AuthInfo.CertData; SigDataSize =3D CertData->AuthInfo.Hdr.dwLength - (UINT32) (OFFSET_OF (W= IN_CERTIFICATE_UEFI_GUID, CertData)); =20 // + // SignedData.digestAlgorithms shall contain the digest algorithm used w= hen preparing the + // signature. Only a digest algorithm of SHA-256 is accepted. + // + // According to PKCS#7 Definition: + // SignedData ::=3D SEQUENCE { + // version Version, + // digestAlgorithms DigestAlgorithmIdentifiers, + // contentInfo ContentInfo, + // .... } + // The DigestAlgorithmIdentifiers can be used to determine the hash a= lgorithm=20 + // in VARIABLE_AUTHENTICATION_2 descriptor. + // This field has the fixed offset (+13) and be calculated based on t= wo bytes of length encoding. + // + if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != =3D 0) { + if (SigDataSize >=3D (13 + Hash256OidLength)) { + if (((*(SigData + 1) & TWO_BYTE_ENCODE) !=3D TWO_BYTE_ENCODE) ||=20 + (CompareMem (SigData + 13, &mHash256OidValue, Hash256OidLength)= !=3D 0)) { + return EFI_SECURITY_VIOLATION; + } + } + } + + // // Find out the new data payload which follows Pkcs7 SignedData directly. // PayloadPtr =3D SigData + SigDataSize; PayloadSize =3D DataSize - OFFSET_OF_AUTHINFO2_CERT_DATA - (UINTN) SigDa= taSize; =20 diff --git a/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h b/Se= curityPkg/Library/AuthVariableLib/AuthServiceInternal.h index e7c4bf0..f1cf591 100644 --- a/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h +++ b/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h @@ -10,11 +10,11 @@ The whole SMM authentication variable design relies on the integrity = of flash part and SMM. which is assumed to be protected by platform. All variable code and met= adata in flash/SMM Memory may not be modified without authorization. If platform fails to protect = these resources, the authentication service provided in this driver will be broken, and t= he behavior is undefined. =20 -Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD = License which accompanies this distribution. The full text of the license may be = found at http://opensource.org/licenses/bsd-license.php =20 @@ -35,10 +35,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #include =20 #include #include =20 +#define TWO_BYTE_ENCODE 0x82 +#define Hash256OidLength 9 + /// /// Struct to record signature requirement defined by UEFI spec. /// For SigHeaderSize and SigDataSize, ((UINT32) ~0) means NO exact length= requirement for this field. /// typedef struct { diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBo= otConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/Secu= reBootConfigImpl.c index 0d96185..6f58729 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfi= gImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfi= gImpl.c @@ -1,9 +1,9 @@ /** @file HII Config Access protocol implementation of SecureBoot configuration mo= dule. =20 -Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD = License which accompanies this distribution. The full text of the license may be = found at http://opensource.org/licenses/bsd-license.php =20 @@ -61,11 +61,10 @@ UINT8 mHashOidValue[] =3D { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, // OBJ_sha384 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, // OBJ_sha512 }; =20 HASH_TABLE mHash[] =3D { - { L"SHA1", 20, &mHashOidValue[8], 5, Sha1GetContextSize, Sha1Init, = Sha1Update, Sha1Final }, { L"SHA224", 28, &mHashOidValue[13], 9, NULL, NULL, = NULL, NULL }, { L"SHA256", 32, &mHashOidValue[22], 9, Sha256GetContextSize, Sha256Init= , Sha256Update, Sha256Final}, { L"SHA384", 48, &mHashOidValue[31], 9, Sha384GetContextSize, Sha384Init= , Sha384Update, Sha384Final}, { L"SHA512", 64, &mHashOidValue[40], 9, Sha512GetContextSize, Sha512Init= , Sha512Update, Sha512Final} }; @@ -1784,26 +1783,21 @@ HashPeImage ( =20 HashCtx =3D NULL; SectionHeader =3D NULL; Status =3D FALSE; =20 - if ((HashAlg !=3D HASHALG_SHA1) && (HashAlg !=3D HASHALG_SHA256)) { + if (HashAlg !=3D HASHALG_SHA256) { return FALSE; } =20 // // Initialize context of hash. // ZeroMem (mImageDigest, MAX_DIGEST_SIZE); =20 - if (HashAlg =3D=3D HASHALG_SHA1) { - mImageDigestSize =3D SHA1_DIGEST_SIZE; - mCertType =3D gEfiCertSha1Guid; - } else if (HashAlg =3D=3D HASHALG_SHA256) { - mImageDigestSize =3D SHA256_DIGEST_SIZE; - mCertType =3D gEfiCertSha256Guid; - } + mImageDigestSize =3D SHA256_DIGEST_SIZE; + mCertType =3D gEfiCertSha256Guid; =20 CtxSize =3D mHash[HashAlg].GetContextSize(); =20 HashCtx =3D AllocatePool (CtxSize); ASSERT (HashCtx !=3D NULL); diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBo= otConfigImpl.h b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/Secu= reBootConfigImpl.h index 5055a9e..bea9470 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfi= gImpl.h +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfi= gImpl.h @@ -1,10 +1,10 @@ /** @file The header file of HII Config Access protocol implementation of SecureBo= ot configuration module. =20 -Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD = License which accompanies this distribution. The full text of the license may be = found at http://opensource.org/licenses/bsd-license.php =20 @@ -65,14 +65,11 @@ extern EFI_IFR_GUID_LABEL *mStartLabel; extern EFI_IFR_GUID_LABEL *mEndLabel; =20 #define MAX_CHAR 480 #define TWO_BYTE_ENCODE 0x82 =20 -// -// SHA-1 digest size in bytes. -// -#define SHA1_DIGEST_SIZE 20 + // // SHA-256 digest size in bytes // #define SHA256_DIGEST_SIZE 32 // @@ -92,11 +89,10 @@ extern EFI_IFR_GUID_LABEL *mEndLabel; #define WIN_CERT_UEFI_RSA2048_SIZE 256 =20 // // Support hash types // -#define HASHALG_SHA1 0x00000000 #define HASHALG_SHA224 0x00000001 #define HASHALG_SHA256 0x00000002 #define HASHALG_SHA384 0x00000003 #define HASHALG_SHA512 0x00000004 #define HASHALG_RAW 0x00000005 --=20 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel