Changeset 225637 in webkit


Ignore:
Timestamp:
Dec 7, 2017 11:46:53 AM (6 years ago)
Author:
jer.noble@apple.com
Message:

[EME] Support generateRequest() in CDMFairPlayStreaming
https://bugs.webkit.org/show_bug.cgi?id=179752

Reviewed by Eric Carlson.

Source/WebCore:

Tests: platform/mac/media/encrypted-media/fps-createSession.html

platform/mac/media/encrypted-media/fps-generateRequest.html

Add support for generating license requests from initialization data in
CDMFairPlayStreaming. To do so, add explicit checks for FairPlay Steraming requirements:
reqests will fail if no server certificate exists, and will fail if no content key id exists
in the initialization data.

  • platform/graphics/avfoundation/CDMFairPlayStreaming.cpp:

(WebCore::CDMPrivateFairPlayStreaming::extractKeyIDsSinf):
(WebCore::CDMPrivateFairPlayStreaming::sanitizeSinf):
(WebCore::CDMFactory::platformRegisterFactories):

  • platform/graphics/avfoundation/CDMFairPlayStreaming.h:
  • platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:

(WebCore::CDMInstanceFairPlayStreamingAVFObjC::requestLicense):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest):

LayoutTests:

  • platform/mac/TestExpectations:
  • platform/mac/media/encrypted-media/fps-createSession-expected.txt: Added.
  • platform/mac/media/encrypted-media/fps-createSession.html: Added.
  • platform/mac/media/encrypted-media/fps-generateRequest-expected.txt: Added.
  • platform/mac/media/encrypted-media/fps-generateRequest.html: Added.
Location:
trunk
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r225630 r225637  
     12017-12-07  Jer Noble  <jer.noble@apple.com>
     2
     3        [EME] Support generateRequest() in CDMFairPlayStreaming
     4        https://bugs.webkit.org/show_bug.cgi?id=179752
     5
     6        Reviewed by Eric Carlson.
     7
     8        * platform/mac/TestExpectations:
     9        * platform/mac/media/encrypted-media/fps-createSession-expected.txt: Added.
     10        * platform/mac/media/encrypted-media/fps-createSession.html: Added.
     11        * platform/mac/media/encrypted-media/fps-generateRequest-expected.txt: Added.
     12        * platform/mac/media/encrypted-media/fps-generateRequest.html: Added.
     13
    1142017-12-07  Ryan Haddad  <ryanhaddad@apple.com>
    215
  • trunk/LayoutTests/platform/mac/TestExpectations

    r225612 r225637  
    17491749[ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-createMediaKeys.html [ Skip ]
    17501750[ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-requestMediaKeySystemAccess.html [ Skip ]
     1751[ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-createSession.html [ Skip ]
     1752[ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-generateRequest.html [ Skip ]
    17511753
    17521754# rdar://problem/35395437
  • trunk/Source/WebCore/ChangeLog

    r225635 r225637  
     12017-12-07  Jer Noble  <jer.noble@apple.com>
     2
     3        [EME] Support generateRequest() in CDMFairPlayStreaming
     4        https://bugs.webkit.org/show_bug.cgi?id=179752
     5
     6        Reviewed by Eric Carlson.
     7
     8        Tests: platform/mac/media/encrypted-media/fps-createSession.html
     9               platform/mac/media/encrypted-media/fps-generateRequest.html
     10
     11        Add support for generating license requests from initialization data in
     12        CDMFairPlayStreaming. To do so, add explicit checks for FairPlay Steraming requirements:
     13        reqests will fail if no server certificate exists, and will fail if no content key id exists
     14        in the initialization data.
     15
     16        * platform/graphics/avfoundation/CDMFairPlayStreaming.cpp:
     17        (WebCore::CDMPrivateFairPlayStreaming::extractKeyIDsSinf):
     18        (WebCore::CDMPrivateFairPlayStreaming::sanitizeSinf):
     19        (WebCore::CDMFactory::platformRegisterFactories):
     20        * platform/graphics/avfoundation/CDMFairPlayStreaming.h:
     21        * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
     22        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::requestLicense):
     23        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest):
     24
    1252017-12-07  Jer Noble  <jer.noble@apple.com>
    226
  • trunk/Source/WebCore/platform/graphics/avfoundation/CDMFairPlayStreaming.cpp

    r225231 r225637  
    5151namespace WebCore {
    5252
     53static const Vector<FourCC>& validFairPlayStreamingSchemes()
     54{
     55    static NeverDestroyed<Vector<FourCC>> validSchemes = Vector<FourCC>({
     56        "cbcs",
     57        "cbc2",
     58        "cbc1",
     59    });
     60
     61    return validSchemes;
     62}
     63
     64static const String& sinfName()
     65{
     66    static NeverDestroyed<String> sinf { MAKE_STATIC_STRING_IMPL("sinf") };
     67    return sinf;
     68}
     69
    5370static Vector<Ref<SharedBuffer>> extractSinfData(const SharedBuffer& buffer)
    5471{
     
    6784
    6885    RefPtr<JSON::Array> sinfArray;
    69     if (!object->getArray("sinf", sinfArray))
     86    if (!object->getArray(sinfName(), sinfArray))
    7087        return { };
    7188
     
    135152}
    136153
    137 static Vector<Ref<SharedBuffer>> extractKeyIDsSinf(const SharedBuffer& buffer)
    138 {
    139     auto sinfs = extractSinfData(buffer);
    140     if (sinfs.isEmpty())
    141         return { };
     154Vector<Ref<SharedBuffer>> CDMPrivateFairPlayStreaming::extractKeyIDsSinf(const SharedBuffer& buffer)
     155{
    142156
    143157    Vector<Ref<SharedBuffer>> keyIDs;
    144     for (auto& sinf : sinfs) {
    145         auto results = extractSchemeAndKeyIdFromSinf(sinf);
    146         if (!results.size())
    147             continue;
    148 
    149         for (auto& result : results) {
    150             if (result.first == 'cbcs')
    151                 keyIDs.append(SharedBuffer::create(result.second.data(), result.second.size()));
    152         }
     158    auto results = extractSchemeAndKeyIdFromSinf(buffer);
     159
     160    for (auto& result : results) {
     161        if (validFairPlayStreamingSchemes().contains(result.first))
     162            keyIDs.append(SharedBuffer::create(result.second.data(), result.second.size()));
    153163    }
    154164
     
    156166}
    157167
    158 static RefPtr<SharedBuffer> sanitizeSinf(const SharedBuffer& buffer)
     168RefPtr<SharedBuffer> CDMPrivateFairPlayStreaming::sanitizeSinf(const SharedBuffer& buffer)
    159169{
    160170    // Common SINF Box Format
     
    169179    factories.append(&CDMFactoryFairPlayStreaming::singleton());
    170180
    171     InitDataRegistry::shared().registerInitDataType("sinf", { sanitizeSinf, extractKeyIDsSinf });
     181    InitDataRegistry::shared().registerInitDataType(sinfName(), { CDMPrivateFairPlayStreaming::sanitizeSinf, CDMPrivateFairPlayStreaming::extractKeyIDsSinf });
    172182}
    173183
     
    201211bool CDMPrivateFairPlayStreaming::supportsInitDataType(const AtomicString& initDataType) const
    202212{
    203     return initDataType == "sinf";
     213    return initDataType == sinfName();
    204214}
    205215
    206216bool CDMPrivateFairPlayStreaming::supportsConfiguration(const CDMKeySystemConfiguration& configuration) const
    207217{
    208     if (!configuration.initDataTypes.contains("sinf"))
     218    if (!configuration.initDataTypes.contains(sinfName()))
    209219        return false;
    210220
     
    322332
    323333    return WTF::anyOf(extractSchemeAndKeyIdFromSinf(initData), [](auto& result) {
    324         return result.first == 'cbcs' || result.first == 'cbc2' || result.first == 'cbc1';
     334        return validFairPlayStreamingSchemes().contains(result.first);
    325335    });
    326336}
  • trunk/Source/WebCore/platform/graphics/avfoundation/CDMFairPlayStreaming.h

    r224707 r225637  
    6565    RefPtr<SharedBuffer> sanitizeResponse(const SharedBuffer&) const override;
    6666    std::optional<String> sanitizeSessionId(const String&) const override;
     67
     68    static Vector<Ref<SharedBuffer>> extractKeyIDsSinf(const SharedBuffer&);
     69    static RefPtr<SharedBuffer> sanitizeSinf(const SharedBuffer&);
    6770};
    6871
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm

    r224707 r225637  
    2929#if HAVE(AVCONTENTKEYSESSION)
    3030
     31#import "CDMFairPlayStreaming.h"
    3132#import "CDMKeySystemConfiguration.h"
    3233#import "NotImplemented.h"
     
    227228        return;
    228229    }
     230
     231    if (!m_serverCertificate) {
     232        callback(SharedBuffer::create(), emptyString(), false, Failed);
     233        return;
     234    }
     235
    229236    m_requestLicenseCallback = WTFMove(callback);
    230237
     
    269276        return;
    270277
    271 #pragma clang diagnostic push
    272 #pragma clang diagnostic ignored "-Wnonnull"
    273278    RetainPtr<NSData> appIdentifier = m_serverCertificate ? m_serverCertificate->createNSData() : nullptr;
    274     [m_request makeStreamingContentKeyRequestDataForApp:appIdentifier.get() contentIdentifier:nil options:nil completionHandler:[this, weakThis = createWeakPtr()] (NSData *contentKeyRequestData, NSError *error) mutable {
     279    Vector<Ref<SharedBuffer>> keyIDs = CDMPrivateFairPlayStreaming::extractKeyIDsSinf(SharedBuffer::create(request.initializationData));
     280    if (keyIDs.isEmpty()) {
     281        m_requestLicenseCallback(SharedBuffer::create(), m_sessionId, false, Failed);
     282        return;
     283    }
     284
     285    RetainPtr<NSData> contentIdentifier = keyIDs.first()->createNSData();
     286    [m_request makeStreamingContentKeyRequestDataForApp:appIdentifier.get() contentIdentifier:contentIdentifier.get() options:nil completionHandler:[this, weakThis = createWeakPtr()] (NSData *contentKeyRequestData, NSError *error) mutable {
    275287        callOnMainThread([this, weakThis = WTFMove(weakThis), error = retainPtr(error), contentKeyRequestData = retainPtr(contentKeyRequestData)] {
    276288            if (!weakThis || !m_requestLicenseCallback)
     
    283295        });
    284296    }];
    285 #pragma clang diagnostic pop
    286297}
    287298
Note: See TracChangeset for help on using the changeset viewer.