58 lines
1.6 KiB
C#
58 lines
1.6 KiB
C#
|
namespace CRD.Utils.DRM;
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
|
|||
|
class PSSHBox{
|
|||
|
static readonly byte[] PSSH_HEADER = new byte[]{ 0x70, 0x73, 0x73, 0x68 };
|
|||
|
|
|||
|
public List<byte[]> KIDs{ get; set; } = new List<byte[]>();
|
|||
|
public byte[] Data{ get; set; }
|
|||
|
|
|||
|
PSSHBox(List<byte[]> kids, byte[] data){
|
|||
|
KIDs = kids;
|
|||
|
Data = data;
|
|||
|
}
|
|||
|
|
|||
|
public static PSSHBox FromByteArray(byte[] psshbox){
|
|||
|
using var stream = new System.IO.MemoryStream(psshbox);
|
|||
|
|
|||
|
stream.Seek(4, System.IO.SeekOrigin.Current);
|
|||
|
byte[] header = new byte[4];
|
|||
|
stream.Read(header, 0, 4);
|
|||
|
|
|||
|
if (!header.SequenceEqual(PSSH_HEADER))
|
|||
|
throw new Exception("Not a pssh box");
|
|||
|
|
|||
|
stream.Seek(20, System.IO.SeekOrigin.Current);
|
|||
|
byte[] kidCountBytes = new byte[4];
|
|||
|
stream.Read(kidCountBytes, 0, 4);
|
|||
|
|
|||
|
if (BitConverter.IsLittleEndian)
|
|||
|
Array.Reverse(kidCountBytes);
|
|||
|
uint kidCount = BitConverter.ToUInt32(kidCountBytes);
|
|||
|
|
|||
|
List<byte[]> kids = new List<byte[]>();
|
|||
|
for (int i = 0; i < kidCount; i++){
|
|||
|
byte[] kid = new byte[16];
|
|||
|
stream.Read(kid);
|
|||
|
kids.Add(kid);
|
|||
|
}
|
|||
|
|
|||
|
byte[] dataLengthBytes = new byte[4];
|
|||
|
stream.Read(dataLengthBytes);
|
|||
|
|
|||
|
if (BitConverter.IsLittleEndian)
|
|||
|
Array.Reverse(dataLengthBytes);
|
|||
|
uint dataLength = BitConverter.ToUInt32(dataLengthBytes);
|
|||
|
|
|||
|
if (dataLength == 0)
|
|||
|
return new PSSHBox(kids, null);
|
|||
|
|
|||
|
byte[] data = new byte[dataLength];
|
|||
|
stream.Read(data);
|
|||
|
|
|||
|
return new PSSHBox(kids, data);
|
|||
|
}
|
|||
|
}
|