[pulseaudio-discuss] [PATCH v2] raop: add compatibility with openssl 1.1.0
Tanu Kaskinen
tanuk at iki.fi
Thu Nov 3 12:30:05 UTC 2016
Openssl 1.1.0 made all structs opaque, which caused a build failure in
raop_client.c. The struct member assignments are now replaced with a
call to RSA_set0_key().
BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=96726
---
Changes in v2:
* More verbose comment.
* Implement RSA_set0_key() as a function instead of a macro.
* Use pa_assert_se() instead of pa_assert().
As before, I have tested that the code compiles against old and new openssl
versions, but I have not tested that the code works.
src/modules/raop/raop_client.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c
index 3b6c36e..7a7bb8a 100644
--- a/src/modules/raop/raop_client.c
+++ b/src/modules/raop/raop_client.c
@@ -68,6 +68,21 @@
#define RAOP_PORT 5000
+/* Openssl 1.1.0 broke compatibility. Before 1.1.0 we had to set RSA->n and
+ * RSA->e manually, but after 1.1.0 the RSA struct is opaque and we have to use
+ * RSA_set0_key(). RSA_set0_key() is a new function added in 1.1.0. We could
+ * depend on openssl 1.1.0, but it may take some time before distributions will
+ * be able to upgrade to the new openssl version. To insulate ourselves from
+ * such transition problems, let's implement RSA_set0_key() ourselves if it's
+ * not available. */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+static int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) {
+ r->n = n;
+ r->e = e;
+ return 1;
+}
+#endif
+
struct pa_raop_client {
pa_core *core;
char *host;
@@ -161,12 +176,15 @@ static int rsa_encrypt(uint8_t *text, int len, uint8_t *res) {
uint8_t exponent[8];
int size;
RSA *rsa;
+ BIGNUM *n_bn;
+ BIGNUM *e_bn;
rsa = RSA_new();
size = pa_base64_decode(n, modules);
- rsa->n = BN_bin2bn(modules, size, NULL);
+ n_bn = BN_bin2bn(modules, size, NULL);
size = pa_base64_decode(e, exponent);
- rsa->e = BN_bin2bn(exponent, size, NULL);
+ e_bn = BN_bin2bn(exponent, size, NULL);
+ pa_assert_se(RSA_set0_key(rsa, n_bn, e_bn, NULL) == 1);
size = RSA_public_encrypt(len, text, res, rsa, RSA_PKCS1_OAEP_PADDING);
RSA_free(rsa);
--
2.10.1
More information about the pulseaudio-discuss
mailing list