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