mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Import crypto/md5 module from gnulib.
* Makefile.in (MAKEFILE_MODULES): Add crypto/md5. * admin/notes/copyright: Remove src/md5.c and src/md5.h as special cases. * src/Makefile.in (base_obj): Remove md5.o, since this file is in lib now. * src/deps.mk (md5.o): Remove. * aclocal.m4, configure, lib/Makefile.in, lib/gnulib.mk, m4/gl-comp.m4: Regenerate. * lib/md5.c: Regenerate. This renames the file from src/md5.c, and adds some porting improvements from gnulib. * lib/md5.h: Regenerate, likwise; rename from src/md5.h. * m4/md5.m4: New file, from gnulib. 2011-02-18 Paul Eggert <eggert@cs.ucla.edu>
This commit is contained in:
parent
37b3d30244
commit
942f733fd1
14 changed files with 889 additions and 551 deletions
16
ChangeLog
16
ChangeLog
|
|
@ -1,3 +1,19 @@
|
||||||
|
2011-02-18 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
Import crypto/md5 module from gnulib.
|
||||||
|
* Makefile.in (MAKEFILE_MODULES): Add crypto/md5.
|
||||||
|
* admin/notes/copyright: Remove src/md5.c and src/md5.h as
|
||||||
|
special cases.
|
||||||
|
* src/Makefile.in (base_obj): Remove md5.o, since this file
|
||||||
|
is in lib now.
|
||||||
|
* src/deps.mk (md5.o): Remove.
|
||||||
|
* aclocal.m4, configure, lib/Makefile.in, lib/gnulib.mk, m4/gl-comp.m4:
|
||||||
|
Regenerate.
|
||||||
|
* lib/md5.c: Regenerate. This renames the file from src/md5.c,
|
||||||
|
and adds some porting improvements from gnulib.
|
||||||
|
* lib/md5.h: Regenerate, likwise; rename from src/md5.h.
|
||||||
|
* m4/md5.m4: New file, from gnulib.
|
||||||
|
|
||||||
2011-02-18 Paul Eggert <eggert@cs.ucla.edu>
|
2011-02-18 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
Import IRIX 6.5 getloadavg fixes from gnulib.
|
Import IRIX 6.5 getloadavg fixes from gnulib.
|
||||||
|
|
|
||||||
|
|
@ -330,7 +330,8 @@ DOS_gnulib_comp.m4 = gl-comp.m4
|
||||||
# Update modules from gnulib, for maintainers, who should have it in
|
# Update modules from gnulib, for maintainers, who should have it in
|
||||||
# $(gnulib_srcdir) (relative to $(srcdir) and should have build tools
|
# $(gnulib_srcdir) (relative to $(srcdir) and should have build tools
|
||||||
# as per $(gnulib_srcdir)/DEPENDENCIES.
|
# as per $(gnulib_srcdir)/DEPENDENCIES.
|
||||||
GNULIB_MODULES = dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
GNULIB_MODULES = \
|
||||||
|
crypto/md5 dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
||||||
GNULIB_TOOL_FLAGS = \
|
GNULIB_TOOL_FLAGS = \
|
||||||
--import --no-changelog --no-vc-files --makefile-name=gnulib.mk
|
--import --no-changelog --no-vc-files --makefile-name=gnulib.mk
|
||||||
sync-from-gnulib: $(gnulib_srcdir)
|
sync-from-gnulib: $(gnulib_srcdir)
|
||||||
|
|
|
||||||
1
aclocal.m4
vendored
1
aclocal.m4
vendored
|
|
@ -992,6 +992,7 @@ m4_include([m4/getopt.m4])
|
||||||
m4_include([m4/gl-comp.m4])
|
m4_include([m4/gl-comp.m4])
|
||||||
m4_include([m4/gnulib-common.m4])
|
m4_include([m4/gnulib-common.m4])
|
||||||
m4_include([m4/include_next.m4])
|
m4_include([m4/include_next.m4])
|
||||||
|
m4_include([m4/md5.m4])
|
||||||
m4_include([m4/mktime.m4])
|
m4_include([m4/mktime.m4])
|
||||||
m4_include([m4/multiarch.m4])
|
m4_include([m4/multiarch.m4])
|
||||||
m4_include([m4/stdbool.m4])
|
m4_include([m4/stdbool.m4])
|
||||||
|
|
|
||||||
|
|
@ -557,7 +557,7 @@ Note: erring on the side of caution, I also added notices to some
|
||||||
files I thought might be considered non-trivial (if one includes
|
files I thought might be considered non-trivial (if one includes
|
||||||
comment) in s/:
|
comment) in s/:
|
||||||
aix4-1.h hpux10.h irix6-0.h irix6-5.h
|
aix4-1.h hpux10.h irix6-0.h irix6-5.h
|
||||||
ptx4.h sol2.h
|
ptx4.h sol2.h
|
||||||
|
|
||||||
(everything with > 30 non-blank lines, which at least is _some_ kind of
|
(everything with > 30 non-blank lines, which at least is _some_ kind of
|
||||||
system)
|
system)
|
||||||
|
|
@ -632,8 +632,6 @@ alone (may import them from Gnulib again). These are:
|
||||||
lib/*.[ch]
|
lib/*.[ch]
|
||||||
lib/gnulib.mk
|
lib/gnulib.mk
|
||||||
src/gmalloc.c
|
src/gmalloc.c
|
||||||
src/md5.c
|
|
||||||
src/md5.h
|
|
||||||
src/termcap.c
|
src/termcap.c
|
||||||
src/tparam.c
|
src/tparam.c
|
||||||
|
|
||||||
|
|
|
||||||
329
configure
vendored
329
configure
vendored
|
|
@ -5881,6 +5881,7 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
|
||||||
|
|
||||||
# Code from module arg-nonnull:
|
# Code from module arg-nonnull:
|
||||||
# Code from module c++defs:
|
# Code from module c++defs:
|
||||||
|
# Code from module crypto/md5:
|
||||||
# Code from module dtoastr:
|
# Code from module dtoastr:
|
||||||
# Code from module extensions:
|
# Code from module extensions:
|
||||||
|
|
||||||
|
|
@ -13201,6 +13202,274 @@ fi
|
||||||
export LIBC_FATAL_STDERR_
|
export LIBC_FATAL_STDERR_
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
|
||||||
|
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
|
||||||
|
if ${ac_cv_c_bigendian+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=unknown
|
||||||
|
# See if we're dealing with a universal compiler.
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#ifndef __APPLE_CC__
|
||||||
|
not a universal capable compiler
|
||||||
|
#endif
|
||||||
|
typedef int dummy;
|
||||||
|
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
|
||||||
|
# Check for potential -arch flags. It is not universal unless
|
||||||
|
# there are at least two -arch flags with different values.
|
||||||
|
ac_arch=
|
||||||
|
ac_prev=
|
||||||
|
for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
|
||||||
|
if test -n "$ac_prev"; then
|
||||||
|
case $ac_word in
|
||||||
|
i?86 | x86_64 | ppc | ppc64)
|
||||||
|
if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
|
||||||
|
ac_arch=$ac_word
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=universal
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
ac_prev=
|
||||||
|
elif test "x$ac_word" = "x-arch"; then
|
||||||
|
ac_prev=arch
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
if test $ac_cv_c_bigendian = unknown; then
|
||||||
|
# See if sys/param.h defines the BYTE_ORDER macro.
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
|
||||||
|
&& defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
|
||||||
|
&& LITTLE_ENDIAN)
|
||||||
|
bogus endian macros
|
||||||
|
#endif
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
# It does; now see whether it defined to BIG_ENDIAN or not.
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if BYTE_ORDER != BIG_ENDIAN
|
||||||
|
not big endian
|
||||||
|
#endif
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
if test $ac_cv_c_bigendian = unknown; then
|
||||||
|
# See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
|
||||||
|
bogus endian macros
|
||||||
|
#endif
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
# It does; now see whether it defined to _BIG_ENDIAN or not.
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#ifndef _BIG_ENDIAN
|
||||||
|
not big endian
|
||||||
|
#endif
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
if test $ac_cv_c_bigendian = unknown; then
|
||||||
|
# Compile a test program.
|
||||||
|
if test "$cross_compiling" = yes; then :
|
||||||
|
# Try to guess by grepping values from an object file.
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
short int ascii_mm[] =
|
||||||
|
{ 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
|
||||||
|
short int ascii_ii[] =
|
||||||
|
{ 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
|
||||||
|
int use_ascii (int i) {
|
||||||
|
return ascii_mm[i] + ascii_ii[i];
|
||||||
|
}
|
||||||
|
short int ebcdic_ii[] =
|
||||||
|
{ 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
|
||||||
|
short int ebcdic_mm[] =
|
||||||
|
{ 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
|
||||||
|
int use_ebcdic (int i) {
|
||||||
|
return ebcdic_mm[i] + ebcdic_ii[i];
|
||||||
|
}
|
||||||
|
extern int foo;
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return use_ascii (foo) == use_ebcdic (foo);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
fi
|
||||||
|
if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
|
||||||
|
if test "$ac_cv_c_bigendian" = unknown; then
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
else
|
||||||
|
# finding both strings is unlikely to happen, but who knows?
|
||||||
|
ac_cv_c_bigendian=unknown
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
else
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
$ac_includes_default
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Are we little or big endian? From Harbison&Steele. */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
long int l;
|
||||||
|
char c[sizeof (long int)];
|
||||||
|
} u;
|
||||||
|
u.l = 1;
|
||||||
|
return u.c[sizeof (long int) - 1] == 1;
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_run "$LINENO"; then :
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
fi
|
||||||
|
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
||||||
|
conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
|
||||||
|
$as_echo "$ac_cv_c_bigendian" >&6; }
|
||||||
|
case $ac_cv_c_bigendian in #(
|
||||||
|
yes)
|
||||||
|
$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
|
||||||
|
;; #(
|
||||||
|
no)
|
||||||
|
;; #(
|
||||||
|
universal)
|
||||||
|
|
||||||
|
$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
|
||||||
|
|
||||||
|
;; #(
|
||||||
|
*)
|
||||||
|
as_fn_error $? "unknown endianness
|
||||||
|
presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
|
||||||
|
$as_echo_n "checking for inline... " >&6; }
|
||||||
|
if ${ac_cv_c_inline+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_cv_c_inline=no
|
||||||
|
for ac_kw in inline __inline__ __inline; do
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
typedef int foo_t;
|
||||||
|
static $ac_kw foo_t static_foo () {return 0; }
|
||||||
|
$ac_kw foo_t foo () {return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
ac_cv_c_inline=$ac_kw
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
test "$ac_cv_c_inline" != no && break
|
||||||
|
done
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
|
||||||
|
$as_echo "$ac_cv_c_inline" >&6; }
|
||||||
|
|
||||||
|
case $ac_cv_c_inline in
|
||||||
|
inline | yes) ;;
|
||||||
|
*)
|
||||||
|
case $ac_cv_c_inline in
|
||||||
|
no) ac_val=;;
|
||||||
|
*) ac_val=$ac_cv_c_inline;;
|
||||||
|
esac
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#define inline $ac_val
|
||||||
|
#endif
|
||||||
|
_ACEOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtold conforms to C99" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtold conforms to C99" >&5
|
||||||
$as_echo_n "checking whether strtold conforms to C99... " >&6; }
|
$as_echo_n "checking whether strtold conforms to C99... " >&6; }
|
||||||
if ${gl_cv_func_c99_strtold+:} false; then :
|
if ${gl_cv_func_c99_strtold+:} false; then :
|
||||||
|
|
@ -13964,48 +14233,6 @@ $as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
|
|
||||||
$as_echo_n "checking for inline... " >&6; }
|
|
||||||
if ${ac_cv_c_inline+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
ac_cv_c_inline=no
|
|
||||||
for ac_kw in inline __inline__ __inline; do
|
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
||||||
/* end confdefs.h. */
|
|
||||||
#ifndef __cplusplus
|
|
||||||
typedef int foo_t;
|
|
||||||
static $ac_kw foo_t static_foo () {return 0; }
|
|
||||||
$ac_kw foo_t foo () {return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_ACEOF
|
|
||||||
if ac_fn_c_try_compile "$LINENO"; then :
|
|
||||||
ac_cv_c_inline=$ac_kw
|
|
||||||
fi
|
|
||||||
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
||||||
test "$ac_cv_c_inline" != no && break
|
|
||||||
done
|
|
||||||
|
|
||||||
fi
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
|
|
||||||
$as_echo "$ac_cv_c_inline" >&6; }
|
|
||||||
|
|
||||||
case $ac_cv_c_inline in
|
|
||||||
inline | yes) ;;
|
|
||||||
*)
|
|
||||||
case $ac_cv_c_inline in
|
|
||||||
no) ac_val=;;
|
|
||||||
*) ac_val=$ac_cv_c_inline;;
|
|
||||||
esac
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#ifndef __cplusplus
|
|
||||||
#define inline $ac_val
|
|
||||||
#endif
|
|
||||||
_ACEOF
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
GNULIB_MKTIME=0;
|
GNULIB_MKTIME=0;
|
||||||
GNULIB_NANOSLEEP=0;
|
GNULIB_NANOSLEEP=0;
|
||||||
|
|
@ -14460,6 +14687,23 @@ fi
|
||||||
gl_source_base='lib'
|
gl_source_base='lib'
|
||||||
# Code from module arg-nonnull:
|
# Code from module arg-nonnull:
|
||||||
# Code from module c++defs:
|
# Code from module c++defs:
|
||||||
|
# Code from module crypto/md5:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gl_LIBOBJS="$gl_LIBOBJS md5.$ac_objext"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:
|
||||||
|
|
||||||
# Code from module dtoastr:
|
# Code from module dtoastr:
|
||||||
|
|
||||||
# Code from module extensions:
|
# Code from module extensions:
|
||||||
|
|
@ -17861,6 +18105,7 @@ if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
|
||||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
gl_libobjs=
|
gl_libobjs=
|
||||||
gl_ltlibobjs=
|
gl_ltlibobjs=
|
||||||
if test -n "$gl_LIBOBJS"; then
|
if test -n "$gl_LIBOBJS"; then
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
# the same distribution terms as the rest of that program.
|
# the same distribution terms as the rest of that program.
|
||||||
#
|
#
|
||||||
# Generated by gnulib-tool.
|
# Generated by gnulib-tool.
|
||||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --no-libtool --macro-prefix=gl --no-vc-files dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --no-libtool --macro-prefix=gl --no-vc-files crypto/md5 dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
|
@ -53,13 +53,13 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
|
||||||
$(top_srcdir)/m4/c-strtod.m4 $(top_srcdir)/m4/extensions.m4 \
|
$(top_srcdir)/m4/c-strtod.m4 $(top_srcdir)/m4/extensions.m4 \
|
||||||
$(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/m4/getopt.m4 \
|
$(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/m4/getopt.m4 \
|
||||||
$(top_srcdir)/m4/gl-comp.m4 $(top_srcdir)/m4/gnulib-common.m4 \
|
$(top_srcdir)/m4/gl-comp.m4 $(top_srcdir)/m4/gnulib-common.m4 \
|
||||||
$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/mktime.m4 \
|
$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/md5.m4 \
|
||||||
$(top_srcdir)/m4/multiarch.m4 $(top_srcdir)/m4/stdbool.m4 \
|
$(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/multiarch.m4 \
|
||||||
$(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
|
$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
|
||||||
$(top_srcdir)/m4/strftime.m4 $(top_srcdir)/m4/time_h.m4 \
|
$(top_srcdir)/m4/stdlib_h.m4 $(top_srcdir)/m4/strftime.m4 \
|
||||||
$(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
|
$(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/time_r.m4 \
|
||||||
$(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/wchar_t.m4 \
|
$(top_srcdir)/m4/tm_gmtoff.m4 $(top_srcdir)/m4/unistd_h.m4 \
|
||||||
$(top_srcdir)/configure.in
|
$(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/configure.in
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
|
@ -536,10 +536,11 @@ x_default_search_path = @x_default_search_path@
|
||||||
BUILT_SOURCES = arg-nonnull.h c++defs.h $(GETOPT_H) $(STDBOOL_H) \
|
BUILT_SOURCES = arg-nonnull.h c++defs.h $(GETOPT_H) $(STDBOOL_H) \
|
||||||
$(STDDEF_H) stdlib.h time.h unistd.h warn-on-use.h
|
$(STDDEF_H) stdlib.h time.h unistd.h warn-on-use.h
|
||||||
EXTRA_DIST = $(top_srcdir)/./arg-nonnull.h $(top_srcdir)/./c++defs.h \
|
EXTRA_DIST = $(top_srcdir)/./arg-nonnull.h $(top_srcdir)/./c++defs.h \
|
||||||
ftoastr.c ftoastr.h getloadavg.c getopt.c getopt.in.h \
|
md5.c md5.h ftoastr.c ftoastr.h getloadavg.c getopt.c \
|
||||||
getopt1.c getopt_int.h intprops.h mktime-internal.h mktime.c \
|
getopt.in.h getopt1.c getopt_int.h intprops.h \
|
||||||
stdbool.in.h stddef.in.h stdlib.in.h strftime.c strftime.h \
|
mktime-internal.h mktime.c stdbool.in.h stddef.in.h \
|
||||||
time.in.h time_r.c unistd.in.h $(top_srcdir)/./warn-on-use.h
|
stdlib.in.h strftime.c strftime.h time.in.h time_r.c \
|
||||||
|
unistd.in.h $(top_srcdir)/./warn-on-use.h
|
||||||
MOSTLYCLEANFILES = core *.stackdump arg-nonnull.h arg-nonnull.h-t \
|
MOSTLYCLEANFILES = core *.stackdump arg-nonnull.h arg-nonnull.h-t \
|
||||||
c++defs.h c++defs.h-t getopt.h getopt.h-t stdbool.h \
|
c++defs.h c++defs.h-t getopt.h getopt.h-t stdbool.h \
|
||||||
stdbool.h-t stddef.h stddef.h-t stdlib.h stdlib.h-t time.h \
|
stdbool.h-t stddef.h stddef.h-t stdlib.h stdlib.h-t time.h \
|
||||||
|
|
@ -549,8 +550,8 @@ DEFAULT_INCLUDES = -I. -I../src -I$(top_srcdir)/src
|
||||||
libgnu_a_SOURCES = dtoastr.c gettext.h ignore-value.h
|
libgnu_a_SOURCES = dtoastr.c gettext.h ignore-value.h
|
||||||
libgnu_a_LIBADD = $(gl_LIBOBJS)
|
libgnu_a_LIBADD = $(gl_LIBOBJS)
|
||||||
libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
|
libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
|
||||||
EXTRA_libgnu_a_SOURCES = ftoastr.c getloadavg.c getopt.c getopt1.c \
|
EXTRA_libgnu_a_SOURCES = md5.c ftoastr.c getloadavg.c getopt.c \
|
||||||
mktime.c strftime.c time_r.c
|
getopt1.c mktime.c strftime.c time_r.c
|
||||||
ARG_NONNULL_H = arg-nonnull.h
|
ARG_NONNULL_H = arg-nonnull.h
|
||||||
CXXDEFS_H = c++defs.h
|
CXXDEFS_H = c++defs.h
|
||||||
WARN_ON_USE_H = warn-on-use.h
|
WARN_ON_USE_H = warn-on-use.h
|
||||||
|
|
@ -608,6 +609,7 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getloadavg.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getloadavg.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strftime.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strftime.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Po@am__quote@
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
# the same distribution terms as the rest of that program.
|
# the same distribution terms as the rest of that program.
|
||||||
#
|
#
|
||||||
# Generated by gnulib-tool.
|
# Generated by gnulib-tool.
|
||||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --no-libtool --macro-prefix=gl --no-vc-files dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --no-libtool --macro-prefix=gl --no-vc-files crypto/md5 dtoastr getloadavg getopt-gnu ignore-value mktime strftime
|
||||||
|
|
||||||
|
|
||||||
MOSTLYCLEANFILES += core *.stackdump
|
MOSTLYCLEANFILES += core *.stackdump
|
||||||
|
|
@ -69,6 +69,15 @@ EXTRA_DIST += $(top_srcdir)/./c++defs.h
|
||||||
|
|
||||||
## end gnulib module c++defs
|
## end gnulib module c++defs
|
||||||
|
|
||||||
|
## begin gnulib module crypto/md5
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += md5.c md5.h
|
||||||
|
|
||||||
|
EXTRA_libgnu_a_SOURCES += md5.c
|
||||||
|
|
||||||
|
## end gnulib module crypto/md5
|
||||||
|
|
||||||
## begin gnulib module dtoastr
|
## begin gnulib module dtoastr
|
||||||
|
|
||||||
libgnu_a_SOURCES += dtoastr.c
|
libgnu_a_SOURCES += dtoastr.c
|
||||||
|
|
|
||||||
462
lib/md5.c
Normal file
462
lib/md5.c
Normal file
|
|
@ -0,0 +1,462 @@
|
||||||
|
/* Functions to compute MD5 message digest of files or memory blocks.
|
||||||
|
according to the definition of MD5 in RFC 1321 from April 1992.
|
||||||
|
Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2011 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "md5.h"
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if USE_UNLOCKED_IO
|
||||||
|
# include "unlocked-io.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <endian.h>
|
||||||
|
# if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
# define WORDS_BIGENDIAN 1
|
||||||
|
# endif
|
||||||
|
/* We need to keep the namespace clean so define the MD5 function
|
||||||
|
protected using leading __ . */
|
||||||
|
# define md5_init_ctx __md5_init_ctx
|
||||||
|
# define md5_process_block __md5_process_block
|
||||||
|
# define md5_process_bytes __md5_process_bytes
|
||||||
|
# define md5_finish_ctx __md5_finish_ctx
|
||||||
|
# define md5_read_ctx __md5_read_ctx
|
||||||
|
# define md5_stream __md5_stream
|
||||||
|
# define md5_buffer __md5_buffer
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
# define SWAP(n) \
|
||||||
|
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
|
||||||
|
#else
|
||||||
|
# define SWAP(n) (n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BLOCKSIZE 32768
|
||||||
|
#if BLOCKSIZE % 64 != 0
|
||||||
|
# error "invalid BLOCKSIZE"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This array contains the bytes used to pad the buffer to the next
|
||||||
|
64-byte boundary. (RFC 1321, 3.1: Step 1) */
|
||||||
|
static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize structure containing state of computation.
|
||||||
|
(RFC 1321, 3.3: Step 3) */
|
||||||
|
void
|
||||||
|
md5_init_ctx (struct md5_ctx *ctx)
|
||||||
|
{
|
||||||
|
ctx->A = 0x67452301;
|
||||||
|
ctx->B = 0xefcdab89;
|
||||||
|
ctx->C = 0x98badcfe;
|
||||||
|
ctx->D = 0x10325476;
|
||||||
|
|
||||||
|
ctx->total[0] = ctx->total[1] = 0;
|
||||||
|
ctx->buflen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the 4 byte value from v into the memory location pointed to by *cp,
|
||||||
|
If your architecture allows unaligned access this is equivalent to
|
||||||
|
* (md5_uint32 *) cp = v */
|
||||||
|
static inline void
|
||||||
|
set_uint32 (char *cp, md5_uint32 v)
|
||||||
|
{
|
||||||
|
memcpy (cp, &v, sizeof v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put result from CTX in first 16 bytes following RESBUF. The result
|
||||||
|
must be in little endian byte order. */
|
||||||
|
void *
|
||||||
|
md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
|
||||||
|
{
|
||||||
|
char *r = resbuf;
|
||||||
|
set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
|
||||||
|
set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
|
||||||
|
set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
|
||||||
|
set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
|
||||||
|
|
||||||
|
return resbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process the remaining bytes in the internal buffer and the usual
|
||||||
|
prolog according to the standard and write the result to RESBUF. */
|
||||||
|
void *
|
||||||
|
md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
|
||||||
|
{
|
||||||
|
/* Take yet unprocessed bytes into account. */
|
||||||
|
md5_uint32 bytes = ctx->buflen;
|
||||||
|
size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
|
||||||
|
|
||||||
|
/* Now count remaining bytes. */
|
||||||
|
ctx->total[0] += bytes;
|
||||||
|
if (ctx->total[0] < bytes)
|
||||||
|
++ctx->total[1];
|
||||||
|
|
||||||
|
/* Put the 64-bit file length in *bits* at the end of the buffer. */
|
||||||
|
ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3);
|
||||||
|
ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
|
||||||
|
|
||||||
|
memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
|
||||||
|
|
||||||
|
/* Process last bytes. */
|
||||||
|
md5_process_block (ctx->buffer, size * 4, ctx);
|
||||||
|
|
||||||
|
return md5_read_ctx (ctx, resbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute MD5 message digest for bytes read from STREAM. The
|
||||||
|
resulting message digest number will be written into the 16 bytes
|
||||||
|
beginning at RESBLOCK. */
|
||||||
|
int
|
||||||
|
md5_stream (FILE *stream, void *resblock)
|
||||||
|
{
|
||||||
|
struct md5_ctx ctx;
|
||||||
|
size_t sum;
|
||||||
|
|
||||||
|
char *buffer = malloc (BLOCKSIZE + 72);
|
||||||
|
if (!buffer)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Initialize the computation context. */
|
||||||
|
md5_init_ctx (&ctx);
|
||||||
|
|
||||||
|
/* Iterate over full file contents. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
/* We read the file in blocks of BLOCKSIZE bytes. One call of the
|
||||||
|
computation function processes the whole buffer so that with the
|
||||||
|
next round of the loop another block can be read. */
|
||||||
|
size_t n;
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
/* Read block. Take care for partial reads. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
|
||||||
|
|
||||||
|
sum += n;
|
||||||
|
|
||||||
|
if (sum == BLOCKSIZE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
/* Check for the error flag IFF N == 0, so that we don't
|
||||||
|
exit the loop after a partial read due to e.g., EAGAIN
|
||||||
|
or EWOULDBLOCK. */
|
||||||
|
if (ferror (stream))
|
||||||
|
{
|
||||||
|
free (buffer);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
goto process_partial_block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We've read at least one byte, so ignore errors. But always
|
||||||
|
check for EOF, since feof may be true even though N > 0.
|
||||||
|
Otherwise, we could end up calling fread after EOF. */
|
||||||
|
if (feof (stream))
|
||||||
|
goto process_partial_block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process buffer with BLOCKSIZE bytes. Note that
|
||||||
|
BLOCKSIZE % 64 == 0
|
||||||
|
*/
|
||||||
|
md5_process_block (buffer, BLOCKSIZE, &ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
process_partial_block:
|
||||||
|
|
||||||
|
/* Process any remaining bytes. */
|
||||||
|
if (sum > 0)
|
||||||
|
md5_process_bytes (buffer, sum, &ctx);
|
||||||
|
|
||||||
|
/* Construct result in desired memory. */
|
||||||
|
md5_finish_ctx (&ctx, resblock);
|
||||||
|
free (buffer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
|
||||||
|
result is always in little endian byte order, so that a byte-wise
|
||||||
|
output yields to the wanted ASCII representation of the message
|
||||||
|
digest. */
|
||||||
|
void *
|
||||||
|
md5_buffer (const char *buffer, size_t len, void *resblock)
|
||||||
|
{
|
||||||
|
struct md5_ctx ctx;
|
||||||
|
|
||||||
|
/* Initialize the computation context. */
|
||||||
|
md5_init_ctx (&ctx);
|
||||||
|
|
||||||
|
/* Process whole buffer but last len % 64 bytes. */
|
||||||
|
md5_process_bytes (buffer, len, &ctx);
|
||||||
|
|
||||||
|
/* Put result in desired memory area. */
|
||||||
|
return md5_finish_ctx (&ctx, resblock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
|
||||||
|
{
|
||||||
|
/* When we already have some bits in our internal buffer concatenate
|
||||||
|
both inputs first. */
|
||||||
|
if (ctx->buflen != 0)
|
||||||
|
{
|
||||||
|
size_t left_over = ctx->buflen;
|
||||||
|
size_t add = 128 - left_over > len ? len : 128 - left_over;
|
||||||
|
|
||||||
|
memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
|
||||||
|
ctx->buflen += add;
|
||||||
|
|
||||||
|
if (ctx->buflen > 64)
|
||||||
|
{
|
||||||
|
md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
|
||||||
|
|
||||||
|
ctx->buflen &= 63;
|
||||||
|
/* The regions in the following copy operation cannot overlap. */
|
||||||
|
memcpy (ctx->buffer,
|
||||||
|
&((char *) ctx->buffer)[(left_over + add) & ~63],
|
||||||
|
ctx->buflen);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = (const char *) buffer + add;
|
||||||
|
len -= add;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process available complete blocks. */
|
||||||
|
if (len >= 64)
|
||||||
|
{
|
||||||
|
#if !_STRING_ARCH_unaligned
|
||||||
|
# define alignof(type) offsetof (struct { char c; type x; }, x)
|
||||||
|
# define UNALIGNED_P(p) (((size_t) p) % alignof (md5_uint32) != 0)
|
||||||
|
if (UNALIGNED_P (buffer))
|
||||||
|
while (len > 64)
|
||||||
|
{
|
||||||
|
md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
|
||||||
|
buffer = (const char *) buffer + 64;
|
||||||
|
len -= 64;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
md5_process_block (buffer, len & ~63, ctx);
|
||||||
|
buffer = (const char *) buffer + (len & ~63);
|
||||||
|
len &= 63;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move remaining bytes in internal buffer. */
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
size_t left_over = ctx->buflen;
|
||||||
|
|
||||||
|
memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
|
||||||
|
left_over += len;
|
||||||
|
if (left_over >= 64)
|
||||||
|
{
|
||||||
|
md5_process_block (ctx->buffer, 64, ctx);
|
||||||
|
left_over -= 64;
|
||||||
|
memcpy (ctx->buffer, &ctx->buffer[16], left_over);
|
||||||
|
}
|
||||||
|
ctx->buflen = left_over;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* These are the four functions used in the four steps of the MD5 algorithm
|
||||||
|
and defined in the RFC 1321. The first function is a little bit optimized
|
||||||
|
(as found in Colin Plumbs public domain implementation). */
|
||||||
|
/* #define FF(b, c, d) ((b & c) | (~b & d)) */
|
||||||
|
#define FF(b, c, d) (d ^ (b & (c ^ d)))
|
||||||
|
#define FG(b, c, d) FF (d, b, c)
|
||||||
|
#define FH(b, c, d) (b ^ c ^ d)
|
||||||
|
#define FI(b, c, d) (c ^ (b | ~d))
|
||||||
|
|
||||||
|
/* Process LEN bytes of BUFFER, accumulating context into CTX.
|
||||||
|
It is assumed that LEN % 64 == 0. */
|
||||||
|
|
||||||
|
void
|
||||||
|
md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
|
||||||
|
{
|
||||||
|
md5_uint32 correct_words[16];
|
||||||
|
const md5_uint32 *words = buffer;
|
||||||
|
size_t nwords = len / sizeof (md5_uint32);
|
||||||
|
const md5_uint32 *endp = words + nwords;
|
||||||
|
md5_uint32 A = ctx->A;
|
||||||
|
md5_uint32 B = ctx->B;
|
||||||
|
md5_uint32 C = ctx->C;
|
||||||
|
md5_uint32 D = ctx->D;
|
||||||
|
|
||||||
|
/* First increment the byte count. RFC 1321 specifies the possible
|
||||||
|
length of the file up to 2^64 bits. Here we only compute the
|
||||||
|
number of bytes. Do a double word increment. */
|
||||||
|
ctx->total[0] += len;
|
||||||
|
if (ctx->total[0] < len)
|
||||||
|
++ctx->total[1];
|
||||||
|
|
||||||
|
/* Process all bytes in the buffer with 64 bytes in each round of
|
||||||
|
the loop. */
|
||||||
|
while (words < endp)
|
||||||
|
{
|
||||||
|
md5_uint32 *cwp = correct_words;
|
||||||
|
md5_uint32 A_save = A;
|
||||||
|
md5_uint32 B_save = B;
|
||||||
|
md5_uint32 C_save = C;
|
||||||
|
md5_uint32 D_save = D;
|
||||||
|
|
||||||
|
/* First round: using the given function, the context and a constant
|
||||||
|
the next context is computed. Because the algorithms processing
|
||||||
|
unit is a 32-bit word and it is determined to work on words in
|
||||||
|
little endian byte order we perhaps have to change the byte order
|
||||||
|
before the computation. To reduce the work for the next steps
|
||||||
|
we store the swapped words in the array CORRECT_WORDS. */
|
||||||
|
|
||||||
|
#define OP(a, b, c, d, s, T) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
|
||||||
|
++words; \
|
||||||
|
CYCLIC (a, s); \
|
||||||
|
a += b; \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
/* It is unfortunate that C does not provide an operator for
|
||||||
|
cyclic rotation. Hope the C compiler is smart enough. */
|
||||||
|
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
|
||||||
|
|
||||||
|
/* Before we start, one word to the strange constants.
|
||||||
|
They are defined in RFC 1321 as
|
||||||
|
|
||||||
|
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
|
||||||
|
|
||||||
|
Here is an equivalent invocation using Perl:
|
||||||
|
|
||||||
|
perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Round 1. */
|
||||||
|
OP (A, B, C, D, 7, 0xd76aa478);
|
||||||
|
OP (D, A, B, C, 12, 0xe8c7b756);
|
||||||
|
OP (C, D, A, B, 17, 0x242070db);
|
||||||
|
OP (B, C, D, A, 22, 0xc1bdceee);
|
||||||
|
OP (A, B, C, D, 7, 0xf57c0faf);
|
||||||
|
OP (D, A, B, C, 12, 0x4787c62a);
|
||||||
|
OP (C, D, A, B, 17, 0xa8304613);
|
||||||
|
OP (B, C, D, A, 22, 0xfd469501);
|
||||||
|
OP (A, B, C, D, 7, 0x698098d8);
|
||||||
|
OP (D, A, B, C, 12, 0x8b44f7af);
|
||||||
|
OP (C, D, A, B, 17, 0xffff5bb1);
|
||||||
|
OP (B, C, D, A, 22, 0x895cd7be);
|
||||||
|
OP (A, B, C, D, 7, 0x6b901122);
|
||||||
|
OP (D, A, B, C, 12, 0xfd987193);
|
||||||
|
OP (C, D, A, B, 17, 0xa679438e);
|
||||||
|
OP (B, C, D, A, 22, 0x49b40821);
|
||||||
|
|
||||||
|
/* For the second to fourth round we have the possibly swapped words
|
||||||
|
in CORRECT_WORDS. Redefine the macro to take an additional first
|
||||||
|
argument specifying the function to use. */
|
||||||
|
#undef OP
|
||||||
|
#define OP(f, a, b, c, d, k, s, T) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
a += f (b, c, d) + correct_words[k] + T; \
|
||||||
|
CYCLIC (a, s); \
|
||||||
|
a += b; \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
/* Round 2. */
|
||||||
|
OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
|
||||||
|
OP (FG, D, A, B, C, 6, 9, 0xc040b340);
|
||||||
|
OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
|
||||||
|
OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
|
||||||
|
OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
|
||||||
|
OP (FG, D, A, B, C, 10, 9, 0x02441453);
|
||||||
|
OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
|
||||||
|
OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
|
||||||
|
OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
|
||||||
|
OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
|
||||||
|
OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
|
||||||
|
OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
|
||||||
|
OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
|
||||||
|
OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
|
||||||
|
OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
|
||||||
|
OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
|
||||||
|
|
||||||
|
/* Round 3. */
|
||||||
|
OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
|
||||||
|
OP (FH, D, A, B, C, 8, 11, 0x8771f681);
|
||||||
|
OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
|
||||||
|
OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
|
||||||
|
OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
|
||||||
|
OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
|
||||||
|
OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
|
||||||
|
OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
|
||||||
|
OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
|
||||||
|
OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
|
||||||
|
OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
|
||||||
|
OP (FH, B, C, D, A, 6, 23, 0x04881d05);
|
||||||
|
OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
|
||||||
|
OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
|
||||||
|
OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
|
||||||
|
OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
|
||||||
|
|
||||||
|
/* Round 4. */
|
||||||
|
OP (FI, A, B, C, D, 0, 6, 0xf4292244);
|
||||||
|
OP (FI, D, A, B, C, 7, 10, 0x432aff97);
|
||||||
|
OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
|
||||||
|
OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
|
||||||
|
OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
|
||||||
|
OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
|
||||||
|
OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
|
||||||
|
OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
|
||||||
|
OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
|
||||||
|
OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
|
||||||
|
OP (FI, C, D, A, B, 6, 15, 0xa3014314);
|
||||||
|
OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
|
||||||
|
OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
|
||||||
|
OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
|
||||||
|
OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
|
||||||
|
OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
|
||||||
|
|
||||||
|
/* Add the starting values of the context. */
|
||||||
|
A += A_save;
|
||||||
|
B += B_save;
|
||||||
|
C += C_save;
|
||||||
|
D += D_save;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put checksum in context given as argument. */
|
||||||
|
ctx->A = A;
|
||||||
|
ctx->B = B;
|
||||||
|
ctx->C = C;
|
||||||
|
ctx->D = D;
|
||||||
|
}
|
||||||
|
|
@ -1,33 +1,62 @@
|
||||||
/* Declaration of functions and data types used for MD5 sum computing
|
/* Declaration of functions and data types used for MD5 sum computing
|
||||||
library functions.
|
library functions.
|
||||||
Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
|
Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2011 Free Software
|
||||||
2005, 2006, 2007 Free Software Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of GNU Emacs.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify it
|
||||||
modify it under the terms of the GNU General Public License as
|
under the terms of the GNU General Public License as published by the
|
||||||
published by the Free Software Foundation; either version 2 of the
|
Free Software Foundation; either version 3, or (at your option) any
|
||||||
License, or (at your option) any later version.
|
later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public
|
You should have received a copy of the GNU General Public License
|
||||||
License along with the GNU C Library; see the file COPYING. If not,
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _MD5_H
|
#ifndef _MD5_H
|
||||||
#define _MD5_H 1
|
#define _MD5_H 1
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if defined HAVE_LIMITS_H || _LIBC
|
#define MD5_DIGEST_SIZE 16
|
||||||
# include <limits.h>
|
#define MD5_BLOCK_SIZE 64
|
||||||
|
|
||||||
|
#ifndef __GNUC_PREREQ
|
||||||
|
# if defined __GNUC__ && defined __GNUC_MINOR__
|
||||||
|
# define __GNUC_PREREQ(maj, min) \
|
||||||
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
|
# else
|
||||||
|
# define __GNUC_PREREQ(maj, min) 0
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __THROW
|
||||||
|
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||||
|
# define __THROW throw ()
|
||||||
|
# else
|
||||||
|
# define __THROW
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
|
# define __md5_buffer md5_buffer
|
||||||
|
# define __md5_finish_ctx md5_finish_ctx
|
||||||
|
# define __md5_init_ctx md5_init_ctx
|
||||||
|
# define __md5_process_block md5_process_block
|
||||||
|
# define __md5_process_bytes md5_process_bytes
|
||||||
|
# define __md5_read_ctx md5_read_ctx
|
||||||
|
# define __md5_stream md5_stream
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
/* The following contortions are an attempt to use the C preprocessor
|
/* The following contortions are an attempt to use the C preprocessor
|
||||||
to determine an unsigned integral type that is 32 bits wide. An
|
to determine an unsigned integral type that is 32 bits wide. An
|
||||||
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
|
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
|
||||||
|
|
@ -35,9 +64,9 @@
|
||||||
the resulting executable. Locally running cross-compiled executables
|
the resulting executable. Locally running cross-compiled executables
|
||||||
is usually not possible. */
|
is usually not possible. */
|
||||||
|
|
||||||
#ifdef _LIBC
|
#if defined _LIBC
|
||||||
# include <sys/types.h>
|
# include <stdint.h>
|
||||||
typedef u_int32_t md5_uint32;
|
typedef uint32_t md5_uint32;
|
||||||
#else
|
#else
|
||||||
# if defined __STDC__ && __STDC__
|
# if defined __STDC__ && __STDC__
|
||||||
# define UINT_MAX_32_BITS 4294967295U
|
# define UINT_MAX_32_BITS 4294967295U
|
||||||
|
|
@ -45,14 +74,7 @@ typedef u_int32_t md5_uint32;
|
||||||
# define UINT_MAX_32_BITS 0xFFFFFFFF
|
# define UINT_MAX_32_BITS 0xFFFFFFFF
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
|
# include <limits.h>
|
||||||
This should be valid for all systems GNU cares about because
|
|
||||||
that doesn't include 16-bit systems, and only modern systems
|
|
||||||
(that certainly have <limits.h>) have 64+-bit integral types. */
|
|
||||||
|
|
||||||
# ifndef UINT_MAX
|
|
||||||
# define UINT_MAX UINT_MAX_32_BITS
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if UINT_MAX == UINT_MAX_32_BITS
|
# if UINT_MAX == UINT_MAX_32_BITS
|
||||||
typedef unsigned int md5_uint32;
|
typedef unsigned int md5_uint32;
|
||||||
|
|
@ -63,21 +85,14 @@ typedef u_int32_t md5_uint32;
|
||||||
# if ULONG_MAX == UINT_MAX_32_BITS
|
# if ULONG_MAX == UINT_MAX_32_BITS
|
||||||
typedef unsigned long md5_uint32;
|
typedef unsigned long md5_uint32;
|
||||||
# else
|
# else
|
||||||
/* The following line is intended to evoke an error.
|
/* A machine this weird should have <stdint.h>. */
|
||||||
Using #error is not portable enough. */
|
# include <stdint.h>
|
||||||
"Cannot determine unsigned 32-bit data type."
|
typedef uint32_t md5_uint32;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_ATTRIBUTE_ALIGNED
|
|
||||||
# define ATTRIBUTE_ALIGNED(N) __attribute__ ((__aligned__ (N)))
|
|
||||||
#else
|
|
||||||
# define ATTRIBUTE_ALIGNED(N)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Structure to save state of computation between the single steps. */
|
/* Structure to save state of computation between the single steps. */
|
||||||
struct md5_ctx
|
struct md5_ctx
|
||||||
{
|
{
|
||||||
|
|
@ -88,7 +103,7 @@ struct md5_ctx
|
||||||
|
|
||||||
md5_uint32 total[2];
|
md5_uint32 total[2];
|
||||||
md5_uint32 buflen;
|
md5_uint32 buflen;
|
||||||
char buffer[128] ATTRIBUTE_ALIGNED (__alignof__ (md5_uint32));
|
md5_uint32 buffer[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -98,51 +113,49 @@ struct md5_ctx
|
||||||
|
|
||||||
/* Initialize structure containing state of computation.
|
/* Initialize structure containing state of computation.
|
||||||
(RFC 1321, 3.3: Step 3) */
|
(RFC 1321, 3.3: Step 3) */
|
||||||
extern void md5_init_ctx (struct md5_ctx *ctx);
|
extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
|
||||||
|
|
||||||
/* Starting with the result of former calls of this function (or the
|
/* Starting with the result of former calls of this function (or the
|
||||||
initialization function update the context for the next LEN bytes
|
initialization function update the context for the next LEN bytes
|
||||||
starting at BUFFER.
|
starting at BUFFER.
|
||||||
It is necessary that LEN is a multiple of 64!!! */
|
It is necessary that LEN is a multiple of 64!!! */
|
||||||
extern void md5_process_block (const void *buffer, size_t len,
|
extern void __md5_process_block (const void *buffer, size_t len,
|
||||||
struct md5_ctx *ctx);
|
struct md5_ctx *ctx) __THROW;
|
||||||
|
|
||||||
/* Starting with the result of former calls of this function (or the
|
/* Starting with the result of former calls of this function (or the
|
||||||
initialization function update the context for the next LEN bytes
|
initialization function update the context for the next LEN bytes
|
||||||
starting at BUFFER.
|
starting at BUFFER.
|
||||||
It is NOT required that LEN is a multiple of 64. */
|
It is NOT required that LEN is a multiple of 64. */
|
||||||
extern void md5_process_bytes (const void *buffer, size_t len,
|
extern void __md5_process_bytes (const void *buffer, size_t len,
|
||||||
struct md5_ctx *ctx);
|
struct md5_ctx *ctx) __THROW;
|
||||||
|
|
||||||
/* Process the remaining bytes in the buffer and put result from CTX
|
/* Process the remaining bytes in the buffer and put result from CTX
|
||||||
in first 16 bytes following RESBUF. The result is always in little
|
in first 16 bytes following RESBUF. The result is always in little
|
||||||
endian byte order, so that a byte-wise output yields to the wanted
|
endian byte order, so that a byte-wise output yields to the wanted
|
||||||
ASCII representation of the message digest.
|
ASCII representation of the message digest. */
|
||||||
|
extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
|
||||||
IMPORTANT: On some systems it is required that RESBUF is correctly
|
|
||||||
aligned for a 32 bits value. */
|
|
||||||
extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
|
|
||||||
|
|
||||||
|
|
||||||
/* Put result from CTX in first 16 bytes following RESBUF. The result is
|
/* Put result from CTX in first 16 bytes following RESBUF. The result is
|
||||||
always in little endian byte order, so that a byte-wise output yields
|
always in little endian byte order, so that a byte-wise output yields
|
||||||
to the wanted ASCII representation of the message digest.
|
to the wanted ASCII representation of the message digest. */
|
||||||
|
extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
|
||||||
IMPORTANT: On some systems it is required that RESBUF is correctly
|
|
||||||
aligned for a 32 bits value. */
|
|
||||||
extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf);
|
|
||||||
|
|
||||||
|
|
||||||
/* Compute MD5 message digest for bytes read from STREAM. The
|
/* Compute MD5 message digest for bytes read from STREAM. The
|
||||||
resulting message digest number will be written into the 16 bytes
|
resulting message digest number will be written into the 16 bytes
|
||||||
beginning at RESBLOCK. */
|
beginning at RESBLOCK. */
|
||||||
extern int md5_stream (FILE *stream, void *resblock);
|
extern int __md5_stream (FILE *stream, void *resblock) __THROW;
|
||||||
|
|
||||||
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
|
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
|
||||||
result is always in little endian byte order, so that a byte-wise
|
result is always in little endian byte order, so that a byte-wise
|
||||||
output yields to the wanted ASCII representation of the message
|
output yields to the wanted ASCII representation of the message
|
||||||
digest. */
|
digest. */
|
||||||
extern void *md5_buffer (const char *buffer, size_t len,
|
extern void *__md5_buffer (const char *buffer, size_t len,
|
||||||
void *resblock);
|
void *resblock) __THROW;
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
#endif /* md5.h */
|
#endif /* md5.h */
|
||||||
|
|
@ -28,6 +28,7 @@ AC_DEFUN([gl_EARLY],
|
||||||
AC_REQUIRE([AC_PROG_RANLIB])
|
AC_REQUIRE([AC_PROG_RANLIB])
|
||||||
# Code from module arg-nonnull:
|
# Code from module arg-nonnull:
|
||||||
# Code from module c++defs:
|
# Code from module c++defs:
|
||||||
|
# Code from module crypto/md5:
|
||||||
# Code from module dtoastr:
|
# Code from module dtoastr:
|
||||||
# Code from module extensions:
|
# Code from module extensions:
|
||||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
@ -68,6 +69,8 @@ AC_DEFUN([gl_INIT],
|
||||||
gl_source_base='lib'
|
gl_source_base='lib'
|
||||||
# Code from module arg-nonnull:
|
# Code from module arg-nonnull:
|
||||||
# Code from module c++defs:
|
# Code from module c++defs:
|
||||||
|
# Code from module crypto/md5:
|
||||||
|
gl_MD5
|
||||||
# Code from module dtoastr:
|
# Code from module dtoastr:
|
||||||
AC_REQUIRE([gl_C99_STRTOLD])
|
AC_REQUIRE([gl_C99_STRTOLD])
|
||||||
# Code from module extensions:
|
# Code from module extensions:
|
||||||
|
|
@ -261,6 +264,8 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/gettext.h
|
lib/gettext.h
|
||||||
lib/ignore-value.h
|
lib/ignore-value.h
|
||||||
lib/intprops.h
|
lib/intprops.h
|
||||||
|
lib/md5.c
|
||||||
|
lib/md5.h
|
||||||
lib/mktime-internal.h
|
lib/mktime-internal.h
|
||||||
lib/mktime.c
|
lib/mktime.c
|
||||||
lib/stdbool.in.h
|
lib/stdbool.in.h
|
||||||
|
|
@ -278,6 +283,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/getopt.m4
|
m4/getopt.m4
|
||||||
m4/gnulib-common.m4
|
m4/gnulib-common.m4
|
||||||
m4/include_next.m4
|
m4/include_next.m4
|
||||||
|
m4/md5.m4
|
||||||
m4/mktime.m4
|
m4/mktime.m4
|
||||||
m4/multiarch.m4
|
m4/multiarch.m4
|
||||||
m4/stdbool.m4
|
m4/stdbool.m4
|
||||||
|
|
|
||||||
15
m4/md5.m4
Normal file
15
m4/md5.m4
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# md5.m4 serial 11
|
||||||
|
dnl Copyright (C) 2002-2006, 2008-2011 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_MD5],
|
||||||
|
[
|
||||||
|
AC_LIBOBJ([md5])
|
||||||
|
|
||||||
|
dnl Prerequisites of lib/md5.c.
|
||||||
|
AC_REQUIRE([gl_BIGENDIAN])
|
||||||
|
AC_REQUIRE([AC_C_INLINE])
|
||||||
|
:
|
||||||
|
])
|
||||||
|
|
@ -354,7 +354,7 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
|
||||||
syntax.o $(UNEXEC_OBJ) bytecode.o \
|
syntax.o $(UNEXEC_OBJ) bytecode.o \
|
||||||
process.o gnutls.o callproc.o \
|
process.o gnutls.o callproc.o \
|
||||||
region-cache.o sound.o atimer.o \
|
region-cache.o sound.o atimer.o \
|
||||||
doprnt.o intervals.o textprop.o composite.o md5.o xml.o \
|
doprnt.o intervals.o textprop.o composite.o xml.o \
|
||||||
$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ)
|
$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ)
|
||||||
obj = $(base_obj) $(NS_OBJC_OBJ)
|
obj = $(base_obj) $(NS_OBJC_OBJ)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,17 +9,17 @@
|
||||||
## it under the terms of the GNU General Public License as published by
|
## it under the terms of the GNU General Public License as published by
|
||||||
## the Free Software Foundation, either version 3 of the License, or
|
## the Free Software Foundation, either version 3 of the License, or
|
||||||
## (at your option) any later version.
|
## (at your option) any later version.
|
||||||
##
|
##
|
||||||
## GNU Emacs is distributed in the hope that it will be useful,
|
## GNU Emacs is distributed in the hope that it will be useful,
|
||||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
##
|
##
|
||||||
## You should have received a copy of the GNU General Public License
|
## You should have received a copy of the GNU General Public License
|
||||||
## along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
## along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
## Commentary:
|
## Commentary:
|
||||||
##
|
##
|
||||||
## This file is inserted in src/Makefile if AUTO_DEPEND=no.
|
## This file is inserted in src/Makefile if AUTO_DEPEND=no.
|
||||||
## It defines static dependencies between the various source files.
|
## It defines static dependencies between the various source files.
|
||||||
|
|
||||||
|
|
@ -144,7 +144,6 @@ gmalloc.o: gmalloc.c $(config_h)
|
||||||
ralloc.o: ralloc.c lisp.h $(config_h)
|
ralloc.o: ralloc.c lisp.h $(config_h)
|
||||||
vm-limit.o: vm-limit.c mem-limits.h lisp.h globals.h $(config_h)
|
vm-limit.o: vm-limit.c mem-limits.h lisp.h globals.h $(config_h)
|
||||||
marker.o: marker.c buffer.h character.h lisp.h globals.h $(config_h)
|
marker.o: marker.c buffer.h character.h lisp.h globals.h $(config_h)
|
||||||
md5.o: md5.c md5.h $(config_h)
|
|
||||||
minibuf.o: minibuf.c syntax.h frame.h window.h keyboard.h systime.h \
|
minibuf.o: minibuf.c syntax.h frame.h window.h keyboard.h systime.h \
|
||||||
buffer.h commands.h character.h msdos.h $(INTERVALS_H) keymap.h \
|
buffer.h commands.h character.h msdos.h $(INTERVALS_H) keymap.h \
|
||||||
termhooks.h lisp.h globals.h $(config_h) coding.h
|
termhooks.h lisp.h globals.h $(config_h) coding.h
|
||||||
|
|
|
||||||
429
src/md5.c
429
src/md5.c
|
|
@ -1,429 +0,0 @@
|
||||||
/* Functions to compute MD5 message digest of files or memory blocks.
|
|
||||||
according to the definition of MD5 in RFC 1321 from April 1992.
|
|
||||||
Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
|
|
||||||
2005, 2006, 2007, 2010 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with the GNU C Library; see the file COPYING. If not, write to the
|
|
||||||
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if STDC_HEADERS || defined _LIBC
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <string.h>
|
|
||||||
#else
|
|
||||||
# ifndef HAVE_MEMCPY
|
|
||||||
# define memcpy(d, s, n) bcopy ((s), (d), (n))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
|
||||||
# include <endian.h>
|
|
||||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
# define WORDS_BIGENDIAN 1
|
|
||||||
# endif
|
|
||||||
/* We need to keep the namespace clean so define the MD5 function
|
|
||||||
protected using leading __ . */
|
|
||||||
# define md5_init_ctx __md5_init_ctx
|
|
||||||
# define md5_process_block __md5_process_block
|
|
||||||
# define md5_process_bytes __md5_process_bytes
|
|
||||||
# define md5_finish_ctx __md5_finish_ctx
|
|
||||||
# define md5_read_ctx __md5_read_ctx
|
|
||||||
# define md5_stream __md5_stream
|
|
||||||
# define md5_buffer __md5_buffer
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "md5.h"
|
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
# define SWAP(n) \
|
|
||||||
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
|
|
||||||
#else
|
|
||||||
# define SWAP(n) (n)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* This array contains the bytes used to pad the buffer to the next
|
|
||||||
64-byte boundary. (RFC 1321, 3.1: Step 1) */
|
|
||||||
static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize structure containing state of computation.
|
|
||||||
(RFC 1321, 3.3: Step 3) */
|
|
||||||
void
|
|
||||||
md5_init_ctx (struct md5_ctx *ctx)
|
|
||||||
{
|
|
||||||
ctx->A = 0x67452301;
|
|
||||||
ctx->B = 0xefcdab89;
|
|
||||||
ctx->C = 0x98badcfe;
|
|
||||||
ctx->D = 0x10325476;
|
|
||||||
|
|
||||||
ctx->total[0] = ctx->total[1] = 0;
|
|
||||||
ctx->buflen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put result from CTX in first 16 bytes following RESBUF. The result
|
|
||||||
must be in little endian byte order.
|
|
||||||
|
|
||||||
IMPORTANT: On some systems it is required that RESBUF is correctly
|
|
||||||
aligned for a 32 bits value. */
|
|
||||||
void *
|
|
||||||
md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
|
|
||||||
{
|
|
||||||
((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
|
|
||||||
((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
|
|
||||||
((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
|
|
||||||
((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
|
|
||||||
|
|
||||||
return resbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process the remaining bytes in the internal buffer and the usual
|
|
||||||
prolog according to the standard and write the result to RESBUF.
|
|
||||||
|
|
||||||
IMPORTANT: On some systems it is required that RESBUF is correctly
|
|
||||||
aligned for a 32 bits value. */
|
|
||||||
void *
|
|
||||||
md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
|
|
||||||
{
|
|
||||||
/* Take yet unprocessed bytes into account. */
|
|
||||||
md5_uint32 bytes = ctx->buflen;
|
|
||||||
size_t pad;
|
|
||||||
|
|
||||||
/* Now count remaining bytes. */
|
|
||||||
ctx->total[0] += bytes;
|
|
||||||
if (ctx->total[0] < bytes)
|
|
||||||
++ctx->total[1];
|
|
||||||
|
|
||||||
pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
|
|
||||||
memcpy (&ctx->buffer[bytes], fillbuf, pad);
|
|
||||||
|
|
||||||
/* Put the 64-bit file length in *bits* at the end of the buffer. */
|
|
||||||
*(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
|
|
||||||
*(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
|
|
||||||
(ctx->total[0] >> 29));
|
|
||||||
|
|
||||||
/* Process last bytes. */
|
|
||||||
md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
|
|
||||||
|
|
||||||
return md5_read_ctx (ctx, resbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute MD5 message digest for bytes read from STREAM. The
|
|
||||||
resulting message digest number will be written into the 16 bytes
|
|
||||||
beginning at RESBLOCK. */
|
|
||||||
int
|
|
||||||
md5_stream (FILE *stream, void *resblock)
|
|
||||||
{
|
|
||||||
/* Important: BLOCKSIZE must be a multiple of 64. */
|
|
||||||
#define BLOCKSIZE 4096
|
|
||||||
struct md5_ctx ctx;
|
|
||||||
char buffer[BLOCKSIZE + 72];
|
|
||||||
size_t sum;
|
|
||||||
|
|
||||||
/* Initialize the computation context. */
|
|
||||||
md5_init_ctx (&ctx);
|
|
||||||
|
|
||||||
/* Iterate over full file contents. */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* We read the file in blocks of BLOCKSIZE bytes. One call of the
|
|
||||||
computation function processes the whole buffer so that with the
|
|
||||||
next round of the loop another block can be read. */
|
|
||||||
size_t n;
|
|
||||||
sum = 0;
|
|
||||||
|
|
||||||
/* Read block. Take care for partial reads. */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
|
|
||||||
|
|
||||||
sum += n;
|
|
||||||
}
|
|
||||||
while (sum < BLOCKSIZE && n != 0);
|
|
||||||
if (n == 0 && ferror (stream))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* If end of file is reached, end the loop. */
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Process buffer with BLOCKSIZE bytes. Note that
|
|
||||||
BLOCKSIZE % 64 == 0
|
|
||||||
*/
|
|
||||||
md5_process_block (buffer, BLOCKSIZE, &ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add the last bytes if necessary. */
|
|
||||||
if (sum > 0)
|
|
||||||
md5_process_bytes (buffer, sum, &ctx);
|
|
||||||
|
|
||||||
/* Construct result in desired memory. */
|
|
||||||
md5_finish_ctx (&ctx, resblock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
|
|
||||||
result is always in little endian byte order, so that a byte-wise
|
|
||||||
output yields to the wanted ASCII representation of the message
|
|
||||||
digest. */
|
|
||||||
void *
|
|
||||||
md5_buffer (const char *buffer, size_t len, void *resblock)
|
|
||||||
{
|
|
||||||
struct md5_ctx ctx;
|
|
||||||
|
|
||||||
/* Initialize the computation context. */
|
|
||||||
md5_init_ctx (&ctx);
|
|
||||||
|
|
||||||
/* Process whole buffer but last len % 64 bytes. */
|
|
||||||
md5_process_bytes (buffer, len, &ctx);
|
|
||||||
|
|
||||||
/* Put result in desired memory area. */
|
|
||||||
return md5_finish_ctx (&ctx, resblock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
|
|
||||||
{
|
|
||||||
/* const void aligned_buffer = buffer; */
|
|
||||||
|
|
||||||
/* When we already have some bits in our internal buffer concatenate
|
|
||||||
both inputs first. */
|
|
||||||
if (ctx->buflen != 0)
|
|
||||||
{
|
|
||||||
size_t left_over = ctx->buflen;
|
|
||||||
size_t add = 128 - left_over > len ? len : 128 - left_over;
|
|
||||||
|
|
||||||
/* Only put full words in the buffer. */
|
|
||||||
add -= add % sizeof (md5_uint32);
|
|
||||||
|
|
||||||
memcpy (&ctx->buffer[left_over], buffer, add);
|
|
||||||
ctx->buflen += add;
|
|
||||||
|
|
||||||
if (ctx->buflen > 64)
|
|
||||||
{
|
|
||||||
md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
|
|
||||||
|
|
||||||
ctx->buflen &= 63;
|
|
||||||
/* The regions in the following copy operation cannot overlap. */
|
|
||||||
memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
|
|
||||||
ctx->buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer = (const char *) buffer + add;
|
|
||||||
len -= add;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process available complete blocks. */
|
|
||||||
if (len > 64)
|
|
||||||
{
|
|
||||||
md5_process_block (buffer, len & ~63, ctx);
|
|
||||||
buffer = (const char *) buffer + (len & ~63);
|
|
||||||
len &= 63;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move remaining bytes in internal buffer. */
|
|
||||||
if (len > 0)
|
|
||||||
{
|
|
||||||
size_t left_over = ctx->buflen;
|
|
||||||
|
|
||||||
memcpy (&ctx->buffer[left_over], buffer, len);
|
|
||||||
left_over += len;
|
|
||||||
if (left_over >= 64)
|
|
||||||
{
|
|
||||||
md5_process_block (ctx->buffer, 64, ctx);
|
|
||||||
left_over -= 64;
|
|
||||||
memcpy (ctx->buffer, &ctx->buffer[64], left_over);
|
|
||||||
}
|
|
||||||
ctx->buflen = left_over;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* These are the four functions used in the four steps of the MD5 algorithm
|
|
||||||
and defined in the RFC 1321. The first function is a little bit optimized
|
|
||||||
(as found in Colin Plumbs public domain implementation). */
|
|
||||||
/* #define FF(b, c, d) ((b & c) | (~b & d)) */
|
|
||||||
#define FF(b, c, d) (d ^ (b & (c ^ d)))
|
|
||||||
#define FG(b, c, d) FF (d, b, c)
|
|
||||||
#define FH(b, c, d) (b ^ c ^ d)
|
|
||||||
#define FI(b, c, d) (c ^ (b | ~d))
|
|
||||||
|
|
||||||
/* Process LEN bytes of BUFFER, accumulating context into CTX.
|
|
||||||
It is assumed that LEN % 64 == 0. */
|
|
||||||
|
|
||||||
void
|
|
||||||
md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
|
|
||||||
{
|
|
||||||
md5_uint32 correct_words[16];
|
|
||||||
const md5_uint32 *words = buffer;
|
|
||||||
size_t nwords = len / sizeof (md5_uint32);
|
|
||||||
const md5_uint32 *endp = words + nwords;
|
|
||||||
md5_uint32 A = ctx->A;
|
|
||||||
md5_uint32 B = ctx->B;
|
|
||||||
md5_uint32 C = ctx->C;
|
|
||||||
md5_uint32 D = ctx->D;
|
|
||||||
|
|
||||||
/* First increment the byte count. RFC 1321 specifies the possible
|
|
||||||
length of the file up to 2^64 bits. Here we only compute the
|
|
||||||
number of bytes. Do a double word increment. */
|
|
||||||
ctx->total[0] += len;
|
|
||||||
if (ctx->total[0] < len)
|
|
||||||
++ctx->total[1];
|
|
||||||
|
|
||||||
/* Process all bytes in the buffer with 64 bytes in each round of
|
|
||||||
the loop. */
|
|
||||||
while (words < endp)
|
|
||||||
{
|
|
||||||
md5_uint32 *cwp = correct_words;
|
|
||||||
md5_uint32 A_save = A;
|
|
||||||
md5_uint32 B_save = B;
|
|
||||||
md5_uint32 C_save = C;
|
|
||||||
md5_uint32 D_save = D;
|
|
||||||
|
|
||||||
/* First round: using the given function, the context and a constant
|
|
||||||
the next context is computed. Because the algorithms processing
|
|
||||||
unit is a 32-bit word and it is determined to work on words in
|
|
||||||
little endian byte order we perhaps have to change the byte order
|
|
||||||
before the computation. To reduce the work for the next steps
|
|
||||||
we store the swapped words in the array CORRECT_WORDS. */
|
|
||||||
|
|
||||||
#define OP(a, b, c, d, s, T) \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
|
|
||||||
++words; \
|
|
||||||
CYCLIC (a, s); \
|
|
||||||
a += b; \
|
|
||||||
} \
|
|
||||||
while (0)
|
|
||||||
|
|
||||||
/* It is unfortunate that C does not provide an operator for
|
|
||||||
cyclic rotation. Hope the C compiler is smart enough. */
|
|
||||||
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
|
|
||||||
|
|
||||||
/* Before we start, one word to the strange constants.
|
|
||||||
They are defined in RFC 1321 as
|
|
||||||
|
|
||||||
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Round 1. */
|
|
||||||
OP (A, B, C, D, 7, 0xd76aa478);
|
|
||||||
OP (D, A, B, C, 12, 0xe8c7b756);
|
|
||||||
OP (C, D, A, B, 17, 0x242070db);
|
|
||||||
OP (B, C, D, A, 22, 0xc1bdceee);
|
|
||||||
OP (A, B, C, D, 7, 0xf57c0faf);
|
|
||||||
OP (D, A, B, C, 12, 0x4787c62a);
|
|
||||||
OP (C, D, A, B, 17, 0xa8304613);
|
|
||||||
OP (B, C, D, A, 22, 0xfd469501);
|
|
||||||
OP (A, B, C, D, 7, 0x698098d8);
|
|
||||||
OP (D, A, B, C, 12, 0x8b44f7af);
|
|
||||||
OP (C, D, A, B, 17, 0xffff5bb1);
|
|
||||||
OP (B, C, D, A, 22, 0x895cd7be);
|
|
||||||
OP (A, B, C, D, 7, 0x6b901122);
|
|
||||||
OP (D, A, B, C, 12, 0xfd987193);
|
|
||||||
OP (C, D, A, B, 17, 0xa679438e);
|
|
||||||
OP (B, C, D, A, 22, 0x49b40821);
|
|
||||||
|
|
||||||
/* For the second to fourth round we have the possibly swapped words
|
|
||||||
in CORRECT_WORDS. Redefine the macro to take an additional first
|
|
||||||
argument specifying the function to use. */
|
|
||||||
#undef OP
|
|
||||||
#define OP(f, a, b, c, d, k, s, T) \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
a += f (b, c, d) + correct_words[k] + T; \
|
|
||||||
CYCLIC (a, s); \
|
|
||||||
a += b; \
|
|
||||||
} \
|
|
||||||
while (0)
|
|
||||||
|
|
||||||
/* Round 2. */
|
|
||||||
OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
|
|
||||||
OP (FG, D, A, B, C, 6, 9, 0xc040b340);
|
|
||||||
OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
|
|
||||||
OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
|
|
||||||
OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
|
|
||||||
OP (FG, D, A, B, C, 10, 9, 0x02441453);
|
|
||||||
OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
|
|
||||||
OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
|
|
||||||
OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
|
|
||||||
OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
|
|
||||||
OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
|
|
||||||
OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
|
|
||||||
OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
|
|
||||||
OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
|
|
||||||
OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
|
|
||||||
OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
|
|
||||||
|
|
||||||
/* Round 3. */
|
|
||||||
OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
|
|
||||||
OP (FH, D, A, B, C, 8, 11, 0x8771f681);
|
|
||||||
OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
|
|
||||||
OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
|
|
||||||
OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
|
|
||||||
OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
|
|
||||||
OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
|
|
||||||
OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
|
|
||||||
OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
|
|
||||||
OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
|
|
||||||
OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
|
|
||||||
OP (FH, B, C, D, A, 6, 23, 0x04881d05);
|
|
||||||
OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
|
|
||||||
OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
|
|
||||||
OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
|
|
||||||
OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
|
|
||||||
|
|
||||||
/* Round 4. */
|
|
||||||
OP (FI, A, B, C, D, 0, 6, 0xf4292244);
|
|
||||||
OP (FI, D, A, B, C, 7, 10, 0x432aff97);
|
|
||||||
OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
|
|
||||||
OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
|
|
||||||
OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
|
|
||||||
OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
|
|
||||||
OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
|
|
||||||
OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
|
|
||||||
OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
|
|
||||||
OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
|
|
||||||
OP (FI, C, D, A, B, 6, 15, 0xa3014314);
|
|
||||||
OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
|
|
||||||
OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
|
|
||||||
OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
|
|
||||||
OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
|
|
||||||
OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
|
|
||||||
|
|
||||||
/* Add the starting values of the context. */
|
|
||||||
A += A_save;
|
|
||||||
B += B_save;
|
|
||||||
C += C_save;
|
|
||||||
D += D_save;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put checksum in context given as argument. */
|
|
||||||
ctx->A = A;
|
|
||||||
ctx->B = B;
|
|
||||||
ctx->C = C;
|
|
||||||
ctx->D = D;
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue