Mercurial > dovecot > core-2.3
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,