X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gcrypt.c;h=9b05a9494c23503702f88b27716468942b15d805;hp=694c0adb8454b73dc0e5b67876fc7a03617b61d0;hb=686310d4b954efec5d5dcc8b4a143c294bb02739;hpb=26c001d1abf1f92b6130cd0fbf5a52b84f9899d9 diff --git a/gcrypt.c b/gcrypt.c index 694c0adb..9b05a949 100644 --- 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)