Ligação Segura com a Remoting Holográfica e a API OpenXR
Ao utilizar a API OpenXR, toda a API relacionada com ligação segura está disponível como parte da XR_MSFT_holographic_remoting
extensão OpenXR.
Importante
Para saber mais sobre a API de extensão Holographic Remoting OpenXR, consulte a especificação que pode ser encontrada no repositório github de exemplos De Remoting Holográfico.
Lembre-se de que tem de implementar aplicações remotas e de leitor personalizadas se quiser ativar a segurança da ligação. Ambas as aplicações personalizadas precisam:
- Um fornecedor de certificados e um validador de autenticação se a aplicação for executada como o servidor.
- Um fornecedor de autenticação e um validador de certificados se a aplicação for executada como cliente.
A API OpenXR é semelhante à API de Windows Mixed Reality descrita aqui.
No entanto, em vez de implementar interfaces, os elementos-chave para a ligação segura com a XR_MSFT_holographic_remoting
extensão OpenXR são as seguintes chamadas de retorno:
xrRemotingRequestAuthenticationTokenCallbackMSFT
, gera ou obtém o token de autenticação a ser enviado.xrRemotingValidateServerCertificateCallbackMSFT
, valida a cadeia de certificados.xrRemotingValidateAuthenticationTokenCallbackMSFT
, valida o token de autenticação do cliente.xrRemotingRequestServerCertificateCallbackMSFT
, forneça à aplicação de servidor o certificado a utilizar.
Nota
Com o Holographic Remoting, é possível que o Leitor ou o Remoto seja o servidor consoante as suas necessidades (para obter mais informações, consulte Terminologia De Remoto Holográfico). Se a sua aplicação personalizada remota ou personalizada do leitor puder ser executada como cliente e servidor, a aplicação tem de fornecer as quatro chamadas de retorno.
As chamadas de retorno podem ser fornecidas para o runtime de OpenXR remoting através de xrRemotingSetSecureConnectionClientCallbacksMSFT
e xrRemotingSetSecureConnectionServerCallbacksMSFT
.
Para tal, pode criar funções estáticas para as chamadas de retorno:
class SecureConnectionCallbacks {
public:
...
// Static callbacks
static XrResult XRAPI_CALL
RequestAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
if (!authenticationTokenRequest->context) {
return XR_ERROR_RUNTIME_FAILURE;
}
return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenRequest->context)
->RequestAuthenticationToken(authenticationTokenRequest);
}
static XrResult XRAPI_CALL
ValidateServerCertificateStaticCallback(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
if (!serverCertificateValidation->context) {
return XR_ERROR_RUNTIME_FAILURE;
}
return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateValidation->context)
->ValidateServerCertificate(serverCertificateValidation);
}
static XrResult XRAPI_CALL
ValidateAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
if (!authenticationTokenValidation->context) {
return XR_ERROR_RUNTIME_FAILURE;
}
return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenValidation->context)
->ValidateAuthenticationToken(authenticationTokenValidation);
}
static XrResult XRAPI_CALL
RequestServerCertificateStaticCallback(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
if (!serverCertificateRequest->context) {
return XR_ERROR_RUNTIME_FAILURE;
}
return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateRequest->context)
->RequestServerCertificate(serverCertificateRequest);
}
}
As funções de chamada de retorno estáticas têm um aspeto semelhante e, no exemplo acima, chamam apenas uma função no objeto de contexto, que está definida em xrRemotingSetSecureConnectionClientCallbacksMSFT
ou xrRemotingSetSecureConnectionServerCallbacksMSFT
. A implementação real das chamadas de retorno é efetuada dentro das funções de membro do objeto de contexto:
class SecureConnectionCallbacks {
...
private:
// The client has to provide a token and has to validate the certificate.
XrResult RequestAuthenticationToken(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
// To provide a token fill out the authenticationTokenRequest with your token.
}
XrResult ValidateServerCertificate(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
// Validate the certificate.
}
// The server has to provide a certificate and hast to validate the token.
XrResult ValidateAuthenticationToken(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
// Validate the token.
}
XrResult RequestServerCertificate(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
// To provide a certificate fill out the serverCertificateRequest with your certificate.
}
}
Agora, pode fornecer as chamadas de retorno para xrRemotingSetSecureConnectionClientCallbacksMSFT
e xrRemotingSetSecureConnectionServerCallbacksMSFT
. Além disso, a ligação segura tem de ser ativada através do parâmetro secureConnection na XrRemotingConnectInfoMSFT
estrutura ou na XrRemotingListenInfoMSFT
estrutura, dependendo se está a utilizar xrRemotingConnectMSFT
ou xrRemotingListenMSFT
:
...
SecureConnectionCallbacks callbackObject;
...
if (client)
{
XrRemotingSecureConnectionClientCallbacksMSFT clientCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_CLIENT_CALLBACKS_MSFT);
clientCallbacks.context = &callbackObject;
clientCallbacks.requestAuthenticationTokenCallback = SecureConnectionCallbacks::RequestAuthenticationTokenStaticCallback;
clientCallbacks.validateServerCertificateCallback = SecureConnectionCallbacks::ValidateServerCertificateStaticCallback;
clientCallbacks.performSystemValidation = true;
CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionClientCallbacksMSFT(m_instance.Get(), m_systemId, &clientCallbacks));
...
connectInfo.secureConnection = true; // Enable secure connection!
CHECK_XRCMD(m_extensions.xrRemotingConnectMSFT(m_instance.Get(), m_systemId, &connectInfo));
}
if (server)
{
XrRemotingSecureConnectionServerCallbacksMSFT serverCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_SERVER_CALLBACKS_MSFT);
serverCallbacks.context = &callbackObject;
serverCallbacks.requestServerCertificateCallback = SecureConnectionCallbacks::RequestServerCertificateStaticCallback;
serverCallbacks.validateAuthenticationTokenCallback = SecureConnectionCallbacks::ValidateAuthenticationTokenStaticCallback;
serverCallbacks.authenticationRealm = /*YourAuthenticationRealm*/;
CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionServerCallbacksMSFT(m_instance.Get(), m_systemId, &serverCallbacks));
...
listenInfo.secureConnection = true; // Enable secure connection!
CHECK_XRCMD(m_extensions.xrRemotingListenMSFT(m_instance.Get(), m_systemId, &listenInfo));
}
Nota
Pode encontrar um exemplo detalhado na aplicação de exemplo OpenXR.