* Extend CdmLicense's stored_init_data_ [ Merge of http://go/wvgerrit/14661 ] CdmLicense will store init data when a server cert must be provisioned. After provisioning, the original init data can be used to generate the originally-intended license request. To do this before, the caller had to call CdmSession's GenerateKeyRequest with an empty InitializationData object. However, the init data's type still had to be set, as did the license type. This CL allows the caller to use a truly empty InitializationData without a type. To permit this, CdmLicense now stores a full InitializationData object, rather than just a copy of it's data field. With this CL, the caller also avoid storing the original license type. To accomplish this, CdmSession uses the already-set is_offline_ and is_release_ flags from the original call to reconstruct the intended license type. The caller uses the new type kLicenseTypeDeferred. To facilitate storing whole InitializationData objects, they are now copyable. This ultimately simplifies server cert code for the new CE CDM. * Store service certs in Properties [ Merge of http://go/wvgerrit/14664 ] This allows CE devices to mimic the Chrome CDM's behavior of sharing server certs between sessions. This also affects Android behavior. Previously, provisioned service certificates were per-session, while explicitly-set service certs were per-DRM-plugin. Now, both are per-DRM-plugin. A DRM plugin is associated with a mediaDrm object. Content providers will still be able to retrieve and use different certificates. The change here requires an app, that wishes to use different provisioned service certificates will have to use multiple mediaDrm objects. This is an unlikely scenario. Change-Id: If2586932784ed046ecab72b5720ff30547e84b97
368 lines
14 KiB
C++
368 lines
14 KiB
C++
//
|
|
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
//
|
|
|
|
#ifndef WV_MAP_ERRORS_H_
|
|
#define WV_MAP_ERRORS_H_
|
|
|
|
#include "media/stagefright/MediaErrors.h"
|
|
#include "utils/Errors.h"
|
|
#include "wv_cdm_types.h"
|
|
#include "WVErrors.h"
|
|
|
|
namespace wvdrm {
|
|
|
|
static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
|
|
switch (res) {
|
|
case wvcdm::NO_ERROR:
|
|
case wvcdm::KEY_ADDED:
|
|
case wvcdm::KEY_MESSAGE:
|
|
case wvcdm::KEY_CANCELED:
|
|
// KEY_ADDED, KEY_MESSAGE, and KEY_CANCELLED are all alternative
|
|
// success messages for certain CDM methods instead of NO_ERROR.
|
|
return android::OK;
|
|
case wvcdm::NEED_KEY:
|
|
return android::ERROR_DRM_NO_LICENSE;
|
|
case wvcdm::NEED_PROVISIONING:
|
|
return android::ERROR_DRM_NOT_PROVISIONED;
|
|
case wvcdm::DEVICE_REVOKED:
|
|
return android::ERROR_DRM_DEVICE_REVOKED;
|
|
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES:
|
|
return android::ERROR_DRM_RESOURCE_BUSY;
|
|
case wvcdm::ADD_KEY_ERROR:
|
|
return kAddKeyError;
|
|
case wvcdm::CERT_PROVISIONING_GET_KEYBOX_ERROR_1:
|
|
return kCertProvisioningGetKeyboxError1;
|
|
case wvcdm::CERT_PROVISIONING_GET_KEYBOX_ERROR_2:
|
|
return kCertProvisioningGetKeyboxError2;
|
|
case wvcdm::CERT_PROVISIONING_INVALID_CERT_TYPE:
|
|
return kCertProvisioningInvalidCertType;
|
|
case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_1:
|
|
return kCertProvisioningRequestError1;
|
|
case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_2:
|
|
return kCertProvisioningRequestError2;
|
|
case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_3:
|
|
return kCertProvisioningRequestError3;
|
|
case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_4:
|
|
return kCertProvisioningRequestError4;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_1:
|
|
return kCertProvisioningResponseError1;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_2:
|
|
return kCertProvisioningResponseError2;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_3:
|
|
return kCertProvisioningResponseError3;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_4:
|
|
return kCertProvisioningResponseError4;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_5:
|
|
return kCertProvisioningResponseError5;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_6:
|
|
return kCertProvisioningResponseError6;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_7:
|
|
return kCertProvisioningResponseError7;
|
|
case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_8:
|
|
return kCertProvisioningResponseError8;
|
|
case wvcdm::CRYPTO_SESSION_OPEN_ERROR_1:
|
|
return kCryptoSessionOpenError1;
|
|
case wvcdm::CRYPTO_SESSION_OPEN_ERROR_2:
|
|
return kCryptoSessionOpenError2;
|
|
case wvcdm::CRYPTO_SESSION_OPEN_ERROR_3:
|
|
return kCryptoSessionOpenError3;
|
|
case wvcdm::CRYPTO_SESSION_OPEN_ERROR_4:
|
|
return kCryptoSessionOpenError4;
|
|
case wvcdm::CRYPTO_SESSION_OPEN_ERROR_5:
|
|
return kCryptoSessionOpenError5;
|
|
case wvcdm::DECRYPT_NOT_READY:
|
|
return kDecyrptNotReady;
|
|
case wvcdm::DEVICE_CERTIFICATE_ERROR_1:
|
|
return kDeviceCertificateError1;
|
|
case wvcdm::DEVICE_CERTIFICATE_ERROR_2:
|
|
return kDeviceCertificateError2;
|
|
case wvcdm::DEVICE_CERTIFICATE_ERROR_3:
|
|
return kDeviceCertificateError3;
|
|
case wvcdm::DEVICE_CERTIFICATE_ERROR_4:
|
|
return kDeviceCertificateError4;
|
|
case wvcdm::EMPTY_KEY_DATA_1:
|
|
return kEmptyKeyData1;
|
|
case wvcdm::EMPTY_KEY_DATA_2:
|
|
return kEmptyKeyData2;
|
|
case wvcdm::EMPTY_KEYSET_ID:
|
|
return kEmptyKeySetId;
|
|
case wvcdm::EMPTY_KEYSET_ID_ENG_1:
|
|
return kEmptyKeySetIdEng1;
|
|
case wvcdm::EMPTY_KEYSET_ID_ENG_2:
|
|
return kEmptyKeySetIdEng2;
|
|
case wvcdm::EMPTY_KEYSET_ID_ENG_3:
|
|
return kEmptyKeySetIdEng3;
|
|
case wvcdm::EMPTY_KEYSET_ID_ENG_4:
|
|
return kEmptyKeySetIdEng4;
|
|
case wvcdm::EMPTY_LICENSE_RENEWAL:
|
|
return kEmptyLicenseRenewal;
|
|
case wvcdm::EMPTY_LICENSE_RESPONSE_1:
|
|
return kEmptyLicenseResponse1;
|
|
case wvcdm::EMPTY_LICENSE_RESPONSE_2:
|
|
return kEmptyLicenseResponse2;
|
|
case wvcdm::EMPTY_PROVISIONING_CERTIFICATE_1:
|
|
return kEmptyProvisioningCertificate1;
|
|
case wvcdm::EMPTY_PROVISIONING_RESPONSE:
|
|
return kEmptyProvisioningResponse;
|
|
case wvcdm::EMPTY_SESSION_ID:
|
|
return kEmptySessionId;
|
|
case wvcdm::GENERATE_DERIVED_KEYS_ERROR:
|
|
return kGenerateDerivedKeysError;
|
|
case wvcdm::LICENSE_RENEWAL_NONCE_GENERATION_ERROR:
|
|
return kLicenseRenewalNonceGenerationError;
|
|
case wvcdm::GENERATE_USAGE_REPORT_ERROR:
|
|
return kGenerateUsageReportError;
|
|
case wvcdm::GET_LICENSE_ERROR:
|
|
return kGetLicenseError;
|
|
case wvcdm::GET_RELEASED_LICENSE_ERROR:
|
|
return kGetReleasedLicenseError;
|
|
case wvcdm::GET_USAGE_INFO_ERROR_1:
|
|
return kGetUsageInfoError1;
|
|
case wvcdm::GET_USAGE_INFO_ERROR_2:
|
|
return kGetUsageInfoError2;
|
|
case wvcdm::GET_USAGE_INFO_ERROR_3:
|
|
return kGetUsageInfoError3;
|
|
case wvcdm::GET_USAGE_INFO_ERROR_4:
|
|
return kGetUsageInfoError4;
|
|
case wvcdm::INIT_DATA_NOT_FOUND:
|
|
return kInitDataNotFound;
|
|
case wvcdm::INVALID_CRYPTO_SESSION_1:
|
|
return kInvalidCryptoSession1;
|
|
case wvcdm::INVALID_CRYPTO_SESSION_2:
|
|
return kInvalidCryptoSession2;
|
|
case wvcdm::INVALID_CRYPTO_SESSION_3:
|
|
return kInvalidCryptoSession3;
|
|
case wvcdm::INVALID_CRYPTO_SESSION_4:
|
|
return kInvalidCryptoSession4;
|
|
case wvcdm::INVALID_CRYPTO_SESSION_5:
|
|
return kInvalidCryptoSession5;
|
|
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_1:
|
|
return kInvalidDecryptParametersEng1;
|
|
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_2:
|
|
return kInvalidDecryptParametersEng2;
|
|
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_3:
|
|
return kInvalidDecryptParametersEng3;
|
|
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_4:
|
|
return kInvalidDecryptParametersEng4;
|
|
case wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT:
|
|
return android::ERROR_DRM_SESSION_NOT_OPENED;
|
|
case wvcdm::INVALID_DEVICE_CERTIFICATE_TYPE:
|
|
return kInvalidDeviceCertificateType;
|
|
case wvcdm::INVALID_KEY_SYSTEM:
|
|
return kInvalidKeySystem;
|
|
case wvcdm::INVALID_LICENSE_RESPONSE:
|
|
return kInvalidLicenseResponse;
|
|
case wvcdm::INVALID_LICENSE_TYPE:
|
|
return kInvalidLicenseType;
|
|
case wvcdm::INVALID_PARAMETERS_ENG_1:
|
|
return kInvalidParametersEng1;
|
|
case wvcdm::INVALID_PARAMETERS_ENG_2:
|
|
return kInvalidParametersEng2;
|
|
case wvcdm::INVALID_PARAMETERS_ENG_3:
|
|
return kInvalidParametersEng3;
|
|
case wvcdm::INVALID_PARAMETERS_ENG_4:
|
|
return kInvalidParametersEng4;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_1:
|
|
return kInvalidParametersLic1;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_2:
|
|
return kInvalidParametersLic2;
|
|
case wvcdm::INVALID_PROVISIONING_PARAMETERS_1:
|
|
return kInvalidProvisioningParam1;
|
|
case wvcdm::INVALID_PROVISIONING_PARAMETERS_2:
|
|
return kInvalidProvisioningParam2;
|
|
case wvcdm::INVALID_PROVISIONING_REQUEST_PARAM_1:
|
|
return kInvalidProvisioningReqParam1;
|
|
case wvcdm::INVALID_PROVISIONING_REQUEST_PARAM_2:
|
|
return kInvalidProvisioningReqParam2;
|
|
case wvcdm::INVALID_QUERY_KEY:
|
|
return kInvalidQueryKey;
|
|
case wvcdm::INVALID_SESSION_ID:
|
|
return kInvalidSessionId;
|
|
case wvcdm::KEY_REQUEST_ERROR_1:
|
|
return kKeyRequestError1;
|
|
case wvcdm::KEY_SIZE_ERROR:
|
|
return kKeySizeError;
|
|
case wvcdm::KEYSET_ID_NOT_FOUND_1:
|
|
return kKeySetIdNotFound1;
|
|
case wvcdm::KEYSET_ID_NOT_FOUND_2:
|
|
return kKeySetIdNotFound2;
|
|
case wvcdm::KEYSET_ID_NOT_FOUND_3:
|
|
return kKeySetIdNotFound3;
|
|
case wvcdm::LICENSE_ID_NOT_FOUND:
|
|
return kLicenseIdNotFound;
|
|
case wvcdm::LICENSE_PARSER_INIT_ERROR:
|
|
return kLicenseParserInitError;
|
|
case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_1:
|
|
return kLicenseParserNotInitialized1;
|
|
case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_2:
|
|
return kLicenseParserNotInitialized2;
|
|
case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_3:
|
|
return kLicenseParserNotInitialized3;
|
|
case wvcdm::LICENSE_RESPONSE_NOT_SIGNED:
|
|
return kLicenseResponseNotSigned;
|
|
case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_1:
|
|
return kLicenseResponseParseError1;
|
|
case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_2:
|
|
return kLicenseResponseParseError2;
|
|
case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_3:
|
|
return kLicenseResponseParseError3;
|
|
case wvcdm::LOAD_KEY_ERROR:
|
|
return kLoadKeyError;
|
|
case wvcdm::NO_CONTENT_KEY:
|
|
return kNoContentKey;
|
|
case wvcdm::REFRESH_KEYS_ERROR:
|
|
return kRefreshKeysError;
|
|
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_1:
|
|
return kReleaseAllUsageInfoError1;
|
|
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_2:
|
|
return kReleaseAllUsageInfoError2;
|
|
case wvcdm::RELEASE_KEY_ERROR:
|
|
return kReleaseKeyError;
|
|
case wvcdm::RELEASE_KEY_REQUEST_ERROR:
|
|
return kReleaseKeyRequestError;
|
|
case wvcdm::RELEASE_LICENSE_ERROR_1:
|
|
return kReleaseLicenseError1;
|
|
case wvcdm::RELEASE_LICENSE_ERROR_2:
|
|
return kReleaseLicenseError2;
|
|
case wvcdm::RELEASE_USAGE_INFO_ERROR:
|
|
return kReleaseUsageInfoError;
|
|
case wvcdm::RENEW_KEY_ERROR_1:
|
|
return kRenewKeyError1;
|
|
case wvcdm::RENEW_KEY_ERROR_2:
|
|
return kRenewKeyError2;
|
|
case wvcdm::LICENSE_RENEWAL_SIGNING_ERROR:
|
|
return kLicenseRenewalSigningError;
|
|
case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_1:
|
|
return kRestoreOfflineLicenseError1;
|
|
case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_2:
|
|
return kRestoreOfflineLicenseError2;
|
|
case wvcdm::SESSION_INIT_ERROR_1:
|
|
return kSessionInitError1;
|
|
case wvcdm::SESSION_INIT_ERROR_2:
|
|
return kSessionInitError2;
|
|
case wvcdm::SESSION_INIT_GET_KEYBOX_ERROR:
|
|
return kSessionInitGetKeyboxError;
|
|
case wvcdm::SESSION_NOT_FOUND_1:
|
|
return kSessionNotFound1;
|
|
case wvcdm::SESSION_NOT_FOUND_2:
|
|
return kSessionNotFound2;
|
|
case wvcdm::SESSION_NOT_FOUND_3:
|
|
return kSessionNotFound3;
|
|
case wvcdm::SESSION_NOT_FOUND_4:
|
|
return kSessionNotFound4;
|
|
case wvcdm::SESSION_NOT_FOUND_5:
|
|
return kSessionNotFound5;
|
|
case wvcdm::SESSION_NOT_FOUND_6:
|
|
return kSessionNotFound6;
|
|
case wvcdm::SESSION_NOT_FOUND_7:
|
|
return kSessionNotFound7;
|
|
case wvcdm::SESSION_NOT_FOUND_8:
|
|
return kSessionNotFound8;
|
|
case wvcdm::SESSION_NOT_FOUND_9:
|
|
return kSessionNotFound9;
|
|
case wvcdm::SESSION_NOT_FOUND_10:
|
|
return kSessionNotFound10;
|
|
case wvcdm::SESSION_KEYS_NOT_FOUND:
|
|
return kSessionKeysNotFound;
|
|
case wvcdm::SIGNATURE_NOT_FOUND:
|
|
return kSignatureNotFound;
|
|
case wvcdm::STORE_LICENSE_ERROR_1:
|
|
return kStoreLicenseError1;
|
|
case wvcdm::STORE_LICENSE_ERROR_2:
|
|
return kStoreLicenseError2;
|
|
case wvcdm::STORE_LICENSE_ERROR_3:
|
|
return kStoreLicenseError3;
|
|
case wvcdm::STORE_USAGE_INFO_ERROR:
|
|
return kStoreUsageInfoError;
|
|
case wvcdm::UNPROVISION_ERROR_1:
|
|
return kUnprovisioningError1;
|
|
case wvcdm::UNPROVISION_ERROR_2:
|
|
return kUnprovisioningError2;
|
|
case wvcdm::UNPROVISION_ERROR_3:
|
|
return kUnprovisioningError3;
|
|
case wvcdm::UNPROVISION_ERROR_4:
|
|
return kUnprovisioningError4;
|
|
case wvcdm::UNSUPPORTED_INIT_DATA:
|
|
return kUnsupportedInitData;
|
|
case wvcdm::USAGE_INFO_NOT_FOUND:
|
|
return kUsageInfoNotFound;
|
|
case wvcdm::LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR:
|
|
return kLicenseRenewalServiceCertificateGenerationError;
|
|
case wvcdm::PARSE_SERVICE_CERTIFICATE_ERROR:
|
|
return kParseServiceCertificateError;
|
|
case wvcdm::SERVICE_CERTIFICATE_TYPE_ERROR:
|
|
return kServiceCertificateTypeError;
|
|
case wvcdm::CLIENT_ID_GENERATE_RANDOM_ERROR:
|
|
return kClientIdGenerateRandomError;
|
|
case wvcdm::CLIENT_ID_AES_INIT_ERROR:
|
|
return kClientIdAesInitError;
|
|
case wvcdm::CLIENT_ID_AES_ENCRYPT_ERROR:
|
|
return kClientIdAesEncryptError;
|
|
case wvcdm::CLIENT_ID_RSA_INIT_ERROR:
|
|
return kClientIdRsaInitError;
|
|
case wvcdm::CLIENT_ID_RSA_ENCRYPT_ERROR:
|
|
return kClientIdRsaEncryptError;
|
|
case wvcdm::KEY_ERROR:
|
|
// KEY_ERROR is used by the CDM to mean just about any kind of error, not
|
|
// just license errors, so it is mapped to the generic response.
|
|
return kErrorCDMGeneric;
|
|
case wvcdm::INVALID_QUERY_STATUS:
|
|
return kInvalidQueryStatus;
|
|
case wvcdm::EMPTY_PROVISIONING_CERTIFICATE_2:
|
|
return kEmptyProvisioningCertificate2;
|
|
case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_4:
|
|
return kLicenseParserNotInitialized4;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_3:
|
|
return kInvalidParametersLic3;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_4:
|
|
return kInvalidParametersLic4;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_6:
|
|
return kInvalidParametersLic6;
|
|
case wvcdm::INVALID_PARAMETERS_LIC_7:
|
|
return kInvalidParametersLic7;
|
|
case wvcdm::LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR:
|
|
return kLicenseRequestServiceCertificateGenerationError;
|
|
case wvcdm::CENC_INIT_DATA_UNAVAILABLE:
|
|
return kCencInitDataUnavailable;
|
|
case wvcdm::PREPARE_CENC_CONTENT_ID_FAILED:
|
|
return kPrepareCencContentIdFailed;
|
|
case wvcdm::WEBM_INIT_DATA_UNAVAILABLE:
|
|
return kWebmInitDataUnavailable;
|
|
case wvcdm::PREPARE_WEBM_CONTENT_ID_FAILED:
|
|
return kPrepareWebmContentIdFailed;
|
|
case wvcdm::UNSUPPORTED_INIT_DATA_FORMAT:
|
|
return kUnsupportedInitDataFormat;
|
|
case wvcdm::LICENSE_REQUEST_NONCE_GENERATION_ERROR:
|
|
return kLicenseRequestNonceGenerationError;
|
|
case wvcdm::LICENSE_REQUEST_SIGNING_ERROR:
|
|
return kLicenseRequestSigningError;
|
|
case wvcdm::EMPTY_LICENSE_REQUEST:
|
|
return kEmptyLicenseRequest;
|
|
case wvcdm::DUPLICATE_SESSION_ID_SPECIFIED:
|
|
return kDuplicateSessionIdSpecified;
|
|
case wvcdm::LICENSE_RENEWAL_PROHIBITED:
|
|
return kLicenseRenewalProhibited;
|
|
case wvcdm::UNKNOWN_ERROR:
|
|
return android::ERROR_DRM_UNKNOWN;
|
|
case wvcdm::SECURE_BUFFER_REQUIRED:
|
|
return android::ERROR_DRM_CANNOT_HANDLE;
|
|
case wvcdm::UNUSED_1:
|
|
case wvcdm::UNUSED_2:
|
|
case wvcdm::UNUSED_3:
|
|
return android::UNKNOWN_ERROR;
|
|
}
|
|
|
|
// Return here instead of as a default case so that the compiler will warn
|
|
// us if we forget to include an enum member in the switch statement.
|
|
return android::UNKNOWN_ERROR;
|
|
}
|
|
|
|
static inline bool isCdmResponseTypeSuccess(wvcdm::CdmResponseType res) {
|
|
return mapCdmResponseType(res) == android::OK;
|
|
}
|
|
|
|
} // namespace wvdrm
|
|
|
|
#endif // WV_MAP_ERRORS_H_
|