[pulseaudio-discuss] [PATCH 16/25] raop: Honor encryption capability given by a remote device
Hajime Fujita
crisp.fujita at nifty.com
Sat Sep 7 09:35:05 PDT 2013
Some AirPlay device (likely a third-party one) may not support
RSA encryption. In such a case we fall back to no encryption mode.
---
src/modules/raop/module-raop-sink.c | 5 ++++-
src/modules/raop/raop_client.c | 10 ++++++++--
src/modules/raop/raop_client.h | 2 ++
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/modules/raop/module-raop-sink.c b/src/modules/raop/module-raop-sink.c
index 9a3bd59..d49877d 100644
--- a/src/modules/raop/module-raop-sink.c
+++ b/src/modules/raop/module-raop-sink.c
@@ -794,7 +794,7 @@ int pa__init(pa_module *m) {
struct userdata *u = NULL;
pa_sample_spec ss;
pa_modargs *ma = NULL;
- const char *server, *protocol;
+ const char *server, *protocol, *encryption;
pa_sink_new_data data;
char *t = NULL;
@@ -916,6 +916,9 @@ int pa__init(pa_module *m) {
goto fail;
}
+ encryption = pa_modargs_get_value(ma, "encryption", NULL);
+ pa_raop_client_set_encryption(u->raop, !pa_streq(encryption, "none"));
+
pa_raop_client_tcp_set_callback(u->raop, tcp_on_connection, u);
pa_raop_client_tcp_set_closed_callback(u->raop, tcp_on_close, u);
diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c
index fdb1a86..ba79759 100644
--- a/src/modules/raop/raop_client.c
+++ b/src/modules/raop/raop_client.c
@@ -98,6 +98,7 @@ struct pa_raop_client {
uint8_t jack_status;
/* Encryption Related bits */
+ int encryption; /* Enable encryption? */
AES_KEY aes;
uint8_t aes_iv[AES_CHUNKSIZE]; /* Initialization vector for aes-cbc */
uint8_t aes_nv[AES_CHUNKSIZE]; /* Next vector for aes-cbc */
@@ -1317,8 +1318,10 @@ int pa_raop_client_encode_sample(pa_raop_client *c, pa_memchunk *raw, pa_memchun
*(b + 3) = len & 0xff;
}
- /* Encrypt our data. */
- aes_encrypt(c, (b + header_size), size);
+ if (c->encryption) {
+ /* Encrypt our data. */
+ aes_encrypt(c, (b + header_size), size);
+ }
/* We're done with the chunk. */
pa_memblock_release(encoded->memblock);
@@ -1340,6 +1343,9 @@ void pa_raop_client_tcp_set_closed_callback(pa_raop_client *c, pa_raop_client_cl
c->tcp_closed_userdata = userdata;
}
+void pa_raop_client_set_encryption(pa_raop_client *c, int encryption) {
+ c->encryption = encryption;
+}
void pa_raop_client_udp_set_setup_callback(pa_raop_client *c, pa_raop_client_setup_cb_t callback, void *userdata) {
pa_assert(c);
diff --git a/src/modules/raop/raop_client.h b/src/modules/raop/raop_client.h
index 5cf1ff7..1b8048d 100644
--- a/src/modules/raop/raop_client.h
+++ b/src/modules/raop/raop_client.h
@@ -42,6 +42,8 @@ int pa_raop_client_flush(pa_raop_client *c);
int pa_raop_client_teardown(pa_raop_client *c);
int pa_raop_client_udp_can_stream(pa_raop_client *c);
+
+void pa_raop_client_set_encryption(pa_raop_client *c, int encryption);
int pa_raop_client_set_volume(pa_raop_client *c, pa_volume_t volume);
int pa_raop_client_encode_sample(pa_raop_client *c, pa_memchunk *raw, pa_memchunk *encoded);
--
1.8.1.2
More information about the pulseaudio-discuss
mailing list