Blame SOURCES/0022-Allow-configuration-of-client-SCEP-algorithms.patch

7a8c6d
From 3523ad7b8b2349ed4ee301b992797902b7288028 Mon Sep 17 00:00:00 2001
7a8c6d
From: Trevor Vaughan <tvaughan@onyxpoint.com>
7a8c6d
Date: Fri, 23 Feb 2018 16:11:35 -0500
7a8c6d
Subject: [PATCH 22/25] Allow configuration of client SCEP algorithms
7a8c6d
7a8c6d
* Allow users to set `scep_cipher` and `scep_digest` in their CA
7a8c6d
configuration. These settings are authoritative and will override
7a8c6d
anything from the server.  This was added to support connections to
7a8c6d
systems, such as Dogtag, that do not provide a CA capabilities string
7a8c6d
and, therefore, are prone to causing incorrect ciphers to be used on the
7a8c6d
client side.
7a8c6d
7a8c6d
* In accordance with the latest SCEP Draft RFC, the default cipher has
7a8c6d
been changed to AES-256 and the default digest has been changed to
7a8c6d
SHA-256. These were chosen as reasonable defaults for most users and
7a8c6d
systems.
7a8c6d
7a8c6d
* To ease the determination of which configuration file controls what
7a8c6d
CA, the output of `getcert list-cas -v` was updated to print a
7a8c6d
`config-path` entry which will list the specific configuration
7a8c6d
associated with a given CA.
7a8c6d
7a8c6d
Closes #89
7a8c6d
---
7a8c6d
 src/getcert.c     |   6 ++
7a8c6d
 src/prefs.h       |   5 ++
7a8c6d
 src/scepgen-o.c   | 182 ++++++++++++++++++++++++++++++++++++++++++------------
7a8c6d
 src/store-files.c |  22 +++++++
7a8c6d
 src/store-int.h   |   4 ++
7a8c6d
 src/tdbus.h       |   2 +
7a8c6d
 src/tdbush.c      | 149 +++++++++++++++++++++++++++++++++++++++++++-
7a8c6d
 7 files changed, 331 insertions(+), 39 deletions(-)
7a8c6d
7a8c6d
diff --git a/src/getcert.c b/src/getcert.c
7a8c6d
index 35fd0d6..724d125 100644
7a8c6d
--- a/src/getcert.c
7a8c6d
+++ b/src/getcert.c
7a8c6d
@@ -4157,6 +4157,12 @@ list_cas(const char *argv0, int argc, const char **argv)
7a8c6d
 		if ((s != NULL) && (strlen(s) > 0)) {
7a8c6d
 			printf(_("\tpost-save command: %s\n"), s);
7a8c6d
 		}
7a8c6d
+		if (verbose > 0) {
7a8c6d
+			printf(_("\tconfig-path: %s\n"),
7a8c6d
+			       query_rep_s(bus, cas[i], CM_DBUS_CA_INTERFACE,
7a8c6d
+					   "get_config_file_path",
7a8c6d
+					   verbose, globals.tctx));
7a8c6d
+		}
7a8c6d
 	}
7a8c6d
 	return 0;
7a8c6d
 }
7a8c6d
diff --git a/src/prefs.h b/src/prefs.h
7a8c6d
index 231aea7..349ec64 100644
7a8c6d
--- a/src/prefs.h
7a8c6d
+++ b/src/prefs.h
7a8c6d
@@ -20,9 +20,12 @@
7a8c6d
 
7a8c6d
 enum cm_prefs_cipher {
7a8c6d
 	cm_prefs_aes128,
7a8c6d
+	cm_prefs_aes192,
7a8c6d
 	cm_prefs_aes256,
7a8c6d
 	cm_prefs_des3,
7a8c6d
 	cm_prefs_des,
7a8c6d
+	/* This is for the selection logic */
7a8c6d
+	cm_prefs_nocipher,
7a8c6d
 };
7a8c6d
 
7a8c6d
 enum cm_prefs_digest {
7a8c6d
@@ -31,6 +34,8 @@ enum cm_prefs_digest {
7a8c6d
 	cm_prefs_sha512,
7a8c6d
 	cm_prefs_sha1,
7a8c6d
 	cm_prefs_md5,
7a8c6d
+	/* This is for the selection logic */
7a8c6d
+	cm_prefs_nodigest,
7a8c6d
 };
7a8c6d
 
7a8c6d
 enum cm_notification_method;
7a8c6d
diff --git a/src/scepgen-o.c b/src/scepgen-o.c
7a8c6d
index d11e3de..07c2b8b 100644
7a8c6d
--- a/src/scepgen-o.c
7a8c6d
+++ b/src/scepgen-o.c
7a8c6d
@@ -433,49 +433,155 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
7a8c6d
 		free(pem);
7a8c6d
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
7a8c6d
 	}
7a8c6d
-	cipher = cm_prefs_des;
7a8c6d
-	for (i = 0;
7a8c6d
-	     (ca->cm_ca_capabilities != NULL) &&
7a8c6d
-	     (ca->cm_ca_capabilities[i] != NULL);
7a8c6d
-	     i++) {
7a8c6d
-		capability = ca->cm_ca_capabilities[i];
7a8c6d
-		if (strcmp(capability, "DES3") == 0) {
7a8c6d
-			cm_log(1, "Server supports DES3, using that.\n");
7a8c6d
+
7a8c6d
+	char* scep_cipher = ca->cm_ca_scep_cipher;
7a8c6d
+	if (scep_cipher != NULL) {
7a8c6d
+		/* Force the cipher to whatever is in the configuration */
7a8c6d
+		if (strcmp(scep_cipher, "AES256") == 0) {
7a8c6d
+			cipher = cm_prefs_aes256;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_cipher, "AES192") == 0) {
7a8c6d
+			cipher = cm_prefs_aes192;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_cipher, "AES128") == 0) {
7a8c6d
+			cipher = cm_prefs_aes128;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_cipher, "DES3") == 0) {
7a8c6d
 			cipher = cm_prefs_des3;
7a8c6d
-			break;
7a8c6d
-		}
7a8c6d
-	}
7a8c6d
-	if (cipher == cm_prefs_des) {
7a8c6d
-		cm_log(1, "Server does not support DES3, using DES.\n");
7a8c6d
-	}
7a8c6d
-	pref_digest = cm_prefs_preferred_digest();
7a8c6d
-	digest = cm_prefs_md5;
7a8c6d
-	for (i = 0;
7a8c6d
-	     (ca->cm_ca_capabilities != NULL) &&
7a8c6d
-	     (ca->cm_ca_capabilities[i] != NULL);
7a8c6d
-	     i++) {
7a8c6d
-		capability = ca->cm_ca_capabilities[i];
7a8c6d
-		if ((pref_digest == cm_prefs_sha1) &&
7a8c6d
-		    (strcmp(capability, "SHA-1") == 0)) {
7a8c6d
-			cm_log(1, "Server supports SHA-1, using that.\n");
7a8c6d
-			digest = cm_prefs_sha1;
7a8c6d
-			break;
7a8c6d
 		}
7a8c6d
-		if ((pref_digest == cm_prefs_sha256) &&
7a8c6d
-		    (strcmp(capability, "SHA-256") == 0)) {
7a8c6d
-			cm_log(1, "Server supports SHA-256, using that.\n");
7a8c6d
-			digest = cm_prefs_sha256;
7a8c6d
-			break;
7a8c6d
+		else if (strcmp(scep_cipher, "DES") == 0) {
7a8c6d
+			cipher = cm_prefs_des;
7a8c6d
 		}
7a8c6d
-		if ((pref_digest == cm_prefs_sha512) &&
7a8c6d
-		    (strcmp(capability, "SHA-512") == 0)) {
7a8c6d
-			cm_log(1, "Server supports SHA-512, using that.\n");
7a8c6d
-			digest = cm_prefs_sha512;
7a8c6d
-			break;
7a8c6d
+		else {
7a8c6d
+			cm_log(1, "Option 'scep_cipher' must be one of AES256, AES192, AES128, DES3, or DES. Got '%s'\n", scep_cipher);
7a8c6d
+			_exit(1);
7a8c6d
+		}
7a8c6d
+
7a8c6d
+		cm_log(1, "SCEP cipher authoritatively set to: '%s'\n", scep_cipher);
7a8c6d
+	}
7a8c6d
+	else {
7a8c6d
+		cipher = cm_prefs_nocipher;
7a8c6d
+		for (i = 0;
7a8c6d
+		     (ca->cm_ca_capabilities != NULL) &&
7a8c6d
+		     (ca->cm_ca_capabilities[i] != NULL);
7a8c6d
+		     i++) {
7a8c6d
+			capability = ca->cm_ca_capabilities[i];
7a8c6d
+			if ((strcmp(capability, "AES-256") == 0) ||
7a8c6d
+				(strcmp(capability, "AES256") == 0)) {
7a8c6d
+					cm_log(1, "Server supports AES256, using that.\n");
7a8c6d
+					cipher = cm_prefs_aes256;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if ((strcmp(capability, "AES-192") == 0) ||
7a8c6d
+				(strcmp(capability, "AES192") == 0)) {
7a8c6d
+					cm_log(1, "Server supports AES192, using that.\n");
7a8c6d
+					cipher = cm_prefs_aes192;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if ((strcmp(capability, "AES-128") == 0) ||
7a8c6d
+				(strcmp(capability, "AES128") == 0)) {
7a8c6d
+					cm_log(1, "Server supports AES128, using that.\n");
7a8c6d
+					cipher = cm_prefs_aes128;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if (strcmp(capability, "AES") == 0) {
7a8c6d
+				cm_log(1, "Server supports AES, using AES256.\n");
7a8c6d
+				cipher = cm_prefs_aes256;
7a8c6d
+				break;
7a8c6d
+			}
7a8c6d
+			if (strcmp(capability, "DES3") == 0) {
7a8c6d
+				cm_log(1, "Server supports DES3, using that.\n");
7a8c6d
+				cipher = cm_prefs_des3;
7a8c6d
+				break;
7a8c6d
+			}
7a8c6d
+			/* This remains for backward compatibility */
7a8c6d
+			if (strcmp(capability, "DES") == 0) {
7a8c6d
+				cm_log(1, "Server supports DES, using that.\n");
7a8c6d
+				cipher = cm_prefs_des;
7a8c6d
+				break;
7a8c6d
+			}
7a8c6d
+		}
7a8c6d
+		if (cipher == cm_prefs_nocipher) {
7a8c6d
+			/* Per the latest Draft RFC */
7a8c6d
+			cm_log(1, "Could not determine supported CA capabilities, using AES256.\n");
7a8c6d
+			cipher = cm_prefs_aes256;
7a8c6d
 		}
7a8c6d
 	}
7a8c6d
-	if (digest == cm_prefs_md5) {
7a8c6d
-		cm_log(1, "Server does not support better digests, using MD5.\n");
7a8c6d
+
7a8c6d
+	char* scep_digest = ca->cm_ca_scep_digest;
7a8c6d
+	if (scep_digest != NULL) {
7a8c6d
+		/* Force the digest to whatever is in the configuration */
7a8c6d
+		if (strcmp(scep_digest, "SHA512") == 0) {
7a8c6d
+			digest = cm_prefs_sha512;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_digest, "SHA384") == 0) {
7a8c6d
+			digest = cm_prefs_sha384;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_digest, "SHA256") == 0) {
7a8c6d
+			digest = cm_prefs_sha256;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_digest, "SHA1") == 0) {
7a8c6d
+			digest = cm_prefs_sha1;
7a8c6d
+		}
7a8c6d
+		else if (strcmp(scep_digest, "MD5") == 0) {
7a8c6d
+			digest = cm_prefs_md5;
7a8c6d
+		}
7a8c6d
+		else {
7a8c6d
+			cm_log(1, "Option 'scep_digest' must be one of AES256, AES192, AES128, DES3, or DES. Got '%s'\n", scep_digest);
7a8c6d
+			_exit(1);
7a8c6d
+		}
7a8c6d
+
7a8c6d
+		cm_log(1, "SCEP digest authoritatively set to: '%s'\n", scep_digest);
7a8c6d
+	}
7a8c6d
+	else {
7a8c6d
+		pref_digest = cm_prefs_preferred_digest();
7a8c6d
+		digest = cm_prefs_nodigest;
7a8c6d
+		for (i = 0;
7a8c6d
+		     (ca->cm_ca_capabilities != NULL) &&
7a8c6d
+		     (ca->cm_ca_capabilities[i] != NULL);
7a8c6d
+		     i++) {
7a8c6d
+			capability = ca->cm_ca_capabilities[i];
7a8c6d
+			if ((pref_digest == cm_prefs_sha512) &&
7a8c6d
+			    ((strcmp(capability, "SHA-512") == 0) ||
7a8c6d
+				(strcmp(capability, "SHA512") == 0))) {
7a8c6d
+					cm_log(1, "Server supports SHA-512, using that.\n");
7a8c6d
+					digest = cm_prefs_sha512;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if ((pref_digest == cm_prefs_sha384) &&
7a8c6d
+			    ((strcmp(capability, "SHA-384") == 0) ||
7a8c6d
+				(strcmp(capability, "SHA384") == 0))) {
7a8c6d
+					cm_log(1, "Server supports SHA-384, using that.\n");
7a8c6d
+					digest = cm_prefs_sha384;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if ((pref_digest == cm_prefs_sha256) &&
7a8c6d
+			    ((strcmp(capability, "SHA-256") == 0) ||
7a8c6d
+				(strcmp(capability, "SHA256") == 0))) {
7a8c6d
+					cm_log(1, "Server supports SHA-256, using that.\n");
7a8c6d
+					digest = cm_prefs_sha256;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			if ((pref_digest == cm_prefs_sha1) &&
7a8c6d
+			    ((strcmp(capability, "SHA-1") == 0) ||
7a8c6d
+				(strcmp(capability, "SHA1") == 0))) {
7a8c6d
+					cm_log(1, "Server supports SHA-1, using that.\n");
7a8c6d
+					digest = cm_prefs_sha1;
7a8c6d
+					break;
7a8c6d
+			}
7a8c6d
+			/* This remains for backward compatibility */
7a8c6d
+			if ((pref_digest == cm_prefs_sha1) &&
7a8c6d
+			    (strcmp(capability, "MD5") == 0)) {
7a8c6d
+				cm_log(1, "Server supports MD5, using that.\n");
7a8c6d
+				digest = cm_prefs_md5;
7a8c6d
+				break;
7a8c6d
+			}
7a8c6d
+		}
7a8c6d
+		if (digest == cm_prefs_nodigest) {
7a8c6d
+			/* Per the latest Draft RFC */
7a8c6d
+			cm_log(1, "Could not determine supported CA capabilities, using SHA256.\n");
7a8c6d
+			digest = cm_prefs_sha256;
7a8c6d
+		}
7a8c6d
 	}
7a8c6d
 	if (old_cert != NULL) {
7a8c6d
 		if (cm_pkcs7_envelope_ias(ca->cm_ca_encryption_cert, cipher,
7a8c6d
diff --git a/src/store-files.c b/src/store-files.c
7a8c6d
index 977e896..c7195c4 100644
7a8c6d
--- a/src/store-files.c
7a8c6d
+++ b/src/store-files.c
7a8c6d
@@ -206,6 +206,8 @@ enum cm_store_file_field {
7a8c6d
 	cm_store_ca_field_other_cert_nssdbs,
7a8c6d
 
7a8c6d
 	cm_store_ca_field_capabilities,
7a8c6d
+	cm_store_ca_field_scep_cipher,
7a8c6d
+	cm_store_ca_field_scep_digest,
7a8c6d
 	cm_store_ca_field_scep_ca_identifier,
7a8c6d
 	cm_store_ca_field_encryption_cert,
7a8c6d
 	cm_store_ca_field_encryption_issuer_cert,
7a8c6d
@@ -385,6 +387,8 @@ static struct cm_store_file_field_list {
7a8c6d
 	{cm_store_ca_field_other_cert_nssdbs, "ca_other_cert_dbs"},
7a8c6d
 
7a8c6d
 	{cm_store_ca_field_capabilities, "ca_capabilities"},
7a8c6d
+	{cm_store_ca_field_scep_cipher, "scep_cipher"},
7a8c6d
+	{cm_store_ca_field_scep_digest, "scep_digest"},
7a8c6d
 	{cm_store_ca_field_scep_ca_identifier, "scep_ca_identifier"},
7a8c6d
 	{cm_store_ca_field_encryption_cert, "ca_encryption_cert"},
7a8c6d
 	{cm_store_ca_field_encryption_issuer_cert, "ca_encryption_issuer_cert"},
7a8c6d
@@ -725,6 +729,8 @@ cm_store_entry_read(void *parent, const char *filename, FILE *fp)
7a8c6d
 			case cm_store_ca_field_other_root_cert_nssdbs:
7a8c6d
 			case cm_store_ca_field_other_cert_nssdbs:
7a8c6d
 			case cm_store_ca_field_capabilities:
7a8c6d
+			case cm_store_ca_field_scep_cipher:
7a8c6d
+			case cm_store_ca_field_scep_digest:
7a8c6d
 			case cm_store_ca_field_scep_ca_identifier:
7a8c6d
 			case cm_store_ca_field_encryption_cert:
7a8c6d
 			case cm_store_ca_field_encryption_issuer_cert:
7a8c6d
@@ -1523,6 +1529,14 @@ cm_store_ca_read(void *parent, const char *filename, FILE *fp)
7a8c6d
 				ret->cm_ca_capabilities =
7a8c6d
 					free_if_empty_multi(ret, p);
7a8c6d
 				break;
7a8c6d
+			case cm_store_ca_field_scep_cipher:
7a8c6d
+				ret->cm_ca_scep_cipher =
7a8c6d
+					free_if_empty(p);
7a8c6d
+				break;
7a8c6d
+			case cm_store_ca_field_scep_digest:
7a8c6d
+				ret->cm_ca_scep_digest =
7a8c6d
+					free_if_empty(p);
7a8c6d
+				break;
7a8c6d
 			case cm_store_ca_field_scep_ca_identifier:
7a8c6d
 				ret->cm_ca_scep_ca_identifier =
7a8c6d
 					free_if_empty(p);
7a8c6d
@@ -2339,6 +2353,10 @@ cm_store_ca_write(FILE *fp, struct cm_store_ca *ca)
7a8c6d
 				 ca->cm_ca_other_cert_store_nssdbs);
7a8c6d
 	cm_store_file_write_strs(fp, cm_store_ca_field_capabilities,
7a8c6d
 				 ca->cm_ca_capabilities);
7a8c6d
+	cm_store_file_write_str(fp, cm_store_ca_field_scep_cipher,
7a8c6d
+				ca->cm_ca_scep_cipher);
7a8c6d
+	cm_store_file_write_str(fp, cm_store_ca_field_scep_digest,
7a8c6d
+				ca->cm_ca_scep_digest);
7a8c6d
 	cm_store_file_write_str(fp, cm_store_ca_field_scep_ca_identifier,
7a8c6d
 				ca->cm_ca_scep_ca_identifier);
7a8c6d
 	cm_store_file_write_str(fp, cm_store_ca_field_encryption_cert,
7a8c6d
@@ -2861,6 +2879,10 @@ cm_store_ca_dup(void *parent, struct cm_store_ca *ca)
7a8c6d
 
7a8c6d
 	ret->cm_ca_capabilities =
7a8c6d
 		cm_store_maybe_strdupv(ret, ca->cm_ca_capabilities);
7a8c6d
+	ret->cm_ca_scep_cipher =
7a8c6d
+		cm_store_maybe_strdup(ret, ca->cm_ca_scep_cipher);
7a8c6d
+	ret->cm_ca_scep_digest =
7a8c6d
+		cm_store_maybe_strdup(ret, ca->cm_ca_scep_digest);
7a8c6d
 	ret->cm_ca_scep_ca_identifier =
7a8c6d
 		cm_store_maybe_strdup(ret, ca->cm_ca_scep_ca_identifier);
7a8c6d
 	ret->cm_ca_encryption_cert =
7a8c6d
diff --git a/src/store-int.h b/src/store-int.h
7a8c6d
index 98b37e6..4a40406 100644
7a8c6d
--- a/src/store-int.h
7a8c6d
+++ b/src/store-int.h
7a8c6d
@@ -349,6 +349,10 @@ struct cm_store_ca {
7a8c6d
 	char **cm_ca_other_cert_store_nssdbs;
7a8c6d
 	/* CA capabilities.  Currently only ever SCEP capabilities. */
7a8c6d
 	char **cm_ca_capabilities;
7a8c6d
+	/* SCEP Cipher to use. Overrides CA Capabilities */
7a8c6d
+	char *cm_ca_scep_cipher;
7a8c6d
+	/* SCEP Digest to use. Overrides CA Capabilities */
7a8c6d
+	char *cm_ca_scep_digest;
7a8c6d
 	/* An SCEP CA identifier, for use in gathering an RA (and possibly a
7a8c6d
 	 * CA) certificate. */
7a8c6d
 	char *cm_ca_scep_ca_identifier;
7a8c6d
diff --git a/src/tdbus.h b/src/tdbus.h
7a8c6d
index 7164f11..e63e783 100644
7a8c6d
--- a/src/tdbus.h
7a8c6d
+++ b/src/tdbus.h
7a8c6d
@@ -119,6 +119,8 @@
7a8c6d
 #define CM_DBUS_PROP_ROOT_CERTS "root-certs"
7a8c6d
 #define CM_DBUS_PROP_OTHER_ROOT_CERTS "root-other-certs"
7a8c6d
 #define CM_DBUS_PROP_OTHER_CERTS "other-certs"
7a8c6d
+#define CM_DBUS_PROP_SCEP_CIPHER "scep-cipher"
7a8c6d
+#define CM_DBUS_PROP_SCEP_DIGEST "scep-digest"
7a8c6d
 #define CM_DBUS_PROP_SCEP_CA_IDENTIFIER "scep-ca-identifier"
7a8c6d
 #define CM_DBUS_PROP_SCEP_CA_CAPABILITIES "scep-ca-capabilities"
7a8c6d
 #define CM_DBUS_PROP_SCEP_RA_CERT "scep-ra-cert"
7a8c6d
diff --git a/src/tdbush.c b/src/tdbush.c
7a8c6d
index 04fe57e..3ce6c40 100644
7a8c6d
--- a/src/tdbush.c
7a8c6d
+++ b/src/tdbush.c
7a8c6d
@@ -2128,6 +2128,27 @@ ca_get_serial(DBusConnection *conn, DBusMessage *msg,
7a8c6d
 	}
7a8c6d
 }
7a8c6d
 
7a8c6d
+/* org.fedorahosted.certonger.ca.get_config_file_path */
7a8c6d
+ca_get_config_file_path(DBusConnection *conn, DBusMessage *msg,
7a8c6d
+		struct cm_client_info *ci, struct cm_context *ctx)
7a8c6d
+{
7a8c6d
+	DBusMessage *rep;
7a8c6d
+	struct cm_store_ca *ca;
7a8c6d
+	ca = get_ca_for_request_message(msg, ctx);
7a8c6d
+	if (ca == NULL) {
7a8c6d
+		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
7a8c6d
+	}
7a8c6d
+	rep = dbus_message_new_method_return(msg);
7a8c6d
+	if (rep != NULL) {
7a8c6d
+		cm_tdbusm_set_s(rep, ca->cm_store_private);
7a8c6d
+		dbus_connection_send(conn, rep, NULL);
7a8c6d
+		dbus_message_unref(rep);
7a8c6d
+		return DBUS_HANDLER_RESULT_HANDLED;
7a8c6d
+	} else {
7a8c6d
+		return send_internal_ca_error(conn, msg);
7a8c6d
+	}
7a8c6d
+}
7a8c6d
+
7a8c6d
 /* org.fedorahosted.certonger.ca.refresh */
7a8c6d
 static DBusHandlerResult
7a8c6d
 ca_refresh(DBusConnection *conn, DBusMessage *msg,
7a8c6d
@@ -2262,6 +2283,106 @@ ca_prop_set_external_helper(struct cm_context *ctx, void *parent,
7a8c6d
 }
7a8c6d
 
7a8c6d
 static const char *
7a8c6d
+ca_prop_get_scep_cipher(struct cm_context *ctx, void *parent,
7a8c6d
+			       void *record, const char *name)
7a8c6d
+{
7a8c6d
+	struct cm_store_ca *ca = record;
7a8c6d
+
7a8c6d
+	if (strcmp(name, CM_DBUS_PROP_SCEP_CIPHER) == 0) {
7a8c6d
+		if (ca->cm_ca_type != cm_ca_external) {
7a8c6d
+			return "";
7a8c6d
+		}
7a8c6d
+		if (ca->cm_ca_scep_cipher != NULL) {
7a8c6d
+			return ca->cm_ca_scep_cipher;
7a8c6d
+		} else {
7a8c6d
+			return "";
7a8c6d
+		}
7a8c6d
+	}
7a8c6d
+	return NULL;
7a8c6d
+}
7a8c6d
+
7a8c6d
+static void
7a8c6d
+ca_prop_set_scep_cipher(struct cm_context *ctx, void *parent,
7a8c6d
+			       void *record, const char *name,
7a8c6d
+			       const char *new_value)
7a8c6d
+{
7a8c6d
+	const char *propname[2], *path;
7a8c6d
+	struct cm_store_ca *ca = record;
7a8c6d
+	enum cm_ca_phase phase;
7a8c6d
+
7a8c6d
+	if (strcmp(name, CM_DBUS_PROP_SCEP_CIPHER) == 0) {
7a8c6d
+		if (ca->cm_ca_type != cm_ca_external) {
7a8c6d
+			return;
7a8c6d
+		}
7a8c6d
+		talloc_free(ca->cm_ca_scep_cipher);
7a8c6d
+		ca->cm_ca_scep_cipher = new_value ?
7a8c6d
+					       talloc_strdup(ca, new_value) :
7a8c6d
+					       NULL;
7a8c6d
+		for (phase = 0; phase < cm_ca_phase_invalid; phase++) {
7a8c6d
+			cm_restart_ca(ctx, ca->cm_nickname, phase);
7a8c6d
+		}
7a8c6d
+		propname[0] = CM_DBUS_PROP_SCEP_CIPHER;
7a8c6d
+		propname[1] = NULL;
7a8c6d
+		path = talloc_asprintf(parent, "%s/%s",
7a8c6d
+				       CM_DBUS_CA_PATH,
7a8c6d
+				       ca->cm_busname);
7a8c6d
+		cm_tdbush_property_emit_changed(ctx, path,
7a8c6d
+						CM_DBUS_CA_INTERFACE,
7a8c6d
+						propname);
7a8c6d
+	}
7a8c6d
+}
7a8c6d
+
7a8c6d
+static const char *
7a8c6d
+ca_prop_get_scep_digest(struct cm_context *ctx, void *parent,
7a8c6d
+			       void *record, const char *name)
7a8c6d
+{
7a8c6d
+	struct cm_store_ca *ca = record;
7a8c6d
+
7a8c6d
+	if (strcmp(name, CM_DBUS_PROP_SCEP_DIGEST) == 0) {
7a8c6d
+		if (ca->cm_ca_type != cm_ca_external) {
7a8c6d
+			return "";
7a8c6d
+		}
7a8c6d
+		if (ca->cm_ca_scep_digest != NULL) {
7a8c6d
+			return ca->cm_ca_scep_digest;
7a8c6d
+		} else {
7a8c6d
+			return "";
7a8c6d
+		}
7a8c6d
+	}
7a8c6d
+	return NULL;
7a8c6d
+}
7a8c6d
+
7a8c6d
+static void
7a8c6d
+ca_prop_set_scep_digest(struct cm_context *ctx, void *parent,
7a8c6d
+			       void *record, const char *name,
7a8c6d
+			       const char *new_value)
7a8c6d
+{
7a8c6d
+	const char *propname[2], *path;
7a8c6d
+	struct cm_store_ca *ca = record;
7a8c6d
+	enum cm_ca_phase phase;
7a8c6d
+
7a8c6d
+	if (strcmp(name, CM_DBUS_PROP_SCEP_DIGEST) == 0) {
7a8c6d
+		if (ca->cm_ca_type != cm_ca_external) {
7a8c6d
+			return;
7a8c6d
+		}
7a8c6d
+		talloc_free(ca->cm_ca_scep_digest);
7a8c6d
+		ca->cm_ca_scep_digest = new_value ?
7a8c6d
+					       talloc_strdup(ca, new_value) :
7a8c6d
+					       NULL;
7a8c6d
+		for (phase = 0; phase < cm_ca_phase_invalid; phase++) {
7a8c6d
+			cm_restart_ca(ctx, ca->cm_nickname, phase);
7a8c6d
+		}
7a8c6d
+		propname[0] = CM_DBUS_PROP_SCEP_DIGEST;
7a8c6d
+		propname[1] = NULL;
7a8c6d
+		path = talloc_asprintf(parent, "%s/%s",
7a8c6d
+				       CM_DBUS_CA_PATH,
7a8c6d
+				       ca->cm_busname);
7a8c6d
+		cm_tdbush_property_emit_changed(ctx, path,
7a8c6d
+						CM_DBUS_CA_INTERFACE,
7a8c6d
+						propname);
7a8c6d
+	}
7a8c6d
+}
7a8c6d
+
7a8c6d
+static const char *
7a8c6d
 ca_prop_get_scep_ca_identifier(struct cm_context *ctx, void *parent,
7a8c6d
 			       void *record, const char *name)
7a8c6d
 {
7a8c6d
@@ -7232,6 +7353,14 @@ cm_tdbush_iface_ca(void)
7a8c6d
 	if (ret == NULL) {
7a8c6d
 		ret = make_interface(CM_DBUS_CA_INTERFACE,
7a8c6d
 				     make_interface_item(cm_tdbush_interface_method,
7a8c6d
+							 make_method("get_config_file_path",
7a8c6d
+								     ca_get_config_file_path,
7a8c6d
+								     make_method_arg("path",
7a8c6d
+										     DBUS_TYPE_STRING_AS_STRING,
7a8c6d
+										     cm_tdbush_method_arg_out,
7a8c6d
+										     NULL),
7a8c6d
+								     NULL),
7a8c6d
+				     make_interface_item(cm_tdbush_interface_method,
7a8c6d
 							 make_method("get_nickname",
7a8c6d
 								     ca_get_nickname,
7a8c6d
 								     make_method_arg("nickname",
7a8c6d
@@ -7483,6 +7612,24 @@ cm_tdbush_iface_ca(void)
7a8c6d
 								       NULL, NULL, NULL, NULL, NULL,
7a8c6d
 								       NULL),
7a8c6d
 				     make_interface_item(cm_tdbush_interface_property,
7a8c6d
+							 make_property(CM_DBUS_PROP_SCEP_CIPHER,
7a8c6d
+								       cm_tdbush_property_string,
7a8c6d
+								       cm_tdbush_property_readwrite,
7a8c6d
+								       cm_tdbush_property_special,
7a8c6d
+								       0,
7a8c6d
+								       ca_prop_get_scep_cipher, NULL, NULL, NULL, NULL,
7a8c6d
+								       ca_prop_set_scep_cipher, NULL, NULL, NULL, NULL,
7a8c6d
+								       NULL),
7a8c6d
+				     make_interface_item(cm_tdbush_interface_property,
7a8c6d
+							 make_property(CM_DBUS_PROP_SCEP_DIGEST,
7a8c6d
+								       cm_tdbush_property_string,
7a8c6d
+								       cm_tdbush_property_readwrite,
7a8c6d
+								       cm_tdbush_property_special,
7a8c6d
+								       0,
7a8c6d
+								       ca_prop_get_scep_digest, NULL, NULL, NULL, NULL,
7a8c6d
+								       ca_prop_set_scep_digest, NULL, NULL, NULL, NULL,
7a8c6d
+								       NULL),
7a8c6d
+				     make_interface_item(cm_tdbush_interface_property,
7a8c6d
 							 make_property(CM_DBUS_PROP_SCEP_CA_IDENTIFIER,
7a8c6d
 								       cm_tdbush_property_string,
7a8c6d
 								       cm_tdbush_property_readwrite,
7a8c6d
@@ -7527,7 +7674,7 @@ cm_tdbush_iface_ca(void)
7a8c6d
 								       NULL, NULL, NULL, NULL, NULL,
7a8c6d
 								       NULL, NULL, NULL, NULL, NULL,
7a8c6d
 								       NULL),
7a8c6d
-				     NULL))))))))))))))))))))))))))))))))))));
7a8c6d
+				     NULL)))))))))))))))))))))))))))))))))))))));
7a8c6d
 	}
7a8c6d
 	return ret;
7a8c6d
 }
7a8c6d
-- 
7a8c6d
1.8.3.1
7a8c6d