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); }
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); }
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); }
/// // 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; };