Annotation of embedaddon/php/ext/hash/hash_tiger.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   +----------------------------------------------------------------------+
        !             3:   | PHP Version 5                                                        |
        !             4:   +----------------------------------------------------------------------+
        !             5:   | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:   +----------------------------------------------------------------------+
        !             7:   | This source file is subject to version 3.01 of the PHP license,      |
        !             8:   | that is bundled with this package in the file LICENSE, and is        |
        !             9:   | available through the world-wide-web at the following url:           |
        !            10:   | http://www.php.net/license/3_01.txt                                  |
        !            11:   | If you did not receive a copy of the PHP license and are unable to   |
        !            12:   | obtain it through the world-wide-web, please send a note to          |
        !            13:   | license@php.net so we can mail you a copy immediately.               |
        !            14:   +----------------------------------------------------------------------+
        !            15:   | Authors: Michael Wallner <mike@php.net>                              |
        !            16:   |          Sara Golemon <pollita@php.net>                              |
        !            17:   +----------------------------------------------------------------------+
        !            18: */
        !            19: 
        !            20: /* $Id: hash_tiger.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #include "php_hash.h"
        !            23: #include "php_hash_tiger.h"
        !            24: #include "php_hash_tiger_tables.h"
        !            25: 
        !            26: #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
        !            27: # if defined(__LITTLE_ENDIAN__)
        !            28: #  undef WORDS_BIGENDIAN
        !            29: # else 
        !            30: #  if defined(__BIG_ENDIAN__)
        !            31: #   define WORDS_BIGENDIAN
        !            32: #  endif
        !            33: # endif
        !            34: #endif
        !            35: 
        !            36: /* {{{ */
        !            37: #define save_abc \
        !            38:        aa = a; \
        !            39:        bb = b; \
        !            40:        cc = c;
        !            41: 
        !            42: #define round(a,b,c,x,mul) \
        !            43:        c ^= x; \
        !            44:        a -= t1[(unsigned char)(c)] ^ \
        !            45:                t2[(unsigned char)(((php_hash_uint32)(c))>>(2*8))] ^ \
        !            46:                t3[(unsigned char)((c)>>(4*8))] ^ \
        !            47:                t4[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(2*8))] ; \
        !            48:        b += t4[(unsigned char)(((php_hash_uint32)(c))>>(1*8))] ^ \
        !            49:                t3[(unsigned char)(((php_hash_uint32)(c))>>(3*8))] ^ \
        !            50:                t2[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(1*8))] ^ \
        !            51:                t1[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(3*8))]; \
        !            52:        b *= mul;
        !            53: 
        !            54: #define pass(a,b,c,mul) \
        !            55:        round(a,b,c,x0,mul) \
        !            56:        round(b,c,a,x1,mul) \
        !            57:        round(c,a,b,x2,mul) \
        !            58:        round(a,b,c,x3,mul) \
        !            59:        round(b,c,a,x4,mul) \
        !            60:        round(c,a,b,x5,mul) \
        !            61:        round(a,b,c,x6,mul) \
        !            62:        round(b,c,a,x7,mul)
        !            63: 
        !            64: #define key_schedule \
        !            65:        x0 -= x7 ^ L64(0xA5A5A5A5A5A5A5A5); \
        !            66:        x1 ^= x0; \
        !            67:        x2 += x1; \
        !            68:        x3 -= x2 ^ ((~x1)<<19); \
        !            69:        x4 ^= x3; \
        !            70:        x5 += x4; \
        !            71:        x6 -= x5 ^ ((~x4)>>23); \
        !            72:        x7 ^= x6; \
        !            73:        x0 += x7; \
        !            74:        x1 -= x0 ^ ((~x7)<<19); \
        !            75:        x2 ^= x1; \
        !            76:        x3 += x2; \
        !            77:        x4 -= x3 ^ ((~x2)>>23); \
        !            78:        x5 ^= x4; \
        !            79:        x6 += x5; \
        !            80:        x7 -= x6 ^ L64(0x0123456789ABCDEF);
        !            81: 
        !            82: #define feedforward \
        !            83:        a ^= aa; \
        !            84:        b -= bb; \
        !            85:        c += cc;
        !            86: 
        !            87: #define compress(passes) \
        !            88:        save_abc \
        !            89:        pass(a,b,c,5) \
        !            90:        key_schedule \
        !            91:        pass(c,a,b,7) \
        !            92:        key_schedule \
        !            93:        pass(b,c,a,9) \
        !            94:        for(pass_no=0; pass_no<passes; pass_no++) { \
        !            95:                key_schedule \
        !            96:                pass(a,b,c,9) \
        !            97:                tmpa=a; a=c; c=b; b=tmpa; \
        !            98:        } \
        !            99:        feedforward
        !           100: 
        !           101: #define split_ex(str) \
        !           102:        x0=str[0]; x1=str[1]; x2=str[2]; x3=str[3]; \
        !           103:        x4=str[4]; x5=str[5]; x6=str[6]; x7=str[7];
        !           104: #ifdef WORDS_BIGENDIAN
        !           105: #      define split(str) \
        !           106:        { \
        !           107:                int i; \
        !           108:                php_hash_uint64 tmp[8]; \
        !           109:                 \
        !           110:                for (i = 0; i < 64; ++i) { \
        !           111:                        ((unsigned char *) tmp)[i^7] = ((unsigned char *) str)[i]; \
        !           112:                } \
        !           113:                split_ex(tmp); \
        !           114:        }
        !           115: #else
        !           116: #      define split split_ex
        !           117: #endif
        !           118: 
        !           119: #define tiger_compress(passes, str, state) \
        !           120: { \
        !           121:        register php_hash_uint64 a, b, c, tmpa, x0, x1, x2, x3, x4, x5, x6, x7; \
        !           122:        php_hash_uint64 aa, bb, cc; \
        !           123:        int pass_no; \
        !           124:        \
        !           125:        a = state[0]; \
        !           126:        b = state[1]; \
        !           127:        c = state[2]; \
        !           128:        \
        !           129:        split(str); \
        !           130:        \
        !           131:        compress(passes); \
        !           132:        \
        !           133:        state[0] = a; \
        !           134:        state[1] = b; \
        !           135:        state[2] = c; \
        !           136: }
        !           137: /* }}} */
        !           138: 
        !           139: static inline void TigerFinalize(PHP_TIGER_CTX *context)
        !           140: {
        !           141:        context->passed += (php_hash_uint64) context->length << 3;
        !           142:        
        !           143:        context->buffer[context->length++] = 0x1;
        !           144:        if (context->length % 8) {
        !           145:                memset(&context->buffer[context->length], 0, 8-context->length%8);
        !           146:                context->length += 8-context->length%8;
        !           147:        }
        !           148:        
        !           149:        if (context->length > 56) {
        !           150:                memset(&context->buffer[context->length], 0, 64 - context->length);
        !           151:                tiger_compress(context->passes, ((php_hash_uint64 *) context->buffer), context->state);
        !           152:                memset(context->buffer, 0, 56);
        !           153:        } else {
        !           154:                memset(&context->buffer[context->length], 0, 56 - context->length);
        !           155:        }
        !           156: 
        !           157: #ifndef WORDS_BIGENDIAN        
        !           158:        memcpy(&context->buffer[56], &context->passed, sizeof(php_hash_uint64));
        !           159: #else
        !           160:        context->buffer[56] = (unsigned char) (context->passed & 0xff);
        !           161:        context->buffer[57] = (unsigned char) ((context->passed >> 8) & 0xff);
        !           162:        context->buffer[58] = (unsigned char) ((context->passed >> 16) & 0xff);
        !           163:        context->buffer[59] = (unsigned char) ((context->passed >> 24) & 0xff);
        !           164:        context->buffer[60] = (unsigned char) ((context->passed >> 32) & 0xff);
        !           165:        context->buffer[61] = (unsigned char) ((context->passed >> 40) & 0xff);
        !           166:        context->buffer[62] = (unsigned char) ((context->passed >> 48) & 0xff);
        !           167:        context->buffer[63] = (unsigned char) ((context->passed >> 56) & 0xff);
        !           168: #endif
        !           169:        tiger_compress(context->passes, ((php_hash_uint64 *) context->buffer), context->state);
        !           170: }
        !           171: 
        !           172: PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context)
        !           173: {
        !           174:        memset(context, 0, sizeof(*context));
        !           175:        context->state[0] = L64(0x0123456789ABCDEF);
        !           176:        context->state[1] = L64(0xFEDCBA9876543210);
        !           177:        context->state[2] = L64(0xF096A5B4C3B2E187);
        !           178: }
        !           179: 
        !           180: PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context)
        !           181: {
        !           182:        memset(context, 0, sizeof(*context));
        !           183:        context->passes = 1;
        !           184:        context->state[0] = L64(0x0123456789ABCDEF);
        !           185:        context->state[1] = L64(0xFEDCBA9876543210);
        !           186:        context->state[2] = L64(0xF096A5B4C3B2E187);
        !           187: }
        !           188: 
        !           189: PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len)
        !           190: {
        !           191:        if (context->length + len < 64) {
        !           192:                memcpy(&context->buffer[context->length], input, len);
        !           193:                context->length += len;
        !           194:        } else {
        !           195:                size_t i = 0, r = (context->length + len) % 64;
        !           196:                
        !           197:                if (context->length) {
        !           198:                        i = 64 - context->length;
        !           199:                        memcpy(&context->buffer[context->length], input, i);
        !           200:                        tiger_compress(context->passes, ((const php_hash_uint64 *) context->buffer), context->state);
        !           201:                        memset(context->buffer, 0, 64);
        !           202:                        context->passed += 512;
        !           203:                }
        !           204:                
        !           205:                for (; i + 64 <= len; i += 64) {
        !           206:                        memcpy(context->buffer, &input[i], 64);
        !           207:                        tiger_compress(context->passes, ((const php_hash_uint64 *) context->buffer), context->state);
        !           208:                        context->passed += 512;
        !           209:                }
        !           210:                memset(&context->buffer[r], 0, 64-r);
        !           211:                memcpy(context->buffer, &input[i], r);
        !           212:                context->length = r;
        !           213:        }
        !           214: }
        !           215: 
        !           216: PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context)
        !           217: {
        !           218:        TigerFinalize(context);
        !           219:        
        !           220:        digest[0] = (unsigned char) ((context->state[0] >> 56) & 0xff);
        !           221:        digest[1] = (unsigned char) ((context->state[0] >> 48) & 0xff);
        !           222:        digest[2] = (unsigned char) ((context->state[0] >> 40) & 0xff);
        !           223:        digest[3] = (unsigned char) ((context->state[0] >> 32) & 0xff);
        !           224:        digest[4] = (unsigned char) ((context->state[0] >> 24) & 0xff);
        !           225:        digest[5] = (unsigned char) ((context->state[0] >> 16) & 0xff);
        !           226:        digest[6] = (unsigned char) ((context->state[0] >> 8) & 0xff);
        !           227:        digest[7] = (unsigned char) (context->state[0] & 0xff);
        !           228:        digest[8] = (unsigned char) ((context->state[1] >> 56) & 0xff);
        !           229:        digest[9] = (unsigned char) ((context->state[1] >> 48) & 0xff);
        !           230:        digest[10] = (unsigned char) ((context->state[1] >> 40) & 0xff);
        !           231:        digest[11] = (unsigned char) ((context->state[1] >> 32) & 0xff);
        !           232:        digest[12] = (unsigned char) ((context->state[1] >> 24) & 0xff);
        !           233:        digest[13] = (unsigned char) ((context->state[1] >> 16) & 0xff);
        !           234:        digest[14] = (unsigned char) ((context->state[1] >> 8) & 0xff);
        !           235:        digest[15] = (unsigned char) (context->state[1] & 0xff);
        !           236:        
        !           237:        memset(context, 0, sizeof(*context));
        !           238: }
        !           239: 
        !           240: PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context)
        !           241: {
        !           242:        TigerFinalize(context);
        !           243:        
        !           244:        digest[0] = (unsigned char) ((context->state[0] >> 56) & 0xff);
        !           245:        digest[1] = (unsigned char) ((context->state[0] >> 48) & 0xff);
        !           246:        digest[2] = (unsigned char) ((context->state[0] >> 40) & 0xff);
        !           247:        digest[3] = (unsigned char) ((context->state[0] >> 32) & 0xff);
        !           248:        digest[4] = (unsigned char) ((context->state[0] >> 24) & 0xff);
        !           249:        digest[5] = (unsigned char) ((context->state[0] >> 16) & 0xff);
        !           250:        digest[6] = (unsigned char) ((context->state[0] >> 8) & 0xff);
        !           251:        digest[7] = (unsigned char) (context->state[0] & 0xff);
        !           252:        digest[8] = (unsigned char) ((context->state[1] >> 56) & 0xff);
        !           253:        digest[9] = (unsigned char) ((context->state[1] >> 48) & 0xff);
        !           254:        digest[10] = (unsigned char) ((context->state[1] >> 40) & 0xff);
        !           255:        digest[11] = (unsigned char) ((context->state[1] >> 32) & 0xff);
        !           256:        digest[12] = (unsigned char) ((context->state[1] >> 24) & 0xff);
        !           257:        digest[13] = (unsigned char) ((context->state[1] >> 16) & 0xff);
        !           258:        digest[14] = (unsigned char) ((context->state[1] >> 8) & 0xff);
        !           259:        digest[15] = (unsigned char) (context->state[1] & 0xff);
        !           260:        digest[16] = (unsigned char) ((context->state[2] >> 56) & 0xff);
        !           261:        digest[17] = (unsigned char) ((context->state[2] >> 48) & 0xff);
        !           262:        digest[18] = (unsigned char) ((context->state[2] >> 40) & 0xff);
        !           263:        digest[19] = (unsigned char) ((context->state[2] >> 32) & 0xff);
        !           264:        
        !           265:        memset(context, 0, sizeof(*context));
        !           266: }
        !           267: 
        !           268: PHP_HASH_API void PHP_TIGER192Final(unsigned char digest[24], PHP_TIGER_CTX *context)
        !           269: {
        !           270:        TigerFinalize(context);
        !           271:        
        !           272:        digest[0] = (unsigned char) ((context->state[0] >> 56) & 0xff);
        !           273:        digest[1] = (unsigned char) ((context->state[0] >> 48) & 0xff);
        !           274:        digest[2] = (unsigned char) ((context->state[0] >> 40) & 0xff);
        !           275:        digest[3] = (unsigned char) ((context->state[0] >> 32) & 0xff);
        !           276:        digest[4] = (unsigned char) ((context->state[0] >> 24) & 0xff);
        !           277:        digest[5] = (unsigned char) ((context->state[0] >> 16) & 0xff);
        !           278:        digest[6] = (unsigned char) ((context->state[0] >> 8) & 0xff);
        !           279:        digest[7] = (unsigned char) (context->state[0] & 0xff);
        !           280:        digest[8] = (unsigned char) ((context->state[1] >> 56) & 0xff);
        !           281:        digest[9] = (unsigned char) ((context->state[1] >> 48) & 0xff);
        !           282:        digest[10] = (unsigned char) ((context->state[1] >> 40) & 0xff);
        !           283:        digest[11] = (unsigned char) ((context->state[1] >> 32) & 0xff);
        !           284:        digest[12] = (unsigned char) ((context->state[1] >> 24) & 0xff);
        !           285:        digest[13] = (unsigned char) ((context->state[1] >> 16) & 0xff);
        !           286:        digest[14] = (unsigned char) ((context->state[1] >> 8) & 0xff);
        !           287:        digest[15] = (unsigned char) (context->state[1] & 0xff);
        !           288:        digest[16] = (unsigned char) ((context->state[2] >> 56) & 0xff);
        !           289:        digest[17] = (unsigned char) ((context->state[2] >> 48) & 0xff);
        !           290:        digest[18] = (unsigned char) ((context->state[2] >> 40) & 0xff);
        !           291:        digest[19] = (unsigned char) ((context->state[2] >> 32) & 0xff);
        !           292:        digest[20] = (unsigned char) ((context->state[2] >> 24) & 0xff);
        !           293:        digest[21] = (unsigned char) ((context->state[2] >> 16) & 0xff);
        !           294:        digest[22] = (unsigned char) ((context->state[2] >> 8) & 0xff);
        !           295:        digest[23] = (unsigned char) (context->state[2] & 0xff);
        !           296:        
        !           297:        memset(context, 0, sizeof(*context));
        !           298: }
        !           299: 
        !           300: #define PHP_HASH_TIGER_OPS(p, b) \
        !           301:        const php_hash_ops php_hash_##p##tiger##b##_ops = { \
        !           302:                (php_hash_init_func_t) PHP_##p##TIGERInit, \
        !           303:                (php_hash_update_func_t) PHP_TIGERUpdate, \
        !           304:                (php_hash_final_func_t) PHP_TIGER##b##Final, \
        !           305:                (php_hash_copy_func_t) php_hash_copy, \
        !           306:                b/8, \
        !           307:                64, \
        !           308:                sizeof(PHP_TIGER_CTX) \
        !           309:        }
        !           310: 
        !           311: PHP_HASH_TIGER_OPS(3, 128);
        !           312: PHP_HASH_TIGER_OPS(3, 160);
        !           313: PHP_HASH_TIGER_OPS(3, 192);
        !           314: PHP_HASH_TIGER_OPS(4, 128);
        !           315: PHP_HASH_TIGER_OPS(4, 160);
        !           316: PHP_HASH_TIGER_OPS(4, 192);
        !           317: 
        !           318: /*
        !           319:  * Local variables:
        !           320:  * tab-width: 4
        !           321:  * c-basic-offset: 4
        !           322:  * End:
        !           323:  * vim600: sw=4 ts=4 fdm=marker
        !           324:  * vim<600: sw=4 ts=4
        !           325:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>