CryptoPkg/BaseCryptLib: Add X509ConstructCertificateStackV().

https://bugzilla.tianocore.org/show_bug.cgi?id=2420

Add X509ConstructCertificateStackV() to BaseCryptLib that is
identical in behavior to X509ConstructCertificateStack(), but
it takes a VA_LIST parameter for the variable argument list.

The VA_LIST form of this function is required for BaseCryptLib
functions to be wrapped in a Protocol/PPI.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
This commit is contained in:
Michael D Kinney 2019-11-20 17:14:16 -08:00 committed by mergify[bot]
parent 322ac05f8b
commit 668621362f
4 changed files with 128 additions and 12 deletions

View File

@ -2371,6 +2371,32 @@ X509ConstructCertificate (
OUT UINT8 **SingleX509Cert OUT UINT8 **SingleX509Cert
); );
/**
Construct a X509 stack object from a list of DER-encoded certificate data.
If X509Stack is NULL, then return FALSE.
If this interface is not supported, then return FALSE.
@param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object.
On output, pointer to the X509 stack object with new
inserted X509 certificate.
@param[in] Args VA_LIST marker for the variable argument list.
A list of DER-encoded single certificate data followed
by certificate size. A NULL terminates the list. The
pairs are the arguments to X509ConstructCertificate().
@retval TRUE The X509 stack construction succeeded.
@retval FALSE The construction operation failed.
@retval FALSE This interface is not supported.
**/
BOOLEAN
EFIAPI
X509ConstructCertificateStackV (
IN OUT UINT8 **X509Stack,
IN VA_LIST Args
);
/** /**
Construct a X509 stack object from a list of DER-encoded certificate data. Construct a X509 stack object from a list of DER-encoded certificate data.

View File

@ -1,7 +1,7 @@
/** @file /** @file
X.509 Certificate Handler Wrapper Implementation over OpenSSL. X.509 Certificate Handler Wrapper Implementation over OpenSSL.
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -60,23 +60,26 @@ X509ConstructCertificate (
Construct a X509 stack object from a list of DER-encoded certificate data. Construct a X509 stack object from a list of DER-encoded certificate data.
If X509Stack is NULL, then return FALSE. If X509Stack is NULL, then return FALSE.
If this interface is not supported, then return FALSE.
@param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object. @param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object.
On output, pointer to the X509 stack object with new On output, pointer to the X509 stack object with new
inserted X509 certificate. inserted X509 certificate.
@param ... A list of DER-encoded single certificate data followed @param[in] Args VA_LIST marker for the variable argument list.
A list of DER-encoded single certificate data followed
by certificate size. A NULL terminates the list. The by certificate size. A NULL terminates the list. The
pairs are the arguments to X509ConstructCertificate(). pairs are the arguments to X509ConstructCertificate().
@retval TRUE The X509 stack construction succeeded. @retval TRUE The X509 stack construction succeeded.
@retval FALSE The construction operation failed. @retval FALSE The construction operation failed.
@retval FALSE This interface is not supported.
**/ **/
BOOLEAN BOOLEAN
EFIAPI EFIAPI
X509ConstructCertificateStack ( X509ConstructCertificateStackV (
IN OUT UINT8 **X509Stack, IN OUT UINT8 **X509Stack,
... IN VA_LIST Args
) )
{ {
UINT8 *Cert; UINT8 *Cert;
@ -84,7 +87,6 @@ X509ConstructCertificateStack (
X509 *X509Cert; X509 *X509Cert;
STACK_OF(X509) *CertStack; STACK_OF(X509) *CertStack;
BOOLEAN Status; BOOLEAN Status;
VA_LIST Args;
UINTN Index; UINTN Index;
// //
@ -107,8 +109,6 @@ X509ConstructCertificateStack (
} }
} }
VA_START (Args, X509Stack);
for (Index = 0; ; Index++) { for (Index = 0; ; Index++) {
// //
// If Cert is NULL, then it is the end of the list. // If Cert is NULL, then it is the end of the list.
@ -145,8 +145,6 @@ X509ConstructCertificateStack (
sk_X509_push (CertStack, X509Cert); sk_X509_push (CertStack, X509Cert);
} }
VA_END (Args);
if (!Status) { if (!Status) {
sk_X509_pop_free (CertStack, X509_free); sk_X509_pop_free (CertStack, X509_free);
} else { } else {
@ -156,6 +154,38 @@ X509ConstructCertificateStack (
return Status; return Status;
} }
/**
Construct a X509 stack object from a list of DER-encoded certificate data.
If X509Stack is NULL, then return FALSE.
@param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object.
On output, pointer to the X509 stack object with new
inserted X509 certificate.
@param ... A list of DER-encoded single certificate data followed
by certificate size. A NULL terminates the list. The
pairs are the arguments to X509ConstructCertificate().
@retval TRUE The X509 stack construction succeeded.
@retval FALSE The construction operation failed.
**/
BOOLEAN
EFIAPI
X509ConstructCertificateStack (
IN OUT UINT8 **X509Stack,
...
)
{
VA_LIST Args;
BOOLEAN Result;
VA_START (Args, X509Stack);
Result = X509ConstructCertificateStackV (X509Stack, Args);
VA_END (Args);
return Result;
}
/** /**
Release the specified X509 object. Release the specified X509 object.

View File

@ -2,7 +2,7 @@
X.509 Certificate Handler Wrapper Implementation which does not provide X.509 Certificate Handler Wrapper Implementation which does not provide
real capabilities. real capabilities.
Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -33,6 +33,36 @@ X509ConstructCertificate (
return FALSE; return FALSE;
} }
/**
Construct a X509 stack object from a list of DER-encoded certificate data.
If X509Stack is NULL, then return FALSE.
If this interface is not supported, then return FALSE.
@param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object.
On output, pointer to the X509 stack object with new
inserted X509 certificate.
@param[in] Args VA_LIST marker for the variable argument list.
A list of DER-encoded single certificate data followed
by certificate size. A NULL terminates the list. The
pairs are the arguments to X509ConstructCertificate().
@retval TRUE The X509 stack construction succeeded.
@retval FALSE The construction operation failed.
@retval FALSE This interface is not supported.
**/
BOOLEAN
EFIAPI
X509ConstructCertificateStackV (
IN OUT UINT8 **X509Stack,
IN VA_LIST Args
)
{
ASSERT (FALSE);
return FALSE;
}
/** /**
Construct a X509 stack object from a list of DER-encoded certificate data. Construct a X509 stack object from a list of DER-encoded certificate data.

View File

@ -2,7 +2,7 @@
X.509 Certificate Handler Wrapper Implementation which does not provide X.509 Certificate Handler Wrapper Implementation which does not provide
real capabilities. real capabilities.
Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -33,6 +33,36 @@ X509ConstructCertificate (
return FALSE; return FALSE;
} }
/**
Construct a X509 stack object from a list of DER-encoded certificate data.
If X509Stack is NULL, then return FALSE.
If this interface is not supported, then return FALSE.
@param[in, out] X509Stack On input, pointer to an existing or NULL X509 stack object.
On output, pointer to the X509 stack object with new
inserted X509 certificate.
@param[in] Args VA_LIST marker for the variable argument list.
A list of DER-encoded single certificate data followed
by certificate size. A NULL terminates the list. The
pairs are the arguments to X509ConstructCertificate().
@retval TRUE The X509 stack construction succeeded.
@retval FALSE The construction operation failed.
@retval FALSE This interface is not supported.
**/
BOOLEAN
EFIAPI
X509ConstructCertificateStackV (
IN OUT UINT8 **X509Stack,
IN VA_LIST Args
)
{
ASSERT (FALSE);
return FALSE;
}
/** /**
Construct a X509 stack object from a list of DER-encoded certificate data. Construct a X509 stack object from a list of DER-encoded certificate data.