diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/VersionHeadersFilter.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/VersionHeadersFilter.java index e9feb886b4315..44009460d7446 100644 --- a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/VersionHeadersFilter.java +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/VersionHeadersFilter.java @@ -40,7 +40,7 @@ public ClientResponse doHandle(ClientRequest cr) { MultivaluedMap headers = cr.getHeaders(); headers.add("DataServiceVersion", "3.0"); headers.add("MaxDataServiceVersion", "3.0"); - headers.add("x-ms-version", "2.11"); + headers.add("x-ms-version", "2.12"); return getNext().handle(cr); } } diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/FairPlayConfiguration.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/FairPlayConfiguration.java new file mode 100644 index 0000000000000..9e2ef2c54b9fc --- /dev/null +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/FairPlayConfiguration.java @@ -0,0 +1,73 @@ +package com.microsoft.windowsazure.services.media.implementation.templates.fairplay; + +import java.io.ByteArrayOutputStream; +import java.security.KeyStore; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.microsoft.windowsazure.core.utils.Base64; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class FairPlayConfiguration { + + private String askId; + + private String fairPlayPfxPasswordId; + + private String fairPlayPfx; + + private String contentEncryptionIV; + + public static String createSerializedFairPlayOptionConfiguration( + KeyStore keyStore, String pfxPassword, String pfxPasswordKeyId, String askId, + String contentIv) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + keyStore.store(outputStream, pfxPassword.toCharArray()); + String certString = Base64.encode(outputStream.toByteArray()); + FairPlayConfiguration config = new FairPlayConfiguration(); + config.askId = askId; + config.contentEncryptionIV = contentIv; + config.fairPlayPfx = certString; + config.fairPlayPfxPasswordId = pfxPasswordKeyId; + ObjectMapper mapper = new ObjectMapper(); + String configuration = mapper.writeValueAsString(config); + + return configuration; + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + static final char[] HEXARRAY = "0123456789ABCDEF".toCharArray(); + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEXARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEXARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + @JsonProperty("ASkId") + public String getASkId() { + return askId; + } + + @JsonProperty("FairPlayPfxPasswordId") + public String getFairPlayPfxPasswordId() { + return fairPlayPfxPasswordId; + } + + @JsonProperty("FairPlayPfx") + public String getFairPlayPfx() { + return fairPlayPfx; + } + + @JsonProperty("ContentEncryptionIV") + public String getContentEncryptionIV() { + return contentEncryptionIV; + }; +} diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/package-info.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/package-info.java new file mode 100644 index 0000000000000..345253ed44c18 --- /dev/null +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/implementation/templates/fairplay/package-info.java @@ -0,0 +1 @@ +package com.microsoft.windowsazure.services.media.implementation.templates.fairplay; diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyConfigurationKey.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyConfigurationKey.java index 7d33469f87801..c32bce8d42f34 100644 --- a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyConfigurationKey.java +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyConfigurationKey.java @@ -37,8 +37,16 @@ public enum AssetDeliveryPolicyConfigurationKey { /** The initialization vector to use for envelope encryption. */ EnvelopeEncryptionIV(6), /** Widevine DRM Acquisition Url to use for common encryption. */ - WidevineLicenseAcquisitionUrl(7); - + WidevineLicenseAcquisitionUrl(7), + /** Base Widevine url that will have KID= appended */ + WidevineBaseLicenseAcquisitionUrl(8), + /** FairPlay license acquisition URL. */ + FairPlayLicenseAcquisitionUrl(9), + /** Base FairPlay license acquisition URL that will have KID= appended. */ + FairPlayBaseLicenseAcquisitionUrl(10), + /** Initialization Vector that will be used for encrypting the content. Must match + IV in the AssetDeliveryPolicy. */ + CommonEncryptionIVForCbcs(11); /** The AssetDeliveryPolicyType code. */ private int assetDeliveryPolicyConfigurationKey; @@ -87,6 +95,14 @@ public static AssetDeliveryPolicyConfigurationKey fromCode(int option) { return AssetDeliveryPolicyConfigurationKey.EnvelopeEncryptionIV; case 7: return AssetDeliveryPolicyConfigurationKey.WidevineLicenseAcquisitionUrl; + case 8: + return AssetDeliveryPolicyConfigurationKey.WidevineBaseLicenseAcquisitionUrl; + case 9: + return AssetDeliveryPolicyConfigurationKey.FairPlayLicenseAcquisitionUrl; + case 10: + return AssetDeliveryPolicyConfigurationKey.FairPlayBaseLicenseAcquisitionUrl; + case 11: + return AssetDeliveryPolicyConfigurationKey.CommonEncryptionIVForCbcs; default: throw new InvalidParameterException("option"); } diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyType.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyType.java index 1963078a8c1dd..b1aab05316234 100644 --- a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyType.java +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/AssetDeliveryPolicyType.java @@ -31,7 +31,9 @@ public enum AssetDeliveryPolicyType { /** Apply Dynamic Envelope encryption. */ DynamicEnvelopeEncryption(3), /** Apply Dynamic Common encryption. */ - DynamicCommonEncryption(4); + DynamicCommonEncryption(4), + /** Apply Dynamic Common encryption with cbcs */ + DynamicCommonEncryptionCbcs(5); /** The AssetDeliveryPolicyType code. */ @@ -75,6 +77,8 @@ public static AssetDeliveryPolicyType fromCode(int option) { return AssetDeliveryPolicyType.DynamicEnvelopeEncryption; case 4: return AssetDeliveryPolicyType.DynamicCommonEncryption; + case 5: + return AssetDeliveryPolicyType.DynamicCommonEncryptionCbcs; default: throw new InvalidParameterException("option"); } diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyDeliveryType.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyDeliveryType.java index 155f0d3e3fd3d..60b00c6f3caad 100644 --- a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyDeliveryType.java +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyDeliveryType.java @@ -29,7 +29,9 @@ public enum ContentKeyDeliveryType { /** Use MPEG Baseline HTTP key protocol. */ BaselineHttp(2), /** Use Widevine license acquisition protocol. */ - Widevine(3); + Widevine(3), + /** Send FairPlay SPC to Key Delivery server and get CKC back */ + FairPlay(4); /** The AssetDeliveryPolicyType code. */ private int contentKeyDeliveryType; @@ -70,6 +72,8 @@ public static ContentKeyDeliveryType fromCode(int option) { return ContentKeyDeliveryType.BaselineHttp; case 3: return ContentKeyDeliveryType.Widevine; + case 4: + return ContentKeyDeliveryType.FairPlay; default: throw new InvalidParameterException("option"); } diff --git a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyType.java b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyType.java index 9c801ad5f94c3..fbb6542cbad00 100644 --- a/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyType.java +++ b/services/azure-media/src/main/java/com/microsoft/windowsazure/services/media/models/ContentKeyType.java @@ -31,7 +31,13 @@ public enum ContentKeyType { /** The Configuration encryption. */ ConfigurationEncryption(2), /** The Envelope encryption. */ - EnvelopeEncryption(4); + EnvelopeEncryption(4), + /** Specifies a content key for common encryption with CBCS. */ + CommonEncryptionCbcs(6), + /** Application Secret key for FairPlay. */ + FairPlayASk (7), + /** Password for FairPlay application certificate. */ + FairPlayPfxPassword (8); /** The content key type code. */ private int contentKeyTypeCode; @@ -72,6 +78,12 @@ public static ContentKeyType fromCode(int code) { return ContentKeyType.ConfigurationEncryption; case 4: return ContentKeyType.EnvelopeEncryption; + case 6: + return ContentKeyType.CommonEncryptionCbcs; + case 7: + return ContentKeyType.FairPlayASk; + case 8: + return ContentKeyType.FairPlayPfxPassword; default: throw new InvalidParameterException("code"); }