in sdk/src/azure/iot/az_iot_hub_client_sas.c [83:172]
AZ_NODISCARD az_result az_iot_hub_client_sas_get_password(
az_iot_hub_client const* client,
uint64_t token_expiration_epoch_time,
az_span base64_hmac_sha256_signature,
az_span key_name,
char* mqtt_password,
size_t mqtt_password_size,
size_t* out_mqtt_password_length)
{
_az_PRECONDITION_NOT_NULL(client);
_az_PRECONDITION_VALID_SPAN(base64_hmac_sha256_signature, 1, false);
_az_PRECONDITION(token_expiration_epoch_time > 0);
_az_PRECONDITION_NOT_NULL(mqtt_password);
_az_PRECONDITION(mqtt_password_size > 0);
// Concatenates: "SharedAccessSignature sr=" scope "&sig=" sig "&se=" expiration_time_secs
// plus, if key_name size > 0, "&skn=" key_name
az_span mqtt_password_span = az_span_create((uint8_t*)mqtt_password, (int32_t)mqtt_password_size);
// SharedAccessSignature
_az_RETURN_IF_NOT_ENOUGH_SIZE(mqtt_password_span, az_span_size(sr_string) + 1 /* EQUAL_SIGN */);
mqtt_password_span = az_span_copy(mqtt_password_span, sr_string);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, EQUAL_SIGN);
_az_RETURN_IF_FAILED(_az_span_copy_url_encode(
mqtt_password_span, client->_internal.iot_hub_hostname, &mqtt_password_span));
// Device ID
_az_RETURN_IF_NOT_ENOUGH_SIZE(mqtt_password_span, az_span_size(devices_string));
mqtt_password_span = az_span_copy(mqtt_password_span, devices_string);
_az_RETURN_IF_FAILED(_az_span_copy_url_encode(
mqtt_password_span, client->_internal.device_id, &mqtt_password_span));
// Module ID
if (az_span_size(client->_internal.options.module_id) > 0)
{
_az_RETURN_IF_NOT_ENOUGH_SIZE(mqtt_password_span, az_span_size(modules_string));
mqtt_password_span = az_span_copy(mqtt_password_span, modules_string);
_az_RETURN_IF_FAILED(_az_span_copy_url_encode(
mqtt_password_span, client->_internal.options.module_id, &mqtt_password_span));
}
// Signature
_az_RETURN_IF_NOT_ENOUGH_SIZE(
mqtt_password_span, 1 /* AMPERSAND */ + az_span_size(sig_string) + 1 /* EQUAL_SIGN */);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, AMPERSAND);
mqtt_password_span = az_span_copy(mqtt_password_span, sig_string);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, EQUAL_SIGN);
_az_RETURN_IF_FAILED(_az_span_copy_url_encode(
mqtt_password_span, base64_hmac_sha256_signature, &mqtt_password_span));
// Expiration
_az_RETURN_IF_NOT_ENOUGH_SIZE(
mqtt_password_span, 1 /* AMPERSAND */ + az_span_size(se_string) + 1 /* EQUAL_SIGN */);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, AMPERSAND);
mqtt_password_span = az_span_copy(mqtt_password_span, se_string);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, EQUAL_SIGN);
_az_RETURN_IF_FAILED(
az_span_u64toa(mqtt_password_span, token_expiration_epoch_time, &mqtt_password_span));
if (az_span_size(key_name) > 0)
{
// Key Name
_az_RETURN_IF_NOT_ENOUGH_SIZE(
mqtt_password_span,
1 /* AMPERSAND */ + az_span_size(skn_string) + 1 /* EQUAL_SIGN */ + az_span_size(key_name));
mqtt_password_span = az_span_copy_u8(mqtt_password_span, AMPERSAND);
mqtt_password_span = az_span_copy(mqtt_password_span, skn_string);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, EQUAL_SIGN);
mqtt_password_span = az_span_copy(mqtt_password_span, key_name);
}
_az_RETURN_IF_NOT_ENOUGH_SIZE(mqtt_password_span, 1 /* NULL TERMINATOR */);
mqtt_password_span = az_span_copy_u8(mqtt_password_span, STRING_NULL_TERMINATOR);
if (out_mqtt_password_length != NULL)
{
*out_mqtt_password_length
= mqtt_password_size - (size_t)az_span_size(mqtt_password_span) - 1 /* NULL TERMINATOR */;
}
return AZ_OK;
}