Setting the encryption secret

Las sesiones cifradas de extremo a extremo se crean mediante las API del servidor (véase Activación del cifrado mediante la función API REST).

Antes de que el cliente publique o se suscriba, llame a la función otc_session_set_encryption_secret() método:

otc_session_set_encryption_secret(session, secret);	
otc_session_connect(session, TOKEN);

Un secreto válido es una cadena de entre 8 y 256 caracteres. Puede cambiar el secreto llamando a la función otc_session_set_encryption_secret() función de nuevo.

Si se introduce un secreto no válido, se producirá un error OTC_SESSION_INVALID_ENCRYPTION_SECRET error.

Events and errors

Los eventos y errores son esenciales para gestionar el comportamiento del cifrado dirigido por el usuario. El cifrado de extremo a extremo utiliza el modelo de secreto compartido: se espera que todos los participantes en la sesión utilicen el mismo secreto para cifrar sus medios y descifrar los de los demás.

El nuevo código de error es OTC_SESSION_INVALID_ENCRYPTION_SECRET y se devolverá como código de resultado de la función set_encryption_secret no en la llamada de retorno on_error.

Si un cliente intenta establecer un secreto de cifrado no válido para una sesión, el otc_session_callbacks.on_error() devuelve un código de error igual a OTC_SESSION_INVALID_ENCRYPTION_SECRET. En el siguiente ejemplo, una sesión se inicializa con un secreto de encriptación vacío (y por tanto inválido):

int result = otc_session_set_encryption_secret(session, "");
if (result == OTC_SESSION_INVALID_ENCRYPTION_SECRET) {
  // Report error...
}

Si un usuario intenta publicar en una sesión cifrada de extremo a extremo sin haber especificado un secreto de cifrado, al llamar a la función otc_session_publish() da como resultado la función otc_publisher_callbacks.on_error() función que se llama con un error que tiene el código establecido en OTC_SESSION_ENCRYPTION_SECRET_MISSING. Para obtener la mejor experiencia de usuario, la aplicación debe validar un secreto proporcionado por el usuario antes de llamar a la función otc_session_publish() función:

static void on_publisher_error(otc_publisher *publisher,
                               void *user_data,
                               const char* error_string,
                               enum otc_publisher_error_code error_code) {
  if (otc_publisher_error_code == OTC_SESSION_ENCRYPTION_SECRET_MISSING) {
    // The application should communicate that the secret was not set.
  }
}

struct otc_publisher_callbacks publisher_callbacks = {0};
publisher_callbacks.on_error = on_publisher_error;

session = otc_session_new(API_KEY, SESSION_ID, &session_callbacks);

otc_publisher *publisher = otc_publisher_new("Joe",
                                  nullptr,
                                  &publisher_callbacks);
otc_session_publish(session, publisher);

Si un abonado no puede descodificar los medios de un flujo debido a un secreto de codificación incorrecto, el subscriber_callbacks.on_error() con un error cuyo código es OTC_SUBSCRIBER_ENCRYPTION_SECRET_MISMATCH. Es importante comunicar al usuario que los medios no se están recibiendo debido a un desajuste de cifrado y no a un fallo de conexión o a un problema de audio/vídeo:

static void on_subscriber_error(otc_subscriber *subscriber,
                               void *user_data,
                               const char* error_string,
                               enum otc_subscriber_error_code error_code) {
  if (otc_subscriber_error_code == OTC_SUBSCRIBER_ENCRYPTION_SECRET_MISMATCH) {
  // Activate a UI element communicating that there's been an encryption secret mismatch.
  }
}

struct otc_subscriber_callbacks subscriber_callbacks = {0};
subscriber_callbacks.on_error = on_subscriber_error;

otc_subscriber *subscriber = otc_subscriber_new(stream,
                                                &subscriber_callbacks);
otc_session_subscribe(session, subscriber);

Si un abonado encuentra un error interno al descifrar un paquete, el subscriber_callbacks.on_error() con un error cuyo código es OTC_SUBSCRIBER_DECRYPTION_INTERNAL_ERROR.