Support kid:key for drm

pull/210/head
FongMi 2 years ago
parent 8cad2d0ea0
commit 3c10066749
  1. 12
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  2. 5
      app/src/main/java/com/fongmi/android/tv/api/LiveParser.java
  3. 16
      app/src/main/java/com/fongmi/android/tv/bean/Drm.java
  4. 10
      catvod/src/main/java/com/github/catvod/utils/Util.java

@ -69,11 +69,11 @@ public class Decoder {
SecretKeySpec spec = new SecretKeySpec(padEnd(key).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, spec);
return new String(cipher.doFinal(decodeHex(data)), StandardCharsets.UTF_8);
return new String(cipher.doFinal(Util.hex2byte(data)), StandardCharsets.UTF_8);
}
private static String cbc(String data) throws Exception {
String decode = new String(decodeHex(data)).toLowerCase();
String decode = new String(Util.hex2byte(data)).toLowerCase();
String key = padEnd(decode.substring(decode.indexOf("$#") + 2, decode.indexOf("#$")));
String iv = padEnd(decode.substring(decode.length() - 13));
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
@ -81,7 +81,7 @@ public class Decoder {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
data = data.substring(data.indexOf("2324") + 4, data.length() - 26);
byte[] decryptData = cipher.doFinal(decodeHex(data));
byte[] decryptData = cipher.doFinal(Util.hex2byte(data));
return new String(decryptData, StandardCharsets.UTF_8);
}
@ -99,10 +99,4 @@ public class Decoder {
private static String padEnd(String key) {
return key + "0000000000000000".substring(key.length());
}
private static byte[] decodeHex(String s) {
byte[] bytes = new byte[s.length() / 2];
for (int i = 0; i < bytes.length; i++) bytes[i] = Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).byteValue();
return bytes;
}
}

@ -59,15 +59,16 @@ public class LiveParser {
Setting setting = Setting.create();
Channel channel = Channel.create("");
for (String line : text.split("\n")) {
setting.check(line);
if (Thread.interrupted()) break;
if (line.startsWith("#EXTINF:")) {
Group group = live.find(Group.create(extract(line, GROUP)));
channel = group.find(Channel.create(extract(line, NAME)));
channel.setLogo(extract(line, LOGO));
setting.copy(channel).clear();
} else if (line.contains("://")) {
setting.copy(channel).clear();
channel.getUrls().add(line);
} else {
setting.check(line);
}
}
}

@ -31,6 +31,10 @@ public class Drm {
return TextUtils.isEmpty(key) ? "" : key;
}
public void setKey(String key) {
this.key = key;
}
private String getType() {
return TextUtils.isEmpty(type) ? "" : type;
}
@ -43,9 +47,21 @@ public class Drm {
private String getUri() {
if (getKey().startsWith("http")) return getKey();
if (!getKey().startsWith("{") && getKey().contains(":")) convert();
return Server.get().getAddress("license/") + Util.base64(getKey());
}
private void convert() {
String[] split = getKey().split(":");
String kid = getBase64(split[0]);
String key = getBase64(split[1]);
setKey(String.format("{ \"keys\":[ { \"kty\":\"oct\", \"k\":\"%s\", \"kid\":\"%s\" } ], \"type\":\"temporary\" }", key, kid));
}
private String getBase64(String s) {
return Util.base64(Util.hex2byte(s)).replace("=", "");
}
public MediaItem.DrmConfiguration get() {
return new MediaItem.DrmConfiguration.Builder(getUUID()).setLicenseUri(getUri()).build();
}

@ -24,8 +24,8 @@ public class Util {
public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36";
public static String base64(String ext) {
return base64(ext.getBytes());
public static String base64(String s) {
return base64(s.getBytes());
}
public static String base64(byte[] bytes) {
@ -36,6 +36,12 @@ public class Util {
return "Basic " + base64(uri.getUserInfo());
}
public static byte[] hex2byte(String s) {
byte[] bytes = new byte[s.length() / 2];
for (int i = 0; i < bytes.length; i++) bytes[i] = Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).byteValue();
return bytes;
}
public static boolean equals(String name, String md5) {
return md5(Path.jar(name)).equalsIgnoreCase(md5);
}

Loading…
Cancel
Save