gcrypt: Let decode_key() return blob size through additional argument.
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 27 Aug 2018 16:32:58 +0000 (18:32 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Tue, 25 Dec 2018 16:45:24 +0000 (17:45 +0100)
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

index 50ddff4..9b05a94 100644 (file)
--- 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)