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))
6
7;; ============================================================
8;; PLAIN Authentication
9;; ============================================================
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 + 8
17 (assert-equal 0 (bytevector-u8-ref decoded 0))
18 (assert-equal 0 (bytevector-u8-ref decoded 5))))))
20;; ============================================================
21;; SCRAM-SHA-1
22;; ============================================================
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 vector
33 ;; This tests the full SCRAM exchange with known values
34 (test "SCRAM exchange with RFC 5802 values"
35 (let ((scram (make-scram-sha1 "user" "pencil")))
36 ;; Override the nonce to match RFC 5802
37 (vector-set! scram 2 "fyko+d2lbbFgONRv9qkxdawL")
39 (let ((initial (scram-initial-message scram)))
40 ;; Verify client-first-message
41 (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-challenge
46 (base64-encode
47 (string->utf8
48 "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 format
52 (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 signature
57 (let ((server-final
58 (base64-encode
59 (string->utf8 "v=rmF9pqV8S7suAoZWja4dJRkFsKQ="))))
60 (assert-true (scram-verify-server scram server-final))))))))
62;; ============================================================
63;; Mechanism Selection
64;; ============================================================
66(test-group "mechanism-selection"
67 (test "prefers SCRAM-SHA-1"
68 (assert-equal 'scram-sha-1
69 (select-sasl-mechanism '("PLAIN" "SCRAM-SHA-1"))))
71 (test "falls back to PLAIN"
72 (assert-equal 'plain
73 (select-sasl-mechanism '("PLAIN"))))
75 (test "returns #f for unsupported"
76 (assert-false (select-sasl-mechanism '("GSSAPI" "EXTERNAL")))))
78(run-tests)