CryptoAPI.h revision 383190e475d7bdbe90359dbb99721041773a8646
1cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber/*
2cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * Copyright (C) 2012 The Android Open Source Project
3cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber *
4cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * you may not use this file except in compliance with the License.
6cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * You may obtain a copy of the License at
7cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber *
8cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber *
10cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * Unless required by applicable law or agreed to in writing, software
11cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * See the License for the specific language governing permissions and
14cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber * limitations under the License.
15cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber */
16cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
17cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber#include <utils/Errors.h>
18cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
19cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber#ifndef CRYPTO_API_H_
20cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
21cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber#define CRYPTO_API_H_
22cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
23cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Hubernamespace android {
24cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
25383190e475d7bdbe90359dbb99721041773a8646Andreas Huberstruct AString;
26cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoPlugin;
27cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
28cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoFactory {
29cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory() {}
30cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual ~CryptoFactory() {}
31cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
32cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) const = 0;
33cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
34cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual status_t createPlugin(
35cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t uuid[16], const void *data, size_t size,
36cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            CryptoPlugin **plugin) = 0;
37cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
38cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberprivate:
39cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory(const CryptoFactory &);
40cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory &operator=(const CryptoFactory &);
41cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber};
42cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
43cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoPlugin {
44cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    enum Mode {
45cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_Unencrypted = 0,
46cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_AES_CTR     = 1,
47cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
48cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        // Neither key nor iv are being used in this mode.
49cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        // Each subsample is encrypted w/ an iv of all zeroes.
50cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_AES_WV      = 2,  // FIX constant
51cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    };
52cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
53cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    struct SubSample {
54cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        size_t mNumBytesOfClearData;
55cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        size_t mNumBytesOfEncryptedData;
56cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    };
57cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
58cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin() {}
59cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual ~CryptoPlugin() {}
60cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
61cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // If this method returns false, a non-secure decoder will be used to
62cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // decode the data after decryption. The decrypt API below will have
63cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // to support insecure decryption of the data (secure = false) for
64cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // media data of the given mime type.
65cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual bool requiresSecureDecoderComponent(const char *mime) const = 0;
66cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
67383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // If the error returned falls into the range
68383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // ERROR_DRM_VENDOR_MIN..ERROR_DRM_VENDOR_MAX, errorDetailMsg should be
69383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // filled in with an appropriate string.
70383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // At the java level these special errors will then trigger a
71383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // MediaCodec.CryptoException that gives clients access to both
72383190e475d7bdbe90359dbb99721041773a8646Andreas Huber    // the error code and the errorDetailMsg.
73cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual status_t decrypt(
74cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            bool secure,
75cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t key[16],
76cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t iv[16],
77cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            Mode mode,
78cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const void *srcPtr,
79cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const SubSample *subSamples, size_t numSubSamples,
80383190e475d7bdbe90359dbb99721041773a8646Andreas Huber            void *dstPtr,
81383190e475d7bdbe90359dbb99721041773a8646Andreas Huber            AString *errorDetailMsg) = 0;
82cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
83cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberprivate:
84cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin(const CryptoPlugin &);
85cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin &operator=(const CryptoPlugin &);
86cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber};
87cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
88cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber}  // namespace android
89cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
90cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberextern "C" {
91cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    extern android::CryptoFactory *createCryptoFactory();
92cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber}
93cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
94cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber#endif  // CRYPTO_API_H_
95