From: "Long, Qin" <qin.long@intel.com>
To: "Zhang, Lubo" <lubo.zhang@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Zhang, Chao B" <chao.b.zhang@intel.com>,
"Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [patch] SecurityPkg: enhance secure boot Config Dxe & Time Based AuthVariable.
Date: Fri, 17 Feb 2017 07:42:53 +0000 [thread overview]
Message-ID: <BF2CCE9263284D428840004653A28B6E53F60F58@SHSMSX103.ccr.corp.intel.com> (raw)
In-Reply-To: <1487315080-39500-1-git-send-email-lubo.zhang@intel.com>
Hi, Lubo,
Please use "mSha256OidValue", instead of "mHash256OidValue", to identify the SHA-256 cipher name.
Reviewed-by: Long Qin <qin.long@intel.com>
Best Regards & Thanks,
LONG, Qin
> -----Original Message-----
> From: Zhang, Lubo
> Sent: Thursday, February 16, 2017 11:05 PM
> To: edk2-devel@lists.01.org
> Cc: Zhang, Chao B <chao.b.zhang@intel.com>; Long, Qin
> <qin.long@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>
> Subject: [patch] SecurityPkg: enhance secure boot Config Dxe & Time Based
> AuthVariable.
>
> V3: code clean up
>
> 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 <lubo.zhang@intel.com>
> Cc: Chao Zhang <chao.b.zhang@intel.com>
> Cc: Long Qin <qin.long@intel.com>
> Cc: Yao Jiewen <jiewen.yao@intel.com>
> ---
> SecurityPkg/Library/AuthVariableLib/AuthService.c | 27
> +++++++++++++++++++++-
> .../Library/AuthVariableLib/AuthServiceInternal.h | 4 +++-
> .../SecureBootConfigDxe/SecureBootConfigImpl.c | 14 ++++-------
> .../SecureBootConfigDxe/SecureBootConfigImpl.h | 8 ++-----
> 4 files changed, 35 insertions(+), 18 deletions(-)
>
> diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c
> b/SecurityPkg/Library/AuthVariableLib/AuthService.c
> index b013d42..1cdfadc 100644
> --- a/SecurityPkg/Library/AuthVariableLib/AuthService.c
> +++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c
> @@ -16,11 +16,11 @@
>
> VerifyTimeBasedPayloadAndUpdate() and VerifyCounterBasedPayload()
> are sub function to do verification.
> They will do basic validation for authentication data structure, then call
> crypto library
> to verify the signature.
>
> -Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
> 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
>
> @@ -34,10 +34,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> //
> // Public Exponent of RSA Key.
> //
> CONST UINT8 mRsaE[] = { 0x01, 0x00, 0x01 };
>
> +CONST UINT8 mHash256OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
> +0x04, 0x02, 0x01 };
> +
> //
> // Requirement for different signature type which have been defined in
> UEFI spec.
> // These data are used to perform SignatureList format check while setting
> PK/KEK variable.
> //
> EFI_SIGNATURE_ITEM mSupportSigItem[] = { @@ -2243,10 +2245,33 @@
> VerifyTimeBasedPayload (
> //
> SigData = CertData->AuthInfo.CertData;
> SigDataSize = CertData->AuthInfo.Hdr.dwLength - (UINT32) (OFFSET_OF
> (WIN_CERTIFICATE_UEFI_GUID, CertData));
>
> //
> + // SignedData.digestAlgorithms shall contain the digest algorithm
> + used when preparing the // signature. Only a digest algorithm of SHA-256
> is accepted.
> + //
> + // According to PKCS#7 Definition:
> + // SignedData ::= SEQUENCE {
> + // version Version,
> + // digestAlgorithms DigestAlgorithmIdentifiers,
> + // contentInfo ContentInfo,
> + // .... }
> + // The DigestAlgorithmIdentifiers can be used to determine the hash
> algorithm
> + // in VARIABLE_AUTHENTICATION_2 descriptor.
> + // This field has the fixed offset (+13) and be calculated based on two
> bytes of length encoding.
> + //
> + if ((Attributes &
> EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {
> + if (SigDataSize >= (13 + sizeof (mHash256OidValue))) {
> + if (((*(SigData + 1) & TWO_BYTE_ENCODE) != TWO_BYTE_ENCODE) ||
> + (CompareMem (SigData + 13, &mHash256OidValue, sizeof
> (mHash256OidValue)) != 0)) {
> + return EFI_SECURITY_VIOLATION;
> + }
> + }
> + }
> +
> + //
> // Find out the new data payload which follows Pkcs7 SignedData directly.
> //
> PayloadPtr = SigData + SigDataSize;
> PayloadSize = DataSize - OFFSET_OF_AUTHINFO2_CERT_DATA - (UINTN)
> SigDataSize;
>
> diff --git a/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h
> b/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h
> index e7c4bf0..e9b7cf3 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
> metadata 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 the
> behavior is undefined.
>
> -Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
> 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
>
> @@ -35,10 +35,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> #include <Library/PlatformSecureLib.h>
>
> #include <Guid/AuthenticatedVariableFormat.h>
> #include <Guid/ImageAuthentication.h>
>
> +#define TWO_BYTE_ENCODE 0x82
> +
> ///
> /// 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/SecureBootCon
> figImpl.c
> b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon
> figImpl.c
> index 0d96185..6f58729 100644
> ---
> a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon
> figImpl.c
> +++
> b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCo
> +++ nfigImpl.c
> @@ -1,9 +1,9 @@
> /** @file
> HII Config Access protocol implementation of SecureBoot configuration
> module.
>
> -Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>
> 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
>
> @@ -61,11 +61,10 @@ UINT8 mHashOidValue[] = {
> 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, // OBJ_sha384
> 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, // OBJ_sha512
> };
>
> HASH_TABLE mHash[] = {
> - { 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 (
>
> HashCtx = NULL;
> SectionHeader = NULL;
> Status = FALSE;
>
> - if ((HashAlg != HASHALG_SHA1) && (HashAlg != HASHALG_SHA256)) {
> + if (HashAlg != HASHALG_SHA256) {
> return FALSE;
> }
>
> //
> // Initialize context of hash.
> //
> ZeroMem (mImageDigest, MAX_DIGEST_SIZE);
>
> - if (HashAlg == HASHALG_SHA1) {
> - mImageDigestSize = SHA1_DIGEST_SIZE;
> - mCertType = gEfiCertSha1Guid;
> - } else if (HashAlg == HASHALG_SHA256) {
> - mImageDigestSize = SHA256_DIGEST_SIZE;
> - mCertType = gEfiCertSha256Guid;
> - }
> + mImageDigestSize = SHA256_DIGEST_SIZE;
> + mCertType = gEfiCertSha256Guid;
>
> CtxSize = mHash[HashAlg].GetContextSize();
>
> HashCtx = AllocatePool (CtxSize);
> ASSERT (HashCtx != NULL);
> diff --git
> a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon
> figImpl.h
> b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon
> figImpl.h
> index 5055a9e..bea9470 100644
> ---
> a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon
> figImpl.h
> +++
> b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCo
> +++ nfigImpl.h
> @@ -1,10 +1,10 @@
> /** @file
> The header file of HII Config Access protocol implementation of SecureBoot
> configuration module.
>
> -Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>
> 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
>
> @@ -65,14 +65,11 @@ extern EFI_IFR_GUID_LABEL *mStartLabel;
> extern EFI_IFR_GUID_LABEL *mEndLabel;
>
> #define MAX_CHAR 480
> #define TWO_BYTE_ENCODE 0x82
>
> -//
> -// 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
>
> //
> // 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
> --
> 1.9.5.msysgit.1
next prev parent reply other threads:[~2017-02-17 7:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-17 7:04 [patch] SecurityPkg: enhance secure boot Config Dxe & Time Based AuthVariable Zhang Lubo
2017-02-17 7:42 ` Long, Qin [this message]
2017-02-17 8:51 ` Zhang, Chao B
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BF2CCE9263284D428840004653A28B6E53F60F58@SHSMSX103.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox