pssh-tools
Advanced tools
Comparing version
import * as T from '../types'; | ||
interface KeyItem { | ||
kid: string; | ||
key: string; | ||
checksum: string; | ||
@@ -9,3 +10,3 @@ } | ||
export declare const decodeKey: (keyData: string) => string; | ||
export declare const encodeKey: (keyPair: T.KeyPair) => KeyItem; | ||
export declare const encodeKey: (keyPair: T.KeyPair, keySeed?: string) => KeyItem; | ||
export {}; |
@@ -21,3 +21,3 @@ "use strict"; | ||
// Microsoft GUID endianness | ||
const keyIdBuffer = swapEndian(keyId); | ||
const kidBuffer = swapEndian(keyId); | ||
// Truncate if key seed > 30 bytes | ||
@@ -30,3 +30,3 @@ const truncatedKeySeed = Buffer.alloc(30); | ||
// | ||
const shaA = Buffer.concat([truncatedKeySeed, keyIdBuffer], truncatedKeySeed.length + keyIdBuffer.length); | ||
const shaA = Buffer.concat([truncatedKeySeed, kidBuffer], truncatedKeySeed.length + kidBuffer.length); | ||
const digestA = crypto.createHash('sha256').update(shaA).digest(); | ||
@@ -37,3 +37,3 @@ // | ||
// | ||
const shaB = Buffer.concat([truncatedKeySeed, keyIdBuffer, truncatedKeySeed], (2 * truncatedKeySeed.length) + keyIdBuffer.length); | ||
const shaB = Buffer.concat([truncatedKeySeed, kidBuffer, truncatedKeySeed], (2 * truncatedKeySeed.length) + kidBuffer.length); | ||
const digestB = crypto.createHash('sha256').update(shaB).digest(); | ||
@@ -44,16 +44,16 @@ // | ||
// | ||
const shaC = Buffer.concat([truncatedKeySeed, keyIdBuffer, truncatedKeySeed, keyIdBuffer], (2 * truncatedKeySeed.length) + (2 * keyIdBuffer.length)); | ||
const shaC = Buffer.concat([truncatedKeySeed, kidBuffer, truncatedKeySeed, kidBuffer], (2 * truncatedKeySeed.length) + (2 * kidBuffer.length)); | ||
const digestC = crypto.createHash('sha256').update(shaC).digest(); | ||
// Calculate Content Key | ||
const contentBuffer = Buffer.alloc(DRM_AES_KEYSIZE_128); | ||
const keyBuffer = Buffer.alloc(DRM_AES_KEYSIZE_128); | ||
for (let i = 0; i < DRM_AES_KEYSIZE_128; i++) { | ||
let value = digestA[i] ^ digestA[i + DRM_AES_KEYSIZE_128] ^ digestB[i] ^ digestB[i + DRM_AES_KEYSIZE_128] ^ digestC[i] ^ digestC[i + DRM_AES_KEYSIZE_128]; | ||
contentBuffer[i] = value; | ||
keyBuffer[i] = value; | ||
} | ||
const kid = contentBuffer.toString('base64'); | ||
// Calculate checksum | ||
const cipher = crypto.createCipheriv('aes-128-ecb', contentBuffer, '').setAutoPadding(false); | ||
const checksum = cipher.update(keyIdBuffer).slice(0, 8).toString('base64'); | ||
const cipher = crypto.createCipheriv('aes-128-ecb', keyBuffer, '').setAutoPadding(false); | ||
const checksum = cipher.update(kidBuffer).slice(0, 8).toString('base64'); | ||
return { | ||
kid, | ||
kid: kidBuffer.toString('base64'), | ||
key: keyBuffer.toString('base64'), | ||
checksum | ||
@@ -63,3 +63,3 @@ }; | ||
const constructProXML4 = (keyPair, licenseUrl, keySeed) => { | ||
let key = keySeed && keySeed.length ? generateContentKey(keyPair.key, keySeed) : exports.encodeKey(keyPair); | ||
let key = keySeed && keySeed.length ? generateContentKey(keyPair.key, keySeed) : exports.encodeKey(keyPair, keySeed); | ||
let xmlArray = ['<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0">']; | ||
@@ -81,3 +81,3 @@ xmlArray.push('<DATA>'); | ||
let keyIds = keyPairs.map((k) => { | ||
return keySeed && keySeed.length ? generateContentKey(k.kid, keySeed) : exports.encodeKey(k); | ||
return keySeed && keySeed.length ? generateContentKey(k.kid, keySeed) : exports.encodeKey(k, keySeed); | ||
}); | ||
@@ -159,5 +159,6 @@ let xmlArray = ['<?xml version="1.0" encoding="UTF-8"?>']; | ||
}; | ||
exports.encodeKey = (keyPair) => { | ||
const keyBuffer = Buffer.from(keyPair.key, 'hex'); | ||
exports.encodeKey = (keyPair, keySeed = '') => { | ||
const kidBuffer = swapEndian(keyPair.kid); | ||
const key = keySeed && keySeed.length ? Buffer.from(generateContentKey(keyPair.kid, keySeed).key, 'base64').toString('hex') : keyPair.key; | ||
const keyBuffer = Buffer.from(key, 'hex'); | ||
const cipher = crypto.createCipheriv('aes-128-ecb', keyBuffer, '').setAutoPadding(false); | ||
@@ -167,2 +168,3 @@ const checksum = cipher.update(kidBuffer).slice(0, 8).toString('base64'); | ||
kid: kidBuffer.toString('base64'), | ||
key: swapEndian(key).toString('base64'), | ||
checksum | ||
@@ -169,0 +171,0 @@ }; |
{ | ||
"name": "pssh-tools", | ||
"version": "1.0.6", | ||
"version": "1.0.7", | ||
"description": "Tools to generate PSSH Data and PSSH Box", | ||
@@ -5,0 +5,0 @@ "main": "dist/src/index.js", |
Sorry, the diff of this file is not supported yet
47792
1.2%585
0.52%