Skip to content

Commit

Permalink
lib-dcrypt: get_info in openssl_load_private_key
Browse files Browse the repository at this point in the history
Use dcrypt_openssl_key_string_get_info to determine the key format
instead of taking it as a parameter.
  • Loading branch information
mrannanj authored and sirainen committed Aug 4, 2016
1 parent 791f275 commit b55e127
Showing 1 changed file with 29 additions and 33 deletions.
62 changes: 29 additions & 33 deletions src/lib-dcrypt/dcrypt-openssl.c
Expand Up @@ -1215,39 +1215,22 @@ bool dcrypt_openssl_load_private_key_dovecot_v2(struct dcrypt_private_key **key_
static
bool dcrypt_openssl_load_private_key_dovecot(struct dcrypt_private_key **key_r,
const char *data, const char *password, struct dcrypt_private_key *key,
const char **error_r)
enum dcrypt_key_version version, const char **error_r)
{
/* FIXME: duplicated from info */
if (strncmp(data, "1:", 2) == 0) {
if (error_r != NULL)
*error_r = "Dovecot v1 key format "
"uses tab to separate fields";
return FALSE;
} else if (strncmp(data, "2\t", 2) == 0) {
if (error_r != NULL)
*error_r = "Dovecot v2 key format uses "
"colon to separate fields";
return FALSE;
}

bool ret;
const char **input = t_strsplit(data, ":\t");
size_t len = str_array_length(input);

if (len < 4) {
if (error_r != NULL)
*error_r = "Corrupted data";
ret = FALSE;
} else if (*(input[0])== '1')
ret = dcrypt_openssl_load_private_key_dovecot_v1(key_r, len, input, password, key, error_r);
else if (*(input[0])== '2')
ret = dcrypt_openssl_load_private_key_dovecot_v2(key_r, len, input, password, key, error_r);
else {
if (error_r != NULL)
*error_r = "Unsupported key version";
ret = FALSE;
switch (version) {
case DCRYPT_KEY_VERSION_1:
return dcrypt_openssl_load_private_key_dovecot_v1(key_r, len,
input, password, key, error_r);
case DCRYPT_KEY_VERSION_2:
return dcrypt_openssl_load_private_key_dovecot_v2(key_r, len,
input, password, key, error_r);
case DCRYPT_KEY_VERSION_NA:
i_unreached();
}
return ret;
return FALSE;
}

static
Expand Down Expand Up @@ -1566,13 +1549,26 @@ bool dcrypt_openssl_store_public_key_dovecot(struct dcrypt_public_key *key, buff
}

static
bool dcrypt_openssl_load_private_key(struct dcrypt_private_key **key_r, enum dcrypt_key_format format,
const char *data, const char *password, struct dcrypt_private_key *dec_key,
const char **error_r)
bool dcrypt_openssl_load_private_key(struct dcrypt_private_key **key_r,
enum dcrypt_key_format format, const char *data, const char *password,
struct dcrypt_private_key *dec_key, const char **error_r)
{
EVP_PKEY *key = NULL, *key2;
enum dcrypt_key_version version;
enum dcrypt_key_kind kind;
if (!dcrypt_openssl_key_string_get_info(data, &format, &version,
&kind, NULL, NULL, NULL, error_r)) {
return FALSE;
}
if (kind != DCRYPT_KEY_KIND_PRIVATE) {
if (error_r != NULL) *error_r = "key is not private";
return FALSE;
}

if (format == DCRYPT_FORMAT_DOVECOT)
return dcrypt_openssl_load_private_key_dovecot(key_r, data, password, dec_key, error_r);
return dcrypt_openssl_load_private_key_dovecot(key_r, data,
password, dec_key, version, error_r);

EVP_PKEY *key = NULL, *key2;

BIO *key_in = BIO_new_mem_buf((void*)data, strlen(data));

Expand Down

0 comments on commit b55e127

Please sign in to comment.