OK, abandoning this patch set. The BZ can stay open as we will still have to migrate the existing files to EVP eventually.
-- Christopher Zurcher > -----Original Message----- > From: Yao, Jiewen <jiewen....@intel.com> > Sent: Wednesday, September 16, 2020 18:34 > To: Zurcher, Christopher J <christopher.j.zurc...@intel.com>; Laszlo Ersek > <ler...@redhat.com>; devel@edk2.groups.io > Cc: Wang, Jian J <jian.j.w...@intel.com>; Lu, XiaoyuX <xiaoyux...@intel.com> > Subject: RE: [edk2-devel] [PATCH v3 1/3] CryptoPkg/BaseCryptLib: Add EVP > (Envelope) Digest interface > > Thanks to ask this question Christopher. > > When we create the CryptoPkg, our goal is to pick openssl as implementation > choice. We don’t want to mandate any > EDKII consumer use openssl. > > The EDKII consumer shall have freedom to choose whatever crypto library they > want to use. Even Intel IPP and mebdTLS > are options. A vendor may choose a GPL wolfssl, or vendor proprietary close > source implementation. We choose openssl > just because it is the BSD license and it is used widely when we make > decision. > > That is why we spend effort to design BaseCryptoLib API to abstract the > crypto action, instead of calling openssl > function directly in our code. > Whenever we add new API, we need evaluate if it is applicable for any other > crypto implantation and have negative > impact. > > That assumption that EDKII must link openssl is NOT our original intent. > Feel free to drop the patch or reject the Bugzilla, if you want. > > Thank you > Yao Jiewen > > > -----Original Message----- > > From: Zurcher, Christopher J <christopher.j.zurc...@intel.com> > > Sent: Thursday, September 17, 2020 9:21 AM > > To: Laszlo Ersek <ler...@redhat.com>; Yao, Jiewen <jiewen....@intel.com>; > > devel@edk2.groups.io > > Cc: Wang, Jian J <jian.j.w...@intel.com>; Lu, XiaoyuX <xiaoyux...@intel.com> > > Subject: RE: [edk2-devel] [PATCH v3 1/3] CryptoPkg/BaseCryptLib: Add EVP > > (Envelope) Digest interface > > > > Jiewen, > > > > This patch set assumes that EDK2 is linked with OpenSSL for the foreseeable > > future. The end goal would be to move all applicable Crypto access to the > > EVP > > interface and remove the individual modules we maintain for each algorithm. > > The primary benefit here is reducing complexity and code duplication. > > Without > > this end goal, this patch set will not be particularly useful. > > > > If the design goal of BaseCryptLib is to allow OpenSSL to be replaced by > > other > > crypto providers, I should abandon this patch set, and we can save the EVP > > transition for when moving to OpenSSL 3 becomes mandatory. At that time, the > > CryptX.c family can be modified to call EVP functions. > > (This could even be done transparently, by returning UINTN from > > GetContextSize > > and using the user-supplied "context" to store the OpenSSL-supplied context > > pointer.) > > Delaying EVP adoption in this case would also allow more time for platforms > > to > > adopt the Crypto Services model, which should help offset the size impact. > > > > Please let me know which path should be taken. > > > > Thanks, > > Christopher Zurcher > > > > > -----Original Message----- > > > From: Laszlo Ersek <ler...@redhat.com> > > > Sent: Wednesday, September 16, 2020 09:05 > > > To: Yao, Jiewen <jiewen....@intel.com>; devel@edk2.groups.io; Zurcher, > > Christopher J > > > <christopher.j.zurc...@intel.com> > > > Cc: Wang, Jian J <jian.j.w...@intel.com>; Lu, XiaoyuX > > > <xiaoyux...@intel.com> > > > Subject: Re: [edk2-devel] [PATCH v3 1/3] CryptoPkg/BaseCryptLib: Add EVP > > (Envelope) Digest interface > > > > > > On 09/16/20 16:17, Yao, Jiewen wrote: > > > > Thank you Laszlo. > > > > You forced me to read the code again and more carefully. :-) > > > > > > > > I believe I understand why you use NULL to free the context now - to > > > > support > > error path. > > > > > > > > First, I did have some new thought for EVP API. Let’s consider 3 cases, > > > > 1) > > Hash all data one time, 2) Hash update > > > data multiple times, 3) Error during update. > > > > > > > > A. In current design, the API sequence is: > > > > 1) EvpMdHashAll (Digest) > > > > 2) EvpMdInit, EvpMdUpdate, EvpMdUpdate, ... , EvpMdFinal (Digest) > > > > 3) EvpMdInit, EvpMdUpdate->ERROR, EvpMdFinal (NULL) > > > > > > > > B. We can auto free context in EvpMdUpdate in error path - the API > > sequence is: > > > > 1) EvpMdHashAll (Digest) > > > > 2) EvpMdInit, EvpMdUpdate, EvpMdUpdate, ... , EvpMdFinal (Digest) > > > > 3) EvpMdInit, EvpMdUpdate->ERROR > > > > > > I don't like "B" because in the loop body where you call EvpMdUpdate(), > > > you may encounter an error from a different source than EvpMdUpdate() > > > itself. For example, you may be reading data from the network or a disk > > > file. If fetching the next chunk fails, we'd still want to clean up the > > > EVP MD context. Therefore, if EvpMdUpdate() would itself invalidate the > > > context, if it failed, then that would *complicate* the error path. (= > > > Clean up the context after the loop body *only* if something different > > > from EvpMdUpdate() failed.) > > > > > > > > > > > C: We can use New/Free style - similar to HMAC > > > > 1) EvpMdHashAll (Digest) > > > > 2) EvpMdNew, EvpMdInit, EvpMdUpdate, EvpMdUpdate, ... , EvpMdFinal > > (Digest), EvpMdFree > > > > 3) EvpMdNew, EvpMdInit, EvpMdUpdate->ERROR, EvpMdFree > > > > > > Yes, this was the first pattern, the one that caused me to say "please > > > don't do this". In this pattern, the context may exist between "New" and > > > "Init", and also between "Final" and "Free". Those two states are > > > useless and only good for causing confusion. > > > > > > For example, are you allowed to Duplicate a context in those states? > > > It's best to prevent even the *asking* of that question. > > > > > > > > > > > I checked below APIs: > > > > 1) openssl (EVP_MD_CTX_new, EVP_DigestInit_ex, EVP_DigestUpdate, > > EVP_DigestFinal_ex, EVP_MD_CTX_free) > > > > 2) mbedtls (mbedtls_sha256_init, mbedtls_sha256_starts_ret, > > mbedtls_sha256_update_ret, mbedtls_sha256_finish_ret, > > > mbedtls_sha256_free) > > > > 3) BaseCryptoLib HMAC (HmacSha256New, HmacSha256SetKey, > > HmacSha256Update, HmacSha256Final, HmacSha256Free) > > > > > > > > All APIs include free function to free the context, I don’t think it is > > > > a bad idea > > to have EvpMdFree() API. > > > > I would like to propose option - C. > > > > > > - I cannot comment on mbedtls (2). > > > > > > - I think the current BaseCryptLib HMAC APIs (3) are not great, and we > > > should use this opportunity to improve upon them. > > > > > > - Regarding openssl (1), as I understand it, the situation is different > > > from edk2. In OpenSSL, EVP_MD_CTX is *not* an opaque type (expressed in > > > C language terms, it is not an "incomplete" type, but a "complete" > > > type). Therefore, an expression such as sizeof(EVP_MD_CTX) works. > > > > > > The consequence is that OpenSSL code itself can use the following style: > > > > > > void func(void) > > > { > > > EVP_MD_CTX ctx; > > > > > > EVP_DigestInit_ex(&ctx, ...); > > > ... > > > EVP_DigestFinal_ex(&ctx, ...) > > > } > > > > > > In other words, OpenSSL-native code is permitted to know the internals > > > of EVP_MD_CTX, therefore the OpenSSL-internal code may allocate > > > EVP_MD_CTX with means that are *different* from EVP_MD_CTX_new() and > > > EVP_MD_CTX_free(). > > > > > > The caller of (Init, Final) may use (New, Free) for memory management, > > > or may use something completely different (for example, local variables). > > > > > > Therefore, offering the (Init, Final) APIs separately from (New, Free) > > > is meaningful. > > > > > > But the situation in edk2 -- or any other OpenSSL *consumer* -- is > > > different. In edk2, EVP_MD_CTX is an opaque type -- in C language terms: > > > an "incomplete" type. OpenSSL deliberately hides the internals of > > > EVP_MD_CTX. > > > > > > See "CryptoPkg/Library/OpensslLib/openssl/include/openssl/ossl_typ.h": > > > > > > > typedef struct evp_md_ctx_st EVP_MD_CTX; > > > > > > and the "evp_md_ctx_st" structure type is only defined in > > > "CryptoPkg/Library/OpensslLib/openssl/crypto/evp/evp_local.h", whose > > > contents -- I think! -- OpenSSL client code cannot, or *should not*, > > > refer to. > > > > > > This means that OpenSSL consumer code can *only* rely on > > > EVP_MD_CTX_new() and EVP_MD_CTX_free(), for allocating and releasing the > > > context, respectively. "sizeof(EVP_MD_CTX)" is not permitted, and > > > defining a local or global variable of type EVP_MD_CTX is also not valid. > > > > > > This means that the only reason for separating (Init, Final) from (New, > > > Free) falls away, in OpenSSL consumer code. In OpenSSL consumer code, > > > there is no reason to keep *both* pairs of APIs. > > > > > > > > > Please note that, this (very prudent) information hiding / encapsulation > > > in OpenSSL used to be violated by edk2 in the past, intentionally. > > > That's what the HmacXxxGetContextSize() APIs were about -- those APIs > > > forcefully leaked the context sizes to client code, so that client code > > > in edk2 could perform its own allocation. > > > > > > But in <https://bugzilla.tianocore.org/show_bug.cgi?id=1792>, we finally > > > eliminated HmacXxxGetContextSize(). As a part of that, we also > > > simplified the HMAC API -- note that Init was replaced by SetKey. And > > > because we were reworking an existent API, I didn't propose very > > > intrusive changes -- I didn't propose fusing Final and Free, for example. > > > > > > Now, the EVP MD APIs are just being introduced to edk2. So we have a > > > chance at getting them right, and making them minimal. > > > > > > > Second, I believe EVP is just something in openssl. It does not mean > > > > that we > > *have to* design API to follow > > > openssl. > > > > After rethink the size impact, I do have concern to merge all Hash > > implementation together in one function. > > > > It might means nothing if the crypto library is based upon openssl. > > > > But if the cryptolib implementation is based upon other crypto, such as > > > > Intel > > IPP > > > > > (https://github.com/slimbootloader/slimbootloader/tree/master/BootloaderCo > > mmonPkg/Library/IppCryptoLib) or mbedTls > > > (https://github.com/jyao1/edk2/tree/DeviceSecurity/CryptoMbedTlsPkg), then > > we can NOT get size benefit by separating > > > the hash algorithm. > > > > > > > > > > > > I would like to propose separate EvpMdxxx. > > > > EvpMdNew -> Sha256New, Sha384New > > > > EvpMdInit -> Sha256Init, Sha384Init > > > > EvpMdUpdate -> Sha256Update, Sha384Update > > > > EvpMdFinal -> Sha256Final, Sha384Final > > > > EvpMdFree -> Sha256Free, Sha384Free > > > > > > I have no comment on this. > > > > > > > We can do similar thing with Hmac, to deprecate Sha256GetContextSize() > > API, > > > > > > Yes, good idea. > > > > > > > and replace caller with Sha256New() / Sha384Free() > > > > > > Indeed. > > > > > > But then -- there's no reason left for keeping (New, Free) separate from > > > (Init, Final). > > > > > > Thanks > > > Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#65347): https://edk2.groups.io/g/devel/message/65347 Mute This Topic: https://groups.io/mt/76878643/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-