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