sk_X509_pop_free ((STACK_OF(X509) *) X509Stack, X509_free);\r
}\r
\r
-/**\r
- Pop single certificate from STACK_OF(X509).\r
-\r
- If X509Stack, Cert, or CertSize is NULL, then return FALSE.\r
-\r
- @param[in] X509Stack Pointer to a X509 stack object.\r
- @param[out] Cert Pointer to a X509 certificate.\r
- @param[out] CertSize Length of output X509 certificate in bytes.\r
- \r
- @retval TRUE The X509 stack pop succeeded.\r
- @retval FALSE The pop operation failed.\r
-\r
-**/\r
-BOOLEAN\r
-X509PopCertificate (\r
- IN VOID *X509Stack,\r
- OUT UINT8 **Cert,\r
- OUT UINTN *CertSize\r
- )\r
-{\r
- BIO *CertBio;\r
- X509 *X509Cert;\r
- STACK_OF(X509) *CertStack;\r
- BOOLEAN Status;\r
- int Result;\r
- int Length;\r
- VOID *Buffer;\r
-\r
- Status = FALSE;\r
-\r
- if ((X509Stack == NULL) || (Cert == NULL) || (CertSize == NULL)) {\r
- return Status;\r
- }\r
-\r
- CertStack = (STACK_OF(X509) *) X509Stack;\r
-\r
- X509Cert = sk_X509_pop (CertStack);\r
-\r
- if (X509Cert == NULL) {\r
- return Status;\r
- }\r
-\r
- Buffer = NULL;\r
-\r
- CertBio = BIO_new (BIO_s_mem ());\r
- if (CertBio == NULL) {\r
- return Status;\r
- }\r
-\r
- Result = i2d_X509_bio (CertBio, X509Cert);\r
- if (Result == 0) {\r
- goto _Exit;\r
- }\r
-\r
- Length = ((BUF_MEM *) CertBio->ptr)->length;\r
- if (Length <= 0) {\r
- goto _Exit;\r
- }\r
-\r
- Buffer = malloc (Length);\r
- if (Buffer == NULL) {\r
- goto _Exit;\r
- }\r
-\r
- Result = BIO_read (CertBio, Buffer, Length);\r
- if (Result != Length) {\r
- goto _Exit;\r
- }\r
-\r
- *Cert = Buffer;\r
- *CertSize = Length;\r
-\r
- Status = TRUE;\r
-\r
-_Exit:\r
-\r
- BIO_free (CertBio);\r
-\r
- if (!Status && (Buffer != NULL)) {\r
- free (Buffer);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
/**\r
Retrieve the subject bytes from one X.509 certificate.\r
\r