CryptoAPI.h revision cf0db31c323676ba9cfab81c7032a37c09256e48
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
25cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoPlugin;
26cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
27cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoFactory {
28cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory() {}
29cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual ~CryptoFactory() {}
30cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
31cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) const = 0;
32cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
33cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual status_t createPlugin(
34cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t uuid[16], const void *data, size_t size,
35cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            CryptoPlugin **plugin) = 0;
36cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
37cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberprivate:
38cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory(const CryptoFactory &);
39cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoFactory &operator=(const CryptoFactory &);
40cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber};
41cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
42cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberstruct CryptoPlugin {
43cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    enum Mode {
44cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_Unencrypted = 0,
45cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_AES_CTR     = 1,
46cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
47cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        // Neither key nor iv are being used in this mode.
48cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        // Each subsample is encrypted w/ an iv of all zeroes.
49cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        kMode_AES_WV      = 2,  // FIX constant
50cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    };
51cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
52cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    struct SubSample {
53cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        size_t mNumBytesOfClearData;
54cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber        size_t mNumBytesOfEncryptedData;
55cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    };
56cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
57cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin() {}
58cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual ~CryptoPlugin() {}
59cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
60cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // If this method returns false, a non-secure decoder will be used to
61cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // decode the data after decryption. The decrypt API below will have
62cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // to support insecure decryption of the data (secure = false) for
63cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    // media data of the given mime type.
64cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual bool requiresSecureDecoderComponent(const char *mime) const = 0;
65cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
66cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    virtual status_t decrypt(
67cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            bool secure,
68cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t key[16],
69cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const uint8_t iv[16],
70cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            Mode mode,
71cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const void *srcPtr,
72cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            const SubSample *subSamples, size_t numSubSamples,
73cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber            void *dstPtr) = 0;
74cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
75cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberprivate:
76cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin(const CryptoPlugin &);
77cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    CryptoPlugin &operator=(const CryptoPlugin &);
78cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber};
79cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
80cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber}  // namespace android
81cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
82cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huberextern "C" {
83cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber    extern android::CryptoFactory *createCryptoFactory();
84cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber}
85cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber
86cf0db31c323676ba9cfab81c7032a37c09256e48Andreas Huber#endif  // CRYPTO_API_H_
87