diff --git a/lib/dnssd.c b/lib/dnssd.c index fdeb03e..0725937 100644 --- a/lib/dnssd.c +++ b/lib/dnssd.c @@ -146,6 +146,8 @@ struct dnssd_s { char *hw_addr; int hw_addr_len; + char *pk; + uint32_t features1; uint32_t features2; @@ -313,7 +315,7 @@ dnssd_register_raop(dnssd_t *dnssd, unsigned short port) dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", strlen(RAOP_SF), RAOP_SF); dnssd->TXTRecordSetValue(&dnssd->raop_record, "vs", strlen(RAOP_VS), RAOP_VS); dnssd->TXTRecordSetValue(&dnssd->raop_record, "vn", strlen(RAOP_VN), RAOP_VN); - dnssd->TXTRecordSetValue(&dnssd->raop_record, "pk", strlen(PK), PK); + dnssd->TXTRecordSetValue(&dnssd->raop_record, "pk", strlen(dnssd->pk), dnssd->pk); /* Convert hardware address to string */ if (utils_hwaddr_raop(servname, sizeof(servname), dnssd->hw_addr, dnssd->hw_addr_len) < 0) { @@ -365,7 +367,7 @@ dnssd_register_airplay(dnssd_t *dnssd, unsigned short port) dnssd->TXTRecordSetValue(&dnssd->airplay_record, "features", strlen(features), features); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", strlen(AIRPLAY_FLAGS), AIRPLAY_FLAGS); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "model", strlen(GLOBAL_MODEL), GLOBAL_MODEL); - dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pk", strlen(PK), PK); + dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pk", strlen(dnssd->pk), dnssd->pk); if (dnssd->require_pw) { dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true"); } else { @@ -456,6 +458,10 @@ uint64_t dnssd_get_airplay_features(dnssd_t *dnssd) { return features; } +void dnssd_set_pk(dnssd_t *dnssd, char * pk_str) { + dnssd->pk = pk_str; +} + void dnssd_set_airplay_features(dnssd_t *dnssd, int bit, int val) { uint32_t mask; uint32_t *features; diff --git a/lib/dnssd.h b/lib/dnssd.h index 1e3da32..1f83210 100644 --- a/lib/dnssd.h +++ b/lib/dnssd.h @@ -48,7 +48,8 @@ DNSSD_API const char *dnssd_get_name(dnssd_t *dnssd, int *length); DNSSD_API const char *dnssd_get_hw_addr(dnssd_t *dnssd, int *length); DNSSD_API void dnssd_set_airplay_features(dnssd_t *dnssd, int bit, int val); DNSSD_API uint64_t dnssd_get_airplay_features(dnssd_t *dnssd); - +DNSSD_API void dnssd_set_pk(dnssd_t *dnssd, char * pk_str); + DNSSD_API void dnssd_destroy(dnssd_t *dnssd); #ifdef __cplusplus diff --git a/lib/dnssdint.h b/lib/dnssdint.h index 338b5b8..f81517c 100644 --- a/lib/dnssdint.h +++ b/lib/dnssdint.h @@ -20,7 +20,7 @@ #include "global.h" -#define PK "b07727d6f6cd6e08b58ede525ec3cdeaa252ad9f683feb212ef8a205246554e7" +//#define PK "b07727d6f6cd6e08b58ede525ec3cdeaa252ad9f683feb212ef8a205246554e7" #define RAOP_TXTVERS "1" #define RAOP_CH "2" /* Audio channels: 2 */ diff --git a/lib/raop.c b/lib/raop.c index a6a11d8..13d7c32 100644 --- a/lib/raop.c +++ b/lib/raop.c @@ -68,6 +68,9 @@ struct raop_s { /* for temporary storage of pin during pair-pin start */ unsigned short pin; + + /* public key as string */ + char pk_str[2*ED25519_KEY_SIZE + 1]; }; struct raop_conn_s { @@ -431,6 +434,13 @@ raop_init(int max_clients, raop_callbacks_t *callbacks) { return NULL; } + /* store PK as a string in raop->pk_str */ + unsigned char public_key[ED25519_KEY_SIZE]; + pairing_get_public_key(pairing, public_key); + char *pk_str = utils_pk_to_string(public_key, ED25519_KEY_SIZE); + strncpy(raop->pk_str, (const char *) pk_str, 2*ED25519_KEY_SIZE + 1); + free(pk_str); + /* Set HTTP callbacks to our handlers */ memset(&httpd_cbs, 0, sizeof(httpd_cbs)); httpd_cbs.opaque = raop; @@ -586,6 +596,7 @@ raop_set_log_callback(raop_t *raop, raop_log_callback_t callback, void *cls) { void raop_set_dnssd(raop_t *raop, dnssd_t *dnssd) { assert(dnssd); + dnssd_set_pk(dnssd, raop->pk_str); raop->dnssd = dnssd; } diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index d245c4b..8886293 100644 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -50,7 +50,7 @@ raop_handler_info(raop_conn_t *conn, utils_hwaddr_airplay(hw_addr, 3 * hw_addr_raw_len, hw_addr_raw, hw_addr_raw_len); int pk_len = 0; - char *pk = utils_parse_hex(PK, strlen(PK), &pk_len); + char *pk = utils_parse_hex(conn->raop->pk_str, strlen(conn->raop->pk_str), &pk_len); plist_t r_node = plist_new_dict(); diff --git a/lib/utils.c b/lib/utils.c index 8ad59c4..561e79b 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -186,6 +186,16 @@ char *utils_parse_hex(const char *str, int str_len, int *data_len) { return data; } +char *utils_pk_to_string(const unsigned char *pk, int pk_len) { + char *pk_str = (char *) malloc(2*pk_len + 1); + char* pos = pk_str; + for (int i = 0; i < pk_len; i++) { + snprintf(pos, 3, "%2.2x", *(pk + i)); + pos +=2; + } + return pk_str; +} + char *utils_data_to_string(const unsigned char *data, int datalen, int chars_per_line) { assert(datalen >= 0); assert(chars_per_line > 0); diff --git a/lib/utils.h b/lib/utils.h index 78e1884..d557e2f 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -25,6 +25,7 @@ int utils_read_file(char **dst, const char *pemstr); int utils_hwaddr_raop(char *str, int strlen, const char *hwaddr, int hwaddrlen); int utils_hwaddr_airplay(char *str, int strlen, const char *hwaddr, int hwaddrlen); char *utils_parse_hex(const char *str, int str_len, int *data_len); +char *utils_pk_to_string(const unsigned char *pk, int pk_len); char *utils_data_to_string(const unsigned char *data, int datalen, int chars_per_line); char *utils_data_to_text(const char *data, int datalen); void ntp_timestamp_to_time(uint64_t ntp_timestamp, char *timestamp, size_t maxsize);