in provisioning_client/src/prov_device_ll_client.c [934:1083]
PROV_DEVICE_RESULT Prov_Device_LL_Register_Device(PROV_DEVICE_LL_HANDLE handle, PROV_DEVICE_CLIENT_REGISTER_DEVICE_CALLBACK register_callback, void* user_context, PROV_DEVICE_CLIENT_REGISTER_STATUS_CALLBACK reg_status_cb, void* status_ctx)
{
PROV_DEVICE_RESULT result;
if (handle == NULL || register_callback == NULL)
{
LogError("Invalid parameter specified handle: %p register_callback: %p", handle, register_callback);
result = PROV_DEVICE_RESULT_INVALID_ARG;
}
else if (handle->registration_id == NULL && (handle->registration_id = prov_auth_get_registration_id(handle->prov_auth_handle)) == NULL)
{
LogError("failure: Unable to retrieve registration Id from device auth.");
result = PROV_DEVICE_RESULT_ERROR;
}
else
{
BUFFER_HANDLE ek_value = NULL;
BUFFER_HANDLE srk_value = NULL;
if (handle->prov_state != CLIENT_STATE_READY)
{
LogError("state is invalid");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
result = PROV_DEVICE_RESULT_ERROR;
}
else
{
if (handle->hsm_type == PROV_AUTH_TYPE_TPM)
{
if ((ek_value = prov_auth_get_endorsement_key(handle->prov_auth_handle)) == NULL)
{
LogError("Could not get endorsement key from tpm");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
result = PROV_DEVICE_RESULT_ERROR;
}
else if ((srk_value = prov_auth_get_storage_key(handle->prov_auth_handle)) == NULL)
{
LogError("Could not get storage root key from tpm");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
result = PROV_DEVICE_RESULT_ERROR;
BUFFER_delete(ek_value);
}
else
{
result = PROV_DEVICE_RESULT_OK;
}
}
else if (handle->hsm_type == PROV_AUTH_TYPE_X509)
{
char* x509_cert;
char* x509_private_key;
if ((x509_cert = prov_auth_get_certificate(handle->prov_auth_handle)) == NULL)
{
LogError("Could not get the x509 certificate");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
result = PROV_DEVICE_RESULT_ERROR;
}
else if ((x509_private_key = prov_auth_get_alias_key(handle->prov_auth_handle)) == NULL)
{
LogError("Could not get the x509 alias key");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
free(x509_cert);
result = PROV_DEVICE_RESULT_ERROR;
}
else
{
if (handle->prov_transport_protocol->prov_transport_x509_cert(handle->transport_handle, x509_cert, x509_private_key) != 0)
{
LogError("unable to set the x509 certificate information on transport");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
result = PROV_DEVICE_RESULT_ERROR;
}
else
{
result = PROV_DEVICE_RESULT_OK;
}
free(x509_cert);
free(x509_private_key);
}
}
else
{
result = PROV_DEVICE_RESULT_OK;
}
}
if (result == PROV_DEVICE_RESULT_OK)
{
handle->register_callback = register_callback;
handle->user_context = user_context;
handle->register_status_cb = reg_status_cb;
handle->status_user_ctx = status_ctx;
// Free the custom data if its been allocated
if (handle->custom_response_data != NULL)
{
json_free_serialized_string(handle->custom_response_data);
handle->custom_response_data = NULL;
}
if (handle->prov_transport_protocol->prov_transport_open(handle->transport_handle, handle->registration_id, ek_value, srk_value, on_transport_registration_data, handle, on_transport_status, handle, prov_transport_challenge_callback, handle) != 0)
{
LogError("Failure establishing connection");
if (!handle->user_supplied_reg_id)
{
free(handle->registration_id);
handle->registration_id = NULL;
}
handle->register_callback = NULL;
handle->user_context = NULL;
handle->register_status_cb = NULL;
handle->status_user_ctx = NULL;
result = PROV_DEVICE_RESULT_TRANSPORT;
}
else
{
handle->transport_open = true;
handle->prov_state = CLIENT_STATE_REGISTER_SEND;
result = PROV_DEVICE_RESULT_OK;
}
BUFFER_delete(ek_value);
BUFFER_delete(srk_value);
}
}
return result;
}