ntlm.el (ntlm-string-make-unibyte, ntlm-secure-hash):
authorKatsumi Yamaoka <yamaoka@jpl.org>
Sun, 5 Oct 2014 23:47:14 +0000 (23:47 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Sun, 5 Oct 2014 23:47:14 +0000 (23:47 +0000)
 New compatibility functions.
(ntlm-build-auth-response): Use them.

lisp/ChangeLog
lisp/ntlm.el

index 02acc59..8f67eaf 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * ntlm.el (ntlm-string-make-unibyte, ntlm-secure-hash):
+       New compatibility functions.
+       (ntlm-build-auth-response): Use them.
+
 2014-10-04  Thomas Fitzsimmons  <fitzsim@fitzsim.org>
 
        * ntlm.el (ntlm-build-auth-request):
index 30958aa..ef6e020 100644 (file)
@@ -110,8 +110,46 @@ is not given."
   (defmacro ntlm-string-as-unibyte (string)
     (if (fboundp 'string-as-unibyte)
        `(string-as-unibyte ,string)
+      string))
+  (defmacro ntlm-string-make-unibyte (string)
+    (if (fboundp 'string-make-unibyte)
+       `(string-make-unibyte ,string)
       string)))
 
+(eval-and-compile
+  (autoload 'sha1 "sha1")
+  (if (fboundp 'secure-hash)
+      (defalias 'ntlm-secure-hash 'secure-hash)
+    (defun ntlm-secure-hash (algorithm object &optional start end binary)
+      "Return the secure hash of OBJECT, a buffer or string.
+ALGORITHM is a symbol specifying the hash to use: md5, sha1.
+
+The two optional arguments START and END are positions specifying for
+which part of OBJECT to compute the hash.  If nil or omitted, uses the
+whole OBJECT.
+
+If BINARY is non-nil, returns a string in binary form."
+      (cond ((eq algorithm 'md5)
+            (if binary
+                (let* ((hex (md5 object start end))
+                       (len (length hex))
+                       (beg 0)
+                       rest)
+                  (while (< beg len)
+                    (push (ntlm-string-make-unibyte
+                           (char-to-string
+                            (string-to-number
+                             (substring hex beg (setq beg (+ beg 2)))
+                             16)))
+                          rest))
+                  (apply #'concat (nreverse rest)))
+              (md5 object start end)))
+           ((eq algorithm 'sha1)
+            (sha1 object start end binary))
+           (t
+            (error "(ntlm-secure-hash) Unsupported algorithm: %s"
+                   algorithm))))))
+
 (defun ntlm-build-auth-response (challenge user password-hashes)
   "Return the response string to a challenge string CHALLENGE given by
 the NTLM based server for the user USER and the password hash list
@@ -149,7 +187,7 @@ by PASSWORD-HASHES.  PASSWORD-HASHES should be a return value of
        (let (randomString
              sessionHash)
          ;; generate NTLM2 session response data
-         (setq randomString (string-make-unibyte
+         (setq randomString (ntlm-string-make-unibyte
                              (concat
                               (make-string 1 (random 256))
                               (make-string 1 (random 256))
@@ -159,9 +197,9 @@ by PASSWORD-HASHES.  PASSWORD-HASHES should be a return value of
                               (make-string 1 (random 256))
                               (make-string 1 (random 256))
                               (make-string 1 (random 256)))))
-         (setq sessionHash (secure-hash 'md5
-                                        (concat challengeData randomString)
-                                        nil nil t))
+         (setq sessionHash (ntlm-secure-hash
+                            'md5 (concat challengeData randomString)
+                            nil nil t))
          (setq sessionHash (substring sessionHash 0 8))
 
          (setq lmRespData (concat randomString (make-string 16 0)))