From 686310d4b954efec5d5dcc8b4a143c294bb02739 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 27 Aug 2018 18:32:58 +0200 Subject: [PATCH] gcrypt: Let decode_key() return blob size through additional argument. Currently we communicate the blob size through the return value, which implies an implicit conversion from size_t to int. The new blob_size argument guarantees type safety and simplifies the logic a bit. After this patch the return value is only used for the (negative) error code in the failure case while non-negative return values have no meaning other than indicating success. Therefore this change also allows us to convey the key type via the return value. This will turn out to be handy for supporting RFC4716 keys. --- gcrypt.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/gcrypt.c b/gcrypt.c index 50ddff46..9b05a949 100644 --- a/gcrypt.c +++ b/gcrypt.c @@ -111,11 +111,12 @@ static const char *gcrypt_strerror(gcry_error_t gret) /** Private keys end with this footer. */ #define PRIVATE_KEY_FOOTER "-----END RSA PRIVATE KEY-----" -static int decode_key(const char *key_file, unsigned char **result) +static int decode_key(const char *key_file, unsigned char **result, + size_t *blob_size) { int ret, ret2, i, j; void *map; - size_t map_size, key_size, blob_size; + size_t map_size, key_size; unsigned char *blob = NULL; char *begin, *footer, *key; @@ -148,15 +149,8 @@ static int decode_key(const char *key_file, unsigned char **result) key[j++] = begin[i]; } key[j] = '\0'; - ret = base64_decode(key, j, (char **)&blob, &blob_size); + ret = base64_decode(key, j, (char **)&blob, blob_size); free(key); - if (ret < 0) - goto free_unmap; - ret = blob_size; - goto unmap; -free_unmap: - free(blob); - blob = NULL; unmap: ret2 = para_munmap(map, map_size); if (ret >= 0 && ret2 < 0) @@ -299,17 +293,16 @@ static int get_private_key(const char *key_file, struct asymmetric_key **result) gcry_mpi_t n = NULL, e = NULL, d = NULL, p = NULL, q = NULL, u = NULL; unsigned char *blob, *cp, *end; - int blob_size, ret, n_size; + int ret, n_size; gcry_error_t gret; - size_t erroff; + size_t erroff, blob_size; gcry_sexp_t sexp; struct asymmetric_key *key; *result = NULL; - ret = decode_key(key_file, &blob); + ret = decode_key(key_file, &blob, &blob_size); if (ret < 0) return ret; - blob_size = ret; end = blob + blob_size; ret = find_privkey_bignum_offset(blob, blob_size); if (ret < 0) -- 2.39.5