mgth/LittleBigMouse · error · System.Security.Authentication.AuthenticationException

The C1 requires the VIDAA client certificate. Extract the…

Error message

The C1 requires the VIDAA client certificate. Extract the .p12 from the official Android APK and copy it to {DefaultPath}.

What it means

PreparePairingAsync resolves the Hisense VIDAA client certificate path via VidaaCertificate.Resolve and throws VidaaCertificate.MissingException() when the resolved path is null/whitespace. The VIDAA protocol (a C1-protected MQTT/TLS service) requires a client certificate that is not distributable with the app, so it must be extracted from the official Android APK and placed at the default path.

Solutions

  1. Extract the .p12 certificate from the official Hisense remote Android APK and copy it to the DefaultPath reported in the exception message.
  2. Set ClientCertificatePath in HisenseVidaaConfiguration to the full path of the extracted .p12 file.
  3. Verify the file exists and is readable at the configured path before pairing (File.Exists).
  4. If the password prompt follows, leave ClientCertificatePassword unset so the DefaultPassword is applied, or set it to the APK's known password.

Example fix

// before
c.ClientCertificatePath = null; // never extracted
// after
c.ClientCertificatePath = "/home/user/.littlebigmouse/vidaa/client.p12"; // extracted from official APK
if (!File.Exists(c.ClientCertificatePath)) throw new InvalidOperationException("Extract the .p12 from the Hisense APK first.");
Defensive patterns

Strategy: validation

Validate before calling

// before PreparePairingAsync
var resolved = VidaaCertificate.Resolve(c.ClientCertificatePath);
if (string.IsNullOrWhiteSpace(resolved) || !File.Exists(resolved))
    throw new InvalidOperationException(
        $"VIDAA client certificate missing. Extract the .p12 from the official Android APK and copy it to {VidaaCertificate.DefaultPath}.");

Try / catch

try { await service.RequestPinAsync(config, ct); }
catch (Exception e) when (e.Message.Contains("VIDAA client certificate")) {
    ui.ShowSetupStep("Extract the .p12 from the Hisense remote APK and place it at " + VidaaCertificate.DefaultPath);
}

Prevention

When it happens

Trigger: Calling PreparePairingAsync (directly or through RequestPinAsync/PairAsync) when the configuration's ClientCertificatePath is unset and VidaaCertificate.Resolve cannot find the .p12 at the DefaultPath on disk.

Common situations: Fresh installation where the certificate was never extracted; user moved or deleted the .p12; configuration points at a stale path after reinstall; running in CI/container where the APK extraction step was skipped.

Understand the failure class

Related errors


AI-assisted analysis of mgth/LittleBigMouse@7a42f01d47 (2026-09-16). Data as JSON: /api/errors/febac1e125a7f992. Report an issue: GitHub.

Appendix: source

Thrown at LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/HisenseVidaa/HisenseVidaaService.cs:158

                // The projector can generate a PIN from its own Remote Control
                // settings. Connect without asking it to replace that PIN.
                await replacement.StartPairingAsync(ct, requestPin: false).ConfigureAwait(false);
            }
            catch
            {
                await replacement.DisposeAsync();
                throw;
            }
            await ReplaceClientAsync(id, replacement).ConfigureAwait(false);
            client = replacement;
        }
        await client.AuthenticateAsync(pin, ct); _store.Save(client.Configuration);
    }

    async Task PreparePairingAsync(HisenseVidaaConfiguration c, CancellationToken ct)
    {
        c.ClientCertificatePath = VidaaCertificate.Resolve(c.ClientCertificatePath);
        if (string.IsNullOrWhiteSpace(c.ClientCertificatePath)) throw VidaaCertificate.MissingException();
        if (string.IsNullOrWhiteSpace(c.ClientCertificatePassword))
            c.ClientCertificatePassword = VidaaCertificate.DefaultPassword;
        c.ControllerMacAddress = NetworkIdentity.ControllerMacFor(c.IpAddress);
        try
        {
            var device = await _discovery.FindAsync(c.IpAddress, ct).ConfigureAwait(false);
            c.IpAddress = device.IpAddress;
            c.ProtocolVersion = device.ProtocolVersion;
            c.Brand = device.Brand;
        }
        catch (HttpRequestException) when (c.ProtocolVersion is null
                                           && c.MonitorId.StartsWith("HEC002F", StringComparison.OrdinalIgnoreCase))
        {
            // Hisense C1 EDID. Its descriptor advertises RemoteNOW protocol 2160,
            // but the UPnP HTTP endpoint can disappear while MQTT remains usable.
            c.ProtocolVersion = 2160;
            c.Brand = "his";
        }

View on GitHub (pinned to 7a42f01d47)