X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gcrypt.c;h=2398a605d29211d8581b5b76e0cb586258fe0898;hp=052546dd60733d143e6c12bdcfcc92ce36ac5e50;hb=5f20d9afde364f9ce51aa7841ebe513028a65e81;hpb=93ad956d88ffd117a6f81c5e38d9aaed3ae8b6e9 diff --git a/gcrypt.c b/gcrypt.c index 052546dd..2398a605 100644 --- a/gcrypt.c +++ b/gcrypt.c @@ -366,27 +366,21 @@ free_blob: return ret; } -static int get_ssh_public_key(unsigned char *data, int size, gcry_sexp_t *result) +int get_public_key(const char *key_file, struct asymmetric_key **result) { + unsigned char *blob, *p, *end; int ret; gcry_error_t gret; - unsigned char *blob = NULL, *p, *end; size_t nr_scanned, erroff, decoded_size; - gcry_mpi_t e = NULL, n = NULL; + gcry_mpi_t e, n; + gcry_sexp_t sexp; + struct asymmetric_key *key; - PARA_DEBUG_LOG("decoding %d byte public rsa-ssh key\n", size); - ret = uudecode((char *)data, size, (char **)&blob, &decoded_size); - if (ret < 0) - goto free_blob; - end = blob + decoded_size; - dump_buffer("decoded key", blob, decoded_size); - ret = check_ssh_key_header(blob, decoded_size); + ret = decode_ssh_key(key_file, &blob, &decoded_size); if (ret < 0) - goto free_blob; + return ret; p = blob + ret; - ret = -E_SSH_PARSE; - if (p >= end) - goto free_blob; + end = blob + decoded_size; PARA_DEBUG_LOG("scanning modulus and public exponent\n"); gret = gcry_mpi_scan(&e, GCRYMPI_FMT_SSH, p, end - p, &nr_scanned); if (gret) { @@ -395,8 +389,6 @@ static int get_ssh_public_key(unsigned char *data, int size, gcry_sexp_t *result goto free_blob; } PARA_DEBUG_LOG("scanned e (%zu bytes)\n", nr_scanned); -// gcry_mpi_aprint(GCRYMPI_FMT_HEX, &buf, NULL, rsa_e); -// PARA_CRIT_LOG("e: %s\n", buf); p += nr_scanned; if (p >= end) goto release_e; @@ -407,9 +399,7 @@ static int get_ssh_public_key(unsigned char *data, int size, gcry_sexp_t *result goto release_e; } PARA_DEBUG_LOG("scanned n (%zu bytes)\n", nr_scanned); -// gcry_mpi_aprint(GCRYMPI_FMT_HEX, &buf, NULL, rsa_n); -// PARA_CRIT_LOG("n: %s\n", buf); - gret = gcry_sexp_build(result, &erroff, RSA_PUBKEY_SEXP, n, e); + gret = gcry_sexp_build(&sexp, &erroff, RSA_PUBKEY_SEXP, n, e); if (gret) { PARA_ERROR_LOG("offset %zu: %s\n", erroff, gcry_strerror(gcry_err_code(gret))); @@ -418,6 +408,10 @@ static int get_ssh_public_key(unsigned char *data, int size, gcry_sexp_t *result } ret = nr_scanned / 32 * 32; PARA_INFO_LOG("successfully read %d bit ssh public key\n", ret * 8); + key = para_malloc(sizeof(*key)); + key->num_bytes = ret; + key->sexp = sexp; + *result = key; release_n: gcry_mpi_release(n); release_e: @@ -427,42 +421,6 @@ free_blob: return ret; } -int get_public_key(const char *key_file, struct asymmetric_key **result) -{ - int ret, ret2; - void *map; - size_t map_size; - unsigned char *start, *end; - gcry_sexp_t sexp; - struct asymmetric_key *key; - - ret = mmap_full_file(key_file, O_RDONLY, &map, &map_size, NULL); - if (ret < 0) - return ret; - ret = is_ssh_rsa_key(map, map_size); - if (!ret) { - para_munmap(map, map_size); - return -E_SSH_PARSE; - } - start = map + ret; - end = map + map_size; - ret = -E_SSH_PARSE; - if (start >= end) - goto unmap; - ret = get_ssh_public_key(start, end - start, &sexp); - if (ret < 0) - goto unmap; - key = para_malloc(sizeof(*key)); - key->num_bytes = ret; - key->sexp = sexp; - *result = key; -unmap: - ret2 = para_munmap(map, map_size); - if (ret >= 0 && ret2 < 0) - ret = ret2; - return ret; -} - void free_public_key(struct asymmetric_key *key) { if (!key)