-(defun digest-md5-digest-response (username
- realm nonce cnonce
- nonce-count qop digest-uri response
- &optional maxbuf charset cipher authzid)
- (concat
- (if charset
- (concat "charset=" charset ","))
- "username=\"" username "\""
- ",realm=\"" realm "\""
- ",nonce=\"" nonce "\""
- (format ",nc=%08x" nonce-count)
- ",cnonce=\"" cnonce "\""
- ",digest-uri=\"" digest-uri "\""
- ",response=" response
- ",qop=" qop
- (if maxbuf
- (concat ",maxbuf=" maxbuf))
- (if cipher
- (concat ",cipher=" cipher))
- (if authzid
- (concat ",authzid=\"" authzid "\""))))
+(defmacro digest-md5-cnonce ()
+ ;; It is RECOMMENDED that it
+ ;; contain at least 64 bits of entropy.
+ '(concat (unique-id-m "") (unique-id-m "")))
+
+(defmacro digest-md5-challenge (prop)
+ (list 'get ''digest-md5-challenge prop))
+
+(defmacro digest-md5-build-response-value
+ (username passwd cnonce digest-uri qop)
+ `(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 ":" ,qop ":"
+ (encode-hex-string
+ (md5-binary
+ (concat "AUTHENTICATE:" ,digest-uri
+ (if (string-equal "auth-int" ,qop)
+ ":00000000000000000000000000000000"
+ nil))))))))