示例#1
0
文件: http.c 项目: Andy753421/thesis
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;
}