Fingerprint Pro Internals
Collector s167

Widevine CDM probe

an EME exchange that reaches the Widevine CDM, which is device bound

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

// s167 — sig_s167_atob
// module cm, stage1, codes 0 -1 -2 -3 -4 -5 -6
//
// measures
//   atob() window.clearTimeout() window.setTimeout() navigator.brave
//   navigator.requestMediaKeySystemAccess() window.MediaKeys window.MSMediaKeys
//   document.featurePolicy btoa() navigator.mediaCapabilities.decodingInfo()
//   navigator.requestMediaKeySystemAccess navigator.mediaCapabilities
// engine
//   Math.max() Object.prototype.hasOwnProperty.call String.fromCharCode.apply() Math.min() RegExp
//   String() Math.ceil() Object.assign()
// reported value
//   call null
// probes
//   "..." "CreateCdmFunc not available" "cenc" "drm" "message" "name" "object"
// compares against
//   == "function" == "object" === -1 === 2 in "message" in "name"
// decides on
//   !arg623
//   fn150: readVaultedProp(arg898, "drm") || (arg898.drm = {})
//   h_s167_fn: v74.s === -1
//   readVaultedProp: typeof v316 == "function"
//   comWidevineAlpha: !fn147() || !fn39()
//   comWidevineAlpha: !(await fn130())
//   h_s167_fn3: v660 == null
//   h_s167_fn3: new RegExp("CreateCdmFunc not available").test(v661)
//   h_s167_fn5: v885 !== undefined
//   h_s167_fn5: !v886
//   h_s167_fn5: arg767.message.byteLength === 2
//   h_s167_fn6: arg842 && typeof arg842 == "object" && "message" in arg842
//   h_s167_fn6: "name" in arg842
//   h_s167_fn2: arg354.length <= arg355
//
// 7 owned helpers inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 base64Encode:8766 comWidevineAlpha:4347 crc32OfBytes:4943 fn102:5647
//   fn106:5738 fn11:419 fn12:432 fn130:6824 fn141:7220 fn147:7758 fn150:8043 fn23:692 fn39:1826
//   fn46:3216 fn48:3370 fn71:4148 fn9:252 fn98:5440 readVaultedProp:1674 resolveNameByHash:7015
//   stringToBytes:7901

// agent.clean.js:262
async function h_s167_fn(arg40) {
  const v72 = await comWidevineAlpha(arg40, false);
  switch (v72.s) {
    case -3:
      return { s: -4, v: null };
    case -1:
      return { s: -1, v: null };
    case -2:
      return { s: -3, v: null };
  }
  const v73 = base64Decode(
      "CAUSxwUKwQIIAxIQFwW5F8wSBIaLBjM6L3cqjBiCtIKSBSKOAjCCAQoCggEBAJntWzsyfateJO/DtiqVtZhSCtW8yzdQPgZFuBTYdrjfQFEEQa2M462xG7iMTnJaXkqeB5UpHVhYQCOn4a8OOKkSeTkwCGELbxWMh4x+Ib/7/up34QGeHleB6KRfRiY9FOYOgFioYHrc4E+shFexN6jWfM3rM3BdmDoh+07svUoQykdJDKR+ql1DghjduvHK3jOS8T1v+2RC/THhv0CwxgTRxLpMlSCkv5fuvWCSmvzu9Vu69WTi0Ods18Vcc6CCuZYSC4NZ7c4kcHCCaA1vZ8bYLErF8xNEkKdO7DevSy8BDFnoKEPiWC8La59dsPxebt9k+9MItHEbzxJQAZyfWgkCAwEAAToUbGljZW5zZS53aWRldmluZS5jb20SgAOuNHMUtag1KX8nE4j7e7jLUnfSSYI83dHaMLkzOVEes8y96gS5RLknwSE0bv296snUE5F+bsF2oQQ4RgpQO8GVK5uk5M4PxL/CCpgIqq9L/NGcHc/N9XTMrCjRtBBBbPneiAQwHL2zNMr80NQJeEI6ZC5UYT3wr8+WykqSSdhV5Cs6cD7xdn9qm9Nta/gr52u/DLpP3lnSq8x2/rZCR7hcQx+8pSJmthn8NpeVQ/ypy727+voOGlXnVaPHvOZV+WRvWCq5z3CqCLl5+Gf2Ogsrf9s2LFvE7NVV2FvKqcWTw4PIV9Sdqrd+QLeFHd/SSZiAjjWyWOddeOrAyhb3BHMEwg2T7eTo/xxvF+YkPj89qPwXCYcOxF+6gjomPwzvofcJOxkJkoMmMzcFBDopvab5tDQsyN9UPLGhGC98X/8z8QSQ+spbJTYLdgFenFoGq47gLwDS6NWYYQSqzE3Udf2W7pzk4ybyG4PHBYV3s4cyzdq8amvtE/sNSdOKReuHpfQ=",
    ),
    v74 = await h_s167_fn3(readVaultedProp(v72, "v"));
  if (v74.s === -1) {
    return { s: -6, v: null };
  }
  return { s: 0, v: base64Encode(await h_s167_fn5(readVaultedProp(v74, "v"), v73)) };
}

// agent.clean.js:3032
function h_s167_fn2(arg354, arg355, arg356 = "...") {
  return arg354.length <= arg355
    ? arg354
    : `${arg354.slice(0, Math.max(0, arg355 - arg356.length))}${arg356}`;
}

// agent.clean.js:4718
async function h_s167_fn3(arg593) {
  try {
    return { s: 0, v: await arg593.createMediaKeys() };
  } catch (v660) {
    const v661 = String((v660 == null ? undefined : readVaultedProp(v660, "message")) ?? v660);
    if (new RegExp("CreateCdmFunc not available").test(v661)) {
      return { s: -1, v: null };
    }
    throw v660;
  }
}

// agent.clean.js:4940
function h_s167_fn4(arg617) {
  return { e: h_s167_fn6(arg617) };
}

// agent.clean.js:5004
function sig_s167_atob({ cache: arg622, esc: arg623 = true }) {
  if (!arg623) {
    return { s: -5, v: null };
  }
  const v708 = { s: -2, v: null },
    v709 = fn150(arg622);
  h_s167_fn(v709)
    .then((arg624) => {
      fn98(v708, arg624);
    })
    .catch((arg625) => fn98(v708, h_s167_fn4(arg625)));
  return v708;
}

// agent.clean.js:6586
async function h_s167_fn5(arg763, arg764) {
  const v882 = arg763.createSession();
  try {
    const v883 = new Promise((arg765, arg766) => {
        let v885,
          v886 = false;
        const v887 = () => {
            v886 = true;
            if (v885 !== undefined) {
              window.clearTimeout(v885);
            }
            v882.removeEventListener("message", v888);
          },
          v888 = (arg767) => {
            if (!v886)
              if (arg767.message.byteLength === 2) {
                v882.update(arg764).catch((arg768) => {
                  v887();
                  arg766(arg768);
                });
              } else {
                v887();
                const uint8Array18 = new Uint8Array(arg767.message);
                arg765(uint8Array18);
              }
          };
        v882.addEventListener("message", v888);
        v885 = window.setTimeout(() => {
          if (!v886) {
            v887();
          }
        }, 5e3);
      }),
      v884 = base64Decode(
        "AAAARHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACQIARIBMRoNd2lkZXZpbmVfdGVzdCIKMjAxNV90ZWFycyoCU0Q=",
      );
    await v882.generateRequest("cenc", v884);
    return await v883;
  } finally {
    try {
      await v882.close();
    } catch (v889) {}
  }
}

// agent.clean.js:7421
function h_s167_fn6(arg842) {
  let v973;
  try {
    if (arg842 && typeof arg842 == "object" && "message" in arg842) {
      v973 = String(arg842.message);
      if ("name" in arg842) {
        v973 = `${arg842.name}: ${v973}`;
      }
    } else {
      v973 = String(arg842);
    }
  } catch (v974) {
    v973 = `Code 3017: ${v974}`;
  }
  return h_s167_fn2(v973, 500);
}

// agent.clean.js:8890
function base64Decode(arg982) {
  const text8 = atob(arg982),
    v1128 = text8.length,
    uint8Array24 = new Uint8Array(v1128);
  for (let v1129 = 0; v1129 < v1128; v1129++) {
    uint8Array24[v1129] = text8.charCodeAt(v1129);
  }
  return uint8Array24;
}