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
next prev parent 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).