unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Leo <sdl.web@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel@gnu.org
Subject: Re: Move sha1 to C?
Date: Mon, 23 May 2011 16:30:50 +0800	[thread overview]
Message-ID: <m1wrhh7r9h.fsf@th041094.ip.tsinghua.edu.cn> (raw)
In-Reply-To: <E1QOPS3-0000UM-C6@fencepost.gnu.org> (Eli Zaretskii's message of "Mon, 23 May 2011 03:21:19 -0400")

[-- Attachment #1: Type: text/plain, Size: 886 bytes --]

On 2011-05-23 15:21 +0800, Eli Zaretskii wrote:
>> From: Leo <sdl.web@gmail.com>
>> Date: Mon, 23 May 2011 04:02:04 +0800
>> 
>>   1. add sha1.[ch] from gnulib
>
> Note that gnulib's sha1.c uses malloc, which is not safe in Emacs.
> So either make sure sha1_stream is never ever called by Emacs, or use
> xmalloc instead.

Thanks for this note. sha1_stream is not used.

>> Should the signature of sha1 stay as is or change to be similar to md5?
>> 
>>    (md5 OBJECT &optional START END CODING-SYSTEM NOERROR)
>
> Are there any real reasons not to keep the API?  If there are good
> reasons, let's hear them.  If there are no good reasons, my vote is to
> keep the API backward-compatible.

I think it is better to keep the API. The BINARY arg can be useful.

Please review the attached patch. ChangeLog entry omitted for now.

Changes due to 'make sync-from-gnulib' aren't included.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: sha1.diff --]
[-- Type: text/x-diff, Size: 7840 bytes --]

=== modified file 'Makefile.in'
--- Makefile.in	2011-05-21 09:53:32 +0000
+++ Makefile.in	2011-05-23 08:00:38 +0000
@@ -331,8 +331,8 @@
 # $(gnulib_srcdir) (relative to $(srcdir) and should have build tools
 # as per $(gnulib_srcdir)/DEPENDENCIES.
 GNULIB_MODULES = \
-  careadlinkat crypto/md5 dtoastr filemode getloadavg getopt-gnu \
-  ignore-value intprops lstat mktime readlink \
+  careadlinkat crypto/md5 crypto/sha1 dtoastr filemode getloadavg \
+  getopt-gnu ignore-value intprops lstat mktime readlink \
   socklen stdarg stdio strftime strtoumax symlink sys_stat
 GNULIB_TOOL_FLAGS = \
  --conditional-dependencies --import --no-changelog --no-vc-files \

=== modified file 'lisp/bindings.el'
--- lisp/bindings.el	2011-04-19 13:44:55 +0000
+++ lisp/bindings.el	2011-05-23 08:02:18 +0000
@@ -646,9 +646,10 @@
 
 (make-variable-buffer-local 'indent-tabs-mode)
 
-;; We have base64 and md5 functions built in now.
+;; We have base64, md5 and sha1 functions built in now.
 (provide 'base64)
 (provide 'md5)
+(provide 'sha1)
 (provide 'overlay '(display syntax-table field))
 (provide 'text-properties '(display syntax-table field point-entered))
 

=== renamed file 'lisp/sha1.el' => 'lisp/obsolete/sha1.el'
--- lisp/sha1.el	2011-01-25 04:08:28 +0000
+++ lisp/obsolete/sha1.el	2011-05-23 08:07:18 +0000
@@ -4,6 +4,7 @@
 
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
 ;; Keywords: SHA1, FIPS 180-1
+;; Obsolete-since: 24.1
 
 ;; This file is part of GNU Emacs.
 

=== modified file 'src/deps.mk'
--- src/deps.mk	2011-04-23 10:33:28 +0000
+++ src/deps.mk	2011-05-23 06:31:38 +0000
@@ -284,7 +284,8 @@
 floatfns.o: floatfns.c syssignal.h lisp.h globals.h $(config_h)
 fns.o: fns.c commands.h lisp.h $(config_h) frame.h buffer.h character.h \
    keyboard.h keymap.h window.h $(INTERVALS_H) coding.h ../lib/md5.h \
-   blockinput.h atimer.h systime.h xterm.h ../lib/unistd.h globals.h
+   ../lib/sha1.h blockinput.h atimer.h systime.h xterm.h ../lib/unistd.h \
+   globals.h
 print.o: print.c process.h frame.h window.h buffer.h keyboard.h character.h \
    lisp.h globals.h $(config_h) termchar.h $(INTERVALS_H) msdos.h termhooks.h \
    blockinput.h atimer.h systime.h font.h charset.h coding.h ccl.h \

=== modified file 'src/fns.c'
--- src/fns.c	2011-05-15 17:17:44 +0000
+++ src/fns.c	2011-05-23 06:20:26 +0000
@@ -4514,42 +4514,17 @@
 
 \f
 /************************************************************************
-				 MD5
+                             MD5 and SHA1
  ************************************************************************/
 
 #include "md5.h"
+#include "sha1.h"
 
-DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
-       doc: /* Return MD5 message digest of OBJECT, a buffer or string.
-
-A message digest is a cryptographic checksum of a document, and the
-algorithm to calculate it is defined in RFC 1321.
-
-The two optional arguments START and END are character positions
-specifying for which part of OBJECT the message digest should be
-computed.  If nil or omitted, the digest is computed for the whole
-OBJECT.
-
-The MD5 message digest is computed from the result of encoding the
-text in a coding system, not directly from the internal Emacs form of
-the text.  The optional fourth argument CODING-SYSTEM specifies which
-coding system to encode the text with.  It should be the same coding
-system that you used or will use when actually writing the text into a
-file.
-
-If CODING-SYSTEM is nil or omitted, the default depends on OBJECT.  If
-OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
-system would be chosen by default for writing this text into a file.
-
-If OBJECT is a string, the most preferred coding system (see the
-command `prefer-coding-system') is used.
+/* TYPE: 0 for md5, 1 for sha1. */
 
-If NOERROR is non-nil, silently assume the `raw-text' coding if the
-guesswork fails.  Normally, an error is signaled in such case.  */)
-  (Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror)
+Lisp_Object
+hash_function (int type, Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror, Lisp_Object binary)
 {
-  unsigned char digest[16];
-  char value[33];
   int i;
   EMACS_INT size;
   EMACS_INT size_byte = 0;
@@ -4558,6 +4533,7 @@
   register EMACS_INT b, e;
   register struct buffer *bp;
   EMACS_INT temp;
+  Lisp_Object res=Qnil;
 
   if (STRINGP (object))
     {
@@ -4728,15 +4704,92 @@
 	object = code_convert_string (object, coding_system, Qnil, 1, 0, 0);
     }
 
-  md5_buffer (SSDATA (object) + start_byte,
-	      SBYTES (object) - (size_byte - end_byte),
-	      digest);
-
-  for (i = 0; i < 16; i++)
-    sprintf (&value[2 * i], "%02x", digest[i]);
-  value[32] = '\0';
+  switch (type)
+    {
+    case 0:			/* MD5 */
+      {
+	unsigned char digest[16];
+	md5_buffer (SSDATA (object) + start_byte,
+		    SBYTES (object) - (size_byte - end_byte),
+		    digest);
+
+	if (NILP(binary))
+	  {
+	    unsigned char value[33];
+	    for (i = 0; i < 16; i++)
+	      sprintf (&value[2 * i], "%02x", digest[i]);
+	    value[32] = '\0';
+	    res = make_string (value, 32);
+	  }
+	else
+	  res = make_string (digest, 16);
+	break;
+      }
+
+    case 1:			/* SHA1 */
+      {
+	unsigned char digest[20];
+	sha1_buffer (SDATA (object) + start_byte,
+		     SBYTES (object) - (size_byte - end_byte),
+		     digest);
+	if (NILP(binary))
+	  {
+	    unsigned char value[41];
+	    for (i = 0; i < 20; i++)
+	      sprintf (&value[2 * i], "%02x", digest[i]);
+	    value[40] = '\0';
+	    res = make_string (value, 40);
+	  }
+	else
+	  res = make_string (digest, 20);
+	break;
+      }
+    }
+
+  return res;
+}
 
-  return make_string (value, 32);
+DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
+       doc: /* Return MD5 message digest of OBJECT, a buffer or string.
+
+A message digest is a cryptographic checksum of a document, and the
+algorithm to calculate it is defined in RFC 1321.
+
+The two optional arguments START and END are character positions
+specifying for which part of OBJECT the message digest should be
+computed.  If nil or omitted, the digest is computed for the whole
+OBJECT.
+
+The MD5 message digest is computed from the result of encoding the
+text in a coding system, not directly from the internal Emacs form of
+the text.  The optional fourth argument CODING-SYSTEM specifies which
+coding system to encode the text with.  It should be the same coding
+system that you used or will use when actually writing the text into a
+file.
+
+If CODING-SYSTEM is nil or omitted, the default depends on OBJECT.  If
+OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
+system would be chosen by default for writing this text into a file.
+
+If OBJECT is a string, the most preferred coding system (see the
+command `prefer-coding-system') is used.
+
+If NOERROR is non-nil, silently assume the `raw-text' coding if the
+guesswork fails.  Normally, an error is signaled in such case.  */)
+  (Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror)
+{
+  return hash_function (0, object, start, end, coding_system, noerror, Qnil);
+}
+
+DEFUN ("sha1", Fsha1, Ssha1, 1, 4, 0,
+       doc: /* Return the SHA1 (Secure Hash Algorithm) of an OBJECT.
+OBJECT is either a string or a buffer.
+Optional arguments BEG and END denote buffer positions for computing
+the hash of a portion of OBJECT.
+If BINARY is non-nil, return a string in binary form.  */)
+     (Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object binary)
+{
+  return hash_function (1, object, start, end, Qnil, Qnil, binary);
 }
 
 \f
@@ -4911,6 +4964,7 @@
   defsubr (&Sbase64_encode_string);
   defsubr (&Sbase64_decode_string);
   defsubr (&Smd5);
+  defsubr (&Ssha1);
   defsubr (&Slocale_info);
 }
 


[-- Attachment #3: Type: text/plain, Size: 5 bytes --]


Leo

  reply	other threads:[~2011-05-23  8:30 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-21  6:37 Move sha1 to C? Leo
2011-05-22 19:04 ` Stefan Monnier
2011-05-22 20:02   ` Leo
2011-05-23  1:23     ` Stefan Monnier
2011-05-23  8:44       ` Leo
2011-05-23 12:04         ` Stefan Monnier
2011-05-23 13:21           ` Leo
2011-05-23 13:27             ` Stefan Monnier
2011-05-23 13:34               ` Leo
2011-05-23 13:57                 ` Stefan Monnier
2011-05-23 18:14                   ` Leo
2011-05-23 19:15                     ` Stefan Monnier
2011-05-23 22:10                     ` Paul Eggert
2011-05-24  4:09                       ` Leo
2011-05-24 10:01                         ` Eli Zaretskii
2011-05-24 14:24                           ` Leo
2011-05-24 22:01                           ` Richard Stallman
2011-05-24  5:09                       ` Thien-Thi Nguyen
2011-05-23 14:30                 ` Eli Zaretskii
2011-05-23 17:47                   ` Leo
2011-05-23 18:12                     ` Eli Zaretskii
2011-05-23 18:23                       ` Leo
2011-05-23 19:21                         ` Eli Zaretskii
2011-05-23  7:21     ` Eli Zaretskii
2011-05-23  8:30       ` Leo [this message]
2011-05-23 15:27         ` Chong Yidong
2011-05-23 17:14           ` Leo
2011-05-23 17:38       ` Leo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m1wrhh7r9h.fsf@th041094.ip.tsinghua.edu.cn \
    --to=sdl.web@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).