Annotation of embedaddon/php/ext/hash/hash_snefru.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_snefru.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #include "php_hash.h"
        !            23: #include "php_hash_snefru.h"
        !            24: #include "php_hash_snefru_tables.h"
        !            25: 
        !            26: #define round(L, C, N, SB)     \
        !            27:        SBE = SB[C & 0xff]; \
        !            28:        L ^= SBE; \
        !            29:        N ^= SBE
        !            30: 
        !            31: #ifndef DBG_SNEFRU
        !            32: #define DBG_SNEFRU 0
        !            33: #endif
        !            34: 
        !            35: #if DBG_SNEFRU
        !            36: void ph(php_hash_uint32 h[16])
        !            37: {
        !            38:        int i;
        !            39:        for (i = 0; i < 16; i++)
        !            40:                printf ("%08lx", h[i]); printf("\n");
        !            41: }
        !            42: #endif
        !            43: 
        !            44: static inline void Snefru(php_hash_uint32 input[16])
        !            45: {
        !            46:        static int shifts[4] = {16, 8, 16, 24};
        !            47:        int b, index, rshift, lshift;
        !            48:        const php_hash_uint32 *t0,*t1;
        !            49:        php_hash_uint32 SBE,B00,B01,B02,B03,B04,B05,B06,B07,B08,B09,B10,B11,B12,B13,B14,B15;
        !            50: 
        !            51:        B00 = input[0];
        !            52:        B01 = input[1];
        !            53:        B02 = input[2];
        !            54:        B03 = input[3];
        !            55:        B04 = input[4];
        !            56:        B05 = input[5];
        !            57:        B06 = input[6];
        !            58:        B07 = input[7];
        !            59:        B08 = input[8];
        !            60:        B09 = input[9];
        !            61:        B10 = input[10];
        !            62:        B11 = input[11];
        !            63:        B12 = input[12];
        !            64:        B13 = input[13];
        !            65:        B14 = input[14];
        !            66:        B15 = input[15];
        !            67: 
        !            68:        for (index = 0; index < 8; index++) {
        !            69:                t0 = tables[2*index+0];
        !            70:                t1 = tables[2*index+1];
        !            71:                for (b = 0; b < 4; b++) {
        !            72:                        round(B15, B00, B01, t0);
        !            73:                        round(B00, B01, B02, t0);
        !            74:                        round(B01, B02, B03, t1);
        !            75:                        round(B02, B03, B04, t1);
        !            76:                        round(B03, B04, B05, t0);
        !            77:                        round(B04, B05, B06, t0);
        !            78:                        round(B05, B06, B07, t1);
        !            79:                        round(B06, B07, B08, t1);
        !            80:                        round(B07, B08, B09, t0);
        !            81:                        round(B08, B09, B10, t0);
        !            82:                        round(B09, B10, B11, t1);
        !            83:                        round(B10, B11, B12, t1);
        !            84:                        round(B11, B12, B13, t0);
        !            85:                        round(B12, B13, B14, t0);
        !            86:                        round(B13, B14, B15, t1);
        !            87:                        round(B14, B15, B00, t1);
        !            88:                        
        !            89:                        rshift = shifts[b]; 
        !            90:                        lshift = 32-rshift;
        !            91:                        
        !            92:                        B00 = (B00 >> rshift) | (B00 << lshift);
        !            93:                        B01 = (B01 >> rshift) | (B01 << lshift);
        !            94:                        B02 = (B02 >> rshift) | (B02 << lshift);
        !            95:                        B03 = (B03 >> rshift) | (B03 << lshift);
        !            96:                        B04 = (B04 >> rshift) | (B04 << lshift);
        !            97:                        B05 = (B05 >> rshift) | (B05 << lshift);
        !            98:                        B06 = (B06 >> rshift) | (B06 << lshift);
        !            99:                        B07 = (B07 >> rshift) | (B07 << lshift);
        !           100:                        B08 = (B08 >> rshift) | (B08 << lshift);
        !           101:                        B09 = (B09 >> rshift) | (B09 << lshift);
        !           102:                        B10 = (B10 >> rshift) | (B10 << lshift);
        !           103:                        B11 = (B11 >> rshift) | (B11 << lshift);
        !           104:                        B12 = (B12 >> rshift) | (B12 << lshift);
        !           105:                        B13 = (B13 >> rshift) | (B13 << lshift);
        !           106:                        B14 = (B14 >> rshift) | (B14 << lshift);
        !           107:                        B15 = (B15 >> rshift) | (B15 << lshift);
        !           108:                }
        !           109:        }
        !           110:        input[0] ^= B15;
        !           111:        input[1] ^= B14;
        !           112:        input[2] ^= B13;
        !           113:        input[3] ^= B12;
        !           114:        input[4] ^= B11;
        !           115:        input[5] ^= B10;
        !           116:        input[6] ^= B09;
        !           117:        input[7] ^= B08;
        !           118: #if DBG_SNEFRU
        !           119:        ph(input);
        !           120: #endif
        !           121: }
        !           122: 
        !           123: static inline void SnefruTransform(PHP_SNEFRU_CTX *context, const unsigned char input[32])
        !           124: {
        !           125:        int i, j;
        !           126: 
        !           127:        for (i = 0, j = 0; i < 32; i += 4, ++j) {
        !           128:                context->state[8+j] =   ((input[i] & 0xff) << 24) | ((input[i+1] & 0xff) << 16) |
        !           129:                                                                ((input[i+2] & 0xff) << 8) | (input[i+3] & 0xff);
        !           130:        }
        !           131:        Snefru(context->state);
        !           132:        memset(&context->state[8], 0, sizeof(php_hash_uint32) * 8);
        !           133: }
        !           134: 
        !           135: PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context)
        !           136: {
        !           137:        memset(context, 0, sizeof(*context));
        !           138: }
        !           139: 
        !           140: static const php_hash_uint32 MAX32 = 0xffffffffLU;
        !           141: 
        !           142: PHP_HASH_API void PHP_SNEFRUUpdate(PHP_SNEFRU_CTX *context, const unsigned char *input, size_t len)
        !           143: {
        !           144:        if ((MAX32 - context->count[1]) < (len * 8)) {
        !           145:                context->count[0]++;
        !           146:                context->count[1] = MAX32 - context->count[1];
        !           147:                context->count[1] = (len * 8) - context->count[1];
        !           148:        } else {
        !           149:                context->count[1] += len * 8;
        !           150:        }
        !           151:        
        !           152:        if (context->length + len < 32) {
        !           153:                memcpy(&context->buffer[context->length], input, len);
        !           154:                context->length += len;
        !           155:        } else {
        !           156:                size_t i = 0, r = (context->length + len) % 32;
        !           157:                
        !           158:                if (context->length) {
        !           159:                        i = 32 - context->length;
        !           160:                        memcpy(&context->buffer[context->length], input, i);
        !           161:                        SnefruTransform(context, context->buffer);
        !           162:                }
        !           163:                
        !           164:                for (; i + 32 <= len; i += 32) {
        !           165:                        SnefruTransform(context, input + i);
        !           166:                }
        !           167:                
        !           168:                memcpy(context->buffer, input + i, r);
        !           169:                memset(&context->buffer[r], 0, 32 - r);
        !           170:                context->length = r;
        !           171:        }
        !           172: }
        !           173: 
        !           174: PHP_HASH_API void PHP_SNEFRUFinal(unsigned char digest[32], PHP_SNEFRU_CTX *context)
        !           175: {
        !           176:        php_hash_uint32 i, j;
        !           177:        
        !           178:        if (context->length) {
        !           179:                SnefruTransform(context, context->buffer);
        !           180:        }
        !           181:        
        !           182:        context->state[14] = context->count[0];
        !           183:        context->state[15] = context->count[1];
        !           184:        Snefru(context->state);
        !           185:        
        !           186:        for (i = 0, j = 0; j < 32; i++, j += 4) {
        !           187:                digest[j] = (unsigned char) ((context->state[i] >> 24) & 0xff);
        !           188:                digest[j + 1] = (unsigned char) ((context->state[i] >> 16) & 0xff);
        !           189:                digest[j + 2] = (unsigned char) ((context->state[i] >> 8) & 0xff);
        !           190:                digest[j + 3] = (unsigned char) (context->state[i] & 0xff);
        !           191:        }
        !           192:        
        !           193:        memset(context, 0, sizeof(*context));
        !           194: }
        !           195: 
        !           196: const php_hash_ops php_hash_snefru_ops = {
        !           197:        (php_hash_init_func_t) PHP_SNEFRUInit,
        !           198:        (php_hash_update_func_t) PHP_SNEFRUUpdate,
        !           199:        (php_hash_final_func_t) PHP_SNEFRUFinal,
        !           200:        (php_hash_copy_func_t) php_hash_copy,
        !           201:        32,
        !           202:        32,
        !           203:        sizeof(PHP_SNEFRU_CTX)
        !           204: };
        !           205: 
        !           206: /*
        !           207:  * Local variables:
        !           208:  * tab-width: 4
        !           209:  * c-basic-offset: 4
        !           210:  * End:
        !           211:  * vim600: sw=4 ts=4 fdm=marker
        !           212:  * vim<600: sw=4 ts=4
        !           213:  */

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