From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:31:51 +0000 (+0000) Subject: Second attempt. Modify the generation of the 12-digit classic AirPlay service name... X-Git-Tag: 4.1.1~2^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03d291f4646ecc89ef206b25068d0926573ed36c;p=thirdparty%2Fshairport-sync.git Second attempt. 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. --- diff --git a/common.h b/common.h index a3f21126..9f323e1b 100644 --- a/common.h +++ b/common.h @@ -159,6 +159,7 @@ typedef struct { int mqtt_enable_remote; char *mqtt_empty_payload_substitute; #endif + uint8_t ap1_prefix[6]; uint8_t hw_addr[8]; // only needs 6 but 8 is handy when converting this to a number int port; int udp_port_base; diff --git a/dacp.c b/dacp.c index d557de24..49692491 100644 --- a/dacp.c +++ b/dacp.c @@ -1221,8 +1221,8 @@ int dacp_get_volume(int32_t *the_actual_volume) { http_response = dacp_get_speaker_list((dacp_spkr_stuff *)&speaker_info, 50, &speaker_count); if (http_response == 200) { // get our machine number - uint16_t *hn = (uint16_t *)config.hw_addr; - uint32_t *ln = (uint32_t *)(config.hw_addr + 2); + uint16_t *hn = (uint16_t *)config.ap1_prefix; + uint32_t *ln = (uint32_t *)(config.ap1_prefix + 2); uint64_t t1 = ntohs(*hn); uint64_t t2 = ntohl(*ln); int64_t machine_number = (t1 << 32) + t2; // this form is useful @@ -1275,8 +1275,8 @@ int dacp_set_volume(int32_t vo) { http_response = dacp_get_speaker_list((dacp_spkr_stuff *)&speaker_info, 50, &speaker_count); if (http_response == 200) { // get our machine number - uint16_t *hn = (uint16_t *)config.hw_addr; - uint32_t *ln = (uint32_t *)(config.hw_addr + 2); + uint16_t *hn = (uint16_t *)config.ap1_prefix; + uint32_t *ln = (uint32_t *)(config.ap1_prefix + 2); uint64_t t1 = ntohs(*hn); uint64_t t2 = ntohl(*ln); int64_t machine_number = (t1 << 32) + t2; // this form is useful diff --git a/mdns.c b/mdns.c index 9a5465c1..05366413 100644 --- a/mdns.c +++ b/mdns.c @@ -69,7 +69,7 @@ void mdns_register(char **txt_records, char **secondary_txt_records) { 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", config.ap1_prefix[i]); p += 2; } *p++ = '@'; diff --git a/player.c b/player.c index ec282c1c..d7fa7fdc 100644 --- a/player.c +++ b/player.c @@ -380,7 +380,6 @@ static void init_buffer(rtsp_conn_info *conn) { buffers_allocated++; } } - debug(1, "%" PRId64 " buffers allocated, %" PRId64 " buffers released.", buffers_allocated, buffers_released); } static void free_audio_buffers(rtsp_conn_info *conn) { @@ -389,6 +388,7 @@ static void free_audio_buffers(rtsp_conn_info *conn) { free(conn->audio_buffer[i].data); buffers_released++; } + debug(1, "%" PRId64 " buffers allocated, %" PRId64 " buffers released.", buffers_allocated, buffers_released); } int first_possibly_missing_frame = -1; @@ -1730,14 +1730,14 @@ void player_thread_cleanup_handler(void *arg) { int64_t elapsedMin = (time_playing / 60) % 60; int64_t elapsedSec = time_playing % 60; if (conn->frame_rate_valid) - inform("Connection %d: Playback Stopped. Total playing time %02" PRId64 ":%02" PRId64 + inform("Connection %d: Playback stopped. Total playing time %02" PRId64 ":%02" PRId64 ":%02" PRId64 ". " "Output: %0.2f (raw), %0.2f (corrected) " "frames per second.", conn->connection_number, elapsedHours, elapsedMin, elapsedSec, conn->raw_frame_rate, conn->corrected_frame_rate); else - inform("Connection %d: Playback Stopped. Total playing time %02" PRId64 ":%02" PRId64 + inform("Connection %d: Playback stopped. Total playing time %02" PRId64 ":%02" PRId64 ":%02" PRId64 ".", conn->connection_number, elapsedHours, elapsedMin, elapsedSec); } @@ -2745,14 +2745,14 @@ void *player_thread_func(void *arg) { send_ssnc_metadata('styp', "Classic", strlen("Classic"), 1); #endif if (config.statistics_requested) - inform("Connection %d: Playback Started at frame %" PRId64 " -- AirPlay 1 Compatible.", + inform("Connection %d: Playback started at frame %" PRId64 " -- AirPlay 1 Compatible.", conn->connection_number, inframe->given_timestamp); } else { #ifdef CONFIG_METADATA_HUB send_ssnc_metadata('styp', "Realtime", strlen("Realtime"), 1); #endif if (config.statistics_requested) - inform("Connection %d: Playback Started at frame %" PRId64 " -- AirPlay 2 Realtime.", + inform("Connection %d: Playback started at frame %" PRId64 " -- AirPlay 2 Realtime.", conn->connection_number, inframe->given_timestamp); } } else { @@ -2760,7 +2760,7 @@ void *player_thread_func(void *arg) { send_ssnc_metadata('styp', "Buffered", strlen("Buffered"), 1); #endif if (config.statistics_requested) - inform("Connection %d: Playback Started at frame %" PRId64 " -- AirPlay 2 Buffered.", + inform("Connection %d: Playback started at frame %" PRId64 " -- AirPlay 2 Buffered.", conn->connection_number, inframe->given_timestamp); } #else @@ -2768,7 +2768,7 @@ void *player_thread_func(void *arg) { send_ssnc_metadata('styp', "Classic", strlen("Classic"), 1); #endif if (config.statistics_requested) - inform("Connection %d: Playback Started at frame %" PRId64 " -- AirPlay 1.", conn->connection_number, inframe->given_timestamp); + inform("Connection %d: Playback started at frame %" PRId64 " -- AirPlay 1.", conn->connection_number, inframe->given_timestamp); #endif } // not too sure if abs() is implemented for int64_t, so we'll do it manually diff --git a/rtsp.c b/rtsp.c index 0a940b05..f5a97e68 100644 --- a/rtsp.c +++ b/rtsp.c @@ -1333,7 +1333,7 @@ enum rtsp_read_request_response rtsp_read_request(rtsp_conn_info *conn, rtsp_mes while (msg_size < 0) { if (conn->stop != 0) { - debug(3, "Connection %d: shutdown requested.", conn->connection_number); + debug(3, "Connection %d: Shutdown requested by client.", conn->connection_number); reply = rtsp_read_request_response_immediate_shutdown_requested; goto shutdown; } @@ -1342,7 +1342,7 @@ enum rtsp_read_request_response rtsp_read_request(rtsp_conn_info *conn, rtsp_mes if (nread == 0) { // a blocking read that returns zero means eof -- implies connection closed by client - debug(1, "Connection %d: RTSP connection closed by client.", + debug(1, "Connection %d: Connection closed by client.", conn->connection_number); reply = rtsp_read_request_response_channel_closed; // Note: the socket will be closed when the thread exits @@ -4751,7 +4751,7 @@ static void apple_challenge(int fd, rtsp_message *req, rtsp_message *resp) { } for (i = 0; i < 6; i++) - *bp++ = config.hw_addr[i]; + *bp++ = config.ap1_prefix[i]; int buflen, resplen; buflen = bp - buf; @@ -5005,7 +5005,7 @@ void rtsp_conversation_thread_cleanup_function(void *arg) { conn->audio_socket = 0; } if (conn->fd > 0) { - debug(1, "Connection %d: terminating -- closing RTSP connection socket %d: from %s:%u to self at %s:%u.", + debug(2, "Connection %d: terminating -- closing RTSP connection socket %d: from %s:%u to self at %s:%u.", conn->connection_number, conn->fd, conn->client_ip_string, conn->client_rtsp_port, conn->self_ip_string, conn->self_rtsp_port); close(conn->fd); diff --git a/shairport.c b/shairport.c index ac40c11f..07d2c234 100644 --- a/shairport.c +++ b/shairport.c @@ -2454,6 +2454,45 @@ int main(int argc, char **argv) { soxr_time_check_thread_started = 1; #endif + // 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 + + memcpy(config.ap1_prefix, ap_md5, sizeof(config.ap1_prefix)); + + #ifdef CONFIG_METADATA metadata_init(); // create the metadata pipe if necessary #endif