Beispiel #1
0
/* Zlib test */
int main(int argc, char **argv)
{
    unsigned long int ret, srcsize, dstsize = 2010;
    char dst[2048];
    char dst2[2048];

    memset(dst, 0, 2048);
    memset(dst2, 0, 2048);

    if (argc < 2) {
        printf("%s: string\n", argv[0]);
        exit(1);
    }

    srcsize = strlen(argv[1]);
    if (srcsize > 2000) {
        printf("%s: string too large\n", argv[0]);
        exit(1);

    }

    if ((ret = os_zlib_compress(argv[1], dst, srcsize, dstsize))) {
        printf("Compressed, from %lu->%lu\n", srcsize, ret);
    } else {
        printf("FAILED compressing.\n");
        exit(1);
    }

    /* Set new srcsize for decompression */
    srcsize = ret;

    if ((ret = os_zlib_uncompress(dst, dst2, srcsize, dstsize))) {
        printf("Uncompressed ok. String: '%s', size %lu->%lu\n",
               dst2, srcsize, ret);
    } else {
        printf("FAILED uncompressing.\n");
        exit(1);
    }

    return (0);
}
Beispiel #2
0
/* ReadSecMSG v0.2: 2005/02/10 */
char *ReadSecMSG(keystore *keys, char *buffer, char *cleartext,
                                 int id, unsigned int buffer_size)
{
    unsigned int msg_global = 0;
    unsigned int msg_local = 0;

    char *f_msg;


    if(*buffer == ':')
    {
         buffer++;
    }
    else
    {
        merror(ENCFORMAT_ERROR, __local_name, keys->keyentries[id]->ip->ip);
        return(NULL);
    }

    /* Decrypting message */
    if(!OS_BF_Str(buffer, cleartext, keys->keyentries[id]->key,
                  buffer_size, OS_DECRYPT))
    {
        merror(ENCKEY_ERROR, __local_name, keys->keyentries[id]->ip->ip);
        return(NULL);
    }


    /* Compressed */
    else if(cleartext[0] == '!')
    {
        cleartext[buffer_size] = '\0';
        cleartext++;
        buffer_size--;

        /* Removing padding */
        while(*cleartext == '!')
        {
            cleartext++;
            buffer_size--;
        }

        /* Uncompressing */
        if(!os_zlib_uncompress(cleartext, buffer, buffer_size, OS_MAXSTR))
        {
            merror(UNCOMPRESS_ERR, __local_name);
            return(NULL);
        }

        /* Checking checksum  */
        f_msg = CheckSum(buffer);
        if(f_msg == NULL)
        {
            merror(ENCSUM_ERROR, __local_name, keys->keyentries[id]->ip->ip);
            return(NULL);
        }

        /* Removing random */
        f_msg+=5;


        /* Checking count -- protecting against replay attacks */
        msg_global = (unsigned int) atoi(f_msg);
        f_msg+=10;

        /* Checking for the right message format */
        if(*f_msg != ':')
        {
            merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip);
            return(NULL);
        }
        f_msg++;

        msg_local = (unsigned int) atoi(f_msg);
        f_msg+=5;


        /* Returning the message if we don't need to verify the counbter. */
        if(!_s_verify_counter)
        {
            /* Updating currently counts */
            keys->keyentries[id]->global = msg_global;
            keys->keyentries[id]->local = msg_local;
            if(rcv_count >= _s_recv_flush)
            {
                StoreCounter(keys, id, msg_global, msg_local);
                rcv_count = 0;
            }
            rcv_count++;
            return(f_msg);
        }


        if((msg_global > keys->keyentries[id]->global)||
           ((msg_global == keys->keyentries[id]->global) &&
            (msg_local > keys->keyentries[id]->local)))
        {
            /* Updating currently counts */
            keys->keyentries[id]->global = msg_global;
            keys->keyentries[id]->local = msg_local;

            if(rcv_count >= _s_recv_flush)
            {
                StoreCounter(keys, id, msg_global, msg_local);
                rcv_count = 0;
            }
            rcv_count++;
            return(f_msg);
        }


        /* Checking if it is a duplicated message */
        if(msg_global == keys->keyentries[id]->global)
        {
            return(NULL);
        }


        /* Warn about duplicated messages */
        merror("%s: WARN: Duplicate error:  global: %u, local: %u, "
                "saved global: %u, saved local:%u",
                __local_name,
                msg_global,
                msg_local,
                keys->keyentries[id]->global,
                keys->keyentries[id]->local);

        merror(ENCTIME_ERROR, __local_name, keys->keyentries[id]->name);
        return(NULL);
    }

    /* Old format */
    else if(cleartext[0] == ':')
    {
        unsigned int msg_count;
        unsigned int msg_time;

        /* Closing string */
        cleartext[buffer_size] = '\0';


        /* Checking checksum  */
        cleartext++;
        f_msg = CheckSum(cleartext);
        if(f_msg == NULL)
        {
            merror(ENCSUM_ERROR, __local_name, keys->keyentries[id]->ip->ip);
            return(NULL);
        }


        /* Checking time -- protecting against replay attacks */
        msg_time = (unsigned int) atoi(f_msg);
        f_msg+=11;

        msg_count = (unsigned int) atoi(f_msg);
        f_msg+=5;


        /* Returning the message if we don't need to verify the counbter. */
        if(!_s_verify_counter)
        {
            /* Updating currently counts */
            keys->keyentries[id]->global = msg_time;
            keys->keyentries[id]->local = msg_local;

            f_msg = strchr(f_msg, ':');
            if(f_msg)
            {
                f_msg++;
                return(f_msg);
            }
            else
            {
                merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip);
                return (NULL);
            }
        }


        if((msg_time > keys->keyentries[id]->global) ||
           ((msg_time == keys->keyentries[id]->global)&&
            (msg_count > keys->keyentries[id]->local)))
        {
            /* Updating currently time and count */
            keys->keyentries[id]->global = msg_time;
            keys->keyentries[id]->local = msg_count;

            f_msg = strchr(f_msg, ':');
            if(f_msg)
            {
                f_msg++;
                return(f_msg);
            }
            else
            {
                merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip);
                return (NULL);
            }
        }

        /* Checking if it is a duplicated message */
        if((msg_count == keys->keyentries[id]->local) &&
           (msg_time == keys->keyentries[id]->global))
        {
            return(NULL);
        }


        /* Warn about duplicated message */
        merror("%s: WARN: Duplicate error:  msg_count: %u, time: %u, "
                "saved count: %u, saved_time:%u",
                __local_name,
                msg_count,
                msg_time,
                keys->keyentries[id]->local,
                keys->keyentries[id]->global);

        merror(ENCTIME_ERROR, __local_name, keys->keyentries[id]->name);
        return(NULL);
    }

    merror(ENCFORMAT_ERROR, __local_name, keys->keyentries[id]->ip->ip);
    return(NULL);
}