[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Move sha1 to C?
From: |
Leo |
Subject: |
Re: Move sha1 to C? |
Date: |
Mon, 23 May 2011 16:30:50 +0800 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.3.50 (Mac OS X 10.6.7) |
On 2011-05-23 15:21 +0800, Eli Zaretskii wrote:
>> From: Leo <address@hidden>
>> 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.
=== 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 <address@hidden>
;; 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 @@
/************************************************************************
- 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);
}
@@ -4911,6 +4964,7 @@
defsubr (&Sbase64_encode_string);
defsubr (&Sbase64_decode_string);
defsubr (&Smd5);
+ defsubr (&Ssha1);
defsubr (&Slocale_info);
}
Leo
- Re: Move sha1 to C?, (continued)
- Re: Move sha1 to C?, Thien-Thi Nguyen, 2011/05/24
- Re: Move sha1 to C?, Eli Zaretskii, 2011/05/23
- Re: Move sha1 to C?, Leo, 2011/05/23
- Re: Move sha1 to C?, Eli Zaretskii, 2011/05/23
- Re: Move sha1 to C?, Leo, 2011/05/23
- Re: Move sha1 to C?, Eli Zaretskii, 2011/05/23
- Re: Move sha1 to C?, Eli Zaretskii, 2011/05/23
- Re: Move sha1 to C?,
Leo <=
- Re: Move sha1 to C?, Chong Yidong, 2011/05/23
- Re: Move sha1 to C?, Leo, 2011/05/23
- Re: Move sha1 to C?, Leo, 2011/05/23