]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gcrypt.c
gcrypt: Let decode_key() return blob size through additional argument.
[paraslash.git] / gcrypt.c
index 694c0adb8454b73dc0e5b67876fc7a03617b61d0..9b05a9494c23503702f88b27716468942b15d805 100644 (file)
--- a/gcrypt.c
+++ b/gcrypt.c
@@ -106,12 +106,17 @@ static const char *gcrypt_strerror(gcry_error_t gret)
        return gcry_strerror(gcry_err_code(gret));
 }
 
-static int decode_key(const char *key_file, const char *header_str,
-               const char *footer_str, unsigned char **result)
+/** Private keys start with this header. */
+#define PRIVATE_KEY_HEADER "-----BEGIN RSA PRIVATE KEY-----"
+/** 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,
+               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;
 
@@ -119,13 +124,13 @@ static int decode_key(const char *key_file, const char *header_str,
        if (ret < 0)
                goto out;
        ret = -E_KEY_MARKER;
-       if (strncmp(map, header_str, strlen(header_str)))
+       if (strncmp(map, PRIVATE_KEY_HEADER, strlen(PRIVATE_KEY_HEADER)))
                goto unmap;
-       footer = strstr(map, footer_str);
+       footer = strstr(map, PRIVATE_KEY_FOOTER);
        ret = -E_KEY_MARKER;
        if (!footer)
                goto unmap;
-       begin = map + strlen(header_str);
+       begin = map + strlen(PRIVATE_KEY_HEADER);
        /* skip whitespace at the beginning */
        for (; begin < footer; begin++) {
                if (para_isspace(*begin))
@@ -144,15 +149,8 @@ static int decode_key(const char *key_file, const char *header_str,
                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)
@@ -290,28 +288,21 @@ static int find_privkey_bignum_offset(const unsigned char *data, int len)
        return p - data;
 }
 
-/** Private keys start with this header. */
-#define PRIVATE_KEY_HEADER "-----BEGIN RSA PRIVATE KEY-----"
-/** Private keys end with this footer. */
-#define PRIVATE_KEY_FOOTER "-----END RSA PRIVATE KEY-----"
-
 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, PRIVATE_KEY_HEADER, PRIVATE_KEY_FOOTER,
-               &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)