Beispiel #1
0
char *
zfile_digest (zfile_t *self)
{
    if (!self->digest) {
        if (zfile_input (self) == -1)
            return NULL;            //  Problem reading file

        //  Now calculate hash for file data, chunk by chunk
        size_t blocksz = 65535;
        off_t offset = 0;

        self->digest = zdigest_new ();
        zchunk_t *chunk = zfile_read (self, blocksz, offset);
        while (zchunk_size (chunk)) {
            zdigest_update (self->digest,
                zchunk_data (chunk), zchunk_size (chunk));
            zchunk_destroy (&chunk);
            offset += blocksz;
            chunk = zfile_read (self, blocksz, offset);
        }
        zchunk_destroy (&chunk);
        zfile_close (self);
    }
    return zdigest_string (self->digest);
}
Beispiel #2
0
const char *
zfile_digest (zfile_t *self)
{
    assert (self);
    if (!self->digest) {
        if (zfile_input (self) == -1)
            return NULL;            //  Problem reading file

        //  Now calculate hash for file data, chunk by chunk
        size_t blocksz = 65535;
        off_t offset = 0;

        self->digest = zdigest_new ();
        if (!self->digest)
            return NULL;
        zchunk_t *chunk = zfile_read (self, blocksz, offset);
        while (zchunk_size (chunk)) {
            zdigest_update (self->digest,
                            zchunk_data (chunk), zchunk_size (chunk));
            zchunk_destroy (&chunk);

            //  off_t is defined as long (32 bit on Windows, 64 bit otherwise)
            //  This guards against overflow in both contexts.
            if (blocksz > LONG_MAX - offset)
                return NULL;

            offset += (off_t) blocksz;
            chunk = zfile_read (self, blocksz, offset);
        }
        zchunk_destroy (&chunk);
        fclose (self->handle);
        self->handle = 0;
    }
    return zdigest_string (self->digest);
}
Beispiel #3
0
const char *
hydra_post_ident (hydra_post_t *self)
{
    assert (self);
    zdigest_t *digest = zdigest_new ();
    if (digest) {
        char *digest_text = zsys_sprintf ("%s:%s:%s:%s:%s",
            self->subject, self->timestamp, self->parent_id,
            self->mime_type? self->mime_type: "", self->digest);
        zdigest_update (digest, (byte *) digest_text, strlen (digest_text));
        assert (strlen (zdigest_string (digest)) == ID_SIZE);
        strcpy (self->ident, zdigest_string (digest));
        zstr_free (&digest_text);
        zdigest_destroy (&digest);
    }
    return self->ident;
}
zframe_t* zwshandshake_get_response(zwshandshake_t *self)
{
	const char * sec_websocket_key_name = "sec-websocket-key";
	const char * magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

	char * key = (char *)zhash_lookup(self->header_fields, sec_websocket_key_name);

	int len = strlen(key) + strlen(magic_string);

	char plain[150];

	strcpy(plain, key);
	strcat(plain, magic_string);

	zdigest_t* digest = zdigest_new();
	zdigest_update(digest, (byte *) plain, len);
	
	byte* hash = zdigest_data(digest);
		
	char accept_key[150];

	int accept_key_len = encode_base64(hash, zdigest_size(digest), accept_key, 150);

	int response_len = strlen("HTTP/1.1 101 Switching Protocols\r\n"
		"Upgrade: websocket\r\n"
		"Connection: Upgrade\r\n"
		"Sec-WebSocket-Accept: \r\n"
		"Sec-WebSocket-Protocol: WSNetMQ\r\n\r\n") + accept_key_len;

	char* response = (char *)zmalloc(sizeof(char) * (response_len+1));
	
	strcpy(response, "HTTP/1.1 101 Switching Protocols\r\n"
		"Upgrade: websocket\r\n"
		"Connection: Upgrade\r\n"
		"Sec-WebSocket-Accept: ");
	strncat(response, accept_key, accept_key_len);
	strcat(response, "\r\nSec-WebSocket-Protocol: WSNetMQ\r\n\r\n");	

	return zframe_new(response, response_len);
}
Beispiel #5
0
///
//  Constructor - creates new digest object, which you use to build up a
//  digest by repeatedly calling zdigest_update() on chunks of data.    
QmlZdigest *QmlZdigestAttached::construct () {
    QmlZdigest *qmlSelf = new QmlZdigest ();
    qmlSelf->self = zdigest_new ();
    return qmlSelf;
};