From cf0fcea2b7ae26222f4865e9a6df53972a02f443 Mon Sep 17 00:00:00 2001 From: phk Date: Sat, 17 Mar 2001 10:00:50 +0000 Subject: Add a new entrypoint to the hashes in libmd: char * FooFileChunk(const char *filename, char *buf, off_t offset, off_t length) Which only hashes part of a file. Implement FooFile() in terms of this function. Submitted by: roam --- lib/libmd/Makefile | 16 +++++++++++----- lib/libmd/md2.h | 1 + lib/libmd/md2c.c | 4 ++-- lib/libmd/md4.h | 1 + lib/libmd/mdX.3 | 20 ++++++++++++++++++++ lib/libmd/mdXhl.c | 36 +++++++++++++++++++++++++++++------- lib/libmd/ripemd.3 | 20 ++++++++++++++++++++ lib/libmd/ripemd.h | 5 +++++ lib/libmd/sha.3 | 23 +++++++++++++++++++++++ lib/libmd/sha.h | 2 ++ 10 files changed, 114 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/libmd/Makefile b/lib/libmd/Makefile index 5762808..7f2589a 100644 --- a/lib/libmd/Makefile +++ b/lib/libmd/Makefile @@ -8,18 +8,24 @@ INCS= md2.h md4.h md5.h ripemd.h sha.h MAN3+= md2.3 md4.3 md5.3 ripemd.3 sha.3 MLINKS+=md2.3 MD2Init.3 md2.3 MD2Update.3 md2.3 MD2Final.3 -MLINKS+=md2.3 MD2End.3 md2.3 MD2File.3 md2.3 MD2Data.3 +MLINKS+=md2.3 MD2End.3 md2.3 MD2File.3 md2.3 MD2FileChunk.3 +MLINKS+=md2.3 MD2Data.3 MLINKS+=md4.3 MD4Init.3 md4.3 MD4Update.3 md4.3 MD4Final.3 -MLINKS+=md4.3 MD4End.3 md4.3 MD4File.3 md4.3 MD4Data.3 +MLINKS+=md4.3 MD4End.3 md4.3 MD4File.3 md4.3 MD4FileChunk.3 +MLINKS+=md4.3 MD4Data.3 MLINKS+=md5.3 MD5Init.3 md5.3 MD5Update.3 md5.3 MD5Final.3 -MLINKS+=md5.3 MD5End.3 md5.3 MD5File.3 md5.3 MD5Data.3 +MLINKS+=md5.3 MD5End.3 md5.3 MD5File.3 md5.3 MD5FileChunk.3 +MLINKS+=md5.3 MD5Data.3 MLINKS+=ripemd.3 RIPEMD160_Init.3 ripemd.3 RIPEMD160_Update.3 MLINKS+=ripemd.3 RIPEMD160_Final.3 ripemd.3 RIPEMD160_Data.3 MLINKS+=ripemd.3 RIPEMD160_End.3 ripemd.3 RIPEMD160_File.3 +MLINKS+=ripemd.3 RIPEMD160_FileChunk.3 MLINKS+=sha.3 SHA_Init.3 sha.3 SHA_Update.3 sha.3 SHA_Final.3 -MLINKS+=sha.3 SHA_End.3 sha.3 SHA_File.3 sha.3 SHA_Data.3 +MLINKS+=sha.3 SHA_End.3 sha.3 SHA_File.3 sha.3 SHA_FileChunk.3 +MLINKS+=sha.3 SHA_Data.3 MLINKS+=sha.3 SHA1_Init.3 sha.3 SHA1_Update.3 sha.3 SHA1_Final.3 -MLINKS+=sha.3 SHA1_End.3 sha.3 SHA1_File.3 sha.3 SHA1_Data.3 +MLINKS+=sha.3 SHA1_End.3 sha.3 SHA1_File.3 sha.3 SHA1_FileChunk.3 +MLINKS+=sha.3 SHA1_Data.3 CLEANFILES+= md[245]hl.c md[245].ref md[245].3 mddriver \ rmd160.ref rmd160hl.c rmddriver \ sha0.ref sha0hl.c sha1.ref sha1hl.c shadriver diff --git a/lib/libmd/md2.h b/lib/libmd/md2.h index 8215038..e449eed 100644 --- a/lib/libmd/md2.h +++ b/lib/libmd/md2.h @@ -39,6 +39,7 @@ void MD2Pad(MD2_CTX *); void MD2Final(unsigned char [16], MD2_CTX *); char * MD2End(MD2_CTX *, char *); char * MD2File(const char *, char *); +char * MD2FileChunk(const char *, char *, off_t, off_t); char * MD2Data(const unsigned char *, unsigned int, char *); __END_DECLS diff --git a/lib/libmd/md2c.c b/lib/libmd/md2c.c index 97edfbe..8e0b814 100644 --- a/lib/libmd/md2c.c +++ b/lib/libmd/md2c.c @@ -20,9 +20,9 @@ documentation and/or software. */ -#include "md2.h" -#include #include +#include +#include "md2.h" typedef unsigned char *POINTER; diff --git a/lib/libmd/md4.h b/lib/libmd/md4.h index 5a648c8..f727d7e 100644 --- a/lib/libmd/md4.h +++ b/lib/libmd/md4.h @@ -41,6 +41,7 @@ void MD4Pad(MD4_CTX *); void MD4Final(unsigned char [16], MD4_CTX *); char * MD4End(MD4_CTX *, char *); char * MD4File(const char *, char *); +char * MD4FileChunk(const char *, char *, off_t, off_t); char * MD4Data(const unsigned char *, unsigned int, char *); __END_DECLS diff --git a/lib/libmd/mdX.3 b/lib/libmd/mdX.3 index cc44122..412aeba 100644 --- a/lib/libmd/mdX.3 +++ b/lib/libmd/mdX.3 @@ -18,6 +18,7 @@ .Nm MDXFinal , .Nm MDXEnd , .Nm MDXFile , +.Nm MDXFileChunk , .Nm MDXData .Nd calculate the RSA Data Security, Inc., ``MDX'' message digest .Sh LIBRARY @@ -38,6 +39,8 @@ .Ft "char *" .Fn MDXFile "const char *filename" "char *buf" .Ft "char *" +.Fn MDXFileChunk "const char *filename" "char *buf" "off_t offset" "off_t length" +.Ft "char *" .Fn MDXData "const unsigned char *data" "unsigned int len" "char *buf" .Sh DESCRIPTION The MDX functions calculate a 128-bit cryptographic checksum (digest) @@ -88,6 +91,23 @@ calculates the digest of a file, and uses .Fn MDXEnd to return the result. If the file cannot be opened, a null pointer is returned. +.Fn MDXFileChunk +is similar to +.Fn MDXFile , +but it only calculates the digest over a byte-range of the file specified, +starting at +.Ar offset +and spanning +.Ar length +bytes. +If the +.Ar length +parameter is specified as 0, or more than the length of the remaining part +of the file, +.Fn MDXFileChunk +calculates the digest from +.Ar offset +to the end of file. .Fn MDXData calculates the digest of a chunk of data in memory, and uses .Fn MDXEnd diff --git a/lib/libmd/mdXhl.c b/lib/libmd/mdXhl.c index 0af7892..247160c 100644 --- a/lib/libmd/mdXhl.c +++ b/lib/libmd/mdXhl.c @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -43,19 +44,40 @@ MDXEnd(MDX_CTX *ctx, char *buf) char * MDXFile(const char *filename, char *buf) { + return MDXFileChunk(filename, buf, 0, 0); +} + +char * +MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) +{ unsigned char buffer[BUFSIZ]; MDX_CTX ctx; - int f,i,j; + struct stat stbuf; + int f, i, e; + off_t n; MDXInit(&ctx); - f = open(filename,O_RDONLY); + f = open(filename, O_RDONLY); if (f < 0) return 0; - while ((i = read(f,buffer,sizeof buffer)) > 0) { - MDXUpdate(&ctx,buffer,i); - } - j = errno; + if (fstat(f, &stbuf) < 0) return 0; + if (ofs > stbuf.st_size) + ofs = stbuf.st_size; + if ((len == 0) || (len > stbuf.st_size - ofs)) + len = stbuf.st_size - ofs; + if (lseek(f, ofs, SEEK_SET) < 0) return 0; + n = len; + while (n > 0) { + if (n > sizeof(buffer)) + i = read(f, buffer, sizeof(buffer)); + else + i = read(f, buffer, n); + if (i < 0) break; + MDXUpdate(&ctx, buffer, i); + n -= i; + } + e = errno; close(f); - errno = j; + errno = e; if (i < 0) return 0; return MDXEnd(&ctx, buf); } diff --git a/lib/libmd/ripemd.3 b/lib/libmd/ripemd.3 index 352d452..ed71be5 100644 --- a/lib/libmd/ripemd.3 +++ b/lib/libmd/ripemd.3 @@ -18,6 +18,7 @@ .Nm RIPEMD160_Final , .Nm RIPEMD160_End , .Nm RIPEMD160_File , +.Nm RIPEMD160_FileChunk , .Nm RIPEMD160_Data .Nd calculate the RIPEMD160 message digest .Sh LIBRARY @@ -36,6 +37,8 @@ .Ft "char *" .Fn RIPEMD160_File "const char *filename" "char *buf" .Ft "char *" +.Fn RIPEMD160_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length" +.Ft "char *" .Fn RIPEMD160_Data "const unsigned char *data" "unsigned int len" "char *buf" .Sh DESCRIPTION The @@ -72,6 +75,23 @@ calculates the digest of a file, and uses .Fn RIPEMD160_End to return the result. If the file cannot be opened, a null pointer is returned. +.Fn RIPEMD160_FileChunk +is similar to +.Fn RIPEMD160_File , +but it only calculates the digest over a byte-range of the file specified, +starting at +.Ar offset +and spanning +.Ar length +bytes. +If the +.Ar length +parameter is specified as 0, or more than the length of the remaining part +of the file, +.Fn RIPEMD160_FileChunk +calculates the digest from +.Ar offset +to the end of file. .Fn RIPEMD160_Data calculates the digest of a chunk of data in memory, and uses .Fn RIPEMD160_End diff --git a/lib/libmd/ripemd.h b/lib/libmd/ripemd.h index 1399d32..e64f501 100644 --- a/lib/libmd/ripemd.h +++ b/lib/libmd/ripemd.h @@ -56,6 +56,10 @@ * [including the GNU Public Licence.] */ +/* + * $FreeBSD$ + */ + #ifndef HEADER_RIPEMD_H #define HEADER_RIPEMD_H @@ -83,6 +87,7 @@ void RIPEMD160_Update(RIPEMD160_CTX *c, const unsigned char *data, void RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); char *RIPEMD160_End(RIPEMD160_CTX *, char *); char *RIPEMD160_File(const char *, char *); +char *RIPEMD160_FileChunk(const char *, char *, off_t, off_t); char *RIPEMD160_Data(const unsigned char *, unsigned int, char *); __END_DECLS diff --git a/lib/libmd/sha.3 b/lib/libmd/sha.3 index c670ad5..90b7277 100644 --- a/lib/libmd/sha.3 +++ b/lib/libmd/sha.3 @@ -18,12 +18,14 @@ .Nm SHA_Final , .Nm SHA_End , .Nm SHA_File , +.Nm SHA_FileChunk , .Nm SHA_Data , .Nm SHA1_Init , .Nm SHA1_Update , .Nm SHA1_Final , .Nm SHA1_End , .Nm SHA1_File , +.Nm SHA1_FileChunk , .Nm SHA1_Data .Nd calculate the FIPS 160 and 160-1 ``SHA'' message digests .Sh LIBRARY @@ -42,6 +44,8 @@ .Ft "char *" .Fn SHA_File "const char *filename" "char *buf" .Ft "char *" +.Fn SHA_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length" +.Ft "char *" .Fn SHA_Data "const unsigned char *data" "unsigned int len" "char *buf" .Ft void .Fn SHA1_Init "SHA_CTX *context" @@ -54,6 +58,8 @@ .Ft "char *" .Fn SHA1_File "const char *filename" "char *buf" .Ft "char *" +.Fn SHA1_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length" +.Ft "char *" .Fn SHA1_Data "const unsigned char *data" "unsigned int len" "char *buf" .Sh DESCRIPTION The @@ -101,6 +107,23 @@ calculates the digest of a file, and uses .Fn SHA1_End to return the result. If the file cannot be opened, a null pointer is returned. +.Fn SHA1_FileChunk +is similar to +.Fn SHA1_File , +but it only calculates the digest over a byte-range of the file specified, +starting at +.Ar offset +and spanning +.Ar length +bytes. +If the +.Ar length +parameter is specified as 0, or more than the length of the remaining part +of the file, +.Fn SHA1_FileChunk +calculates the digest from +.Ar offset +to the end of file. .Fn SHA1_Data calculates the digest of a chunk of data in memory, and uses .Fn SHA1_End diff --git a/lib/libmd/sha.h b/lib/libmd/sha.h index 7380330..7e5f2b6 100644 --- a/lib/libmd/sha.h +++ b/lib/libmd/sha.h @@ -84,12 +84,14 @@ void SHA_Update(SHA_CTX *c, const unsigned char *data, size_t len); void SHA_Final(unsigned char *md, SHA_CTX *c); char *SHA_End(SHA_CTX *, char *); char *SHA_File(const char *, char *); +char *SHA_FileChunk(const char *, char *, off_t, off_t); char *SHA_Data(const unsigned char *, unsigned int, char *); void SHA1_Init(SHA_CTX *c); void SHA1_Update(SHA_CTX *c, const unsigned char *data, size_t len); void SHA1_Final(unsigned char *md, SHA_CTX *c); char *SHA1_End(SHA_CTX *, char *); char *SHA1_File(const char *, char *); +char *SHA1_FileChunk(const char *, char *, off_t, off_t); char *SHA1_Data(const unsigned char *, unsigned int, char *); __END_DECLS -- cgit v1.1