-(defun digest-md5-digest-response (username
- realm nonce cnonce
- digest-uri response
- &optional nonce-count qop
- maxbuf charset cipher authzid)
- (concat
- (if charset
- (concat "charset=" charset ","))
- "username=\"" username "\""
- ",realm=\"" realm "\""
- ",nonce=\"" nonce "\""
- (format ",nc=%08x"
- (or nonce-count 1))
- ",cnonce=\"" cnonce "\""
- ",digest-uri=\"" digest-uri "\""
- ",response=" response
- (if qop
- (concat ",qop=" qop))
- (if maxbuf
- (concat ",maxbuf=" maxbuf))
- (if cipher
- (concat ",cipher=" cipher))
- (if authzid
- (concat ",authzid=\"" authzid "\""))))
-
+(defmacro digest-md5-challenge (prop)
+ (list 'get ''digest-md5-challenge prop))
+
+(defmacro digest-md5-build-response-value (username passwd cnonce digest-uri)
+ `(encode-hex-string
+ (md5-binary
+ (concat
+ (encode-hex-string
+ (md5-binary (concat (md5-binary
+ (concat ,username
+ ":" (digest-md5-challenge 'realm)
+ ":" ,passwd))
+ ":" (digest-md5-challenge 'nonce)
+ ":" ,cnonce
+ (let ((authzid (digest-md5-challenge 'authzid)))
+ (if authzid (concat ":" authzid) nil)))))
+ ":" (digest-md5-challenge 'nonce)
+ ":" (format "%08x" digest-md5-nonce-count) ":" ,cnonce
+ ":" (digest-md5-challenge 'qop) ":"
+ (encode-hex-string
+ (md5-binary
+ (concat "AUTHENTICATE:" ,digest-uri
+ (if (member "auth" (split-string
+ (digest-md5-challenge 'qop)
+ ","))
+ nil
+ ":00000000000000000000000000000000"))))))))
+
+;;;###autoload
+(defun digest-md5-digest-response (username passwd digest-uri)
+ (let ((cnonce (digest-md5-cnonce)))
+ (concat
+ "username=\"" username "\","
+ "realm=\"" (digest-md5-challenge 'realm) "\","
+ "nonce=\"" (digest-md5-challenge 'nonce) "\","
+ (format "nc=%08x," digest-md5-nonce-count)
+ "cnonce=\"" cnonce "\","
+ "digest-uri=\"" digest-uri "\","
+ "response="
+ (digest-md5-build-response-value username passwd cnonce digest-uri)
+ ","
+ (mapconcat
+ #'identity
+ (delq nil
+ (mapcar (lambda (prop)
+ (if (digest-md5-challenge prop)
+ (format "%s=%s"
+ prop (digest-md5-challenge prop))))
+ '(charset qop maxbuf cipher authzid)))
+ ","))))