1ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber/*
2ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Copyright (C) 2012 The Android Open Source Project
3ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber *
4ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * you may not use this file except in compliance with the License.
6ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * You may obtain a copy of the License at
7ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber *
8ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber *
10ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * See the License for the specific language governing permissions and
14ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * limitations under the License.
15ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber */
16ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
17ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#ifndef CRYPTO_H_
18ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
19ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#define CRYPTO_H_
20ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
21ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h>
22ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <utils/threads.h>
23bafb682ec7f51486e751fea954169deb91846063Jeff Tinker#include <utils/KeyedVector.h>
24bafb682ec7f51486e751fea954169deb91846063Jeff Tinker
25bafb682ec7f51486e751fea954169deb91846063Jeff Tinker#include "SharedLibrary.h"
26ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubernamespace android {
28ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberstruct CryptoFactory;
301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberstruct CryptoPlugin;
311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct Crypto : public BnCrypto {
33ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    Crypto();
341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual ~Crypto();
35ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t initCheck() const;
37ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
38bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]);
39ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t createPlugin(
411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t uuid[16], const void *data, size_t size);
42ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t destroyPlugin();
44ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual bool requiresSecureDecoderComponent(
461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const char *mime) const;
47ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
482514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker    virtual void notifyResolution(uint32_t width, uint32_t height);
492514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker
501849570240443d1f75775c205fa658f7070849c6Jeff Tinker    virtual status_t setMediaDrmSession(const Vector<uint8_t> &sessionId);
511849570240443d1f75775c205fa658f7070849c6Jeff Tinker
52fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong    virtual ssize_t decrypt(
539ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker            DestinationType dstType,
541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t key[16],
551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t iv[16],
561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            CryptoPlugin::Mode mode,
5718cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker            const CryptoPlugin::Pattern &pattern,
58c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker            const sp<IMemory> &sharedBuffer, size_t offset,
591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
605b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            void *dstPtr,
615b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg);
62ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
63ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberprivate:
641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    mutable Mutex mLock;
651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    status_t mInitCheck;
67bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    sp<SharedLibrary> mLibrary;
681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    CryptoFactory *mFactory;
691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    CryptoPlugin *mPlugin;
701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
71bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    static KeyedVector<Vector<uint8_t>, String8> mUUIDToLibraryPathMap;
72bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    static KeyedVector<String8, wp<SharedLibrary> > mLibraryPathToOpenLibraryMap;
73bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    static Mutex mMapLock;
74bafb682ec7f51486e751fea954169deb91846063Jeff Tinker
75bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    void findFactoryForScheme(const uint8_t uuid[16]);
76bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    bool loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]);
77bafb682ec7f51486e751fea954169deb91846063Jeff Tinker    void closeFactory();
781bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
79ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Crypto);
80ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber};
81ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
82ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}  // namespace android
83ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
84ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#endif  // CRYPTO_H_
85