static void http_head(http_t *http, const char *field, const char *value) { static char hash[20] = {}; static char extra[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; trace(" http_head: %-20s -> [%s]", field, value); if (!strcasecmp(field, "Upgrade")) { http->hdr_upgrade = !!strcasestr(value, "websocket"); } else if (!strcasecmp(field, "Connection")) { http->hdr_connect = !!strcasestr(value, "upgrade"); } else if (!strcasecmp(field, "Sec-WebSocket-Key")) { #ifdef USE_GNUTLS gnutls_hash_hd_t sha1; gnutls_hash_init(&sha1, GNUTLS_DIG_SHA1); gnutls_hash(sha1, value, strlen(value)); gnutls_hash(sha1, extra, strlen(extra)); gnutls_hash_output(sha1, hash); #endif #ifdef USE_OPENSSL SHA_CTX sha1; SHA1_Init(&sha1); SHA1_Update(&sha1, value, strlen(value)); SHA1_Update(&sha1, extra, strlen(extra)); SHA1_Final((unsigned char*)hash, &sha1); #endif http->hdr_accept = base64(hash, sizeof(hash), http->hdr_key, sizeof(http->hdr_key)); } }
Vector<uint8_t> CryptoDigest::computeHash() { Vector<uint8_t> result; int digestLen = gnutls_hash_get_len(m_context->algorithm); result.resize(digestLen); gnutls_hash_output(m_context->hash, result.data()); return result; }