summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog29
-rw-r--r--NEWS5
-rw-r--r--doc/api-sessions.texi26
-rw-r--r--examples/echo/client.scm.in5
-rw-r--r--examples/sssh.scm.in3
-rw-r--r--ssh/session-func.c14
-rw-r--r--ssh/session.scm9
-rw-r--r--tests/client-server.scm111
8 files changed, 136 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index 1fcaf57..6638a50 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2014-05-31 Artyom Poptsov <poptsov.artyom@gmail.com>
+
+ * tests/client-server.scm: Make sure that the received message is
+ not `#f' before handling it in a server thread.
+ (make-session-loop): New macro.
+
+ * tests/client-server.scm (server-thread): Rename to
+ `*server-thread*'.
+ (spawn-server-thread): Update.
+ (cancel-server-thread): Update.
+
+ * tests/client-server.scm ("get-public-key-hash"): Check the hash.
+ Check `bytevector->hex-string' return value.
+
+ * ssh/session.scm (bytevector->hex-string): Fix a bug: Use
+ `format' from `(ice-9 format)' module.
+
+ * doc/api-sessions.texi (Sessions): Update description of
+ `get-public-key-hash'. Add documentation for
+ `bytevector->hex-string'. Add examples.
+
+ * ssh/session.scm (bytevector->hex-string): New procedure.
+ * examples/echo/client.scm.in (main): Use it.
+ * examples/sssh.scm.in (main): Use it.
+
2014-05-30 Artyom Poptsov <poptsov.artyom@gmail.com>
* README: Update requirements.
@@ -9,6 +34,10 @@
* tests/client-server.scm ("userauth-pubkey!, success"): Public
key is not needed anymore, remove it.
+ * ssh/session-func.c (guile_ssh_get_public_key_hash): Return the
+ hash as a bytevector instead of a string.
+ * NEWS: Update.
+
2014-05-27 Artyom Poptsov <poptsov.artyom@gmail.com>
Perform basic work on porting of Guile-SSH on libssh 0.6.3.
diff --git a/NEWS b/NEWS
index 32d02a0..4280392 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,11 @@ Copyright (C) Artyom V. Poptsov <poptsov.artyom@gmail.com>
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
+* Unreleased
+** `get-public-key-hash' now returns the hash as a bytevector
+** New procedure `bytevector->hex-string'
+ in =(ssh session)=
+
* Changes in version 0.6.0 (2014-03-23)
** Remove username from parameter list of auth procedures
`userauth-password!' and `userauth-pubkey!' don't take a username
diff --git a/doc/api-sessions.texi b/doc/api-sessions.texi
index ca0bc4a..64258b8 100644
--- a/doc/api-sessions.texi
+++ b/doc/api-sessions.texi
@@ -249,8 +249,30 @@ will be created if host key is accepted.
@deffn {Scheme Procedure} get-public-key-hash session
@cindex MD5 hash
-Get MD5 hash of a public key. Return MD5 hash on success, @code{#f}
-on error.
+Get MD5 hash of a public key as a bytevector. Return the bytevector
+on success, @code{#f} on error.
+
+Example:
+
+@lisp
+(get-public-key-hash session)
+@result{} #vu8(15 142 110 203 162 228 250 211 20 212 26 217 118 57 217 66)
+@end lisp
+
+@end deffn
+
+@deffn {Scheme Procedure} bytevector->hex-string bv
+@cindex MD5 hash
+Convert the given bytevector @var{bv} to a colon separated string.
+
+Example:
+
+@lisp
+(let ((hash (get-public-key-hash session)))
+ (bytevector->hex-string hash))
+@result{} "0f:8e:6e:cb:a2:e4:fa:d3:14:d4:1a:d9:76:39:d9:42"
+@end lisp
+
@end deffn
@deffn {Scheme Procedure} write-known-host! session
diff --git a/examples/echo/client.scm.in b/examples/echo/client.scm.in
index 861f794..28d58d8 100644
--- a/examples/echo/client.scm.in
+++ b/examples/echo/client.scm.in
@@ -134,8 +134,9 @@ Options:
(case (authenticate-server session)
((not-known)
- (display "The server is unknown. Please check MD5 sum:\n")
- (format #t " ~a~%" (get-public-key-hash session))))
+ (let ((hash (get-public-key-hash session)))
+ (display "The server is unknown. Please check MD5 sum:\n")
+ (format #t " ~a~%" (bytevector->hex-string hash)))))
(let ((private-key (get-prvkey session identity-file)))
diff --git a/examples/sssh.scm.in b/examples/sssh.scm.in
index 5856ce4..3257615 100644
--- a/examples/sssh.scm.in
+++ b/examples/sssh.scm.in
@@ -175,7 +175,8 @@ Options:
((ok) (print-debug " ok\n"))
((not-known) (display " The server is unknown. Please check MD5.\n")))
- (format-debug " MD5 hash: ~a~%" (get-public-key-hash session))
+ (let ((hash (get-public-key-hash session)))
+ (format-debug " MD5 hash: ~a~%" (bytevector->hex-string hash)))
(print-debug "5. userauth-autopubkey!\n")
(let ((res (userauth-pubkey-auto! session)))
diff --git a/ssh/session-func.c b/ssh/session-func.c
index d06c7c7..0788e3b 100644
--- a/ssh/session-func.c
+++ b/ssh/session-func.c
@@ -397,13 +397,17 @@ SCM_DEFINE (guile_ssh_get_public_key_hash, "get-public-key-hash", 1, 0, 0,
res = ssh_get_pubkey_hash (session_data->ssh_session, &hash);
scm_dynwind_free (hash);
- hash_str = ssh_get_hexa (hash, res);
- scm_dynwind_free (hash_str);
-
if (res >= 0)
- ret = scm_from_locale_string (hash_str);
+ {
+ size_t idx;
+ ret = scm_c_make_bytevector (res);
+ for (idx = 0; idx < res; ++idx)
+ scm_c_bytevector_set_x(ret, idx, hash[idx]);
+ }
else
- ret = SCM_BOOL_F;
+ {
+ ret = SCM_BOOL_F;
+ }
scm_dynwind_end ();
return ret;
diff --git a/ssh/session.scm b/ssh/session.scm
index a3152e7..1cbcab2 100644
--- a/ssh/session.scm
+++ b/ssh/session.scm
@@ -43,6 +43,8 @@
(define-module (ssh session)
#:use-module (ice-9 optargs)
+ #:use-module (ice-9 format)
+ #:use-module (rnrs bytevectors)
#:export (session
session?
%make-session
@@ -55,6 +57,7 @@
connected?
authenticate-server
get-public-key-hash
+ bytevector->hex-string
write-known-host!
get-error))
@@ -95,6 +98,12 @@ Return a new SSH session."
(session-set-if-specified! compression-level)
session))
+(define (bytevector->hex-string bv)
+ "Convert bytevector BV to a colon separated hex string."
+ (string-join (map (lambda (e) (format #f "~2,'0x" e))
+ (bytevector->u8-list bv))
+ ":"))
+
(load-extension "libguile-ssh" "init_session")
;;; session.scm ends here
diff --git a/tests/client-server.scm b/tests/client-server.scm
index 4be2c39..10cd0dd 100644
--- a/tests/client-server.scm
+++ b/tests/client-server.scm
@@ -20,6 +20,7 @@
(use-modules (srfi srfi-64)
(ice-9 threads)
(ice-9 rdelim)
+ (rnrs bytevectors)
(ssh server)
(ssh session)
(ssh auth)
@@ -38,7 +39,7 @@
(define topdir (getenv "abs_top_srcdir"))
(define rsakey (format #f "~a/tests/rsakey" topdir))
(define log (test-runner-aux-value (test-runner-current)))
-(define server-thread #f)
+(define *server-thread* #f)
;;; Helper procedures and macros
@@ -71,13 +72,18 @@
(format log " server: ~a~%" message))
(define-macro (spawn-server-thread . body)
- `(set! server-thread
+ `(set! *server-thread*
(make-thread
(lambda ()
,@body))))
(define (cancel-server-thread)
- (cancel-thread server-thread))
+ (cancel-thread *server-thread*))
+
+(define-macro (make-session-loop session . body)
+ `(let session-loop ((msg (server-message-get ,session)))
+ (and msg (begin ,@body))
+ (session-loop (server-message-get ,session))))
;;; Testing of basic procedures.
@@ -113,12 +119,15 @@
res)))
(test-assert "get-public-key-hash"
- (let ((session (make-session-for-test)))
+ (let ((hash-bv #vu8(15 142 110 203 162 228 250 211 20 212 26 217 118 57 217 66))
+ (hash-str "0f:8e:6e:cb:a2:e4:fa:d3:14:d4:1a:d9:76:39:d9:42")
+ (session (make-session-for-test)))
(connect! session)
(authenticate-server session)
(let ((res (get-public-key-hash session)))
(disconnect! session)
- res)))
+ (and (bytevector=? res hash-bv)
+ (string=? (bytevector->hex-string res) hash-str)))))
(cancel-server-thread)
@@ -129,12 +138,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(password public-key))
- (message-reply-default msg)
- (session-loop (server-message-get s)))))))
+ (message-reply-default msg))))))
(test-assert "userauth-get-list"
(let ((session (make-session-for-test)))
@@ -153,12 +161,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(none))
- (message-reply-success msg)
- (session-loop (server-message-get s)))))))
+ (message-reply-success msg))))))
(test-assert "userauth-none!, success"
(let ((session (make-session-for-test)))
@@ -176,12 +183,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(public-key))
- (message-reply-default msg)
- (session-loop (server-message-get s)))))))
+ (message-reply-default msg))))))
(test-assert "userauth-none!, denied"
(let ((session (make-session-for-test)))
@@ -200,12 +206,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(none))
- (message-reply-success msg 'partial)
- (session-loop (server-message-get s)))))))
+ (message-reply-success msg 'partial))))))
(test-assert "userauth-none!, partial"
(let ((session (make-session-for-test)))
@@ -222,12 +227,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(password))
- (message-reply-success msg)
- (session-loop (server-message-get s)))))))
+ (message-reply-success msg))))))
(test-assert "userauth-password!, success"
(let ((session (make-session-for-test)))
@@ -244,12 +248,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(password))
- (message-reply-default msg)
- (session-loop (server-message-get s)))))))
+ (message-reply-default msg))))))
(test-assert "userauth-password!, denied"
(let ((session (make-session-for-test)))
@@ -266,12 +269,11 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(message-auth-set-methods! msg '(password))
- (message-reply-success msg 'partial)
- (session-loop (server-message-get s)))))))
+ (message-reply-success msg 'partial))))))
(test-assert "userauth-password!, partial"
(let ((session (make-session-for-test)))
@@ -288,11 +290,10 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server)))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
- (message-reply-success msg)
- (session-loop (server-message-get s)))))))
+ (let ((session (server-accept server)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
+ (message-reply-success msg))))))
(test-assert "userauth-pubkey!, success"
(let ((session (make-session-for-test)))
@@ -314,10 +315,10 @@
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server))
+ (let ((session (server-accept server))
(channel #f))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
(let ((msg-type (message-get-type msg)))
(srvmsg msg-type)
(case (car msg-type)
@@ -328,8 +329,7 @@
(write-line "pong" channel))
(message-reply-success msg))
(else
- (message-reply-success msg))))
- (session-loop (server-message-get s)))))))
+ (message-reply-success msg)))))))))
(define session
(let ((session (make-session-for-test)))
@@ -373,11 +373,11 @@ takes RWPROC procedure that handles I/O operation."
(let ((server (make-server-for-test)))
(server-listen server)
(while #t
- (let ((s (server-accept server))
+ (let ((session (server-accept server))
(channel #f))
- (server-handle-key-exchange s)
- (let session-loop ((msg (server-message-get s)))
- (if (and msg (not (eof-object? msg)))
+ (server-handle-key-exchange session)
+ (make-session-loop session
+ (if (not (eof-object? msg))
(let ((msg-type (message-get-type msg)))
(case (car msg-type)
((request-channel-open)
@@ -389,8 +389,7 @@ takes RWPROC procedure that handles I/O operation."
((request-channel)
(message-reply-success msg))
(else
- (message-reply-success msg)))))
- (session-loop (server-message-get s))))))))
+ (message-reply-success msg)))))))))))
(define (make-session-for-dt-test)
(let ((s (make-session-for-test)))