384 lines
21 KiB
Java
384 lines
21 KiB
Java
// Copyright 2021 Google LLC. All rights reserved.
|
|
|
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
|
|
|
import com.google.video.widevine.sdk.wvpl.WvPLCASProxyEnvironment;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLCASProxySession;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLCasKey;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLClientCapabilities;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLClientInfo;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLDeviceInfo;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLHdcp;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLKeyType;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLLicenseCategory;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLLicenseCategorySpec;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLMessageType;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLOutputProtection;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLPlaybackPolicy;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLRequestType;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLSessionInit;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLStatus;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLStatusException;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLTrackType;
|
|
import com.google.video.widevine.sdk.wvpl.WvPLWidevinePsshData;
|
|
import java.io.BufferedReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Paths;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Base64;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
public class WvPLCASProxyUsingGroupLicenseExample {
|
|
static final String B64_DRM_SERVICE_CERTIFICATE_WITH_CAS_PROXY_TYPE =
|
|
"CrwCCAMSELBFY1_OQaWD87swUMHQjTMY0Ont7AUijgIwggEKAoIBAQCUNggP3JYvTaepEoHfiG32zOEbimIPtzmjTsu-"
|
|
+ "3mOyXn3iA_d-aL6PnCqB0ORWvHld-xkRGHUUCSMAX0stvi-vTAd7e5fdMTXVtDbmj4o2fYDfp0klk3qj3OS7-X"
|
|
+ "H-z2musgRkbzZTzpH8MzUnLRHz97TMx46bwYyL8SskrvnaWwyPBhkDfmAoNQKSVuLZNc6snfOAE4hNCdB4Qq-H"
|
|
+ "TgC3FIl-1Kt4svUUPL4LYAzpKG5xH2r6ol0PQGSIKQ2qhJ-dyXLgDZcFLYdKd7hnKD1yUpvv8tGdHwcXawq7B-"
|
|
+ "eLitKy0gRJx1nyMmLQ-RG31FBEfR6Gtatzcs2OTyoZuktzAgMBAAE6DXdpZGV2aW5lX3Rlc3RABBKAAwtMdfh-"
|
|
+ "yBur-Ivq7rz_00RR8vA4MPJOPR3sZXDVFRQsATRvqUVPCTP88hh6Y7Y3IdHTEfXgcjiz2GZqEOvXzl3iuWkSjN"
|
|
+ "QjNl5ghk955VIryOdzkIYBZJIv4_eEon2RRflExbv4y2GuWxTxHxMmIrFKXF-w2fLSvpiy1qT5daHPIcdvRBDH"
|
|
+ "wIAVbmNmfv2EXoAqbvBWLhOdA8IRd5Lylqa8SWsUgkuyt9mglUdno6h_WCXZBm99eTfuN66ls-rJrlDgUNO3OU"
|
|
+ "OXpMYMI8jE4Neo4GF8AKXoyt0lcckHwynzdlSYa04V6vbPMNycO-u1wpnUAPqkXYbnoYnbjm5gJ7Vav5wJtUM4"
|
|
+ "wFAREefRmS_Dz_kqspC1CxQXo10KZQm3b4QXc_S0cqNXM_R9NGct0qjUdKec_k1RfC1j7MckdZMg4oU-mnqmwO"
|
|
+ "ZS7jTNIaHS4ASTuicsDUsfX1Ac4eqGv1L3qEY4pipCOps-5mRJ3sCjz87cX8QnPsArgtFYSYPgAg==";
|
|
static final String B64_PRIVATE_KEY_WITH_CAS_PROXY_TYPE =
|
|
"MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI5Qd3AH24lskCAggAMB0GCWCGSAFlAwQBKgQQ9X4D3HPW"
|
|
+ "x35HsgzSgMWCzASCBNBDZGDdRs_hyeRTrca0H4UERbrKRYFsoce9n6-cghmLtIzAn8pYdGH_jfj5Hc3HTo9aXx"
|
|
+ "fJJz9Juckh9teStzVmA-8y2Qj7W8W243DjbyNyKKDzk9esQme5sVvNugEb8wiqraZ0q4KxfjcK60HsZrOK1Ise"
|
|
+ "0TglQMvudrDzV3vTxtgP5LTer6wEnUjfGixzhL120X48me-1stTPeG2ji9zlsgmMCjYCEbe4ovMCZmVOaHnbQ3"
|
|
+ "WNVVnMnVQCqCAmBg_0AKgYB9wvvy7vdRaFHv0EtmyCOegLToNE0I7L5LMcL4-HQ--bwQMHjVkDmIqB3s3XWyhN"
|
|
+ "U_nneES3qpgAbKpObfPGs814BqjbKwGj6z8jrNJ9Lmlaj_7msphYCuOAEjc26CEmxMYG1dTe-XiluHGIVunau6"
|
|
+ "iL7OguAdgbhkc2MQ7XJISjQ8j2sYuryUW33Pn2JSoKa4vVCWxTwg2t86Mc3FJ_daLM_z_kqTh5zel6o05tGXgH"
|
|
+ "hn2UGRTjAs3PgxzExUX6M2_-6uSmdnS4oWxAqVd9ZREMjZaSBY6qPdXyM-Wd2RmUfLNSO3aazLxWu8uH2nbud_"
|
|
+ "3vLyMSj_7lLjtAATqDKrcr1PyNlrn0MTQWIUZ4S5rsHHtprPB_v-7Ufh4OVPdyWfapBGJLx8Eg0Xscoxc_DpwA"
|
|
+ "D9KoA62GGg2CPu4NvvHiFIvEkpsxNFGTEAbZfoXXw78GP370doSguKvbTI3INcguKM35pbpe7-gbU8BjSednsl"
|
|
+ "bQMk4QKFg0YIQmTPDVXAC7FVnyP_dlNf2RXQRObGBGvA_oWv62iz8d3UhpIJOFHeyNic-qoQTj6wRFcxdFR61J"
|
|
+ "hvqZ8rM_KHJl_pvazrhMJ4JAQJXWhQzOvp4rqAJ7Jfx1u_pF_ZRZ6AX2Rjec-xep4EaqRZPdfEUydKKlr10IIc"
|
|
+ "_kNQwU15m0UEE_40wDJ3XqrhKuUnPfHpm4cziFYsQPrfuI36MCKklPvjdWS6VdSA-evN6KBZwD3RQh4jdzTxWf"
|
|
+ "zN-0p9612jIwzUzZj8Zax-TRRaOaN-0-nuPsmR88Ps4Y8AE2-CocYykAD8jh5WbuZKJDEtrNsIfz6keNZVk5ji"
|
|
+ "1JWcpwzbPk9L_A8MdZh5XBA7X-BLe2F6EIVgI3mwTUPSC8wpoGsc4Hu2VeePzOuuZ59IGSmDkyi68usMQzsVeq"
|
|
+ "2VJyz4UpDgy5dC5EOcBHLf3_oiAoxuYu6MIXLk-srrO8-mikdRcey9EzmK9uqMV1e4b7Ts7hdIglBij1QwIKbD"
|
|
+ "mMDMnmnPGX9X5KJojYuxkboe4WWwUgloyRkwxqKWIuEhLirO7E9eS-OOeqtz0idkcMNWziJRiUkVh768T4yfOf"
|
|
+ "Z8ZvOCx59YN8bL390OZIIdaxSvj5mGeQX2-DTDspxDLpiluDJzTQmH7UZsSQ9DlQiXBtJwuaiFoRsyr0b1hh6n"
|
|
+ "yE1TibcD_mWuwMOanUnvGF7OzRyneki4aB-v_PwpvplIDQuRqmkjn9i5P7tl6msEMUhp0yBE2tQIYPbQlIw57n"
|
|
+ "3wRcGOz9ymOrREzEW1UhZQBibr8ZFNoWzRt-k0EVLYzNt96NDtHfHc7AlxJv8ERIDOZ4ai_nNeLgtV76-ybXnT"
|
|
+ "RqRO9TXwqZhHQ_7gEs4Y01IJxvEQ==";
|
|
static final String PASSPHRASE = "encryptallthekitties";
|
|
static final String PROVIDER_IV = "d58ce954203b7c9a9a9d467f59839249";
|
|
static final String PROVIDER_KEY = "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f9"
|
|
+ "47ab9";
|
|
static final String B64_LICENSE_REQUEST_WITH_GROUP_ID =
|
|
"CAcS8QsKowsIARLrCQquAggCEhCmtANA4NnoLls7_9gZFKkZGJeNyOYFIo4CMIIBCgKCAQEAnI1PFI4ighGr3ZFRh8Gk"
|
|
+ "8WAIhphh-iVb48L7QYMwdszHvPTCxBwXPmw_KSsfBHrJviVOp_VO53zns0kKvcHUjqQpcRrSBlpd3b-2RK-twI"
|
|
+ "f6H3JtxCeT4GQFQ-Ey4GvQvLiGb4eg_WjsYoDU2f9nlIUBPcE5Yi4qhorl75JOiI3TI9hiCN9wlNjl7cnylcbE"
|
|
+ "lSc2TYCcC3KUSCppPdBEsUkq60MG2RjZYYtdO-wrdekRTFYTZq6hZrcoIe9s6uDDpaCNW5FmJ5V88T-hs1y3dz"
|
|
+ "lXouNIdru2CK1tEoQYZQmBeSYKtOTuNeOHYj6yjYPyxBXE1WZqp-6yULEPdZ3igwIDAQABKOg9EoACKrZ9-iTj"
|
|
+ "Lu1SSv4PcF1oGcp6jbyY-ntNFnjw-u6veF7O6YiqUEYcxvYiZ8CoJFzknsFnmyvp9z0PzTBgSt-eHhxoKXFzs2"
|
|
+ "Ix26pu3uIWjiMlNx7LcceS2b6ny35C0AfdNAgq9k5L-bXVuRxfXzUeyD9AonGXodNVWUDobD5oqXL7N8-cHx9K"
|
|
+ "yC76T2BTUkIQmOa_R9_kBznpHMsh67PCcO75Kt14xMnm53nCTDBGrANJb-jLlvkmNomg96phP38UgXyg-oUwdg"
|
|
+ "ioU6WMNm9HWzrvHv_o1-aogodilB5LAhPk7rb8HLlvjX8MWRgfV0Wyhgmw-CI7GxOlmpVyX97B5hq0BQquAggB"
|
|
+ "EhBlgCybYl5aMZwz3By3w8bUGOOlvdAFIo4CMIIBCgKCAQEAuAUCBDwqig_Y0lxhPh4-O140nzMvBFFqdRDTgC"
|
|
+ "GlYpuaoCeurTx1m3r-cL7WXz32hg_162C5g6P_oz_eBvO3MBTfyEWrNxxmAFYunZBPhCuLpKXZIA_6PtRdcFUg"
|
|
+ "pcNyqIn54xQ4YjTGiXrmVYUfzZrbTvkSbHg4bqk7yyW6PsR1xVxgjnccdjqwJQb5sHJS1qv36mSx6957lcZAdp"
|
|
+ "BTO9aJC5J0wWBm90_EAeo1XwoCEGgU1JvwyJ5uH42ypHhBzQ2teTKWoQfDYiNATyvx_KFv0KS5gmNNtiQH-PFK"
|
|
+ "yuOwWgOL0-S7uuQ5G7-npH-50B3oV-qI5eNu424kWFn8DwIDAQABKOg9EoADfgZYGgGRhKtXKv3K3dA_Fhzmgg"
|
|
+ "D45vitFhlHNgvI1JwNaACbHEZE-bPz-23f2S75LeYtQdRZ0p2Bv67zlwo6OdJbJmLssDstp7aDAvqm3ZjZWhQ8"
|
|
+ "yMHLat2nbS7pw3I_r5WinNw-lotoIakcBRyigKhmaXEKGtekS_khgCdGDfaU4uknA5bfIhlj8h7mqiIKXuSk0P"
|
|
+ "6z1T61cy-PkempazuL4oTFEznqKE1NDt1Vtq1W90FkIOBeBZ-XNKlr4lqkRWDbqMOHVaQqgr1_iO3RnfNGpmez"
|
|
+ "O4EUx2qIOMQj2CSlCyMlGgiBNtbo9HUpnSr9Rs6lG1y994mlchJc0k-7gTs4ehDNKjDjRHY0qzQI-Wuc89mIlt"
|
|
+ "QF8_VA2cV5YnYPzRd83RAeuKQUi5wpztXq1kWpW2mPHNxuHbZni4UHQYYIDWjRPNN-B7Ft43DNmvubJVZKc6MO"
|
|
+ "KvgIXqN9MQxHTw5nrADKmSpSlvrtrXqgbs15Dx49QmVY-pg4PjzS7UgwGhMKDGNvbXBhbnlfbmFtZRIDd3d3Gh"
|
|
+ "EKCm1vZGVsX25hbWUSA3d3dxogCgxwcm9kdWN0X25hbWUSEFdpZGV2aW5lQ2FzVGVzdHMaJgoRYXJjaGl0ZWN0"
|
|
+ "dXJlX25hbWUSEWFyY2hpdGVjdHVyZV9uYW1lGhoKC2RldmljZV9uYW1lEgtkZXZpY2VfbmFtZRofChR3aWRldm"
|
|
+ "luZV9jZG1fdmVyc2lvbhIHZ28tdGVzdDICKBASOQo3CjMaDXdpZGV2aW5lX3Rlc3QiCkNhc1RzR3JvdXBYAWoJ"
|
|
+ "Q2FzR3JvdXAxaglDYXNHcm91cDIQAxgBIMK_1YUGMBU4pNrohw8agAJKmxx2xhQgthsAcZtpmES323mFQBlvWc"
|
|
+ "4mdt5W45hVPlbKb4PMKSkGl-_TjQKRlyu_gd6ZC0fbJSdeWVI148ZbJhZBJm3_KgqwH3mPGQzpglgY8kU-3DqK"
|
|
+ "UC-8CmhN41ipgok1qwCJyrODL1BG_YYC_RixRYYxsMQcc8Fkrd962NSuwAr1Jr64UyQWWj9ZGluk0mvB6hwMTK"
|
|
+ "VQiCPwmQE0EQ3ZXZXMdi5JOwT6_RCAfXjhA7ExQ8MGLAxJ6E6FyjC6PdkBpm3jzSptq7CsOADzgTmrnqZKXT6O"
|
|
+ "ft-ajciJDybO4WnjyrTmK6f6PPwIOp2Ud4ok5qLnYFqo0fu86a9DShQAAAABAAAAFAAEABDw-i0kAAAAIA==";
|
|
|
|
/* Creates WvTestRunner to run wvpl proxy test */
|
|
public static String loadCertificateStatusListFromFile(String certificateStatusListFile)
|
|
throws IOException {
|
|
BufferedReader br = Files.newBufferedReader(Paths.get(certificateStatusListFile), UTF_8);
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
br.close();
|
|
return sb.toString();
|
|
}
|
|
|
|
public static void groupLicenseRequestGeneration(WvPLCASProxySession session) {
|
|
WvPLPlaybackPolicy policy = new WvPLPlaybackPolicy();
|
|
policy.setLicenseDurationSeconds(604800);
|
|
policy.setPlaybackDurationSeconds(86400);
|
|
session.setPolicy(policy);
|
|
System.out.println(
|
|
"License Duration Seconds = " + session.getPolicy().getLicenseDurationSeconds());
|
|
System.out.println(
|
|
"Playback duration Seconds = " + session.getPolicy().getPlaybackDurationSeconds());
|
|
|
|
// Add keys for one group.
|
|
// Assume keys in this example are entitlement keys created for group.
|
|
WvPLCasKey key1 = new WvPLCasKey();
|
|
|
|
byte[] oddGroupKeyId = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
|
|
key1.setOddKeyId(oddGroupKeyId);
|
|
byte[] oddGroupKeyBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
|
|
key1.setOddKeyBytes(oddGroupKeyBytes);
|
|
byte[] evenGroupKeyId = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
|
|
key1.setEvenKeyId(evenGroupKeyId);
|
|
byte[] evenGroupKeyBytes = {16, 15, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
|
|
key1.setEvenKeyBytes(evenGroupKeyBytes);
|
|
key1.setTrackType(WvPLTrackType.TrackType.VIDEO_HD);
|
|
key1.setKeyType(WvPLKeyType.KeyType.ENTITLEMENT);
|
|
WvPLOutputProtection requiredOutputProtection = new WvPLOutputProtection();
|
|
|
|
// Set required output protection fields.
|
|
requiredOutputProtection.setSecuredataPath(true);
|
|
requiredOutputProtection.setDisableAnalogOutput(true);
|
|
// Set output protection on the Cas key.
|
|
key1.setOutputProtection(requiredOutputProtection);
|
|
|
|
// Add WvPLCasKey to WvPLSession.
|
|
WvPLStatus status = session.addKey(key1);
|
|
|
|
WvPLCasKey key2 = new WvPLCasKey();
|
|
evenGroupKeyId = new byte[] {10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
|
|
evenGroupKeyBytes = new byte[] {10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
|
|
key2.setEvenKeyId(evenGroupKeyId);
|
|
key2.setEvenKeyBytes(evenGroupKeyBytes);
|
|
key2.setTrackType(WvPLTrackType.TrackType.VIDEO_SD);
|
|
|
|
status = session.addKey(key2);
|
|
|
|
List<WvPLCasKey> wvplCasKeys = session.getKeys();
|
|
|
|
// Validate setting/getting sessionInit values.
|
|
WvPLSessionInit sessionInit = new WvPLSessionInit();
|
|
String testSessionId = "TestSessionId";
|
|
String testPurchaseId = "TestPurchaseId";
|
|
String testProviderClientToken = "TestProviderClientToken";
|
|
byte[] testMasterSigningKeys = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
|
|
boolean testOverrideProviderClientToken = true;
|
|
|
|
sessionInit.setSessionId(testSessionId);
|
|
sessionInit.setPurchaseId(testPurchaseId);
|
|
sessionInit.setMasterSigningKey(testMasterSigningKeys);
|
|
sessionInit.setProviderClientToken(testProviderClientToken);
|
|
sessionInit.setOverrideProviderClientToken(testOverrideProviderClientToken);
|
|
|
|
// List group ids shown in pssh_data.
|
|
List<byte[]> groupIds = new ArrayList<>();
|
|
try {
|
|
WvPLWidevinePsshData widevinePsshData = session.getPsshData();
|
|
groupIds = widevinePsshData.getGroupIds();
|
|
System.out.println("Group Ids from Widevine Pssh = ");
|
|
for (int i = 0; i < groupIds.size(); i++) {
|
|
System.out.printf ("%s ", Arrays.toString(widevinePsshData.getGroupIds().get(i)));
|
|
}
|
|
System.out.println();
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("Get WvPLStatus: code = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Select one group id shown in group ids list in psshData.
|
|
// Here assume group keys inserted are generated based on the first group
|
|
// shown in the list.
|
|
// Any group id which are not shown in the psshData will throw an error.
|
|
WvPLLicenseCategorySpec licenseCategorySpec = new WvPLLicenseCategorySpec();
|
|
licenseCategorySpec.setLicenseCategory(WvPLLicenseCategory.LicenseCategory.GROUP_LICENSE);
|
|
licenseCategorySpec.setContentOrGroupId(groupIds.get(0));
|
|
sessionInit.setLicenseCategorySpec(licenseCategorySpec);
|
|
session.setSessionInit(sessionInit);
|
|
|
|
WvPLSessionInit retrievedSessionInit = session.getSessionInit();
|
|
System.out.println(
|
|
"retrieved session init fields: sessionId = " + retrievedSessionInit.getSessionId()
|
|
+ ", purchaseId = " + retrievedSessionInit.getPurchaseId()
|
|
+ ", masterSigningKey = " + Arrays.toString(retrievedSessionInit.getMasterSigningKey())
|
|
+ ", providerClientToken = " + retrievedSessionInit.getProviderClientToken()
|
|
+ ", overrideProviderClientToken = "
|
|
+ retrievedSessionInit.getOverrideProviderClientToken()
|
|
+ ", licenseCategorySpec= " + retrievedSessionInit.getLicenseCategorySpec().toString());
|
|
}
|
|
|
|
public static void main(String[] argv) throws Exception {
|
|
byte[] passphraseBytes = PASSPHRASE.getBytes(UTF_8);
|
|
byte[] decodedDrmServiceCertificate =
|
|
Base64.getUrlDecoder().decode(B64_DRM_SERVICE_CERTIFICATE_WITH_CAS_PROXY_TYPE);
|
|
byte[] decodedPrivateKey = Base64.getUrlDecoder().decode(B64_PRIVATE_KEY_WITH_CAS_PROXY_TYPE);
|
|
byte[] decodedLicenseRequest = Base64.getUrlDecoder().decode(B64_LICENSE_REQUEST_WITH_GROUP_ID);
|
|
|
|
java.util.Map<String, String> configValues = new HashMap<>();
|
|
|
|
// Define the configuration that is to be used for WvPLCASEnvironment.
|
|
configValues.put("drm_certificate_type", "dev");
|
|
configValues.put("provider", "widevine_test");
|
|
configValues.put("provider_iv", PROVIDER_IV);
|
|
configValues.put("provider_key", PROVIDER_KEY);
|
|
// Set the device certificate expiration to 10 years (10 * 365 * 24 * 3600).
|
|
// Note that in practice, the expiration should not be 10 years long. Certificate status list
|
|
// should be updated periodically.
|
|
configValues.put("device_certificate_expiration", "315360000");
|
|
|
|
// Construct WvPLCASProxyEnvironment.
|
|
WvPLCASProxyEnvironment environment = new WvPLCASProxyEnvironment(configValues);
|
|
WvPLStatus status = environment.setServiceCertificate(
|
|
decodedDrmServiceCertificate, decodedPrivateKey, passphraseBytes);
|
|
if (status.getStatusCode() != WvPLStatus.StatusCode.OK) {
|
|
System.out.println("setServiceCertificate status = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
} else {
|
|
System.out.println("Successfully loaded service certificate");
|
|
}
|
|
|
|
// Get Device Certificate Status List Request.
|
|
try {
|
|
byte[] deviceCertificateStatusListRequest = environment.generateDeviceStatusListRequest();
|
|
System.out.println(
|
|
"generateDeviceStatusListRequest = "
|
|
+ Arrays.toString(deviceCertificateStatusListRequest));
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("GenerateDeviceStatusListRequest exception: code = "
|
|
+ status.getStatusCode() + ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Get service certificate response.
|
|
byte[] serviceCertificateResponse = environment.generateDrmServiceCertificateResponse();
|
|
System.out.println(
|
|
"Service certificate response = " + Arrays.toString(serviceCertificateResponse));
|
|
|
|
// Set device certificate statusList.
|
|
String certificateStatusListFile =
|
|
"sdk/testing/sampleTestCertificateStatusList.json";
|
|
String certList = "";
|
|
try {
|
|
certList = loadCertificateStatusListFromFile(certificateStatusListFile);
|
|
} catch (FileNotFoundException e) {
|
|
System.out.println("FileNotFoundException in reading input cert list.");
|
|
} catch (IOException e) {
|
|
System.out.println("IOException in reading input cert list.");
|
|
}
|
|
status = environment.setDeviceCertificateStatusList(certList.getBytes(UTF_8));
|
|
if (status.getStatusCode() != WvPLStatus.StatusCode.OK) {
|
|
System.out.println("setServiceCertificate status = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
} else {
|
|
System.out
|
|
.println("Successfully set DeviceCertificateStatusList in WvPLCASProxyEnvironment.");
|
|
}
|
|
|
|
// Construct a WVPLCASProxySession for a license request.
|
|
WvPLCASProxySession session = null;
|
|
try {
|
|
session = environment.createSession(decodedLicenseRequest);
|
|
} catch (WvPLStatusException e) {
|
|
System.out.println("Message: " + e.getMessage());
|
|
System.out.println("Status message: " + e.getStatus().getMessage());
|
|
}
|
|
System.out.println("Successful create WvPLCASProxySession in WvPLCASProxyEnvironment.");
|
|
|
|
System.out.println("Version of Cas Proxy SDK library: "
|
|
+ WvPLCASProxySession.getVersionString());
|
|
WvPLRequestType requestType = session.getRequestType();
|
|
System.out.println("Message type : " + requestType.getMessageType());
|
|
System.out.println("License type : " + requestType.getLicenseType());
|
|
System.out.println("LicenseRequest type : " + requestType.getLicenseRequestType());
|
|
|
|
// Examine the license request by retrieving WvPLClientInfo.
|
|
try {
|
|
WvPLClientInfo clientInfo = session.getClientInfo();
|
|
WvPLHdcp.HDCP maxHdcpVersion = clientInfo.getMaxHdcpVersion();
|
|
System.out.println("WvPLClientInfo, max hdcp version = " + maxHdcpVersion.getHDCP()
|
|
+ ", oem crypto api version = " + clientInfo.getOemCryptoApiVersion()
|
|
+ ", provider client token = " + clientInfo.getProviderClientToken());
|
|
Map<String, String> namesValues = clientInfo.getNamesValues();
|
|
for (Map.Entry<String, String> nameValue : namesValues.entrySet()) {
|
|
System.out.println("Key = " + nameValue.getKey() + ", Value = " + nameValue.getValue());
|
|
}
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("GetClientInfo WvPLStatus: code = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Retrieve the content ID
|
|
byte[] contentId = session.getContentId();
|
|
System.out.println("Content ID: " + Arrays.toString(contentId));
|
|
|
|
// Examine the license request by retrieving WvPLDeviceInfo.
|
|
try {
|
|
WvPLDeviceInfo deviceInfo = session.getDeviceInfo();
|
|
System.out.println("soc = " + deviceInfo.getSoc() + ", manufacturer = "
|
|
+ deviceInfo.getManufacturer() + ", model = " + deviceInfo.getModel()
|
|
+ ", device_type = " + deviceInfo.getDeviceType()
|
|
+ ", system_id = " + deviceInfo.getSystemId());
|
|
// Retrieve DRM Device Certificate serial number.
|
|
byte[] drmDeviceCertificateSerialNumber =
|
|
deviceInfo.getDrmCertificateSerialNumber();
|
|
System.out.println("DrmDeviceCertificateSerialNumber = "
|
|
+ Arrays.toString(drmDeviceCertificateSerialNumber));
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("GetDeviceInfo WvPLStatus: code = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Insert policy and keys for group license.
|
|
groupLicenseRequestGeneration(session);
|
|
|
|
// Retrieve session pssh data.
|
|
try {
|
|
WvPLWidevinePsshData widevinePsshData = session.getPsshData();
|
|
System.out.println("ContentId from Widevine Pssh = "
|
|
+ Arrays.toString(widevinePsshData.getContentId()));
|
|
if (!widevinePsshData.getKeyIds().isEmpty()) {
|
|
for (byte[] keyId : widevinePsshData.getKeyIds()) {
|
|
System.out.println("keyId from Widevine Pssh = " + Arrays.toString(keyId));
|
|
}
|
|
} else {
|
|
System.out.println("KeyIds from Widevine Pssh is empty");
|
|
}
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("Get WvPLStatus: code = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Retrieve a CAS License request that is to be sent to Widevine License Service using HTTP(s)
|
|
// POST.
|
|
String licenseRequest = session.generateLicenseRequestAsJSON();
|
|
System.out.println("License request is: " + licenseRequest);
|
|
|
|
try {
|
|
WvPLClientCapabilities wvplClientCapabilities = session.getClientCapabilities();
|
|
System.out.println("WvPLClientCapabilities = " + wvplClientCapabilities);
|
|
} catch (WvPLStatusException e) {
|
|
status = e.getStatus();
|
|
System.out.println("GetClientInfo WvPLStatus: code = " + status.getStatusCode()
|
|
+ ", message = " + status.getMessage());
|
|
}
|
|
|
|
// Destroy the created session.
|
|
environment.destroySession(session);
|
|
// Tear down the environment object.
|
|
environment.close();
|
|
}
|
|
}
|