scottmac Mon Jun 2 14:13:49 2008 UTC Modified files: /php-src/ext/hash hash.c hash_sha.c php_hash.h php_hash_sha.h /php-src/ext/hash/tests sha224.phpt Log: MFB: Add sha224 support.
http://cvs.php.net/viewvc.cgi/php-src/ext/hash/hash.c?r1=1.41&r2=1.42&diff_format=u Index: php-src/ext/hash/hash.c diff -u php-src/ext/hash/hash.c:1.41 php-src/ext/hash/hash.c:1.42 --- php-src/ext/hash/hash.c:1.41 Mon Apr 21 15:37:07 2008 +++ php-src/ext/hash/hash.c Mon Jun 2 14:13:49 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash.c,v 1.41 2008/04/21 15:37:07 tony2001 Exp $ */ +/* $Id: hash.c,v 1.42 2008/06/02 14:13:49 scottmac Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -745,6 +745,7 @@ php_hash_register_algo("md4", &php_hash_md4_ops); php_hash_register_algo("md5", &php_hash_md5_ops); php_hash_register_algo("sha1", &php_hash_sha1_ops); + php_hash_register_algo("sha224", &php_hash_sha224_ops); php_hash_register_algo("sha256", &php_hash_sha256_ops); php_hash_register_algo("sha384", &php_hash_sha384_ops); php_hash_register_algo("sha512", &php_hash_sha512_ops); http://cvs.php.net/viewvc.cgi/php-src/ext/hash/hash_sha.c?r1=1.17&r2=1.18&diff_format=u Index: php-src/ext/hash/hash_sha.c diff -u php-src/ext/hash/hash_sha.c:1.17 php-src/ext/hash/hash_sha.c:1.18 --- php-src/ext/hash/hash_sha.c:1.17 Mon Apr 21 15:37:07 2008 +++ php-src/ext/hash/hash_sha.c Mon Jun 2 14:13:49 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: hash_sha.c,v 1.17 2008/04/21 15:37:07 tony2001 Exp $ */ +/* $Id: hash_sha.c,v 1.18 2008/06/02 14:13:49 scottmac Exp $ */ #include "php_hash.h" #include "php_hash_sha.h" @@ -76,7 +76,7 @@ sizeof(PHP_SHA1_CTX) }; -/* sha256 */ +/* sha224/sha256 */ const php_hash_ops php_hash_sha256_ops = { (php_hash_init_func_t) PHP_SHA256Init, @@ -88,6 +88,16 @@ sizeof(PHP_SHA256_CTX) }; +const php_hash_ops php_hash_sha224_ops = { + (php_hash_init_func_t) PHP_SHA224Init, + (php_hash_update_func_t) PHP_SHA224Update, + (php_hash_final_func_t) PHP_SHA224Final, + (php_hash_copy_func_t) php_hash_copy, + 28, + 64, + sizeof(PHP_SHA224_CTX) +}; + #define ROTR32(b,x) ((x >> b) | (x << (32 - b))) #define ROTR64(b,x) ((x >> b) | (x << (64 - b))) #define SHR(b, x) (x >> b) @@ -175,6 +185,102 @@ } /* }}} */ +/* {{{ PHP_SHA224Init + * SHA224 initialization. Begins an SHA224 operation, writing a new context. + */ +PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX * context) +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. + */ + context->state[0] = 0xc1059ed8; + context->state[1] = 0x367cd507; + context->state[2] = 0x3070dd17; + context->state[3] = 0xf70e5939; + context->state[4] = 0xffc00b31; + context->state[5] = 0x68581511; + context->state[6] = 0x64f98fa7; + context->state[7] = 0xbefa4fa4; +} +/* }}} */ + +/* {{{ PHP_SHA224Update + SHA224 block update operation. Continues an SHA224 message-digest + operation, processing another message block, and updating the + context. + */ +PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_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_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) { + context->count[1]++; + } + context->count[1] += ((php_hash_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); + SHA256Transform(context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) { + SHA256Transform(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_SHA224Final + SHA224 finalization. Ends an SHA224 message-digest operation, writing the + the message digest and zeroizing the context. + */ +PHP_HASH_API void PHP_SHA224Final(unsigned char digest[28], PHP_SHA224_CTX * context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + bits[7] = (unsigned char) (context->count[0] & 0xFF); + bits[6] = (unsigned char) ((context->count[0] >> 8) & 0xFF); + bits[5] = (unsigned char) ((context->count[0] >> 16) & 0xFF); + bits[4] = (unsigned char) ((context->count[0] >> 24) & 0xFF); + bits[3] = (unsigned char) (context->count[1] & 0xFF); + bits[2] = (unsigned char) ((context->count[1] >> 8) & 0xFF); + bits[1] = (unsigned char) ((context->count[1] >> 16) & 0xFF); + bits[0] = (unsigned char) ((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_SHA224Update(context, PADDING, padLen); + + /* Append length (before padding) */ + PHP_SHA224Update(context, bits, 8); + + /* Store state in digest */ + SHAEncode32(digest, context->state, 28); + + /* Zeroize sensitive information. + */ + memset((unsigned char*) context, 0, sizeof(*context)); +} +/* }}} */ + /* {{{ PHP_SHA256Update SHA256 block update operation. Continues an SHA256 message-digest operation, processing another message block, and updating the @@ -544,10 +650,10 @@ /* }}} */ /* {{{ PHP_SHA512Final - SHA512 finalization. Ends an SHA384 message-digest operation, writing the + SHA512 finalization. Ends an SHA512 message-digest operation, writing the the message digest and zeroizing the context. */ -PHP_HASH_API void PHP_SHA512Final(unsigned char digest[48], PHP_SHA512_CTX * context) +PHP_HASH_API void PHP_SHA512Final(unsigned char digest[64], PHP_SHA512_CTX * context) { unsigned char bits[16]; unsigned int index, padLen; http://cvs.php.net/viewvc.cgi/php-src/ext/hash/php_hash.h?r1=1.26&r2=1.27&diff_format=u Index: php-src/ext/hash/php_hash.h diff -u php-src/ext/hash/php_hash.h:1.26 php-src/ext/hash/php_hash.h:1.27 --- php-src/ext/hash/php_hash.h:1.26 Mon Apr 21 15:37:07 2008 +++ php-src/ext/hash/php_hash.h Mon Jun 2 14:13:49 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash.h,v 1.26 2008/04/21 15:37:07 tony2001 Exp $ */ +/* $Id: php_hash.h,v 1.27 2008/06/02 14:13:49 scottmac Exp $ */ #ifndef PHP_HASH_H #define PHP_HASH_H @@ -62,6 +62,7 @@ extern const php_hash_ops php_hash_md4_ops; extern const php_hash_ops php_hash_md5_ops; extern const php_hash_ops php_hash_sha1_ops; +extern const php_hash_ops php_hash_sha224_ops; extern const php_hash_ops php_hash_sha256_ops; extern const php_hash_ops php_hash_sha384_ops; extern const php_hash_ops php_hash_sha512_ops; http://cvs.php.net/viewvc.cgi/php-src/ext/hash/php_hash_sha.h?r1=1.7&r2=1.8&diff_format=u Index: php-src/ext/hash/php_hash_sha.h diff -u php-src/ext/hash/php_hash_sha.h:1.7 php-src/ext/hash/php_hash_sha.h:1.8 --- php-src/ext/hash/php_hash_sha.h:1.7 Mon Dec 31 07:12:10 2007 +++ php-src/ext/hash/php_hash_sha.h Mon Jun 2 14:13:49 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_hash_sha.h,v 1.7 2007/12/31 07:12:10 sebastian Exp $ */ +/* $Id: php_hash_sha.h,v 1.8 2008/06/02 14:13:49 scottmac Exp $ */ #ifndef PHP_HASH_SHA_H #define PHP_HASH_SHA_H @@ -25,6 +25,17 @@ #include "ext/standard/sha1.h" #include "ext/standard/basic_functions.h" +/* SHA224 context. */ +typedef struct { + php_hash_uint32 state[8]; /* state */ + php_hash_uint32 count[2]; /* number of bits, modulo 2^64 */ + unsigned char buffer[64]; /* input buffer */ +} PHP_SHA224_CTX; + +PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX *); +PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX *, const unsigned char *, unsigned int); +PHP_HASH_API void PHP_SHA224Final(unsigned char[28], PHP_SHA224_CTX *); + /* SHA256 context. */ typedef struct { php_hash_uint32 state[8]; /* state */ http://cvs.php.net/viewvc.cgi/php-src/ext/hash/tests/sha224.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/hash/tests/sha224.phpt diff -u /dev/null php-src/ext/hash/tests/sha224.phpt:1.2 --- /dev/null Mon Jun 2 14:13:49 2008 +++ php-src/ext/hash/tests/sha224.phpt Mon Jun 2 14:13:49 2008 @@ -0,0 +1,22 @@ +--TEST-- +sha224 algorithm +--SKIPIF-- +<?php if(!extension_loaded("hash")) print "skip"; ?> +--FILE-- +<?php +echo hash('sha224', '') . "\n"; +echo hash('sha224', 'a') . "\n"; +echo hash('sha224', '012345678901234567890123456789012345678901234567890123456789') . "\n"; + +/* FIPS-180 Vectors */ +echo hash('sha224', 'abc') . "\n"; +echo hash('sha224', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n"; +echo hash('sha224', str_repeat('a', 1000000)) . "\n"; +--EXPECT-- +d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f +abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5 +ae5c0d27fe120752911c994718296a3bccc77000aac07b8810714932 +23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 +75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525 +20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67 +
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php