Improve error reporting and logging.
Bug: 19603049
Bug: 19509317
Change-Id: I041c973802e6c567adc5b1f280fc5bac27ba28d6
diff --git a/soft_keymaster_device.cpp b/soft_keymaster_device.cpp
index e5c3e5d..0aa9457 100644
--- a/soft_keymaster_device.cpp
+++ b/soft_keymaster_device.cpp
@@ -41,15 +41,15 @@
struct keystore_module soft_keymaster_device_module = {
.common =
{
- .tag = HARDWARE_MODULE_TAG,
- .module_api_version = KEYMASTER_MODULE_API_VERSION_1_0,
- .hal_api_version = HARDWARE_HAL_API_VERSION,
- .id = KEYSTORE_HARDWARE_MODULE_ID,
- .name = "Keymaster OpenSSL HAL",
- .author = "The Android Open Source Project",
- .methods = NULL,
- .dso = 0,
- .reserved = {},
+ .tag = HARDWARE_MODULE_TAG,
+ .module_api_version = KEYMASTER_MODULE_API_VERSION_1_0,
+ .hal_api_version = HARDWARE_HAL_API_VERSION,
+ .id = KEYSTORE_HARDWARE_MODULE_ID,
+ .name = "Keymaster OpenSSL HAL",
+ .author = "The Android Open Source Project",
+ .methods = NULL,
+ .dso = 0,
+ .reserved = {},
},
};
@@ -160,6 +160,11 @@
const void* key_params, uint8_t** key_blob,
size_t* key_blob_length) {
LOG_D("%s", "Device received generate_keypair");
+ if (!dev || !key_params)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
+ if (!key_blob || !key_blob_length)
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
GenerateKeyRequest req;
StoreDefaultNewKeyParams(&req.key_description);
@@ -215,6 +220,12 @@
size_t* key_blob_length) {
LOG_D("Device received import_keypair");
+ if (!dev || !key)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
+ if (!key_blob || !key_blob_length)
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
+
ImportKeyRequest request;
StoreDefaultNewKeyParams(&request.key_description);
request.SetKeyMaterial(key, key_length);
@@ -245,6 +256,12 @@
uint8_t** x509_data, size_t* x509_data_length) {
LOG_D("Device received get_keypair_public");
+ if (!dev || !key_blob)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
+ if (!x509_data || !x509_data_length)
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
+
ExportKeyRequest req;
req.SetKeyMaterial(key_blob, key_blob_length);
req.key_format = KM_KEY_FORMAT_X509;
@@ -273,6 +290,12 @@
uint8_t** signed_data, size_t* signed_data_length) {
LOG_D("Device received sign_data");
+ if (!dev || !params || !key_blob)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
+ if (!signed_data || !signed_data_length)
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
+
*signed_data_length = 0;
BeginOperationRequest begin_request;
@@ -325,6 +348,9 @@
const uint8_t* signature, const size_t signature_length) {
LOG_D("Device received verify_data");
+ if (!dev || !params || !key_blob || !signed_data || !signature)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
BeginOperationRequest begin_request;
begin_request.purpose = KM_PURPOSE_VERIFY;
begin_request.SetKeyMaterial(key_blob, key_blob_length);
@@ -368,6 +394,9 @@
keymaster_error_t SoftKeymasterDevice::get_supported_algorithms(const keymaster1_device_t* dev,
keymaster_algorithm_t** algorithms,
size_t* algorithms_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!algorithms || !algorithms_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -394,6 +423,9 @@
keymaster_purpose_t purpose,
keymaster_block_mode_t** modes,
size_t* modes_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!modes || !modes_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -420,6 +452,9 @@
keymaster_purpose_t purpose,
keymaster_padding_t** modes,
size_t* modes_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!modes || !modes_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -445,6 +480,9 @@
keymaster_purpose_t purpose,
keymaster_digest_t** digests,
size_t* digests_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!digests || !digests_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -468,6 +506,9 @@
keymaster_error_t SoftKeymasterDevice::get_supported_import_formats(
const keymaster1_device_t* dev, keymaster_algorithm_t algorithm,
keymaster_key_format_t** formats, size_t* formats_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!formats || !formats_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -492,6 +533,9 @@
keymaster_error_t SoftKeymasterDevice::get_supported_export_formats(
const keymaster1_device_t* dev, keymaster_algorithm_t algorithm,
keymaster_key_format_t** formats, size_t* formats_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
if (!formats || !formats_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -515,6 +559,9 @@
/* static */
keymaster_error_t SoftKeymasterDevice::add_rng_entropy(const keymaster1_device_t* dev,
const uint8_t* data, size_t data_length) {
+ if (!dev)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+
AddEntropyRequest request;
request.random_data.Reinitialize(data, data_length);
return convert_device(dev)->impl_->AddRngEntropy(request);
@@ -524,6 +571,8 @@
keymaster_error_t SoftKeymasterDevice::generate_key(
const keymaster1_device_t* dev, const keymaster_key_param_t* params, size_t params_count,
keymaster_key_blob_t* key_blob, keymaster_key_characteristics_t** characteristics) {
+ if (!dev || !params)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
if (!key_blob)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -557,8 +606,8 @@
const keymaster1_device_t* dev, const keymaster_key_blob_t* key_blob,
const keymaster_blob_t* client_id, const keymaster_blob_t* app_data,
keymaster_key_characteristics_t** characteristics) {
- if (!key_blob)
- return KM_ERROR_INVALID_KEY_BLOB;
+ if (!dev || !key_blob || !key_blob->key_material)
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
if (!characteristics)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -584,10 +633,7 @@
size_t new_params_count, const keymaster_key_blob_t* key_blob,
const keymaster_blob_t* client_id, const keymaster_blob_t* app_data,
keymaster_key_blob_t* rescoped_key_blob, keymaster_key_characteristics_t** characteristics) {
- if (!key_blob)
- return KM_ERROR_INVALID_KEY_BLOB;
-
- if (!new_params)
+ if (!key_blob || !key_blob->key_material || !new_params)
return KM_ERROR_UNEXPECTED_NULL_POINTER;
if (!rescoped_key_blob)
@@ -658,7 +704,7 @@
const keymaster_key_blob_t* key_to_export, const keymaster_blob_t* client_id,
const keymaster_blob_t* app_data, uint8_t** export_data, size_t* export_data_length) {
if (!key_to_export || !key_to_export->key_material)
- return KM_ERROR_INVALID_KEY_BLOB;
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
if (!export_data || !export_data_length)
return KM_ERROR_OUTPUT_PARAMETER_NULL;
@@ -690,7 +736,7 @@
const keymaster_key_param_t* params, size_t params_count, keymaster_key_param_t** out_params,
size_t* out_params_count, keymaster_operation_handle_t* operation_handle) {
if (!key || !key->key_material)
- return KM_ERROR_INVALID_KEY_BLOB;
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
if (!operation_handle || !out_params || !out_params_count)
return KM_ERROR_OUTPUT_PARAMETER_NULL;