Add two new interfaces Pkcs7GetSigners and Pkcs7FreeSigners to BaseCryptLib.
Signed-off by: tye1 Reviewed-by: geekboy15a Reviewed-by: sfu5 Reviewed-by: gdong1 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13158 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -224,6 +224,91 @@ X509StackFree (
|
||||
sk_X509_pop_free ((STACK_OF(X509) *) X509Stack, X509_free);
|
||||
}
|
||||
|
||||
/**
|
||||
Pop single certificate from STACK_OF(X509).
|
||||
|
||||
If X509Stack, Cert, or CertSize is NULL, then return FALSE.
|
||||
|
||||
@param[in] X509Stack Pointer to a X509 stack object.
|
||||
@param[out] Cert Pointer to a X509 certificate.
|
||||
@param[out] CertSize Length of output X509 certificate in bytes.
|
||||
|
||||
@retval TRUE The X509 stack pop succeeded.
|
||||
@retval FALSE The pop operation failed.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
X509PopCertificate (
|
||||
IN VOID *X509Stack,
|
||||
OUT UINT8 **Cert,
|
||||
OUT UINTN *CertSize
|
||||
)
|
||||
{
|
||||
BIO *CertBio;
|
||||
X509 *X509Cert;
|
||||
STACK_OF(X509) *CertStack;
|
||||
BOOLEAN Status;
|
||||
int Result;
|
||||
int Length;
|
||||
VOID *Buffer;
|
||||
|
||||
Status = FALSE;
|
||||
|
||||
if ((X509Stack == NULL) || (Cert == NULL) || (CertSize == NULL)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
CertStack = (STACK_OF(X509) *) X509Stack;
|
||||
|
||||
X509Cert = sk_X509_pop (CertStack);
|
||||
|
||||
if (X509Cert == NULL) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Buffer = NULL;
|
||||
|
||||
CertBio = BIO_new (BIO_s_mem ());
|
||||
if (CertBio == NULL) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Result = i2d_X509_bio (CertBio, X509Cert);
|
||||
if (Result == 0) {
|
||||
goto _Exit;
|
||||
}
|
||||
|
||||
Length = ((BUF_MEM *) CertBio->ptr)->length;
|
||||
if (Length <= 0) {
|
||||
goto _Exit;
|
||||
}
|
||||
|
||||
Buffer = malloc (Length);
|
||||
if (Buffer == NULL) {
|
||||
goto _Exit;
|
||||
}
|
||||
|
||||
Result = BIO_read (CertBio, Buffer, Length);
|
||||
if (Result != Length) {
|
||||
goto _Exit;
|
||||
}
|
||||
|
||||
*Cert = Buffer;
|
||||
*CertSize = Length;
|
||||
|
||||
Status = TRUE;
|
||||
|
||||
_Exit:
|
||||
|
||||
BIO_free (CertBio);
|
||||
|
||||
if (!Status && (Buffer != NULL)) {
|
||||
free (Buffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieve the subject bytes from one X.509 certificate.
|
||||
|
||||
|
Reference in New Issue
Block a user