summaryrefslogtreecommitdiff
path: root/security/titus/files/patch-rsa__client.cpp
blob: 5d14a7b98870f6fb482f00eb9ed105a60ba44f7d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--- rsa_client.cpp.orig	2015-11-28 22:51:00 UTC
+++ rsa_client.cpp
@@ -85,7 +85,7 @@ int	Rsa_client::rsa_private_encrypt (int flen, const u
 int	Rsa_client::rsa_finish (RSA* rsa)
 {
 	delete reinterpret_cast<Rsa_client_data*>(RSA_get_app_data(rsa));
-	if (const auto default_finish = RSA_get_default_method()->finish) {
+	if (const auto default_finish = RSA_meth_get_finish(RSA_get_default_method())) {
 		return (*default_finish)(rsa);
 	} else {
 		return 1;
@@ -94,14 +94,14 @@ int	Rsa_client::rsa_finish (RSA* rsa)
 
 const RSA_METHOD*	Rsa_client::get_rsa_method ()
 {
-	static RSA_METHOD ops;
-	if (!ops.rsa_priv_enc) {
-		ops = *RSA_get_default_method();
-		ops.rsa_priv_enc = rsa_private_encrypt;
-		ops.rsa_priv_dec = rsa_private_decrypt;
-		ops.finish = rsa_finish;
+	static RSA_METHOD* ops = NULL;
+	if (ops == NULL) {
+		ops = RSA_meth_dup(RSA_get_default_method());
+		RSA_meth_set_priv_enc(ops, rsa_private_encrypt);
+		RSA_meth_set_priv_dec(ops, rsa_private_decrypt);
+		RSA_meth_set_finish(ops, rsa_finish);
 	}
-	return &ops;
+	return ops;
 }
 
 openssl_unique_ptr<EVP_PKEY>	Rsa_client::load_private_key (uintptr_t key_id, RSA* public_rsa)
@@ -111,12 +111,10 @@ openssl_unique_ptr<EVP_PKEY>	Rsa_client::load_private_
 		throw Openssl_error(ERR_get_error());
 	}
 
-	rsa->n = BN_dup(public_rsa->n);
-	if (!rsa->n) {
-		throw Openssl_error(ERR_get_error());
-	}
-	rsa->e = BN_dup(public_rsa->e);
-	if (!rsa->e) {
+	const BIGNUM* n;
+	const BIGNUM* e;
+	RSA_get0_key(public_rsa, &n, &e, NULL);
+	if (!RSA_set0_key(rsa.get(), BN_dup(n), BN_dup(e), NULL)) {
 		throw Openssl_error(ERR_get_error());
 	}