mirror of https://github.com/acidanthera/audk.git
1061 lines
29 KiB
C
1061 lines
29 KiB
C
/** @file
|
|
SSL/TLS Configuration Library Wrapper Implementation over OpenSSL.
|
|
|
|
Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
|
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#include "InternalTlsLib.h"
|
|
|
|
typedef struct {
|
|
//
|
|
// IANA/IETF defined Cipher Suite ID
|
|
//
|
|
UINT16 IanaCipher;
|
|
//
|
|
// OpenSSL-used Cipher Suite String
|
|
//
|
|
CONST CHAR8 *OpensslCipher;
|
|
} TLS_CIPHER_PAIR;
|
|
|
|
//
|
|
// The mapping table between IANA/IETF Cipher Suite definitions and
|
|
// OpenSSL-used Cipher Suite name.
|
|
//
|
|
STATIC CONST TLS_CIPHER_PAIR TlsCipherMappingTable[] = {
|
|
{ 0x0001, "NULL-MD5" }, /// TLS_RSA_WITH_NULL_MD5
|
|
{ 0x0002, "NULL-SHA" }, /// TLS_RSA_WITH_NULL_SHA
|
|
{ 0x0004, "RC4-MD5" }, /// TLS_RSA_WITH_RC4_128_MD5
|
|
{ 0x0005, "RC4-SHA" }, /// TLS_RSA_WITH_RC4_128_SHA
|
|
{ 0x000A, "DES-CBC3-SHA" }, /// TLS_RSA_WITH_3DES_EDE_CBC_SHA, mandatory TLS 1.1
|
|
{ 0x0016, "DHE-RSA-DES-CBC3-SHA" }, /// TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
|
|
{ 0x002F, "AES128-SHA" }, /// TLS_RSA_WITH_AES_128_CBC_SHA, mandatory TLS 1.2
|
|
{ 0x0030, "DH-DSS-AES128-SHA" }, /// TLS_DH_DSS_WITH_AES_128_CBC_SHA
|
|
{ 0x0031, "DH-RSA-AES128-SHA" }, /// TLS_DH_RSA_WITH_AES_128_CBC_SHA
|
|
{ 0x0033, "DHE-RSA-AES128-SHA" }, /// TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|
|
{ 0x0035, "AES256-SHA" }, /// TLS_RSA_WITH_AES_256_CBC_SHA
|
|
{ 0x0036, "DH-DSS-AES256-SHA" }, /// TLS_DH_DSS_WITH_AES_256_CBC_SHA
|
|
{ 0x0037, "DH-RSA-AES256-SHA" }, /// TLS_DH_RSA_WITH_AES_256_CBC_SHA
|
|
{ 0x0039, "DHE-RSA-AES256-SHA" }, /// TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
|
{ 0x003B, "NULL-SHA256" }, /// TLS_RSA_WITH_NULL_SHA256
|
|
{ 0x003C, "AES128-SHA256" }, /// TLS_RSA_WITH_AES_128_CBC_SHA256
|
|
{ 0x003D, "AES256-SHA256" }, /// TLS_RSA_WITH_AES_256_CBC_SHA256
|
|
{ 0x003E, "DH-DSS-AES128-SHA256" }, /// TLS_DH_DSS_WITH_AES_128_CBC_SHA256
|
|
{ 0x003F, "DH-RSA-AES128-SHA256" }, /// TLS_DH_RSA_WITH_AES_128_CBC_SHA256
|
|
{ 0x0067, "DHE-RSA-AES128-SHA256" }, /// TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
|
|
{ 0x0068, "DH-DSS-AES256-SHA256" }, /// TLS_DH_DSS_WITH_AES_256_CBC_SHA256
|
|
{ 0x0069, "DH-RSA-AES256-SHA256" }, /// TLS_DH_RSA_WITH_AES_256_CBC_SHA256
|
|
{ 0x006B, "DHE-RSA-AES256-SHA256" } /// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
|
|
};
|
|
|
|
/**
|
|
Gets the OpenSSL cipher suite string for the supplied IANA TLS cipher suite.
|
|
|
|
@param[in] CipherId The supplied IANA TLS cipher suite ID.
|
|
|
|
@return The corresponding OpenSSL cipher suite string if found,
|
|
NULL otherwise.
|
|
|
|
**/
|
|
STATIC
|
|
CONST CHAR8 *
|
|
TlsGetCipherString (
|
|
IN UINT16 CipherId
|
|
)
|
|
{
|
|
CONST TLS_CIPHER_PAIR *CipherEntry;
|
|
UINTN TableSize;
|
|
UINTN Index;
|
|
|
|
CipherEntry = TlsCipherMappingTable;
|
|
TableSize = sizeof (TlsCipherMappingTable) / sizeof (TLS_CIPHER_PAIR);
|
|
|
|
//
|
|
// Search Cipher Mapping Table for IANA-OpenSSL Cipher Translation
|
|
//
|
|
for (Index = 0; Index < TableSize; Index++, CipherEntry++) {
|
|
//
|
|
// Translate IANA cipher suite name to OpenSSL name.
|
|
//
|
|
if (CipherEntry->IanaCipher == CipherId) {
|
|
return CipherEntry->OpensslCipher;
|
|
}
|
|
}
|
|
|
|
//
|
|
// No Cipher Mapping found, return NULL.
|
|
//
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
Set a new TLS/SSL method for a particular TLS object.
|
|
|
|
This function sets a new TLS/SSL method for a particular TLS object.
|
|
|
|
@param[in] Tls Pointer to a TLS object.
|
|
@param[in] MajorVer Major Version of TLS/SSL Protocol.
|
|
@param[in] MinorVer Minor Version of TLS/SSL Protocol.
|
|
|
|
@retval EFI_SUCCESS The TLS/SSL method was set successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Unsupported TLS/SSL method.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetVersion (
|
|
IN VOID *Tls,
|
|
IN UINT8 MajorVer,
|
|
IN UINT8 MinorVer
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
UINT16 ProtoVersion;
|
|
|
|
TlsConn = (TLS_CONNECTION *)Tls;
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
ProtoVersion = (MajorVer << 8) | MinorVer;
|
|
|
|
//
|
|
// Bound TLS method to the particular specified version.
|
|
//
|
|
switch (ProtoVersion) {
|
|
case TLS1_VERSION:
|
|
//
|
|
// TLS 1.0
|
|
//
|
|
SSL_set_min_proto_version (TlsConn->Ssl, TLS1_VERSION);
|
|
SSL_set_max_proto_version (TlsConn->Ssl, TLS1_VERSION);
|
|
break;
|
|
case TLS1_1_VERSION:
|
|
//
|
|
// TLS 1.1
|
|
//
|
|
SSL_set_min_proto_version (TlsConn->Ssl, TLS1_1_VERSION);
|
|
SSL_set_max_proto_version (TlsConn->Ssl, TLS1_1_VERSION);
|
|
break;
|
|
case TLS1_2_VERSION:
|
|
//
|
|
// TLS 1.2
|
|
//
|
|
SSL_set_min_proto_version (TlsConn->Ssl, TLS1_2_VERSION);
|
|
SSL_set_max_proto_version (TlsConn->Ssl, TLS1_2_VERSION);
|
|
break;
|
|
default:
|
|
//
|
|
// Unsupported Protocol Version
|
|
//
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
return EFI_SUCCESS;;
|
|
}
|
|
|
|
/**
|
|
Set TLS object to work in client or server mode.
|
|
|
|
This function prepares a TLS object to work in client or server mode.
|
|
|
|
@param[in] Tls Pointer to a TLS object.
|
|
@param[in] IsServer Work in server mode.
|
|
|
|
@retval EFI_SUCCESS The TLS/SSL work mode was set successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Unsupported TLS/SSL work mode.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetConnectionEnd (
|
|
IN VOID *Tls,
|
|
IN BOOLEAN IsServer
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (!IsServer) {
|
|
//
|
|
// Set TLS to work in Client mode.
|
|
//
|
|
SSL_set_connect_state (TlsConn->Ssl);
|
|
} else {
|
|
//
|
|
// Set TLS to work in Server mode.
|
|
// It is unsupported for UEFI version currently.
|
|
//
|
|
//SSL_set_accept_state (TlsConn->Ssl);
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Set the ciphers list to be used by the TLS object.
|
|
|
|
This function sets the ciphers for use by a specified TLS object.
|
|
|
|
@param[in] Tls Pointer to a TLS object.
|
|
@param[in] CipherId Pointer to a UINT16 cipher Id.
|
|
@param[in] CipherNum The number of cipher in the list.
|
|
|
|
@retval EFI_SUCCESS The ciphers list was set successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Unsupported TLS cipher in the list.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetCipherList (
|
|
IN VOID *Tls,
|
|
IN UINT16 *CipherId,
|
|
IN UINTN CipherNum
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
UINTN Index;
|
|
CONST CHAR8 *MappingName;
|
|
CHAR8 CipherString[500];
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || CipherId == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
MappingName = NULL;
|
|
|
|
memset (CipherString, 0, sizeof (CipherString));
|
|
|
|
for (Index = 0; Index < CipherNum; Index++) {
|
|
//
|
|
// Handling OpenSSL / RFC Cipher name mapping.
|
|
//
|
|
MappingName = TlsGetCipherString (*(CipherId + Index));
|
|
if (MappingName == NULL) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
if (Index != 0) {
|
|
//
|
|
// The ciphers were separated by a colon.
|
|
//
|
|
AsciiStrCatS (CipherString, sizeof (CipherString), ":");
|
|
}
|
|
|
|
AsciiStrCatS (CipherString, sizeof (CipherString), MappingName);
|
|
}
|
|
|
|
AsciiStrCatS (CipherString, sizeof (CipherString), ":@STRENGTH");
|
|
|
|
//
|
|
// Sets the ciphers for use by the Tls object.
|
|
//
|
|
if (SSL_set_cipher_list (TlsConn->Ssl, CipherString) <= 0) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Set the compression method for TLS/SSL operations.
|
|
|
|
This function handles TLS/SSL integrated compression methods.
|
|
|
|
@param[in] CompMethod The compression method ID.
|
|
|
|
@retval EFI_SUCCESS The compression method for the communication was
|
|
set successfully.
|
|
@retval EFI_UNSUPPORTED Unsupported compression method.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetCompressionMethod (
|
|
IN UINT8 CompMethod
|
|
)
|
|
{
|
|
COMP_METHOD *Cm;
|
|
INTN Ret;
|
|
|
|
Cm = NULL;
|
|
Ret = 0;
|
|
|
|
if (CompMethod == 0) {
|
|
//
|
|
// TLS defines one standard compression method, CompressionMethod.null (0),
|
|
// which specifies that data exchanged via the record protocol will not be compressed.
|
|
// So, return EFI_SUCCESS directly (RFC 3749).
|
|
//
|
|
return EFI_SUCCESS;
|
|
} else if (CompMethod == 1) {
|
|
Cm = COMP_zlib();
|
|
} else {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
//
|
|
// Adds the compression method to the list of available
|
|
// compression methods.
|
|
//
|
|
Ret = SSL_COMP_add_compression_method (CompMethod, Cm);
|
|
if (Ret != 0) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Set peer certificate verification mode for the TLS connection.
|
|
|
|
This function sets the verification mode flags for the TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in] VerifyMode A set of logically or'ed verification mode flags.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
TlsSetVerify (
|
|
IN VOID *Tls,
|
|
IN UINT32 VerifyMode
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Set peer certificate verification parameters with NULL callback.
|
|
//
|
|
SSL_set_verify (TlsConn->Ssl, VerifyMode, NULL);
|
|
}
|
|
|
|
/**
|
|
Sets a TLS/SSL session ID to be used during TLS/SSL connect.
|
|
|
|
This function sets a session ID to be used when the TLS/SSL connection is
|
|
to be established.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in] SessionId Session ID data used for session resumption.
|
|
@param[in] SessionIdLen Length of Session ID in bytes.
|
|
|
|
@retval EFI_SUCCESS Session ID was set successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED No available session for ID setting.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetSessionId (
|
|
IN VOID *Tls,
|
|
IN UINT8 *SessionId,
|
|
IN UINT16 SessionIdLen
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
SSL_SESSION *Session;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
Session = NULL;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || SessionId == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Session = SSL_get_session (TlsConn->Ssl);
|
|
if (Session == NULL) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
SSL_SESSION_set1_id (Session, (const unsigned char *)SessionId, SessionIdLen);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Adds the CA to the cert store when requesting Server or Client authentication.
|
|
|
|
This function adds the CA certificate to the list of CAs when requesting
|
|
Server or Client authentication for the chosen TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in] Data Pointer to the data buffer of a DER-encoded binary
|
|
X.509 certificate or PEM-encoded X.509 certificate.
|
|
@param[in] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_OUT_OF_RESOURCES Required resources could not be allocated.
|
|
@retval EFI_ABORTED Invalid X.509 certificate.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetCaCertificate (
|
|
IN VOID *Tls,
|
|
IN VOID *Data,
|
|
IN UINTN DataSize
|
|
)
|
|
{
|
|
BIO *BioCert;
|
|
X509 *Cert;
|
|
X509_STORE *X509Store;
|
|
EFI_STATUS Status;
|
|
TLS_CONNECTION *TlsConn;
|
|
SSL_CTX *SslCtx;
|
|
INTN Ret;
|
|
UINTN ErrorCode;
|
|
|
|
BioCert = NULL;
|
|
Cert = NULL;
|
|
X509Store = NULL;
|
|
Status = EFI_SUCCESS;
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
Ret = 0;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || Data == NULL || DataSize == 0) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
//
|
|
// DER-encoded binary X.509 certificate or PEM-encoded X.509 certificate.
|
|
// Determine whether certificate is from DER encoding, if so, translate it to X509 structure.
|
|
//
|
|
Cert = d2i_X509 (NULL, (const unsigned char ** )&Data, (long) DataSize);
|
|
if (Cert == NULL) {
|
|
//
|
|
// Certificate is from PEM encoding.
|
|
//
|
|
BioCert = BIO_new (BIO_s_mem ());
|
|
if (BioCert == NULL) {
|
|
Status = EFI_OUT_OF_RESOURCES;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
if (BIO_write (BioCert, Data, (UINT32) DataSize) <= 0) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
Cert = PEM_read_bio_X509 (BioCert, NULL, NULL, NULL);
|
|
if (Cert == NULL) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
}
|
|
|
|
SslCtx = SSL_get_SSL_CTX (TlsConn->Ssl);
|
|
X509Store = SSL_CTX_get_cert_store (SslCtx);
|
|
if (X509Store == NULL) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
//
|
|
// Add certificate to X509 store
|
|
//
|
|
Ret = X509_STORE_add_cert (X509Store, Cert);
|
|
if (Ret != 1) {
|
|
ErrorCode = ERR_peek_last_error ();
|
|
//
|
|
// Ignore "already in table" errors
|
|
//
|
|
if (!(ERR_GET_FUNC (ErrorCode) == X509_F_X509_STORE_ADD_CERT &&
|
|
ERR_GET_REASON (ErrorCode) == X509_R_CERT_ALREADY_IN_HASH_TABLE)) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
}
|
|
|
|
ON_EXIT:
|
|
if (BioCert != NULL) {
|
|
BIO_free (BioCert);
|
|
}
|
|
|
|
if (Cert != NULL) {
|
|
X509_free (Cert);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Loads the local public certificate into the specified TLS object.
|
|
|
|
This function loads the X.509 certificate into the specified TLS object
|
|
for TLS negotiation.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in] Data Pointer to the data buffer of a DER-encoded binary
|
|
X.509 certificate or PEM-encoded X.509 certificate.
|
|
@param[in] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_OUT_OF_RESOURCES Required resources could not be allocated.
|
|
@retval EFI_ABORTED Invalid X.509 certificate.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetHostPublicCert (
|
|
IN VOID *Tls,
|
|
IN VOID *Data,
|
|
IN UINTN DataSize
|
|
)
|
|
{
|
|
BIO *BioCert;
|
|
X509 *Cert;
|
|
EFI_STATUS Status;
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
BioCert = NULL;
|
|
Cert = NULL;
|
|
Status = EFI_SUCCESS;
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || Data == NULL || DataSize == 0) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
//
|
|
// DER-encoded binary X.509 certificate or PEM-encoded X.509 certificate.
|
|
// Determine whether certificate is from DER encoding, if so, translate it to X509 structure.
|
|
//
|
|
Cert = d2i_X509 (NULL, (const unsigned char ** )&Data, (long) DataSize);
|
|
if (Cert == NULL) {
|
|
//
|
|
// Certificate is from PEM encoding.
|
|
//
|
|
BioCert = BIO_new (BIO_s_mem ());
|
|
if (BioCert == NULL) {
|
|
Status = EFI_OUT_OF_RESOURCES;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
if (BIO_write (BioCert, Data, (UINT32) DataSize) <= 0) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
Cert = PEM_read_bio_X509 (BioCert, NULL, NULL, NULL);
|
|
if (Cert == NULL) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
}
|
|
|
|
if (SSL_use_certificate (TlsConn->Ssl, Cert) != 1) {
|
|
Status = EFI_ABORTED;
|
|
goto ON_EXIT;
|
|
}
|
|
|
|
ON_EXIT:
|
|
if (BioCert != NULL) {
|
|
BIO_free (BioCert);
|
|
}
|
|
|
|
if (Cert != NULL) {
|
|
X509_free (Cert);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Adds the local private key to the specified TLS object.
|
|
|
|
This function adds the local private key (PEM-encoded RSA or PKCS#8 private
|
|
key) into the specified TLS object for TLS negotiation.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in] Data Pointer to the data buffer of a PEM-encoded RSA
|
|
or PKCS#8 private key.
|
|
@param[in] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
@retval EFI_ABORTED Invalid private key data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetHostPrivateKey (
|
|
IN VOID *Tls,
|
|
IN VOID *Data,
|
|
IN UINTN DataSize
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
Adds the CA-supplied certificate revocation list for certificate validation.
|
|
|
|
This function adds the CA-supplied certificate revocation list data for
|
|
certificate validity checking.
|
|
|
|
@param[in] Data Pointer to the data buffer of a DER-encoded CRL data.
|
|
@param[in] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
@retval EFI_ABORTED Invalid CRL data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsSetCertRevocationList (
|
|
IN VOID *Data,
|
|
IN UINTN DataSize
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
Gets the protocol version used by the specified TLS connection.
|
|
|
|
This function returns the protocol version used by the specified TLS
|
|
connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
|
|
@return The protocol version of the specified TLS connection.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
TlsGetVersion (
|
|
IN VOID *Tls
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
ASSERT (TlsConn != NULL);
|
|
|
|
return (UINT16)(SSL_version (TlsConn->Ssl));
|
|
}
|
|
|
|
/**
|
|
Gets the connection end of the specified TLS connection.
|
|
|
|
This function returns the connection end (as client or as server) used by
|
|
the specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
|
|
@return The connection end used by the specified TLS connection.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
TlsGetConnectionEnd (
|
|
IN VOID *Tls
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
ASSERT (TlsConn != NULL);
|
|
|
|
return (UINT8)SSL_is_server (TlsConn->Ssl);
|
|
}
|
|
|
|
/**
|
|
Gets the cipher suite used by the specified TLS connection.
|
|
|
|
This function returns current cipher suite used by the specified
|
|
TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] CipherId The cipher suite used by the TLS object.
|
|
|
|
@retval EFI_SUCCESS The cipher suite was returned successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Unsupported cipher suite.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetCurrentCipher (
|
|
IN VOID *Tls,
|
|
IN OUT UINT16 *CipherId
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
CONST SSL_CIPHER *Cipher;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
Cipher = NULL;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || CipherId == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Cipher = SSL_get_current_cipher (TlsConn->Ssl);
|
|
if (Cipher == NULL) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
*CipherId = (SSL_CIPHER_get_id (Cipher)) & 0xFFFF;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Gets the compression methods used by the specified TLS connection.
|
|
|
|
This function returns current integrated compression methods used by
|
|
the specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] CompressionId The current compression method used by
|
|
the TLS object.
|
|
|
|
@retval EFI_SUCCESS The compression method was returned successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_ABORTED Invalid Compression method.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetCurrentCompressionId (
|
|
IN VOID *Tls,
|
|
IN OUT UINT8 *CompressionId
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
Gets the verification mode currently set in the TLS connection.
|
|
|
|
This function returns the peer verification mode currently set in the
|
|
specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
|
|
@return The verification mode set in the specified TLS connection.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
TlsGetVerify (
|
|
IN VOID *Tls
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
ASSERT (TlsConn != NULL);
|
|
|
|
return SSL_get_verify_mode (TlsConn->Ssl);
|
|
}
|
|
|
|
/**
|
|
Gets the session ID used by the specified TLS connection.
|
|
|
|
This function returns the TLS/SSL session ID currently used by the
|
|
specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] SessionId Buffer to contain the returned session ID.
|
|
@param[in,out] SessionIdLen The length of Session ID in bytes.
|
|
|
|
@retval EFI_SUCCESS The Session ID was returned successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Invalid TLS/SSL session.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetSessionId (
|
|
IN VOID *Tls,
|
|
IN OUT UINT8 *SessionId,
|
|
IN OUT UINT16 *SessionIdLen
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
SSL_SESSION *Session;
|
|
CONST UINT8 *SslSessionId;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
Session = NULL;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || SessionId == NULL || SessionIdLen == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Session = SSL_get_session (TlsConn->Ssl);
|
|
if (Session == NULL) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
SslSessionId = SSL_SESSION_get_id (Session, (unsigned int *)SessionIdLen);
|
|
CopyMem (SessionId, SslSessionId, *SessionIdLen);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Gets the client random data used in the specified TLS connection.
|
|
|
|
This function returns the TLS/SSL client random data currently used in
|
|
the specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] ClientRandom Buffer to contain the returned client
|
|
random data (32 bytes).
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
TlsGetClientRandom (
|
|
IN VOID *Tls,
|
|
IN OUT UINT8 *ClientRandom
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || ClientRandom == NULL) {
|
|
return;
|
|
}
|
|
|
|
SSL_get_client_random (TlsConn->Ssl, ClientRandom, SSL3_RANDOM_SIZE);
|
|
}
|
|
|
|
/**
|
|
Gets the server random data used in the specified TLS connection.
|
|
|
|
This function returns the TLS/SSL server random data currently used in
|
|
the specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] ServerRandom Buffer to contain the returned server
|
|
random data (32 bytes).
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
TlsGetServerRandom (
|
|
IN VOID *Tls,
|
|
IN OUT UINT8 *ServerRandom
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || ServerRandom == NULL) {
|
|
return;
|
|
}
|
|
|
|
SSL_get_server_random (TlsConn->Ssl, ServerRandom, SSL3_RANDOM_SIZE);
|
|
}
|
|
|
|
/**
|
|
Gets the master key data used in the specified TLS connection.
|
|
|
|
This function returns the TLS/SSL master key material currently used in
|
|
the specified TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[in,out] KeyMaterial Buffer to contain the returned key material.
|
|
|
|
@retval EFI_SUCCESS Key material was returned successfully.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_UNSUPPORTED Invalid TLS/SSL session.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetKeyMaterial (
|
|
IN VOID *Tls,
|
|
IN OUT UINT8 *KeyMaterial
|
|
)
|
|
{
|
|
TLS_CONNECTION *TlsConn;
|
|
SSL_SESSION *Session;
|
|
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
Session = NULL;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || KeyMaterial == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Session = SSL_get_session (TlsConn->Ssl);
|
|
|
|
if (Session == NULL) {
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
SSL_SESSION_get_master_key (Session, KeyMaterial, SSL3_MASTER_SECRET_SIZE);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Gets the CA Certificate from the cert store.
|
|
|
|
This function returns the CA certificate for the chosen
|
|
TLS connection.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[out] Data Pointer to the data buffer to receive the CA
|
|
certificate data sent to the client.
|
|
@param[in,out] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
@retval EFI_BUFFER_TOO_SMALL The Data is too small to hold the data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetCaCertificate (
|
|
IN VOID *Tls,
|
|
OUT VOID *Data,
|
|
IN OUT UINTN *DataSize
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
Gets the local public Certificate set in the specified TLS object.
|
|
|
|
This function returns the local public certificate which was currently set
|
|
in the specified TLS object.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[out] Data Pointer to the data buffer to receive the local
|
|
public certificate.
|
|
@param[in,out] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
|
@retval EFI_NOT_FOUND The certificate is not found.
|
|
@retval EFI_BUFFER_TOO_SMALL The Data is too small to hold the data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetHostPublicCert (
|
|
IN VOID *Tls,
|
|
OUT VOID *Data,
|
|
IN OUT UINTN *DataSize
|
|
)
|
|
{
|
|
X509 *Cert;
|
|
TLS_CONNECTION *TlsConn;
|
|
|
|
Cert = NULL;
|
|
TlsConn = (TLS_CONNECTION *) Tls;
|
|
|
|
if (TlsConn == NULL || TlsConn->Ssl == NULL || DataSize == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Cert = SSL_get_certificate(TlsConn->Ssl);
|
|
if (Cert == NULL) {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
//
|
|
// Only DER encoding is supported currently.
|
|
//
|
|
if (*DataSize < (UINTN) i2d_X509 (Cert, NULL)) {
|
|
*DataSize = (UINTN) i2d_X509 (Cert, NULL);
|
|
return EFI_BUFFER_TOO_SMALL;
|
|
}
|
|
|
|
*DataSize = (UINTN) i2d_X509 (Cert, (unsigned char **) &Data);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Gets the local private key set in the specified TLS object.
|
|
|
|
This function returns the local private key data which was currently set
|
|
in the specified TLS object.
|
|
|
|
@param[in] Tls Pointer to the TLS object.
|
|
@param[out] Data Pointer to the data buffer to receive the local
|
|
private key data.
|
|
@param[in,out] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
@retval EFI_BUFFER_TOO_SMALL The Data is too small to hold the data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetHostPrivateKey (
|
|
IN VOID *Tls,
|
|
OUT VOID *Data,
|
|
IN OUT UINTN *DataSize
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|
|
/**
|
|
Gets the CA-supplied certificate revocation list data set in the specified
|
|
TLS object.
|
|
|
|
This function returns the CA-supplied certificate revocation list data which
|
|
was currently set in the specified TLS object.
|
|
|
|
@param[out] Data Pointer to the data buffer to receive the CRL data.
|
|
@param[in,out] DataSize The size of data buffer in bytes.
|
|
|
|
@retval EFI_SUCCESS The operation succeeded.
|
|
@retval EFI_UNSUPPORTED This function is not supported.
|
|
@retval EFI_BUFFER_TOO_SMALL The Data is too small to hold the data.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TlsGetCertRevocationList (
|
|
OUT VOID *Data,
|
|
IN OUT UINTN *DataSize
|
|
)
|
|
{
|
|
return EFI_UNSUPPORTED;
|
|
}
|
|
|