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;
}