function extractBMFFKeyID()

in 2019/lib/eme/encryptedMediaPortability.js [111:151]


function extractBMFFKeyID(initData, clearkey, widevine) {
  // Accessing the Uint8Array's underlying ArrayBuffer is impossible, so we
  // copy it to a new one for parsing.
  var abuf = new ArrayBuffer(initData.length);
  var view = new Uint8Array(abuf);
  view.set(initData);

  var dv = new DataView(abuf);
  var pos = 0;
  while (pos < abuf.byteLength) {
    var box_size = dv.getUint32(pos, false);
    var type = dv.getUint32(pos + 4, false);

    if (type != 0x70737368)
      throw 'Box type ' + type.toString(16) + ' not equal to "pssh"';

    // Scan for Clear Key header.
    if (clearkey) {
      if ((dv.getUint32(pos + 12, false) == 0x58147ec8) &&
          (dv.getUint32(pos + 16, false) == 0x04234659) &&
          (dv.getUint32(pos + 20, false) == 0x92e6f52c) &&
          (dv.getUint32(pos + 24, false) == 0x5ce8c3cc)) {
        var size = dv.getUint32(pos + 28, false);
        if (size != 16) throw 'Unexpected KID size ' + size;
        return new Uint8Array(abuf.slice(pos + 32, pos + 32 + size));
      }
    }

    // Scan for Widevine header.
    if (widevine) {
      if ((dv.getUint32(pos + 12, false) == 0xedef8ba9) &&
          (dv.getUint32(pos + 16, false) == 0x79d64ace) &&
          (dv.getUint32(pos + 20, false) == 0xa3c827dc) &&
          (dv.getUint32(pos + 24, false) == 0xd51d21ed)) {
        return new Uint8Array(abuf.slice(pos + 36, pos + 52));
      }
    }
    pos += box_size;
  }
  return false;
}