Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

#include <stdio.h>
#include <stdlib.h>

#include "mhmt-types.h"
#include "mhmt-hash.h"

// allocate mem for hash (length) and build it from data
// length must be at least 3 bytes, since hash[0] and hash[1] are not valid hashes
UBYTE * build_hash(UBYTE * data, ULONG length, ULONG prebin_len)
{
        UBYTE * hash;

        ULONG i; UBYTE *src,*dst;
        UBYTE curr,prev,prev2;

        if( !length )
                return NULL;

        hash=(UBYTE *)malloc( length+prebin_len );
        if( !hash )
                return NULL;


        prev=curr=0;
        i=length+prebin_len;
        src = data-prebin_len;
        dst = hash;

        do
        {
                prev2 = (UBYTE)( (prev>>1) | (prev<<7) );
                prev  = (UBYTE)( (curr>>1) | (curr<<7) );
                curr  = *(src++);

                *(dst++) = curr^prev^prev2;

        } while( --i );



        return hash+prebin_len; // negative indices must be used to access prebin hashes
}



// free hash
void destroy_hash(UBYTE * hash, ULONG prebin_len)
{
        if( hash ) free(hash-prebin_len);
}