Setting the encryption secret

Les sessions cryptées de bout en bout sont créées à l'aide des API du serveur (voir Activation du cryptage à l'aide de l'option API REST).

Avant que le client ne publie ou ne s'abonne, appelez la fonction otc_session_set_encryption_secret() méthode :

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

Un secret valide est une chaîne de 8 à 256 caractères. Vous pouvez modifier le secret en appelant la fonction otc_session_set_encryption_secret() à nouveau.

La définition d'un secret non valide entraînera un OTC_SESSION_INVALID_ENCRYPTION_SECRET erreur.

Events and errors

Les événements et les erreurs sont essentiels pour gérer le comportement du chiffrement piloté par l'utilisateur. Le chiffrement de bout en bout utilise le modèle du secret partagé : tous les participants à la session sont censés utiliser le même secret pour chiffrer leurs données et déchiffrer celles des autres.

Le nouveau code d'erreur est OTC_SESSION_INVALID_ENCRYPTION_SECRET et sera renvoyé en tant que code de résultat de la fonction set_encryption_secret et non dans le callback on_error.

Si un client tente de définir un secret de chiffrement non valide pour une session, le système otc_session_callbacks.on_error() renvoie un code d'erreur égal à OTC_SESSION_INVALID_ENCRYPTION_SECRET. Dans l'exemple suivant, une session est initialisée avec un secret de chiffrement vide (et donc invalide) :

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

Si un utilisateur tente de publier dans une session chiffrée de bout en bout sans avoir spécifié de secret de chiffrement, l'appel de la fonction otc_session_publish() se traduit par l'utilisation de la fonction otc_publisher_callbacks.on_error() appelée avec une erreur dont le code est fixé à OTC_SESSION_ENCRYPTION_SECRET_MISSING. Pour une meilleure expérience utilisateur, l'application doit valider un secret fourni par l'utilisateur avant d'appeler la fonction otc_session_publish() fonction :

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 abonné n'est pas en mesure de décoder les médias d'un flux en raison d'un secret de cryptage incorrect, le subscriber_callbacks.on_error() est appelée avec une erreur dont le code est fixé à OTC_SUBSCRIBER_ENCRYPTION_SECRET_MISMATCH. Il est important d'indiquer à l'utilisateur que le média n'est pas reçu en raison d'une erreur de cryptage et non d'une défaillance de la connexion ou d'un problème audio/vidéo :

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 abonné rencontre une erreur interne lors du décryptage d'un paquet, la fonction subscriber_callbacks.on_error() est appelée avec une erreur dont le code est fixé à OTC_SUBSCRIBER_DECRYPTION_INTERNAL_ERROR.