From fc117e73029e73401f08d459fef4050e659e6c11 Mon Sep 17 00:00:00 2001 From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:25:53 +0000 Subject: [PATCH] Modify the generation of the 12-digit classic AirPlay service name prefix so that it depends on the service name as well as the hardware address. --- mdns.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- shairport.c | 37 +++---------------------------------- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/mdns.c b/mdns.c index 9a5465c1..5dbbc102 100644 --- a/mdns.c +++ b/mdns.c @@ -48,6 +48,19 @@ extern mdns_backend mdns_external_avahi; extern mdns_backend mdns_external_dns_sd; #endif +#ifdef CONFIG_MBEDTLS +#include +#include +#endif + +#ifdef CONFIG_POLARSSL +#include +#endif + +#ifdef CONFIG_OPENSSL +#include +#endif + static mdns_backend *mdns_backends[] = { #ifdef CONFIG_AVAHI &mdns_avahi, @@ -65,11 +78,48 @@ static mdns_backend *mdns_backends[] = { NULL}; void mdns_register(char **txt_records, char **secondary_txt_records) { + + // calculate the 12-hex-digit prefix by hashing the service name. + uint8_t ap_md5[16]; + +debug(1,"size of hw_addr is %u.", sizeof(config.hw_addr)); +#ifdef CONFIG_OPENSSL + MD5_CTX ctx; + MD5_Init(&ctx); + MD5_Update(&ctx, config.service_name, strlen(config.service_name)); + MD5_Update(&ctx, config.hw_addr, sizeof(config.hw_addr)); + MD5_Final(ap_md5, &ctx); +#endif + +#ifdef CONFIG_MBEDTLS +#if MBEDTLS_VERSION_MINOR >= 7 + mbedtls_md5_context tctx; + mbedtls_md5_starts_ret(&tctx); + mbedtls_md5_update_ret(&tctx, (unsigned char *)config.service_name, strlen(config.service_name)); + mbedtls_md5_update_ret(&tctx, (unsigned char *)config.hw_addr, sizeof(config.hw_addr)); + mbedtls_md5_finish_ret(&tctx, ap_md5); +#else + mbedtls_md5_context tctx; + mbedtls_md5_starts(&tctx); + mbedtls_md5_update(&tctx, (unsigned char *)config.service_name, strlen(config.service_name)); + mbedtls_md5_update(&tctx, (unsigned char *)config.hw_addr, sizeof(config.hw_addr)); + mbedtls_md5_finish(&tctx, ap_md5); +#endif +#endif + +#ifdef CONFIG_POLARSSL + md5_context tctx; + md5_starts(&tctx); + md5_update(&tctx, (unsigned char *)config.service_name, strlen(config.service_name)); + md5_update(&tctx, (unsigned char *)config.hw_addr, sizeof(config.hw_addr)); + md5_finish(&tctx, ap_md5); +#endif + char *ap1_service_name = alloca(strlen(config.service_name) + 14); char *p = ap1_service_name; int i; for (i = 0; i < 6; i++) { - snprintf(p, 3, "%02X", config.hw_addr[i]); + snprintf(p, 3, "%02X", ap_md5[i]); p += 2; } *p++ = '@'; diff --git a/shairport.c b/shairport.c index 2ccf40ce..ac40c11f 100644 --- a/shairport.c +++ b/shairport.c @@ -2454,35 +2454,6 @@ int main(int argc, char **argv) { soxr_time_check_thread_started = 1; #endif - /* - uint8_t ap_md5[16]; - - #ifdef CONFIG_OPENSSL - MD5_CTX ctx; - MD5_Init(&ctx); - MD5_Update(&ctx, config.service_name, strlen(config.service_name)); - MD5_Final(ap_md5, &ctx); - #endif - - #ifdef CONFIG_MBEDTLS - #if MBEDTLS_VERSION_MINOR >= 7 - mbedtls_md5_context tctx; - mbedtls_md5_starts_ret(&tctx); - mbedtls_md5_update_ret(&tctx, (unsigned char *)config.service_name, - strlen(config.service_name)); mbedtls_md5_finish_ret(&tctx, ap_md5); #else mbedtls_md5_context - tctx; mbedtls_md5_starts(&tctx); mbedtls_md5_update(&tctx, (unsigned char *)config.service_name, - strlen(config.service_name)); mbedtls_md5_finish(&tctx, ap_md5); #endif #endif - - #ifdef CONFIG_POLARSSL - md5_context tctx; - md5_starts(&tctx); - md5_update(&tctx, (unsigned char *)config.service_name, strlen(config.service_name)); - md5_finish(&tctx, ap_md5); - #endif - - memcpy(config.hw_addr, ap_md5, sizeof(config.hw_addr)); - */ - #ifdef CONFIG_METADATA metadata_init(); // create the metadata pipe if necessary #endif @@ -2540,12 +2511,10 @@ int main(int argc, char **argv) { #ifdef CONFIG_METADATA send_ssnc_metadata('svna', config.service_name, strlen(config.service_name), 1); char buffer[256] = ""; - snprintf(buffer, sizeof(buffer), "%d", - config.output_rate); + snprintf(buffer, sizeof(buffer), "%d", config.output_rate); send_ssnc_metadata('ofps', buffer, strlen(buffer), 1); - snprintf(buffer, sizeof(buffer), "%s", - sps_format_description_string(config.output_format)); - send_ssnc_metadata('ofmt', buffer, strlen(buffer), 1); + snprintf(buffer, sizeof(buffer), "%s", sps_format_description_string(config.output_format)); + send_ssnc_metadata('ofmt', buffer, strlen(buffer), 1); #endif activity_monitor_start(); // not yet for AP2 -- 2.47.3