Fingerprint Pro Internals
Collector s95

EME session drift

sequential media key session ids, which expose the CDM in use

Group: Media and DRM · signal map · run it live

// s95 — sig_s95_atomics
// module cm, stage2, codes 0 -1 -2 -3
//
// measures
//   window.Atomics window.CSSRule window.Error
//   navigator.requestMediaKeySystemAccess("org.w3.clearkey") window.Document.prototype
//   window.Iterator window.SVGDocument navigator.requestMediaKeySystemAccess crypto
//   crypto.getRandomValues() document.removeEventListener("visibilitychange")
//   document.addEventListener("visibilitychange")
// engine
//   NaN Math.floor() Number() Math.random() Promise.race() Uint32Array Uint8Array Promise
// reported value
//   null value
// probes
//   "96375" "UNKNOWN_RULE" "audio/mp4" "fragmentDirective" "function" "isError" "network_connection"
//   "pause" "webm"
// compares against
//   < 10 === "function" === -1 >= 4 in "Iterator" in "SVGDocument" in "UNKNOWN_RULE"
//   in "fragmentDirective" in "isError" in "pause"
// decides on
//   h_s95_requestMediaKeySystemAccess()
//   v106[0] === -1
//   h_s95_requestMediaKeySystemAccess: typeof navigator.requestMediaKeySystemAccess === "function"
//   fn142: !((v957 = arg822.cancel) == null)
//   h_s95_requestMediaKeySystemAccess2: h_s95_atomics()
//   visibilitychange: !(v869 || v868)
//   visibilitychange: !v869 && v868
//   h_s95_atomics: fn36(["Iterator" in window, window.Error && "isError" in window.Error, window.Atomics && "pause" in window.Atomics, "network_connection".Document?.prototype && …
//   h_s95_fn3: Math.floor(fn64() * (arg995 - arg994 + 1)) + arg994
//
// 6 owned helpers inlined below.
// shared with other collectors, see agent.clean.js:
//   fn142:7227 fn158:8266 fn21:656 fn36:1793 fn64:3826 fn66:3854 uint32Array:2786
//   visibilitychange:6423

// agent.clean.js:551
async function sig_s95_atomics() {
  return h_s95_requestMediaKeySystemAccess()
    ? fn142(fn66(500, { s: -2, v: null }), async () => {
        const v106 = await h_s95_requestMediaKeySystemAccess2();
        if (v106[0] === -1) {
          return { s: -3, v: null };
        }
        return { s: 0, v: v106 };
      })
    : () => ({ s: -1, v: null });
}

// agent.clean.js:1613
async function h_s95_fn(arg244, arg245) {
  const v302 = arg244.createSession();
  await v302.generateRequest("webm", arg245);
  return Number(v302.sessionId);
}

// agent.clean.js:1671
function h_s95_requestMediaKeySystemAccess() {
  return typeof navigator.requestMediaKeySystemAccess === "function";
}

// agent.clean.js:3970
function h_s95_atomics() {
  return (
    fn36([
      "Iterator" in window,
      window.Error && "isError" in window.Error,
      window.Atomics && "pause" in window.Atomics,
      "network_connection".Document?.prototype && "fragmentDirective" in window.Document.prototype,
      window.CSSRule && !("UNKNOWN_RULE" in window.CSSRule),
      !("SVGDocument" in window),
    ]) >= 4
  );
}

// agent.clean.js:7093
async function h_s95_requestMediaKeySystemAccess2() {
  if (h_s95_atomics()) {
    return [-1, NaN];
  }
  const uint8Array19 = new Uint8Array([0]),
    v940 = [{ initDataTypes: ["webm"], audioCapabilities: [{ contentType: "audio/mp4" }] }],
    v941 = await navigator.requestMediaKeySystemAccess("org.w3.clearkey", v940),
    v942 = await v941.createMediaKeys();
  let v943 = await h_s95_fn(v942, uint8Array19);
  const v944 = v943 < 10;
  if (v944) {
    const v945 = h_s95_fn3(10, 2500) - v943 - 1;
    for (let v946 = 0; v946 < v945; v946++) {
      h_s95_fn2(v942, uint8Array19);
    }
    v943 = await h_s95_fn(v942, uint8Array19);
  }
  return [v944 ? 1 : 0, v943];
}

// agent.clean.js:8128
function h_s95_fn2(arg909, arg910) {
  const v1026 = arg909.createSession();
  fn21(v1026.generateRequest("webm", arg910));
}

// agent.clean.js:8957
function h_s95_fn3(arg994, arg995) {
  return Math.floor(fn64() * (arg995 - arg994 + 1)) + arg994;
}