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.
/** Private keys end with this footer. */
#define PRIVATE_KEY_FOOTER "-----END 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)
+static int decode_key(const char *key_file, unsigned char **result,
+ size_t *blob_size)
{
int ret, ret2, i, j;
void *map;
{
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;
unsigned char *blob = NULL;
char *begin, *footer, *key;
key[j++] = begin[i];
}
key[j] = '\0';
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);
- 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)
unmap:
ret2 = para_munmap(map, map_size);
if (ret >= 0 && ret2 < 0)
gcry_mpi_t n = NULL, e = NULL, d = NULL, p = NULL, q = NULL,
u = NULL;
unsigned char *blob, *cp, *end;
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;
+ size_t erroff, blob_size;
gcry_sexp_t sexp;
struct asymmetric_key *key;
*result = NULL;
gcry_sexp_t sexp;
struct asymmetric_key *key;
*result = NULL;
- ret = decode_key(key_file, &blob);
+ ret = decode_key(key_file, &blob, &blob_size);
end = blob + blob_size;
ret = find_privkey_bignum_offset(blob, blob_size);
if (ret < 0)
end = blob + blob_size;
ret = find_privkey_bignum_offset(blob, blob_size);
if (ret < 0)