mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
Separate out additions documentation.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@15683 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
4a5a72c65c
commit
b2dcc87767
7 changed files with 410 additions and 298 deletions
|
@ -1,3 +1,12 @@
|
|||
2003-01-23 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Documentation/Base.gsdoc: Refer to additions.
|
||||
* Documentation/BaseAdditions.gsdoc: New intorduction for additions
|
||||
* Headers/gnustep/base/GSCategories.h: Added MD5Digest NSData method
|
||||
* Source/DocMakefile: Build additions documentation separately
|
||||
* Source/Additions/GSCategories.m: Added MD5Digest NSData method
|
||||
* Source/Additions/GSMime.m: Use MD5Digest NSData method.
|
||||
|
||||
2003-01-22 Richard Frith-Macdonald <rfm@gnu.org>
|
||||
|
||||
* Source/Additions/GSMime.m: ifdefed out my last change ...not sure
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
<p>
|
||||
The GNUstep base library is a free software package implementing
|
||||
the API of the OpenStep Foundation Kit (tm), including later
|
||||
additions.
|
||||
additions. This documentation package describes the core of the
|
||||
base library, for documentation on additional classes, see the
|
||||
BaseAdditions documentation package.
|
||||
</p>
|
||||
<index scope="project" type="title" />
|
||||
<section>
|
||||
|
|
31
Documentation/BaseAdditions.gsdoc
Normal file
31
Documentation/BaseAdditions.gsdoc
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 1.0.0//EN" "http://www.gnustep.org/gsdoc-1_0_0.xml">
|
||||
<gsdoc base="BaseAdditions">
|
||||
<head>
|
||||
<title>GNUstep Base Additions</title>
|
||||
<author name="Richard Frith-Macdonald">
|
||||
<email address="rfm@gnu.org"/>
|
||||
<url url="http://www.gnustep.org/developers/whoiswho.html"/>
|
||||
</author>
|
||||
<version>$Revision$</version>
|
||||
<date>$Date$</date>
|
||||
</head>
|
||||
<body>
|
||||
<chapter>
|
||||
<heading>Base Additions</heading>
|
||||
<p>
|
||||
The GNUstep base additions package comes with the GNUstep base
|
||||
package, and provides additional non-standard classes and
|
||||
additional features for standard classes. It is also intended
|
||||
to be built standalone for use on systems where the GNUstep
|
||||
base is not installed, but where an alernative Foundation is
|
||||
available.
|
||||
</p>
|
||||
<index scope="project" type="title" />
|
||||
</chapter>
|
||||
<back>
|
||||
<index scope="project" type="class" />
|
||||
<index scope="project" type="protocol" />
|
||||
</back>
|
||||
</body>
|
||||
</gsdoc>
|
|
@ -34,5 +34,13 @@
|
|||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@interface NSData (GSCategories)
|
||||
|
||||
- (NSData*) MD5Digest;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* NO_GNUSTEP */
|
||||
#endif /* INCLUDED_GS_CATEGORIES_H */
|
||||
|
|
|
@ -86,3 +86,287 @@
|
|||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Extension methods for the NSData class
|
||||
*/
|
||||
@implementation NSData (GSCategories)
|
||||
|
||||
struct MD5Context
|
||||
{
|
||||
unsigned long buf[4];
|
||||
unsigned long bits[2];
|
||||
unsigned char in[64];
|
||||
};
|
||||
static void MD5Init (struct MD5Context *context);
|
||||
static void MD5Update (struct MD5Context *context, unsigned char const *buf,
|
||||
unsigned len);
|
||||
static void MD5Final (unsigned char digest[16], struct MD5Context *context);
|
||||
static void MD5Transform (unsigned long buf[4], unsigned long const in[16]);
|
||||
|
||||
/*
|
||||
* This code implements the MD5 message-digest algorithm.
|
||||
* The algorithm is due to Ron Rivest. This code was
|
||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||
* This code is in the public domain; do with it what you wish.
|
||||
*
|
||||
* Equivalent code is available from RSA Data Security, Inc.
|
||||
* This code has been tested against that, and is equivalent,
|
||||
* except that you don't need to include two pages of legalese
|
||||
* with every copy.
|
||||
*
|
||||
* To compute the message digest of a chunk of bytes, declare an
|
||||
* MD5Context structure, pass it to MD5Init, call MD5Update as
|
||||
* needed on buffers full of bytes, and then call MD5Final, which
|
||||
* will fill a supplied 16-byte array with the digest.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Ensure data is little-endian
|
||||
*/
|
||||
static void littleEndian (void *buf, unsigned longs)
|
||||
{
|
||||
unsigned long *ptr = (unsigned long*)buf;
|
||||
do
|
||||
{
|
||||
*ptr = NSSwapHostLongToLittle(*ptr);
|
||||
ptr++;
|
||||
}
|
||||
while (--longs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
||||
* initialization constants.
|
||||
*/
|
||||
static void MD5Init (struct MD5Context *ctx)
|
||||
{
|
||||
ctx->buf[0] = 0x67452301;
|
||||
ctx->buf[1] = 0xefcdab89;
|
||||
ctx->buf[2] = 0x98badcfe;
|
||||
ctx->buf[3] = 0x10325476;
|
||||
|
||||
ctx->bits[0] = 0;
|
||||
ctx->bits[1] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update context to reflect the concatenation of another buffer full
|
||||
* of bytes.
|
||||
*/
|
||||
static void MD5Update (struct MD5Context *ctx, unsigned char const *buf,
|
||||
unsigned len)
|
||||
{
|
||||
unsigned long t;
|
||||
|
||||
/* Update bitcount */
|
||||
|
||||
t = ctx->bits[0];
|
||||
if ((ctx->bits[0] = t + ((unsigned long) len << 3)) < t)
|
||||
ctx->bits[1]++; /* Carry from low to high */
|
||||
ctx->bits[1] += len >> 29;
|
||||
|
||||
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
|
||||
|
||||
/* Handle any leading odd-sized chunks */
|
||||
|
||||
if (t)
|
||||
{
|
||||
unsigned char *p = (unsigned char *) ctx->in + t;
|
||||
|
||||
t = 64 - t;
|
||||
if (len < t)
|
||||
{
|
||||
memcpy (p, buf, len);
|
||||
return;
|
||||
}
|
||||
memcpy (p, buf, t);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
buf += t;
|
||||
len -= t;
|
||||
}
|
||||
/* Process data in 64-byte chunks */
|
||||
|
||||
while (len >= 64)
|
||||
{
|
||||
memcpy (ctx->in, buf, 64);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
buf += 64;
|
||||
len -= 64;
|
||||
}
|
||||
|
||||
/* Handle any remaining bytes of data. */
|
||||
|
||||
memcpy (ctx->in, buf, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Final wrapup - pad to 64-byte boundary with the bit pattern
|
||||
* 1 0* (64-bit count of bits processed, MSB-first)
|
||||
*/
|
||||
static void MD5Final (unsigned char digest[16], struct MD5Context *ctx)
|
||||
{
|
||||
unsigned count;
|
||||
unsigned char *p;
|
||||
|
||||
/* Compute number of bytes mod 64 */
|
||||
count = (ctx->bits[0] >> 3) & 0x3F;
|
||||
|
||||
/* Set the first char of padding to 0x80. This is safe since there is
|
||||
always at least one byte free */
|
||||
p = ctx->in + count;
|
||||
*p++ = 0x80;
|
||||
|
||||
/* Bytes of padding needed to make 64 bytes */
|
||||
count = 64 - 1 - count;
|
||||
|
||||
/* Pad out to 56 mod 64 */
|
||||
if (count < 8)
|
||||
{
|
||||
/* Two lots of padding: Pad the first block to 64 bytes */
|
||||
memset (p, 0, count);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
|
||||
/* Now fill the next block with 56 bytes */
|
||||
memset (ctx->in, 0, 56);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Pad block to 56 bytes */
|
||||
memset (p, 0, count - 8);
|
||||
}
|
||||
littleEndian (ctx->in, 14);
|
||||
|
||||
/* Append length in bits and transform */
|
||||
((unsigned long *) ctx->in)[14] = ctx->bits[0];
|
||||
((unsigned long *) ctx->in)[15] = ctx->bits[1];
|
||||
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
littleEndian ((unsigned char *) ctx->buf, 4);
|
||||
memcpy (digest, ctx->buf, 16);
|
||||
memset (ctx, 0, sizeof (ctx)); /* In case it's sensitive */
|
||||
}
|
||||
|
||||
/* The four core functions - F1 is optimized somewhat */
|
||||
|
||||
/* #define F1(x, y, z) (x & y | ~x & z) */
|
||||
#define F1(x, y, z) (z ^ (x & (y ^ z)))
|
||||
#define F2(x, y, z) F1(z, x, y)
|
||||
#define F3(x, y, z) (x ^ y ^ z)
|
||||
#define F4(x, y, z) (y ^ (x | ~z))
|
||||
|
||||
/* This is the central step in the MD5 algorithm. */
|
||||
#define MD5STEP(f, w, x, y, z, data, s) \
|
||||
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
|
||||
|
||||
/*
|
||||
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
||||
* reflect the addition of 16 longwords of new data. MD5Update blocks
|
||||
* the data and converts bytes into longwords for this routine.
|
||||
*/
|
||||
static void MD5Transform (unsigned long buf[4], unsigned long const in[16])
|
||||
{
|
||||
register unsigned long a, b, c, d;
|
||||
|
||||
a = buf[0];
|
||||
b = buf[1];
|
||||
c = buf[2];
|
||||
d = buf[3];
|
||||
|
||||
MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
|
||||
|
||||
MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
|
||||
|
||||
MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
|
||||
|
||||
MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
|
||||
|
||||
buf[0] += a;
|
||||
buf[1] += b;
|
||||
buf[2] += c;
|
||||
buf[3] += d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an MD5 digest of the information stored in the receiver and
|
||||
* returns it as an autoreleased 16 byte NSData object.
|
||||
*/
|
||||
- (NSData*) MD5Digest
|
||||
{
|
||||
struct MD5Context ctx;
|
||||
unsigned char digest[16];
|
||||
|
||||
MD5Init(&ctx);
|
||||
MD5Update(&ctx, [self bytes], [self length]);
|
||||
MD5Final(digest, &ctx);
|
||||
return [NSData dataWithBytes: digest length: 16];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include <config.h>
|
||||
#include <Foundation/Foundation.h>
|
||||
#include <gnustep/base/GSMime.h>
|
||||
#include <gnustep/base/GSCategories.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "GSCompatibility.h"
|
||||
|
@ -61,18 +62,6 @@ static NSCharacterSet *whitespace = nil;
|
|||
static NSCharacterSet *rfc822Specials = nil;
|
||||
static NSCharacterSet *rfc2045Specials = nil;
|
||||
|
||||
struct MD5Context
|
||||
{
|
||||
unsigned long buf[4];
|
||||
unsigned long bits[2];
|
||||
unsigned char in[64];
|
||||
};
|
||||
static void MD5Init (struct MD5Context *context);
|
||||
static void MD5Update (struct MD5Context *context, unsigned char const *buf,
|
||||
unsigned len);
|
||||
static void MD5Final (unsigned char digest[16], struct MD5Context *context);
|
||||
static void MD5Transform (unsigned long buf[4], unsigned long const in[16]);
|
||||
|
||||
/*
|
||||
* Name - decodebase64()
|
||||
* Purpose - Convert 4 bytes in base64 encoding to 3 bytes raw data.
|
||||
|
@ -89,7 +78,7 @@ static char b64[]
|
|||
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
static int
|
||||
encodebase64(char * dst, const unsigned char *src, int length)
|
||||
encodebase64(char *dst, const unsigned char *src, int length)
|
||||
{
|
||||
int dIndex = 0;
|
||||
int sIndex;
|
||||
|
@ -3736,34 +3725,32 @@ static NSCharacterSet *tokenSet = nil;
|
|||
* </p>
|
||||
* <p>This implementation provides base64 encoded data
|
||||
* consisting of an MD5 digest of some pseudo random stuff,
|
||||
* plus an incrementing counter.
|
||||
* plus an incrementing counter. The inclusion of the counter
|
||||
* guarantees that we won't produce two identical strings in
|
||||
* the same run of the program.
|
||||
* </p>
|
||||
*/
|
||||
- (NSString*) makeBoundary
|
||||
{
|
||||
static int count = 0;
|
||||
struct MD5Context ctx;
|
||||
const char *bytes;
|
||||
unsigned int i;
|
||||
unsigned char digest[20];
|
||||
unsigned char *encoded;
|
||||
unsigned char output[20];
|
||||
NSMutableData *md;
|
||||
NSString *result;
|
||||
NSData *source;
|
||||
NSData *digest;
|
||||
int sequence = ++count;
|
||||
|
||||
source = [[[NSProcessInfo processInfo] globallyUniqueString]
|
||||
dataUsingEncoding: NSUTF8StringEncoding];
|
||||
digest = [source MD5Digest];
|
||||
memcpy(output, [digest bytes], 16);
|
||||
output[16] = (sequence >> 24) & 0xff;
|
||||
output[17] = (sequence >> 16) & 0xff;
|
||||
output[18] = (sequence >> 8) & 0xff;
|
||||
output[19] = sequence & 0xff;
|
||||
|
||||
md = [[NSMutableData alloc] initWithLength: 40];
|
||||
encoded = (unsigned char*)[md mutableBytes];
|
||||
MD5Init(&ctx);
|
||||
bytes = [[[NSProcessInfo processInfo] globallyUniqueString] lossyCString];
|
||||
MD5Update(&ctx, bytes, strlen(bytes));
|
||||
count++;
|
||||
MD5Update(&ctx, (unsigned char*)&count, sizeof(count));
|
||||
MD5Final(digest, &ctx);
|
||||
digest[16] = (count >> 24) & 0xff;
|
||||
digest[17] = (count >> 16) & 0xff;
|
||||
digest[18] = (count >> 8) & 0xff;
|
||||
digest[19] = count & 0xff;
|
||||
i = encodebase64(encoded, digest, 20);
|
||||
[md setLength: i];
|
||||
[md setLength: encodebase64([md mutableBytes], output, 20)];
|
||||
result = [[NSString alloc] initWithData: md encoding: NSASCIIStringEncoding];
|
||||
return AUTORELEASE(result);
|
||||
}
|
||||
|
@ -4304,255 +4291,3 @@ static NSCharacterSet *tokenSet = nil;
|
|||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
#include <Foundation/NSByteOrder.h>
|
||||
|
||||
/*
|
||||
* This code implements the MD5 message-digest algorithm.
|
||||
* The algorithm is due to Ron Rivest. This code was
|
||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||
* This code is in the public domain; do with it what you wish.
|
||||
*
|
||||
* Equivalent code is available from RSA Data Security, Inc.
|
||||
* This code has been tested against that, and is equivalent,
|
||||
* except that you don't need to include two pages of legalese
|
||||
* with every copy.
|
||||
*
|
||||
* To compute the message digest of a chunk of bytes, declare an
|
||||
* MD5Context structure, pass it to MD5Init, call MD5Update as
|
||||
* needed on buffers full of bytes, and then call MD5Final, which
|
||||
* will fill a supplied 16-byte array with the digest.
|
||||
*/
|
||||
#include <string.h> /* for memcpy() */
|
||||
|
||||
/*
|
||||
* Ensure data is little-endian
|
||||
*/
|
||||
static void littleEndian (void *buf, unsigned longs)
|
||||
{
|
||||
unsigned long *ptr = (unsigned long*)buf;
|
||||
do
|
||||
{
|
||||
*ptr = NSSwapHostLongToLittle(*ptr);
|
||||
ptr++;
|
||||
}
|
||||
while (--longs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
||||
* initialization constants.
|
||||
*/
|
||||
static void MD5Init (struct MD5Context *ctx)
|
||||
{
|
||||
ctx->buf[0] = 0x67452301;
|
||||
ctx->buf[1] = 0xefcdab89;
|
||||
ctx->buf[2] = 0x98badcfe;
|
||||
ctx->buf[3] = 0x10325476;
|
||||
|
||||
ctx->bits[0] = 0;
|
||||
ctx->bits[1] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update context to reflect the concatenation of another buffer full
|
||||
* of bytes.
|
||||
*/
|
||||
static void MD5Update (struct MD5Context *ctx, unsigned char const *buf,
|
||||
unsigned len)
|
||||
{
|
||||
unsigned long t;
|
||||
|
||||
/* Update bitcount */
|
||||
|
||||
t = ctx->bits[0];
|
||||
if ((ctx->bits[0] = t + ((unsigned long) len << 3)) < t)
|
||||
ctx->bits[1]++; /* Carry from low to high */
|
||||
ctx->bits[1] += len >> 29;
|
||||
|
||||
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
|
||||
|
||||
/* Handle any leading odd-sized chunks */
|
||||
|
||||
if (t)
|
||||
{
|
||||
unsigned char *p = (unsigned char *) ctx->in + t;
|
||||
|
||||
t = 64 - t;
|
||||
if (len < t)
|
||||
{
|
||||
memcpy (p, buf, len);
|
||||
return;
|
||||
}
|
||||
memcpy (p, buf, t);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
buf += t;
|
||||
len -= t;
|
||||
}
|
||||
/* Process data in 64-byte chunks */
|
||||
|
||||
while (len >= 64)
|
||||
{
|
||||
memcpy (ctx->in, buf, 64);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
buf += 64;
|
||||
len -= 64;
|
||||
}
|
||||
|
||||
/* Handle any remaining bytes of data. */
|
||||
|
||||
memcpy (ctx->in, buf, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Final wrapup - pad to 64-byte boundary with the bit pattern
|
||||
* 1 0* (64-bit count of bits processed, MSB-first)
|
||||
*/
|
||||
static void MD5Final (unsigned char digest[16], struct MD5Context *ctx)
|
||||
{
|
||||
unsigned count;
|
||||
unsigned char *p;
|
||||
|
||||
/* Compute number of bytes mod 64 */
|
||||
count = (ctx->bits[0] >> 3) & 0x3F;
|
||||
|
||||
/* Set the first char of padding to 0x80. This is safe since there is
|
||||
always at least one byte free */
|
||||
p = ctx->in + count;
|
||||
*p++ = 0x80;
|
||||
|
||||
/* Bytes of padding needed to make 64 bytes */
|
||||
count = 64 - 1 - count;
|
||||
|
||||
/* Pad out to 56 mod 64 */
|
||||
if (count < 8)
|
||||
{
|
||||
/* Two lots of padding: Pad the first block to 64 bytes */
|
||||
memset (p, 0, count);
|
||||
littleEndian (ctx->in, 16);
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
|
||||
/* Now fill the next block with 56 bytes */
|
||||
memset (ctx->in, 0, 56);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Pad block to 56 bytes */
|
||||
memset (p, 0, count - 8);
|
||||
}
|
||||
littleEndian (ctx->in, 14);
|
||||
|
||||
/* Append length in bits and transform */
|
||||
((unsigned long *) ctx->in)[14] = ctx->bits[0];
|
||||
((unsigned long *) ctx->in)[15] = ctx->bits[1];
|
||||
|
||||
MD5Transform (ctx->buf, (unsigned long *) ctx->in);
|
||||
littleEndian ((unsigned char *) ctx->buf, 4);
|
||||
memcpy (digest, ctx->buf, 16);
|
||||
memset (ctx, 0, sizeof (ctx)); /* In case it's sensitive */
|
||||
}
|
||||
|
||||
/* The four core functions - F1 is optimized somewhat */
|
||||
|
||||
/* #define F1(x, y, z) (x & y | ~x & z) */
|
||||
#define F1(x, y, z) (z ^ (x & (y ^ z)))
|
||||
#define F2(x, y, z) F1(z, x, y)
|
||||
#define F3(x, y, z) (x ^ y ^ z)
|
||||
#define F4(x, y, z) (y ^ (x | ~z))
|
||||
|
||||
/* This is the central step in the MD5 algorithm. */
|
||||
#define MD5STEP(f, w, x, y, z, data, s) \
|
||||
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
|
||||
|
||||
/*
|
||||
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
||||
* reflect the addition of 16 longwords of new data. MD5Update blocks
|
||||
* the data and converts bytes into longwords for this routine.
|
||||
*/
|
||||
static void MD5Transform (unsigned long buf[4], unsigned long const in[16])
|
||||
{
|
||||
register unsigned long a, b, c, d;
|
||||
|
||||
a = buf[0];
|
||||
b = buf[1];
|
||||
c = buf[2];
|
||||
d = buf[3];
|
||||
|
||||
MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
|
||||
MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
|
||||
MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
|
||||
MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
|
||||
MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
|
||||
|
||||
MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
|
||||
MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
|
||||
MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
|
||||
MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
|
||||
MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
|
||||
|
||||
MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
|
||||
MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
|
||||
MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
|
||||
MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
|
||||
MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
|
||||
|
||||
MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
|
||||
MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
|
||||
MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
|
||||
MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
|
||||
MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
|
||||
|
||||
buf[0] += a;
|
||||
buf[1] += b;
|
||||
buf[2] += c;
|
||||
buf[3] += d;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,22 +28,13 @@ GNUSTEP_MAKEFILES = $(GNUSTEP_SYSTEM_ROOT)/Makefiles
|
|||
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
|
||||
DOCUMENT_NAME = Base
|
||||
DOCUMENT_NAME = Base BaseAdditions
|
||||
|
||||
Base_DOC_INSTALL_DIR = Developer
|
||||
BaseAdditions_DOC_INSTALL_DIR = Developer
|
||||
|
||||
Base_AGSDOC_FILES = \
|
||||
../Documentation/Base.gsdoc \
|
||||
GSCategories.h \
|
||||
GSIArray.h \
|
||||
GSIMap.h \
|
||||
GSMime.h \
|
||||
GSObjCRuntime.h \
|
||||
GSUnion.h \
|
||||
GSXML.h \
|
||||
behavior.h \
|
||||
Unicode.h \
|
||||
GCObject.h \
|
||||
NSArchiver.h \
|
||||
NSArray.h \
|
||||
NSAttributedString.h \
|
||||
|
@ -108,6 +99,20 @@ NSUserDefaults.h \
|
|||
NSValue.h \
|
||||
NSZone.h
|
||||
|
||||
BaseAdditions_AGSDOC_FILES = \
|
||||
../Documentation/BaseAdditions.gsdoc \
|
||||
GSCategories.h \
|
||||
GSIArray.h \
|
||||
GSIMap.h \
|
||||
GSMime.h \
|
||||
GSObjCRuntime.h \
|
||||
GSUnion.h \
|
||||
GSXML.h \
|
||||
behavior.h \
|
||||
Unicode.h \
|
||||
GCObject.h \
|
||||
|
||||
|
||||
#
|
||||
# Hack ... using the -DocumentationDirectory flag overrides the value
|
||||
# used by the make package, and puts our output in the documentation
|
||||
|
@ -132,6 +137,25 @@ Base_AGSDOC_FLAGS = \
|
|||
INLINE=inline;\
|
||||
}' -Up Base
|
||||
|
||||
BaseAdditions_AGSDOC_FLAGS = \
|
||||
-DocumentationDirectory ../Documentation/BaseAdditions \
|
||||
-HeaderDirectory ../Headers/gnustep/base \
|
||||
-Declared gnustep/base \
|
||||
-Standards YES \
|
||||
-ConstantsTemplate TypesAndConstants \
|
||||
-FunctionsTemplate Functions \
|
||||
-MacrosTemplate Functions \
|
||||
-TypedefsTemplate TypesAndConstants \
|
||||
-VariablesTemplate TypesAndConstants \
|
||||
-WordMap '{\
|
||||
FOUNDATION_EXPORT=extern;FOUNDATION_STATIC_INLINE="";\
|
||||
GS_GEOM_SCOPE=extern;GS_GEOM_ATTR="";\
|
||||
GS_EXPORT=extern;GS_DECLARE="";\
|
||||
GS_RANGE_SCOPE=extern;GS_RANGE_ATTR="";\
|
||||
GS_ZONE_SCOPE=extern;GS_ZONE_ATTR="";\
|
||||
INLINE=inline;\
|
||||
}' -Up BaseAdditions
|
||||
|
||||
# Use local version of autogsdoc in case it is not installed
|
||||
AUTOGSDOC=../Tools/obj/autogsdoc
|
||||
|
||||
|
@ -144,8 +168,12 @@ include $(GNUSTEP_MAKEFILES)/documentation.make
|
|||
#
|
||||
before-all:: ../Documentation/Base \
|
||||
../Documentation/Base/Functions.gsdoc \
|
||||
../Documentation/Base/TypesAndConstants.gsdoc
|
||||
../Documentation/Base/TypesAndConstants.gsdoc \
|
||||
../Documentation/BaseAdditions \
|
||||
../Documentation/BaseAdditions/Functions.gsdoc \
|
||||
../Documentation/BaseAdditions/TypesAndConstants.gsdoc
|
||||
cp ../Documentation/Base.gsdoc .
|
||||
cp ../Documentation/BaseAdditions.gsdoc .
|
||||
|
||||
../Documentation/Base:
|
||||
$(MKDIRS) ../Documentation/Base
|
||||
|
@ -153,13 +181,28 @@ before-all:: ../Documentation/Base \
|
|||
../Documentation/Base/Functions.gsdoc: ../Documentation/Functions.gsdoc
|
||||
cp ../Documentation/Functions.gsdoc ../Documentation/Base
|
||||
|
||||
../Documentation/Base/TypesAndConstants.gsdoc: ../Documentation/TypesAndConstants.gsdoc
|
||||
../Documentation/Base/TypesAndConstants.gsdoc: \
|
||||
../Documentation/TypesAndConstants.gsdoc
|
||||
cp ../Documentation/TypesAndConstants.gsdoc ../Documentation/Base
|
||||
|
||||
../Documentation/BaseAdditions:
|
||||
$(MKDIRS) ../Documentation/BaseAdditions
|
||||
|
||||
../Documentation/BaseAdditions/Functions.gsdoc: \
|
||||
../Documentation/Functions.gsdoc
|
||||
cp ../Documentation/Functions.gsdoc ../Documentation/BaseAdditions
|
||||
|
||||
../Documentation/BaseAdditions/TypesAndConstants.gsdoc: \
|
||||
../Documentation/TypesAndConstants.gsdoc
|
||||
cp ../Documentation/TypesAndConstants.gsdoc \
|
||||
../Documentation/BaseAdditions
|
||||
|
||||
#
|
||||
# Clean up temporary files used while generating documentation.
|
||||
#
|
||||
after-all::
|
||||
$(RM) Base.gsdoc
|
||||
$(RM) BaseAdditions.gsdoc
|
||||
rmdir Base
|
||||
rmdir BaseAdditions
|
||||
|
||||
|
|
Loading…
Reference in a new issue