[EME] Add support of multi keys from different sessions in CDMinstanceClearKey
[WebKit-https.git] / Source / WebCore / platform / encryptedmedia / clearkey / CDMClearKey.h
1 /*
2  * Copyright (C) 2016 Metrological Group B.V.
3  * Copyright (C) 2016 Igalia S.L.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials provided
14  *    with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #pragma once
30
31 #if ENABLE(ENCRYPTED_MEDIA)
32
33 #include "CDMFactory.h"
34 #include "CDMInstance.h"
35 #include "CDMPrivate.h"
36 #include "SharedBuffer.h"
37 #include <wtf/WeakPtr.h>
38
39 namespace WebCore {
40
41 class CDMFactoryClearKey final : public CDMFactory {
42 public:
43     static CDMFactoryClearKey& singleton();
44
45     virtual ~CDMFactoryClearKey();
46
47     std::unique_ptr<CDMPrivate> createCDM(const String&) override;
48     bool supportsKeySystem(const String&) override;
49
50 private:
51     friend class NeverDestroyed<CDMFactoryClearKey>;
52     CDMFactoryClearKey();
53 };
54
55 class CDMPrivateClearKey final : public CDMPrivate {
56 public:
57     CDMPrivateClearKey();
58     virtual ~CDMPrivateClearKey();
59
60     bool supportsInitDataType(const AtomicString&) const override;
61     bool supportsConfiguration(const CDMKeySystemConfiguration&) const override;
62     bool supportsConfigurationWithRestrictions(const CDMKeySystemConfiguration&, const CDMRestrictions&) const override;
63     bool supportsSessionTypeWithConfiguration(CDMSessionType&, const CDMKeySystemConfiguration&) const override;
64     bool supportsRobustness(const String&) const override;
65     CDMRequirement distinctiveIdentifiersRequirement(const CDMKeySystemConfiguration&, const CDMRestrictions&) const override;
66     CDMRequirement persistentStateRequirement(const CDMKeySystemConfiguration&, const CDMRestrictions&) const override;
67     bool distinctiveIdentifiersAreUniquePerOriginAndClearable(const CDMKeySystemConfiguration&) const override;
68     RefPtr<CDMInstance> createInstance() override;
69     void loadAndInitialize() override;
70     bool supportsServerCertificates() const override;
71     bool supportsSessions() const override;
72     bool supportsInitData(const AtomicString&, const SharedBuffer&) const override;
73     RefPtr<SharedBuffer> sanitizeResponse(const SharedBuffer&) const override;
74     std::optional<String> sanitizeSessionId(const String&) const override;
75 };
76
77 class CDMInstanceClearKey final : public CDMInstance {
78 public:
79     CDMInstanceClearKey();
80     virtual ~CDMInstanceClearKey();
81
82     ImplementationType implementationType() const final { return ImplementationType::ClearKey; }
83
84     SuccessValue initializeWithConfiguration(const CDMKeySystemConfiguration&) override;
85     SuccessValue setDistinctiveIdentifiersAllowed(bool) override;
86     SuccessValue setPersistentStateAllowed(bool) override;
87     SuccessValue setServerCertificate(Ref<SharedBuffer>&&) override;
88     SuccessValue setStorageDirectory(const String&) override;
89
90     void requestLicense(LicenseType, const AtomicString& initDataType, Ref<SharedBuffer>&& initData, LicenseCallback) override;
91     void updateLicense(const String&, LicenseType, const SharedBuffer&, LicenseUpdateCallback) override;
92     void loadSession(LicenseType, const String&, const String&, LoadSessionCallback) override;
93     void closeSession(const String&, CloseSessionCallback) override;
94     void removeSessionData(const String&, LicenseType, RemoveSessionDataCallback) override;
95     void storeRecordOfKeyUsage(const String&) override;
96
97     const String& keySystem() const final;
98
99     struct Key {
100         KeyStatus status;
101         RefPtr<SharedBuffer> keyIDData;
102         RefPtr<SharedBuffer> keyValueData;
103     };
104
105     const Vector<Key> keys() const;
106
107 private:
108     WeakPtrFactory<CDMInstanceClearKey> m_weakPtrFactory;
109 };
110
111 } // namespace WebCore
112
113 SPECIALIZE_TYPE_TRAITS_CDM_INSTANCE(WebCore::CDMInstanceClearKey, WebCore::CDMInstance::ImplementationType::ClearKey);
114
115 #endif // ENABLE(ENCRYPTED_MEDIA)