AtlatestRepositorysigil-xmpp
sigil-xmpp / tree / testtest-sasl.sgl
1
(import (sigil test)2
(sigil string)3
(sigil xmpp sasl)4
(sigil crypto)5
(scheme base))7
;; ============================================================8
;; PLAIN Authentication9
;; ============================================================11
(test-group "sasl-plain"12
(test "plain response format"13
(let ((response (sasl-plain-response "user" "password")))14
;; base64(\0user\0password)15
(let ((decoded (base64-decode response)))16
(assert-equal 14 (bytevector-length decoded)) ; 1 + 4 + 1 + 817
(assert-equal 0 (bytevector-u8-ref decoded 0))18
(assert-equal 0 (bytevector-u8-ref decoded 5))))))20
;; ============================================================21
;; SCRAM-SHA-122
;; ============================================================24
(test-group "scram-sha-1"25
(test "initial message format"26
(let* ((scram (make-scram-sha1 "user" "pencil"))27
(msg (scram-initial-message scram))28
(decoded (utf8->string (base64-decode msg))))29
;; Should start with "n,,n=user,r="30
(assert-true (string-starts-with? decoded "n,,n=user,r="))))32
;; RFC 5802 test vector33
;; This tests the full SCRAM exchange with known values34
(test "SCRAM exchange with RFC 5802 values"35
(let ((scram (make-scram-sha1 "user" "pencil")))36
;; Override the nonce to match RFC 580237
(vector-set! scram 2 "fyko+d2lbbFgONRv9qkxdawL")39
(let ((initial (scram-initial-message scram)))40
;; Verify client-first-message41
(let ((decoded (utf8->string (base64-decode initial))))42
(assert-equal "n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL" decoded))44
;; Server challenge (from RFC 5802)45
(let* ((server-challenge46
(base64-encode47
(string->utf848
"r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096")))49
(response (scram-challenge-response scram server-challenge))50
(decoded (utf8->string (base64-decode response))))51
;; Verify client-final-message format52
(assert-true (string-starts-with? decoded "c="))53
(assert-true (string-contains? decoded ",r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j"))54
(assert-true (string-contains? decoded ",p="))56
;; Verify server signature57
(let ((server-final58
(base64-encode59
(string->utf8 "v=rmF9pqV8S7suAoZWja4dJRkFsKQ="))))60
(assert-true (scram-verify-server scram server-final))))))))62
;; ============================================================63
;; Mechanism Selection64
;; ============================================================66
(test-group "mechanism-selection"67
(test "prefers SCRAM-SHA-1"68
(assert-equal 'scram-sha-169
(select-sasl-mechanism '("PLAIN" "SCRAM-SHA-1"))))71
(test "falls back to PLAIN"72
(assert-equal 'plain73
(select-sasl-mechanism '("PLAIN"))))75
(test "returns #f for unsupported"76
(assert-false (select-sasl-mechanism '("GSSAPI" "EXTERNAL")))))78
(run-tests)