Re: cvs: php4 /ext/standard basic_functions.c config.m4 php_standard.h sha1.c sha1.h

From: Date: Sun, 28 Jul 2002 20:05:11 +0000
Subject: Re: cvs: php4 /ext/standard basic_functions.c config.m4 php_standard.h sha1.c sha1.h
References: 1  Groups: php.cvs 
Request: Send a blank email to php-cvs+get-13022@lists.php.net to get a copy of this message
Shouldn't this be using streams instead of the macros? On Sun, Jul 28, 2002 at 07:18:09PM -0000, Stefan Esser wrote : > sesser Sun Jul 28 15:18:09 2002 EDT > > Added files: > /php4/ext/standard sha1.c sha1.h > > Modified files: > /php4/ext/standard basic_functions.c config.m4 php_standard.h > Log: > Added sha1, sha1_file functions. > > > > Index: php4/ext/standard/basic_functions.c > diff -u php4/ext/standard/basic_functions.c:1.487 php4/ext/standard/basic_functions.c:1.488 > --- php4/ext/standard/basic_functions.c:1.487 Thu Jul 25 07:22:20 2002 > +++ php4/ext/standard/basic_functions.c Sun Jul 28 15:18:08 2002 > @@ -17,7 +17,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: basic_functions.c,v 1.487 2002/07/25 11:22:20 derick Exp $ */ > +/* $Id: basic_functions.c,v 1.488 2002/07/28 19:18:08 sesser Exp $ */ > > #include "php.h" > #include "php_streams.h" > @@ -275,6 +275,8 @@ > PHP_FE(htmlentities, NULL) > PHP_FE(html_entity_decode, NULL) > PHP_FE(get_html_translation_table, NULL) > + PHP_FE(sha1, NULL) > + PHP_FE(sha1_file, NULL) > PHP_NAMED_FE(md5,php_if_md5, NULL) > PHP_NAMED_FE(md5_file,php_if_md5_file, NULL) > PHP_NAMED_FE(crc32,php_if_crc32, NULL) > Index: php4/ext/standard/config.m4 > diff -u php4/ext/standard/config.m4:1.37 php4/ext/standard/config.m4:1.38 > --- php4/ext/standard/config.m4:1.37 Mon Apr 8 14:43:35 2002 > +++ php4/ext/standard/config.m4 Sun Jul 28 15:18:08 2002 > @@ -1,4 +1,4 @@ > -dnl $Id: config.m4,v 1.37 2002/04/08 18:43:35 sniper Exp $ -*- sh -*- > +dnl $Id: config.m4,v 1.38 2002/07/28 19:18:08 sesser Exp $ -*- sh -*- > > divert(3)dnl > > @@ -239,6 +239,6 @@ > syslog.c type.c uniqid.c url.c url_scanner.c var.c versioning.c assert.c \ > strnatcmp.c levenshtein.c incomplete_class.c url_scanner_ex.c \ > ftp_fopen_wrapper.c http_fopen_wrapper.c php_fopen_wrapper.c credits.c \ > - var_unserializer.c ftok.c aggregation.c) > + var_unserializer.c ftok.c aggregation.c sha1.c ) > > PHP_ADD_MAKEFILE_FRAGMENT > Index: php4/ext/standard/php_standard.h > diff -u php4/ext/standard/php_standard.h:1.15 php4/ext/standard/php_standard.h:1.16 > --- php4/ext/standard/php_standard.h:1.15 Thu Feb 28 03:26:48 2002 > +++ php4/ext/standard/php_standard.h Sun Jul 28 15:18:08 2002 > @@ -16,7 +16,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: php_standard.h,v 1.15 2002/02/28 08:26:48 sebastian Exp $ */ > +/* $Id: php_standard.h,v 1.16 2002/07/28 19:18:08 sesser Exp $ */ > > #include "basic_functions.h" > #include "php_math.h" > @@ -27,6 +27,7 @@ > #include "reg.h" > #include "php_mail.h" > #include "md5.h" > +#include "sha1.h" > #include "html.h" > #include "exec.h" > #include "file.h" > > Index: php4/ext/standard/sha1.c > +++ php4/ext/standard/sha1.c > /* > +----------------------------------------------------------------------+ > | PHP Version 4 | > +----------------------------------------------------------------------+ > | Copyright (c) 1997-2002 The PHP Group | > +----------------------------------------------------------------------+ > | This source file is subject to version 2.02 of the PHP license, | > | that is bundled with this package in the file LICENSE, and is | > | available at through the world-wide-web at | > | http://www.php.net/license/2_02.txt. > | > | If you did not receive a copy of the PHP license and are unable to | > | obtain it through the world-wide-web, please send a note to | > | license@php.net so we can mail you a copy immediately. | > +----------------------------------------------------------------------+ > | Author: Stefan Esser <sesser@php.net> | > +----------------------------------------------------------------------+ > */ > > /* $Id: sha1.c,v 1.1 2002/07/28 19:18:08 sesser Exp $ */ > > #include <stdio.h> > #include "php.h" > > /* This code is heavily based on the PHP md5 implementation */ > > #include "sha1.h" > > PHPAPI void make_sha1_digest(char *sha1str, unsigned char *digest) > { > int i; > > for (i = 0; i < 20; i++) { > sprintf(sha1str, "%02x", digest[i]); > sha1str += 2; > } > > *sha1str = '\0'; > } > > /* {{{ proto string sha1(string str) > Calculate the sha1 hash of a string */ > PHP_FUNCTION(sha1) > { > zval **arg; > char sha1str[41]; > PHP_SHA1_CTX context; > unsigned char digest[20]; > > if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) { > WRONG_PARAM_COUNT; > } > convert_to_string_ex(arg); > > sha1str[0] = '\0'; > PHP_SHA1Init(&context); > PHP_SHA1Update(&context, Z_STRVAL_PP(arg), Z_STRLEN_PP(arg)); > PHP_SHA1Final(digest, &context); > make_sha1_digest(sha1str, digest); > RETVAL_STRING(sha1str, 1); > } > > /* }}} */ > > /* {{{ proto string sha1_file(string filename) > Calculate the sha1 hash of given filename */ > PHP_FUNCTION(sha1_file) > { > zval **arg; > char sha1str[41]; > unsigned char buf[1024]; > unsigned char digest[20]; > PHP_SHA1_CTX context; > int n; > FILE *fp; > > if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) { > WRONG_PARAM_COUNT; > } > > convert_to_string_ex(arg); > > if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_PP(arg), NULL, > CHECKUID_CHECK_FILE_AND_DIR))) { > RETURN_FALSE; > } > > if (php_check_open_basedir(Z_STRVAL_PP(arg) TSRMLS_CC)) { > RETURN_FALSE; > } > > if ((fp = VCWD_FOPEN(Z_STRVAL_PP(arg), "rb")) == NULL) { > php_error(E_WARNING, "md5_file(): Unable to open file"); > RETURN_FALSE; > } > > PHP_SHA1Init(&context); > > while ((n = fread(buf, 1, sizeof(buf), fp)) > 0) { > PHP_SHA1Update(&context, buf, n); > } > > PHP_SHA1Final(digest, &context); > > if (ferror(fp)) { > fclose(fp); > RETURN_FALSE; > } > > fclose(fp); > > make_sha1_digest(sha1str, digest); > > RETVAL_STRING(sha1str, 1); > } > /* }}} */ > > > static void SHA1Transform(php_uint32[5], const unsigned char[64]); > static void SHA1Encode(unsigned char *, php_uint32 *, unsigned int); > static void SHA1Decode(php_uint32 *, const unsigned char *, unsigned int); > > static unsigned char PADDING[64] = > { > 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 > }; > > /* F, G, H and I are basic SHA1 functions. > */ > #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) > #define G(x, y, z) ((x) ^ (y) ^ (z)) > #define H(x, y, z) (((x) & (y)) | ((z) & ((x) | (y)))) > #define I(x, y, z) ((x) ^ (y) ^ (z)) > > /* ROTATE_LEFT rotates x left n bits. > */ > #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) > > /* W[i] > */ > #define W(i) ( tmp=x[(i-3)&15]^x[(i-8)&15]^x[(i-14)&15]^x[i&15], \ > (x[i&15]=ROTATE_LEFT(tmp, 1)) ) > > /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. > */ > #define FF(a, b, c, d, e, w) { \ > (e) += F ((b), (c), (d)) + (w) + (php_uint32)(0x5A827999); \ > (e) += ROTATE_LEFT ((a), 5); \ > (b) = ROTATE_LEFT((b), 30); \ > } > #define GG(a, b, c, d, e, w) { \ > (e) += G ((b), (c), (d)) + (w) + (php_uint32)(0x6ED9EBA1); \ > (e) += ROTATE_LEFT ((a), 5); \ > (b) = ROTATE_LEFT((b), 30); \ > } > #define HH(a, b, c, d, e, w) { \ > (e) += H ((b), (c), (d)) + (w) + (php_uint32)(0x8F1BBCDC); \ > (e) += ROTATE_LEFT ((a), 5); \ > (b) = ROTATE_LEFT((b), 30); \ > } > #define II(a, b, c, d, e, w) { \ > (e) += I ((b), (c), (d)) + (w) + (php_uint32)(0xCA62C1D6); \ > (e) += ROTATE_LEFT ((a), 5); \ > (b) = ROTATE_LEFT((b), 30); \ > } > > > /* {{{ PHP_SHA1Init > * SHA1 initialization. Begins an SHA1 operation, writing a new context. > */ > PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX * context) > { > context->count[0] = context->count[1] = 0; > /* Load magic initialization constants. > */ > context->state[0] = 0x67452301; > context->state[1] = 0xefcdab89; > context->state[2] = 0x98badcfe; > context->state[3] = 0x10325476; > context->state[4] = 0xc3d2e1f0; > } > /* }}} */ > > /* {{{ PHP_SHA1Update > SHA1 block update operation. Continues an SHA1 message-digest > operation, processing another message block, and updating the > context. > */ > PHPAPI void PHP_SHA1Update(PHP_SHA1_CTX * context, const unsigned char *input, > unsigned int inputLen) > { > unsigned int i, index, partLen; > > /* Compute number of bytes mod 64 */ > index = (unsigned int) ((context->count[0] >> 3) & 0x3F); > > /* Update number of bits */ > if ((context->count[0] += ((php_uint32) inputLen << 3)) > < ((php_uint32) inputLen << 3)) > context->count[1]++; > context->count[1] += ((php_uint32) inputLen >> 29); > > partLen = 64 - index; > > /* Transform as many times as possible. > */ > if (inputLen >= partLen) { > memcpy > ((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen); > SHA1Transform(context->state, context->buffer); > > for (i = partLen; i + 63 < inputLen; i += 64) > SHA1Transform(context->state, &input[i]); > > index = 0; > } else > i = 0; > > /* Buffer remaining input */ > memcpy > ((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], > inputLen - i); > } > /* }}} */ > > /* {{{ PHP_SHA1Final > SHA1 finalization. Ends an SHA1 message-digest operation, writing the > the message digest and zeroizing the context. > */ > PHPAPI void PHP_SHA1Final(unsigned char digest[20], PHP_SHA1_CTX * context) > { > unsigned char bits[8]; > unsigned int index, padLen; > > /* Save number of bits */ > bits[7] = context->count[0] & 0xFF; > bits[6] = (context->count[0] >> 8) & 0xFF; > bits[5] = (context->count[0] >> 16) & 0xFF; > bits[4] = (context->count[0] >> 24) & 0xFF; > bits[3] = context->count[1] & 0xFF; > bits[2] = (context->count[1] >> 8) & 0xFF; > bits[1] = (context->count[1] >> 16) & 0xFF; > bits[0] = (context->count[1] >> 24) & 0xFF; > > /* Pad out to 56 mod 64. > */ > index = (unsigned int) ((context->count[0] >> 3) & 0x3f); > padLen = (index < 56) ? (56 - index) : (120 - index); > PHP_SHA1Update(context, PADDING, padLen); > > /* Append length (before padding) */ > PHP_SHA1Update(context, bits, 8); > > /* Store state in digest */ > SHA1Encode(digest, context->state, 20); > > /* Zeroize sensitive information. > */ > memset((unsigned char*) context, 0, sizeof(*context)); > } > /* }}} */ > > /* {{{ SHA1Transform > * SHA1 basic transformation. Transforms state based on block. > */ > static void SHA1Transform(state, block) > php_uint32 state[5]; > const unsigned char block[64]; > { > php_uint32 a = state[0], b = state[1], c = state[2]; > php_uint32 d = state[3], e = state[4], x[16], tmp; > > SHA1Decode(x, block, 64); > > /* Round 1 */ > FF(a, b, c, d, e, x[0]); /* 1 */ > FF(e, a, b, c, d, x[1]); /* 2 */ > FF(d, e, a, b, c, x[2]); /* 3 */ > FF(c, d, e, a, b, x[3]); /* 4 */ > FF(b, c, d, e, a, x[4]); /* 5 */ > FF(a, b, c, d, e, x[5]); /* 6 */ > FF(e, a, b, c, d, x[6]); /* 7 */ > FF(d, e, a, b, c, x[7]); /* 8 */ > FF(c, d, e, a, b, x[8]); /* 9 */ > FF(b, c, d, e, a, x[9]); /* 10 */ > FF(a, b, c, d, e, x[10]); /* 11 */ > FF(e, a, b, c, d, x[11]); /* 12 */ > FF(d, e, a, b, c, x[12]); /* 13 */ > FF(c, d, e, a, b, x[13]); /* 14 */ > FF(b, c, d, e, a, x[14]); /* 15 */ > FF(a, b, c, d, e, x[15]); /* 16 */ > FF(e, a, b, c, d, W(16)); /* 17 */ > FF(d, e, a, b, c, W(17)); /* 18 */ > FF(c, d, e, a, b, W(18)); /* 19 */ > FF(b, c, d, e, a, W(19)); /* 20 */ > > /* Round 2 */ > GG(a, b, c, d, e, W(20)); /* 21 */ > GG(e, a, b, c, d, W(21)); /* 22 */ > GG(d, e, a, b, c, W(22)); /* 23 */ > GG(c, d, e, a, b, W(23)); /* 24 */ > GG(b, c, d, e, a, W(24)); /* 25 */ > GG(a, b, c, d, e, W(25)); /* 26 */ > GG(e, a, b, c, d, W(26)); /* 27 */ > GG(d, e, a, b, c, W(27)); /* 28 */ > GG(c, d, e, a, b, W(28)); /* 29 */ > GG(b, c, d, e, a, W(29)); /* 30 */ > GG(a, b, c, d, e, W(30)); /* 31 */ > GG(e, a, b, c, d, W(31)); /* 32 */ > GG(d, e, a, b, c, W(32)); /* 33 */ > GG(c, d, e, a, b, W(33)); /* 34 */ > GG(b, c, d, e, a, W(34)); /* 35 */ > GG(a, b, c, d, e, W(35)); /* 36 */ > GG(e, a, b, c, d, W(36)); /* 37 */ > GG(d, e, a, b, c, W(37)); /* 38 */ > GG(c, d, e, a, b, W(38)); /* 39 */ > GG(b, c, d, e, a, W(39)); /* 40 */ > > /* Round 3 */ > HH(a, b, c, d, e, W(40)); /* 41 */ > HH(e, a, b, c, d, W(41)); /* 42 */ > HH(d, e, a, b, c, W(42)); /* 43 */ > HH(c, d, e, a, b, W(43)); /* 44 */ > HH(b, c, d, e, a, W(44)); /* 45 */ > HH(a, b, c, d, e, W(45)); /* 46 */ > HH(e, a, b, c, d, W(46)); /* 47 */ > HH(d, e, a, b, c, W(47)); /* 48 */ > HH(c, d, e, a, b, W(48)); /* 49 */ > HH(b, c, d, e, a, W(49)); /* 50 */ > HH(a, b, c, d, e, W(50)); /* 51 */ > HH(e, a, b, c, d, W(51)); /* 52 */ > HH(d, e, a, b, c, W(52)); /* 53 */ > HH(c, d, e, a, b, W(53)); /* 54 */ > HH(b, c, d, e, a, W(54)); /* 55 */ > HH(a, b, c, d, e, W(55)); /* 56 */ > HH(e, a, b, c, d, W(56)); /* 57 */ > HH(d, e, a, b, c, W(57)); /* 58 */ > HH(c, d, e, a, b, W(58)); /* 59 */ > HH(b, c, d, e, a, W(59)); /* 60 */ > > /* Round 4 */ > II(a, b, c, d, e, W(60)); /* 61 */ > II(e, a, b, c, d, W(61)); /* 62 */ > II(d, e, a, b, c, W(62)); /* 63 */ > II(c, d, e, a, b, W(63)); /* 64 */ > II(b, c, d, e, a, W(64)); /* 65 */ > II(a, b, c, d, e, W(65)); /* 66 */ > II(e, a, b, c, d, W(66)); /* 67 */ > II(d, e, a, b, c, W(67)); /* 68 */ > II(c, d, e, a, b, W(68)); /* 69 */ > II(b, c, d, e, a, W(69)); /* 70 */ > II(a, b, c, d, e, W(70)); /* 71 */ > II(e, a, b, c, d, W(71)); /* 72 */ > II(d, e, a, b, c, W(72)); /* 73 */ > II(c, d, e, a, b, W(73)); /* 74 */ > II(b, c, d, e, a, W(74)); /* 75 */ > II(a, b, c, d, e, W(75)); /* 76 */ > II(e, a, b, c, d, W(76)); /* 77 */ > II(d, e, a, b, c, W(77)); /* 78 */ > II(c, d, e, a, b, W(78)); /* 79 */ > II(b, c, d, e, a, W(79)); /* 80 */ > > state[0] += a; > state[1] += b; > state[2] += c; > state[3] += d; > state[4] += e; > > /* Zeroize sensitive information. */ > memset((unsigned char*) x, 0, sizeof(x)); > } > /* }}} */ > > /* {{{ SHA1Encode > Encodes input (php_uint32) into output (unsigned char). Assumes len is > a multiple of 4. > */ > static void SHA1Encode(output, input, len) > unsigned char *output; > php_uint32 *input; > unsigned int len; > { > unsigned int i, j; > > for (i = 0, j = 0; j < len; i++, j += 4) { > output[j] = (unsigned char) ((input[i] >> 24) & 0xff); > output[j + 1] = (unsigned char) ((input[i] >> 16) & 0xff); > output[j + 2] = (unsigned char) ((input[i] >> 8) & 0xff); > output[j + 3] = (unsigned char) (input[i] & 0xff); > } > } > /* }}} */ > > /* {{{ SHA1Decode > Decodes input (unsigned char) into output (php_uint32). Assumes len is > a multiple of 4. > */ > static void SHA1Decode(output, input, len) > php_uint32 *output; > const unsigned char *input; > unsigned int len; > { > unsigned int i, j; > > for (i = 0, j = 0; j < len; i++, j += 4) > output[i] = ((php_uint32) input[j + 3]) | (((php_uint32) input[j + 2]) << 8) | > (((php_uint32) input[j + 1]) << 16) | (((php_uint32) input[j]) << 24); > } > /* }}} */ > > /* > * Local variables: > * tab-width: 4 > * c-basic-offset: 4 > * End: > * vim600: sw=4 ts=4 fdm=marker > * vim<600: sw=4 ts=4 > */ > > Index: php4/ext/standard/sha1.h > +++ php4/ext/standard/sha1.h > /* > +----------------------------------------------------------------------+ > | PHP Version 4 | > +----------------------------------------------------------------------+ > | Copyright (c) 1997-2002 The PHP Group | > +----------------------------------------------------------------------+ > | This source file is subject to version 2.02 of the PHP license, | > | that is bundled with this package in the file LICENSE, and is | > | available at through the world-wide-web at | > | http://www.php.net/license/2_02.txt. > | > | If you did not receive a copy of the PHP license and are unable to | > | obtain it through the world-wide-web, please send a note to | > | license@php.net so we can mail you a copy immediately. | > +----------------------------------------------------------------------+ > | Author: Stefan Esser <sesser@php.net> | > +----------------------------------------------------------------------+ > */ > > /* $Id: sha1.h,v 1.1 2002/07/28 19:18:08 sesser Exp $ */ > > #ifndef SHA1_H > #define SHA1_H > > #include "ext/standard/basic_functions.h" > > /* SHA1 context. */ > typedef struct { > php_uint32 state[5]; /* state (ABCD) */ > php_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ > unsigned char buffer[64]; /* input buffer */ > } PHP_SHA1_CTX; > > PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX *); > PHPAPI void PHP_SHA1Update(PHP_SHA1_CTX *, const unsigned char *, unsigned int); > PHPAPI void PHP_SHA1Final(unsigned char[20], PHP_SHA1_CTX *); > > PHP_FUNCTION(sha1); > PHP_FUNCTION(sha1_file); > > #endif > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php -- GnuPG Key: http://guru.josefine.at/~mfischer/C2272BD0.asc Did I help you? http://guru.josefine.at/wish_en Konnte ich helfen? http://guru.josefine.at/wish_de "Adding is_deleted() would be the first is_*() function in PHP that I know of that checks if something *is not* something. Really bad." - SB

« previous php.cvs (#13022) next »