summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libssh/libssh.h3
-rw-r--r--libssh/dh.c57
-rw-r--r--libssh/libssh.vers2
-rw-r--r--sample.c7
4 files changed, 55 insertions, 14 deletions
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
index 233f9f6..d865aa3 100644
--- a/include/libssh/libssh.h
+++ b/include/libssh/libssh.h
@@ -231,7 +231,8 @@ void *string_data(STRING *str);
void string_free(STRING *str);
/* useful for debug */
-void ssh_print_hexa(char *descr, const unsigned char *what, int len);
+char *ssh_get_hexa(const unsigned char *what, size_t len);
+void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);
int ssh_get_random(void *where,int len,int strong);
/* this one can be called by the client to see the hash of the public key before accepting it */
diff --git a/libssh/dh.c b/libssh/dh.c
index 924c575..377cfe3 100644
--- a/libssh/dh.c
+++ b/libssh/dh.c
@@ -141,17 +141,54 @@ void ssh_print_bignum(char *which,bignum num){
free(hex);
}
-void ssh_print_hexa(char *descr, const unsigned char *what, int len){
- int i;
- printf("%s : ",descr);
- if(len>16)
- printf ("\n ");
- for(i=0;i<len-1;i++){
- printf("%.2hhx:",what[i]);
- if((i+1) % 16 ==0)
- printf("\n ");
+/**
+ * @brief Convert a buffer into a colon separated hex string.
+ * The caller has to free the memory.
+ *
+ * @param what What should be converted to a hex string.
+ *
+ * @param len Length of the buffer to convert.
+ *
+ * @return The hex string or NULL on error.
+ */
+char *ssh_get_hexa(const unsigned char *what, size_t len) {
+ char *hexa = NULL;
+ size_t i;
+
+ hexa = malloc(len * 3 + 1);
+ if (hexa == NULL) {
+ return NULL;
+ }
+
+ ZERO_STRUCTP(hexa);
+
+ for (i = 0; i < len; i++) {
+ char hex[4];
+ snprintf(hex, sizeof(hex), "%02x:", what[i]);
+ strcat(hexa, hex);
+ }
+
+ hexa[(len * 3) - 1] = '\0';
+
+ return hexa;
+}
+
+/**
+ * @brief Print a buffer as colon separated hex string.
+ *
+ * @param descr Description printed infront of the hex string.
+ *
+ * @param what What should be converted to a hex string.
+ *
+ * @param len Length of the buffer to convert.
+ */
+void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len) {
+ char *hexa = ssh_get_hexa(what, len);
+
+ if (hexa == NULL) {
+ return;
}
- printf("%.2hhx\n",what[i]);
+ printf("%s: %s\n", descr, hexa);
}
void dh_generate_x(SSH_SESSION *session){
diff --git a/libssh/libssh.vers b/libssh/libssh.vers
index b28fe63..ae88399 100644
--- a/libssh/libssh.vers
+++ b/libssh/libssh.vers
@@ -8,7 +8,7 @@ SSH_0.3 {
string_from_char; string_len; string_new; string_fill; string_to_char;
string_copy; string_burn; string_data;
ssh_crypto_init;
- ssh_print_hexa; ssh_get_random;
+ ssh_get_hexa; ssh_print_hexa; ssh_get_random;
ssh_get_pubkey_hash; ssh_get_pubkey;
ssh_fd_poll; ssh_select; publickey_free;
privatekey_from_file; publickey_to_string; publickey_from_privatekey;
diff --git a/sample.c b/sample.c
index fdff41d..43a33db 100644
--- a/sample.c
+++ b/sample.c
@@ -403,6 +403,7 @@ int main(int argc, char **argv){
int auth=0;
char *password;
char *banner;
+ char *hexa;
int state;
char buf[10];
unsigned char hash[MD5_DIGEST_LEN];
@@ -446,9 +447,11 @@ int main(int argc, char **argv){
ssh_finalize();
exit(-1);
case SSH_SERVER_NOT_KNOWN:
+ ssh_get_pubkey_hash(session, hash);
+ hexa = ssh_get_hexa(hash, MD5_DIGEST_LEN);
fprintf(stderr,"The server is unknown. Do you trust the host key ?\n");
- ssh_get_pubkey_hash(session,hash);
- ssh_print_hexa("Public key hash",hash,MD5_DIGEST_LEN);
+ fprintf(stderr, "Public key hash: %s\n", hexa);
+ free(hexa);
fgets(buf,sizeof(buf),stdin);
if(strncasecmp(buf,"yes",3)!=0){
ssh_disconnect(session);