Exemple #1
0
static void
gsicc_get_buff_hash(unsigned char *data, int64_t *hash, unsigned int num_bytes)
{
    gs_md5_state_t md5;
    byte digest[16];
    int k;
    int64_t word1,word2,shift;

   /* We could probably do something faster than this. But use this for now. */
    gs_md5_init(&md5);
    gs_md5_append(&md5, data, num_bytes);
    gs_md5_finish(&md5, digest);

    /* For now, xor this into 64 bit word */
    word1 = 0;
    word2 = 0;
    shift = 0;

    /* need to do it this way because of
       potential word boundary issues */
    for( k = 0; k<8; k++) {
       word1 += ((int64_t) digest[k]) << shift;
       word2 += ((int64_t) digest[k+8]) << shift;
       shift += 8;
    }
    *hash = word1 ^ word2;
}
Exemple #2
0
/* compute and set a cache key's hash */
static void gp_cache_hash(gp_cache_entry *entry)
{
    gs_md5_state_t md5;

    /* we use md5 hashes of the key */
    gs_md5_init(&md5);
    gs_md5_append(&md5, entry->key, entry->keylen);
    gs_md5_finish(&md5, entry->hash);
}
Exemple #3
0
/* Process a buffer. */
static int
s_MD5C_process(stream_state * st, stream_cursor_read * pr,
               stream_cursor_write * pw, bool last)
{
    stream_MD5E_state *const ss = (stream_MD5E_state *) st;
    int nr = pr->limit - pr->ptr;
    int nw = pw->limit - pw->ptr;
    int n = min(nr, nw);

    gs_md5_append(&ss->md5, pr->ptr + 1, n);
    memcpy(pw->ptr + 1, pr->ptr + 1, n);
    pr->ptr += n;
    pw->ptr += n;
    if (pw->limit == pw->ptr)
        return 1;
    return 0;
}
Exemple #4
0
/* Process a buffer. */
static int
s_MD5E_process(stream_state * st, stream_cursor_read * pr,
               stream_cursor_write * pw, bool last)
{
    stream_MD5E_state *const ss = (stream_MD5E_state *) st;
    int status = 0;

    if (pr->ptr < pr->limit) {
        gs_md5_append(&ss->md5, pr->ptr + 1, pr->limit - pr->ptr);
        pr->ptr = pr->limit;
    }
    if (last) {
        if (pw->limit - pw->ptr >= 16) {
            gs_md5_finish(&ss->md5, pw->ptr + 1);
            pw->ptr += 16;
            status = EOFC;
        } else
            status = 1;
    }
    return status;
}
Exemple #5
0
void
gs_md5_finish(gs_md5_state_t *pms, gs_md5_byte_t digest[16])
{
    static const gs_md5_byte_t pad[64] = {
	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
    gs_md5_byte_t data[8];
    int i;

    /* Save the length before padding. */
    for (i = 0; i < 8; ++i)
	data[i] = (gs_md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
    /* Pad to 56 bytes mod 64. */
    gs_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
    /* Append the length. */
    gs_md5_append(pms, data, 8);
    for (i = 0; i < 16; ++i)
	digest[i] = (gs_md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
}