multi-downloader-nx_mirror/modules/playready/xml_key.ts

45 lines
1.4 KiB
TypeScript

import BN from 'bn.js';
import { ec as EC } from 'elliptic';
import ECCKey from './ecc_key';
import ElGamal, { Point } from './elgamal';
export default class XmlKey {
private _sharedPoint: ECCKey;
public sharedKeyX: BN;
public sharedKeyY: BN;
public _shared_key_x_bytes: Uint8Array;
public aesIv: Uint8Array;
public aesKey: Uint8Array;
constructor() {
this._sharedPoint = ECCKey.generate();
this.sharedKeyX = this._sharedPoint.keyPair.getPublic().getX();
this.sharedKeyY = this._sharedPoint.keyPair.getPublic().getY();
this._shared_key_x_bytes = ElGamal.toBytes(this.sharedKeyX);
this.aesIv = this._shared_key_x_bytes.subarray(0, 16);
this.aesKey = this._shared_key_x_bytes.subarray(16, 32);
}
getPoint(curve: EC): Point {
return curve.curve.point(this.sharedKeyX, this.sharedKeyY);
}
}
// Make it more undetectable (not working right now)
// import { randomBytes } from 'crypto'
// export default class XmlKey {
// public aesIv: Uint8Array
// public aesKey: Uint8Array
// public bytes: Uint8Array
// constructor() {
// this.aesIv = randomBytes(16)
// this.aesKey = randomBytes(16)
// this.bytes = new Uint8Array([...this.aesIv, ...this.aesKey])
// console.log('XML key (AES/CBC)')
// console.log('iv:', Buffer.from(this.aesIv).toString('hex'))
// console.log('key:', Buffer.from(this.aesKey).toString('hex'))
// console.log('bytes:', this.bytes)
// }
// }