changeset 26356:8f8906188bb4

lib-dcrypt: Add key usage and id These can be used for e.g. JWK keys.
author Aki Tuomi <aki.tuomi@open-xchange.com>
date Fri, 23 Aug 2019 10:42:09 +0300
parents ec5b58066054
children 9f21a249c853
files src/lib-dcrypt/dcrypt-openssl.c src/lib-dcrypt/dcrypt-private.h src/lib-dcrypt/dcrypt.c src/lib-dcrypt/dcrypt.h
diffstat 4 files changed, 92 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dcrypt/dcrypt-openssl.c	Fri Aug 23 11:51:21 2019 +0300
+++ b/src/lib-dcrypt/dcrypt-openssl.c	Fri Aug 23 10:42:09 2019 +0300
@@ -2198,6 +2198,7 @@
 	*key = NULL;
 	if (--_key->ref > 0) return;
 	EVP_PKEY_free(_key->key);
+	i_free(_key->key_id);
 	i_free(_key);
 }
 
@@ -2211,6 +2212,7 @@
 	*key = NULL;
 	if (--_key->ref > 0) return;
 	EVP_PKEY_free(_key->key);
+	i_free(_key->key_id);
 	i_free(_key);
 }
 
--- a/src/lib-dcrypt/dcrypt-private.h	Fri Aug 23 11:51:21 2019 +0300
+++ b/src/lib-dcrypt/dcrypt-private.h	Fri Aug 23 10:42:09 2019 +0300
@@ -171,6 +171,16 @@
 				    const char **error_r);
 	bool (*key_get_curve_public)(struct dcrypt_public_key *key,
 				     const char **curve_r, const char **error_r);
+	const char *(*key_get_id_public)(struct dcrypt_public_key *key);
+	const char *(*key_get_id_private)(struct dcrypt_private_key *key);
+	void (*key_set_id_public)(struct dcrypt_public_key *key, const char *id);
+	void (*key_set_id_private)(struct dcrypt_private_key *key, const char *id);
+	enum dcrypt_key_usage (*key_get_usage_public)(struct dcrypt_public_key *key);
+	enum dcrypt_key_usage (*key_get_usage_private)(struct dcrypt_private_key *key);
+	void (*key_set_usage_public)(struct dcrypt_public_key *key,
+				     enum dcrypt_key_usage usage);
+	void (*key_set_usage_private)(struct dcrypt_private_key *key,
+				      enum dcrypt_key_usage usage);
 };
 
 void dcrypt_set_vfs(struct dcrypt_vfs *vfs);
--- a/src/lib-dcrypt/dcrypt.c	Fri Aug 23 11:51:21 2019 +0300
+++ b/src/lib-dcrypt/dcrypt.c	Fri Aug 23 10:42:09 2019 +0300
@@ -501,3 +501,69 @@
 	}
 	return dcrypt_vfs->key_get_curve_public(key, curve_r, error_r);
 }
+
+const char *dcrypt_key_get_id_public(struct dcrypt_public_key *key)
+{
+	i_assert(dcrypt_vfs != NULL);
+	if (dcrypt_vfs->key_get_id_public == NULL)
+		return NULL;
+	return dcrypt_vfs->key_get_id_public(key);
+}
+
+const char *dcrypt_key_get_id_private(struct dcrypt_private_key *key)
+{
+	i_assert(dcrypt_vfs != NULL);
+	if (dcrypt_vfs->key_get_id_private == NULL)
+		return NULL;
+	return dcrypt_vfs->key_get_id_private(key);
+}
+
+void dcrypt_key_set_id_public(struct dcrypt_public_key *key, const char *id)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_set_id_public == NULL)
+                return;
+        dcrypt_vfs->key_set_id_public(key, id);
+}
+
+void dcrypt_key_set_id_private(struct dcrypt_private_key *key, const char *id)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_set_id_private == NULL)
+                return;
+        dcrypt_vfs->key_set_id_private(key, id);
+}
+
+enum dcrypt_key_usage dcrypt_key_get_usage_public(struct dcrypt_public_key *key)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_get_usage_public == NULL)
+                return DCRYPT_KEY_USAGE_NONE;
+        return dcrypt_vfs->key_get_usage_public(key);
+}
+
+enum dcrypt_key_usage dcrypt_key_get_usage_private(struct dcrypt_private_key *key)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_get_usage_private == NULL)
+                return DCRYPT_KEY_USAGE_NONE;
+        return dcrypt_vfs->key_get_usage_private(key);
+}
+
+void dcrypt_key_set_usage_public(struct dcrypt_public_key *key,
+				 enum dcrypt_key_usage usage)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_set_usage_public == NULL)
+                return;
+        dcrypt_vfs->key_set_usage_public(key, usage);
+}
+
+void dcrypt_key_set_usage_private(struct dcrypt_private_key *key,
+				  enum dcrypt_key_usage usage)
+{
+        i_assert(dcrypt_vfs != NULL);
+        if (dcrypt_vfs->key_set_usage_private == NULL)
+                return;
+        dcrypt_vfs->key_set_usage_private(key, usage);
+}
--- a/src/lib-dcrypt/dcrypt.h	Fri Aug 23 11:51:21 2019 +0300
+++ b/src/lib-dcrypt/dcrypt.h	Fri Aug 23 10:42:09 2019 +0300
@@ -326,6 +326,20 @@
 				const char **encryption_key_hash_r,
 				const char **key_hash_r, const char **error_r);
 
+/* Get/Set key identifier, this is optional opaque string identifying the key. */
+const char *dcrypt_key_get_id_public(struct dcrypt_public_key *key);
+const char *dcrypt_key_get_id_private(struct dcrypt_private_key *key);
+void dcrypt_key_set_id_public(struct dcrypt_public_key *key, const char *id);
+void dcrypt_key_set_id_private(struct dcrypt_private_key *key, const char *id);
+
+/* Get/Set key usage, optional. Defaults to NONE */
+enum dcrypt_key_usage dcrypt_key_get_usage_public(struct dcrypt_public_key *key);
+enum dcrypt_key_usage dcrypt_key_get_usage_private(struct dcrypt_private_key *key);
+void dcrypt_key_set_usage_public(struct dcrypt_public_key *key,
+				 enum dcrypt_key_usage usage);
+void dcrypt_key_set_usage_private(struct dcrypt_private_key *key,
+				  enum dcrypt_key_usage usage);
+
 /* RSA stuff */
 bool dcrypt_rsa_encrypt(struct dcrypt_public_key *key,
 			const unsigned char *data, size_t data_len,