Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
13c3daa4
Commit
13c3daa4
authored
May 24, 2011
by
Leo Liu
Browse files
Add crypto/sha1 module from gnulib
parent
5a95c002
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
571 additions
and
3 deletions
+571
-3
ChangeLog
ChangeLog
+10
-0
Makefile.in
Makefile.in
+2
-2
lib/gnulib.mk
lib/gnulib.mk
+10
-1
lib/makefile.w32-in
lib/makefile.w32-in
+10
-0
lib/sha1.c
lib/sha1.c
+427
-0
lib/sha1.h
lib/sha1.h
+92
-0
m4/gl-comp.m4
m4/gl-comp.m4
+5
-0
m4/sha1.m4
m4/sha1.m4
+15
-0
No files found.
ChangeLog
View file @
13c3daa4
2011-05-24 Leo Liu <sdl.web@gmail.com>
* m4/sha1.m4:
* m4/gl-comp.m4:
* lib/sha1.h:
* lib/sha1.c:
* lib/makefile.w32-in (GNULIBOBJS):
* lib/gnulib.mk:
* Makefile.in (GNULIB_MODULES): Add crypto/sha1 module.
2011-05-24 Glenn Morris <rgm@gnu.org>
* Makefile.in (TAGS, tags, check): Pass MFLAGS to sub-makes.
...
...
Makefile.in
View file @
13c3daa4
...
...
@@ -332,8 +332,8 @@ DOS_gnulib_comp.m4 = gl-comp.m4
# $(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
\
...
...
lib/gnulib.mk
View file @
13c3daa4
...
...
@@ -9,7 +9,7 @@
# the same distribution terms as the rest of that program.
#
# 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 careadlinkat crypto/md5 dtoastr filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink socklen stdarg stdio strftime strtoumax symlink sys_stat
# 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 careadlinkat crypto/md5
crypto/sha1
dtoastr filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink socklen stdarg stdio strftime strtoumax symlink sys_stat
MOSTLYCLEANFILES
+=
core
*
.stackdump
...
...
@@ -94,6 +94,15 @@ EXTRA_libgnu_a_SOURCES += md5.c
## end gnulib module crypto/md5
## begin gnulib module crypto/sha1
EXTRA_DIST
+=
sha1.c sha1.h
EXTRA_libgnu_a_SOURCES
+=
sha1.c
## end gnulib module crypto/sha1
## begin gnulib module dosname
if
gl_GNULIB_ENABLED_dosname
...
...
lib/makefile.w32-in
View file @
13c3daa4
...
...
@@ -29,6 +29,7 @@ GNULIBOBJS = $(BLD)/dtoastr.$(O) \
$(BLD)
/strftime.
$(O)
\
$(BLD)
/time_r.
$(O)
\
$(BLD)
/md5.
$(O)
\
$(BLD)
/sha1.
$(O)
\
$(BLD)
/filemode.
$(O)
#
...
...
@@ -110,6 +111,15 @@ $(BLD)/md5.$(O) : \
$(EMACS_ROOT)/src/m/intel386.h
\
$(EMACS_ROOT)/src/config.h
$(BLD)/sha1.$(O)
:
\
$(SRC)/sha1.c
\
$(SRC)/sha1.h
\
$(EMACS_ROOT)/nt/inc/stdint.h
\
$(EMACS_ROOT)/nt/inc/sys/stat.h
\
$(EMACS_ROOT)/src/s/ms-w32.h
\
$(EMACS_ROOT)/src/m/intel386.h
\
$(EMACS_ROOT)/src/config.h
$(BLD)/filemode.$(O)
:
\
$(SRC)/filemode.c
\
$(SRC)/filemode.h
\
...
...
lib/sha1.c
0 → 100644
View file @
13c3daa4
/* sha1.c - Functions to compute SHA1 message digest of files or
memory blocks according to the NIST specification FIPS-180-1.
Copyright (C) 2000-2001, 2003-2006, 2008-2011 Free Software Foundation, Inc.
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 Scott G. Miller
Credits:
Robert Klep <robert@ilse.nl> -- Expansion function fix
*/
#include <config.h>
#include "sha1.h"
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#if USE_UNLOCKED_IO
# include "unlocked-io.h"
#endif
#ifdef WORDS_BIGENDIAN
# define SWAP(n) (n)
#else
# define SWAP(n) \
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
#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, ... */
};
/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
initialize it to the start constants of the SHA1 algorithm. This
must be called before using hash in the call to sha1_hash. */
void
sha1_init_ctx
(
struct
sha1_ctx
*
ctx
)
{
ctx
->
A
=
0x67452301
;
ctx
->
B
=
0xefcdab89
;
ctx
->
C
=
0x98badcfe
;
ctx
->
D
=
0x10325476
;
ctx
->
E
=
0xc3d2e1f0
;
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
* (uint32_t *) cp = v */
static
inline
void
set_uint32
(
char
*
cp
,
uint32_t
v
)
{
memcpy
(
cp
,
&
v
,
sizeof
v
);
}
/* Put result from CTX in first 20 bytes following RESBUF. The result
must be in little endian byte order. */
void
*
sha1_read_ctx
(
const
struct
sha1_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
));
set_uint32
(
r
+
4
*
sizeof
ctx
->
E
,
SWAP
(
ctx
->
E
));
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
*
sha1_finish_ctx
(
struct
sha1_ctx
*
ctx
,
void
*
resbuf
)
{
/* Take yet unprocessed bytes into account. */
uint32_t
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
[
1
]
<<
3
)
|
(
ctx
->
total
[
0
]
>>
29
));
ctx
->
buffer
[
size
-
1
]
=
SWAP
(
ctx
->
total
[
0
]
<<
3
);
memcpy
(
&
((
char
*
)
ctx
->
buffer
)[
bytes
],
fillbuf
,
(
size
-
2
)
*
4
-
bytes
);
/* Process last bytes. */
sha1_process_block
(
ctx
->
buffer
,
size
*
4
,
ctx
);
return
sha1_read_ctx
(
ctx
,
resbuf
);
}
/* Compute SHA1 message digest for bytes read from STREAM. The
resulting message digest number will be written into the 16 bytes
beginning at RESBLOCK. */
int
sha1_stream
(
FILE
*
stream
,
void
*
resblock
)
{
struct
sha1_ctx
ctx
;
size_t
sum
;
char
*
buffer
=
malloc
(
BLOCKSIZE
+
72
);
if
(
!
buffer
)
return
1
;
/* Initialize the computation context. */
sha1_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
*/
sha1_process_block
(
buffer
,
BLOCKSIZE
,
&
ctx
);
}
process_partial_block:
;
/* Process any remaining bytes. */
if
(
sum
>
0
)
sha1_process_bytes
(
buffer
,
sum
,
&
ctx
);
/* Construct result in desired memory. */
sha1_finish_ctx
(
&
ctx
,
resblock
);
free
(
buffer
);
return
0
;
}
/* Compute SHA1 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
*
sha1_buffer
(
const
char
*
buffer
,
size_t
len
,
void
*
resblock
)
{
struct
sha1_ctx
ctx
;
/* Initialize the computation context. */
sha1_init_ctx
(
&
ctx
);
/* Process whole buffer but last len % 64 bytes. */
sha1_process_bytes
(
buffer
,
len
,
&
ctx
);
/* Put result in desired memory area. */
return
sha1_finish_ctx
(
&
ctx
,
resblock
);
}
void
sha1_process_bytes
(
const
void
*
buffer
,
size_t
len
,
struct
sha1_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
)
{
sha1_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 (uint32_t) != 0)
if
(
UNALIGNED_P
(
buffer
))
while
(
len
>
64
)
{
sha1_process_block
(
memcpy
(
ctx
->
buffer
,
buffer
,
64
),
64
,
ctx
);
buffer
=
(
const
char
*
)
buffer
+
64
;
len
-=
64
;
}
else
#endif
{
sha1_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
)
{
sha1_process_block
(
ctx
->
buffer
,
64
,
ctx
);
left_over
-=
64
;
memcpy
(
ctx
->
buffer
,
&
ctx
->
buffer
[
16
],
left_over
);
}
ctx
->
buflen
=
left_over
;
}
}
/* --- Code below is the primary difference between md5.c and sha1.c --- */
/* SHA1 round constants */
#define K1 0x5a827999
#define K2 0x6ed9eba1
#define K3 0x8f1bbcdc
#define K4 0xca62c1d6
/* Round functions. Note that F2 is the same as F4. */
#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
#define F2(B,C,D) (B ^ C ^ D)
#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
#define F4(B,C,D) (B ^ C ^ D)
/* Process LEN bytes of BUFFER, accumulating context into CTX.
It is assumed that LEN % 64 == 0.
Most of this code comes from GnuPG's cipher/sha1.c. */
void
sha1_process_block
(
const
void
*
buffer
,
size_t
len
,
struct
sha1_ctx
*
ctx
)
{
const
uint32_t
*
words
=
buffer
;
size_t
nwords
=
len
/
sizeof
(
uint32_t
);
const
uint32_t
*
endp
=
words
+
nwords
;
uint32_t
x
[
16
];
uint32_t
a
=
ctx
->
A
;
uint32_t
b
=
ctx
->
B
;
uint32_t
c
=
ctx
->
C
;
uint32_t
d
=
ctx
->
D
;
uint32_t
e
=
ctx
->
E
;
/* 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
];
#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \
^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
, (x[I&0x0f] = rol(tm, 1)) )
#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \
+ F( B, C, D ) \
+ K \
+ M; \
B = rol( B, 30 ); \
} while(0)
while
(
words
<
endp
)
{
uint32_t
tm
;
int
t
;
for
(
t
=
0
;
t
<
16
;
t
++
)
{
x
[
t
]
=
SWAP
(
*
words
);
words
++
;
}
R
(
a
,
b
,
c
,
d
,
e
,
F1
,
K1
,
x
[
0
]
);
R
(
e
,
a
,
b
,
c
,
d
,
F1
,
K1
,
x
[
1
]
);
R
(
d
,
e
,
a
,
b
,
c
,
F1
,
K1
,
x
[
2
]
);
R
(
c
,
d
,
e
,
a
,
b
,
F1
,
K1
,
x
[
3
]
);
R
(
b
,
c
,
d
,
e
,
a
,
F1
,
K1
,
x
[
4
]
);
R
(
a
,
b
,
c
,
d
,
e
,
F1
,
K1
,
x
[
5
]
);
R
(
e
,
a
,
b
,
c
,
d
,
F1
,
K1
,
x
[
6
]
);
R
(
d
,
e
,
a
,
b
,
c
,
F1
,
K1
,
x
[
7
]
);
R
(
c
,
d
,
e
,
a
,
b
,
F1
,
K1
,
x
[
8
]
);
R
(
b
,
c
,
d
,
e
,
a
,
F1
,
K1
,
x
[
9
]
);
R
(
a
,
b
,
c
,
d
,
e
,
F1
,
K1
,
x
[
10
]
);
R
(
e
,
a
,
b
,
c
,
d
,
F1
,
K1
,
x
[
11
]
);
R
(
d
,
e
,
a
,
b
,
c
,
F1
,
K1
,
x
[
12
]
);
R
(
c
,
d
,
e
,
a
,
b
,
F1
,
K1
,
x
[
13
]
);
R
(
b
,
c
,
d
,
e
,
a
,
F1
,
K1
,
x
[
14
]
);
R
(
a
,
b
,
c
,
d
,
e
,
F1
,
K1
,
x
[
15
]
);
R
(
e
,
a
,
b
,
c
,
d
,
F1
,
K1
,
M
(
16
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F1
,
K1
,
M
(
17
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F1
,
K1
,
M
(
18
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F1
,
K1
,
M
(
19
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F2
,
K2
,
M
(
20
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F2
,
K2
,
M
(
21
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F2
,
K2
,
M
(
22
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F2
,
K2
,
M
(
23
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F2
,
K2
,
M
(
24
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F2
,
K2
,
M
(
25
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F2
,
K2
,
M
(
26
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F2
,
K2
,
M
(
27
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F2
,
K2
,
M
(
28
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F2
,
K2
,
M
(
29
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F2
,
K2
,
M
(
30
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F2
,
K2
,
M
(
31
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F2
,
K2
,
M
(
32
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F2
,
K2
,
M
(
33
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F2
,
K2
,
M
(
34
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F2
,
K2
,
M
(
35
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F2
,
K2
,
M
(
36
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F2
,
K2
,
M
(
37
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F2
,
K2
,
M
(
38
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F2
,
K2
,
M
(
39
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F3
,
K3
,
M
(
40
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F3
,
K3
,
M
(
41
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F3
,
K3
,
M
(
42
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F3
,
K3
,
M
(
43
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F3
,
K3
,
M
(
44
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F3
,
K3
,
M
(
45
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F3
,
K3
,
M
(
46
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F3
,
K3
,
M
(
47
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F3
,
K3
,
M
(
48
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F3
,
K3
,
M
(
49
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F3
,
K3
,
M
(
50
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F3
,
K3
,
M
(
51
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F3
,
K3
,
M
(
52
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F3
,
K3
,
M
(
53
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F3
,
K3
,
M
(
54
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F3
,
K3
,
M
(
55
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F3
,
K3
,
M
(
56
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F3
,
K3
,
M
(
57
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F3
,
K3
,
M
(
58
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F3
,
K3
,
M
(
59
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F4
,
K4
,
M
(
60
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F4
,
K4
,
M
(
61
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F4
,
K4
,
M
(
62
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F4
,
K4
,
M
(
63
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F4
,
K4
,
M
(
64
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F4
,
K4
,
M
(
65
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F4
,
K4
,
M
(
66
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F4
,
K4
,
M
(
67
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F4
,
K4
,
M
(
68
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F4
,
K4
,
M
(
69
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F4
,
K4
,
M
(
70
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F4
,
K4
,
M
(
71
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F4
,
K4
,
M
(
72
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F4
,
K4
,
M
(
73
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F4
,
K4
,
M
(
74
)
);
R
(
a
,
b
,
c
,
d
,
e
,
F4
,
K4
,
M
(
75
)
);
R
(
e
,
a
,
b
,
c
,
d
,
F4
,
K4
,
M
(
76
)
);
R
(
d
,
e
,
a
,
b
,
c
,
F4
,
K4
,
M
(
77
)
);
R
(
c
,
d
,
e
,
a
,
b
,
F4
,
K4
,
M
(
78
)
);
R
(
b
,
c
,
d
,
e
,
a
,
F4
,
K4
,
M
(
79
)
);
a
=
ctx
->
A
+=
a
;
b
=
ctx
->
B
+=
b
;
c
=
ctx
->
C
+=
c
;
d
=
ctx
->
D
+=
d
;
e
=
ctx
->
E
+=
e
;
}
}
lib/sha1.h
0 → 100644
View file @
13c3daa4
/* Declarations of functions and data types used for SHA1 sum
library functions.
Copyright (C) 2000-2001, 2003, 2005-2006, 2008-2011 Free Software
Foundation, Inc.
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. */
#ifndef SHA1_H
# define SHA1_H 1
# include <stdio.h>
# include <stdint.h>
# ifdef __cplusplus
extern
"C"
{
# endif
#define SHA1_DIGEST_SIZE 20
/* Structure to save state of computation between the single steps. */
struct
sha1_ctx
{
uint32_t
A
;
uint32_t
B
;
uint32_t
C
;
uint32_t
D
;
uint32_t
E
;
uint32_t
total
[
2
];
uint32_t
buflen
;
uint32_t
buffer
[
32
];
};
/* Initialize structure containing state of computation. */
extern
void
sha1_init_ctx
(
struct
sha1_ctx
*
ctx
);
/* Starting with the result of former calls of this function (or the
initialization function update the context for the next LEN bytes
starting at BUFFER.
It is necessary that LEN is a multiple of 64!!! */
extern
void
sha1_process_block
(
const
void
*
buffer
,
size_t
len
,
struct
sha1_ctx
*
ctx
);
/* Starting with the result of former calls of this function (or the
initialization function update the context for the next LEN bytes
starting at BUFFER.
It is NOT required that LEN is a multiple of 64. */
extern
void
sha1_process_bytes
(
const
void
*
buffer
,
size_t
len
,
struct
sha1_ctx
*
ctx
);
/* Process the remaining bytes in the buffer and put result from CTX
in first 20 bytes following RESBUF. 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. */
extern
void
*
sha1_finish_ctx
(
struct
sha1_ctx
*
ctx
,
void
*
resbuf
);
/* Put result from CTX in first 20 bytes following RESBUF. 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. */
extern
void
*
sha1_read_ctx
(
const
struct
sha1_ctx
*
ctx
,
void
*
resbuf
);
/* Compute SHA1 message digest for bytes read from STREAM. The
resulting message digest number will be written into the 20 bytes
beginning at RESBLOCK. */
extern
int
sha1_stream
(
FILE
*
stream
,
void
*
resblock
);
/* Compute SHA1 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. */
extern
void
*
sha1_buffer
(
const
char
*
buffer
,
size_t
len
,
void
*
resblock
);
# ifdef __cplusplus
}
# endif
#endif
m4/gl-comp.m4
View file @
13c3daa4
...
...
@@ -31,6 +31,7 @@ AC_DEFUN([gl_EARLY],
# Code from module c++defs:
# Code from module careadlinkat:
# Code from module crypto/md5:
# Code from module crypto/sha1:
# Code from module dosname:
# Code from module dtoastr:
# Code from module extensions:
...
...
@@ -92,6 +93,7 @@ AC_DEFUN([gl_INIT],
gl_source_base='lib'
AC_CHECK_FUNCS_ONCE([readlinkat])
gl_MD5
gl_SHA1
AC_REQUIRE([gl_C99_STRTOLD])
gl_FILEMODE
gl_GETLOADAVG([$gl_source_base])
...
...
@@ -364,6 +366,8 @@ AC_DEFUN([gl_FILE_LIST], [
lib/mktime-internal.h
lib/mktime.c
lib/readlink.c
lib/sha1.c
lib/sha1.h
lib/stat.c
lib/stdarg.in.h
lib/stdbool.in.h
...
...
@@ -399,6 +403,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/mktime.m4