Поделиться через


Безопасное подключение с помощью голографического удаленного взаимодействия и API OpenXR

При использовании API OpenXR все api, связанные с безопасным подключением, доступны в составе XR_MSFT_holographic_remoting расширения OpenXR.

Важно!

Чтобы узнать об API расширения OpenXR для голографического удаленного взаимодействия, проверка спецификацию, которую можно найти в репозитории примеров голографического удаленного взаимодействия на сайте GitHub.

Помните, что для включения безопасности подключения необходимо реализовать пользовательские удаленные приложения и приложения проигрывателя. Для обоих пользовательских приложений требуется:

  • Поставщик сертификатов и проверяющий элемент управления проверкой подлинности, если приложение выполняется как сервер.
  • Поставщик проверки подлинности и проверяющий элемент управления сертификатами, если приложение выполняется от имени клиента.

API OpenXR похож на API Windows Mixed Reality, описанный здесь. Однако вместо реализации интерфейсов ключевыми элементами для безопасного XR_MSFT_holographic_remoting подключения с помощью расширения OpenXR являются следующие обратные вызовы:

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, создает или извлекает маркер проверки подлинности для отправки.
  • xrRemotingValidateServerCertificateCallbackMSFTпроверяет цепочку сертификатов.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, проверяет маркер проверки подлинности клиента.
  • xrRemotingRequestServerCertificateCallbackMSFT, предоставьте серверное приложение с сертификатом для использования.

Примечание

При использовании голографического удаленного взаимодействия в зависимости от ваших потребностей возможно, что сервером является проигрыватель или удаленный сервер (дополнительные сведения см. в разделе Терминология голографического удаленного взаимодействия). Если ваше пользовательское удаленное приложение или приложение проигрывателя может работать как клиент и сервер, приложение должен предоставить все четыре обратных вызова.

Обратные вызовы можно предоставить среде выполнения Удаленного взаимодействия OpenXR с помощью xrRemotingSetSecureConnectionClientCallbacksMSFT и xrRemotingSetSecureConnectionServerCallbacksMSFT. Для этого можно создать статические функции для обратных вызовов:

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);
    }
}

Статические функции обратного вызова выглядят примерно так же, и в приведенном выше примере они просто вызывают функцию для объекта контекста, который задается в xrRemotingSetSecureConnectionClientCallbacksMSFT или xrRemotingSetSecureConnectionServerCallbacksMSFT. Затем фактическая реализация обратных вызовов выполняется внутри функций-членов объекта контекста:

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.
    }
}

Теперь можно указать обратные вызовы для xrRemotingSetSecureConnectionClientCallbacksMSFT и xrRemotingSetSecureConnectionServerCallbacksMSFT. Кроме того, необходимо включить безопасное подключение с помощью параметра secureConnection в XrRemotingConnectInfoMSFT структуре или структуре в XrRemotingListenInfoMSFT зависимости от того, используете xrRemotingConnectMSFT ли вы или 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));
}

Примечание

Подробный пример можно найти в примере приложения OpenXR.

См. также: