[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/5] libgcrypt: Add helper to extract MPIs into ssh_strings
[Thread Prev] | [Thread Next]
- Subject: [PATCH 2/5] libgcrypt: Add helper to extract MPIs into ssh_strings
- From: Justus Winter <justus@xxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Mon, 21 Mar 2016 15:16:40 +0100
- To: libssh@xxxxxxxxxx
- Cc: Justus Winter <justus@xxxxxxxxxxx>
* include/libssh/libgcrypt.h (ssh_sexp_extract_mpi): New prototype. * src/libgcrypt.c (ssh_sexp_extract_mpi): New function. Signed-off-by: Justus Winter <justus@xxxxxxxxxxx> --- include/libssh/libgcrypt.h | 9 +++++++++ src/libgcrypt.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/include/libssh/libgcrypt.h b/include/libssh/libgcrypt.h index 7b97c7f..736c667 100644 --- a/include/libssh/libgcrypt.h +++ b/include/libssh/libgcrypt.h @@ -71,6 +71,15 @@ char *ssh_gcry_bn2dec(bignum bn); #define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num) #define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2) +/* Helper functions for data conversions. */ + +/* Extract an MPI from the given s-expression SEXP named NAME which is + encoded using INFORMAT and store it in a newly allocated ssh_string + encoded using OUTFORMAT. */ +ssh_string ssh_sexp_extract_mpi(const gcry_sexp_t sexp, const char *name, + enum gcry_mpi_format informat, + enum gcry_mpi_format outformat); + #endif /* HAVE_LIBGCRYPT */ struct ssh_cipher_struct *ssh_get_ciphertab(void); diff --git a/src/libgcrypt.c b/src/libgcrypt.c index 17de68b..5270503 100644 --- a/src/libgcrypt.c +++ b/src/libgcrypt.c @@ -2,6 +2,7 @@ * This file is part of the SSH Library * * Copyright (c) 2009 by Aris Adamantiadis + * Copyright (C) 2016 g10 Code GmbH * * The SSH Library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -27,6 +28,7 @@ #include "libssh/session.h" #include "libssh/crypto.h" #include "libssh/wrapper.h" +#include "libssh/string.h" #ifdef HAVE_LIBGCRYPT #include <gcrypt.h> @@ -598,4 +600,47 @@ struct ssh_cipher_struct *ssh_get_ciphertab(void) return ssh_ciphertab; } +/* Extract an MPI from the given s-expression SEXP named NAME which is + encoded using INFORMAT and store it in a newly allocated ssh_string + encoded using OUTFORMAT. */ +ssh_string ssh_sexp_extract_mpi(const gcry_sexp_t sexp, const char *name, + enum gcry_mpi_format informat, + enum gcry_mpi_format outformat) +{ + gpg_error_t err; + ssh_string result = NULL; + gcry_sexp_t fragment = NULL; + gcry_mpi_t mpi = NULL; + size_t size; + + fragment = gcry_sexp_find_token(sexp, name, 0); + if (fragment == NULL) + goto fail; + + mpi = gcry_sexp_nth_mpi(fragment, 1, informat); + if (mpi == NULL) + goto fail; + + err = gcry_mpi_print(outformat, NULL, 0, &size, mpi); + if (err) + goto fail; + + result = ssh_string_new(size); + if (result == NULL) + goto fail; + + err = gcry_mpi_print(outformat, ssh_string_data(result), size, NULL, mpi); + if (err) { + ssh_string_burn(result); + ssh_string_free(result); + result = NULL; + goto fail; + } + + fail: + gcry_sexp_release(fragment); + gcry_mpi_release(mpi); + return result; +} + #endif -- 2.1.4
[PATCH 1/5] options: Check if a port has been given | Justus Winter <justus@xxxxxxxxxxx> |